# Changelog

## [unreleased] — 2026-11-06

- **Library 0.11.4: Swatches mit Ausnahme Cameo** (user, 06.11.2026: „Ja, Ausnahme ergänzen“): Die halben Farbfelder von Cameo in Matrix stehen jetzt als Ausnahme in den Regeln, statt der Regel „Eine Paarung ist ein Punkt“ zu widersprechen. Am Tool ändert sich nichts.

- **Library 0.11.3: Regeln als Liste, Probe an drei Bausteinen** (user, 06.11.2026: „interessant? https://designsystemdocspec.org/quickstart“ – „Ja, drei Bausteine“)
  - Segmented control, Swatches und Save menu führen ihre Regeln einzeln, mit Stufe, Prüfung und dem Zitat der Entscheidung. Die Feldnamen stammen aus der Design System Doc Spec. Der Inhalt der Regeln ist gleich.
  - Die Karten der Library zeigen diese Regeln als Tabelle; bisher war der Regeltext dort nur durchsuchbar. Die Suche findet Regeln und Zitate.
  - `check-standard.py` prüft die Form jeder Regel und dass es die genannte Prüfung gibt.
  - Kein Eintrag in `DT_CHANGED`: Für die Tools ändert sich nichts, sie würden sonst fälschlich als „nicht abgeglichen“ gelten.
  - Save menu, Zugänglichkeit: „Dialog“ statt des veralteten „Popover“.

- **Core 0.7.16: Die Dashboards verschwinden nicht mehr, wenn die Film-Kachel lädt** (user, 06.11.2026: „THA dashboard blitzt wieder“)
  - **Ursache, online gemessen:** Die Film-Kachel lädt die Skripte der Seite des Motion Composers und schloss dabei nur `core/ui.js` aus. So lief `core/boot.js` ein zweites Mal und setzte `html.preload` auf die fertige Seite. Das Dashboard war 3 s lang weg und blendete dann wieder ein. Betrifft jedes Dashboard mit Film-Kachel.
  - **Behoben:** `tileFilm` lädt auch `core/boot.js` nicht mehr.

- **Matrix 0.4.66: Cameo; Engine Matrix 0.4.32** (user, 05.11.2026: „ich hätte gerne noch einen cameo mode (als extra farboption), vielleicht halb/halb inveritert als farbwähler“; „die kerben brauchen wir nicht, ticker und film auch cameo“; „bitte umgekehrten cameo auch ergänzen“)
  - Zwei neue Farbfelder, halb schwarz, halb weiß, in einer eigenen Zeile unter den beiden Paarungen: Jedes Zeichen, auch das Leerzeichen, steht weiß auf einer schwarzen Kachel auf weißem Grund, oder umgekehrt schwarz auf einer weißen Kachel auf schwarzem Grund, mit einer Haarlinie dazwischen. Jede Zeile endet mit ihrer letzten Kachel.
  - Gilt für Setzen, Ticker, Film mit allen Szenen, MP4, PNG und SVG und wird in der JSON gespeichert. Im Ticker läuft ein Band mit Haarlinien mit dem Text, im Film erscheint eine Kachel mit dem ersten Punkt ihres Zeichens. In Entwerfen ist die Karte eine Kachel auf dem Grund, die leeren Zellen stehen dezent darauf (user, 05.11.2026: „doof ist bei camea, dass bei entwerfen kein unterschied zu erkkenn ist“). Das Specimen bleibt ohne Kacheln.
  - **Abstände** (user, 05.11.2026: „cameo: spacing. können wir das von einem parameter der schrift ableiten? ist bisher etwas zu eng“): Der Innenabstand einer Kachel ist der Rand der Schrift plus eine halbe Zelle, auf allen vier Seiten gleich. Der Zeilenabstand regelt die Lücke zwischen den Kachelzeilen, ein Viertel seines Werts.

- **Matrix 0.4.60: Probe Inktraps; Engine Matrix 0.4.27** (user, 05.11.2026: „bei verbinden. wären inktraps machbar? in den ecken?“ – „Ja, als Probe bauen“; „auch in videos und ticker dabei?“)
  - Unter Verbinden steht der Regler Inktraps (0–100 %, Start 0). Er setzt eine Kerbe in jede Innenecke der Balken, gerade (L, T) und über Eck (die Spitze eines A).
  - Gilt in Entwerfen, Setzen, Ticker, Film mit allen Szenen, MP4, PNG, SVG und PDF. Die Kerbe ist in der jeweiligen Grundfarbe gemalt, im SVG also nicht durchsichtig. Noch nicht im Font.

- **Neues Tool Layout 0.1.3 (THA, vorläufiger Titel, Ordner `bandflaeche`); Brand Engine THA Surface 0.1.2** (user, 05.11.2026: „neues tool THA brand … es geht um eine aufteilung der layoutfläche mit einem großen auschnitt des bandes. im hintergrund kann optional ein forto mit farb tint sein. das band soll aber zur fläche werden. vorder- hintergund soll auswählbar sein, auch kombinationen rot/weiss“, mit Skizze; „Bandfläche: besser Layout als vorläufiger Titel. ich sehe aber nur dreicke. kommt noch nicht an die skizze ran. bogen wichtiger als ecke. nur band wird nicht benötigt. bitte default foro mit farbpverlay einbauen“)
  - **Band:** vier Formen (Bogen, Mulde, Welle, Stufe) und Rundung von Ecke bis zum weitesten Bogen, an beiden Kanten rund. Die Höhe steht im Dock und geht von der kurzen Seite aus, damit Hochformate nicht zu steil werden (user, 05.11.2026: „mich stört das die höhe/amplitude nicht steuerbar ist. wirkt teilweise viel zu steil, bei hochformaten wie toblerone“). Fläche unten oder oben. Das Band läuft über die Ränder des Formats hinaus.
  - **Farbe:** die vier Paarungen der THA, damit sind Vorne und Hinten gewählt, auch Rot/Weiß und Weiß/Rot. Start: Weiß vor dem Foto.
  - **Foto:** Beim Start liegt ein Beispielfoto unter rotem Tint. Ein eigenes lässt sich wählen oder auf die Seite ziehen; es liegt hinten oder im Band, in Grau unter einem Tint (Rot oder Schwarz) mit Stärke, oder ohne Tint im Bildstil der THA, dem Fotofilter der Engine Overlay (user, 05.11.2026: „tint ist gut, aber ohne tint bitte auch das farboverlay nehmen“).
  - **Lage** (Inspektor): Drehung, Waagrecht, Senkrecht. Ziehen auf der Bühne verschiebt das Band.
  - **Speichern:** PNG, mit Beschnitt und Schnittmarken.
  - Noch nicht gebaut: die Marken in den Ecken aus der Skizze (Zeichen, Text). Das Foto wird nicht mit dem Zustand gespeichert.

- **Matrix 0.4.58: Specimen neu gestaltet; Engine Matrix 0.4.25** (user, 05.11.2026: „specimen: sieht bisher nicht überzeigend aus. bitte daran orientieren und auf unsere gesaltung übertrgaen“ – GT Standard Manual, LL Catalogue)
  - Von den beiden Vorlagen übernommen: DIN A4 quer, Kopfzeile mit Name, Abschnitt, Seitenzahl und kräftiger Linie, kleine Beschriftungen über dünnen Linien, die Schrift so groß wie das Blatt. Auf unsere Gestaltung übertragen: nur Schwarz und Weiß, Deckblatt und letzte Seite weiß auf schwarz.
  - Aus Dinamos Diatype-Mono-Specimen (user, 05.11.2026: „noch ein beispiel“) kommen die zentrierte Zeichenübersicht und die Pfeile zwischen Standard und Alternative.
  - Die Seiten:
    1. **Deckblatt:** der Name so groß, wie er passt.
    2. **Aufbau:** Angaben über Linien, zwei Zeichen groß in ihrem Raster mit leeren Zellen und einem Lineal aus Zellen.
    3. **Übersicht:** alle Zeichen zentriert und so groß wie möglich.
    4. **Zeichensatz:** Großbuchstaben, Kleinbuchstaben, Ziffern und Satzzeichen, alle gleich groß und so groß wie möglich.
    5. **Alternativen** (wenn es welche gibt): eine Tabelle mit den Spalten Standard → ss01 → ss02 …
    6. **Wörter:** Wörter aus dem Text über die ganze Breite, mit Größe in pt.
    7. **Größen:** der Text in fünf Blöcken von groß nach klein, mit Größe in pt.
    8. **Schluss:** der Text so groß wie möglich, weiß auf schwarz.
  - **Testschrift Helvetica** von Hand neu gezeichnet (user, 05.11.2026: „die helveica ist gruselig“): ein Punkt starke Striche und saubere Diagonalen statt der gerasterten Treppen.
  - **Engine Matrix 0.4.25:** `layout()` gibt `wide` und `tall` zurück, `inst.svg` zeichnet mit `state.cells` die leeren Zellen.
  - **Getestet:** Mit der Testschrift Helvetica und drei Alternativen entsteht das PDF über Speichern › Specimen › PDF, ohne Fehler in der Konsole. Die Seiten sind angesehen.

- **Matrix 0.4.57: Verbinden nur beim Kreis, auch in Bewegung; Engine Matrix 0.4.24** (user, 04.11.2026: „linien verbinden klappt nicht bei bewegt (ticker und film). lonien verbinden nur bei rund“ – „nur kreis“)
  - **Verbinden in Bewegung:** Ticker, Film (Punkt für Punkt, Zufall, Welle, Varianten) und die Szenen zeichnen die Balken jetzt mit.
    - Ein Balken verbindet zwei Punkte, sobald beide zu sehen sind, und ist an jedem Ende so groß wie sein Punkt gerade ist.
    - Im Ticker verbinden sich die vollen Punkte der Anzeige.
    - Neue Engine-Funktion `drawShown`, gemeinsam für Film, Szenen und große Buchstaben.
  - **Nur der Kreis verbindet:** Beim Quadrat gibt es den Schalter nicht mehr, und die Geometrie der Quadrat-Balken ist entfernt. Schriften, bei denen das Quadrat verbunden war, zeigen dort wieder einzelne Punkte.
  - **Testschriften:** Fünf Testschriften als JSON in `docs/beispiele/schriften/`, gerastert aus den Systemschriften Helvetica, Futura, Courier, Times und Gill Sans (user, 04.11.2026: „erstelle 5 testfonts (JSON) anhand bekannter schriften. helvetica usw“).
    - Raster 7 × 9, 63 Zeichen.
    - Jede Schrift mit einer anderen Form:

      | Schrift | Form |
      |---|---|
      | Helvetica | Kreis verbunden |
      | Futura | Sechseck |
      | Courier | Quadrat |
      | Times | Raute, weiß auf schwarz |
      | Gill Sans | Linie |
  - **Getestet:**
    - Ticker, Film „Punkt für Punkt“ und die Szene „Lettern“ mit verbundenem Kreis.
    - Die Testschrift Helvetica über „Schrift laden (JSON)“.
    - Alle fünf im Alphabet.

- **Matrix 0.4.56: Modulation als Kugel und Halbkugel; Engine Matrix 0.4.23** (user, 04.11.2026: „könnte man bei modulation auch eine sphere (oder halbkugel machen)?“)
  - Zwei neue Formen der Modulation:
    - **Kugel:** In der Mitte des Zeichens sind die Punkte voll, zum Rand hin werden sie kleiner, wie eine Kugel, die sich wegdreht.
    - **Halbkugel:** Eine Kuppel auf der Grundlinie, voll unten in der Mitte, oben klein.
  - Animiert rollen beide einmal hin und zurück durch das Zeichen. Der Zauberstab schlägt sie mit vor.
  - Formeln können jetzt auch `sqrt` und `pow` verwenden.
  - **Getestet:** Kugel und Halbkugel im Modus Entwerfen. Die Formel gilt als lesbar.

- **Matrix 0.4.55: Specimen als PDF; Engine Export 0.5.12** (user, 04.11.2026: „Feature-Idee: Ausgabe eines Specimen als DIN-A PDF mit Deckblatt und Schriftproben …“ – „Ja, Specimen-PDF“)
  - Speichern › Specimen › PDF legt `…_specimen.pdf` an: DIN A4 hoch, Vektor. Die Schrift steht in Schwarz auf weißem Papier, die Beschriftung in Helvetica. Jede Seite trägt unten den Namen und ihre Nummer.
    1. **Deckblatt:** „Specimen“, der Schriftname groß in der Schrift selbst, darunter Schrift, Designer:in, Zeichen (mit Zahl der Alternativen), Raster, Form, Datum.
    2. **Alphabet:** wie Setzen › Alphabet.
    3. **Schriftproben:** der Text aus Setzen in drei Größen (Groß, Mittel, Klein), umbrochen nach Wörtern.
    4. **Alternativen** (nur wenn es welche gibt): je Zeile ein Zeichen, erst der Favorit, dann ss01, ss02 …, zehn Zeilen je Seite.
  - **Engine Export 0.5.12 (pdf.js):** `EXPORT_PDF.pages([svg, …], { w, h, title })` bzw. `EXPORT_ENGINE.pdfPages` schreibt mehrere SVGs als Seiten eines PDF. `<text>` wird gelesen, als Helvetica oder Helvetica-Bold (WinAnsi, linksbündig, nicht eingebettet, in PDF/X-3 ausgelassen). Die Ausgabe der Datei (`writeFile`) und die Ressourcen (`Writer.res`) teilen sich `fromSVG` und `pages`. Für die Tools mit PDF ändert sich nichts.
  - **Getestet:** Das Testalphabet der Brand (53 Zeichen, 4 Alternativen) ergibt 4 Seiten, 100 KB, nichts ausgelassen. Chromes PDF-Viewer zeigt alle vier Seiten mit Helvetica und den Punkten als Vektor. `fromSVG` gibt weiter eine Seite (QR-Tool).

- **Matrix 0.4.54: Varianten als OpenType-Alternates; Engine Export 0.5.11** (user, 04.11.2026: „Was auch schön wäre, wenn die Alternativen (aka „Varianten“) OpenType-Alternates der Schrift würden“ – „OpenType-Alternates“)
  - Die Schrift (OTF, TTF, WOFF, WOFF2) enthält jetzt jede gezeichnete Variante, die nicht der Favorit ist, als Alternative ihres Zeichens. In einem Layoutprogramm lässt sie sich wählen:
    - über das Glyphen- bzw. Alternativen-Menü (`aalt`) und die Stilvarianten (`salt`),
    - als Stilsatz: `ss01` nimmt jeweils die erste andere Variante, `ss02` die zweite und so weiter, bis `ss20`.
  - Die Alternativen heißen wie ihr Zeichen mit `.ss01`, `.ss02` (z. B. `uni0041.ss01`).
  - Speichern › Schrift nennt die Zahl der Alternativen, ebenso die Meldung nach dem Speichern.
  - **Engine Export 0.5.11 (font.js):** Eine Glyphe darf `alts: [{ advance, contours }]` haben. Die Alternativen kommen ohne Zeichencode nach den Glyphen. Die Tabelle `GSUB` enthält eine AlternateSubst für `aalt` und `salt` und je eine SingleSubst für `ss01` bis `ss20`, für die Schriften DFLT und latn. Ohne `alts` bleibt die Schrift wie bisher.
  - **Getestet:** Testschrift mit A und zwei breiteren bzw. schmaleren Alternativen. OTF, TTF und WOFF2 laden in Chrome (OTS prüft GSUB). „AB“ misst ohne Feature 120 px, mit `ss01` 150, mit `ss02` 90, mit `salt` 150 – die Alternativen werden eingesetzt. In Matrix ein A mit zwei Varianten: Der Export bekommt den Favoriten mit 1 Kontur und eine Alternative mit 2, der Hinweis lautet „1 Zeichen · 1 Alternative“.

- **Matrix 0.4.53: Ausrichtung untereinander** (user, 04.11.2026: „das wird zu eng“; „braucht es die überschrift senkrecht?“)
  - Nebeneinander waren die sieben Knöpfe zu eng. Jetzt steht unter „Ausrichtung“ die Reihe Links, Mitte, Rechts, Blocksatz. Darunter folgt in eigener Zeile und ohne Namen die Reihe Oben, Mitte, Unten, deren Symbole für sich sprechen. Beide nutzen die volle Breite. Die Probe `ausrichtung` entfällt, beide Zeilen sind die Segmentreihe der Library.
  - **Getestet:** Setzen › Text zeigt beide Zeilen, 8 px vom Namen zur ersten Reihe, 22 px zur zweiten. ui-kpi im Dock: Nähe 0,36, keine Ziele unter 24 px. Wie Schriftgröße und Zeilenabstand sind sie nur in Setzen › Text sichtbar.

- **Matrix 0.4.52: Speichern aufgeräumt, Ausrichtung in Setzen, Neigung ohne „gerade“; Engine Matrix 0.4.22**
  - **Speichern** (user, 04.11.2026: „Der Speichern-Dialog ist zu unübersichtlich inzwischen. Schrift und Json in einer „Pill“ versteht niemand“):
    - Bild: PNG oder SVG.
    - Schrift: nur „OTF · TTF · WOFF · WOFF2“.
    - Zum Weiterarbeiten: JSON, mit dem Hinweis, wo es sich öffnen lässt.
    - Video erscheint nur, wenn sich etwas bewegt (Bewegen oder animierte Modulation), statt als graue Zeile mit langem Hinweis.
  - **Ausrichtung** (user: „Setzen: Ausrichtungsoptionen ergänzen“): In Setzen › Text stehen in einer Zeile waagrecht Links, Mitte, Rechts, Blocksatz und senkrecht Oben, Mitte, Unten, als Symbole wie in Custom Type. Die Ausrichtung gilt im Rand des Formats. Blocksatz verteilt den übrigen Raum auf die Wortabstände, die letzte Zeile bleibt links. Vorgabe ist beides Mitte. Bei einer Zeile ändert sich nichts, mehrere Zeilen stehen jetzt mittig statt links im mittigen Block. Die Ausrichtung wird mit der Schrift gespeichert. Probe `ausrichtung`.
  - **Neigung** (user: „hier einfach nur neigung, gerade nicht mehr sinnvoll“): Bei 0 steht „0“ statt „gerade“.
  - **Engine Matrix 0.4.22:** `align` (links, mitte, rechts, block) und `valign` (oben, mitte, unten) in `layout()`. Ungültige Werte gelten als Mitte.
  - **Getestet:** Speichern zeigt die drei Gruppen Bild, Schrift und Zum Weiterarbeiten. „AB CD EF / AB“ rechts und unten: Die zweite Zeile steht rechts, der Block unten. ui-kpi im Dock: Nähe 0,22, keine Ziele unter 24 px.

- **Matrix 0.4.51: chronodraw ruhiger – Nachleuchten, Strich bleibt, Start mit Puffer; Engine Matrix 0.4.21** (user, 03.11.2026: „das blitzt alles nur, muss subtiler auf das zeichnen der punkte reagieren“; „ich habe das gefühl es geht erst, nachdem ich auf puffer gewechselt habe. aber alles blitzt unkontrolliert“; „punkte setzen ist ok. sobald ich zeichne (also über mehrere punkte fahre) geht etwas verloren“; „speicher kann bei chrono entfallen“)
  - **Nachleuchten** (0–8 Frames, Vorgabe 4): Nach seinem Frame bleibt ein Punkt noch einige Frames stehen und wird dabei immer blasser, in festen Tönen zum Grund hin. Er blitzt nicht mehr nur einen Frame lang auf. Das gilt auf der Karte, in der Miniatur und in Setzen.
  - **Strich:** Solange der Stift unten ist, schreibt er den ganzen bisherigen Strich in jeden Frame, der vorbeikommt. Beim Zeichnen bleibt der Strich stehen und wächst. In der Schleife baut er sich danach so auf, wie er gezeichnet wurde. Vorher lag jedes Stück nur in seinem Frame, und der Rest schien verloren.
  - **Start mit Puffer:** Bei „Varianten“ hat ein neues Zeichen nur einen Frame, und nichts läuft. Der Modus beginnt darum mit „Puffer“.
  - **Kein Speichern** im Chrono-Modus.
  - **Engine Matrix 0.4.21:** `state.trail` – frühere Frames als Schichten `{ glyphs, ink }`, zwischen den leeren Zellen und der Tinte gezeichnet.
  - **Getestet:** Ein Strich über sieben Zellen, langsam gezogen: Beim Zeichnen stehen alle sieben. In der Schleife wächst er von zwei auf sieben, davor leuchten die früheren Frames nach. Speichern ist ausgeblendet, keine Fehler in der Konsole.

- **Matrix 0.4.50: Probe chronodraw** (user, 03.11.2026: „ich möchte einen neuen experimentellen modus. soll nur über url erreichbar sein“ – nach ertdfgcvb's chronodraw – „das möchte ich auf das zeichnen übertragen. alles bewegt, alles im loop. modus bewegen kann entfallen“; „ich würde gerne unterschiedliche chronodraw methoden wechseln und damit experimentieren“; Pinsel „Nur im laufenden Frame“; Bewegen „Nur im Chrono-Modus“)
  - Nur über die Adresse erreichbar: `tools/matrix/index.html?brand=playground&modus=chronodraw`. Ohne den Zusatz bleibt Matrix, wie es ist.
  - Eine Schleife aus Frames läuft immer, in Entwerfen und Setzen. „Bewegen“ entfällt in diesem Modus. Ein Punkt landet in dem Frame, der gerade läuft. Hält man den Stift, schreibt er in jeden Frame weiter, der vorbeikommt. Wer zieht, zeichnet eine Bewegung.
  - **Methoden** (Abschnitt Chrono im Dock):
    - **Varianten:** Die Varianten eines Zeichens sind seine Frames. „Neuer Frame“ unter der Karte kopiert den laufenden.
    - **Puffer:** Eine feste Zahl Frames (4–48), zuerst leer.
    - **Echo:** Wie Puffer, ein Punkt bleibt 2–12 Frames stehen (Nachhall).
    - Dazu Tempo 2–24 Frames/s.
  - In jeder Methode sind die Frames die Varianten, so lassen sich Schleifen als JSON speichern und laden. Puffer legt fehlende Frames an und nimmt nie welche weg.
  - Entwerfen zeigt eine Karte je Zeichen mit dem laufenden Frame („A · 3/12“), die Miniatur läuft mit. In Setzen spielt jeder Buchstabe seine Frames. Die leeren Zellen stehen dort immer oder nie, wie „Leere Zellen“ sagt.
  - Noch nicht: MP4 einer Schleife, Zwiebelschale, zeitversetzte Buchstaben.
  - **Getestet:** Puffer, Stift eine halbe Sekunde gehalten, dann gezogen: Die Frames zeigen den Punkt nacheinander. Echo in Setzen zeigt den Punkt einige Frames lang. Ohne `modus=chronodraw` sind Bewegen und Favoriten-Sterne da, Chrono nicht. Keine Fehler in der Konsole.

- **Hochladen: nur was sich geändert hat** (user, 03.11.2026: Transmit „Mit dem Änderungsdatum best., ob eine Datei geändert wurde“ – „einstellungen richtig?“ – „Ja, so ändern“)
  - `scripts/build-site.sh` gab mit `git archive` allen Dateien das Datum des letzten Commits. Transmit vergleicht nach Änderungsdatum und lud darum bei jedem Upload alle 452 Dateien. Das war langsam und brach öfter mit „Cocoa-Fehler -1“ ab.
  - Jetzt trägt jede Datei das Datum ihres eigenen letzten Commits, in Ortszeit. Was der Bau selbst schreibt (`index.html`, die `.htaccess` von Playground), trägt das Datum des Skripts. Ein Upload schickt nur noch, was seit dem letzten Mal neu ist. Die Einstellungen in Transmit bleiben, wie sie sind.
  - **Getestet:** Bau in 1,8 s, 58 verschiedene Daten statt einem, 39 Dateien von heute. Upload ohne Fehler, Matrix 0.4.49 online.

- **Matrix 0.4.49: Rundung bei Polygon und Stern; Engine Matrix 0.4.20** (user, 03.11.2026: „rundung auch bei polygon und bei stern möglich?“)
  - Der Regler Rundung gilt jetzt auch für Polygon und Stern, beim Stern auch für die inneren Ecken. Jede Ecke wird eine Kurve von einem Punkt auf der Kante davor zu einem auf der Kante danach. Bei 50 % reicht die Kurve bis zur Mitte der kürzeren Kante.
  - Die Kurve ist quadratisch, die Ecke ist ihr Kontrollpunkt. So ist sie auf der Fläche, im SVG (`<path>` mit `Q`) und in der Schrift dieselbe, auch als Kontur.
  - **Engine Matrix 0.4.20:** `rounded()`, `polySteps()`, `M.ROUNDED` (welche Formen Rundung haben, für das Tool).
  - **Getestet:** Stern, Polygon 6, Dreieck und Stern als Kontur mit Rundung 30 %. SVG als Pfad mit Kurven, OTF und TTF laden in Chrome, der Regler erscheint beim Stern.

- **Matrix 0.4.48: Verbinden mit Modulation ohne Treppe; Engine Matrix 0.4.19** (user, 03.11.2026: „bei modulation: erscheint bei durchgezogen als treppe. kriegt man das nahtlos hin? als blob/umfliessend?“)
  - Eine Brücke war so dick wie der kleinere ihrer zwei Punkte. Mit Modulation sind die Punkte verschieden groß, so entstand an jedem Punkt eine Stufe. Jetzt beginnt jedes Ende der Brücke so groß wie sein eigener Punkt.
  - Beim Kreis liegt das Band zwischen den äußeren Tangenten der zwei Kreise. Der Strich fließt nahtlos von einer Größe in die nächste, auch mit gedehnter Zelle. Beim Quadrat verjüngt sich der Balken gerade von Kante zu Kante, über Eck ebenso.
  - Ohne Modulation ändert sich nichts.
  - **Getestet:** Ein A aus Kreisen und eines aus Quadraten mit Modulation 80 % (waagrecht), verbunden mit Diagonal: Die Striche laufen ohne Stufe. OTF und TTF laden in Chrome.

- **Matrix 0.4.47: Quadrate diagonal als volle Schräge; Engine Matrix 0.4.18** (user, 03.11.2026: „hier funktioniert das nicht so richtig“ – Quadrate, Luft 0, Diagonal)
  - Über Eck verband ein Balken zwei Quadrate, der nur so breit war wie ihre Seite. Er war dünner als die Quadrate und hinterließ Kerben. Jetzt ist das Band so breit wie die Diagonale des Quadrats und läuft von den beiden quer liegenden Ecken des einen zu denen des anderen. Die Treppe wird zur gleichmäßigen Schräge, auch mit Schräge und gedehnter Zelle. Beim Kreis bleibt es die Kapsel.
  - **Getestet:** Eine Treppe aus Quadraten, Luft 0, verbunden mit Diagonal: Die schrägen Stellen sind so breit wie die Quadrate. Mit Schräge 15° laden OTF und TTF in Chrome.

- **Matrix 0.4.46: Verbinden schaltet Diagonal mit an** (user, 03.11.2026: „ah, das ist ein extra schalter“ – „ja, automatisch an“)
  - Wird Verbinden eingeschaltet, geht Diagonal mit an. Der Schalter Diagonal bleibt und lässt sich für sich ausschalten.
  - **Getestet:** Verbinden an → Diagonal an, Diagonal aus → Verbinden bleibt an. Keine Fehler in der Konsole.

- **Matrix 0.4.45: Diagonal verbinden, Farbe und Zeichen gleich breit; Engine Matrix 0.4.17**
  - **Diagonal** (user, 03.11.2026: „diagonal verbindung möglich?“): ein Schalter unter Verbinden, sichtbar wenn Verbinden an ist. Zwei gesetzte Punkte über Eck wachsen zusammen, wenn keine der beiden Zellen dazwischen gesetzt ist. Ist eine gesetzt, ist die Ecke schon zu, und eine Brücke würde sie nur abschrägen. Das gilt auf der Fläche, im SVG und in der Schrift.
  - Die Brücken nehmen die Ausdehnung des Punkts in ihrer Richtung. Schräg ragte eine Brücke vorher über den Kreis hinaus, waagrecht und senkrecht ändert sich nichts.
  - **Farbe und Zeichen** (user: „farbe und zeichen jeweils 50% breite“ – „also gleich breit“): Die Probe `zwei-spalten` teilt die Reihe in zwei gleich breite Spalten.
  - **Engine Matrix 0.4.17:** `joinDiag` am Punkt (ein Projekt von vorher: aus).
  - **Getestet:** Ein Muster mit zwei Diagonalen, Kreis, Verbinden und Diagonal: Kapseln ohne Überstand. OTF und TTF mit 23 Konturen von Chrome geladen. Farbe und Zeichen je 114 px breit.

- **Matrix 0.4.44: Abschnitt Schrift ohne Kennwerte** (user, 03.11.2026: „brauche ich diese infos wirklich doppelt? ich würde oben weglassen“)
  - Inspektor › Schrift zeigt nur noch Schriftname, Designer:in und „Schrift laden (JSON)“. Die Zeilen Zeichen, Varianten und Raster entfallen. Was entworfen ist, steht unter Werte.
  - **Getestet:** Abschnitt Schrift ohne Liste, keine Fehler in der Konsole.

- **Matrix 0.4.43: Verbinden ohne Loch, Linienenden zuerst eckig; Engine Matrix 0.4.16**
  - **Verbinden** (user, 03.11.2026: „ich kann hier nicht 100% der grösse erreichen“): Wo vier gesetzte Punkte ein Quadrat bilden, blieb zwischen ihren Brücken ein Loch, so groß wie die Luft. Jetzt schließt sich auch die Mitte, ein 2 × 2-Block ist voll.
  - **Runde Enden** (user: „runde ecken: default aus“): Eine neue Schrift beginnt mit eckigen Linienenden, der Schalter steht zuerst auf aus. Eine Schrift von vor 0.4.40 behält beim Laden ihre runden Enden.
  - **Getestet:** Quadrat, Luft 15 %, 2 × 2 gesetzt und verbunden: Die Mitte ist Tinte, ohne Verbinden bleibt sie Grund. Der Schalter „Runde Enden“ steht nach dem Laden auf aus.

- **Matrix 0.4.42: Verbinden und Schräge; Engine Matrix 0.4.15** (user, 03.11.2026: „könnte man eine neue form zu diesem ergebnis schaffen?“ – ein B aus Balken – „Ja, so bauen“; „bei rechtecken noch tilt einführen?“)
  - **Verbinden** (Schalter unter Form, bei Kreis und Quadrat als Fläche): Zwei gesetzte Punkte nebeneinander oder übereinander wachsen zu einem Balken zusammen, so dick wie der kleinere Punkt. Über Eck verbindet sich nichts, die Enden behalten die Form des Punkts. Ein Quadrat mit Rundung ergibt Balken mit runden Enden, ein Kreis Kapseln.
  - **Schräge** (Regler beim Quadrat, −45° bis 45° in Schritten von 5°): Das Quadrat wird ein Parallelogramm, oben nach rechts oder links. Es bleibt so breit wie das Quadrat, eine Reihe schließt bei Luft 0 lückenlos. Verbunden folgen die Balken den schrägen Seiten, senkrecht als Zickzack ohne Kerben.
  - Beides gilt beim Entwerfen, Setzen, im Alphabet, im SVG und in der Schrift. Im Ticker und im Trailer wird nicht verbunden.
  - **Engine Matrix 0.4.15:** `join`, `tilt` am Punkt (ein Projekt von vorher: aus, 0°). `bridges()` legt die Brücken zwischen Nachbarn, in der Schrift als eigene Konturen über den Punkten.
  - **Getestet:** Ein B wie im Bild (Quadrat, Rundung 25 %): Balken mit offenen Ecken, mit Schräge 25° schräge Balken. SVG mit `skewX(-25)` und Brücken als Polygone. OTF und TTF mit 22 Konturen von Chrome geladen (OTS).

- **Matrix 0.4.41: Farbe und Zeichen nebeneinander, „Form“ statt „Punkt“** (user, 03.11.2026: „können wir hier platz gewinnen? z. b. zeichen/farbe zweispaltig? unter punkt ist viel los. bessere überschrift wäre form statt punkt.“)
  - Im Dock stehen Farbe und Zeichen in einer Reihe: Farbe so breit wie ihre Felder, Zeichen im Rest. Das ist die Probe `zwei-spalten`, noch kein Baustein.
  - Der Abschnitt „Punkt“ heißt „Form“. Die Formen stehen direkt unter der Überschrift, ohne eigene Zeile „Form“. In den Werten heißt es ebenfalls „Form: …“.
  - Zwischen den Reglern der Form stehen 16 px statt 8 px. Vorher war der Abstand vom Regler zur nächsten Zeile so groß wie der vom Namen zum Regler (Nähe 1).
  - **Getestet:** ui-kpi im Dock (Kreis und Stern, hell und dunkel): Nähe 0,5, keine Ziele unter 24 px, Kontrast ≥ 12,3. Mit dem Stern passt der Dock bei 1280 × 800 ohne Bildlauf.

- **Matrix 0.4.40: Polygon, Stern, Linienenden, „Schrift“ statt „Projekt“; Engine Matrix 0.4.14; Core 0.7.15 und Library 0.11.2: Varianten verschiebbar, Werte nur mit dem Wert**
  - **Polygon und Stern** (user, 03.11.2026: „stern mit count/ratio (wie figma)“; „dreieck wird polygon: auch mit count (wie figma)“): Das Dreieck heißt Polygon und hat 3 bis 12 Ecken (Vorgabe 3, das Dreieck wie bisher). Neu ist der Stern mit 3 bis 12 Zacken und Verhältnis 10 bis 100 % (innerer zu äußerem Radius, Vorgabe 5 und 38 %). Beide füllen ihre Zelle wie das Dreieck, sodass Luft 0 keine Lücke lässt. Sie lassen sich drehen, als Kontur zeichnen und dehnen und gelten auf der Fläche, im SVG (Gehrung wie auf der Bühne) und in der Schrift (Kontur mit Gehrung um jede Kante). Varianten schlagen sie mit vor.
  - **Linienenden** (user: „linien: option ecken rund/nicht rund sollte möglich sein“): Schalter „Runde Enden“ bei der Linie, zuerst an. Aus endet die Linie gerade an der Kante der Zelle. Gilt auf der Fläche, im SVG und in der Schrift.
  - **Schrift statt Projekt** (user: „das sollte man vielleicht auch schrift nennen, entsprechend schrift laden (Json) statt projekte“): Reiter und Abschnitt heißen „Schrift“, der Knopf „Schrift laden (JSON)“. Speichern › Schrift hat jetzt „OTF · TTF · WOFF · WOFF2“ und „JSON“. Auch die Meldungen sprechen von der Schrift.
  - **Miniatur** (user: „im darkmode ist der hintergrund der miniatur zu dunkel“): Ihr Grund ist der Grund der Seite, wie er gerade ist. Unter dunklem Inhalt ist das das hellere Grau, vorher war er dort fast schwarz.
  - **Werte:** Zeichen zählt die Zeichen, Alphabet die entworfenen, „Varianten im Text“ die gewählten. Die Form heißt mit ihrem Namen („Polygon“).
  - **Engine Matrix 0.4.14:** `sides`, `points`, `inner`, `flat` am Punkt und an der Variante (ein Projekt von vorher: Dreieck, runde Enden). Die Form `stern`, `poly()` legt Polygon und Stern in das Quadrat des Punkts. Das Offset der Kontur in der Schrift gilt für jedes Polygon.
  - **Core 0.7.15, Library 0.11.2** (user: „varianten fenster sollte man verschieben können“ – „sollte bei fokus vor panel springen dürfen“; „brauche ich wirklich überall pfeil usw? reicht nicht der aktuelle wert?“):
    - `initVariants`: Der Kopf des Dialogs verschiebt ihn. Er bleibt, wo er war, der Kopf bleibt im Fenster, und geöffnet oder berührt liegt er vor jedem Panel.
    - `initValues`: Es steht nur noch der Wert da, ohne „vorher →“. Eine Liste zeigt ihre Anzahl. `text(key, value)` lässt ein Tool einen Wert in Worte fassen.
    - Das gilt in allen Tools. Die Tools mit Varianten oder Werten stehen bis zum Abgleich auf „nicht abgeglichen“, Matrix ist abgeglichen.
  - **Getestet:**
    - Stern 5 / 38 %, Polygon 6, Linie mit eckigen Enden auf der Fläche und im SVG (`butt`). Stern als Kontur als Schrift-Umriss mit 18 Ringen. Die Regler erscheinen je Form.
    - Varianten-Fenster um −150 / +100 px gezogen und nach unten geklemmt. Nach 30 Klicks auf den Dock liegt es beim Öffnen darüber (z 37 gegen 36).
    - Werte: „1 Zeichen“, „0 entworfen“, „Versatz 0“. Miniatur bei „Weiß auf Schwarz“ im Grau der Seite.

- **Matrix 0.4.39: Schriftname und Designer:in; Engine Export 0.5.10** (user, 03.11.2026: „umbenennen: Schriftname und Creator (bzw. was sind die offiziellen bezeichnungen, die auch in den fonts übernommen werden sollten?)“ – „Dann bitte Designer:in“)
  - Inspektor › Projekt: „Name“ heißt jetzt „Schriftname“. Das ist der Family Name der Schrift (name ID 1, Full Name 4, PostScript-Name 6) und steht wie bisher am Anfang jedes Dateinamens. Neu ist das Feld „Designer:in“, es wird im Projekt (JSON) gespeichert.
  - **Engine Export 0.5.10 (font.js):** `spec.designer` – steht in der Schrift im Feld Designer (name ID 9) und im Copyright „© Jahr Name“ (name ID 0). Ohne Angabe bleibt die Schrift wie bisher. Der PostScript- und der Full Name für CFF kommen jetzt aus eigenen Variablen, nicht mehr aus Positionen der Liste.
  - **Getestet:** OTF und TTF mit Designer:in von Chrome geladen (OTS). Die name-Tabelle enthält 0 „© 2026 Erika Muster“, 1 bis 6 wie bisher, 9 „Erika Muster“. Im Inspektor stehen „Schriftname“ und „Designer:in“.

- **Matrix 0.4.38: Ecke der Vorschau als Winkel** (user, 03.11.2026: „vielleicht ist das symbol nicht ideal, evtl. nur eine ecke?“ – „so ähnlich? gedreht?“ mit einem Chevron)
  - Statt des Doppelpfeils zeigt die Ecke einen Winkel, einen zur Ecke gedrehten Chevron (↘), mit Schenkeln von 6 px und einer Linie von 1,5 px. Er liegt in der runden Ecke der Vorschau. Er erscheint beim Darüberfahren, die Trefferfläche bleibt 24 px.
  - **Getestet:** Beim Darüberfahren steht der Winkel in der Ecke, innerhalb der Rundung.

- **Matrix 0.4.37: Pfeil der Vorschau-Ecke in Zugrichtung** (user, 03.11.2026: „pfeil müsste gedreht werden, damit er in die richtige richtung zeigt. evtl. icon (pfeil) auf 50% skalieren“)
  - Das Symbol der Ecke (Carbon Maximize) ist eine Vierteldrehung weiter gedreht und zeigt ↖ ↘, entlang des Ziehens. Es ist halb so groß (9 px). Die Trefferfläche bleibt 24 px.
  - **Getestet:** Beim Darüberfahren zeigt die Ecke der Vorschau den Doppelpfeil von links oben nach rechts unten.

- **Matrix 0.4.36: Vorschau 1×, 2×, 3×** (user, 03.11.2026: „könnte man die miniatur auch grösser ziehen (z.b. in der ecke, wie ein fenster). zb. wechsel zwischen 1x (aktuelle grösse) und 2x“ – „vielleicht auch doppelklick“)
  - Die Vorschau (Miniatur) hat unten rechts eine Ecke, sichtbar beim Darüberfahren (Carbon Maximize, 24 px Trefferfläche). Ziehen vergrößert sie wie ein Fenster, sie rastet bei 1× (bisherige Größe), 2× und 3× ein. Ein Klick auf die Ecke oder ein Doppelklick auf die Vorschau wechselt zwischen 1× und 2× (von 3× zurück auf 1×). Wird sie größer, bleibt sie im Fenster. Die Größe bleibt im Browser gespeichert.
  - Probe `miniatur`, kein Baustein.
  - **Getestet:** Doppelklick 1× → 2× → 1×; Ecke gezogen → 3×; Klick auf die Ecke → 1×; Ecke mit der Maus gezogen.

- **Matrix 0.4.35: Text im UI wieder kopierbar** (user, 03.11.2026: „man kann inzwischen im UI keine texte mehr kopieren. vermutlich wegen copy&paste buchstaben“)
  - In Entwerfen fing Cmd+C jedes Kopieren ab, um Varianten zu kopieren (seit 0.4.25) – auch markierten Text im Inspektor oder im Dock. Ist Text markiert, kopiert Cmd+C jetzt diesen Text; sonst die gewählten Varianten wie bisher. In Eingabefeldern war Kopieren nie betroffen.
  - **Getestet:** Text im Inspektor markiert, Cmd+C: nicht abgefangen; ohne Markierung: Varianten kopiert. In Setzen nicht abgefangen.

- **Matrix 0.4.34: Formate der Schrift im Knopf** (user, 03.11.2026: „matrix: OTF, TTF etc. auch im button zeigen“)
  - Speichern › Schrift: Der Knopf heißt jetzt „OTF · TTF · WOFF · WOFF2“ statt „ZIP“; der Hinweis daneben nennt die Zahl der Zeichen und „als ZIP“.
  - **Getestet:** Speichern geöffnet: Knopf „OTF · TTF · WOFF · WOFF2“ passt in eine Zeile, gewählt zeigt er „… Zeichen · als ZIP“.

- **Matrix 0.4.33: „Neues Zeichen“ nach A–Z und 0–9 weiter; Brand Library Playground 0.3.2** (user, 03.11.2026: „Habe jetzt 39 Zeichen entworfen – jetzt geht kein weiteres mehr“)
  - Der Knopf „Neues Zeichen“ schlug nur die Reihe des Alphabets vor (A–Z, 0–9, 36 Zeichen). Danach legte nur noch eine Taste ein Zeichen an, der Knopf meldete „Alle Zeichen der Reihe sind da“. Jetzt geht er weiter mit Ä Ö Ü ẞ und Satzzeichen: . , : ; ! ? - – ' " ( ) & + / @ # % * = < > _ (zusammen 63). Danach legt weiter jede Taste ihr Zeichen an.
  - **Brand Library Playground 0.3.2:** `matrix.more` – die Zeichen, die „Neues Zeichen“ nach der Reihe vorschlägt. In der Alphabet-Ansicht stehen sie wie bisher in der Zeile der übrigen. Kein Baustein ändert sich.
  - **Getestet:** „Neues Zeichen“ 80-mal geklickt: 63 Zeichen in dieser Folge, dann der Hinweis „Alle vorgeschlagenen Zeichen sind da – eine Taste legt jedes weitere an“.

- **Matrix 0.4.32: Dreieck füllt die Zelle; Engine Matrix 0.4.13** (user, 03.11.2026: „Der Stege (Abstände)? Sollte man nicht ganz auf 0 gehen können?“)
  - Das Dreieck war nur 0,9 einer Zelle hoch – bei Luft 0 blieb zwischen den Reihen ein Steg. Jetzt füllt es seine Zelle wie das Quadrat: Spitze oben in der Mitte, Basis auf den unteren Ecken. Bei Luft 0 schließen die Reihen lückenlos, mit Versatz ½ greifen die Dreiecke ineinander. Gezeichnete Dreiecke werden dadurch etwas höher.
  - Gilt auf der Fläche, im SVG und in der Schrift (eine Geometrie, `tri3`).
  - **Getestet:** Dreieck in einer Zelle von 100: 0 bis 100 (SVG); Raster 5 × 7, Luft 0, Versatz ½, Zelle 2 : 1 gedehnt: Reihen ohne Steg.

- **Matrix 0.4.31: Schrift als ZIP mit OTF, TTF, WOFF, WOFF2; Engine Export 0.5.9** (user, 03.11.2026: „export: font statt nur otf, zip mit otf, ttf, woff, woff2“)
  - Speichern › Schrift › ZIP legt eine Datei `…-schrift.zip` an: OTF und TTF zum Installieren, WOFF und WOFF2 für das Web – alle vier mit denselben Formen und Maßen.
  - **Engine Export 0.5.9 (font.js):** `EXPORT_FONT.woff(sfnt)` – jede Tabelle mit zlib gepackt (Kompression des Browsers), wo das kleiner ist; `EXPORT_FONT.woff2(sfnt)` – die Tabellen unverändert in einem Brotli-Strom aus ungepackten Blöcken. Der Browser hat keinen Brotli-Packer: die Datei ist gültig, aber so groß wie die OTF. `EXPORT_ENGINE.fontZip(spec, base)` – das ZIP der vier. WOFF und WOFF2 entstehen aus der OTF.
  - **Getestet:** Jede der vier Dateien im ZIP von Chrome als Schrift geladen (OTS prüft OTF, TTF, WOFF und WOFF2, WOFF2 mit Chromes Brotli-Entpacker); „AB“ in allen gleich breit. Matrix: Punkt gesetzt → Speichern › Schrift › ZIP → `…-schrift.zip`, Hinweis „OTF, TTF, WOFF, WOFF2“.

- **Matrix 0.4.30: Dreieck mittig, Zelle in Stufen; Engine Matrix 0.4.12** (user, 03.11.2026: „punkt bei dreiecken nicht mittig. zelle einrasten, mit punktscala“)
  - **Dreieck:** Es reichte von −r (Spitze) bis 0,8 r (Basis), seine Mitte lag ein Zehntel des Punkts neben der Mitte der Zelle – gedreht oder gedehnt sichtbar daneben. Jetzt reicht es von −0,9 r bis 0,9 r, gleich hoch wie bisher, mittig. Gilt auf der Fläche, im SVG und im OTF (eine Geometrie, `tri3`). Gezeichnete Dreiecke rücken dadurch um ein Zwanzigstel ihrer Höhe zur Spitze hin.
  - **Zelle:** rastet in neun Stufen ein, mit Punktskala wie Spalten und Zeilen: 1 : 2,5 · 1 : 2 · 1 : 1,5 · 1 : 1,25 · **1 : 1** (Mitte) · 1,25 : 1 · 1,5 : 1 · 2 : 1 · 2,5 : 1. Ein Projekt mit einem Wert dazwischen behält ihn, bis der Regler bewegt wird. Die Raster-Varianten schlagen nur Stufen vor.
  - **Getestet:** Regler −4 … 4 zeigt die neun Stufen; Dreieck in einer Zelle von 100: 5 bis 95 (Fläche und SVG); Zelle 1,5 : 1 mit „Punkt dehnen“: Dreiecke gleichmäßig in ihren Zellen.

- **Matrix 0.4.29: Punkt dehnen; Engine Matrix 0.4.11** (Feedback, 03.11.2026: „Proportionen der Zellen … Wäre aber super wenn Spalten und Zeilen auch einstellbar wären“; user: „Dadurch bekommt man auch andere Dreiecke, Rechtecke und Ellipsen … Default ist natürlich 100/100“ – „Punkt folgt der Zelle“)
  - Raster › „Punkt dehnen“, unter Zelle, zuerst aus. An, nimmt der Punkt die Proportion der Zelle an: Zelle 2 : 1 macht aus dem Kreis eine liegende Ellipse, aus dem Quadrat ein Rechteck, das Dreieck wird flacher; 1 : 2 stellt sie hoch. Bei 1 : 1 ändert sich nichts. Aus, bleibt der Punkt wie bisher rund oder quadratisch, nur die Abstände ändern sich.
  - Gedreht wird vor dem Dehnen; eine Kontur und eine Linie behalten ihre Strichstärke rundum.
  - **Engine Matrix 0.4.11:** `stretch` (Vorgabe aus der Brand Library, sonst aus). Gilt beim Entwerfen, Setzen, Ticker, Trailer, im SVG (Strich nicht gedehnt) und im OTF (Punkte gedehnt, eine Kontur mit ihr).
  - **Getestet:** Zelle 2 : 1 mit Kreis, Quadrat, Dreieck, Linie, Fläche und Kontur, und 1 : 2 hochgestellt; SVG mit `scale(2 1)` und nicht gedehntem Strich; OTF-Punkt 430 × 215 Einheiten (aus: 214 × 215).

- **Core 0.7.14: Grund und Inspektor auf dem Handy; Matrix 0.4.28: mobil, Versatz ohne Achsenwechsel, Raster-Varianten ohne Überlappung** (user, 02.11.2026: „können wir die mobile darstellung(en) etwas optimieren?“)
  - **Core – Grund:** `setContentGround('light')` setzte `--color-surface-page` auf sich selbst. Das ist ein Zirkel, der Wert war ungültig: Seite und Inspektor waren durchsichtig, auf dem Handy schien der Dock durch das Inspektor-Sheet. Jetzt gilt bei hellem Motiv der Wert aus den Tokens. Gilt in allen Tools.
  - **Core – Inspektor auf dem Handy:** Beim Öffnen und Schließen schob `initInspector` den Dock neben den Inspektor (rechts 356 px, links auto) – auf dem Handy lief er damit aus dem Fenster oder wurde schmal. Bis 560 px Breite bleibt der Dock jetzt das Sheet am unteren Rand. Am Desktop unverändert. Kein Baustein ändert sich, die Library bleibt bei 0.11.1.
  - **Matrix mobil:** Die Bühne ist der Raum über dem Dock bzw. Inspektor und folgt ihm beim Ein- und Ausklappen. Sie nahm vorher die ganze Höhe und, bei offenem Inspektor, keine Breite. Die Miniatur entfällt auf dem Handy; sie lief vom oberen Rand bis zum Dock und deckte die Flächen ab.
  - **Versatz** (user: „hier gibt es beim sliden einen seltsamen wechsel zwischen spalten und zeilen“ – „passiert, wenn man slider schnell von rechts nach links bewegt“; „die buttons erscheinen erst, nachdem man schiebt“): Beim Durchgang durch 0 bleibt „Zeilen“ oder „Spalten“ erhalten (vorher fiel es auf „keiner“ und kam als Zeilen wieder). Die Knöpfe stehen immer da, auch bei 0.
  - **Raster-Varianten** (user: „zeilen/spalten varianten noch buggy“): Versatz in Spalten und Neigung zusammen legen Punkte aufeinander. Eine Variante hat jetzt das eine oder das andere. Von Hand bleibt beides kombinierbar.
  - **Getestet:** Handy 375 × 812: Inspektor deckend, Dock 12 / 351 px vor, mit und nach dem Inspektor; Setzen mit eingeklapptem Dock – die Fläche steht über ihm. Desktop 1280 × 800: Dock neben dem Inspektor (rechts 356 px), Miniatur da. Versatz in Spalten 40 → 0 → −50 → 0 → 30: bleibt Spalten. 24 übernommene Raster-Varianten: keine mit Spalten-Versatz und Neigung.

- **Matrix 0.4.27: Versatz in beide Richtungen** (user, 02.11.2026: „Eigentlich müsste der Versatz in beide Richtungen gehen: Also + und – 0,5 Zeile. Somit am Anfang in der Mitte (also bei Null) stehen“)
  - Raster › Versatz reicht von −½ bis +½ Zelle und startet in der Mitte bei 0. Negativ rückt jede zweite Zeile nach links (bei Spalten nach oben), positiv nach rechts (nach unten). Die Bilder am Regler zeigen beide Enden. Die Engine konnte das schon, sie ändert sich nicht.
  - Die Raster-Varianten schlagen beide Richtungen vor; an den Kanten kehrt sich ein Versatz auch um.
  - **Getestet:** Regler −50 bis 50, Start 0 („0 Zellen“, „Versatz in“ ausgeblendet); −50 → „−½ Zelle“, die geraden Zeilen rücken nach links und bleiben in der Fläche.

- **Matrix 0.4.26: Raster-Varianten mit leeren Zellen; Engine Matrix 0.4.10** (user, 02.11.2026: „raster varianten: einstellung leere zellen übernehmen“)
  - Die Varianten des Rasters zeigen die leeren Zellen jedes Zeichens, wie die Flächen beim Entwerfen. Sie folgen dem Schalter „Leere Zellen“ an der Bühne: an mit Zellen, aus ohne.
  - **Engine Matrix 0.4.10:** `state.cells` zeigt die leeren Zellen auch in gesetztem Text bei entworfenen Zeichen (sonst nur bei nicht entworfenen).
  - **Getestet:** A mit drei Punkten → Zauberstab bei Raster: neun Varianten mit grauen Zellen; Schalter aus → nur die Punkte.

- **Matrix 0.4.25: Kopieren und Einfügen, Raster mit Varianten, Modulation animiert; Engine Matrix 0.4.9**
  - **Kopieren und Einfügen** (user, 02.11.2026: „matrix: copy & paste von buchstaben wäre gut, z.b . kontext menü“): Beim Entwerfen kopiert Cmd+C die Punkte der gewählten Varianten. Cmd+V setzt sie in die gewählten Varianten ein – eine kopierte in jede, mehrere der Reihe nach. Umschalt+Cmd+V legt sie als neue Varianten beim gewählten Zeichen an. Rechtsklick auf eine Variante öffnet dasselbe als Optionsleiste (Kopieren, Einfügen, Als Variante einfügen, Löschen; Block Marken auf der Bühne). Raster, Punkt und Favorit bleiben; Cmd+Z nimmt es zurück. Ein Rechtsklick setzt keinen Punkt mehr.
  - **Raster mit Varianten** (user: „bei raster: random durch varianten ersetzen“): Der Knopf bei Raster würfelt nicht mehr, er öffnet den Zauberstab wie bei Punkt und Modulation. In der Mitte steht das Raster jetzt, an den Kanten ist ein Wert geändert (Spalten, Zeilen, Zelle, Rand, Luft, Versatz oder Neigung), in den Ecken steht ein Raster des Zufalls. Jede Variante zeigt das gewählte Zeichen und die nächsten entworfenen als Wort. Sobald ein Zeichen entworfen ist, bleiben Spalten und Zeilen fest – sonst schnitte eine Variante die Zeichen ab (Design-Wächter; user: „ja“).
  - **Modulation animiert** (user: „bei modulation: wenn aktiv, optional animationsmodus mit modulation“): Bei Stärke über 0 gibt es unter Modulation den Schalter „Animiert“ (zuerst aus) und darunter „Schleife“ (1–12 s, Vorgabe 4 s). Die Modulation läuft dann über die Punkte, in jedem Modus. Bei Ticker und Trailer folgt sie der Abspielleiste. MP4 ist damit auch beim Entwerfen und Setzen möglich, als eine nahtlose Schleife. PNG und SVG speichern immer den Anfang der Schleife, jedes Mal gleich (user: „ja“).
  - **Engine Matrix 0.4.9:** Die Formel kennt `t`, die Zeit von 0 bis 1 in einer Schleife. Die fünf Formen laufen damit einmal rund. Bei t = 0 stehen sie wie bisher, eine eigene Formel ohne `t` steht still.
  - **Getestet:** A mit zwei Punkten → Rechtsklick › Kopieren → Taste B → Cmd+V (B gleich A) → Umschalt+Cmd+V (B · 2) → Cmd+Z (B · 2 weg). Die Raster-Varianten zeigen neun Raster. Animiert an: Die Fläche ändert sich beim Entwerfen und Setzen, aus steht sie. check-standard ok; UI-KPI Modulation: Nähe 0,36, Ziele ≥ 24 px, Kontrast 17.

- **Core 0.7.13: Überschriften mit Knopf ohne Extra-Luft; Werte zeigen keine Playground-Brandtools**
  - **Abstand** (user, 01.11.2026: „der abstand modulation sieht aber falsch aus“): Eine Überschrift mit Symbol-Knopf (Raster, Modulation, Punkt …) war so hoch wie der Knopf (28 px) statt wie ihr Titel (17 px), der Titel saß mittig – gemessen 45,5 px Luft über „Modulation“ und 17,5 px darunter statt 40 und 12. Jetzt hängt der Knopf über und nimmt keinen Platz: 40 / 12 wie bei „Werte“, Knopf und Titel auf einer Mitte. Gilt in allen Tools.
  - **Brandtools** (user: „info: playground brandtools nicht relevant“):
    Ein Tool, das aus dem Playground geöffnet ist, nennt in Inspektor › Werte nur seine eigene Version. Bei einem Kunden bleibt die Zeile der Brandtools (gemessen: Logo mit HMI → „HMI Project Brandtools 0.1.0“).

- **Logo 0.3.13: Der Film wechselt eine Stelle nach der anderen, auch am Ende** (Feedback, 02.11.2026: „Hier am Ende macht er jetzt 3 Transitions auf einmal (12 Sec) und hier animiert er nur den Mund und bei den Augen passiert gar nichts (8 Sec)“)
  - **Gemessen** (die beiden MP4, Bild für Bild): 12 s – Wechsel an linkem Auge, rechtem Auge, Mund, rechtem Auge, rechtem Auge, bei 11,5 s alle drei auf einmal; 8 s – alle vier Wechsel am Mund. **Ursache:** Der letzte Wechsel führte zurück zum ersten Bild und nahm dabei alle Änderungen des Films auf einmal zurück; welche Stelle wechselt, war reiner Zufall.
  - **Jetzt:** Der Film ist eine Schleife aus einzelnen Wechseln der Engine – neu an einer Stelle, eine frühere zurück oder eine Stelle noch einmal –, so dass nach dem vorletzten genau eine Änderung offen ist und der letzte Wechsel sie zurücknimmt. Nie dieselbe Stelle zweimal hintereinander, wo es geht; von den möglichen Filmen der, der die meisten Stellen bewegt. Takt, Zufall, Übergang wie bisher.
  - **Getestet** (HMI, Nur Gesichter, Takt 2 s, die Filmbilder beim Export abgefangen): 8 s, 12 s, 30 s, 60 s – jeder Wechsel eine Stelle, Ende = Anfang, 12 s alle drei Stellen, keine Stelle zweimal hintereinander (bei ungerader Zahl von Wechseln einmal unvermeidlich); ohne Nur Gesichter je Wechsel höchstens ein Paar (Verbinden/Teilen); HELIO 6, 8, 12 s schließt ebenso. Rechenzeit 50–115 ms.

- **Matrix 0.4.24: Modulation mit dem Zauberstab statt Würfel** (user, 01.11.2026: „bei modulatin wäre zauberstab funktion besser also random“)
  - Der Knopf bei Modulation öffnet die Varianten wie beim Punkt (Block Varianten): in der Mitte die Modulation jetzt, an den Kanten eine Änderung eines Werts (Stärke, Form, Frequenz oder Zufall; ohne Modulation zuerst die Stärke), in den Ecken eine Modulation des Zufalls. Vorschau am gewählten Zeichen; Übernehmen, Verwerfen und Cmd+Z wie beim Punkt.
  - **Getestet:** A geladen, Modulation 0 % → Zauberstab, Ecke oben links übernommen → 30 %; Cmd+Z → 0 %.

- **Matrix 0.4.23: Schalter Kleinbuchstaben, zuerst aus** (user, 01.11.2026: „ich hätte gerne einen toggle (Kleinbuchstaben), der erst aktiviert werden muss. oder toggle Großbuchstaben, der immer an ist. was ist besser?“ – „Kleinbuchstaben, aus“)
  - Raster › Kleinbuchstaben, unter der Unterlänge. **Aus** (Standard, auch für Projekte von vorher): Eine Taste und das Feld Zeichen geben den Großbuchstaben (g → G, ß → ẞ), der Text steht in Großbuchstaben, die Spalten der Kleinbuchstaben ruhen – ausgeblendet, im Projekt erhalten; im OTF stehen die Großbuchstaben auch für die kleinen. **An:** Groß und klein wie getippt (0.4.22). Der Schalter steht im Projekt; Cmd+Z nimmt ihn zurück.
  - **Getestet:** Projekt mit A, G und g: an → 3 Spalten, Taste g wählt g; aus → 2 Spalten, Taste g wählt G, Taste q legt Q an, Text „Ag ga“ setzt A G · G A (an: A g · g A); Cmd+Z nach dem Schalter → wieder aus; OTF aus: g hat die Form von G.

- **Matrix 0.4.22: Unterlänge und Kleinbuchstaben; Engine Matrix 0.4.8; Playground-Library 0.3.1** (user, 01.11.2026: „ja, unterlänge + groß/klein loslegen“)
  - **Unterlänge:** Raster › Unterlänge, 0 bis 4 Zeilen unter der Grundlinie, für alle Zeichen gleich; Standard „keine“, Projekte von vorher bleiben so. Beim Entwerfen zeigt eine graue Linie die Grundlinie (Bühnen-Marke, nie im Export). Setzen, Ticker und Film nehmen die ganze Höhe, der Zeilenabstand zählt ab der Unterlänge.
  - **Groß und klein:** Zeichen und Text werden so genommen, wie sie getippt sind. Ein Kleinbuchstabe, der nicht entworfen ist, steht im Text als sein Großbuchstabe (und umgekehrt) – ein Alphabet nur aus Großbuchstaben setzt wie bisher. Die Kleinbuchstaben folgen in der Ordnung nach den Ziffern; im Alphabet stehen sie in eigenen Zeilen, sobald einer entworfen ist.
  - **OTF:** Die Versalhöhe sind die Zeilen über der Grundlinie, die Unterlänge des Fonts die Zeilen darunter plus Rand. Ein Klein- und ein Großbuchstabe, beide entworfen, sind zwei Zeichen; fehlt einer, steht der andere für ihn.
  - **Getestet:** Projekt mit A (über der Grundlinie) und g (2 Zeilen darunter), Unterlänge 2: Text „Ag ga“ setzt A A g · g A; OTF im Browser geladen – A sitzt auf der Grundlinie, g reicht 194 Einheiten darunter, Font 800 über / 300 unter der Grundlinie, Zeichen A, a, G, g belegt. Altes Projekt ohne Unterlänge geladen → „keine“, Raster 5 × 7.

- **Matrix 0.4.21: Werte ohne doppeltes „Zeichen“** (user, 01.11.2026: „warum 2x werte?“)
  - Die Auswahl heißt in den Werten „Gewählt“, die Liste der Zeichen bleibt „Zeichen“.
  - „Zustand kopieren“ bleibt vorerst (user: „brauche ich zustand kopieren? ich denke nein, oder?“): Für Matrix ist es neben Projekt speichern/laden doppelt, die QS verlangt es aber als Standard in den Werten jedes Tools – offen, ob der Standard für Tools mit Projekt-Datei entfällt.

- **Matrix 0.4.20: Zeichen-Feld nur bei einem Zeichen** (user, 01.11.2026: „problem: zeichenzuordnung (textfeld) bei multi-selektion“)
  - Sind Varianten mehrerer Zeichen gewählt (Umschalt-Klick, Cmd+A), blendet das Panel den Abschnitt „Zeichen“ aus – eine Zuordnung gehört immer zu einer Spalte. Varianten desselben Zeichens behalten das Feld.
  - **Getestet:** A und B gewählt → Abschnitt weg; Cmd+A → weg; Klick auf die Arbeitsfläche (ein Zeichen) → wieder da mit dem Zeichen.

- **Matrix 0.4.19: ein Punkt für die ganze Schrift, die Varianten bleiben** (Feedback, 31.10.2026: „Parameter default bei einzelnen Buchstaben zu ändern widerspricht dem Prinzip der Aufgabe“ – user: „Global, Varianten bleiben“; ersetzt „nur pro variante“ vom 26.10.2026)
  - Der Abschnitt im Panel heißt „Punkt“: Form, Größe, Drehung, Rundung, Linienstärke und Kontur gelten für jedes Zeichen und jede Variante. Varianten unterscheiden sich nur noch darin, welche Punkte gesetzt sind.
  - Der Varianten-Dialog (Zauberstab) schlägt Punkte für die ganze Schrift vor; Übernehmen, Verwerfen und Cmd+Z wie bisher.
  - Projekte von vorher: Der Punkt der Schrift, mit dem sie gespeichert wurden, gilt; eigene Werte einzelner Varianten entfallen beim Laden.
  - **Getestet:** Projekt mit eigenem Dreieck in B geladen → die Varianten tragen nur noch Raster und Punkte (`c, r, on`), der Punkt der Schrift (Quadrat) gilt; Form Kreis → alle Zeichen, Cmd+Z → Quadrat; Varianten-Dialog: Kreis als Kontur übernommen → alle Zeichen und Varianten so, Kontur-Schalter an.

- **Matrix 0.4.18: Projektname als Dateiname; Miniatur auf dem Grund der Arbeitsfläche** (Feedback, 31.10.2026, eingefügt vom user)
  - **Name** (Feedback: „Man muss dem Projekt einen Namen geben können, der dann möglichst bei dem Download auch schon Datei-Name ist“): Inspektor › Projekt › Name. Jede gespeicherte Datei beginnt nach der Zeit mit ihm – PNG, SVG, MP4, OTF, JSON (`20261031-210031_mein-alphabet-ue.otf`, `…_mein-alphabet-ue_a-1_schwarz-auf-weiss.png`); ohne Namen wie bisher `…_playground-matrix_…`. Die Schrift (OTF) heißt wie das Projekt, ohne Namen „Playground Matrix“. Der Name steht im Projekt (JSON) und kommt mit „Projekt laden“ zurück.
  - **Miniatur** (Feedback: „Miniatur ist super, glaube aber, dass sie gleiche BG-Farbe wie BG-Farbe der Arbeitsfläche braucht“): das Panel Vorschau hat den Grund der Arbeitsfläche (`--color-surface-room`, gemessen rgb(28, 28, 30) wie der Raum), ohne Milchglas; Rundung und Schatten bleiben, es bleibt verschiebbar.

- **Matrix 0.4.17: Feld „Zeichen“ – eine Spalte einem anderen Zeichen geben** (user, 30.10.2026: „wie kann ich eigentlich die zeichenzuordnung ändern? z. b. wenn die fläche C zugeordnet ist, ich aber ein U möchte“ – „aber was wenn es mehre zeichen in einer spalte gibt?“ – „Immer die ganze Spalte“)
  - In Entwerfen über „Variante“: das Zeichen der gewählten Spalte. Ein anderes eintippen gibt ihm die ganze Spalte, alle Varianten und den Favoriten (Kleinbuchstaben werden groß, ß wird ẞ). Gibt es das Zeichen schon, tauschen beide ihre Spalten – nichts geht verloren, dasselbe noch einmal tauscht zurück. Cmd+Z nimmt es zurück.
  - Das Feld ist kein Zustand des Panels (ohne id, nicht in `initControlState`): sonst setzte Rückgängig den Wert und löste das Umstellen erneut aus.
  - **Speichern › PNG ohne Größe und Beschnitt** (user, 30.10.2026: „das kann hier entfallen, ebenso beschnitt“): immer 4K wie bisher vorgegeben, die Maße stehen am Label.
  - **Getestet** (36 Zeichen der Testdaten, U mit zwei Varianten): C → U tauscht beide Spalten vollständig, die Reihenfolge bleibt; U → ß (neu) macht die Spalte zu ẞ, ans Ende der Reihe; zweimal Rückgängig stellt C und U wieder her.

- **Matrix 0.4.16: Schrift als OTF statt TTF; Engine Export 0.5.8 schreibt OpenType mit CFF** (user, 30.10.2026: „matrix: otf statt ttf export machbar?“ – „Ja, OTF statt TTF“)
  - **Engine Export** (`engines/export/font.js`, ohne Bibliothek): neu `EXPORT_FONT.otf` / `EXPORT_ENGINE.otf` – dieselbe Schrift mit einer CFF-Tabelle statt glyf und loca (`OTTO`, maxp 0.5, Glyphennamen `uniXXXX`). Jedes quadratische Kurvenstück wird die kubische Kurve derselben Form (Kontrollpunkte bei 2/3, 16.16 Festkomma); die Konturen sind umgedreht (CFF: außen gegen den Uhrzeigersinn). `ttf` bleibt in der Engine. Alle Seiten laden `export/engine.js?v=0.5.8`.
  - **Matrix:** Speichern → Schrift „OTF“, Datei `….otf`.
  - **Geprüft** (36 Zeichen der Testdaten, Kreis, Kreis Kontur, Quadrat gerundet und Kontur, Linie, Linie Kontur, Dreieck, Dreieck Kontur, Quadrat gedreht): fontTools liest die OTF, je Glyphe dieselbe Fläche wie die TTF (größte Abweichung 0,0001 %), dieselben Grenzen und Breiten; macOS (CoreText) lädt sie als „Playground Matrix“, 38 Glyphen; im Browser gesetzt kein Pixel um mehr als ein Viertel anders (1 629 von 72 495 Kantenpixeln minimal). Die OTF ist 57 KB, die TTF 29 KB (Festkommazahlen).

- **Image Gradient 0.2.12: Stapel speichert jedes Bild in seinem Format und seiner Größe** (user, 30.10.2026: „image gradient: bei bilder laden (stapel): wird das import-format des bildes verwendet, oder die einstellung im panel“ – „Ja, Bildformat“)
  - **Vorher:** Jedes Bild wurde auf die Bühne gelegt – Seitenverhältnis aus Format im Panel, das Bild füllend beschnitten; die Pixelgröße war die der Bühne auf dem Bildschirm (abhängig vom Fenster). Vom Bild kam nur der Dateityp.
  - **Jetzt:** Jedes Bild bekommt eine eigene Fläche in seinem Seitenverhältnis und seinen Pixeln; das Bild ist ganz, nichts beschnitten. Die Felder liegen an ihrer Stelle (relativ zur Fläche), Mischmodus, Deckkraft und Körnung wie eingestellt. Dateityp wie bisher (JPG, WebP, sonst PNG). Nur über das, was ein Canvas im Browser fasst (16384 px je Seite), wird verkleinert, ganz.
  - **Deckkraft zeigt ihren Wert** (user, 30.10.2026: „bei deckkraft auch den wert darstellen“): rechts im Label in Prozent, wie bei den anderen Reglern mit Wert.

- **Logo 0.3.12: kein Loop-Schalter mehr, das Video hält den Takt** (user, 30.10.2026: „das video hält das timing nicht“ – „Schalter entfernen“)
  - **Ursache:** Loop speicherte den Film vor und zurück. Im zweiten Teil liefen die Wechsel rückwärts, begannen auf dem Takt statt dort zu enden, und am Wendepunkt lief ein Wechsel hin und sofort zurück. Gemessen an der Datei (6 s, Loop, 358 Bilder): Bewegung 1,6–2,0 · 3,6–4,0 · 5,6–6,5 · 8,0–8,4 · 10,0–10,4 s; im Tool nachgestellt genauso.
  - **Jetzt:** Der Film ist für sich schon ein nahtloser Loop (der letzte Wechsel führt zur ersten Anordnung, seit 28.10.2026), der Schalter entfällt. MP4 und PNG-Sequenz speichern nur noch vorwärts.

- **Core 0.7.12: Dashboards warten auf Bilder nur, bis sie geladen sind, höchstens 1 s** (user, 30.10.2026: „das lädt ewig: …/brands/helio/index.html“ – „bzw erscheint sehr spät“ – „die ganze Seite“)
  - **Gemessen online (Chrome, dieses Netz):** HELIO blendet nach 0,7 s ein, mit 8/8 Bildern (zusammen 750 KB); spät nicht nachvollziehbar.
  - **Vermutete Ursache:** `picturesIn` wartete mit `img.decode()` – das kann je nach Browser bei SVG oder nicht gezeigten Bildern (die Variante des anderen Modus) lange dauern, bis die Sicherung nach 3 s greift.
  - **Jetzt:** geladen genügt (`load`/`error`), und länger als 1 s wartet die Seite nicht auf Bilder (`PICTURES_MAX`).
  - **Gemessen lokal:** HELIO 82 ms (8/8 Bilder), HMI 163 ms (15/15), THA 88 ms (6/6), Designcampus 75 ms (1/1), Playground 121 ms; die Engine-Kacheln weiter vor dem Einblenden.

- **Core 0.7.11: Varianten mit den Pfeiltasten, Neu mischen wechselt alle** (user, 30.10.2026: „links rechts wechsel nicht bei variante“)
  - Im Varianten-Dialog (Block Varianten, initVariants) bewegen ← → ↑ ↓ den Fokus im Raster 3 × 3, am Rand bleibt er stehen; Enter oder Leertaste wählt. Vorher hörte der Dialog nur auf Esc, Tab, Enter und Leertaste. Gilt in allen Tools mit Varianten.
  - Gemessen (Matrix): Fokus 4 → 5 → 5 (Rand) → 8 → 7 → 4 → 1 → 0 → 0 (Rand); gewählt, dann wieder in der Mitte.
  - **Neu mischen wechselt alle acht** („die varianten links und rechts wechseln nicht bei shuffle“): Die Kanten des Kreuzes werden neue Abwandlungen der Mitte, die Ecken neue Vorschläge; keine der eben gezeigten kommt wieder. Ursache: Der Fix der Duplikate (Core 0.7.10) hatte die alte Regel „Kanten bleiben“ wirksam gemacht, die vorher still nicht griff. Gemessen (Matrix): 30 Mal gemischt, jedes der acht Felder 30 Mal neu, 0 doppelte.

- **Matrix 0.4.15, Engine Matrix 0.4.7: der Ticker folgt dem Raster** (user, 30.10.2026: „ticker reagiert nicht auf anpassungen neigungen usw“)
  - **Ursache:** Die Anzeige des Tickers nahm nur Spalten, Zeilen, Zelle, Rand und Luft; Versatz, Neigung und Modulation fehlten.
  - **Jetzt:** Versatz verschiebt jede zweite Zeile (oder Spalte) der Anzeige, Neigung jede Zeile wie in einem Zeichen; links füllen weitere Spalten den frei werdenden Raum. Die Modulation lässt die Punkte eines Buchstabens dort wachsen und schrumpfen, wo sie im Buchstaben liegen, und wandert mit ihm. Das gilt auch für die Ticker-Szene im Trailer.
  - **Gemessen:** Das Bild des Tickers ändert sich gegenüber dem Grundzustand bei Neigung, Versatz Zeilen, Versatz Spalten, Modulation, Luft und Zelle.

- **Matrix 0.4.14, Core 0.7.10: Miniatur, Varianten ohne Duplikate, Projekt laden (JSON)** (user, 30.10.2026)
  - **Miniatur (Probe):** ein eigenes Panel „Vorschau“, oben links, am Kopf verschiebbar (Block Panel, initPanel, Lage gemerkt), ohne Schließen und ohne Einklappen (Core initPanel: `minBtn: false` – kein Knopf, kein Doppelklick; „einklappen entfällt“). Darin die gewählte Variante im Format ihrer Karte beim Entwerfen, mit dem Rahmen der Bühne, ohne leere Zellen, 28 px Versalhöhe; sie folgt der Wahl, bei Mehrfachauswahl stehen die Karten nebeneinander in der Reihenfolge der Wahl („miniatur oben links ist ok“; „nein, mit rahmung wie zuvor mit fenster. buchstaben im gleichen format wie bei bearbeitung lassen. und wir machen doch panel zum verschieben, kann aber nicht geschlossen werden“; „vorschau muss mit fokus wechseln. was ist bei mehrfachauswahl?“). Die Rundung ist die der großen Karte, mit ihr verkleinert (`--radius-field` × Maßstab; „rundung buchstaben muss den grossen buchstaben entsprechen“). Gemessen: 1 Karte, nach Shift-Klick 2; gezogen von (28, 28) nach (228, 128); Rundung zu Breite groß 10/252 = 0,0397, klein 1,11/28 = 0,0397; Doppelklick auf den Kopf klappt nicht ein. Radius 18 px (Feld 10 + Rand 8) wie die kleine Fläche der Bühnen-Optionen statt 28 („kleines fenster müsste kleineren radius haben (styleguide)“); ohne Titel, die ganze Fläche ist der Griff, ringsum 16 px („text vorschau weglassen?“ – „Ja, weglassen“). Gemessen: 16 px oben, links, rechts, unten; gezogen um 100 × 50 px.
  - **Varianten ohne Duplikate (Core, initVariants):** Eine Variante, die einer schon gezeigten gleicht, wird neu gemacht; `opts.key` sagt, was eine Variante ausmacht („varianten: duplikate vermeiden“). Matrix vergleicht den Punkt, wie man ihn sieht (Kreis ohne Drehung, Rundung nur beim Quadrat, Linienstärke nur bei Kontur oder Linie). Gemessen: 60 Durchgänge, 0 doppelte Bilder (vorher 11 in 45). Dabei behoben: Neu mischen behielt die Kanten des Kreuzes nicht (die Liste wurde vor dem Merken geleert).
  - **Projekt laden (JSON)** statt „Projekt öffnen“, auch im Hinweis beim Speichern und in der Meldung („bei projekt öffnen in klammern JSON dazunehmen“ – „besser projekt laden“).
  - **Panel transparent:** geprüft, unverändert („die transparenz aber erhalten, ist gut“). In allen 20 Tools gleich: 72 % Fläche, Weichzeichner 28 px; kein Vorfahr mit Deckkraft oder Filter. Wie transparent es wirkt, hängt vom Grund dahinter ab: über einer weißen Karte hell, über dem dunklen Raum fast deckend. Die Pattern Library zeigt dieselbe Klasse `.dock`. Das Panel quer im Motion Composer hat keinen Weichzeichner (`.dock.quer`); die Bühne weicht ihm aus, dahinter liegt nur der Raum.

- **Matrix 0.4.13: Auswahl lösen mit Klick ins Leere, Löschen mit ⌫** (user, 30.10.2026: „wenn man alle varianten auswählt, fällt es schwer die auswahl zu lösen. klick in leere fläche?“; „wie lösche ich eigentlich einen buchstaben?“ – „Ja, beheben“)
  - **Klick in die leere Bühne:** löst eine Auswahl mehrerer Varianten, wie Esc; die zuletzt gewählte bleibt. Gemessen: nach Cmd+A 5 gewählt, nach dem Klick 1.
  - **⌫ löscht:** Die Löschtaste der Mac-Tastatur sendet `Backspace`, das Tool hörte nur auf `Delete` (Entf). Jetzt löschen beide die gewählten Varianten; in Textfeldern bleibt ⌫ beim Text. Gemessen: 4 Karten → ⌫ → 3 → Cmd+Z → 4.

- **Matrix 0.4.12, Engine Matrix 0.4.6: ruhige Ansicht, Abstand trotz Neigung, leere Zellen hinten** (user, 30.10.2026, mit zwei Screenshots: überlappende Quadrate und Dreiecke, das leere über dem vollen)
  - **Entwerfen, Ansicht:** Die Zellgröße hängt nur noch von der Höhe ab, nicht mehr von der Zahl der Zeichen („ansicht nicht verkleinern, wenn neue buchstaben dazukommen“). Gemessen: 36 px vor und nach 20 neuen Zeichen, vorher sank sie bis 14 px. Alles einpassen (⇧1) passt weiter alle ein.
  - **Default-Text:** „DESIGN IS THINKING MADE VISUAL.“ („default text: DESIGN IS THINKING MADE VISUAL.“).
  - **Setzen und Bewegen, Abstand:** Ein Zeichen rückt nur um Raster und Rand vor; Neigung und Versatz ragen in den Raum des nächsten („neigung und versatz müssen ausgeglichen werden, da zeichenabstand sonst viel zu gross“). Gemessen: 2 freie Zellen zwischen zwei Zeichen, gerade, mit Neigung 100 % und mit Versatz 50 %; vorher kam die Neigung dazu (bei 7 Zeilen und 100 % 6 Zellen). Das gilt auch für die Wörter im Trailer.
  - **Linienstärke:** mindestens 8 % des Punkts, in der Engine, am Regler und beim Würfeln; kleinere Werte alter Projekte werden 8 % („linienstärke begrenzen, darf nicht zu dünn werden“).
  - **Leere Zellen immer hinten:** erst alle leeren Zellen, dann die Tinte, auf der Karte, beim Setzen und im Ticker („leere zellen müssen immer hinten liegen“). Gemessen: Wo ein leeres Quadrat ein volles überlappt, ist das Pixel Tinte.

- **Core 0.7.9, Keyvisual animiert 0.3.13: Engine-Kacheln sind beim Einblenden schon da** (user, 30.10.2026: „bitte nochmal alle dashboards prüfen … THA, designcampus blitzen noch“)
  - **Ursache, online gemessen:** Die Seite blendete ein, dann tauschten drei Live-Kacheln ihr Standbild aus:
    - THA, Keyvisual animiert: 37 ms nach dem Einblenden, gegen ein zu 100 % transparentes Bild (die Schleife beginnt leer).
    - Designcampus, Lattice Keyvisual und Lattice Keyvisual Motion: 90–100 ms danach, gegen ein anderes Bild (Abweichung 86 von 255).
  - **Behoben:**
    - `toolTileLive`: Die Seite wartet (`holdPage`) auf das erste Bild jeder Engine-Kachel, bei Fehlern nicht. Der Film des Motion Composers bleibt beim Standbild, weil er Sekunden lädt.
    - Keyvisual animiert startet in der Kachel bei 4 s (`live.start`). Bei 0 s ist das Bild leer, ab 2 s ist es voll.
  - **Geprüft lokal:** Auf allen fünf Brand-Dashboards (THA, Designcampus, HMI, HELIO, Playground) entsteht jedes Engine-Canvas vor dem Einblenden; danach wird nichts mehr ausgetauscht. Die Übersicht `dashboard/` hat keine Kacheln. `check-standard.py` ok.

- **Ausliefern: Playground als Alias, ohne Zip, Hochladen per Automator** (user, 30.10.2026: „es ist etwas unpraktisch, dass playground immer doppelt ausgeliefert werden muss. eigentlich will ich ja nur ein alias“ – „Ja, umstellen“; „das zip bei designtools kann übrigens immer entfallen“; „ich hatte eigentlich nach automator, nicht nach apple script gefragt“; „in diesen beiden ordnern darfst du löschen“)
  - `scripts/build-site.sh` baut `dist/playground` nur noch als `.htaccess`: `/playground/` leitet auf `brands/playground/index.html`, alles andere liefert Apache intern aus `/designtools/`, die Adresse bleibt. Kein `designtools.zip` mehr.
  - `scripts/Hochladen.workflow`: zwei Transmit-Aktionen „Synchronisieren“ mit den Favoriten demo.danielrothaug.com/designtools und /playground, Richtung Hochladen, verwaiste Objekte am Ziel werden gelöscht.
  - **Geprüft online:** `/playground/` → 302 auf `/playground/brands/playground/index.html`; `core/ui.js`, `brands/playground/index.html` und `tools/case-film/preview-helio.jpg` unter `/playground/` byte-gleich mit `dist/designtools`; im Server-Ordner `playground/` liegt nur die `.htaccess`.

- **Core 0.7.8, Motion Composer 0.5.16: Die Film-Kachel übernimmt nahtlos vom Standbild** (user, 30.10.2026: „das blitzen ist nach wie vor im dashboard nicht gelöst“ – „ab standbild“)
  - **Ursache, online gemessen:** Das HELIO-Dashboard selbst blendet sauber ein. Nach etwa 4,1 s ersetzte der Film der Motion-Composer-Kachel aber sein Standbild (mittlere Helligkeit 218) und begann schwarz (Helligkeit 0). Bei HMI, THA und Designcampus ebenso: Die Standbilder stammten aus keinem Bild des heutigen Films (HELIO bestenfalls 89 von 255 Abweichung).
  - **Behoben:**
    - `tool.json` „live“.start nennt je Marke die Stelle im Film, an der die Kachel startet: HELIO 54 s, HMI 36,6 s, THA 46 s, Designcampus 2 s (jeweils die Stelle, die dem bisherigen Standbild am nächsten kam). `toolTileLive` spielt von dort weiter.
    - Die vier Standbilder sind genau diese Filmbilder, aus dem Film gerendert (1280 × 720).
    - `tileFilm` übernimmt erst, wenn die Bilder des Films decodiert und die Teile seiner Grafiken (SVG) gelesen sind (höchstens 5 s). Vorher fehlten sie im ersten Bild.
  - **Geprüft:** Erstes Filmbild gegen Standbild in voller Auflösung, Abweichung von 255: HELIO 0,8, THA 0,6, Designcampus 2,6, HMI 1,7 (auf seinem Dashboard). Der Film zeichnet bei gleicher Zeit immer dasselbe Bild (0).

- **Logo 0.3.11, Core 0.7.8: Farbfelder zeigen Grund und Figur der Ausgabe, auch bei HELIO mit Karte** (user, 30.10.2026: „vorder- und hintergrund ist beim farbwähler falsch zugeordnet. vermutlich überall..“ – „hintergrundfarbe = aussen/ring, vordergrund = innen“)
  - **Block Farbfelder ist richtig:** `pairSwatch(fg, bg)` zeichnet den Punkt in `fg` und den Ring in `bg`. Alle Tools übergeben Figur und Grund in dieser Reihenfolge.
  - **Ursache, nur Logo × HELIO:** Mit Karte kippt HELIO Shuffle die Seite (`pageBg()`, Brand Library `card.inverted`). Der Swatch „Schwarz auf Weiß“ zeigte weiterhin einen weißen Ring, die Bühne war aber schwarz.
  - **Behoben im Core:** `groundSwatches(row, brand, turned)` setzt die Swatches einer Farbe-Reihe. `startOnBrandTheme` nutzt die Funktion. Das Logo-Tool ruft sie bei jedem Umschalten der Karte mit `card.inverted && Karte an` auf. Gekippt zeigt jeder Swatch das gekippte Paar und trägt den Namen des anderen.
  - **Geprüft:** Gemessen wurden Ring und Punkt gegen das Eckpixel und die Farben der Bühne, nach Klick auf jeden Swatch.
    - Vorher: 35 Kombinationen aus Logo, Icon/Letter Pattern, QR Code, Type Scale, Arrow Pattern, Texttafel und SVG-Animator mit HMI, HELIO, THA, DesignCampus und Playground. Nur Logo × HELIO war vertauscht.
    - Ebenfalls ok: Keyvisual, Keyvisual animiert, Lattice Keyvisual (+ Motion), Matrix, Face Pattern und Case Film HELIO.
    - Ok per Code: Custom Type (`rect fill=c.bg`, `g fill=c.fg`) und Case Film (Sequencer `colorsOf` = `{fg: ink, bg: bg}`).
    - Nachher: Logo × HELIO ok bei Karte an, aus und wieder an. Gegenprobe an 8 Tools ok. `check-standard.py` ok.

- **Logo 0.3.10, HELIO Shuffle 0.2.5, Export 0.5.7: HELIO-Logo als Vektor ohne Rechteck, Buchstaben als echte Löcher** (user, 30.10.2026, über die Session HMI Case-Film Tool: „HELIO liefert eine falsche ausgabe“, mit einem Screenshot aus Illustrator: ein Rechteck in Größe der Zeichenfläche, die Karte ein leeres Quadrat)
  - **Welche Datei:** das PDF des Logo-Tools mit Karte. Das SVG hat denselben zweiten Fehler.
  - **Ursache 1, Rechteck:** Die Engine Export (`pdf.js`) schnitt jede PDF-Seite mit einem Pfad in Größe der Seite zu (`0 0 1600 900 re W n`). Illustrator zeigt diesen Zuschnitt als Rechteck-Objekt.
  - **Ursache 2, leere Karte:** Die Buchstaben waren nur in einer Maske ausgestanzt (SVG `<mask>`, PDF Soft Mask). Illustrator macht daraus eine Deckkraftmaske; die Karte erscheint als leeres Quadrat.
  - **Behoben in den Engines:**
    - `pdf.js` schneidet nur noch zu, wenn etwas über Seite und Beschnitt hinausragt.
    - HELIO Shuffle schreibt Karte und Buchstaben als einen Pfad: Die Buchstaben sind Löcher (gerade/ungerade-Füllregel, `evenodd`), ohne Maske. Das gilt auch für die SVGs im Stapel-ZIP.
    - Die Löcher sind deckungsgleich mit der bisherigen Maske: 0 abweichende Pixel in allen 24 Anordnungen, beide Farben.
  - **Prüfung erweitert:** `scripts/logo-vektor-messen.js` erkennt genau diesen Fall:
    - `pdfClip`: ein Zuschnitt in Größe der Seite im PDF.
    - `versteckt`: Das SVG sieht ohne seine Masken anders aus, also steckt Sichtbares nur in einer Maske.
    - `scripts/ausstanzen-messen.js` prüft jetzt auf ausgestanzte Pfade statt auf die Maske.
  - **Geprüft:**
    - Verstoß eingebaut (bisheriger Stand von `shuffle.js` und `pdf.js`): `pdfClip` in allen 8 HELIO-Fällen gemeldet, `versteckt` in allen 4 Fällen mit Karte. Danach zurückgenommen.
    - ok für Logo (HELIO, HMI), Face Pattern, Arrow Pattern, Icon Pattern (HMI, HELIO), QR Code und Matrix. `ausstanzen-messen.js` ok.
    - Keine Fehler in der Konsole.

- **Core: Seiten erscheinen erst, wenn sie da sind** (user, 29.10.2026, online: „die einblendungen funktionieren nicht“ – „erscheint verschwindet blitzt“ – „betrifft alle dashboards und apps“): online zeigte sich die Seite nach ~1,3 s ohne Kacheln, die Kacheln kamen leer bei ~1,6 s, ihre Bilder bei ~1,8 s. Jetzt wartet das Einblenden auf Schrift, das Laden der Seite (Skripte, Stile, Bilder) und was eine Seite mit `holdPage(promise)` anmeldet; das Dashboard einer Brand meldet seine Kacheln samt dekodierten Bildern an (`picturesIn`). Höchstens 3 s (boot.js). Lokal gemessen: Brand-Dashboard blendet bei 138 ms mit 10 Kacheln und 17/17 Bildern ein, Logo erst mit 12/12 Bildern. Die Übersicht (dashboard/) wartet nicht – ihr Aufbau dauert über 2 s.
- **Matrix 0.4.11: Trailer ohne Ton, immer 120 BPM** (user, 29.10.2026: „matrix ohne sound ausliefern, nur 120bpm“): der vorgeladene Ton des Case Film (Comp23), „Ton laden“, „Ohne Ton“ und der Regler Tempo sind weg; der Abschnitt Trailer fällt damit leer weg; MP4 immer ohne Ton; `tools/case-film/audio.js` und `comp23-lang.m4a` nicht mehr in `uses`.
- **Core: Seiten blenden beim Laden ein statt aufzublitzen** (user, 28.10.2026: „die tools starten alle noch leer und blitzen auf“): `html.preload body` ist durchsichtig statt unsichtbar, beim Aufheben blendet der Körper mit `--motion-move` (260 ms) und `--motion-easing` ein. Online gemessen: Schrift und Seite sind nach rund 430 ms da, bis dahin bleibt der Raum in seiner Farbe.
- **Core: Raum um die Bühne im Dunkeln dunkelgrau statt Schwarz** (user, 28.10.2026: „warum ist matrix app auf schwarz? der hintergrund ist immer dunkelgrau im darkmode“): Im Format Frei lag die Seite auf `--color-surface-raised` (dunkel: Schwarz). Neues Token `--color-surface-room` (hell Weiß wie bisher, dunkel Grau 11 wie `--color-surface-page`) für `html, body`. Betrifft jedes Tool im Format Frei, nicht nur Matrix.
- **Matrix 0.4.10: startet bei jedem Öffnen leer** (user, 28.10.2026: „warum lädt die default schrift immernoch. soll leer starten“ – „Ja, immer leer“): Matrix nimmt beim Öffnen nichts mehr aus dem Browser-Speicher und löscht ein dort gespeichertes Projekt. Ein Projekt kommt nur noch als Datei (Inspektor › Werte › Projekt öffnen). Das einmalige Verwerfen eines unveränderten Testalphabets (0.4.8) fällt weg.
- **Export 0.5.6: Arrow Pattern, Icon Pattern, QR Code und Matrix als SVG und PDF ohne Fläche dahinter – eine Regel in der Engine Export** (user, 28.10.2026, über die Session HMI Case-Film Tool: nach „bei HMI faces wird noch die hintergrundfläche ausgeliefert“ gewählt: „Arrow + Icon Pattern“, „QR Code“, „Matrix“)
  - **Gemeinsame Regel:** `EXPORT_ENGINE.vectorGround(farbe)` in der Engine Export sagt, welche Fläche eine Vektor-Datei (SVG, PDF) unter ihr Bild legt: keine. Die gewählten Tools und Engines fragen dort, wo ihr SVG entsteht. PNG, JPG und MP4 behalten ihren Grund.
  - **Angepasst:**
    - Arrow Pattern 0.4.9 und Icon Pattern 0.2.23 (HMI und HELIO), im `buildSVG` des Tools.
    - QR Code 0.2.15 (Engine QR Code 0.2.5) und Matrix 0.4.9 (Engine Matrix 0.4.5), in der Engine.
  - **Nicht gewählt, Fläche bleibt:** Typesetter, Type Scale, Gradient und THA Keyvisual. Sie fragen die Regel nicht; ihre Seiten haben nur die neue Version der Engine Export nachgezogen.
  - **Nicht angepasst:** Die Raster-Ersatzlösung von QR Code (nur ohne Starter, wenn ein Symbol nicht als Vektor lädt) zeichnet ihr Bild weiter mit Grund.
  - **Prüfung:** `scripts/logo-vektor-messen.js` gilt für jedes Tool mit SVG-Knopf, auch ohne Farbe; ohne PDF-Export prüft es nur das SVG; Masken im PDF zählen nicht als Fläche. Für Matrix (SVG nur im Speichern-Dialog) nimmt es die Engine: `run({ svg, leer: true })` – Matrix startet ohne gezeichnete Zeichen, ihr Test-SVG ist leer.
    - ok für Arrow Pattern, Icon Pattern (HMI, HELIO), QR Code und Matrix; Face Pattern und Logo (HMI, HELIO) weiter ok.
    - Verstoß eingebaut (`vectorGround` gibt die Farbe zurück): bei allen gemeldet, im SVG und, wo es eins gibt, im PDF. Danach zurückgenommen.

- **Face Pattern 0.2.21, Rig 0.2.6: SVG und PDF ohne Fläche dahinter** (user, 28.10.2026, über die Session HMI Case-Film Tool: „bei HMI faces wird noch die hintergrundfläche ausgeliefert“; wie beim Logo: „Immer weglassen“)
  - **Ursache:** `buildSVG` in Face Pattern (`tools/hmi-faces/index.html`) legte ein Rechteck in Grundfarbe unter die Gesichter, mit Beschnitt auch über den Rand. Das PDF entsteht aus diesem SVG. Die Raster-Ersatzlösung zeichnete den Grund mit.
  - **Behoben in der Engine Rig, wie beim Logo:**
    - `exportGround()` gibt keine Fläche: Die Datei enthält nur die Gesichter.
    - `frame` kennt `vector`: Dann wird ohne Grund gezeichnet. Die Raster-Ersatzlösung nutzt das.
    - Im Tool sind nur die Aufrufe angepasst. PNG und MP4 bleiben, wie sie sind.
  - **Prüfung:** `scripts/logo-vektor-messen.js` gilt jetzt für jedes Tool mit Farbe (`#themeRow`) und SVG-Knopf, auch für Face Pattern.
    - ok in beiden Farben, SVG und PDF.
    - Verstoß eingebaut (Rig gibt wieder die Grundfarbe): gemeldet in beiden Farben, SVG und PDF. Danach zurückgenommen.
    - Keine Fehler in der Konsole.
  - **Noch mit Grundfläche im Vektor-Export, nicht geändert:** Arrow Pattern, Icon Pattern, Typesetter, Type Scale (Engine Typescale), QR Code (Engine QR Code), Matrix (Engine Matrix), Gradient (Engine BlobGradient), Keyvisual (THA).

- **Matrix 0.4.8: ein im Browser gespeichertes, unverändertes Testalphabet wird einmal verworfen** (user, 28.10.2026: „bei matrix wird font nicht geladen“ – „testschrift wird geladen (JSON), soll aber nicht geladen“)
  - **Ursache:** Der Code startet seit 0.4.7 leer. Matrix stellt aber das im Browser gespeicherte Projekt wieder her (`dt-matrix-alphabet-playground`), und dort lag noch das Testalphabet vom früheren Start.
  - **Jetzt:** Ist das gespeicherte Projekt genau das Testalphabet der Playground Library, also jedes Zeichen wie `matrix.sample` und nichts von Hand gezeichnet, verwirft Matrix es einmal und startet leer. Eigene Zeichen bleiben.
  - **Geprüft im Browser:** Unverändertes Testalphabet im Speicher → 1 leeres Zeichen. Ein Zeichen geändert → alle 53 bleiben. check-standard ok.

- **Core 0.7.7: die Seiten erscheinen als Ganzes, ohne Blitzen; Icon/Letter Pattern 0.2.22, Arrow Pattern 0.4.8** (user, 28.10.2026, über die Session HMI Case-Film Tool: „die tools/layouts blitzen beim laden. kann man das abschwächen?“; hier: „Ja, freigegeben“)
  - **Ursache, gemessen:** Ein Mess-Skript am Anfang des head zeichnete Modus-Wechsel, Übergänge (`transitionrun`) und den ersten Paint mit Zeitstempel auf. Gemessen in Icon Pattern, Logo, Keyvisual, Matrix, Motion Composer und Typesetter:
    - **Übergänge beim Laden (bestätigt):**
      - Mit Darstellung = System liefen 2–11 Übergänge (Farben, Schatten, Radien von Bühne, Dock, Buttons, Schaltern), die meisten schon vor dem ersten Paint. Sie liefen also sichtbar 120–260 ms in die erste Anzeige hinein.
      - Mit einer anderen Darstellung als im System waren es 6–26.
    - **Darstellung erst durch `ui.js` (bestätigt als Auslöser):** `initPrefs` setzte `data-theme` erst im Skript des Tools, bei 28–61 ms. Lokal war das noch vor dem ersten Paint, startete aber die Übergänge von den System- zu den gewählten Farben. Über das Netz kommt es nach dem ersten Paint.
    - **Format-Hinweis beim Laden (bestätigt):** Icon Pattern und Arrow Pattern zeigten nach 260 ms „1:1 · Mittel · 880 × 880 px“. Auslöser war das Neuzeichnen nach den Schriften aus 0.7.5 (`resize`).
    - **Größen erst später bekannt (bestätigt; user: „vermutlich weil die grössen erst später bekannt sind“):** Gemessen mit UI-Größe Groß und dem Performance-Eintrag `layout-shift`, ohne `boot.js`:
      - Das Dock sprang nach dem ersten Paint, weil UI-Größe und Panel-Zustände erst durch JS kamen: Icon Pattern 0,065, Logo 0,113, Keyvisual 0,115, Matrix 0,092.
      - In Matrix rutschte das Dock zusätzlich in vier Schritten von x 668 auf 644.
      - Mit `boot.js` gibt es keinen Sprung mehr. Die Lage von Dock, Inspektor, Bühne und Schrift bei der Anzeige ist gleich der Endlage.
    - **Schrift-Tor (nicht bestätigt):** `fonts-pending` endete lokal bei 25–56 ms, vor dem ersten Paint.
  - **Core:**
    - Neu: `core/boot.js`, das erste Skript jeder Seite (27 Seiten: Tools, Dashboards, Library). Es setzt Darstellung und UI-Größe vor dem ersten Paint und markiert `html.preload`, höchstens 3 s.
    - `core/ui.css` verbirgt die Seite und hält alle Übergänge an, solange `html.preload` gilt.
    - `core/ui.js` gibt die Seite frei, wenn die Schriften da sind und das Tool sein erstes Bild gezeichnet hat (zwei Frames nach dem Parsen).
    - Icon Pattern und Arrow Pattern zeigen den Format-Hinweis nur nach einem echten Ändern der Fenstergröße (`e.isTrusted`).
  - **Nachher, gleich gemessen:**
    - Darstellung im head bei 9–19 ms.
    - 0 Übergänge beim Laden in Icon Pattern, Logo, Keyvisual, Matrix, Typesetter und Arrow Pattern. Im Motion Composer bleibt einer: Er wechselt den Reiter erst 700 ms nach der Anzeige.
    - Kein Format-Hinweis mehr.
    - Die Seite erscheint als Ganzes bei 51–213 ms.
  - **Prüfung (`check_load`):** Sie meldet `boot.js` fehlt oder steht nach `ui.css`, keine Darstellung im head, Übergänge oder Seite nicht angehalten, keine Freigabe. Fünf eingebaute Verstöße im Speicher, alle fünf erkannt; echt: ok. check-standard ok.

- **Matrix 0.4.7: startet leer, das Testalphabet kommt als Projekt-Datei** (user, 28.10.2026, über die Session HMI Case-Film Tool: „die default schrift kann entfallen, ich lade sie als json“ – „Als JSON-Datei ablegen“)
  - **Start und Zurücksetzen:** Ein erster Start ohne gespeichertes Projekt beginnt leer, ebenso Zurücksetzen. Bisher lud Matrix dann das Testalphabet. Die Playground Library behält `matrix.sample` unverändert, nur ihr Kommentar ist angepasst.
  - **Testalphabet als Datei:** `~/Downloads/playground-testalphabet.json`, nicht im Repo. Sie stammt aus der eigenen Funktion „Speichern › Projekt (JSON)“ von Matrix (`tool: matrix`, `version: 3`, 53 Zeichen) und ist byte-gleich (SHA-256).
  - **Geprüft im Browser:**
    - Frischer Start: leer (ein leeres Zeichen).
    - „Projekt öffnen“ mit der Datei: „Projekt geöffnet“, 53 Zeichen, alle gezeichnet, die Glyphen gleich der Datei.
    - Zurücksetzen: wieder leer.
    - check-standard ok.

- **Core 0.7.6: Tippen auf der Bühne ohne Kürzel, Tippcursor bleibt am Ende; Matrix 0.4.6, Typesetter 0.2.19, Face Tracking 0.2.16** (user, 28.10.2026, über die Session HMI Case-Film Tool: „shortcuts: f wird beim tippen benörtigt (THA oder Matrix), öffent aber fullscreeen. tippcurser springt manchmal von lettzter position zur ersten“; hier: „Ja, freigegeben“)
  - **F öffnete Vollbild:** Der Vollbild-Handler im Core (`initStageFull`) ließ nur Formularfelder aus. Typesetter und Matrix schreiben aber ohne fokussiertes Feld auf die Bühne. Ein F löste deshalb Vollbild aus.
  - **Neu im Core: die Kennung „Bühne tippt“.**
    - Ein Tool meldet mit `stageTyping(fn)`, wann es auf der Bühne schreibt.
    - `typingKey(e)` prüft Formularfeld, contentEditable, `body.typing` und diese Meldungen.
    - Vollbild und Abspielleiste fragen `typingKey(e)` zuerst. Esc beendet das Vollbild weiter.
  - **Tools:**
    - Typesetter meldet „tippt immer“.
    - Matrix meldet „tippt in Entwerfen und Setzen – Text“. Der eigene F-Handler in Matrix ist gestrichen, er war nur eine Umgehung.
    - Face Tracking nutzt `typingKey(e)` für sein eigenes Vollbild.
  - **Tippcursor, Ursache im Code:**
    - Matrix speichert den Cursor nicht (`KEEP` ohne `caret`), er startete mit `caret: 0`.
    - Wer im Modus Setzen – Text neu lud und weitertippte, schrieb deshalb an die erste Stelle. Nur der Wechsel des Modus setzte den Cursor ans Ende.
    - Nachgestellt im Browser: Neu laden, X tippen, der Text begann mit „X…“.
  - **Behoben im Core:** `caretIn(c, text)` setzt einen nicht gesetzten Cursor ans Textende, nie an den Anfang. Matrix startet mit `caret: null` und liest den Cursor über `caretIn`. Typesetter nutzt dieselbe Regel beim Start.
  - **Geprüft im Browser:**
    - Matrix: Nach dem Neuladen landet F am Ende („…ELTF“), kein Vollbild. In Entwerfen kein Vollbild. Im Ticker öffnet F das Vollbild, Esc schließt es.
    - Typesetter: F geht ins Schreibfeld, kein Vollbild.
    - check-standard ok.

- **Logo 0.3.9, HMI Dominoes 0.2.3, HELIO Shuffle 0.2.4: SVG und PDF des Logos ohne Fläche dahinter** (user, 28.10.2026, über die Session HMI Case-Film Tool: „beim Export der Logos als Vector erscheint im Hintergrund immer eine rechteckige Fläche. könnte man diese beim Export ausblenden?“ – Entscheidung: „Immer weglassen“)
  - **Ursache:** `buildSVG` im Logo-Tool legte ein Rechteck in Grundfarbe unter das Logo.
    - **HMI:** immer (`brandGround(...).bg`).
    - **HELIO:** ohne Karte, in Seitenfarbe (`exportGround` → `pageBg`).
    - Das PDF entsteht aus diesem SVG und hatte dieselbe Fläche.
    - Die Raster-Ersatzlösung im SVG (nur ohne Starter) nahm das Bild der Bühne mit ihrem Grund.
  - **Behoben in den Brand Engines:**
    - `exportGround()` gibt in HMI Dominoes und HELIO Shuffle keine Fläche mehr. Die Datei enthält nur das Logo.
    - Die HELIO-Karte ist Teil des Logos und bleibt, mit ausgestanzten Buchstaben.
    - `compositeFrame` kennt `state.vector`: Dann wird ohne Grund gezeichnet. Die Raster-Ersatzlösung nutzt das.
    - Im Tool sind nur die Aufrufe angepasst. PNG und MP4 bleiben, wie sie sind.
  - **Neu:** `scripts/logo-vektor-messen.js` (`await LOGO_VEKTOR.run()` im Logo-Tool mit `?brand=hmi` oder `?brand=helio`).
    - Es geht alle Fälle durch: jede Farbe, mit und ohne Schriftzug, bei HELIO mit und ohne Fläche.
    - Es drückt den SVG-Knopf des Tools und macht daraus das PDF wie der PDF-Knopf.
    - Es meldet ein Rechteck oder Bild so groß wie die Seite im SVG und ein gefülltes Rechteck so groß wie die Seite im PDF-Inhalt.
  - **Geprüft:**
    - ok für HMI (4 Fälle) und HELIO (8 Fälle). `ausstanzen-messen.js` weiter ok: Maske und Karte sind da, Soft Mask im PDF.
    - Verstoß eingebaut (alte Grundfarbe in beiden Engines): gemeldet für SVG und PDF, bei HMI in allen 4 Fällen, bei HELIO in den 4 Fällen ohne Karte. Danach zurückgenommen.
    - Keine Fehler in der Konsole.

- **Core 0.7.5: keine Ersatzschrift beim Laden** (user, 28.10.2026, über die Session HMI Case-Film Tool: „bitte hier nicht mit Default-Schrift beim Laden“; hier: „Ja, freigegeben“)
  - **Ursache:** Inter in `core/ui.css` sowie DIN 2014 Rounded und TWK Everett in `brands/hmi|designcampus/brand.css` standen auf `font-display: swap`. Der Browser zeigte deshalb zuerst die Systemschrift.
  - **Core:**
    - Alle Schriften stehen jetzt auf `font-display: block`.
    - `core/ui.js` hat ein Schrift-Tor (`DT_FONTS`): Es lädt jede Schrift der Seite einmal. Bis dahin sind die Bühnen verborgen (`html.fonts-pending canvas`), danach zeichnet jedes Tool neu (`resize`). Das dauert höchstens 3 s.
    - Core ist 0.7.5, `brand.css` hat einen eigenen Cache-Schlüssel.
  - **Neue Prüfung (`check_fonts`):** Sie meldet `font-display` ungleich `block`, ein fehlendes Tor, eine Bühne, die vor dem Laden sichtbar ist, und ein Tool mit Marken-Schrift ohne Neuzeichnen. Fünf eingebaute Verstöße im Speicher, alle fünf erkannt; echt: ok.
  - **Geprüft im Browser:** In Matrix, QR, Fontscale, Texttafel, SVG-Animator, Gradient, Face Tracking, Motion Composer und Keyvisual sind alle Schriften geladen und das Tor ist offen. Keine Fehler.

- **Brand Libraries in der Form der UI-Library: THA 0.3.0, HMI 0.4.0, HELIO 0.5.0, DesignCampus 0.3.0, Playground 0.3.0** (user, 28.10.2026, über die Session HMI Case-Film Tool: „die Brand Libraries sind noch nicht angepasst“ – „Ja, so umbauen“; hier: „Ja, freigegeben“ für check-standard.py)
  - **Tokens in drei Schichten je Marke** (`var TOKENS = { base, semantic, component }` in `library.js`): Basiswerte (Farben, Schrift, Maße, Tempo), Semantisch (Grund, Tinte, Druck, Akzent je Hell/Dunkel), Component (Paarungen, Abstände). Daraus lesen `ground`, `colors`, `cmyk`, `path`, `glyphs`, `grid`, `logo`, `fontscale` u. a. Farbwerte stehen nur noch in den Basiswerten.
  - **`DT_BRAND_DATA` unverändert:** Vorher/nachher im Browser verglichen, alle fünf Marken gleich. Einzige Ausnahme: THA schreibt Weiß jetzt `#FFFFFF` statt `#ffffff`.
  - **Bausteine wie in der UI-Library:** Komponenten, Patterns, Templates mit `tokens` und `variants`, bei HMI und HELIO auf Hell und Dunkel (`grounds`). Farbe, Schrift, Maß, Takt und Paarung sind keine Bausteine mehr, sondern Tokens. `meaning`, `rules` und die eigenen Regel-Listen sind gestrichen, das Vokabular bleibt. Alte UI-Namen sind weg (Farbfelder, Kacheln, Baustein Format, Atom „Takt und Rollen“).
  - **Library-Seite (`?marke=…`):** Die Stufe Tokens zeigt die drei Schichten mit „zeigt auf“ und Wert. Jeder Baustein zeigt seine Tokens und seine Varianten als Matrix. Die Selbstprüfung meldet fehlende Schichten, Regel-Listen, Text, Stufe Tokens, fehlende Varianten und unbekannte Tokens. Alle fünf Marken: ohne Befund.
  - **Core:** Bilder einer Marke (`.chips.bilder.marke img`) werden auf dunklem Grund hell gezeigt, wie `.icon-tile img`. Vorher waren schwarze Icons auf Dunkel unsichtbar.
  - **Prüfung (`check_brand_library`):** Neun eingebaute Verstöße in einer Kopie von THA im Speicher, alle neun erkannt:
    - Farbwert außerhalb der Basiswerte;
    - Text im Baustein;
    - eigene Regel-Liste;
    - Stufe Tokens;
    - Baustein ohne Varianten;
    - fehlende Schicht;
    - alter Name;
    - unbekannter Token;
    - Template ohne „Besteht aus“.
    Die echte Library: ok.
  - **Angeglichen:** `brandLibraries` in 12 Engines, 3 brand.json und 20 tool.json auf die neuen Versionen. Die Daten sind gleich geblieben.
  - **Geprüft:** check-standard ok. 15 Tools der Marken laden ohne Fehler und zeichnen.

- **Sequencer 0.5.11: Blenden ohne Aufblitzen, Texttafel „Wort für Wort“ blendet jedes Wort ein** (user, 28.10.2026, über die Session HMI Case-Film Tool: „auch das Blenden war nicht weich, eher aufblitzend. auch bei Typo-Tafel“)
  - **Gemessen (Helligkeit Bild für Bild, 60 fps, über die Engine, jeder Wechsel als Blende):**
    - Die Blendkurve selbst ist stetig: `EASINGS.easeInOut` aus der Engine Motion, ein Schlag lang.
    - Am ersten Bild der Blende sprang das Bild trotzdem, in HELIO „Botschaft“ um bis 150 von 255 in einem Bild. Auch am Wechsel 6 (30) und 15 (51).
    - Texttafel „Wort für Wort“: Jedes Wort stand in einem Bild mit voller Deckkraft da (bis 31 je Bild).
    - Schrift: Die Brand-Schrift ist beim Laden der Seite schon da. Kein Bild mit Ersatzschrift gemessen.
    - Bilder: Bilder werden während der Blende nicht nachgeladen. Kein Bild fehlte.
  - **Ursache 1 – Blende (`renderFrame`):** Die abgehende Szene wurde über ihr Ende hinaus gezeichnet. Genau auf der Grenze nahm ihr Tool schon den nächsten Schritt: eine Gruppe das nächste Tool (Pfeile → Logo auf Weiß), ein Standbild das nächste Foto. Dieses neue Bild stand im ersten Bild der Blende voll da.
    - **Behoben:** Die abgehende Szene hält während Blenden, Wischen und Schieben ihr letztes Bild.
  - **Ursache 2 – Texttafel (`drawText`, Auftritt „Wort für Wort“):** Die Wörter wurden als Zeile gesetzt, je Schritt ein Wort mehr, ohne Übergang.
    - **Behoben:** Jedes Wort kommt an seiner Stelle in der Zeile mit der Beschleunigung des Films in `TAKT_ATTACK` (0,14 s). Schritte, Stand und Punkt-Puls bleiben gleich.
  - **Neu:** `scripts/blenden-messen.js` (`await BLENDEN.run('helio')` im Motion Composer). Es baut jede Vorlage einer Brand, setzt jeden Szenenwechsel als Blende und misst jede Texttafel „Wort für Wort“. Ein Sprung ist ein Schritt über 1 von 255, der mehr als dreimal so groß ist wie seine beiden Nachbarn.
  - **Geprüft:**
    - ok für alle Vorlagen von HELIO, HMI, THA und DesignCampus.
    - Verstoß 1 eingebaut (abgehende Szene läuft weiter): gemeldet, HELIO 150,7 und HMI 3,7 in einem Bild.
    - Verstoß 2 eingebaut (Wort sofort voll): gemeldet, je 16 Sprünge bei HELIO und HMI.
    - Beide Verstöße danach zurückgenommen. `scripts/aufbau-messen.js` weiter ok.

- **Sequencer 0.5.10: Striche einer SVG wachsen im Aufbau um sich selbst, nicht um ihren Buchstaben** (user, 28.10.2026, über die Session HMI Case-Film Tool: „HELIO Motion Composer: Aufbau und Wischen ruckeln wieder“; dazu direkt: „case-film: bei aufbau wird ein SVG gezeichnet, das ruckelt“)
  - **Gemessen (HELIO · Botschaft, 60 fps, Bild für Bild über die Engine):**
    - Keine gleichen Bilder in Folge während einer Bewegung, keine Sprünge in der Zeit.
    - Beim Abspielen im Tool: Bildabstand 15,7–17,6 ms, jedes Bild in höchstens 7,4 ms gezeichnet.
    - „Wischen“ läuft gleichmäßig: Die Kante kommt schnell und läuft aus, wie angelegt. Daran ist nichts geändert.
  - **Ursache:** `svgParts`/`boxOnBoard` in `engines/sequencer/engine.js` nehmen die Box eines Teils aus `getBBox`. Das zählt mit, was ein clipPath wegschneidet.
    - Bei „hello-striche“ (HELIO) und „hi-striche“ (HMI) ist jeder Strich ein ganzer Buchstabe mit Clip.
    - Jeder Strich wuchs deshalb um die Mitte seines Buchstabens und rutschte beim Erscheinen seitlich weg.
    - Gemessen: der erste Strich des H wanderte in 0,1 s von 228 nach 189 px.
    - Abweichung der Mitte: HELIO bis 112 px, HMI „hi-striche“ bis 218 px, HMI „pfeilfeld“ 16 px.
  - **Behoben in der Engine:** Sobald das Bild eines Teils geladen ist, nimmt der Sequencer die Box aus dessen sichtbaren Pixeln (`inkBox`, bis 1024 px Breite). Bis dahin gilt die Geometrie. Das gilt für Clip, Maske und Kontur gleichermaßen. Am Tool ist nichts geändert.
  - **Neu:** `scripts/aufbau-messen.js` (`await AUFBAU.run()` im Motion Composer). Es prüft jede Grafik der Film-Pakete in beiden Farben, 36 Dateien: Die Mitte der Box jedes Teils muss höchstens 2 px von der Mitte seiner sichtbaren Pixel liegen.
  - **Geprüft:**
    - ok, größte Abweichung 1,4 px. Der erste Strich steht beim Wachsen still (Mitte 190 px).
    - Verstoß eingebaut (`inkBox` aus): Die Prüfung meldet die sechs betroffenen Dateien (16–218 px). Danach zurückgenommen.
    - Keine Fehler in der Konsole.

- **Icon/Letter Pattern 0.2.21, Arrow Pattern 0.4.7, Face Pattern 0.2.20: Varianten mit Rasterstufe; Logo: Label „Anordnung“** (user, 28.10.2026, über die Session HMI Case-Film Tool: „Grid-Varianten: sollte hier nicht auch das Grid (Zeilen/Spalten) variieren?“ – gewählt: „Anordnung + Rasterstufe“; hier: „Ja, freigegeben“; „label: Anordnung statt Reihenfolge“)
  - **Core (`initGridFormat`):** Neu sind `density()`, `counts(stufe)` (Spalten und Zeilen im aktuellen Format), `setDensity(stufe)` und `vary()`. `vary()` liefert eine Stufe aus XS–L, bei Format Frei die aktuelle.
  - **Tools:** Eine Variante ist jetzt Anordnung (Startwert) und Rasterstufe. Die Bühne und die Vorschauen zeigen sie, ohne etwas zu setzen. Erst Übernehmen setzt beides, als ein Rückgängig-Schritt. Das Format bleibt fest.
  - **Geprüft im Browser:**
    - Icon Pattern (HMI): S 6×6 → XS 3×3, ein Cmd+Z → S 6×6, Seed 42.
    - Arrow Pattern: S 19×10 → XS 12×6, zurück.
    - Letter Pattern (HELIO): S → L 26×26, zurück.
    - Face Pattern: Seed übernommen und zurück; die gezogene Stufe war zufällig wieder S.
    - Keine Fehler in der Konsole. check-standard ok.
  - **Logo:** Das Label des Reglers heißt „Anordnung“ statt „Reihenfolge“.

- **Logo 0.3.8: Reihenfolge als Regler mit Punkten** (user, 28.10.2026, über die Session HMI Case-Film Tool: „die Reihenfolge nur als Slider mit Punkten“)
  - Die 24 Kacheln (`#permTiles`, `initTiles`) sind aus dem Logo entfernt. Der vorhandene `#arrangementSeed` ist jetzt sichtbar, als Regler in der Variante Stufen (`.stufen`): 24 Stufen, jede als Punkt.
  - Die Variante gab es schon im Baustein Regler. Library und Core sind dafür nicht geändert.
  - Der Wert rechts heißt weiter „1 von 24“. Der Würfel öffnet weiter den Varianten-Bogen.
  - **Geprüft im Browser (HELIO):** Kein `#permTiles` im Markup, 24 Punkte auf der Spur. Regler auf 5 ergibt „6 von 24“. check-standard ok.

- **Core 0.7.4, Library 0.11.1: Name und Wert stehen wieder links und rechts, eine Prüfung findet Bauteile außerhalb ihres Kontexts** (user, 28.10.2026, über die Session HMI Case-Film Tool: „HELIO Logo: das ist nicht aus den Patterns!!!!!!!!!!!!!!“)
  - **Ursache:** Seit 0.11.0 („Section und Form field getrennt“) stehen manche Labels in einer `.section` statt in einem `.field-row`. Ihr Layout hing aber an `.field-row .lbl`. Name und Wert klebten deshalb aneinander, z. B. „Reihenfolge1 von 24“.
  - **Betroffen (im Browser gemessen):** 13 Labels in 9 Tools – Logo (HMI und HELIO), Icon Pattern, Arrows, Face Pattern, Typesetter, Image Overlay, Gradient Blend, Face Tracking, Keyvisual (verborgen) – und das Library-Beispiel Seed field.
  - **Behoben an der Quelle (`core/ui.css`):** `.lbl` bringt sein Layout selbst mit, in jedem Eltern-Element. Danach zeigen alle 13 Labels Name links und Wert rechts. Dazu zwei Teile der Section, die an fremden Regeln hingen: `h2.sub` (vorher nur in `.insp-body`) und `h2.no-sec` (vorher eigene Regeln unter `.dock`). Beide sehen unverändert aus.
  - **Kacheln der 24 Reihenfolgen:** Sie haben ihr Layout nicht verloren, weil ihre Regeln an keinem Eltern-Element hängen.
  - **Neue Prüfung (`check-standard.py`: `context_rules`, `out_of_context`):** Sie meldet eine Klasse, die `ui.css` nur innerhalb einer Klasse ihres eigenen Patterns gestaltet, wenn sie in einem Tool oder einem Library-Beispiel außerhalb davon steht. Regeln fremder Patterns (`.seed-head .lbl`) zählen dabei nicht als Kontext.
  - **Verstoß eingebaut:** `.field-row .lbl` zurück in eine Kopie von `ui.css` im Speicher. Die Prüfung meldet dann 10 Stellen: 9 Tools und das Beispiel. Mit dem echten `ui.css` meldet sie nichts.
  - **Grenze:** 91 Kontext-Selektoren statt 94 (`scripts/ui-grenze.json`). check-standard ok.
  - **Nicht erfasst:** Markup, das erst JavaScript baut, prüft die neue Prüfung nicht.

- **Farbfelder der THA-Tools geprüft: Name, Farbfeld und Bühne nach einer Logik** (user, 28.10.2026, über die Session HMI Case-Film Tool: „die Farblogik ist verdreht: Hinter- und Vordergrundfarbe“):
  - **Befund:** Im Code ist nichts vertauscht. Live Camera liest wie das Keyvisual aus `DT_BRAND_DATA.tha.path.colours`. Die Brand Engine THA Ribbon gibt dabei die Figur als `band` und den Grund als `bg` weiter.
  - **Live Camera:**
    - Das Farbfeld ist `pairSwatch(c.band, c.bg)`: Der Punkt zeigt die Figur, die Fläche den Grund.
    - Das Band trägt die Figur, die Schrift im Band trägt den Grund.
    - Das Foto ersetzt den Grund. Ohne Kamera erscheint er wieder.
  - **Beispiel „Weiß auf Rot“:**
    - Farbfeld: weißer Punkt auf Rot.
    - Bühne: weißes Band, rote Schrift, wie im Keyvisual.
    - Weil das Foto den Grund ersetzt, sieht man Rot nur in der Schrift. So liest sich das Bild leicht als „Rot auf Weiß“.
    - Der Titel des zweiten Felds ist im Code „Weiß auf Rot“. Im Code trägt nur das erste Feld den Titel „Rot auf Weiß“. Der Tooltip auf dem Screenshot kann also nur von diesem Feld stammen.
  - **Neu:** `scripts/check-farbfelder.py`. Für jedes THA-Tool mit Farbfeldern gleicht es ab:
    - die Namen der Paarungen in der Library („A auf B“: A ist die Figur, B der Grund);
    - die Weitergabe in THA Ribbon;
    - die Malaufrufe der Engine Path;
    - je Tool `pairSwatch(Figur, Grund)`, den Namen als Titel und auf der eigenen Bühne das Band in der Farbe der Figur, die Schrift in der Farbe des Grunds.
  - **Geprüft:**
    - Die Prüfung meldet ok für die Library, THA Ribbon, Path, Case Film, Typesetter, Live Camera, Keyvisual Motion und Keyvisual.
    - `--selbsttest` baut sechs Vertauschungen in eine Kopie im Speicher ein. Alle sechs werden gefunden: Name in der Library, THA Ribbon, Path, Farbfeld, Bandfarbe und Titel in Live Camera.
  - **Nicht eingebaut:** `check-standard.py` ruft die neue Prüfung noch nicht auf. In dieser Datei arbeitet eine andere Session.

- **Logo 0.3.7, HELIO Shuffle 0.2.3: das Logo ist im Export ausgestanzt** (user, 28.10.2026: „das HELIO Logo soll beim Export ausgestanzt sein. das funktioniert noch nicht“ – „Alles außer der Karte“):
  - **Ursache:** Das SVG hatte die Maske (`cardAndLettersSVG`), aber `buildSVG` im Tool legte darunter immer ein Rechteck in Seitenfarbe. Die Löcher zeigten so die Seitenfarbe. Das PDF entsteht aus diesem SVG und hatte denselben Fehler. PNG, PNG-Sequenz und Video stanzten gar nicht: `compositeFrame` malte die Buchstaben in Seitenfarbe auf die Karte. Gestanzt wurde außerdem nur mit Schriftzug.
  - **Jetzt (Brand Engine `brands/helio/engines/shuffle.js`):** Ist die Fläche an, stanzt der Export immer, mit oder ohne Schriftzug (`knockoutOn`). PNG, PNG-Sequenz, SVG und PDF haben keine Seitenfarbe mehr (`exportGround`); Buchstaben und Rand um die Karte sind transparent, im PDF Papier. `compositeFrame` schneidet die Buchstaben bei `state.knockout` aus der Karte. Bühne und MP4 behalten die Seitenfarbe, ein MP4 kann keine Transparenz.
  - **Neu:** `scripts/ausstanzen-messen.js` misst das Ausstanzen in beiden Themes, mit und ohne Schriftzug: Buchstaben im PNG mit Alpha 0, Karte deckend, Rand leer; SVG mit Maske und ohne Seitenrechteck; PDF mit Soft Mask.
  - **Geprüft:** Das Skript meldet ok (je 21 568 bis 41 085 Buchstabenpixel mit Alpha 0). Verstoßtest: Mit der alten Regel (nur mit Schriftzug) meldet es in allen Fällen Fehler, danach zurückgenommen. MP4 zeigt weiter die Seitenfarbe. check-standard meldet für logo und helio ok.

- **Logo 0.3.6: MP4 und PNG-Sequenz laufen gleichmäßig und loopen** (user, 28.10.2026: „animation ruckelt“ – „und springt seltsam. kein loop“):
  - **Ursache:** Der Export nahm den Live-Lauf auf. Jedes ruhige Bild hielt dabei dieselbe Anordnung, die der nächste Wechsel überschrieb. So zeigten alle Standbilder die letzte Anordnung, und an jedem Wechsel sprang das Bild. Die Bilder kamen außerdem im freien Takt des Browsers.
  - **Jetzt:** Der Film wird Bild für Bild aus den Regeln des Tools gelegt (Takt, Zufall, Überblenden, Dauer). Die Länge wird in ganze Takte geteilt, und der letzte Wechsel führt zurück zur ersten Anordnung. Das Ende geht nahtlos in den Anfang über. Die Aufnahme in Echtzeit entfällt, der Export startet sofort.
  - **Vorschau:** Ein Wechsel ändert die Anordnung nicht mehr an Ort und Stelle. Ein neuer Wechsel beginnt erst, wenn der laufende gelandet ist.
  - **Geprüft:** HELIO-Export 6 s, 30 fps, Bild für Bild mit ffmpeg: die Naht 179→0 unterscheidet sich um 0,02 (vorher 11,4), kein Sprung zwischen zwei Bildern (vorher 14). HMI ebenso nahtlos. check-standard meldet für logo ok.

- **Live Camera 0.3.0: das Band läuft um die Silhouette** (user, 28.10.2026: „Keyvisual Webcam … ich würde gerne so mit dem Band interagieren“ – „beides optional ermöglichen, auch für hand“ – „das sieht noch nicht wie die beispiele aus“, mit den Plakaten „Was studierst du so?“):
  - **Wie auf den Plakaten:** Das THA-Band läuft mit Luft um Kopf und Schultern, von einer Seite über den Kopf zur anderen. Es nutzt wenige lange Geraden in festen Richtungen mit den Eckregeln (`PATH_ENGINE.around`). Wo die Figur über den Rand hinausreicht, läuft das Band aus dem Bild; sonst endet es frei im Bild.
  - **Silhouette:** Sie kommt bei Tracking Kopf aus dem Segmentierungsmodell (`core/ml/models/selfie_segmentation`), bei Tracking Hand aus den Handpunkten. Die Bahn wird um den Abstand verbreitert und als Strahlen vom Schwerpunkt der Figur gemessen.
  - **Lage:** Neue Segmented control „Lage“ mit Dahinter und Davor. Bei Dahinter wird die Person über die Maske wieder über das Band gelegt, sichtbar dort, wo eine Hand oder Schulter ins Band reicht. Die PNG-Sequenz schneidet die Person dann ebenfalls aus dem Band.
  - **Abstand:** Er misst die Luft zwischen der Silhouette und dem Rand des Bands, Vorgabe 1 U.
  - **Geglättet:** Maske, Handpunkte, Schwerpunkt, Strahlen und Ecken werden über die Zeit geglättet.
  - **Entfallen:** Folgen und Ausweichen mit ihrer Logik, Länge und der Knopf „Neues Band“.
  - **Ohne Kamera:** Eine runde Figur unter dem Zeiger steht für die Person.
  - **Neu:** `core/ml/silhouette.js` (Silhouette 0.1.0). Das Modul lädt das Segmentierungsmodell als Graph Model über das tf in ml5 und zeichnet Maske, Ausschnitt und Strahlen. Das Tool zeichnet nicht selbst. Engine Path wird jetzt mit `?v=0.2.6` geladen.
  - **Geprüft:** im eingebauten Browser mit einem Foto als Kamerastrom (eine Person mit Luft über dem Kopf; zwei Personen; Hand) und mit dem Zeiger ohne Kamera. check-standard meldet für kamera ok.

- **Core 0.7.3: Inspector am Handy als Sheet; Seitenkopf über Tokens** (user, 28.10.2026: „Sheet von unten“ – „Ja, weitermachen“):
  - **Handy (bis 560 px):** Der Inspector ist ein Sheet von unten (`--inspector-sheet-height` 55dvh). Die Bühne behält die volle Breite (`stageRoom`), eine Meldung steht über dem Sheet. Die Breite des Inspectors liest `stageRoom` jetzt aus `--inspector-width` statt aus der festen Zahl 340.
  - **Seitenkopf und Navigation:** Sie setzen nur noch Tokens (`--segmented-width`, `--text-input-width`, `--select-width`, `--legend-margin`, `--text-input-margin`). Die Komponenten lesen sie, statt von außen gestylt zu werden.
  - **Prüfen:** Die Grenze der Kontext-Selektoren sinkt auf 94. Dashboard, Custom Type und Library sind im Vergleich unverändert.
- **Core 0.7.0, Library 0.11.0: Section und Form field getrennt** (user, 28.10.2026: „Ja, trennen“):
  - **Klassen:** Ein Element mit Überschrift oder eigenen Zeilen heißt jetzt `.section`. Das sind 178 Stellen in 20 Tools, der Library und dem von `initFormat` und Case Film erzeugten Markup. Ein einzelnes Feld bleibt `.field-row`.
  - **Abstände nur über Tokens:** `--section-row-gap` (22 px) zwischen den Zeilen, `--section-head-gap` (12 px) zwischen Überschrift und erster Zeile, `--form-field-gap` (8 px) im Feld. Die `:has()`-Regeln und die feste −12 px sind entfernt.
  - **Sichtbare Folge:** Überschrift → erste Zeile ist überall 12 px (vorher 10 oder 12). In Abschnitten ohne verschachtelte Felder stehen Zeilen jetzt 22 px auseinander statt 8 px, wie in allen anderen.
  - **Prüfen:** `closest('.field-row')` in Tools sucht jetzt `.field-row, .section`. check-standard kennt `.section`; die Grenze der Kontext-Selektoren sinkt auf 103.
  - **Geprüft:** Kamera und Face Tracking im Vergleich zum Stand davor, check-standard überall ok, Selbstprüfung der Library mit den sieben bekannten Befunden.
- **Core 0.6.6: Prüfregel für ui.css, feste Werte auf Skalen, Darstellung der Library** (user, 28.10.2026: „Ja, Patterns“ – „bitte zum schluss nochmal darstellungscheck, abstände, umbrüche usw“ – „warum werden hier noch feste farben definiert?“):
  - **check-standard:** Neue Regel für `ui.css`. Feste Werte und Kontext-Selektoren werden gezählt und dürfen nur sinken; die Grenze steht in `scripts/ui-grenze.json` (jetzt 148 und 109, vorher 447 und 138). Verstoßtest: Ein zusätzlicher fester Abstand wurde gemeldet und dann zurückgenommen.
  - **Skalen:** 85 feste Pixelwerte, die genau auf einer Skala liegen, sind jetzt `--space-*`, `--size-*` und `--radius-*`. Berechnete Stile auf Library, Case Film und Dashboard sind unverändert.
  - **Library, Tokens:** Die Tabelle zeigt neu die Spalte „zeigt auf“ (z. B. `--icon-button-bg-hover` → `--color-fill-1`). Vorher sah man nur den aufgelösten Endwert, das wirkte wie eine feste Farbe. „gleich in beiden Modi“ heißt jetzt kurz „wie Hell“. Namen und Werte brechen nicht mehr um; breite Tabellen scrollen in sich, statt die Seite zu verbreitern.
  - **Library, States:** Hover, Focus, Pressed und Selected sitzen nur noch am ersten Element eines Beispiels, sodass sich keine Ringe überlappen. Zellen sind so breit wie ihr Inhalt, nichts bricht um; der Slider zeigt Standard und Stufen getrennt.
  - **Library, Tabs:** Das Beispiel nutzt jetzt `.tabs > .tab`.
- **Core 0.6.3, Library 0.10.2: alte Token-Namen gelöscht, Palette als Variante von Swatches, Timeline-Karten mit Tokens** (user, 28.10.2026: „Ja, löschen“ – „Variante von Swatches“ – „Eine Zeile Schichten“):
  - **tokens.css:** Der Übergangsblock mit den alten Namen ist gelöscht; keine Seite nutzt sie mehr.
  - **Swatches:** Die bearbeitbare Palette (`.chips > .chip`, × entfernen, ziehen, hinzufügen) ist die Variante „Bearbeitbar“. Sie nutzt dieselben Tokens (`--swatch-size`, `--swatch-remove`, `--swatch-edit-edge`, `--swatch-drag-scale`). Der Library-Eintrag „Color list“ ist in Swatches aufgegangen; Gradient, Gradient Blend und Case Film führen `farbfelder` statt `palette`.
  - **Timeline:** Die Bildkarten (`.chips.bilder > .chip.bild`) gehören zur Timeline, mit `--timeline-card-*`.
  - **Button:** `.save` (Primary) und `.recording` (Busy) gehören zum Button, nicht mehr zu Save menu. Daraus folgend steht in Modal und Editor „Besteht aus“ jetzt Button statt Save menu; Save menu wird über `initSaveFoot(` erkannt.
  - **Library-Seite:** Die Einleitung ist eine Zeile (Tokens → Komponenten → Patterns → Templates). `blocks.js` hat jetzt die Version 0.10.3 im Aufruf, damit kein Browser eine alte Fassung aus dem Cache nimmt.
  - **Geprüft:** berechnete Stile auf Case Film, Gradient, Gradient Blend und Dashboard gegen den Stand davor, ohne sichtbare Änderung. check-standard meldet überall ok; die Selbstprüfung meldet die sieben bekannten Befunde.
- **Core 0.6.2, Library 0.10.1: die vier offenen Befunde gelöst; Playground und DesignCampus ohne Blöcke** (user, 28.10.2026: „So wie vorgeschlagen“ – „Alle Blöcke löschen“):
  - **Kamera:** Die Probe „knopf-und-auswahl“ ist aufgelöst: „Kamera starten“ ist ein Button, Kopf/Hand ein eigenes Feld „Tracking“ (Segmented control).
  - **Face Tracking:** Der Status steht als Description list im Abschnitt Quelle statt im Kopf. Die Startkarte ist ein neues Core-Pattern „Start card“ (`.start-card`, Tokens `--start-card-*`) auf der Fläche des Modal, mit Library-Eintrag. Beide Proben sind weg.
  - **Logo:** Die HELIO-Anordnungen nutzen `initTiles` mit der neuen Einzelwahl (`{ single: true }`, Radio, `role=radiogroup`) statt eigenem Code.
  - **Case Film:** Ein Schlag nach dem Ende der Musik trägt die Marke „nach“ der Timeline (`--timeline-beat-after`) statt einer Deckkraft im Code.
  - **Playground und DesignCampus:** keine Blöcke mehr, nur Daten, Regeln und Vokabular (Library je 0.2.0). check-standard akzeptiert eine Marke ohne Blöcke, wenn sie das mit leerer Liste erklärt und Regeln und Vokabular hat.
  - **check-standard:** meldet für alle Seiten ok.
- **Library 0.10.0: Tokens, Komponenten, Patterns, Templates** (user, 28.10.2026: „Ja, Library“): Die Seite `patterns/` zeigt die Core-UI so, wie Design Systems sie zeigen:
  - **Standardnamen:** z. B. Button statt Handlung, Toggle statt Schalter, Panel statt Dock.
  - **Je Komponente:** ihre Component Tokens hell und dunkel, alle Varianten in jedem State (Default, Hover, Focus, Pressed, Selected, Disabled, Busy; aus den Regeln des Core erzeugt), Code, Klassen, Besteht aus, Teil von und Verwendet in.
  - **Entfallen:** Regeln als Prosa, „Bedeutung“ und die Maße. Die Marken-Libraries (`?marke=`) bleiben unverändert.
  - **Spezifikation:** in `patterns/blocks.js` als `DT_SPEC` (Token-Präfix, Ziel, States, Varianten).
  - **Tools:** alle 20 Tools mit Tabs auf Library 0.10.0 abgeglichen.
  - **Geprüft:** Die Selbstprüfung der Library meldet dieselben 7 Befunde wie vorher; check-standard unverändert.
- **Core 0.6.1: Komponenten mit Component Tokens** (user, 28.10.2026: „Ja, Komponenten“ – „Ja, umbauen“): In `core/ui.css` hat jede Komponente der Inventur einen eigenen Block mit Klassen, Tokens und States. Er liest nur seine eigenen `--…`-Tokens (`core/tokens.css`, Schicht 3).
  - **Komponenten:** Icon button, Toggle, Segmented control, Tabs, Select, Text input, Slider, Number input, Swatches, Tile group, Chip group, Tag, Description list, Data table, Toast, Color picker, Status indicator.
  - **Aufgelöst:** Die übereinanderliegenden Korrekturschichten. Kontext-Selektoren sind durch Tokens ersetzt, die ein Container setzt, z. B. `.beh-row { --icon-button-margin }` oder `.dock.quer { --chip-height }`.
  - **Tabs** haben eigene Klassen (`.tabs > .tab` statt `.img-mode-row.insp-tabs > .mode-btn`) in 17 Tools, `ui.js`, Library und check-standard. Zuvor zerfielen sie außerhalb des Inspektors.
  - **Swatches** erben keine Stile von Segmented control mehr; `.mode-btn` tragen sie nur noch für das gemeinsame Klickverhalten.
  - **Geprüft:** berechnete Stile auf Matrix, Kamera, Gradient, Custom Type, Keyvisual, Fontscale, Case Film, Dashboard und Library gegen den Stand davor. Sichtbar unverändert. Abweichungen gibt es nur in nicht sichtbaren Werten (Radius „pill“ statt 50 %, Schriftwerte an Knöpfen ohne Text, 0,5 px im Inspektor).
- **Core 0.6.0: Tokens in drei Schichten** (user, 28.10.2026: „schaue dir an, wie eine pattern lib gebaut wird und wende das an“ – „Ja, einbauen“): `core/tokens.css` hat jetzt drei Schichten:
  - **Basiswerte:** `--color-*`, `--space-*`, `--size-*`, `--radius-*`, `--font-*`, `--duration-*`.
  - **Semantisch:** `--color-text`, `--color-surface-*`, `--color-fill-*`, `--space-element/row/group`, `--size-control`, `--radius-control`, `--type-label/section/title/headline`, `--elevation-*`, `--motion-*`. Hell und Dunkel werden nur hier entschieden.
  - **Component:** `--button-*`, `--status-*`, `--panel-*`, `--modal-*` und weitere.

  1089 Stellen in Core, Tools, Marken und Library nutzen die neuen Namen. Die alten Namen zeigen in einem Übergangsblock auf die neuen, bis keine Stelle sie mehr braucht. Die Aliase `--muted`, `--accent`, `--red` und `--ring` entfallen. Panel und Modal haben eine Fläche (`--blur-surface`; „ja“). Die festen Schriftstufen gehen auf die Skala (10, 11 und 13 px werden Label, 14 Section, 17, 21 und 30 Headline; „ja“). Button und Panel sind in `ui.css` je ein Block, der nur seine Component Tokens liest; ein Container setzt Tokens, keine Klassen. Geprüft: berechnete Stile auf Matrix, Kamera, Gradient, HMI-Dashboard, Case Film, Projekt-Dashboard und Library gegen den alten Stand verglichen. Unterschiede gibt es nur bei den gewollten Schriftstufen und 8 px neben „Speichern“ im Kopf von Case Film.
- **Logo: Probe „kachel-folge“ gestrichen** (user, 28.10.2026: „ich erkenne nur einen unterschied bei den icons und beim radios. das hat aber nichts mit kachel folge zu tun“): Die Reihenfolgen von HELIO sind jetzt normale Kacheln (`.icon-tiles > .icon-tile`). Die eigenen 2 px Abstand und die Klassen `perm-tiles`/`perm-tile` sind entfernt.
- **check-standard: nur Bausteine der Library in Tools** (user, 28.10.2026: „sorge dafür dass in apps ausschließlich bauteile der pattern lib verwendet werden, es sei denn ich will das so“ – „stelle das einfach anhand der struktur sicher.“): neue Regeln. (1) Ein Dialog hat in Core eine Fläche: `.settings` und `.img-modal` müssen in Grund, Rand, Unschärfe, Schatten und Fußabstand gleich sein. (2) Ein ausgeliefertes Tool braucht für jede Probe die Freigabe in `tool.json own.freigabe` (die Worte des Users). (3) Stil im Code: Ort, Größe und Clip dürfen der Bühne folgen, und Farben aus dem Inhalt (Farbfelder über `pairSwatch`/`gradientSwatch`, Punkte auf der Bühne) sind Inhalt. Ein Wert, der als Literal im Code steht, ist Gestaltung und wird gemeldet. (4) Lokale Styles für Core-Bausteine sind nur in einem `<style data-probe>` einer erklärten Probe erlaubt. Angepasst: In Matrix steht der Schatten unter dem Inspektor jetzt als eigene Probe „schatten“ mit Freigabe („Nur in Matrix als Probe, nicht in der Library“). Das Kamerabild von Face Tracking hat eine Bühnenklasse `cam-feed` statt `cssText`. Bei Case Film ist die leere Probe „charakter“ gestrichen. Verstoßtest: Eine Schriftfarbe als Literal in QR wurde gemeldet und dann zurückgenommen.
- **Gemerkt: Renderqualität für langsame Rechner** (user, 27.10.2026: „sollte man die qualität in die preferences nehmen? für langame rechner?“ – „merken“): als offene Frage in `docs/Offene-Entscheidungen.md` (Teil A), mit der Empfehlung Automatik statt Einstellung. Nichts eingebaut.
- **Motion Composer 0.5.15: Bühne scharf; Vorschaubilder DesignCampus neu** (user, 27.10.2026: „vorschauen und motion auch anpassen“ – „die darstellung in motion und composer ist auch noch nicht scharf“): Der Composer zeichnete seine Bühne fest in zwei Dritteln des Films (1280 × 720) und streckte sie auf die Anzeige – auf Retina rund 1,5- bis 2-fach hochgezogen, also weich, bei allen Brands. Jetzt liegt die Bühne wie bisher (zwei Drittel des Films, höchstens ihr Platz) und wird in den Pixeln des Bildschirms gezeichnet; bei jeder Änderung des Platzes (Fenster, Dock, Vollbild) neu. Die Marke um den gewählten Teil bleibt so dick wie vorher. Gemessen: Vollbild 2560 × 1440 statt 1280 × 720 Pixel. Beim Abspielen wieder zwei Drittel (user: „diese animationen ruckeln nun wieder“, mit der Schutzzone des HMI-Logos): ein Bild kostet so viel wie es Pixel hat – bei 2457 px brauchten einige Szenen 16–31 ms, bei 1280 px alle bis auf eine unter 16 ms. Jetzt zeichnet die Bühne beim Abspielen in 1280 × 720 und angehalten, beim Scrubben und im Standbild in den Pixeln des Bildschirms; das Vorwärmen der Tools geschieht in der Größe des Abspielens. Nachgemessen ab 38 s und 70 s: keine Lücke zwischen zwei Bildern über 20 ms. Keyvisual Motion zeichnete schon in Gerätepixeln; mit Lattice 0.1.3 ist es scharf (nach dem Neuladen der Seite). Vorschaubilder mit der neuen Engine neu gezeichnet, in ihren alten Einstellungen: Lattice Keyvisual `preview.jpg`/`og.jpg` und `brands/designcampus/og.jpg` (9 × 144, Weiß auf Blau – das Bild mit dem Moiré), Keyvisual Motion `preview.jpg`/`og.jpg` (9 × 19, Blau auf Weiß), Motion Composer `preview-designcampus.jpg` (der Film bei 2 s). Die Kacheln der Dashboards zeichnet die Engine live, sie sind mit 0.1.3 schon scharf.
- **Lattice 0.1.3: Renderqualität** (user, 27.10.2026, mit Screenshot der „6“ aus waagrechten Linien: „Renderqualität DesignCampus ist nicht gut.“ – „vielleicht muss man vor retina optimieren?“ – „oder @2x“): Die Bühne rechnete schon in Gerätepixeln (Retina), das war nicht die Ursache. Flache Rauten sind wenige Pixel hoch, ihre Kanten steigen um ein Hundertstel Pixel je Pixel; die Kantenglättung des Browsers misst eine Pixelzeile nur in 4 Stufen, und die Linien zerfielen in Striche fester Grautöne – Moiré, die Kante der Figur gezackt. Die Engine zeichnet ihre Ebene jetzt 16-mal feiner quer zur dünnen Seite der Zellen (in der Höhe bei flachen, in der Breite bei hohen Rauten) und halbiert sie viermal zurück – ein genauer Mittelwert, keine Transparenz, nur Blau, Weiß und ihre Mischtöne. In Streifen gerechnet, so braucht ein 8K-Export nicht mehr Speicher als die Bühne. Gilt für Bühne, PNG und Video, in Lattice Keyvisual, Keyvisual Motion und im Motion Composer. Gemessen mit 4 × 200 Rauten: Stufen in einer Linie vorher 4, nachher 55–65; Bühne 100 % (1149 × 646) und Vollbild (1802 × 1014) wie Export 4K, 4K mit Beschnitt, 8K geprüft, keine Nähte an den Streifen; 1080p in 8 ms je Bild.
- **Matrix: Regler mit Bildern an den Enden (Probe)** (user, 26.10.2026: „kann man nicht 2 icons als beschriftung für slider nehmen?“; „auch hier? ich will vielfalt/präzision“): Zelle (schmal ↔ breit), Luft (dicht ↔ viel), Rand, Versatz-Weite (gerade ↔ Wabe), Stärke der Modulation, und im Dock Größe, Rundung, Linienstärke als Regler mit einem Bild am Minimum und am Maximum – fein einstellbar statt fünf fester Kacheln. Kacheln bleiben, wo man zwischen Arten wählt (Punktform, Versatz in Zeilen oder Spalten). Nur in Matrix, die Library unberührt. „Leere Punkte“ mit einem eigenen Symbol (zwei volle, zwei leere Punkte) statt circle-dash, das im Gradient „Griffe“ heißt (user: „was macht dieses symbol hier?“). Der Punkt: Form als vier Kacheln und Kontur als Schalter, wie „Fläche“ im Logo, statt acht Kacheln (user: „hier nicht einfach zwei optionen gefüllt/outline? die doppelten formen sind redundant“; „bitte mal daran orientieren wie das andere tools lösen“; „notfalls einfach toggle outline“). Weite des Versatzes bei 0 als „0 %“ statt „gerade“ neben dem Bild der Wabe (user: „das soll gerade sein????“). UX-Durchgang (user: „ich dachte du hast UX check gemacht? scheinbar nicht“): Versatz zuerst als Regler, „Versatz in“ Zeilen oder Spalten erst, wenn etwas versetzt ist (vorher war „Zeilen versetzt“ auch bei 0 % markiert); die Gruppe unter Werte heißt „Datei“ statt „Alphabet“ (Alphabet sind die Favoriten); Zelle als Verhältnis „2 : 1“ statt „200 %“. UX-Durchgang, gebaut (user: „mach den scheiss UX check“ – „Ja, bau alle 12 Punkte so im Labor.“): „Punkt für alle übernehmen / zurücksetzen“ ersetzt durch „Gilt für: Alle Varianten | Nur diese“ (user: „punkt für alle was“, „was bedeutet "zurück zum alphabet"“); Variante hat die Gruppen Zellen (Alle aus, Umkehren) und Punkt, Löschen per Entf (user: „Leeren Umkehren Löschen > WAS?“); Farbe zuletzt (user: „warum steht variante unter farbe?“); Kontur verschwindet bei der Linie, Linienstärke zeigt die gewählte Form; Leere Zellen als Schalter im Inspektor unter Raster statt Chip unten (user: „muss das echt da unten hin??“); das Plus für eine Variante als schmale Leiste; der erste Klick wählt, erst der zweite zeichnet; Cmd+Z nimmt auch Zeichnen, neue und gelöschte Varianten, Favorit zurück (Extra-Zustand des Core); Neigung mit Bildern; „Alphabet öffnen“ bleibt im Inspektor wie „Projekt öffnen“ im Case Film. Nicht gebaut: Reiter weg – die Library verlangt je Abschnitt einen Reiter. Nach dem Design-Wächter: nur Entf löscht (nicht die Rücktaste); Werte und Hinweise mit den Wörtern des Docks (Leere Zellen, Film, Zelle). Bilder am Regler nie wie der Griff (user: „gut gemeint > aber siehe gestaltgesetze“ – die weiße Scheibe bei Rundung und Größe las sich als zweiter Griff): Größe als Punkt in seiner Zelle, Rundung als Ecke, spitz oder rund. Der gemeinsame Punkt gehört zur Schrift (user: „Der gemeinsame Punkt gehört zur Schrift wie das Raster: in den Inspektor. Die Variante behält nur „eigener Punkt“.“): Inspektor-Abschnitt „Punkt“ mit Reiter, eigener Würfel; im Dock unter Variante nur der Schalter „Eigener Punkt“, seine Einstellungen darunter, solange er an ist (user: „bitte mit toggle nicht so“, „simplicity > eine ist besser als 2“); ausgeschaltet ruht der eigene Punkt in der Variante und kommt beim Anschalten zurück; die Gruppe „Zellen“ ohne Überschrift direkt unter Variante (Library: keine Gruppe direkt unter der Abschnittsüberschrift). Farbe wieder vor der Variante, in der Reihenfolge der Library Format → Inhalt → Farbe → Form (user: „farbe so weit unten schwebt mir nicht sinnvoll“). Fehler behoben: die Einstellungen des Punkts ohne Abstände (Hülle ohne Feldzeile); bei schmalen Flächen lief der Stern in die nächste Spalte – die Zeile über der Fläche verbreitert jetzt ihre Spalte. Der Cursor in Schreiben im Blau der Bühnen-Marken statt in der Tinte der Schrift (user: „wäre der cursor nicht in blau?“); Engine Matrix 0.3.2 nimmt die Farbe, die das Tool gibt. Testalphabet (user, über die Session HMI Case-Film Tool: „bitte erstelle ein Testalphabet“): tools/matrix/testalphabet.json (zuerst unter docs/labor) – 53 Zeichen im Raster 5 × 7 (A–Z, 0–9, Ä Ö Ü ẞ, . , ! ? - : ' ( ) & + / @), A E O R mit einer zweiten Variante zum Durchschalten in Setzen; laden mit Inspektor › Werte › Projekt öffnen. Kleinbuchstaben gibt es nicht – Matrix setzt in Versalien. ß wird jetzt als ẞ gesetzt statt als SS. Per Default geladen, nur im Labor (user, über die Session: „bitte per Default laden“; hier: „Nur im Labor“ – weil es der Vorgabe „ich möchte nicht mit buchstaben vorlagen arbeiten, sie sollen selbst eine form finden“ widerspricht): dann „bitte vorerst auch im tool“: ein frischer Start ohne Projekt im Browser lädt es, vorerst unabhängig von der Phase; Zurücksetzen führt dorthin zurück; ein Projekt im Browser gewinnt. Fehler behoben: das Zeichen „:“ brach die Kennung der Varianten (Zeichen:Nummer) und legte ein leeres Zeichen an – die Kennung trennt jetzt mit einem Tab. Punkt nur pro Variante (user: „warum doppelt“ – „nein, nur pro variante. wenn ich alle ändere > mehrfachauswahl“): der Punkt steht nur noch im Dock unter Variante und gilt für die gewählten Varianten; alle zugleich über die Mehrfachauswahl (Shift, Cmd+A); der Abschnitt Punkt im Inspektor, das Erben, Blau und ↺ fallen weg; jede Variante hält ihren ganzen Punkt, ein neues Zeichen beginnt mit dem zuletzt gesetzten. Etikett und Stern beide auf der oberen Kante der Fläche (user: „abstände nicht ausgewogen“). **Film in Szenen** (user: „film. sound von case film laden. deutlich mehr action, wechsel schwarz/weiss, verschieben. grosse einzelne lettern, wörter...“; „ganzes alphabet eher am ende“): Engine Matrix 0.4.0, Auftritt „Szenen“ als neuer Standard – Lettern (je Schlag eine, bildfüllend, pulsierend), Umkehr (Schwarz/Weiß im Schlag), Wörter (je Takt ein Wort des Texts, groß, der zweite Takt umgekehrt), Verschieben (die Lettern in einer Zeile, eine Zelle je halben Schlag), am Ende das ganze Alphabet Punkt für Punkt; die alten Auftritte bleiben wählbar. Der Ton des Case Film (Comp23, SOUND_EXAMPLES) ist vorgeladen, bis man einen eigenen lädt oder „Ohne Ton“ wählt. **Matrix 0.4.1, Engine 0.4.1** (user: „matrix font: testfont etwas dicker. mehr bewegung im movie. wörter, buchstaben, schwarz/weiss überblendungen. erscheinen von punkten ets. tickern mit etwas nachblenden/nachglühen. thumbnail animiert wie movie.“): Testalphabet mit Luft 0,05 Zellen statt 0,15; Szenen neu – Punkte (die erste Letter erscheint Punkt für Punkt), Lettern (Punkte wachsen ein), Umkehr (Schwarz und Weiß blenden im Schlag ineinander), Wörter (Punkte kommen, Grund blendet je Takt um), Verschieben (mit Nachglühen), Alphabet am Ende; Überblendungen in festen Zwischentönen, keine Transparenz; der Ticker glüht nach – nach „ticker sieht komisch aus“ nur zwei Schritte, schwach (28 % und 14 % der Tinte) und nur im Lauf „Schritt“; die Punkte stehen, die Lettern wandern (user: „wäre es bei ticker nicht so, dass die punkte stehen und die buchstaben wandern?“) – Fließend blendet einen Punkt zum nächsten über statt das Raster zu schieben, das Raster sitzt mittig im Bild; im Film wird die Szene Verschieben zum Ticker (user: „dieses tickern könnte auch mal beim film erscheinen“) – der Text läuft fließend durch eine Anzeige, deren Punkte stehen und zu sehen sind, vier Spalten je Schlag; Text Saul Bass (user: „text: wieder saul bass zitate. bei ticker und bei movie“): „Design is thinking made visual.“, „I want to make beautiful things, even if nobody cares.“, „Symbolize and summarize.“ – Vorgabe der Playground Library, im Testalphabet und in der Kachel; der Ticker läuft durch alle Zeilen des Texts, nicht nur die erste; **Matrix 0.4.2 · Trailer** (user: „mich verwirrt der ganze film bereich. warum alphabet? warum text? was macht das pulldown szenen usw.“ – „ja, ich möchte immer 45s, bitte auch schwarz weiß/wischer und splitscreens einbauen“; „film nennen wir trailer“): Film heißt Trailer; im Abschnitt nur noch Tempo und Ton, dazu das Textfeld für Wörter und Ticker – „Alphabet / Text“, das Pulldown Auftritt und Länge fallen weg; der Trailer ist immer 45 s in Szenen: Punkte, Lettern, Wischer (eine Kante wischt je Takt Schwarz und Weiß um), Umkehr, Wörter, Split (zwei, drei oder vier Felder, je eine Letter, im Wechsel umgekehrt), Ticker, am Ende das ganze Alphabet; die Kachel spielt 45 s. Split und Ticker je einen Takt länger (4 statt 3), Lettern, Umkehr, Wörter und Alphabet dafür kürzer (user: „timing bei 6/7 etwas zu knapp“). Das Standbild des Trailers ist das erste Wort mit allen Punkten, nicht mehr das Alphabet am Ende (user: „trailer startbild nicht das alphabet“) – auch für PNG und SVG, solange der Trailer am Anfang steht. **Library 0.9.26, Abspielleiste; Matrix 0.4.3, Engine 0.4.3** (user: „sollten wir bei bewegen nicht einfach die filmsteuerung wie bei case verwenden?“ – „stop. doch in die library“): neuer Baustein Abspielleiste (An den Anfang, Abspielen/Anhalten, Zeit, Zeitleiste, Ergebnis groß; Leertaste, Pos1, ← → ein Schlag, ⇧ ein Takt), Core 0.5.118 (`initAbspielleiste`, `.abspielleiste`); Matrix nutzt sie unter der Bühne bei Ticker und Trailer statt des ▶-Chips; der Motion Composer hat vorerst noch seine eigene Reihe. Setzen › Text mit Schriftgröße (20–300 %, 100 % füllt die längste Zeile) und Zeilenabstand in Zellen (user: „bei setzen text muss die schriftgrösse anpassbar sein. auch zeilenabstand“). Inspektor: eigener Abschnitt „Projekt“ zuerst (Zeichen, Varianten, Raster, Projekt öffnen), wie im Motion Composer; „Werte“ zeigt nur noch Version und Einstellungen, in einer Schrift (user: „schrift stimmt hier glaube ich nicht“). **Font-Export – Matrix 0.4.4, Engine Matrix 0.4.4, Export 0.5.5** (user: „kann man die schrift auch als font exportieren?“ – „Ja, bau den Font-Export so: TTF aus den Favoriten, eigener Schreiber in der Engine Export, Name Playground Matrix.“): Speichern › Schrift › TTF; „Playground Matrix“ mit den Favoriten aller entworfenen Zeichen, Kleinbuchstaben mit derselben Form, ß auf ẞ; jeder Punkt als Umriss wie gezeichnet (Form, Größe, Drehung, Kontur als Ring, Versatz, Neigung, Modulation), Maße aus dem Raster (Zelle 100 Einheiten bei 7 Zeilen, Zeilenabstand aus Setzen). Neu: `engines/export/font.js` (TrueType ohne Bibliothek: head, hhea, maxp, OS/2, hmtx, cmap 4, loca, glyf, name, post), `EXPORT_ENGINE.ttf`, in der Engine Matrix `glyphOutline` und `fontMetrics`. Geprüft: im Browser als Webfont geladen (Chrome prüft Schriften streng), die Zitate gesetzt; alle sechs Punktarten (Ring, gerundetes Quadrat mit Kontur, Dreieck, gedrehte Linie, Dreieck mit Kontur, Linie gerade) laden und stehen richtig. **Library 0.9.27, Core 0.5.119, Matrix 0.4.5 – Speichern und Zoom** (user: „das ist auch noch etwas verwirrend“; „ich kann auch speichern nicht abbrechen > bad ux“; „kann man das interagieren/zoomen mit der fläche intelligenter machen?“ – „1. ja 2. ja 3. ja“): Speichern mit „Abbrechen“ im Fuß, Größe und Beschnitt direkt unter Bild, was jetzt geht zuerst, ganz ausgegraute Gruppen zuletzt – für alle Tools. Zoom der Bühne: Pinch und Cmd+Rad zum Zeiger (`initStageZoom`), Rad und zwei Finger verschieben, Leertaste + Ziehen greift die Bühne; der Zoom als Chip mit Wert zwischen − und + (`.stage-chip.wert`), ein Klick öffnet Alles einpassen ⇧1, Auswahl einpassen ⇧2, 100 % Cmd+0; Doppelklick holt eine Variante heran (ein Punkt, den der erste Klick setzte, wird zurückgenommen); Pfeiltasten und Tasten halten die Auswahl im Bild; F legt in Entwerfen das Zeichen F an statt Vollbild. Library-Regel „Marken auf der Bühne“: „nie das Mausrad“ gilt weiter für Größen, die Bühne zoomt mit Pinch und Cmd+Rad. Die anderen 19 Tools bekommen den neuen Dialog über den Core; abgeglichen (user: „ja“): in jedem Speichern geöffnet und mit Abbrechen geschlossen – Keyvisual, Keyvisual Motion, Lattice Keyvisual und Motion, Bildoverlay, Typesetter, Kamera, Logo, Gradient, Image Gradient, Icon Pattern, Arrow Pattern, Face Pattern, Face Tracking, QR, Type Scale, Motion Composer, SVG-Animator, Texttafel; überall steht zuerst, was geht, die Feldzeilen unter ihrem Format, Abbrechen schließt; tool.json library 0.9.27. Matrix: ein gespeichertes Projekt mit dem alten Beispieltext („HALLO …“) bekommt beim Öffnen die Saul-Bass-Zitate, ein eigener Text bleibt (user: „warum steht beim matrix trailer am anfang noch hallo?“). **Library 0.9.28, Core 0.5.120: Werte ohne Monospace** (user: „warum sind da oben andere schriften?? > pattern lib“ – „ja“): `.insp-values` in der Schrift der Kennwerte, in allen Tools. **Library 0.9.29, Core 0.5.123: Varianten und Meldung mit Handlung** (user, über die Session HMI Case-Film Tool: „Der Würfel „Neue Variante“ öffnet in allen Tools den Varianten-Bogen“; hier freigegeben: „Ja, alle vier“; Matrix: „ich würde die Random-Funktion auch gerne bei Matrix Font nehmen“ – „Punkt der Auswahl“): Keyvisual ohne eigenen Bogen und Hinweis (`.variants*`, `.st-note`, `.st-act` gelöscht), Meldung „2 Wörter passen auf keine Gerade.“ mit „Fließend setzen“, „Band schmaler“; Matrix-Würfel unter Variante zeigt neun Punkte für die Auswahl; Keyvisual Motion, Logo, Icon-, Arrow-, Face Pattern, Gradient, Image Gradient, Typesetter öffnen den Bogen mit ihrem bisherigen Zufall. Im Browser geprüft: neun Bühnen je Tool, Wählen, Verwerfen, Übernehmen, Cmd+Z in Matrix und Keyvisual; die Meldung tritt hinter den Bogen zurück und kommt danach wieder. **THA Live Camera wieder im Dashboard** (user, über die Session HMI Case-Film Tool: „kannst du THA Kamera wieder in Dashboard aufnehmen?“): `"dashboard": false` aus `tools/kamera/tool.json` entfernt – das Ausblenden vom 26.10. zurückgenommen; Kachel mit dem bisherigen Bild, bis die Live-Kacheln eine Kamera-Vorschau haben. Nach dem Design-Wächter: Keyvisual stellt beim Verwerfen und Übernehmen die Bewegung wieder her, die das Öffnen angehalten hat; Matrix schreibt beim Übernehmen der Mitte nichts (auch keinen Rückgängig-Schritt) und gibt einer Mehrfachauswahl nicht ungewollt den Punkt der einen. **Zauberstab, Neu mischen, Werte in einer Flucht (Core 0.5.126)** (user: „Zauberstab“ – Download „Ja“; „was empfiehlst du aus UX-Sicht?“; „kamera: typo verstoss styleguide“): der Knopf „Varianten“ ist in allen zehn Tools der Carbon-Zauberstab (`magic-wand`, @carbon/icons 11.50.0, in `core/icons/carbon.json`), gesetzt vom Core (`wireVariantsOpener`); der Würfel steht nur noch im Bogen für Neu mischen; Neu mischen behält die Abwandlungen im Kreuz und mischt nur die Ecken neu; im Inspektor haben alle Werte eine Spalte für die Namen, die Werte von Version und Einstellungen stehen untereinander. Live Camera: der Status („1 Kopf erkannt“) ist ein Kennwert der Gruppe Kamera statt Text in der Überschrift, und er wechselt erst, wenn ein Wert eine halbe Sekunde hält (user: „flunker typo, verstoss styleguide“). Keyvisual: der Befund nur noch in der Meldung, in den Worten des Docks („2 Wörter passen nicht aufs Band.“), das Warnzeichen am Label „Text“ fällt weg, die Wörter bleiben im Feld markiert (user: „Nur die Meldung“). Bühnen-Hinweis im schmalen Fenster: er hält den Platz der Chips frei, bricht um und fällt im sehr schmalen Fenster (unter 760 px, mit Inspektor unter 1100 px) weg (user: „achtung schmale fenster“). Bandbreite (Keyvisual, Keyvisual Motion, Live Camera) als Regler mit Stufen aus der Library – sieben feste Werte von 1 bis 4 (user: „bandbreite vermutlich besser mit punktescale. nur aus lib nehmen!“). **Ein Dialog für alles, Core 0.5.130** (user: „speichern: bricht mit regeln für dialog. manche haben blur, manche nicht. speichern ist heller, varianten ist dunkler.“ – „kümmere dich ein für alle mal darum“ – „stelle sicher, dass jetzt alles der pattern lib entspricht“; „umschalten beim speichern: die vertikale neuausrichtung ist unpraktisch“): `.img-modal` (Varianten, Farben aus dem Bild) hat die Fläche, Abdunkelung, Titelgröße und den Fuß von Speichern und Einstellungen; jeder Dialog steht von oben und wächst nach unten, nichts springt beim Umschalten. check-standard prüft jetzt, dass gleiche Rollen im Core gleich aussehen (Dialog: Grund, Haarlinie, Unschärfe, Schatten, Abdunkelung), und meldet eigene Stile eines Tools für Dialog, Meldung, Bühnen-Marken, Varianten, Abspielleiste und Werte; beides mit eingebautem Verstoß geprüft. Playground Library 0.1.8: der Baustein „Punkt“ (pg-punkt) gelöscht – seine Beispiele waren winzige, kaputte Standbilder (user: „was ist das für ein bullshit? löschen“); – dann Playground Library 0.1.9 neu: auch „Farbe“ gelöscht (user: „bei playground: alles aus farbe irrelevant“; „das ist einfach scheissdreck“); drei Bausteine mit dem echten Testalphabet statt eines X: Raster (das A im Raster 5 × 7), Zeichen (A mit zwei Varianten), Alphabet (alle 53 Zeichen). Das Testalphabet steht jetzt nur noch in der Library (`matrix.sample`); Matrix startet damit, `tools/matrix/testalphabet.json` ist gelöscht. Geprüft in Matrix (Werte und Kennwerte gleiche Schrift, 13 px); reine Schriftänderung im Core, alle Tools auf Library 0.9.28. die Kachel im Playground spielt den Film (tool.json live, Engine nimmt die Zeit der Kachel). **Matrix 0.4.0 – neu gebaut** (user: „du verpfuscht das gerade vollkommen“ – „vergiss alles, schmeiss alles weg. dann mach es neu“ – „Ja, bau Matrix nach diesem Entwurf neu.“): tools/matrix/index.html von null geschrieben, Engine Matrix und Playground-Library unverändert, das Projekt im Browser bleibt erhalten. Ein Ort, eine Wirkung: das Dock ist, was man gerade tut (Modus und sein Inhalt, Farbe, im Entwerfen die gewählte Variante), der Inspektor die Schrift (Raster, Punkt, Modulation, Werte) in jedem Modus. Der Punkt wie in Figma ohne Schalter: unter Variante die Werte der Auswahl, ein geänderter Wert gilt nur für sie und steht blau mit ↺ (Probe „abweichung“). Bühne: Spalte je Zeichen, Varianten darunter, Stern auf der Ecke, Plus als Leiste unter der Spalte und als Fläche für ein neues Zeichen; ein Klick wählt, der zweite zeichnet; Entf löscht; Cmd+Z deckt Bühne, Dock und Inspektor. Wörter: Projekt (Datei), Abstände in Zellen (Rand, Luft, Versatz, Neigung je Zeile), Länge einmal mit Takten und Sekunden. Setzen zeigt fehlende Zeichen als leeres Raster, der Film in Ruhe sein Ende statt eines leeren Anfangs. Nicht übernommen: Rahmen ziehen zum Wählen, Verschieben mit Alt, die Knöpfe Alle Zellen aus/Umkehren.
- **Matrix: der Punkt des Alphabets wird vererbt** (user, 26.10.2026: „Ja: Das Alphabet hat einen Punkt, den jede Variante erbt, bis sie ihn selbst überschreibt – wie Hauptkomponente und Instanzen in Figma.“ – nach Befund 1 des Design-Wächters zur Mehrfachauswahl): eine neue Variante hat nur ihr Muster, ihr Punkt (Form, Füllung, Drehung, Größe, Rundung, Linienstärke) ist der des Alphabets; was man an einer Auswahl ändert, ist eine Überschreibung nur für sie. „Punkt für alle übernehmen“ (zuerst „Fürs Alphabet übernehmen“ – user: „fürs alphabet übernehmen doppelt sich mit favorit. favorit ist für mich die auswahl“) macht den Punkt der Auswahl zum gemeinsamen Punkt (alle Varianten ohne eigenen Punkt folgen; gleiche Überschreibungen fallen weg), „Punkt zurücksetzen“ (zuerst „Zurück zum Alphabet“) hebt die Überschreibungen der Auswahl auf – beide nur sichtbar, wenn die Auswahl etwas überschreibt. Alte Alphabete: Werte gleich dem Alphabet gelten nicht als Überschreibung. Der Punkt des Alphabets wird im Browser und in der JSON-Datei mitgespeichert. Playground Library: Regel Punkt angepasst.
- **check-standard: Anrede und Pronomen** (user, 26.10.2026, über die Session HMI Case-Film Tool: „Ja, check-standard soll Pronomen und Anrede in Labels, Knöpfen, Meldungen, title und aria-label melden.“; hier freigegeben: „ja“ – UX §2.3 „Anrede und Pronomen“). Gelesen wird nur, was die Oberfläche zeigt: title, aria-label, placeholder, Text in Knöpfen, Labels, Überschriften, Optionen, und in Skripten showToast, toast, confirm, chooseOption, title, label, hint, name, text; nicht Kommentare, Code und die Inhalte der Brands (library.js, Filmtexte). Fehler: mein/dein/euer mit Endungen, du/dich/dir, ein großes „Sie“/„Ihnen“/„Ihr…“ mitten im Satz. Hinweis: dasselbe am Satzanfang oder nach einem Doppelpunkt – „Sie wechseln im Takt“ (3. Person) ist von „Sie können …“ (Anrede) dort nicht sicher zu unterscheiden. Gilt für den Core (ui.js), die Brand-Dashboards, Datenfluss, Library-Seite und jedes Tool mit seinen eigenen .js. Belegt mit eingebauten Verstößen in Matrix: „Deine Farbe“ (Überschrift) und „Dich verkleinern“ (aria-label) → Fehler, „Geöffnet, Sie können weiterzeichnen“ → Fehler, „Sie wechseln im Takt“ (title) und „Gestaltet: Sie können …“ → Hinweis; danach entfernt, alle wieder ok. Heute meldet die Prüfung nichts.
- **Matrix: Mehrfachauswahl (Probe)** (user, 26.10.2026: „hier bin ich mir unsicher. für je variante spricht vielfalt/experiment. wäre multiselektion von buchstaben auf der fläche möglich? das würde das lösen“; „ja“): der Punkt bleibt je Variante; was man einstellt, gilt für die Auswahl. Klick wählt eine Variante, Shift-Klick fügt hinzu oder nimmt heraus, ein Rahmen auf freier Bühne wählt alle darin, Cmd+A alle Varianten (noch einmal: nur die Favoriten), Esc wieder eine. Die Überschrift Variante sagt, worauf man wirkt („A · 2“, „3 Varianten“, „Alle“); Punkt, Drehung, Größe, Rundung, Linienstärke, Würfeln (jede für sich), Leeren, Umkehren und Löschen wirken auf alle gewählten; verschiedene Werte zeigen „gemischt“. Gezeichnet wird weiter auf der Fläche, auf der man malt. Die Library-Regel „immer nur eine Stelle markiert“ (Marken auf der Bühne) gilt hier nicht – Probe, bis entschieden. Unten links weniger (user: „das hier ist mir alles zu viel“): der Hinweis „Klicken setzt Punkte“ und „Nur Favoriten“ fallen weg (die Favoriten zeigt Setzen → Alphabet).
- **Matrix: Zweck neu gefasst** (user, 26.10.2026: „Bewegen gehört zu Matrix: Zweck neu fassen als eine Schrift entwerfen, setzen und bewegen.“ – nach dem ersten Bericht des Design-Wächters, Befund 1 „Zwei Zwecke“): `tool.json` text „Eine eigene Schrift aus Punkten im Raster – entwerfen, setzen und bewegen.“; die Vorschau der Kachel zeigte noch die alte Ansicht „varianten“, jetzt den Modus Setzen.
- **Matrix: Inspektor aufgeräumt** (user, 26.10.2026: „inspektor aufräumen?“; „Ja, räum den Inspektor so auf“): drei Reiter statt vier – Projekt (Zahlen, Öffnen) als Gruppe „Alphabet“ in Werte; „Versatz in“ mit Label statt einer namenlosen Reihe Zeilen | Spalten; unter Modus höchstens eine weitere Reihe, benannt – „Inhalt“ bei Setzen, „Art“ bei Bewegen; der Inhalt des Films im Abschnitt Film (user: „das ist vielleicht noch etwas wild“); Raster in Gruppen nach Bedeutung – Raster (Spalten, Zeilen, Proportion), Abstände (Rand, Luft), Lage (Versatz, Neigung); Versatz als fünf Kacheln mit dem Raster im Bild – gerade, Zeilen um ¼ oder ½, Spalten um ¼ oder ½ versetzt –, kein Regler „Weite“ mehr (user: „aber das ist nicht gut > UX/IA“; „noch nicht mal ich verstehe das“); ebenso Zelle (statt Proportion) als sechs Kacheln von sehr schmal bis doppelt breit und Luft als fünf Kacheln von dicht bis sehr viel – das Bild statt der Prozentzahl (user: „proportionen und luft? wie sollen das studierende verstehen?“); Rand in Zellen statt „E“ (user: „aber das ist nicht gut > UX/IA“); unten links weniger: Einpassen fällt weg (− und + treffen 100 %), der Hinweis nur noch „Klicken setzt Punkte“ (user: „hier ist zu viel los“); Form, Formel und Frequenz der Modulation erst ab einer Stärke über null (Abhängiges verschwindet).
- **Matrix: Neuordnung nach drei Ebenen** (user, 26.10.2026: „jetzt würde ich gerne mal einen vollständigen design und UX check machen. auch informationsarchitektur. wie können wir das kompakter bekommen, ohne vielfalt & experimentiermöglichkeiten zu verlieren“; „vor allem auch unklar. was bezieht sich auf einen buchstaben, was auf alles“; „und was auf den modus“; „Ja, bau die Neuordnung nach den drei Ebenen so im Labor“).
  - **Modus** oben im Dock als Segment-Reihe: Entwerfen · Setzen · Bewegen; Setzen mit Inhalt Text oder Alphabet, Bewegen mit Ticker oder Film (Film mit Inhalt Text oder Alphabet). Alle fünf bisherigen Wege bleiben; Setzen und Bewegen merken sich ihre letzte Wahl. Darunter, was nur der Modus braucht: Format, Text, Ticker, Film; dann Farbe.
  - **Variante** (nur in Entwerfen): eine Überschrift mit dem blauen Etikett der Bühne („C“, „A · 2“) – Punkt als Kacheln, Drehung, Größe, Rundung, Linienstärke, Leeren · Umkehren · Löschen; Würfeln als Symbol in der Überschrift.
  - **Alle Zeichen** im Inspektor, Reiter Raster (Spalten, Zeilen, Proportion, Rand, Luft; Gruppe Lage: Versatz, Neigung) · Modulation (Stärke, Form, Formel, Frequenz) · Projekt (Zahlen, Öffnen) · Werte; Würfeln je Reiter in der Überschrift. „Abstand“ heißt jetzt „Rand“.
  - **Ansicht** auf der Bühne: „Leere Punkte“ und „Nur Favoriten“ als Bühnen-Knöpfe (Symbole aus der Library: circle-dash; Carbon-Stern), neben Zoom, Abspielen, Vollbild.
  - **Weg:** das Feld „Zeichen“ (eine Taste auf der Bühne wählt oder legt an), die Knöpfe „Neue Variante“ und „Würfeln“ im Dock (das Plus auf der Bühne), „Neuer Zufall“ (im Würfeln der Modulation). Entwerfen: Dock von 27 auf 15 Elemente.
  - **Geprüft im Browser:** jeder Wechsel Entwerfen · Setzen · Text/Alphabet · Bewegen · Ticker/Film zeigt nur seine Abschnitte; Setzen kehrt zum zuletzt gewählten Alphabet zurück; keine Fehler. check-standard: nur die Probe Schatten am Inspektor.
- **UX: Anrede und Pronomen** (user, 26.10.2026: „bitte insgesamt auswerten und für UX-Grundsätze aufbereiten“ – Vitaly Friedman, „Your vs. My? UX Writing Guidelines“). `docs/QS/2-UX.md` §2.3 hat einen neuen Abschnitt „Anrede und Pronomen“. Er fasst den Artikel und seine Quellen zusammen (Saito, MacDonald, Silver) und legt fest: die Tools als Werkzeug, Labels ohne Pronomen, keine Anrede, Eigenes gegen Vorgegebenes über das Nomen („Eigene“, „Vorlage“), Entscheidungen des Systems nie als die des Menschen, eine Form überall. Gemessen am heutigen Stand: kein Pronomen und keine Anrede in Labels, Knöpfen, Meldungen, `title` und `aria-label`.
- **Matrix 0.3.0 (Lab): Ticker und Movie, SVG, Testdatensatz – Engine Matrix 0.3.0, Playground Library 0.1.5** (user, 26.10.2026: „ticker: mit einem text und verhalten wie in ubahn“; „movie: ein casefilm der alle buchstaben animiert darstellt (aber wenig einstellungen, nicht wie movie composer, aber mit musik und takt usw). also ein kompakter movie maker“; „Ja, bau Ticker und Movie so im Labor“).
  - **Ticker:** die erste Zeile des Texts läuft von rechts nach links durch eine Anzeige aus Punkten, Spalte für Spalte (Schritt) oder fließend, und kommt wieder; Tempo in Spalten je Sekunde. Jede Spalte behält den Punkt ihres Zeichens; die leeren Punkte der Anzeige blass (Schalter „Leere Punkte“).
  - **Movie:** die Favoriten des Alphabets oder der Text bauen sich im Takt auf – Punkt für Punkt, Welle (ein Zeichen nach dem anderen), Zufall, oder Varianten (jeder Schlag die nächste Variante); das letzte Viertel steht, jeder Schlag pulsiert leicht. Takt aus der Engine Motion (taktAt). Ton laden: Tempo und erste Eins aus der Tonanalyse des Case Films (tools/case-film/audio.js, analyzeSound); Länge in Takten, Tempo in BPM.
  - **Abspielen:** ein Bühnen-Knopf (Probe, Carbon play) und die Leertaste; in Schreiben, Alphabet, Ticker und Movie das Format.
  - **Speichern:** MP4 über die Engine Export – eine Runde Ticker, der Film mit Ton; PNG zeigt das Ende des Films. **SVG** (user: „SVG speichern brauche ich auch“) aus der Engine.
  - **Testdatensatz** `docs/labor/matrix-testdaten.json` (user: „kannst du einen testdatensatz für ein projekt erstellen?“): A–Z, 0–9 im 5×7-Raster, 44 Varianten, Text; nicht auf der Demo-Seite (docs/labor).
  - **Schatten am Inspektor** (Probe, nur in Matrix; user: „beim drunterschieben wäre ein schatten gut“; „Nur in Matrix als Probe, nicht in der Library“): laufen Karten unter den offenen Inspektor, wirft er den gehobenen Schatten der Library (--shadow-lifted).
  - **Geprüft im Browser:** Ticker läuft (fünf verschiedene Bilder in 1,5 s), Movie baut auf (Anteil der Punkte 18 → 128), MP4 ohne Ton 4 s, mit dem Beispielton (comp23-lang.m4a, 120 BPM) 4 s mit Ton; keine Fehler. check-standard: alle ok.
- **PDF/X-3: das 300%-Profil benannt und geprüft – Export 0.5.4** (user, 26.10.2026: „Da ist ein ISO Coated v2 – ECI-Profil drin. Aber nicht das 300%“).
  - **Gemessen vorher** (aktueller Arbeitsstand, Export 0.5.3): eingebettet `ISO Coated v2 300% (ECI)` (Tag desc), 1 829 093 Byte, SHA-256 c6b4b62f…cdab8 = `ISOcoated_v2_300_eci.icc` aus ECI_Offset_2009 (MD5 e14f5db9…a1b5); `/OutputConditionIdentifier (FOGRA39)`, `/OutputCondition (Offset, gestrichenes Papier, ISO 12647-2:2004)` – nannte das Profil nicht –, `/Info (ISO Coated v2 300% \(ECI\))`, `/RegistryName (http://www.color.org)`. Der letzte Commit 8a50720 und damit `dist` enthalten noch `ISOcoated_v2_eci.icc` (330 %, 1 829 077 Byte, MD5 bda07efc…a7e5).
  - **Nachher:** `/OutputCondition (ISO Coated v2 300% \(ECI\))`, `/Info (ISO Coated v2 300% \(ECI\) - Offset, gestrichenes Papier, ISO 12647-2:2004, FOGRA39)`. Die Prüfung nach jedem Export liest das Profil aus der Datei: Name im Tag desc muss „ISO Coated v2 300% (ECI)“ sein, SHA-256 gleich der ECI-Datei; dazu die beiden Strings und FOGRA39.
  - **Belegt mit einem eingebauten Verstoß:** dasselbe Profil mit dem Namen „ISO Coated v2 (ECI)“ – die Prüfung meldet „Profil heißt „ISO Coated v2 (ECI)“, nicht ISO Coated v2 300% (ECI)“ und „Profil nicht byte-gleich mit ISOcoated_v2_300_eci.icc“; das richtige besteht.
- **Matrix:** keine Transparenz mehr – die leeren Zellen und der Cursor in einem deckenden Ton zwischen Tinte und Grund (user: „keine transparenz“); das Raster ändert sich nicht mehr durch Ziehen am Rand, nur im Inspektor (user: „raster verändern durch objekt manipulation lassen wir weg“). Canvases und Plus-Flächen mit dem Rahmen der Bühne aus der Library (stageFrame: 10 px Ecken, Haarlinie, Schatten), der Grund dahinter über setContentGround wie in den anderen Tools (user: „die flächen sehen nicht wie unser canvas aus“). Schalter „Leere Punkte“: die grauen Punkte der leeren Zellen lassen sich ausblenden (user: „wäre auch sinnvoll graue dots ausblenden zu können“). Der Abstand gilt auf dem Canvas einer Variante auf allen vier Seiten gleich – bei 0 liegt das Zeichen ringsum an der Kante (user: „abstand muss immer gleich sein, bei 0 darf oben nicht leer sein“). Engine Matrix 0.2.6. Jedes Canvas zeigt oben links sein Zeichen als blaues Etikett der Bühnen-Marken (drawStageLabel, Core), bei mehreren Varianten mit Nummer – „A · 2“ (user: „können wir hier auch zeigen, welche fläche mit welchen buchstaben zugeordnet ist. z. blaue bubble“) – über dem Canvas, nicht auf der Schrift (user: „die nummerierung darf die schrift nicht überlagern. besser außen“). Favorit nur ausdrücklich: ein Stern als Bühnen-Knopf (stage-chip, Schalter) neben dem Etikett pinnt ihn; ein Klick auf eine Variante wählt sie nur zum Zeichnen (blauer Rahmen), ↑ ↓ wechselt die gezeichnete (user: „das anpinnen (favoriten) muss explizit sein. evtl. icon zum anklicken“), 18 px hoch wie das Etikett, Symbol 12 px (user: „der stern ist zu fett, gleiche höhe wie A“). Die Zeile mit Etikett und Stern ist so breit wie ihr Canvas und macht die Spalte bei kleinen Karten nicht breiter (user: „hier ist was verschoben“). Der Zeiger zeigt mit dem blauen Hover-Punkt der Bühnen-Marken, welche Zelle ein Klick setzt (user: „zeichnen mit cursor unterstützen?“). Der Cursor in Schreiben blinkt wie in Custom Type, 1,05 s (user: „cursor sollte blinken, wie bei THA“). Die Reihe der Karten reicht bis zum Inspektor, ohne ihn über das ganze Fenster (user: „wenn inspektor weg ist, muss sich der platz anpassen“). SVG im Dialog Speichern: dieselben Punkte als Vektoren, von der Engine geschrieben (user: „SVG speichern brauche ich auch“); in der Konstruktion speichern PNG und SVG die Variante, die gezeichnet wird – vorher kam dort der Text heraus. Format in Schreiben und Alphabet über den Baustein Format (initFormat), in der Konstruktion keins (user: „bei schreiben und alphabet format zulassen“). Das Alphabet wird immer im Browser gesichert, nicht nur mit „Letzten Zustand merken“ (user: „kann ich das auch laden, wenn ich länger daran arbeite?“); als Datei weiter Speichern → JSON und Alphabet → Öffnen. Die Karten und die Flächen zum Hinzufügen passen in den Raum der Bühne, der bis zum Inspektor reicht; was beim Zoomen übersteht, wird erst an seinem Rand abgeschnitten (user: „fläche wird hier seltsam angeschnitten“). Die Formel in einem einzeiligen Textfeld in der Schrift der Felder, 12 px (user: „text formel sehr gross“ – vorher passte grow-text die Schrift an; .mono hätte sie auf 14,7 px gehoben).
- **Matrix 0.2.0 (Lab): Konstruktion, Schreiben, Alphabet – Engine Matrix 0.2.3, Playground Library 0.1.4; Regler mit Stufen – Library 0.9.25, Core 0.5.117** (user, 26.10.2026: „ersmal lab bauen“, nach dem Entwurf der drei Modi).
  - **Konstruktion:** ein Canvas je Zeichen (user: „nein, pro buchstabe ein canvas“), die Varianten darin untereinander (user: „jeweils neue varianten hinzufügen. vertikal innerhalb des buchstabens. rechts oder links ein neuer buchstabe“); Knöpfe (Symbol-Knopf) für ein neues Zeichen links und rechts und eine neue Variante unter jedem Zeichen. Je Zeichen ist eine Variante der Favorit (user: „pro buchstabe ist immer einer ausgewählt“), gerahmt; berührt wird, was Favorit ist; ↑ ↓ wechselt ihn. „Varianten ausblenden“ zeigt nur die Favoriten. Direkte Manipulation (user: „direct object manipulation am grid“): Ziehen malt, Wahltaste + Ziehen verschiebt das Muster, der Rand rechts und unten ändert Spalten und Zeilen. Eine neue Variante ist eine Kopie des Favoriten (Probe).
  - **Punkt je Variante:** Kreis, Quadrat, Dreieck, Linie, als Fläche oder Kontur (user: „diese formen sind erlaubt … aber auch outlines“), Linienstärke bei Kontur und Linie (user: „bei outline/line brauchen wir auch linienstärke“); Drehung auch beim Quadrat, in 15°-Schritten im eigenen Umlauf der Form (user: „quadrat hat keine drehung (wäre aber sinnvoll), übernimmt aktuell drehung von dreieck“; „drehungen auch snappen lassen“).
  - **Raster:** Abstand neben dem Zeichen in Rastereinheiten, Vorgabe 1 (user: „bekommt der buchstabe automatisch eine rastereinheit als abstand. das könnte man auch verändern“); Neigung nur in festen Winkeln, je Zeile ¼, ½ oder eine Zelle (user: „neigung. sieht oft seltsam aus. sollten nur feste winkel zulassen“); Modulation mit Form – Welle, Waagrecht, Senkrecht, Radial, Zufall – und Frequenz (user: „kann man bei modulation auch die formel modifizieren?“).
  - **Würfeln** (user: „shuffle für varianten raster und formen wäre auch interessant“): eine neue Variante mit gewürfeltem Punkt, der Punkt der Variante, das Raster, ein neuer Zufall der Modulation.
  - **Schreiben** wie in Custom Type (user): tippen auf der Bühne, ← → bewegt den Cursor, ↑ ↓ wählt die Variante des Buchstabens davor; ein Klick setzt den Cursor. **Alphabet:** die Favoriten; ein Klick öffnet das Zeichen in der Konstruktion. Kein Format mehr (user: „format brauchen wir nicht“); Animation später als eigenes Tool (user: „ich würde matrix animation erstmal davon trennen“).
  - **Library 0.9.25, Regler mit Stufen** (user: „steps sollte man auch auf der scala sehen > pattern lib“): bei wenigen festen Werten ein Strich je Stufe quer über der Linie; in Matrix für Spalten, Zeilen, Abstand, Neigung, Frequenz, Drehung. Alle Tools auf 0.9.25 abgeglichen, alle Seiten auf Core 0.5.117.
  - **Nachgezogen:** ein Canvas je Variante, im Raster ausgerichtet – eine Spalte je Zeichen, die Varianten darunter, die Flächen zum Hinzufügen so groß wie ein Canvas an der Stelle, an der das Neue entsteht (user: „ja, aber im raster ausrichten. fläche sollte canvas entsprechen“; „da plus fällt aus der bisherigen systematik“); der Favorit mit Rahmen in Tinte, der gerade gezeichnete im Blau des Bearbeitens. Der Punkt als Kacheln mit der Form statt als Wort (user: „zeigen, nicht beschreiben“): acht in zwei Reihen, oben die Formen als Fläche, darunter als Kontur, eine davon gewählt (user: „ja, aber das versteht man nicht“ – zwei getrennte Reihen für Form und Füllung). Die Formel der Modulation steht im Inspektor und ist editierbar, eine eigene ist die Form „Eigene“ (user: „bitte auch die formel zeigen, editierbar“; „und eigene“). Zoomen über Bühnen-Knöpfe unten links – Kleiner, Größer, Einpassen in festen Stufen 50–600 % (user: „ab einem gewissen punkt muss man zoomen können“; „können wir zoomung auch UI machen?“); Baustein Marken auf der Bühne, die Lupen von Carbon als Probe; das Mausrad zoomt nicht mehr (Regel der Library: „nie das Mausrad“). Eine Neigung nach links bleibt in der Fläche (user: „bei neigung in fläche ausrichten“). Regler-Stufen als Punkte von 2 px über der Linie (user: „zu brachial. nur kleine punkte oberhalb der linie“; „kleiner“).
  - **Geprüft im Browser:** Punkte malen, neue Variante, Punkt würfeln, neues Zeichen rechts, Schreiben „ABBA“ mit ↑ an A („Variante 1 von 2“), Alphabet – ohne Fehler. check-standard: alles ok bis „Format nicht über initFormat“ bei Matrix (Ausnahme braucht eine Freigabe für scripts/check-standard.py).
- **PDF/X-3 mit ISO Coated v2 300% (ECI) – Export 0.5.3** (user, 26.10.2026: „Wichtigstes: ISO Coated v2 300% (ECI) (Für gestrichenes Papier) … enthalten im .zip-Paket ‚Paket ECI_Offset_2009‘“): der OutputIntent bettet jetzt `ISOcoated_v2_300_eci.icc` ein (FOGRA39, Gesamtfarbauftrag höchstens 300 %) statt ISO Coated v2 (330 %); aus dem schon freigegebenen Paket genommen, nichts neu geladen. README in `engines/export/icc/` nachgeführt.
- **Matrix: Raster höchstens 9 × 9 – Playground Library 0.1.1** (user, 26.10.2026: „zunächst wir limitieren das raster auf 9x9“): Spalten und Zeilen 1–9; ein Zeichen, das größer gespeichert war, behält beim Öffnen den Teil oben links.
- **Library 0.9.24: Regel Speichern nennt PDF/X-3** (user, 26.10.2026: „pdf > ja“ – Freigabe, die gesperrte `patterns/blocks.js` zu ändern): nur der Text; kein Tool muss neu abgeglichen werden. „Erkunden“ in Matrix bleibt offen (user: „erkunden > noch lab, wir müssen den aufbau klären“).
- **PDF/X-3 in allen PDF-Tools; THA in CMYK – Export 0.5.2, THA Brand Library 0.2.2** (user, 26.10.2026: „PDF Export in X3 Standard möglich?“; „Bau PDF/X-3 jetzt: Farben als sRGB, OutputIntent ISO Coated v2 (FOGRA39), transparente Teile als 300-dpi-Raster; CMYK-Werte der Marken später“; dann „tha brandfarben. wir können CMYK ausprobieren“, mit der Farbseite des THA-Guides).
  - **Dialog Speichern:** in der Gruppe Bild neben PDF das Format „PDF/X-3“ (Titel „Druck · FOGRA39“) – in Gradient, Grid, Pfeile, Gesichter, Logo, QR, Keyvisual, Typesetter; mit Beschnitt und Schnittmarken wie die PDF. Über den vorhandenen Dialog, ohne Änderung an Core oder Library.
  - **Engine Export (pdf.js):** PDF 1.3 mit GTS_PDFXVersion „PDF/X-3:2002“, OutputIntent FOGRA39 mit ISO Coated v2 (ECI) eingebettet, Trapped False, Titel, Erstell- und Änderungsdatum, ID, TrimBox/BleedBox. Jede Farbe sRGB (ICCBased, sRGB2014 des ICC) – außer den Farben, die die Marke in CMYK angibt: die gehen genau so als CMYK hinaus. Transparenz gibt es in X-3 nicht: ein Element mit Deckkraft, Maske, Verlauf mit Alpha oder Bild mit Alpha wird in seinem eigenen Rahmen samt dem, was darunter liegt, als Raster mit 300 dpi gesetzt; was darüber liegt, bleibt Vektor. Profile in `engines/export/icc/` (README mit Quelle und Lizenzstand).
  - **Prüfung im Code:** nach jedem X-3-Export liest die Engine die Datei zurück (`EXPORT_PDF.inspect`): Version, Kennung, OutputIntent mit Profil, Trapped, Titel, Daten, TrimBox, ID; keine Verschlüsselung, keine Soft-Maske, keine Deckkraft, keine Transparenzgruppe, kein DeviceRGB, keine Schrift, keine Farbe ohne Profil in den Inhalten. Der Hinweis nach dem Speichern sagt „PDF/X-3 gespeichert“ oder, was fehlt, und wie viele Teile Raster wurden. Eine Zertifizierung gibt nur ein externer Preflight (Acrobat, callas).
  - **THA Brand Library 0.2.2:** CMYK der Farbseite – THA-Rot 0/100/50/0 (Pantone 1925 U/C), Schwarz 0/0/0/100, Weiß 0/0/0/0, Grau 4–1 nur K 80/65/30/10.
  - **Geprüft:** Keyvisual THA, PDF/X-3 mit Beschnitt – Prüfung ok, THA-Rot im Inhalt `0 1 0.5 0 k`, Weiß `0 0 0 0 k`, kein Raster. Test-SVG mit einem halbtransparenten Kreis zwischen zwei Flächen: nur der Kreis wird Raster (320 × 320 px, 300 dpi), die Flächen bleiben CMYK-Vektor. Gradient: Prüfung ok, 1 Teil als Raster. Gegenprobe: eine normale PDF mit Deckkraft meldet 9 Mängel. check-standard: alle ok.
- **Beschnitt einstellbar – Library 0.9.23, Core 0.5.114** (user, 26.10.2026: „PDF Export in X3 Standard möglich? 3mm Beschnitt als Default-Wert, sollte aber veränderbar sein“; Freigabe: „Für den einstellbaren Beschnitt darfst du core/ui.js und patterns/blocks.js (Baustein Speichern) ändern“).
  - **Dialog Speichern:** der Schalter heißt „Beschnitt“ (sagt die Breite: „3 mm je Seite“); ist er an, darunter die Breite als Zahlenfeld in mm (Baustein Textfeld mit Einheit), 0,5–20 mm, Vorgabe 3, gemerkt in den Einstellungen; rechts die px bei 300 dpi, die Größe der Datei folgt. Gilt in allen Tools für PNG und Vektor-PDF; die Engines bekamen den Beschnitt schon immer als px. Alle 20 Tools auf Library 0.9.23 abgeglichen, alle Seiten auf Core 0.5.114.
  - **Geprüft** (Keyvisual THA, A4 hoch): 5 mm → 59 px je Seite, 4K-PNG 2832 × 3958 statt 2784 × 3910 px; PNG und PDF bekommen `bleed: 59`; im PDF liegt die TrimBox 14,16 pt (= 5 mm) innerhalb der BleedBox. check-standard: alle ok.
  - **PDF/X-3:** machbar, noch nicht gebaut; die Engine schreibt heute PDF 1.6 mit Transparenz, ohne OutputIntent. CMYK später (user: „cmyk machen wir später“).
- **Neuer Bereich Playground mit dem Lab-Tool Matrix – Engine Matrix 0.1.0, Playground Library 0.1.0** (user, 26.10.2026: „ich möchte einen neuen bereich ‚playground‘. dort ein tool um matrixschriften zu entwerfen. das raster soll modulierbar sein. die form des dots soll anpassbar sein“; „es soll nach und nach ein alphabet entstehen“; „farben schwarz/weiss und umgekehrt“; „das tool richtet sich an studierende, die experimentell damit arbeiten sollen“; „lokales speichern wäre sinnvoll“; „das muss ich im lab sehen“).
  - **Ohne Vorlagen** (user: „ich möchte nicht mit buchstaben vorlagen arbeiten, sie sollen selbst eine form finden“): jedes Zeichen beginnt als leeres Raster; was noch nicht entworfen ist, steht im Wort und im Alphabet als blasses Raster – das Alphabet wächst sichtbar.
  - **Low floor, high ceiling, wide walls** (user: „das tool soll entsprechend dem leitsatz … funktionieren“, Resnick): Klicken oder Ziehen setzt Punkte sofort; eine Taste öffnet ihr Zeichen, ← → blättert; ein Klick ins Wort oder Alphabet öffnet das Zeichen. Jedes Zeichen darf entworfen werden, nicht nur A–Z. Leeren und Umkehren.
  - **Raster** (user: „grid breite und höhe soll veränderbar sein“; „raster könnte man komplett in inspektor packen“): im Inspektor – Spalten 1–24, Zeilen 1–32, Proportion der Zelle, Versatz in Zeilen oder Spalten (user: „ich möchte aber auch mit rasterversatz arbeiten“, Grid Index), Abstand, Neigung, Modulation. Im Dock: Format, Ansicht, Zeichen, Wort, Farbe, Punkt (Kreis, Quadrat, Raute; Größe, Rundung), Varianten, Alphabet.
  - **Varianten** (user: „morphologisches arbeiten soll ebenfalls möglich sein“): ein morphologischer Kasten – zwei Merkmale gegeneinander in 2–6 Stufen, jede Zelle das Wort mit ihren Werten; ein Klick übernimmt sie.
  - **Speichern:** im Browser bei jeder Änderung; im Dialog Speichern PNG (ohne die blassen Zellen) oder das Alphabet als JSON, das „Öffnen“ wieder lädt.
  - **Library:** Ansicht als Auswahlliste, die der Core zur Segment-Reihe macht, wo vier passen (`selectsAsSegments`) – im schmalen Dock fehlten 2 px, sie bleibt Liste. check-standard: alle ok (zuerst „Format nicht über initFormat“ und „buehnen-marken“ – beides behoben, nicht die Prüfung).
- **Zurück fragt; kein Platzhalter im Bild – Core 0.5.112, Sequencer 0.5.9, SVG-Animator 0.1.4** (user, 26.10.2026: „zurück geht nicht, wenn nicht gespeichert wurde. hier braucht es einen dialog zur klärung“; „fremdkörper im styleguide“).
  - **Bearbeitungsmodus:** ← oder Esc mit Änderungen öffnet einen Dialog wie Speichern: „Änderungen übernehmen?“, Verwerfen oder Übernehmen; Esc oder daneben bleibt im Tool. Geprüft: SVG-Animator, Inhalt geändert, ← – der Dialog kommt.
  - **Text im Rückfrage-Dialog:** zuerst mit einer eigenen Klasse (`p.text`) gebaut, eine Schriftgröße, die es im System nicht gibt (user: „diese schriftgrösse gibt es nicht. dir ist es grundsätzlich nur erlaubt mit bauteilen der lib zu arbeiten“); jetzt `.settings small` der Library (--fs-sm, gemessen 12 px = Token).
  - **Safari-Ton nachgestellt:** in Chrome mit einem Encoder, der die Beschreibung wie Safari als ganzen ES-Deskriptor gibt – die neue Datei liest macOS (AVFoundation, afinfo) mit Tonspur AAC 48 kHz Stereo; die alte Safari-Datei nur mit Bild. Ein Export in Safari selbst steht aus.
  - **Platzhalter:** der Sequencer zeichnete ohne Bild Schraffur und „Bilder im Inspektor laden (Szene)“ in der Markenschrift ins Bild – auch in jeden Export; jetzt nur der Grund. Der SVG-Animator zeigt bei Inhalt „Bild“ ohne Bilder den Hinweis auf der Bühne der Library („Bilder laden – im Dock unter Inhalt“). Geprüft: bei Grafik verborgen, bei Bild sichtbar.
- **Bearbeitungsmodus mit Balken; eingeklappte Palette überall gleich; Ton aus Safari – Library 0.9.22, Core 0.5.111, Export mp4.js 0.3.3** (user, 26.10.2026: „hier hätte ich gerne eine durchgezogene leiste über die komplette breite. weiss im darkmode, dunkel mit light mode“; „weisser balken, durchgezogen, darauf buttons“; „button breite macht keinen sinn“; „buttons rechtsbündig“; „ich gehe davon aus, dass die leiste im abgleich mit pattern lib gebaut wird“; „höhe passt nicht. warum? pattern lib ignoriert?“; „quicktime zeigt kein audio in datei“).
  - **Bearbeitungsmodus:** über dem ganzen Fenster, nicht nur über dem Film; sein Fuß ein Balken im anderen Modus (Modus-Bereich, weiß im Dunklen, dunkel im Hellen), darauf rechtsbündig Verwerfen und Übernehmen in ihrer Breite; die Optionsleiste der Szene schließt beim Öffnen. Gemessen: Balken über 927 von 927 px, weiß; Knöpfe 140 px, rechts.
  - **Dock eingeklappt:** der Kopf mit 16 px oben und unten in jedem Dock – bisher nur in der Partitur, die übrigen ließen unten 8 px. In der Library (Dock), alle Tools abgeglichen.
  - **Ton aus Safari:** die Datei aus Safari hatte eine Tonspur (AAC, 48 kHz, 4501 Pakete) – macOS konnte sie nicht lesen: Safari gibt als Beschreibung den ganzen ES-Deskriptor, nicht die AudioSpecificConfig; der Muxer schrieb ihn verschachtelt in die esds. Jetzt nimmt er die Config heraus (`11 90`, AAC-LC, 48 kHz, Stereo), wie Chrome sie gibt. Geprüft am Deskriptor aus der Datei; eine neue Safari-Datei steht aus. Eine nachträglich geflickte Kopie der alten Datei las AVFoundation noch immer nicht – die neue Datei aus Safari entscheidet.
- **Partitur: Zeit neben dem Takt-Strich – Core 0.5.108** (user, 26.10.2026: „abstand ziffern/skala suboptimal“): die Zeit der Eins stand mittig unter ihrem Strich, der Strich lief in die Ziffern; jetzt steht sie rechts neben ihm, auf seiner Höhe, 4 px Abstand (Token --sp-1). Gemessen: Strich bis Ziffer 3 px Lücke, beide 10 px hoch. – Safari-Export (user: Hinweis „Ton: 4501 Pakete, Beschreibung Encoder, 21 20 03 40“): Safari kodiert den Ton wie Chrome und gibt die Beschreibung mit; die Tonspur wird damit geschrieben.
- **Ton im MP4 aus Safari; Tab-Aufnahme mit wachem Audio – Export mp4.js 0.3.1** (user, 26.10.2026: „wieder keine musik“, mit der Dateiinfo: `case-film_tha.mp4`, 1920 × 1080, H.264, 60 fps, nur eine Spur).
  - **Ursache:** der Muxer hängte die Tonspur nur an, wenn der AAC-Encoder seine Beschreibung (AudioSpecificConfig) mitgab; ohne sie fiel die Spur still weg – die Datei hatte Bild, aber keinen Ton, ohne Fehlermeldung. Safari gibt sie offenbar nicht (oder ADTS-Rahmen).
  - **Behoben:** ohne Beschreibung baut der Muxer sie selbst (AAC-LC, Abtastrate, Kanäle); kommen ADTS-Rahmen, nimmt er ihre Köpfe ab und liest die Beschreibung daraus; fehlt sie trotzdem, bricht der Export mit „kein Ton“ ab statt stumm zu speichern. Gemessen in Chrome, Story THA (0:16): normal und mit einem Encoder ohne Beschreibung (wie Safari) – beide mit Tonspur, Ton bis 0,97, 16 s. Der ADTS-Fall und Safari selbst sind hier nicht prüfbar.
  - **Tab-Aufnahme:** der Audio-Kontext wird vor der Aufnahme geweckt – schlief er, kam kein Ton, und der Recorder blieb nach dem ersten Stück stehen (gemessen: 7 kB, ein Fragment). Mit wachem Kontext nimmt die Export-Engine Bild und Ton auf (Test: Tonspur, 6 Fragmente in 3 s). Nach jeder Aufnahme sagt der Hinweis, ob Ton drin ist.
  - **Hinweis nach dem Export** (user: „geht nicht“, „es erscheint kein hinweis“ – in Safari, lokal): er kommt jetzt sofort und sagt, was der Encoder mit dem Ton tat – Pakete, woher die Beschreibung kam (Encoder, ADTS, gebaut), die ersten Bytes, ein Fehler; die Prüfung der fertigen Datei wartet höchstens 3 s (Safari antwortete beim Dekodieren nicht) und meldet sich nur, wenn sie sicher keinen Ton findet. In Chrome: „Ton: 753 Pakete, Beschreibung Encoder“.
- **Motion Composer 0.5.14: Standbild je Brand, Partitur ohne Überschneidung und Sprung, Ton in der Tab-Aufnahme; DesignCampus gestreckt statt Bayern-Rauten – Lattice 0.1.2, DesignCampus Brand Library 0.1.2, Export 0.5.1, Core 0.5.107** (user, 26.10.2026: „motion composer zeigt bei allen hmi thumb als platzhalter“; „composer: unschöne überschneidung“; „höhe partitur springt, wenn audio geladen wird“; „Design Campus: alle Texte Uppercase. Bayern-Rauten vermeiden. Mehr mit horizontaler und vertikaler Verzerrung des Rasters arbeiten“; „bei allen designcampus motion: bayern rauten vermeiden. texttafeln zur abwechslung nutzen“; „Composer: Brandtools Export THA: kein sound, keine sequenzen“; „story hat auch kein audio“).
  - **Standbild je Brand:** die Kachel des Motion Composers zeigte bis zum Film überall das HMI-Bild (`preview.jpg`); jetzt je Brand ein Bild aus ihrem eigenen Film, vom Sequencer gezeichnet (`preview-hmi/helio/tha/designcampus.jpg`, 1280 × 720) – HMI das Gesichterraster, HELIO das Buchstabenraster, THA „BEAUTIFUL THINGS“, DesignCampus die 6.
  - **Partitur:** der Kopf eines kurzen Akts bleibt in seiner Länge – der Name bleibt, Länge und Zeit weichen mit „…“; die Zeile der Tonkurve ist immer da (16 px), die Partitur springt nicht mehr, wenn ein Ton lädt (Core, Baustein Partitur).
  - **DesignCampus:** eine Raute ist nie quadratisch – Brand-Regel `stretch: 3` in der Library, die Engine Lattice streckt das Raster, wo eine Raute zwischen 1 : 3 und 3 : 1 läge (gilt in Keyvisual, Keyvisual Motion und jedem Film). Gemessen: eine Raute ist Bildbreite ÷ Spalten breit, Bildhöhe ÷ Zeilen hoch. Der Case Film wechselt flach (4 × 28, atmet in den Zeilen) und hoch (40–48 × 3, atmet in den Spalten), alle Figuren in Versalien; Story, Post und TikTok ebenso (4 × 40, 20 × 3), ihr Satz jetzt als Texttafel in Everett (Feder, Akzent).
  - **Tab-Aufnahme:** der Ton kommt aus der Seite selbst in die Aufnahme (Export `tab({ audio })`), nicht mehr aus dem geteilten Tab – der kam nur in Chrome mit „Tab-Audio“, nie in Safari. Bei Filmen mit Tools im Einsatz steht die Tab-Aufnahme vorn und ist Vorgabe („MP4 mit der Oberfläche der Tools · Echtzeit“); MP4 bleibt wählbar und sagt, was ihm fehlt („die Tools nur als Vorschaubild“) – der Canvas-Export zeigt die Oberfläche der Tools nicht, daher „keine Sequenzen“ (erst ausgegraut; user: „es erscheint nur tab aufnahme“).
  - **Story-Ton:** in Chrome gemessen – die Story-MP4 (HMI, 0:16) hat eine AAC-Spur mit Ton (RMS 0,15, ab 4 s 0,16–0,18); ohne Ton war sie in Safari (user: „Die Story ohne Ton war in Safari exportiert“). Safari ist hier nicht zu bedienen, die Ursache daher nicht nachgestellt. Neu: nach jedem MP4 prüft der Composer, ob eine Tonspur da ist und mehr als Stille enthält, und sagt es im Hinweis – mit dem Weg (60 fps Bild für Bild oder in Echtzeit) und „ohne Ton … mit Ton in Chrome“, statt dass ein Film unbemerkt stumm bleibt.
- **DesignCampus: Texttafeln in Everett Bold – Motion Composer 0.5.13, Texttafel 0.1.3** (user, 26.10.2026: „kannst du bei designcampus case auch ein paar texttafeln einbauen. weiss/blau oder blau/weiss. schrift everett bold“; „Webfont TWK Everett Bold in brands/designcampus/fonts übernehmen – die Lizenz deckt die Demo-Seite“).
  - **Schrift:** TWK Everett Bold als Webfont (`brands/designcampus/fonts/`, woff2 und woff aus der TWK-Everett-Familie), `brands/designcampus/brand.css` mit `@font-face` – nur für Bühne und Export, nie für die UI; das Filmpaket setzt `font: 'TWK Everett'`. Der Motion Composer lädt jetzt die Schrift jeder Brand vorab (vorher nur DIN Rounded); die Texttafel kennt DesignCampus.
  - **Case Film „Botschaft“ (jetzt 60 s):** nach „made visual.“ der ganze Satz von Saul Bass als Texttafel weiß auf Blau (Feder, das letzte Wort als Akzent), vor dem Abspann sein Name blau auf Weiß (Zeilen).
  - Gemessen: Everett geladen und gesetzt (Laufweite „SAUL BASS“ 601 gegen Arial 556); beide Tafeln im Composer beim Springen geprüft, ohne Fehler.
- **Texttafel: Auftritte Feder und Zeilen, Akzent – Texttafel 0.1.3, Sequencer 0.5.8; Fehler aus d104b7b behoben** (user, 26.10.2026: „motion composer: texttafeln. sind etwas lahm, aufbau nach wörtern reicht nicht“; nach dem Entwurf: „B (Wort mit Feder) und C (Zeilen von links) als neue Auftritte einbauen, D als Akzent“).
  - **Feder:** jedes Wort steigt von unten als Feder (taktSwing, Rolle haupt) und kreuzt seinen Platz auf seinem Schritt, schwingt kurz über; das nächste startet, bevor das vorige steht (Überlappung). **Zeilen:** jede Zeile kommt von links in ihrem eigenen Band, eine nach der anderen (Richtung nach rechts). **Akzent** (Schalter): das letzte Wort – nicht sein Satzzeichen – mit der Rolle akzent, es wächst in seinen Platz und schwingt weiter über. Im Texttafel-Tool unter Bewegung; der Motion Composer übernimmt beides über den Bearbeitungsmodus.
  - **Fehler behoben:** beim Umzug des Grunds in den Core (setContentGround) hatte ein angehängter Kommentar in drei einzeiligen Funktionen die schließende Klammer geschluckt – Face Tracking, Texttafel und SVG-Animator luden im Commit d104b7b nicht. Nachgeprüft: alle 32 Seiten und Skripte des Projekts ohne Syntaxfehler.
- **Zeiger in der Größe des Tools; Film-Kachel lädt später – Library 0.9.21, Core 0.5.106** (user, 26.10.2026: zum Zeiger „entscheide du“; „ladezeit: preloading? buffern? erst kurz dann lang?“).
  - **Zeiger** (core `stageCursor(…).scale`): 22 px der Oberfläche, die er bedient – im Brandtools-Film über einem Tool auf 28 % jetzt 6 Bildschirm-px statt 22 (Faktor 0,277 gemessen), um die Spitze skaliert, der Klick-Ring mit. Der Motion Composer setzt ihn je Szene aus Maßstab und Kamera des ersten Felds.
  - **Film-Kachel des Motion Composers:** lädt erst, wenn sie in die Nähe kommt (400 px) und der Browser frei ist; bis dahin das Standbild, danach spielt sie sofort und die Bilder kommen nach. Gemessen lokal: erstes Filmbild 0,4 s nach dem Erscheinen der Kachel; 250 Dateien, 1,3 MB Skripte, im Browser-Cache beim nächsten Mal.
  - Abgleich: Tools mit den Marken auf der Bühne auf Library 0.9.21 (für sie ändert sich nichts – der Zeiger erscheint nur im Motion Composer), DesignCampus-Tools auf Brand Library 0.1.1.
- **Bewegte Vorschauen live aus der Engine – Library 0.9.20, Core 0.5.105; DesignCampus Brand Library 0.1.1** (user, 26.10.2026: „können die bewegten vorschauen nicht allgemein live erzeugt werden? im motion composer werden sie ja auch animiert angezeigt“ – „ja“; zur DesignCampus-Vorschau: „etwas gröbere auflösung (vor allem weniger zeilen)“, „deutlich flacher“, „keine bayernflagge“, „besser so“, „vorschau keyvisual motion bitte weiss/blau“).
  - **Tool-Kachel live** (core `toolTileLive`, tool.json „live“): Keyvisual Motion (THA, Engine Path), Keyvisual Motion (DesignCampus, Lattice) und der Motion Composer jeder Brand (Case Film über den Sequencer, mit den Skripten der Composer-Seite) zeichnen in der Kachel; das Standbild steht, bis die Engine da ist; bewegt nur sichtbar, still bei „Bewegung reduzieren“. DesignCampus Keyvisual zeichnet sein Standbild ebenfalls aus der Engine.
  - **Entfernt:** alle WebP-Videos – Face Tracking, Motion Composer (HMI, HELIO, THA, DesignCampus; zusammen über 30 MB), Keyvisual Motion (THA, DesignCampus), Live Camera; `previews` in den tool.json aufgeräumt. Open Graph bleibt `og.jpg`.
  - **DesignCampus:** Vorgabe der Brand 4 Spalten × 28 Zeilen (vorher 9 × 144), Hub 2 (vorher 8 – das Raster atmet jetzt 28 ↔ 14 Zeilen statt bis 3,5, wo es zur Bayernflagge wurde); Keyvisual Motion in der Kachel Blau auf Weiß.
  - **Prüfung:** `check-standard.py` – ein Motion-Tool hat „live“ mit einer Engine, die seine Brands bedient; kein Tool führt ein WebP-Video.
  - **Face Tracking – Engine Rig 0.2.5** (user: „Face Tracking: Image Gradient (Foto mit Verlauf) und darüber ein Gesicht aus Rig ohne eigenen Grund“): die Kachel legt zwei Instanzen übereinander – Image Gradient (Blobgradient × HMI) mit dem Foto von Image Gradient, darauf Rig × HMI mit einem Gesicht auf dem Gesicht (`live.under`, `live.box`). Lage am Foto gemessen (user: „versatz stimmt nicht“): Augen bei y 255, Mitte x 845, Mund bei y 345 von 1920 × 1080; Rig zeichnet Augen und Mund 120 Einheiten auseinander, also 0,8 px je Einheit – Feld 0,3109 / 0,0509 / 0,2583 / 0,4593. Rig kann dafür ein einzelnes Gesicht ohne eigenen Grund zeichnen (`single`, `ground: false`). Die untere Engine bekommt nur die fünf Argumente des Vertrags – ein sechstes heißt je Engine etwas anderes (Blobgradient: Beschnitt).
  - **Gemessen:** alle vier Dashboards laden ohne Fehler; live gezeichnet und in Bewegung: Motion Composer in HMI, HELIO, THA und DesignCampus, Keyvisual Motion in THA und DesignCampus, Face Tracking in HMI. Kein WebP mehr im Projekt; `check-standard.py` ohne Befund.
- **DesignCampus auf Core 0.5.104, Export 0.5.0, Library 0.9.19** (Bitte der Session „Speichern als Dialog“, 26.10.2026: „Core ist jetzt 0.5.104 … Engine Export 0.5.0 … Library 0.9.18 (Baustein Speichern: PDF in der Gruppe Bild …)“). `?v=` in Keyvisual, Keyvisual Motion und dem DesignCampus-Dashboard nachgezogen. Keine PDF: Lattice zeichnet auf Canvas, kein SVG. Mit dem geänderten Baustein Speichern geprüft (`scripts/beschnitt-messen.js` über den Dialog, 4K mit Beschnitt und Schnittmarken, beide Tools): innen 0 abweichende Pixel, Beschnitt 0 leere Pixel, Schnittmarken 472 von 472; `tool.json` „library“ 0.9.19. Das Motion-Thumbnail von Keyvisual Motion stärker verlustfrei komprimiert (`img2webp -lossless -q 100 -m 6`, dieselben 240 Bilder): 5,2 statt 6,2 MB; das des Composers 12,5 statt 12,8 MB.
- **Vektor-PDF mit TrimBox und BleedBox; Library 0.9.18, Core 0.5.104, Export 0.5.0** (user, 26.10.2026: „wäre pdf export auch möglich?“, „vektor PDF wäre wünschenswert“; zur Skizze: „Freigegeben wie skizziert: Runde 1 die sieben Vektor-Tools, Gradient mit Verlauf als PDF-Shading, Fontscale und Foto-Tools später.“).
  - **Engine Export** (`engines/export/pdf.js`, `EXPORT_ENGINE.pdf(svg, { w, h, bleed, marks, title })`): das SVG eines Tools als Vektor-PDF, ohne Bibliothek – Pfade, Grundformen, Transformationen, Füllregeln, Deckkraft, Clip-Pfade, Masken (Luminanz, als weiche Maske), Radial- und Linearverläufe mit Transparenz (PDF-Shading, die Deckkraft als weiche Maske), eingebettete Rasterbilder. 1 px = 1/300 Zoll wie beim PNG (3 mm = 35 px). TrimBox die Endfläche, BleedBox mit Beschnitt, mit Schnittmarken die MediaBox 5 mm größer, Marken 0,25 pt in `--print-mark` auf `--print-paper`. Nicht gelesen und gezählt: Text, Filter, Muster.
  - **Dialog** (core `initSaveFoot`, Baustein Speichern): PDF in der Gruppe Bild nach SVG, mit Beschnitt und Schnittmarken; ihre Größe in mm (`unit: 'mm'`).
  - **Tools:** Keyvisual 0.1.16 (Band läuft im Beschnitt weiter, Path 0.2.5 `runOnD`), Custom Type 0.2.18, Face Pattern 0.2.18 (weitere Gesichter im Rand wie beim PNG), QR 0.2.13 (QRCode 0.2.4, nur der Grund; die Unterschrift ist Text und fehlt in der PDF, der Dialog sagt „ohne Unterschrift“), Logo 0.3.4 (HMI, HELIO mit Aussparung über die Maske), Grid 0.2.19, HMI Arrows 0.4.5, Gradient 0.2.13 (BlobGradient 0.2.3; wie das SVG ohne Weichzeichner und Korn). Ohne Beschnitt baut jedes Tool sein SVG byte-gleich wie vorher (SHA-256 bzw. Länge vor/nach gleich). Fontscale und die Foto-Tools später.
  - **Gemessen** (`scripts/pdf-messen.py` mit `scripts/pdf-messen.js`: die PDF mit poppler bei 300 dpi gegen das SVG, wie Chrome es zeichnet): in allen 20 Läufen Boxen richtig, keine PDF-Fehler, nichts übersprungen. Pixel mehr als 32 von 255 auseinander (nur Kanten, zwei Renderer glätten verschieden): Keyvisual 4K 0,22 %, Custom Type 0,29 %, Face Pattern 0,20 %, Logo HMI 0,22 %, Logo HELIO 0,15 %, Grid 0,42–0,49 %, Arrows 0,78–0,85 %, Gradient 0 % (mittlere Abweichung 0,9); QR 1,7–2,5 % – 312 px bei 8-px-Modulen, fast alles Kante. Schnittmarken 944 dunkle Pixel (8 × 59 px, die 0,25-pt-Linie deckt zwei Pixelreihen). Nicht gemessen: der Raster-Fallback ohne Server.
- **DesignCampus: Saul Bass statt Mustertext** (user, 26.10.2026: „designcampus blindtext > saul bass“). Die Wörter der Filme sind jetzt der Satz von Saul Bass „Design is thinking made visual.“ – in den Daten der Brand (`brands/designcampus/film.js` → `words`: `claim`, `by`, `parts` Design · is thinking · made · visual.), statt des Programms der Einladung (Ankommen, Anfangen, Machen, Zeigen). Die Vorlagen lesen sie dort: „DesignCampus · Botschaft“ Design → is thinking → made visual. → die vier Teile im Raster → visual. → 6; Story, Post, TikTok „made visual.“ als Satz, ab 10 Takten „Design“ als dritte Stimme. Der ganze Satz in einer Zeile war als Figur zu klein zum Lesen (die Figur setzt eine Zeile; Breite begrenzt), darum steht er nur als vier Teile. Die Figur der Tools bleibt 6 (Vorgabe des Nutzers). Gemessen: jede Figur aller vier Vorlagen ist aus den Glyphen setzbar (kein Zeichen fehlt); das Motion-Thumbnail des Composers (0:16–0:24) neu gerendert, es zeigte noch MACHEN – jetzt „made visual.“, 240 Bilder, 8 s, 12,8 MB.
- **DesignCampus: bewegte Vorschaubilder für Keyvisual Motion und Motion Composer; Prüfung der Motion-Thumbnails** (user, 26.10.2026: „DesignCampus braucht noch ein Motion-Thumbnail“; Regel der Brand-Dashboards: Tools, deren Hauptaufgabe Bewegung ist, zeigen ein animiertes Bild, alle anderen ein Standbild). Wie bei den anderen Brands: animiertes WebP 896 × 504, 30 Bilder/s (33/33/34 ms), Bild für Bild aus der Engine nach der Zeit gezeichnet, verlustfrei, über `POST /__preview`, in `tool.json` → `previews.designcampus`. **Keyvisual Motion:** der Vorgabezustand (Weiß auf Blau, 9 × 144, Zeilen) mit einem Loop von 4 Takten, 240 Bilder = 8 s; Bild 240 pixelgleich mit Bild 0 (nahtlos), 6,2 MB. **Motion Composer:** aus „DesignCampus · Botschaft“ 0:16–0:24, die Szene MACHEN von Grenze zu Grenze (der Neustart ist ein gewöhnlicher Schnitt), 240 Bilder = 8 s, 12,9 MB. Die Dateien sind größer als die der anderen Brands (0,9–1,5 MB), weil sich das feine Raster in jedem Bild überall bewegt – gemessen: Composer 0:16–0:32 verlustfrei 30,8 MB, verlustbehaftet Qualität 90 88,2 MB (Keyvisual Motion 48,2 MB); Keyvisual Motion mit grobem Raster (19 Zeilen) verlustfrei noch 4,1 MB. Das Standbild `preview-designcampus.jpg` des Composers ist entfernt. **Prüfung** (`check-standard.py`, „vorschau …“): ein Tool, dessen erste Ausgabe ein Video ist (Keyvisual Motion THA und DesignCampus, Motion Composer), braucht je Brand ein animiertes WebP in `previews` (aus dem Dateikopf: VP8X mit Animation, mindestens zwei Bilder) – belegt mit einem absichtlich entfernten Eintrag (Befund „designcampus ohne bewegtes Vorschaubild“), danach wieder ok. Im Dashboard laden beide WebP in den Kacheln, Keyvisual zeigt sein Standbild.
- **DesignCampus: Speichern als Dialog mit Beschnitt 3 mm und Schnittmarken; Keyvisual 0.1.1, Keyvisual Motion 0.1.1, Lattice 0.1.1, Core 0.5.103** (Bitte der Session „Speichern als Dialog“, 26.10.2026: „Core ist jetzt 0.5.103 … Deine beiden Tools zeigen sonst den Dialog mit einer Reihe ‚Format‘ und ohne Beschnitt“). Beide Tools geben dem Dialog „Bild · PNG“ mit Größe (HD, 4K, 8K) und Beschnitt, Keyvisual Motion dazu „Video · MP4“ mit der Länge in Loops. Lattice zeichnet mit `state.bleed` Grund und Rauten über den Rand weiter, Raster und Figur bleiben auf der Fläche. Die Größe kommt aus dem Verhältnis des Formats statt aus der gerundeten Bühne (16:9 bei 3840: 2160 statt vorher 2159 px). Gemessen mit `scripts/beschnitt-messen.js` über den Dialog, beide Tools, 4K mit Beschnitt und Schnittmarken: Fläche innen 0 abweichende Pixel, Beschnitt 0 leere Pixel, Schnittmarken 472 von 472; Raster außerhalb der Figur gegen die DrawBot-Exporte weiter 99,5–99,9 %. `tool.json` „library“ 0.9.17.
- **Speichern als Dialog, Export mit Beschnitt; Library 0.9.17, Core 0.5.103, Export 0.4.0** (user, 26.10.2026: „vermutlich sollten wir das gesamte speichern als dialog umbauen (ähnlich preferences). so wird es übersichtlicher“; „also kein kontext menü mehr“; „Für alle Grafiken/Standbilder: Export mit Beschnitt ermöglichen. Default 3mm, muss angehakt werden. Marker optional“; auf die Rückfragen: „300 dpi für alle“, „Das Motiv läuft weiter“; zur Skizze: „Skizze freigegeben: eine Segment-Reihe je Gruppe, Kopieren als zweiter Knopf im Fuß, ausgegraute Segmente mit Grund. Bau es um.“).
  - **Dialog** (core `initSaveFoot`, Baustein Speichern): Speichern öffnet in allen 17 Tools einen Dialog auf der Fläche der Einstellungen, kein Kontextmenü mehr (auch nicht für die PNG-Größe). Eine Segment-Reihe je Gruppe (Video, Bild, dann Projekt, Stapel, Kontakt …), ein Format über alle Reihen. Darunter Größe (HD/4K/8K) und Länge (Loops) des Formats, rechts im Label die Maße der Datei. Was der Zustand nicht kann, steht ausgegraut, der Grund am Label der Gruppe und als Titel (`saveChoices` behält jetzt die Gruppe). Bei Standbildern (PNG, im Bildoverlay auch JPG) die Schalter „Beschnitt 3 mm“ (aus) und, nur dann, „Schnittmarken“. Im Fuß Kopieren (PNG, SVG) und Speichern. Motion Composer: Speichern im Kopf des Dock quer öffnet denselben Dialog (MP4 mit Größe HD/4K, Tab-Aufnahme, PNG, Projekt); ein Klick während eines Exports bricht weiter ab.
  - **Beschnitt** (Engine Export `png`/`jpg` mit `bleed`, `marks`; `BLEED` = 35 px = 3 mm bei 300 dpi, `SLUG` = 59 px = 5 mm): die Datei wächst um 35 px je Seite; die Engine des Tools zeichnet mit demselben Maßstab bis −35 … w + 35, die Fläche innen setzt die Export-Engine aus dem Bild ohne Beschnitt auf ganzen Pixeln ein. Grund: gemessen glättet Chrome eine Kante je nach Lage anders (Face Pattern um 32 statt 35 px verschoben: 4 Pixel um 64 von 255 auseinander; Grid mit SVG-Symbolen 16). Schnittmarken in einem weißen Rand von 5 mm, auf den Linien der Endfläche, vom Beschnitt nach außen; ihre Farben als Tokens `--print-paper`, `--print-mark` (`core/tokens.css`).
  - **Überstand der Engines:** Path 0.2.4 (Band, Ticker, Teilung, Puffer um den Rand; ein Bandende auf der Kante läuft durch den Beschnitt weiter, `runOn`), Rig 0.2.4 (weitere Gesichter im selben Raster, eigener Zufall nach den inneren), BlobGradient 0.2.2 (Felder und Körnung weiter, das Foto cover im selben Maßstab, dahinter gespiegelt), Overlay 0.1.2 (das gefilterte Bild im Rand gespiegelt), Glyphs 0.1.3, TypeScale 0.2.3, Tiling 0.3.4, FlowField 0.3.5, Dominoes und Shuffle (der Grund weiter – ihr Motiv hat einen Rand von mindestens 100 px bzw. einer Einheit und erreicht die Kante nicht), QRCode 0.2.3 (nur der Grund: weitere Module ergäben einen anderen Code), Sequencer 0.5.7 (Grund jeder Szene, Zellen an der Kante und ihre Tools mit `state.bleed`, Übergänge, Puls, Körnung – core `paintGrain` mit `bleed`). Ohne Beschnitt zeichnet jede Engine wie vorher (Pixel-Hash vor/nach gleich, je Gruppe gemessen).
  - **Tools:** Logo, Grid, HMI Arrows und Motion Composer speichern ihr PNG jetzt über die Engine Export (vorher `canvas.toBlob`); Kamera und Bildoverlay zeichnen das PNG neu statt die Bühne zu kopieren. Ohne Beschnitt: „PNG, nur Gesichter“ (Facetrack, transparente Ebene), WebP und die ZIP-Stapel. Versionen: Keyvisual 0.1.15, Keyvisual animiert 0.3.12, Kamera 0.2.11, Logo 0.3.3, Grid 0.2.18, HMI Arrows 0.4.4, Face Pattern 0.2.17, Facetrack 0.2.14, Custom Type 0.2.17, Fontscale 0.2.16, Gradient 0.2.12, Gradient Blend 0.2.11, Bildoverlay 0.2.9, QR 0.2.12, Motion Composer 0.5.13, SVG Animator 0.1.2, Texttafel 0.1.1; alle mit Library 0.9.17.
  - **Gemessen** (`scripts/beschnitt-messen.js`, neu: die echte Datei mit gegen die ohne Beschnitt, über den Dialog gespeichert): in allen 17 Tools inner 0 (innerMax 0), emptyRing 0, Schnittmarken 472 von 472 (8 × 59 px). Naht an der Endkante (Stufe über die Kante gegen eine Stufe innen): 0/0 bei Keyvisual, Grid, Logo, Arrows, QR, Texttafel, SVG Animator, Motion Composer; Keyvisual animiert 0,15/0,16; Kamera 0,35/0,41; Gradient mit Körnung 12,68/12,28; Gradient Blend 5,34/10,09; Face Pattern 181/0 – Rand und Abstand sind 200 px, im Beschnitt beginnt die nächste Reihe Gesichter. Nicht gemessen: Kamera und Facetrack mit echtem Kamerabild, die Videoexporte nach der Umstellung, Hell/Dunkel und ui-kpi des Dialogs.
- **Pattern Library: Links der Selbstprüfung in Tinte** (user, 26.10.2026: „warum ist diese farbe nicht aus dem styleguide?“): der Bausteinname in der Befund-Tabelle war ein Link ohne Klasse in der Farbe des Browsers; jetzt `.link-u` aus der Library. Library-Seite, Projekt- und HMI-Dashboard nachgemessen: kein sichtbarer Link mehr außerhalb der Tinte.
- **Grund des Inspektors bei Weiß auf Schwarz, aus dem Core – Library 0.9.19, Logo 0.3.5, Fontscale 0.2.17, Face Pattern 0.2.19, Icon Pattern 0.2.20, Arrow Pattern 0.4.6, QR 0.2.14, Face Tracking 0.2.15, SVG-Animator 0.1.3, Texttafel 0.1.2** (user, 26.10.2026: „der inspektor zeigt eine vollkommen falsche hintergrundfarbe“). Bei dunklem Inhalt hellt ein Tool seinen Grund auf (`pageBgForContentTheme` → `--ground-dark-content`), damit das schwarze Motiv eine Kante hat; diese acht Tools setzten das nur auf die Seite, der Inspektor blieb auf dem alten Grund (`--offset-bg`) – dunkler als alles um ihn. Zuerst in jedem Tool einzeln korrigiert – auf die Frage „bedeutet das: du nutzt die pattern lib nach wie vor nicht?“ („ja“) in den Core verlegt: `setContentGround(theme)` setzt den Grund für Seite und Inspektor; alle neun Tools, die einen Grund setzen (mit HMI Logo), rufen nur noch sie. `check-standard.py` meldet einen Grund, den ein Tool selbst setzt – mit einem eingebauten Verstoß belegt (Exit 1, danach 0). Gemessen in Logo, Face, Arrow, Icon Pattern, QR und Fontscale, hell und dunkel, vor und nach dem Farbwechsel: Seite = Inspektor (dunkel 28 → 44, hell 238).
- **Motion Composer 0.5.12: Brandtools-Film nach den Animationsprinzipien – Kamera aufs Ergebnis, Inhalt in Bewegung, je Tool eine Handlung** (user, 26.10.2026: „zu viel vor/zurück, monoton, ich sehe wie sich das UI verhält, aber nicht was das tool eigentlich macht. ich muss die visuellen auswirken in dne tools sehen können“; „Ja, bau den Brandtools-Film so um: Kamera aufs Ergebnis, je Tool eine eigene Handlung, wechselnder Rhythmus.“; „ständig vor/zurück ist keine gute option“; „bitte auf unsere animationsprinzipien stützten“; „der content muss sich bewegen, zusätzlich interkationen“).
  - **Kamera:** eine Fahrt im ganzen Film – das erste Tool steht einen Takt ganz, dann landet die Kamera auf seiner Bühne (Feder `taktSwing`, zwei Schläge Anlauf, kaum Überschwingen, auf der Eins des zweiten Takts) und bleibt; jedes weitere Tool öffnet schon dort. Kein Zurück. Der Ausschnitt ist die größte sichtbare Bühne des Tools (`.buehne`), eingepasst mit Rand; das nächste Tool wird unsichtbar, aber ausgelegt vorgeladen, so springt die Kamera beim Wechsel nicht.
  - **Inhalt in Bewegung:** die eigene Bewegung des Tools wird beim Öffnen eingeschaltet (Schalter „Bewegung“) – in 7 von 9 HMI-Tools; QR und Fontscale haben keine.
  - **Eine Handlung je Tool,** im Wechsel Farbfelder, Neue Variante, Format (fehlt sie, die nächste). Nach den Prinzipien statt des „wechselnden Rhythmus“: jeder Klick ein Schlag auf dem halben Takt (ein Format auf der Eins), der Zeiger läuft an und landet darauf; Halt – der erste Takt zeigt das Tool, wie es öffnet, zwischen den Schlägen steht das Ergebnis, der letzte Takt steht.
  - **Oberfläche daneben** (user, 26.10.2026: „auch palette verschieben, inspektor öffnen. speichern.“): je Szene eine Nebenaktion auf der Eins des letzten Takts, im Wechsel – die Palette am Kopf einen Schlag lang verschoben, den Inspektor geöffnet, den Dialog Speichern geöffnet (nie gespeichert). Ein Tool im Einsatz schreibt nichts in den Speicher des Browsers (Platz der Palette, Inspektor, Zustand bleiben die des Anwenders) und ist stumm.
  - **Dashboard und Motion Composer** (user: „auch das dashboard“; „und auch motion composer zeigen“): das Dashboard der Brand ist die erste Szene, der Zeiger geht im halben Takt über die Tools (zeigt, öffnet nicht – ein Klick startet ein Tool); der Motion Composer ist jetzt eine Szene wie die anderen Tools und spielt seinen Film, stumm.
  - **Ausschnitt** (user: „die bildausschnitte sind teilweise komisch, palette angeschnitten usw“): der Rahmen fasst die Bühne und alles, womit man sie bearbeitet – Palette, offener Inspektor, offener Dialog –, nie angeschnitten; gezoomt wird nur ab ×1,2. Bei HMI heißt das: ganze Oberfläche, nur QR rückt näher (×1,43).
  - **Gruppen und Hell/Dunkel** (user, 26.10.2026: „wir könnten auch gruppen/splitscreens verwenden. wechsel von dark und light mode“; „Ja, bau Gruppen und Hell/Dunkel so ein: A, B und C in der vorgeschlagenen Folge“; „bei split brauchen wir eine bessere abgrenzung. dark/light?“; „auch der wischeffekt über das UI dark/light wäre interessant“): jedes Feld einer Gruppe (2, 3) hält sein eigenes Tool mit eigener Kamera, die Seite mindestens 1100 px breit; der Zeiger arbeitet sie als Kaskade ab (Überlappung, `stagger` Schläge je Feld). **A Hell | Dunkel:** dasselbe Tool zweimal (`?modus=`), rechts eine Sechzehntel später. **B Wisch:** das Tool hell und dunkel übereinander, beide gleich geklickt; auf der Eins des letzten Takts wischt Dunkel schräg nach rechts über die ganze Oberfläche (Feder `taktSwing`, landet auf dem Schlag). **C Gruppe:** Felder abwechselnd hell und dunkel, damit sie sich abgrenzen.
  - **Was zuerst kommt** (user: „priorisiert werden sollten die tools und features, die auch im case-film gezeigt werden. QR z.b. ist eher eine ergänzung“; „facetracking lassen wir erstmal überall weg“; „der kamera dialog facetracking ist vollkommen uninteressant“; „auch hell/dunkel bzw. farbwechsel der visualisierungen können wir nutzen“): zuerst die Tools, die im Case Film der Brand arbeiten (aus ihren Sprites ermittelt), in der Folge Voll · B · A · C …; die Ergänzungen danach in möglichst gleichen Gruppen (HMI: Gradient + Image Gradient, QR + Type Scale); der Motion Composer zuletzt; Face Tracking in keinem Brandtools-Film. Die Farbe der Visualisierung (Schwarz auf Weiß ↔ Weiß auf Schwarz) ist jede zweite Handlung, in Gruppen die Handlung aller Felder.
  - Abgespielt (HMI, 1:12, ohne Fehler): Logo · Icon Pattern mit Wisch · Arrow Pattern Hell | Dunkel · Face Pattern · Gradient | Image Gradient · QR | Type Scale · Motion Composer; HELIO (1:04) und THA (0:48) bauen sich ohne Fehler. Beim Springen in der Zeitleiste (angehalten) rückt die Kamera in geteilten Feldern erst beim Abspielen heran.
  - Gemessen (HMI, Springen in der Zeitleiste): Kamera je Tool ohne Sprung, Zoom ×1,1–1,27 (die Bühnen füllen das Tool schon fast), QR ×3,2; Bewegung an, wo es den Schalter gibt; keine Fehler. Abgespielt (HMI, 1:36): Dashboard zeigt drei Tools, Format wechselt (Gradient Frei → 1:1, Arrows 16:9 → A4, Face Tracking), Speichern, Palette und Inspektor öffnen im Wechsel, ohne Fehler. Die Tab-Aufnahme nicht geprüft.
- **Motion Composer 0.5.11: Film „Brandtools“ – die Tools im Einsatz, mit Zeiger und Zoom; Library 0.9.17, Core 0.5.102, Sequencer 0.5.6, Export 0.3.2** (user, 26.10.2026: „motion composer: ich möchte zukünftig auch die tools im motion composer zeigen, mit simulierter mouse. d.h. ziel: pro brand ein weiterer case film (brandtools), dass die tools vorstellt, wie casefilm“; auf die Fragen: „Tab-Aufnahme im Browser“, „Gleiche Folge für alle“, „Pfeil, Klick als blauer Ring“, „takte sollten bei bedarf veränderbar sein. manche tools sind komplexer“; „Ja, der Zeiger so; bau den Brandtools-Film nach Plan“; „wäre es auch möglich zu zoomen um ausschnitte/details zu zeigen? optional. wäre für dramaturgie gut“).
  - **Vorlage „Brandtools“** je Brand (`templates.js`): Auftakt, je Tool der Brand eine Szene (Reihenfolge des Dashboards, ohne ausgeblendete), Logo; je Tool 4 Takte, in der Partitur länger oder kürzer.
  - **Tool im Einsatz** (Typ `tool-demo`): während seiner Szene liegt das echte Tool über der Bühne, seine Seite in Filmgröße auf die Bühne skaliert; der **Zeiger** (core `stageCursor`, neuer Teil der Marken auf der Bühne) fährt im Takt zu Farbfeldern, Format und „Neue Variante“ und klickt sie auf dem Schlag mit ihrem eigenen Klick – fehlt ein Element, entfällt der Schritt. **Zoomen** (Schalter je Szene, im Film an): die Kamera fährt einen Schlag vor dem Klick auf das Element (×2,2), hält einen Schlag und fährt zurück. Im Canvas (Partitur, MP4) steht die Vorschau des Tools mit seinem Namen.
  - **Speichern „Video · Tab-Aufnahme“** (Engine Export `tab()`): die Oberfläche der Tools ist HTML und geht nicht in den Canvas-Export; der Browser fragt einmal, ob er den Tab teilen darf, der Film läuft im Vollbild einmal in Echtzeit, auf die Bühne zugeschnitten (Region Capture), als MP4 oder WebM.
  - **Prüfung** „Breite = Länge“ wertet nur noch Breiten in Takten aus (die Ebene über der Bühne ist keine Partitur) – mit einem eingebauten Verstoß belegt (Exit 1, danach 0).
  - Gemessen: HMI 9 Tools (1:20), HELIO 7 (1:04), THA 4 (0:40), ohne Fehler; Zeiger trifft Farbe, Format und Würfel in 6 von 9 HMI-Tools, 3 von 7 HELIO-Tools, 3 von 4 THA-Tools – Image Overlay (THA) hat keins der drei Elemente. Abspielen und Tab-Aufnahme brauchen die sichtbare Seite; geprüft beim Springen in der Zeitleiste, die Aufnahme selbst nicht.
- **Motion Composer: Story, Post und TikTok auch für DesignCampus** (user, 26.10.2026: „Ja, Story, Post und TikTok auch für DesignCampus anlegen, sobald die Social-Vorlagen der anderen Session stehen.“). In `tools/case-film/templates.js` (`SOCIAL_PARTS.designcampus`, `designcampus-story`, `-post`, `-tiktok`): das System als Haken aus Lattice-Sprites (die 6 Weiß auf Blau, die 6 Blau auf Weiß, ZEIGEN), der Satz als Figur (MACHEN), zum Schluss wieder die 6 – das Raster kann nicht zum leeren Grund gehen, so schließt die Schleife an ihren Anfang an. 5 Spalten statt 9: alle drei Formate sind 1080 px breit, eine Raute bleibt so lang wie im 16:9-Keyvisual (216 statt 213 px; mit 9 Spalten wären es 120 px gewesen). Gemessen: jede Vorlage baut sich bei 5, 8 und 15 (TikTok 30) Takten; Story und TikTok 1080 × 1920, Post 1080 × 1350.
- **Neue Brand DesignCampus; Engine Lattice 0.1.0; Keyvisual 0.1.0 und Keyvisual Motion 0.1.0 für DesignCampus; Motion Composer mit DesignCampus** (user, 26.10.2026: „DesignCampus als neue Brand anlegen. Siehe Ordner. Keyvisual, Keyvisual Motion und Motion Composer. Keyvisual Blau/Weiss, Weiss/Blau, Schwarz/Weiss, Weiss/Schwarz“; nach der Skizze: „Ja, neue Engine Lattice wie skizziert. Ziffer frei wählbar, Rauten-Favicon, Keyvisual und Keyvisual Motion als neue Tool-Ordner auf Lattice.“; „Ziffer ist per Default 6 aber Änderbar“; „website liegt auch unter designcampus. hier findest du auch icons usw“).
  - **Quellen** (`brands/designcampus/quellen/`, nicht in git, README dort): Einladung DCB6, Web-Sketch `diamonds/`, DrawBot `diamonds.py` mit Exporten, die Website designcampus.tha.de.
  - **Engine Lattice** (`engines/lattice/`): Rauten in Spalten × Zeilen (Spitzen auf den Mitten der Zelle, von oben links gelegt wie `diamonds.py`), darüber die Figur in Exklusion (XOR: wo sie eine Raute deckt, tauschen Grund und Farbe); auf dem Takt atmen Zeilen, Spalten oder Maßstab über einen Loop, die Rauten wachsen um den Hub und zurück, nahtlos. Instanz `DT_ENGINES.add('lattice', brand)`, Sprite `designcampus-lattice`. Keine Werte in der Engine – Paarungen, Grenzen, Vorgaben aus der Library. Keine vorhandene Engine rechnet das (Path: Bänder mit Schrift; Tiling: Plätze aus einem Symbolvorrat).
  - **Brand** (`brands/designcampus/`): `brand.json`, Brand Library 0.1.0 (8 Bausteine Atom bis Vorlage, 5 Regeln, 6 Wörter), Dashboard und Starter, Icons der Website (favicon.svg bettet ihr 512-px-Icon ein), `og.jpg`, Eintrag in `brands/index.json`. Paarungen Blau auf Weiß · Weiß auf Blau · Schwarz auf Weiß · Weiß auf Schwarz; Blau `#0000FF`. Vorgabe 9 Spalten × 144 Zeilen (`diamonds.py`), Weiß auf Blau, Figur 6, 90 % der Höhe (Website).
  - **Schrift der Figur: TWK Everett Extrabold, als Glyphenpfade** (`brands/designcampus/glyphs/everett-extrabold.js`, neu `scripts/build-glyphs.py`) – wie THA Everett ohne Schriftdatei. Gemessen (Deckung der Pixel): die 6 der Website ist Everett Extrabold zu 99,8 % (Bold 84,6 %, Black 88,4 %); die Engine zeichnet sie zu 99,1 % wie die Website. Die 6 des früheren Sketches und DrawBot-Skripts war Inter 900 (99,7 %) – durch die der Website ersetzt.
  - **Tools** (`tools/lattice-keyvisual/`, `tools/lattice-keyvisual-motion/`, im Dashboard „Keyvisual“ und „Keyvisual Motion“): Format, Figur, Farbe (vier Farbfelder), Raster (Spalten, Zeilen); Motion dazu Bewegung (Zeilen · Spalten · Maßstab · Ruhe), Hub, Tempo, Länge, MP4 in Loops, einbettbar für den Composer. Speichern PNG (HD, 4K, 8K) bzw. MP4 und PNG.
  - **Motion Composer:** lädt DesignCampus (`brands/designcampus/film.js`), Vorlage „DesignCampus · Botschaft · 52 s“ (`designcampus-botschaft`): die 6 und das Programm der Einladung (Ankommen, Anfangen, Machen, Zeigen) als Figur, die vier Paarungen im Wechsel. Keine Texttafel – es gibt keine Webfont für DesignCampus. Sequencer und Composer führen DesignCampus in `brands`.
  - **Prüfung:** `check-standard.py` prüft jetzt die Dashboards aller Brands aus `brands/index.json` (vorher drei fest genannt); Projekt-Dashboard, Liste: „Version doppelt“ nur in Name, Art und Text – der Status „abgeglichen mit DesignCampus 0.1.0“ löste bei Lattice 0.1.0 einen Fehlalarm aus.
  - **Gemessen:** `check-standard.py` – DesignCampus, Lattice, beide Tools ok; Library-Seite `?marke=designcampus` „Selbstprüfung: 8 Bausteine der Marke, … ohne Befund“; Lattice gegen die DrawBot-Exporte (1 Spalte, 5–56 Zeilen) 96,9–97,3 % gleiche Pixel (der Rest: DrawBot streckt die Ziffer nach der PDF-Seite); jede Paarung zeichnet genau ihre zwei Farben; Bewegung 144 → 18 → 144 Zeilen über den Loop, Anfang = Ende.
- **Motion Composer 0.5.10: Vorlagen Story, Post und TikTok für THA, HMI und HELIO; Sequencer 0.5.5** (user, 26.10.2026: „Motion Composer: bitte jeweils auch Template für Social Media, Story, Post und TikTok“; auf die Fragen: „Oberbegriff“, „4:5, 1080 × 1350“, „Einstellbar, Start 16 s“, „Haken zuerst, dann Schleife“).
  - **Engine:** drittes Format `post` 4:5 (1080 × 1350) neben 16:9 und 9:16.
  - **Vorlagen** (`tools/case-film/templates.js`, `<brand>-story`, `-post`, `-tiktok`): zuerst das System als Haken (es baut sich in den ersten 2 s auf), eine zweite Stimme des Systems, ein Satz, dann geht das letzte Bild zum leeren Grund (Logo bzw. THA-Keyvisual mit Abbau) – von dort baut der Haken wieder auf, die Plattformen wiederholen das Video. 8 Takte = 16 s; Story und Post 5–15 Takte (10–30 s), TikTok 5–30 Takte (10–60 s); ab 10 Takten kommt eine dritte Stimme dazu. Story und TikTok 9:16, Post 4:5. THA setzt den Satz als Keyvisual „Groß“: sein Text-Band läuft auf einer geraden Linie und wäre hochkant winzig.
  - **Composer:** „Vorlage“ ist jetzt eine Auswahlliste (fünf passen nicht in eine Segment-Reihe); die Länge mit den Grenzen der gewählten Vorlage; die Bühne wechselt Breite und Höhe (vorher nur die Breite – 4:5 stand als 9:16 da).
  - Gemessen: HMI und HELIO je fünf Vorlagen, THA vier, alle rendern ohne Fehler; Story und TikTok 1080 × 1920, Post 1080 × 1350 (Bühne 720 × 900), je 0:16 zum Start, mit Stepper „Länge“.
- **Pattern Library: Selbstprüfung in der Schrift der Seite** (user, 26.10.2026: „falsche schriftgrösse“): Die Zeile stand als Absatz in einem eigenen Kasten und erbte so die 16 px des Browsers statt der 12 px (`--fs-label`) der Absätze darüber; jetzt ein Absatz der Seite. Gemessen in der UI-Library, HMI und THA: 12 px.
- **Optionsleiste am Tool und Bearbeitungsmodus aufgeräumt; Motion Composer 0.5.9, Library 0.9.16, Core 0.5.101** (user, 26.10.2026: „das panel ist noch nicht gut, abstände zu eng, unklar worauf es sich bezieht, unübersichtlich“; „Ja: Optionsleiste mit Name, Länge und Bearbeiten (Carbon edit + Wort), Pfeil aufs Tool; das Symbol edit in die Library aufnehmen“; „bei tool bearbeiten fehlt für mich ein deutliches speichern/übernehmen. z. leiste unten über ganze breite mit button“).
  - **Optionsleiste** (core `openStageOptions` mit `title`, `sub`): oben der Name des Tools mit Akt und Startzeit, darunter nur Länge und „Bearbeiten“ (Symbol Carbon `edit` und Wort, in Tinte), 16 px zwischen ihnen, ein Pfeil auf das Tool. Akt, Übergang, Aufbau, Abbau und Löschen sind weg aus der Leiste – sie stehen im Inspektor, der Akt ändert sich durch Ziehen, Löschen ist das ×. Gemessen: der Pfeil sitzt 0 px neben der Mitte des Tools.
  - **Bearbeitungsmodus:** unten eine Leiste über die ganze Breite, „Verwerfen“ und breit „Übernehmen“, immer sichtbar; ohne Änderung führt „Übernehmen“ nur zurück. Gemessen: die Leiste schließt unten bündig ab und ist so breit wie der Modus.
  - **Symbol `edit`** in der Inventur der Library (`patterns/symbols.json`); dabei fielen `chevron--right` und `copy` heraus, die der Composer seit `bbf832b` nicht mehr nutzt.
- **Motion Composer 0.5.8: Vorlage „Messe“ für HMI und HELIO, Hochformat, 4K; Sequencer 0.5.4, FlowField 0.3.4** (user, 26.10.2026: „für HMI und HELIO brauche ich nun doch ein zweites dramturgisches preset: hochformat, export als 4K möglich? dauer 30-45 sek, am besten veränderbar“; „ich würde gerne presets auswählen: Case Film, Messe“; auf die Fragen: „9:16, 2160 × 3840“, „Schleife ohne Geschichte“, „Stepper Länge 30–45 s“, „4K beim Speichern wählbar“; „bitte jeweils für HELIO und HMI ein Beispiel erstellen“).
  - **Engine Sequencer:** ein Film hat ein Format (`wide` 1920 × 1080, `tall` 1080 × 1920); Schrift misst sich an der kurzen Seite (im Querformat unverändert); geteilte Szenen stehen hochkant untereinander; 4K ist dasselbe Bild mit Faktor 2.
  - **Vorlage Messe** (`tools/case-film/templates.js`, `hmi-messe`, `helio-messe`): eine Schleife – das Logo steht, das System spielt (HMI: Raster, Pfeile, Gesichter; HELIO: Buchstaben-Raster, Pfeile, Raster), ein Satz, das Logo baut sich wieder auf und steht so wie am Anfang. 15 Takte = 30 s; jeder Takt mehr geht ans System, bis 22 Takte = 44 s (bei 120 BPM ein Takt 2 s). Neue Akte Marke und Botschaft.
  - **Composer:** im Reiter Projekt „Vorlage: Case Film | Messe“ (nur wo eine Brand beide hat; Cmd+Z holt den alten Stand) und bei Messe der Stepper „Länge“; die Bühne im Format des Films; Speichern „Video · MP4“ und „Video · MP4 4K“ (2160 × 3840 bzw. 3840 × 2160, auch für Case Film), PNG im Format. Projekt und gemerkter Stand behalten Format und Länge.
  - **FlowField:** in einer hochkant gestellten Fläche stehen die Pfeile hochkant, statt als Streifen in der Mitte.
  - Gemessen in HMI und HELIO: Messe 1080 × 1920, 0:30, Akte Marke · System · Botschaft · Marke; Länge bis 0:44; 4K-Export startet (9 % nach 4 s) und lässt sich stoppen; keine Fehler.
- **Datenfluss: „Link kopieren“ bei jedem Dashboard** (user, 26.10.2026: „bei dashboards hätte ich gerne noch einen secondary button mit link kopieren. die URL nach dem schema: https://demo.danielrothaug.com/designtools/brands/tha“; „unter dashboard öffnen“). Im Panel eines Brand-Dashboards direkt unter „Dashboard öffnen“, als Handlung zweiten Rangs; kopiert `…/designtools/brands/<id>` – online von der Adresse der Seite aus, lokal die Adresse des Webspace. Gemessen: THA kopiert `https://demo.danielrothaug.com/designtools/brands/tha`, der Knopf sagt kurz „Kopiert“.
- **Core 0.5.100** – die Änderungen an `core/ui.js` und `ui.css` (Variante Marke, Farbtabelle) mit neuer Version im `?v=` jeder Seite, damit ein Browser online nicht die alte Datei aus dem Cache nimmt.
- **Brand Libraries ohne Darstellungsfehler, on brand** (user, 26.10.2026: „in brand libs gibt es zahreiche darstellungsfehler“; „die darstellung mit den grauen flächen ist unglücklich, weil es genau dadurch nicht mehr on-brand ist“). Gemessen vorher: in HMI ragten Farbe, Symbole, QR-Formen und Icon-Kachel aus ihrer Karte, in HELIO Farbe und QR-Formen, in THA die Farbpaarung – eine Reihe von Bildern brach nicht um und stand in der Breite des Docks (296 px). Jetzt: Variante Marke der Bild-Palette (`.chips.bilder.marke`, `brandAssets`) – jedes Asset in seiner Form auf dem Grund, ohne graue Fläche und Haarlinie, alle 64 px hoch, die Reihe bricht um; Bausteine mit Bildreihe oder Tabelle bekommen in einer Brand Library die breite Karte; die Farbnamen in Inter, der Hex-Wert in Mono. Gemessen nachher in allen drei: nichts ragt heraus, Selbstprüfung ohne Befund.
- **Open Graph mit voller Adresse** (user, 26.10.2026: „warum wird hier keine vorschau gezeigt (imessage)?“, „auch in slack keine vorschau“): Online lag ein älterer Stand ohne Open-Graph-Tags (`og.jpg` gab 404); iMessage und Slack brauchen dazu eine volle Bildadresse. `og:url` endet jetzt wie die geteilten Links auf `/`. Gebaut mit `SITE_URL=https://demo.danielrothaug.com/designtools`.
- **Datenfluss: Libraries und Dashboards im neuen Tab** (user, 26.10.2026: „libraries und dashboards > neues fenster“): „Pattern Library öffnen“, „Library der Brand öffnen“, „Dashboard öffnen“ und „Starten“ öffnen einen neuen Tab; der Datenfluss bleibt offen.
- **HELIO-Icon on brand, Starten im neuen Tab** (user, 26.10.2026: „das helio icon ist nicht on brand“; „dashboard links (starten) auf neues fenster oder neues tab“). HELIO steht auf Schwarz (Brand Library: „HELIO default auf schwarzen Hintergrund“): Favicon, PNGs, Apple-Touch-Icon und Open-Graph-Bild jetzt weiß auf Schwarz statt schwarz auf Weiß, gebaut wie das Logo der Brand sie setzt (user: „auch abstände/buchstaben“, „vor allem aussen“): Karte 384, die weißen Buchstaben H · E / LI · O, Abstand 24 auf dunklem Grund (`library.js` logo), der Block mittig – außen 78 statt vorher 24 von 264. Im Datenfluss öffnet „Starten“ das Brand-Dashboard in einem neuen Tab.
- **Thumb Face Tracking mit sichtbarem Verlauf, in voller Qualität** (user, 26.10.2026: „thumb-facetracking HMI: standbild ist abgedunkelt. wurde hier auch der farbverlauf eingeblendet? foto sieht etwas matschig aus“; dann: „facetrack thumbail: abdunkeln ist ok, aber auch farb-tint aktivieren“). Der Verlauf war an (Afterglow, Farbig abwedeln, 35 %), im dunklen Modus las er sich aber nur als violetter Schleier. Neu gerendert im dunklen Modus (abgedunkelt, weißes Gesicht) mit Afterglow auf 60 %: die Farben des Verlaufs sind zu sehen und folgen dem Kopf. Sonst wie zuvor: 896 × 504, 30 Bilder/s, genau ein Loop von 9 s (sechs Wechsel im Takt von 1,5 s; die Schleife beginnt, wo Schweben und Verlauf anschließen). Statt verlustbehaftet (Qualität 90, Farbe mit halber Auflösung) jetzt nahezu verlustfrei (near-lossless 60, volle Farbauflösung, PSNR 47,9 dB), 2,0 MB.
- **Detailliste vom 26.10.2026; Motion Composer 0.5.7, Library 0.9.15, Core 0.5.99** (user, 26.10.2026: „bitte fixen“).
  - **× erkennbar und mittig** (user: „x-icon auf weiss nicht erkennbar“, „das x sitzt nicht mehr mittig. stammt das aus der pattern lib?“): Das × von Palette, Farbfeldern und Partitur ist das Schließen-Symbol des Systems (`RM_ICON`) statt des Buchstabens „ד, gemessen 0 px aus der Mitte; ein Ring in der Grundfarbe hebt es von einem Feld oder Bild gleicher Farbe ab.
  - **Vollbild überall** (user: „canvas/bühne: bitte überall fullscreen (panels/inspektor verschwinden, bühne nutzt verfügbaren platz maximal)“; „vollbild bei composer zeigt nur leeres bild“): core `initStageFull` – ein Knopf an der Bühne und die Taste F, Esc zurück; Dock und Inspektor verschwinden, die Bühne nimmt den Platz (`stageRoom`). In 15 Tools eingebaut (Face Tracking hat sein eigenes); der Motion Composer nutzt es mit seinem Knopf in der Abspielleiste statt des eigenen Vollbilds eines Elements. Gemessen: Logo 493 → 779 px breit, Motion Composer 531 → 871 px, der Film läuft.
  - **Speichern zeigt alle Formate** (user: „wenn bewegung aktiv, entfallen bestimmte export funktionen … ausgrauen und alle zeigen“): core `saveChoices`; was der Zustand nicht speichern kann, steht ausgegraut mit Grund („nur mit Bewegung“ / „nur ohne Bewegung“). In Logo, Icon Pattern, Arrow Pattern, Face Pattern, Gradient, Gradient Blend, Face Tracking, Keyvisual. Die Regel „Abhängiges verschwindet“ nennt diese Ausnahme (Bausteine Schalter und Speichern).
  - **Motion Composer:** Beim Laden behält jedes Tool sein letztes Bild, bis das neue gezeichnet ist, und die Tonkurve wird sofort gezeichnet (user: „thumbails/audio blitzen beim aufbau/laden etwas“; gemessen: nach dem ersten Aufbau 1 von 19, dann 0 von 26 Flächen leer). Die Partitur liegt über dem Inspektor, ihr Schatten wird nicht mehr abgeschnitten (user: „schatten rechts wird abgeschnitten. partitur muss in den vordergrund“). Eingeklappt steht der Kopf mittig, 60 px hoch (user: „in minimal stimmt die höhe nicht. sieht verschoben aus“).
  - **Motion Composer: erster Reiter „Projekt“ statt „Dramaturgie“** (user, 26.10.2026: „ich würde den ersten punkt projekt satt dramaturgie nennen. darunter projekt öffen, später ggf. auswahl der dramaturgie“): darin „Projekt öffnen“.
  - **Gradient, Gradient Blend: alle Griffe sichtbar, solange „Griffe“ an ist** (user, 26.10.2026: „gradient: wenn griffe aktiviert, alle handels zeigen, damit man weiss, was man auswaählen kann“). Vorher zeigte die Ruhe nach der Regel „Ruhe: nur das Ergebnis“ nichts; der Code der Griffe war seit dem Umzug in den Core unverändert. Die Regel am Baustein Marken auf der Bühne nennt die Ausnahme.
  - **Datenfluss: alle Engines abgeglichen** (user, 26.10.2026: „diese sind noch nicht angeglichen“). Ursache (`dashboard/index.html`, `libsState`): BlobGradient kannte die Brand Libraries HMI 0.3.0 und HELIO 0.4.0, Glyphs und Overlay THA 0.2.0, die THA-Brand-Engines Ribbon und Alternates ebenfalls THA 0.2.0; die Libraries stehen auf 0.3.1, 0.4.1 und 0.2.1. Der Sprung (Commit 2829340) änderte nur die Beispiele der Library-Seite und den Grund (`ground`), nicht die Daten, die diese Engines lesen; `brandLibraries` sind nachgezogen. Neue Prüfung in `check-standard.py` (wie `libsState`): eine Engine oder Brand Engine, die eine ältere Library-Version kennt, ist ein Befund – belegt mit BlobGradient auf HMI 0.3.0 (Exit 1, danach Exit 0). Gemessen im Datenfluss: alle 16 Engines „abgeglichen“.
  - **Datenfluss, Liste: kein „undefined“, keine doppelte Version** (user, 26.10.2026: „in liste steht noch oft undefined, versionsnummer steht teilweise doppelt in beschreibung“). Ursache (`dashboard/index.html`, Liste): `n.tool` ist die Kennung des Tools, gelesen wurden `n.tool.version` und `phaseWord(n.tool)` – leere Version und „undefined“ als Phase in 23 Zeilen; Engines hatten keine Phase. Die UI-Library und die drei Prinzipien trugen „Version …“ als Beschreibung. Jetzt Version und Phase aus dem Feld selbst, Beschreibungen sagen, worum es geht; „1 Probe“ statt „1 Proben“. Die Liste prüft sich selbst und meldet „undefined“ oder eine doppelte Version als Status über der Tabelle – belegt mit zwei eingebauten Verstößen (13 Befunde), danach keiner.
  - **Arrow Pattern:** „Noise“ statt „Wirbel“ (user: „ich würde hier beim fachbegriff noise bleiben“); die Folge heißt „Links · Rechts · Mitte“, die langen Wörter stehen im Tooltip (user: „folge: arrows: zu breit. ggf. text kürzen“).
  - **THA Live-Kamera ausgeblendet** (user: „vorerst ausblenden, aber behalten“): `"dashboard": false` in tool.json; das THA-Dashboard und der Datenfluss zeigen sie nicht, die Dateien bleiben.
  - **Favicon** (user: „faviocon meiner website übernehmen: http://www.danielrothaug.com“, „auf brands das brand icon“): Projekt-Dashboard, Pattern Library und die Startseite des Pakets tragen das Icon von danielrothaug.com (`favicon/`); die Brand-Dashboards und die Tools behalten das Icon ihrer Brand.
  - **Favicon wirklich sichtbar** (user, 26.10.2026: „favicon (danielrothaug.com) wird scheinbar noch nicht übernommen“): Das Icon der Website ist ein Kreis in #111 auf Transparenz – in einer dunklen Tab-Leiste unsichtbar – und der Browser hielt das alte leere Icon fest. Jetzt zuerst `favicon/favicon.svg` (aus `safari-pinned-tab.svg` der Website; hell #111, im Dunkelmodus #eee), alle Adressen mit `?v=2`.
  - **Open-Graph-Vorschau** (user: „für alle brandtools und dashboards ogg vorschau einbauen“): jedes Tool, jedes Brand-Dashboard, das Projekt-Dashboard und die Library haben `og:title`, `og:description`, `og:image` (`og.jpg`, 1200 × 630, aus der Vorschau des Tools bzw. dem Icon der Brand) und `twitter:card`. `SITE_URL=https://… sh scripts/build-site.sh` macht die Bildadressen absolut und ergänzt `og:url`.
- **Motion Composer ausgeliefert** (user, 25.10.2026: „Ja, setz den Motion Composer auf ausliefern, so wie er ist. Texttafel und SVG-Animator bleiben in entwickeln.“): In `tool.json` steht jetzt die Phase „ausgeliefert“. Der Motion Composer hat keine Proben (`data-probe`: 0). Texttafel und SVG-Animator bleiben in „entwickeln“ und erscheinen nicht in den Dashboards.
- **Motion Composer 0.5.6: Prüfung vor der Auslieferung** (user, 25.10.2026: „fertig machen! möglichst ohne mich“). Geprüft in HMI, HELIO und THA: alle laden ohne Fehler, das Dock quer ohne senkrechtes Scrollen, die 5 Reiter passen. Speichern: PNG und Projekt werden erzeugt; MP4 läuft bis zum Ende (THA: 1:36, 1920 × 1080, 60 fps, 45 MB in 37 s) und lässt sich stoppen. Projekt speichern und öffnen behält Tools und Taktart (5/4 → 5/4, 10 Schläge auf 2 Takten). Bearbeitungsmodus öffnet das echte Tool und schließt wieder. Behoben:
  - Dateinamen `…_motion-composer_<brand>.png/.json/.mp4` statt `…_case-film_…`; die Meldungen sagen „Export läuft“ statt „Bild für Bild“.
  - Ein Klick in den Kopf des Docks (Speichern) hebt die Auswahl nicht mehr auf.
  - Gruppen starten geschlossen; vorher öffnete das Laden jede Gruppe, und das Dock wurde so hoch wie alle zusammen.
- **Partitur als Dock quer, wie die Palette; Taktart; Motion Composer 0.5.5, Library 0.9.14, Core 0.5.98** (user, 25.10.2026: „müsste die partitur nicht einfach eine querformatige palette sein?“ (24.10.), „ICH WILL SOWAS IN QUER!!! für die partitur“, „konrekt mit echten teilen, mit inspektor und allem drum und dram“, „wir müssen das jetzt schnell und effektiv zu ende kriegen“, auf die vier Fragen: „Ja, alles so“, „Alle mit Viertel“, „Nein, weglassen“, „Ja, bleiben“).
  - **Dock quer** (core `.dock.quer`, `initDockQuer`): Die Partitur ist das Dock der Tools, liegend unter der Bühne, 8 px vor dem Inspektor (user: „rechts kann panel näher an inspektor“). Ihr Kopf ist wie bei jedem Dock: „Motion Composer“ als Link zur Übersicht, Speichern, Rückgängig, Inspektor, Einklappen (user: „der header sollte wie sonst sein“). Speichern steht im Kopf statt im Fuß (user: „den speichern button nicht unten platzieren. das kostet zu viel platz“). Das Dock ist so hoch wie sein Inhalt, ohne Scrollen nach unten (user: „vertikales scrolling vermeiden“). Einklappen klappt nach unten (user: „panel verkleinern klappt nach unten“), und die Bühne weicht aus. Die Verhalten stehen nebeneinander und in `--fs-2xs` (user: „texte unten kosten viel platz“); der Klickbereich bleibt 24 px. Der Inspektor-Kopf bleibt leer, solange nichts gewählt ist. Gemessen: kein senkrechtes Scrollen (Inhalt 243 px, sichtbar 243 px), 8 px Abstand zum Inspektor, eingeklappt 52 px.
  - **Dock quer ohne Greif-Hand:** Es lässt sich nicht verschieben, darum zeigt sein Kopf keinen Verschiebe-Cursor mehr (user, 25.10.2026: „wenn nicht verschieber: dann muss cursor verschieben wegfallen“).
  - **Ziehen wie die Palette** (core `wireChipDrag`, von Palette und Partitur geteilt; `initPalette` nutzt es jetzt auch): Ein Klick wählt. Ziehen hebt das Tool an; an den Rand eines anderen gezogen ordnet es um, auch in einen anderen Akt; auf die Mitte gezogen macht es eine Gruppe. Ein × beim Überfahren entfernt. Eine offene Gruppe schließt sich, sobald etwas anderes gewählt ist. Markiert wird nur das Bild des Ziels (user: „bei drag and drop passieren noch seltsame dinge, random outlines“). Gemessen: Umordnen, Gruppe, ×, Rückgängig im Composer; Umordnen, × und Farbwahl in Gradient.
  - **Optionsleiste am Tool** (`openStageOptions`): Schalter und Stepper behalten ihr Aussehen aus der Library, die Leiste steht über dem Dock und links vom Inspektor und setzt keinen Fokusring (user: „das können wir so nicht lassen“, „das funktioniert so nicht“).
  - **Taktart als Freitext** im Reiter Ton: 2/4 bis 12/4 (film.bpb, die Engine liest es schon); die Schläge der Partitur stehen auf diesem Raster (`--bpb`), die Länge eines Tools geht schlagweise. Gemessen: 3/4 gibt einem Tool von 2 Takten 6 Schläge statt 8 bei gleicher Breite; 6/8 wird abgewiesen.
  - **Speichern-Menü:** Einträge sagen selbst, was sie sind („Video · MP4“, „Standbild · PNG“, „Projekt · JSON“); eine Gruppen-Überschrift steht nur über mehreren Einträgen (user: „wirklich übersichtlich ist das nicht“).
  - **Regel Figur und Grund** (docs/QS/3-UI-und-Patterns.md) angepasst: die Partitur schwebt als Dock quer.
  - **Prüfung** (`check-standard.py`, motion composer): die Partitur ist das Dock quer, nutzt `initDockQuer` und `wireChipDrag`, kein eigenes Ziehen und kein Inspektor unten – mit drei eingebauten Verstößen belegt (je Exit 1, danach Exit 0).
  - **Entschieden:** Symbol für neue Tools im Film bleibt das Plus (user, 25.10.2026: „ich würde ein generisches symbol für brandtool/sprite verwenden“; Wahl „A“). „Ton fein“ fällt weg: kein Regler für die Lautstärke im Video (user: „Nein, weglassen“). Die Gruppen im Speichern-Menü bleiben (user: „Ja, bleiben“), eine Überschrift aber nur über mehreren Einträgen.
  - **Partitur: Bilder nicht mehr riesig** (user, 25.10.2026: „die riesenbilder irriteren mich und brauchen extrem viel platz“): Jedes Bild ist so hoch wie das eines Tools mit 2 Takten (72 px, aus --partitur-bar). Lange Tools werden nur breiter, nicht höher; das Bild steht darin ungeschnitten (core/ui.css). Gemessen: Tool mit 4 Takten vorher 144 px hoch, jetzt 72 px.
  - **Zeitanzeige unter der Bühne auf der Skala** (user, 25.10.2026: „warum ist das so riesig > widerspricht designsystem“): Gemessen war sie 16 px groß, die Grundgröße des Browsers. Jetzt `--fs-label` (core/ui.css `.film-stage > .icon-row`).
  - **Inspektor des Films: 5 Reiter, Tempo im Reiter Ton** (user, 25.10.2026: „das ist zu breit und nicht erreichabr“, „A, zusammenfassen“): Gemessen brauchten die 6 Reiter 341 px, Platz war für 296 px. „Dramaturgie“ stand dreimal da, und „Botschaft“ war nicht änderbar; beides ist raus (user: „hier steht 3x dramaturgie: das ist schwachsinn“, „da seht botschaft, aber ich kann nichts ändern. auch unsinn“).
  - **Reiter Ton: Überschrift „Auf diesem Gerät“ entfernt** (user, 25.10.2026: „überschrift unnptig“). Metronom und Bild-Versatz stehen jetzt direkt unter „Reaktion auf Ton“.
  - **Speichern, MP4: „Bild für Bild“ / „Echtzeit“ aus dem Hinweis entfernt** (user, 25.10.2026: „bild für bild??“). Die Angabe 60 fps oder 30 fps sagt schon, wie das Video aufgenommen wird. Jetzt steht dort zum Beispiel „1:36 · 60 fps · mit Ton“.
  - **Library: „Case Film“ heißt in den sichtbaren Texten „Motion Composer“** (user, 25.10.2026: „wie heist das tool jetzt???“; „Ja, ersetze Case Film in den sichtbaren Texten der Library durch Motion Composer; Ordner und Kommentare bleiben.“). Geändert sind 8 Stellen in `patterns/blocks.js`; der Ordner `tools/case-film/` und die Code-Kommentare sind unverändert.
  - **Texttafel und SVG-Animator vorerst nicht in den Dashboards** (user, 25.10.2026: „voerst nicht in dashboards zeigen“). Ihr `tool.json` sagt `"dashboard": false`, und das Dashboard (core/ui.js `initBrandDashboard`) lässt solche Tools aus. Der Motion Composer findet sie weiter über `tools/index.json` und bearbeitet sie dort; ihr Platz in `brand.json` bleibt für später.
- **SVG-Aufbau wieder mit dem Übergang des Films; Sequencer 0.5.3** (user, 25.10.2026: „SVG animation ruckelt, easings greifen glaube ich nicht richtig“ – „wie in der alten version da hat das gut funktioniert“). Gemessen: seit Case Film 0.4.13 (23.10.2026, Hüllkurve) wuchs jedes Teil einer Grafik mit einer festen Feder in 5–7 Bildern (0,1 s) von 4 % auf voll und schwang bis 20 % darüber; die Beschleunigung des Films wirkte darauf nicht. Jetzt kommt jedes Teil wie davor mit dem Übergang des Films (Stil, Beschleunigung; `taktPhases` → `vis`); die Beschleunigung ändert den Aufbau messbar (größter Sprung je Bild: Gleichmäßig 3,3 %, Weich 4,3 %, Mit Schwung 4,5 % der Fläche).
- **Partitur in der Zeit: Breite = Länge; Motion Composer 0.5.4, Library 0.9.13, Core 0.5.97** (user, 25.10.2026: „Breite = Länge“ auf die Frage, wie die Partitur die Zeit zeigt; Plan vom 23.10.2026: „Platz für Akt-Spur, Lineal, Tonspur und mehrere Spuren untereinander“). Ein Sprite ist so breit wie seine Takte (Atom `--partitur-bar`, 64 px je Takt), ein Akt so breit wie seine Sprites; über jedem Akt sein Lineal (ein Strich je Takt, jeder vierte mit der Zeit), darunter die Tonkurve; die Schläge stehen, wo das Lineal sie hat (vier je Takt); eine geöffnete Gruppe zeigt ihre Tools als Spuren untereinander (Split-Screen). Gemessen: jeder Sprite beginnt auf seinem Takt (0 px Abweichung), jeder Akt ist Takte × 64 px. Prüfung (`check-standard.py`): Breiten nur aus `--partitur-bar`, jeder Akt mit Lineal – mit zwei eingebauten Verstößen belegt.
- **Motion Composer: Sprites im echten Tool bearbeiten; Texttafel und SVG-Animator als Tools; Motion Composer 0.5.3, Library 0.9.12, Core 0.5.96** (user, 25.10.2026: „ich will keine Augentests. Code und Fakten. Und den Composer-Umbau“; „Ja, leg die fünf Bausteine und die zwei Tools so an und setz den Plan um“; „standbild wäre ja auch eher ein SVG animator“; der Plan vom 23.10.2026).
  - **Optionen am Sprite:** ein Klick auf einen Sprite öffnet am Sprite die Leiste der Marken auf der Bühne (`openStageOptions`, jetzt auch mit Stepper, Auswahlliste, Schalter): Länge · Akt · Übergang · Aufbau · Abbau · Bearbeiten · Löschen.
  - **Bearbeitungsmodus** (neuer Baustein, `openEditMode`): Doppelklick oder Bearbeiten öffnet das echte Tool über dem Film (core/embed.js 0.2.0), mit ← und „Tool · Szene“; Verwerfen und Übernehmen erscheinen, sobald etwas geändert ist; Übernehmen gibt den Zustand des Tools über die Engine (`fromToolState`) an den Sprite. Einbettbar: Icon Pattern, Logo, Face Pattern, Arrow Pattern, Keyvisual Motion, Typesetter (`embedObject`/`embedLoad` für Tools mit einem Zustandsobjekt), Texttafel, SVG-Animator; `toToolState` in Tiling, Rig, FlowField, Path, Glyphs, HMI Dominoes, HELIO Shuffle.
  - **Keine nachgebauten Regler mehr:** `toolParams`, `paramsOf`, die Tool-Auswahlliste und die Textregler der Texttafel sind aus dem Composer entfernt; was der Film von außen setzt (Takt, Aufbau, Abbau), fragt er die Engine (`filmParam`). Die Bilder eines Sprites lädt die Engine (`picturesInto`, `graphicInto`).
  - **Texttafel und SVG-Animator** (tools/texttafel, tools/svg-animator): Instanzen der Engine Sequencer (Formen text und still, ein Film aus diesem einen Sprite), mit Dock, Inspektor, Rückgängig, Werte, PNG und MP4, in den Dashboards von HMI, HELIO und THA. Der SVG-Animator kann, was das Standbild konnte: Grafik in Teilen (Aufbau, Abbau, Schritt, Rhythmus, Pfeil wächst, Größe), Bild (Wechsel, Ken Burns, Schwarzweiß, Aufdruck) und große Zeichen. Der Sprite heißt in der Partitur SVG-Animator.
  - **Inspektor des Films:** Dramaturgie · Ton · Farbe · Tempo · Feinheiten · Werte; unter Feinheiten, was die Engine schon aus dem Film liest – Dynamik, Stil, Beschleunigung, Übergänge, Übergang, Übergangsdauer (jetzt mit dem Projekt gespeichert). Tempo als ganze BPM (user, 25.10.2026: „zahl ist zu gross“).
  - **Prüfungen** (`check-standard.py`, „motion composer“): jedes Tool mit Sprites ist einbettbar und seine Engine gibt den Zustand zurück; jeder Sprite der Brand Libraries hat sein Tool; der Composer baut keine Regler aus den Parametern eines Tools. Belegt mit vier eingebauten Verstößen (je Exit 1, danach Exit 0) – zwei schlugen zuerst nicht an und sind behoben.
- **Ziel 4 im Code: kein Tool zeichnet selbst** (user, 25.10.2026: „ich verstehe absolut nicht, warum du optisch prüfst. schau in den code!“; „räum es auf und mache es konsistent. was auch immer dafür notwendig ist“). Der Bildvergleich in „QS prüfen“ ist wieder raus. `check-standard.py` meldet jeden Zeichenbefehl auf einem Canvas in den eigenen Skripten eines Tools (`fillRect`, `arc`, `lineTo`, `drawImage`, `fillText` …) und ein Tool, das seine Engine nicht lädt. Was die Tools selbst zeichneten, ist unverändert dorthin verschoben, wo es hingehört:
  - **in die Engines:** Tiling `frame` (Icon Pattern), Rig `frame` und `drawBackdrop` (Face Pattern, Face Tracking), Path `paintBand` (Keyvisual), Glyphs `paint` (Custom Type, PNG), Overlay `drawOn` (Live Camera), BlobGradient `tint` (die Tönung in Face Tracking war ein Nachbau des Gradients), Export nimmt eine Bühne als `canvas`.
  - **in den Core, Baustein Marken auf der Bühne:** `drawStageRing`, `drawStagePath`, `drawStageSnaps`, `drawStageRaster`, `drawStageBox`, `drawStageDots`, `drawStageSquare`; Baustein Bühne: `paintGround`, `placeImage`, `copyImage` (Bilder kopieren, verkleinern, zuschneiden), `drawBlurred`; Partitur: `drawSoundCurve`.
  - **Engines vervollständigt:** QRCode, TypeScale, FlowField, BlobGradient lesen den Zustand ihres Tools (`fromToolState`); FlowField kennt Spalten, Zeilen und Wirbel des Tools; Arrow Pattern, Keyvisual und Live Camera laden die Engine Motion, auf der ihre Engines aufbauen.
- **Prüfungen für die vier Ziele; Library 0.9.11, Core 0.5.95** (user, 25.10.2026: „1. Die Pattern Library ist konsistent, modular und aufeinander aufbauend aufgebaut. 2. Alle Tools verwenden ausschließlich die Pattern Library. 3. Das Engine-Konzept ist vollständig. 4. Alle Tools arbeiten mit Engines.“; „Ja, Plan umsetzen, Entscheidungen 1–4 wie empfohlen“; zu den Bausteinen ohne Core-Verhalten „Ja, alle sieben“; zum Grund „Ja, heutige Werte“). Vorher meldete `check-standard.py` überall „ok“, las aber weder die Engines noch das JavaScript der Tools, und keine Prüfung sah nachgebautes Verhalten oder ob die Bühne das Bild der Engine ist.
  - **Ziel 1, Library:** `DT_WIRES` in `patterns/blocks.js` nennt je Baustein über den Atomen die Core-Funktionen seines Verhaltens (`[]` ohne eigenes, `page:<Datei>` nur auf einer Seite). `check-standard.py` meldet einen Baustein ohne Eintrag, ohne Funktion im Core, „Besteht aus“ mit unbekanntem Baustein und jede Abhängigkeit nach oben. Die Varianten-Zeile ist jetzt ein Organismus (sie enthält einen Abschnitt).
  - **Ziel 2, Tools:** `check-standard.py` liest auch die Skripte der Tools: nachgebautes Verhalten (Zustand eines Schalters, einer Segment-Reihe, einer Auswahl, eines Reiters von Hand; eigene Klicks auf Segment-Knöpfe und Schalter; Kacheln, Palette, Farbfeld, Stepper ohne Regler selbst gebaut), feste Farben, Schriftangaben und Hell/Dunkel-Weichen im Code und Farben im Markup.
  - **Neu im Core, aus den Tools verschoben, nicht neu erfunden:** `setSwitch`, `setModeRow`, `initTiles` (Kacheln, aus Grid, Logo, Faces, Facetrack, Custom Type), `initColorPopover`, `initPalette`, `initDialog` (aus Gradient und Gradient Blend, die sie zeilengleich doppelt hatten), `setPills`, `markChoice`, `setPressed`, `wireStepper`, `initInspTabs` (die Reiter des Inspektors, von Core-Inspektor und Motion Composer geteilt), `initBrandDashboard` (das Skript der drei Brand-Dashboards war dreimal kopiert), `desaturate`, `MASK`, `fontStack`, `brandGround`. `wireSwitch` liest seinen Zustand beim Klick am Element, sonst lief er nach `setSwitch` falsch. Farbfelder sind eine Segment-Reihe aus Farbfeldern (`mode-btn preset-btn`, `wireModeRow`); die Variante mit `.selected` in Keyvisual, Keyvisual animiert und Custom Type ist weg. `startOnBrandTheme` malt die Farbfelder Hell/Dunkel aus dem Grund der Brand. Keyvisual zeichnet Griffe, Mittellinie und Winkel-Etikett mit den Core-Funktionen (`drawStageHandle`, `drawStageLabel`, `STAGE_MARK`, `STAGE_NEUTRAL`), der Motion Composer nimmt `pairSwatch` statt einer Kopie.
  - **Grund je Brand:** `ground` in der Library jeder Brand (THA 0.2.1, HMI 0.3.1, HELIO 0.4.1) mit den heutigen Werten: hell Weiß/Schwarz, dunkel Schwarz/Weiß, dazu die Druckfarbe der Mockups (#111111/#EEEEEE, user, 23.10.2026). Tools und Engines lesen ihn über `brandGround(brand, theme)`.
  - **Ziel 3, Engines:** `check-standard.py` prüft jede Engine und Brand Engine: in `engines/index.json`, `engine.json` vollständig (ein Dienst wie Export und Motion: `service`), die Datei da, keine feste Farbe, Schrift oder Hell/Dunkel-Weiche, eine zeichnende Engine meldet ihre Instanzen an, jede Brand Engine sitzt auf einer Engine, jedes Tool nennt eine Engine, die seinen Brands dient. Behoben: Tiling, FlowField, QRCode, TypeScale, Rig, Path, Sequencer, HMI Dominoes, HELIO Shuffle nehmen Grund und Schrift aus der Brand Library (Versionen je +0.0.1); der Sequencer meldet seine Instanzen selbst an (`register`), der Motion Composer gibt nur, was er hält.
  - **Beweis:** je Ziel ein Verstoß eingebaut, Prüfung schlägt an (Exit 1, mit Stelle), entfernt, Datei byte-gleich, Exit 0. Alle Tools haben neue Versionen und sind mit Library 0.9.11 und den Brand Libraries abgeglichen.
- **Fertigstellen: Partitur als Inspektor unten, Brand Libraries, Referenzbilder, QS sichert die Libraries; Core 0.5.94** (user, 25.10.2026: „fertigstellen“; „ist die Konsistenz auch bei Brand Libs sichergestellt?“; „können wir die Überprüfung der Library auch sicherstellen?“). **Partitur:** der Inspektor an der Unterkante (`.inspector.unten`, neue Core-Funktion `initEdgePanel()`): Griff an der Kante, Kopf mit Titel und Einklappen, ein Drittel hoch; keine eigenen Klassen mehr im Motion Composer. Schläge 8 px über den Verhalten und kräftiger, die Länge steht nicht mehr doppelt unter dem Bild (user: „Abstand Punkte/Verhalten zu eng. Info Takte redundant. Kleine Takte kaum zu erkennen“); ein zwischengespeichertes Bild erschien nach dem Überfahren klein in der Ecke – behoben. **Brand Libraries:** jedes Beispiel aus der Engine der Marke (`brandStill`) oder ihren Dateien (`brandAssets`, `brandSwatches` – Core), nur aus UI-Bausteinen, jeder Baustein über den Atomen mit „Besteht aus“; Selbstprüfung auch auf den Brand-Seiten. **Referenzbilder und Markenprüfung** probiert und wieder entfernt (user: „überprüfe nicht den Output, sondern stelle sicher, dass du dich an die Libs hältst und ausschließlich daraus bedienst“). **QS:** „QS prüfen“ liest die Selbstprüfung der UI-Library und jeder Brand Library; `check-standard.py` prüft die Beispiele zusätzlich statisch (kein `style`, „Besteht aus“, Beispiel vorhanden); eine Seite lässt sich in einem Modus öffnen (`?modus=light|dark`, applyThemePref), Übergänge laufen beim Messen nicht. **Bausteine:** Regler-Knopf mittig (−6 statt −8 px, Atome `--slider-knob`, `--slider-line`), − und + im Stepper mittig, Einheit im Zahlenfeld in Labelgröße, Abschnitts-Überschriften überall gleich, Dialog-Beispiel wie im Tool.
- **Pattern Library neu aufgebaut, Library 0.9.10, Core 0.5.92** (user, 25.10.2026: „die pattern lib muss 100%ig sein“; „Neu aufbauen: jedes Beispiel aus echten Bausteinen mit ihren Core-Funktionen, in echter Tool-Größe, Hell und Dunkel umschaltbar statt doppelt. Selbstprüfung ohne Befund und jeder Baustein im Bild geprüft“). Einzelheiten in `patterns/CHANGELOG.md`. Dazu: `initZones()` im Core (Keyvisual 0.1.13 nutzt sie), Tokens `--w-dock`, `--pad-dock`, `--gap-rows`, `--w-settings`; `wireSwitch`/`wireModeRow` nehmen auch ein Element. Das Zeichen der THA ist das Icon von tha.de (die alte rote Kachel ist ersetzt). Das Partitur-Panel ist zurückgenommen (aus kopierten Teilen gebaut). `scripts/check-library.py` ist durch die Selbstprüfung auf der Library-Seite ersetzt.
- **Befunde der Prüfung von Hand behoben; Core 0.5.91** (user, 25.10.2026, zum Abhaken gewählt: QR Code, Format „Frei“, Keyvisual Rückgängig, Fachwörter, Szenentypen, Live Camera Thumb, Referenzbilder). **QR Code:** Link und Beispielkontakt stehen in der Library der Brand (`qr.defaults.text`, neu `qr.example`); HELIO startet mit https://helio-hmi.com/ (user), der Kontakt ist bei beiden der von HMI (user: „beide identisch“); das Feld nimmt den Link der Brand, Zurücksetzen führt dorthin (QS E1-2, E2-3, E2-15). **Format „Frei“** ist eine Bühne wie die festen Formate (user: „wie die festen Formate“): Rahmen, Rand und Schatten, die Größe aus dem Platz neben dem Dock (`stageFree()`, `stageRoom()` ohne Ausnahme); in Logo, Gradient, Image Gradient, Typesetter, Keyvisual, Keyvisual Motion, Live Camera (QS E1-4, E2-13). **Keyvisual:** Rückgängig nimmt Band, Dock und Farbe in einer Geschichte zurück – über `initControlState` wie in den anderen Tools; neu `mark()`/`unmark()` für Änderungen auf der Bühne (QS E2-3). **Wörter:** Seed heißt Variante, Perlin heißt Wolken, Alternates heißen im Typesetter Varianten, HELIOs Permutation heißt Reihenfolge; Loop, fps und BPM bleiben (user, QS E2-2). **Motion Composer:** die Szenentypen tragen die Namen der Tools (Icon Pattern, Letter Pattern, Logo, Arrow Pattern, Face Pattern, Keyvisual Motion, Typesetter, Image Overlay) – aus den Brand Libraries.
- **Motion-Thumbs ohne Ruckeln und Dithering** (user, 25.10.2026: „auch die qualität der motion thumbs muss etwas besser werden. weniger ruckeln, kein dithering usw.“; „Ja, bitte so bauen: 2× Auflösung, flüssige Bildrate, genau ein Loop, verlustfrei für Grafik und hohe Qualität für Fotos. Hell/Dunkel bleibt pro Brand wie bisher.“). Befund: Keyvisual Motion und Face Tracking liefen mit 12 Bildern/s, Keyvisual Motion sprang an der Schleife (6 s waren kein Loop, das erste Bild leer); alle WebP waren verlustbehaftet und hielten Reste früherer Bilder (graue Spuren im Weiß, Blöcke und Säume an Kanten); 448 × 252 wurde in der Kachel (rund 360 px, auf Retina 720 Pixel) 1,6-fach hochgerechnet. Neu: alle fünf in 896 × 504, 30 Bilder/s (33/33/34 ms, die Summe genau ein Loop), Bild für Bild aus der Engine nach der Zeit gezeichnet. **Keyvisual Motion** (THA): Laufschrift auf 4 Takten, genau ein Loop von 8 s, nahtlos; verlustfrei, 1,5 MB. Der Große Text der Vorlage hat einen Loop von 70 s und passt nicht in ein Vorschaubild. **Face Tracking** (HMI): ein Zyklus von sechs Wechseln im Takt von 1,5 s, jedes Auge und der Mund wechseln einmal und zurück (echte Wechsel des Tools, die Wahl nicht dem Zufall überlassen), 9 s; das Schweben wiederholt sich nie, daher beginnt die Schleife dort, wo es am besten anschließt (der Sprung ist so groß wie ein gewöhnlicher Bildschritt); Foto: verlustbehaftet in Qualität 90 mit genauer Farbumrechnung (PSNR 40,7 dB in jedem Bild, keine Reste), 1,1 MB. **Motion Composer** aus „Botschaft“ in der heutigen Fassung, von Szenengrenze zu Szenengrenze, so ist der Neustart ein gewöhnlicher Schnitt: HMI 0:08–0:20 (Symbolize, Muster, Pfeile), THA 0:20–0:32 (Band, Made Visual.), HELIO 0:12–0:28 (Muster, Pfeile, Logo); verlustfrei, 0,9–1,4 MB. Dateinamen und `tool.json` unverändert; je Brand weiter ein Modus.
- **Bewegte Vorschaubilder nur für Motion-Tools; Stepper in der Größe der Labels** (user, 25.10.2026: „die Regel funktioniert leider nicht gut, manche Thumbs sehen in Bewegung nicht gut aus. Wir lassen es dabei: nur Motion-Tools bekommen Motion-Thumb“). Bewegt sind Keyvisual Motion, Motion Composer und neu Face Tracking (HMI: das Foto von Image Gradient, das HMI-Gesicht liegt auf dem erkannten Gesicht und wechselt im Takt). Logo, Gradient, Icon Pattern, Arrow Pattern und Face Pattern zeigen wieder ihr Standbild; ihre WebP sind entfernt, Bewegung beim Überfahren probiert und verworfen. Stepper (Block Stepper): der Wert hat jetzt `--fs-label` – außerhalb einer Schalterzeile, etwa beim Einsatz im Motion Composer, stand er mit 16 px größer als sein Label (user: „hier hat sich etwas seltsam verändert“; Folge der kleinen UI-Schrift als Vorgabe). Core-Stylesheet 0.5.90.
- **Pattern Library in Hell und Dunkel; Library 0.9.9, Core 0.5.87** (user, 25.10.2026: „in der pattern lib fällt mir auf, dass dark/light zwar dokumentiert ist, aber die gesamte lib ist nicht ordentlich nach dark/light aufgebaut. Bitte recherchiere dafür Best Cases und baue die Lib entsprechend um.“; „Ja, bau die Library nach dem Vorschlag A–F um: Hell und Dunkel nebeneinander, Atome je Modus, Kontrast, QS je Modus.“). Recherche in `docs/Hell-und-Dunkel-Library.md`. **Modus-Bereich** in `core/tokens.css`: `data-theme="light"`/`"dark"` wirkt an jedem Element, dort werden Modus und alle Tokens, die aus `--dark` rechnen, neu ausgerechnet; Schrift, Form, Abstände und Bewegung bleiben an der Seite. Jede Baustein-Karte zeigt ihr Beispiel in Hell und Dunkel nebeneinander; die Atome je Modus mit dem echten Token als Muster, Werte „gleich in beiden Modi“ gekennzeichnet, dazu Modus und Kontrast je Modus (Befund: `--edit` hell auf dem Grund 4,2 : 1). **QS je Modus:** „QS prüfen“ vergleicht eine helle Seite nur mit den hellen Beispielen, eine dunkle nur mit den dunklen (`DT_QS.compare`). Die Knöpfe der Darstellung in den Einstellungen tragen ihren Wert jetzt als `data-theme-val` – als `data-theme` wurden sie selbst zum Modus-Bereich und „Dunkel“ stand weiß auf hellem Grund (user, 25.10.2026: „aktuell sind diese fehler sichbar. duch umbau der lib?“).
- **Bewegte Vorschaubilder; Kacheltexte sachlich** (user, 25.10.2026: „ich fände gut, wenn alle, die Motion erzeugen, auch bewegte Thumbnails hätten“; „‚Das Zeichen der Marke‘, das ist drüber. ‚Eigene Bilder …‘“; „Headlines grenzt ein, es ist auch nicht THA Everett, sondern die Custom Type“). Animierte WebP (448 × 252, 12 Bilder/s, 6 s, Schleife), gerendert aus der Engine-Instanz im Takt – sie zeigen genau die Bewegung des Tools: Logo und Icon Pattern (HMI, HELIO), Arrow Pattern (HMI, HELIO), Face Pattern (HMI), Gradient (HMI, HELIO), Keyvisual Motion (THA); in `tool.json` → `previews` je Brand. Noch Standbild: Keyvisual (der Modus Zeichnen braucht den Pfad des Tools, aus der Instanz allein ergab er Bruchstücke – verworfen), Image Gradient (braucht ein Bild), Live Camera und Face Tracking (brauchen eine Kamera). Je Brand ein Modus (HELIO dunkel, HMI und THA hell); im dunklen Dashboard zeigt HMI daher hell. Die Kacheltexte nennen, was man bekommt, und ob statisch oder animiert („Logo-Varianten, statisch oder animiert.“, „Texte in der Custom Type der Brand, mit ihren Alternates.“).
- **Der Case Film heißt Motion Composer** (user, 25.10.2026: „Case Film/Brand Film trifft als Bezeichnung für das Tool nur bedingt zu“ – „ja, Motion Composer oder (vielleicht Movie Composer)“). Das Tool setzt die anderen Brandtools im Takt zu einer Sequenz zusammen – ein Case Film ist eins seiner Ergebnisse, nicht sein Name. Titel, Kopf des Inspektors, `tool.json` (`formerly`), Name der Instanz der Engine Sequencer. Ordner und ID `case-film` bleiben (gespeicherte Projekte).
- **Brandtools heißen nach ihrem Asset** (user, 25.10.2026: „lass uns bitte auch die Bezeichnungen der Brandtools aufräumen“; „sie richten sich an Anwender aus Design und Marketing … das Vokabular sollte on brand sein“; „nicht professionell genug“; „ja, aber Keyvisual in einem Wort“; „die Gruppen im Dashboard gefallen mir nicht“). Keyvisual, Keyvisual Motion (war Keyvisual animiert), Typesetter (Custom Type), Image Overlay (Bildoverlay), Live Camera (Kamera), Brand Film (Case Film), Logo, Icon Pattern (Grid; bei HELIO **Letter Pattern** – eine Brand nennt ihr Tool selbst: `names` in `tool.json`), Arrow Pattern (Arrows), Face Pattern (HMI Faces), Face Tracking (HMI Facetrack), Gradient, Image Gradient (Gradient Blend), QR Code (QR), Type Scale (Fontscale). In `tool.json` (`formerly` nennt den alten Namen), Seiten- und Dock-Titel, Dashboards, Datenfluss; die IDs bleiben, gespeicherte Stände gelten weiter. Gruppen im Dashboard probiert und wieder entfernt. Noch die alten Namen: die Szenentypen im Partitur-Menü des Films (sie kommen aus den Brand Libraries).
- **Datenfluss: weniger Linien, alle per Einstellung** (user, 25.10.2026: „die Node-Verbindungen werden nun sehr unübersichtlich, vermutlich durch die Mehrfachbezüge. Könnte man das vereinfachen, und z. B. in Preferences ‚alle Verbindungen zeigen‘ aktivieren“). Gezeichnet wird je Brandtool nur noch der Weg von seiner Engine (79 statt 144 Linien); die übrigen Engines und Brand Engines, die es mitbenutzt, und die UI-Library zu jedem Tool zeigt die neue Einstellung „Alle Verbindungen zeigen“ (Zahnrad im Datenfluss, Schalter des Blocks Einstellungen). Die Kette eines Felds beim Filtern bleibt vollständig. Der Sequencer nennt die Library-Stände, mit denen er geprüft ist (HMI 0.3.0, HELIO 0.4.0, THA 0.2.0) – sein Ring „nicht abgeglichen“ ist weg.
- **THA Band heißt THA Ribbon** (user, 25.10.2026: „THA Band heißt THA Ribbon, THA Alternates bleibt“). `brands/tha/engines/ribbon.js` (0.4.0), `brand.json` (id `ribbon`, `formerly`), Verweise in Keyvisual, Keyvisual animiert, Kamera, Case Film, Labor Arrangieren, Path, THA Library, README, Konzept; Zitate des Nutzers bleiben wörtlich. Bildvergleich: 0 Abweichungen (Keyvisual animiert, Custom Type). Der Regeltext der Library folgt nach der Sitzung Hell/Dunkel.
- **Brand Engines heißen nach ihrer Regel: HMI Dominoes, HELIO Shuffle** (user, 25.10.2026: „die Engines von THA, HMI und HELIO brauchen noch passende Namen“; „Adjacency finde ich noch nicht ideal“ – „ok“ zu Shuffle und Dominoes). HMI Dominos → **HMI Dominoes** (`brands/hmi/engines/dominoes.js`, 0.2.0), HELIO Kacheln → **HELIO Shuffle** (`brands/helio/engines/shuffle.js`, 0.2.0): Datei, Kopf, `brand.json` (mit `formerly`), Verweise in Grid, Logo, Case Film, Laboren, Brand Libraries, Tiling und Konzept. Die Namen der Regeln (`domino`, `rules`, `permutation`) bleiben. Bildvergleich Tiling: 0 Abweichungen. Noch nicht: der Regeltext der Library (`patterns/blocks.js`) – dort arbeitet gerade die Sitzung Hell/Dunkel; THA Band und THA Alternates offen.
- **Prüfung von Hand (QS ausführlich): 19 Fragen beantwortet, 7 Befunde; die Prinzipien sind abgeglichen** (user, 25.10.2026: „Mach die Prüfung von Hand – Prinzipien und UX an den echten Tools, Ergebnis in pruefung.json“). Alle 24 Tool-Instanzen im Browser, 1440 × 900 und 900 × 700, hell und dunkel; Regler und Text geändert und zurückgenommen, „Letzten Zustand merken“ mit Neuladen, echte Klicks und Tasten in Keyvisual, QR, Logo; Gemessenes und Urteil getrennt in `docs/QS/pruefung.json`. **Befunde:** QR für HELIO kodiert als Vorlage `hmi-project.com`, das QR-Tool trägt eine HMI-Visitenkarte als Vorgabe; im Format „Frei“ liegt das Dock über dem Ergebnis (Logo: die Wortmarke darunter verdeckt; Grid, Gradient, Gradient Blend, Kamera); Keyvisual nimmt mit Rückgängig nur Punkte zurück, keine Einstellung; QR-Zurücksetzen lässt den Link; Fachwörter Seed, Perlin, Alternates, Loop, fps, BPM; es gibt keine Referenzbilder der Vorlagen. Ohne Befund: offenes Ergebnis beim Start, keine gesperrten Elemente, alles per Tab erreichbar und benannt, nichts springt, Dock passt hell und dunkel, breit und schmal. Die Befunde stehen im Konzept (5.1) als nächster Schritt.
- **Engine Sequencer: der Case Film ist ihre Instanz; Case Film 0.5.0; kein Tool mehr ohne Engine** (user, 25.10.2026: „Tools ohne zugrundeliegende Engines dürfte es gar nicht geben“; „bitte automatisch weitermachen“). `tools/case-film/engine.js` ist `engines/sequencer/engine.js` (0.5.0, `SEQUENCER_ENGINE`; `CF` bleibt der kurze Name des Case Films dafür), unverändert verschoben; dazu `instance(brandPack, envOf)` nach der Engine-API (name, params Tempo, Dynamik, Reaktion auf Ton, load, draw mit dem Film und seinem Moment). Weil Fotos, Ton und Brand-Pakete der Tool-Seite gehören, meldet sie je Brand ihre Instanz an (Sequencer × HMI, HELIO, THA). Die Labore Arrangieren, Choreografie, Hüllkurve laden die Engine von dort. **Bildvergleich: 0 Abweichungen** – die erste Minute der Vorlage jeder Brand, je 40 Bilder. **QS prüfen** wartet bei einer Tool-Seite, bis sie fertig geladen ist (Bühne gerahmt, gewählte Segmente gefüllt; höchstens 6 s): ein Lauf bei verdeckter Browser-Ansicht hatte halb geladene Seiten verglichen und Bühnen ohne Rundung gemeldet; eine Seite, die sich nicht fragen lässt, wird verglichen, wie sie ist. Letzter Lauf bei sichtbarer Ansicht vor dieser Änderung: 1 Befund (Kamera, Segmente noch nicht gefüllt, solange die Erkennung lädt) – den fängt das Warten ab; der Lauf danach lief bei verdeckter Ansicht und ist nicht fertig geworden.
- **Kopieren: PNG und SVG in die Zwischenablage; Export 0.3.0** (user, 25.10.2026: „Export soll auch Copy/Paste können (PNG oder SVG)“). Das Speichern-Menü jedes Tools bietet zu seinem PNG und SVG je „PNG kopieren“ und „SVG kopieren“ (Zwischenablage) an – einmal im Core (`initSaveFoot`), kein Tool geändert. Das Tool zeichnet wie beim Speichern, die Engine Export legt das Ergebnis dann in die Zwischenablage statt es herunterzuladen (`EXPORT_ENGINE.toClipboard`): PNG als Bild, SVG als Text und, wo der Browser es nimmt, als Bild; eine Meldung sagt „PNG kopiert – zum Einfügen in Figma, Keynote …“ oder, wo der Browser es nicht kann, „bitte speichern“. Geprüft mit echten Klicks in Chrome: QR (PNG und SVG) und Keyvisual (PNG in 3840 px). Nicht geprüft: Safari und Firefox – dort braucht das Schreiben in die Zwischenablage strengere Bedingungen; dann erscheint die Meldung statt des Kopierens.
- **Engine Motion: Takt, Tween, Phasen** (user, 25.10.2026: „evtl. müsste man auch Motion als eigene Engine betrachten, zusammen mit Takt“; „bitte automatisch weitermachen“). `core/takt.js` ist `engines/motion/engine.js` (0.1.0), dazu die Easings und Übergänge (`EASINGS`, `TRANSITION_STYLES`) aus `core/ui.js`; `MOTION_ENGINE` fasst sie als eine Fläche zusammen, die Funktionen behalten ihre Namen (`taktAt` …). Unverändert verschoben; 29 Dateien laden Motion statt des Takts. Konzept §3.7: Motion bewegt, zeichnet nicht. **Bildvergleich: 0 Abweichungen** – 8 bewegte Instanzen (HMI und HELIO Grid und Logo, HMI Arrows, HMI Faces, Keyvisual animiert, Custom Type), 4224 Bilder über ihre Parameter mit Vorgaben, Ground und Momenten; bei Arrows zuerst Abweichungen, weil das Pfeilbild beim Ablegen noch lud – gegen einen Checkout des alten Stands in zwei Läufen 0. Geladen: Grid, Logo, Keyvisual animiert, HMI Faces, Facetrack, Case Film für alle drei Brands, HELIO Brand Library, Labore Choreografie und Hüllkurve. Noch nicht: die Engines nehmen ihre eigene Bewegung aus Motion.
- **Tiling: Grid und Logo sind eine Engine, mit den Formen Raster und Lockup** (user, 25.10.2026: „im Grunde entspricht es meiner Vorstellung, dass sich alle eine Engine teilen. Nur bei den Logos dürfen die bisherigen Regeln auf keinen Fall entfallen“; „Tiling aus Grid und Logo, mit Bildvergleich 0 Abweichungen“). `engines/tiling/` (0.3.0) ersetzt `engines/grid` und `engines/logo`: beide Formen sind unverändert hineingezogen, jede zieht ihre Zufallszahlen in der bisherigen Reihenfolge; gemeinsam sind die Einheit und die Anmeldung der Instanzen. Die Brand Engines melden ihre Regeln bei `TILING_ENGINE.raster` und `TILING_ENGINE.lockup` an (HMI Dominos: `domino` in beiden; HELIO Kacheln: `rules` im Raster, `permutation` im Lockup) – keine Regel der Logos entfällt. Die Engine-API kennt Formen: eine Instanz ist Engine × Brand × Form (`DT_ENGINES.add(engine, brand, inst, form)`), die Tools nennen `engine: tiling` und `form`. **Bildvergleich vorher/nachher: 0 Abweichungen** – 4 × 480 Bilder (HMI/HELIO Grid und Logo über Muster, Ground, Seed, Raster, Momente, Hüllkurve) und 2 × 4608 Bilder des Lockups über alle seine Parameter (Aufbau, Wechsel, Bewegung, Abbau, Abstand, Schriftzug, „Nur Gesichter“ bzw. „Fläche“). Geladen: Grid und Logo für HMI und HELIO, Case Film für alle drei Brands, die HMI Brand Library, Labor Arrangieren. QS: 1 Befund (Case Film ohne Engine).
- **Engines heißen nach ihrer Methode: FlowField, BlobGradient, TypeScale, Rig, QRCode** (user, 25.10.2026: „für die Namen der Engines braucht es passendere Namen, es sind ja Methoden. Z. B. ist Arrows doch eigentlich ein Noise-Field“; „die Engines würde ich englisch benennen, code-nah“; „sollten mit Code/Semantik zusammengehen“). Arrows → FlowField (0.3.0), Gradient → BlobGradient, Fontscale → TypeScale, Faces → Rig, QR → QRCode (je 0.2.0): Ordner, ID, globaler Name (`FLOWFIELD_ENGINE` …), Instanz in `DT_ENGINES`, `engine.json` (mit `formerly`), `engines/index.json`, `engine` und `uses` der Tools, Script-Verweise in Tools, Case Film und Labor. Die Tools und ihre IDs bleiben (HMI Arrows ist die Instanz FlowField × HMI; gespeicherte Zustände und Case-Film-Projekte gelten weiter), ebenso die Blöcke der Brand Libraries (sie benennen Inhalt: den Pfeil, die Gesichter). Geladen: Arrows für HMI und HELIO, Gradient, Gradient Blend, Fontscale, HMI Faces, Facetrack, QR für beide, Case Film für HMI und HELIO, Labor Arrangieren – jede Instanz vollständig. QS: 1 Befund (Case Film ohne Engine). Grid und Logo folgen als Tiling.
- **Die drei Engine-Branches zusammengeführt: Path, Engine-API für QR/Gradient/Fontscale, Glyphs und Overlay** (user, 25.10.2026: „führe … zusammen, löse die Konflikte, lass QS laufen“). Konflikte in Changelog, Konzept, `engines/index.json`, den `tool.json` von Bildoverlay, Custom Type, Kamera und in den Script-Verweisen von Kamera, Case Film und Labor Arrangieren: zusammengesetzt – Kamera lädt Path, THA Band und Overlay, der Case Film Path, THA Band und Glyphs; die alten `render.js` und `brands/tha/band.js`/`overlay.js` sind weg. Glyphs, Overlay und THA Alternates waren gegen die THA-Library 0.1.0 geprüft, nach dem Zusammenführen ist sie 0.2.0: Custom Type und Bildoverlay zeichnen mit ihr wie zuvor (angesehen), jetzt als abgeglichen mit 0.2.0 eingetragen. Jede Instanz erfüllt die Engine-API (12 Seiten geladen: die THA-Tools, Facetrack, QR, Gradient Blend, Fontscale, Case Film für THA und HMI). QS: 1 Befund – der Case Film hat noch keine Engine (wird der Sequencer). Die Library zeigt den Ring „nicht abgeglichen“ auch auf einem schwarzen Feld.
- **Engine Path: Vektor-Zeichnen; THA Band nur noch Regeln und Daten; Keyvisual 0.1.12, Keyvisual animiert 0.3.9, Kamera 0.2.9, Case Film 0.4.61, Bildoverlay 0.2.7, Custom Type 0.2.14; THA-Library 0.2.0** (user, 25.10.2026: „Tools ohne zugrundeliegende Engines dürfte es also gar nicht geben“; „die engines würde ich englisch benennen, code nah“; „auch THA Band ist ja zunächst nur eine Vektor-Zeichen-Engine“; „wenn ich z.b. zukünftig ein Brandtool für THA möchte, um Icons zu zeichnen, wäre das genau die Vorlage. Oder wenn für HMI neue Dingbats gezeichnet werden können“). **`engines/path/`** 0.2.0 (`PATH_ENGINE`, benannt wie Processings beginShape/PShape oder ein Illustrator-Pfad) zeichnet alles, ohne Marke: Punkte → Pfad mit Strichbreite, Ecken nach Winkel mit Radius, Schrift entlang des Pfads, Laufschrift, Maske eines Stücks, die Bewegungen (Ticker, Laufschrift, Zeichnen, Wandern, Texttafel) auf dem Takt, auf Canvas und als SVG-Pfad – aus `brands/tha/band.js` und `tools/keyvisual-animiert/render.js` (weg) unverändert übernommen. Das Datenmodell bleibt allgemein (eine Zeichnung aus Pfaden; offen oder geschlossen, Strich, wahlweise Fläche); gebaut ist der offene Strich. **THA Band 0.3.0** (`brands/tha/engines/band.js`) ist nur noch THAs Regelsatz auf Path – Grenzwerte der Ecken, Versalien in THA Everett – und meldet ihn an wie HMI Dominos bei Grid; die Daten (Paarungen, Versalhöhe ¾, Winkel und Längen erzeugter Bänder, Größen der Texttafel, Startzustand) stehen in `brands/tha/library.js` → `path`. Path macht daraus die Instanz Path × THA (`DT_ENGINES.add('path', 'tha', …)`, = `TAKT_TOOLS['keyvisual-animiert']`); Keyvisual, Keyvisual animiert und Kamera nennen `"engine": "path"` und laden die THA-Library; `THA_BAND` und `KV_ANIM` bleiben als Namen für die Seiten. „QS prüfen“ meldet die drei nicht mehr unter Engine-API; Bildoverlay und Custom Type mit der Library 0.2.0 geprüft (lesen sie nicht). Geprüft: dieselben Zustände vorher und nachher in einer Seite – 1280 Bilder der Instanz auf dem Takt, 96 Texttafeln, 864 Bänder (Regeln, Rundung, Breiten, Radien, erzeugte Wege, Masken, Schrift) und 864 Geometrien: 0 Abweichungen; Keyvisual und Kamera zeigen beim Laden dasselbe Bild; check-standard ok.
- **QR, Gradient, Fontscale nach der Engine-API; HMI Facetrack ist eine Instanz von Faces** (user, 25.10.2026: „Tools ohne zugrundeliegende Engines dürfte es also gar nicht geben“; „auch die API für die Engines/Tools fehlt“). QR 0.1.1, Gradient 0.1.1 und Fontscale 0.1.1 melden je Brand (HMI, HELIO) ihre Instanz an (`DT_ENGINES.add`, Konzept §3.7): `name` („HMI QR“, „HELIO Gradient“ …), `params` mit den Vorgaben der Brand aus ihrer Library, `load`, `draw(ctx, w, h, state, takt)` – das Bild eines Zustands, eingepasst in die Fläche; Gradient legt seine Felder dazu nach dem Seed, derselbe Moment gibt dasselbe Bild. Die Mechanik bleibt, die Tools zeichnen wie bisher. **HMI Facetrack** 0.2.12 nimmt Augen, Münder, Abstände und das Zeichnen eines Auges oder Munds aus der Engine Faces (`engine: "faces"`) statt aus eigenen Listen. Die Engine Faces 0.1.2 hält im Kopf fest, wohin sie geht (user, 25.10.2026: „das kann ja auch Hände, Body usw.“): sie wird die Engine Rig – Teile an Ankern, Ersatzteile, die auf dem Takt tauschen; was sie treibt, bleibt getrennt (Takt, Hand oder Kamera): das Tracking in Facetrack gibt nur die Anker, die Engine setzt und zeichnet die Teile. HMI Faces 0.2.14, HMI Facetrack und der Case Film 0.4.61 laden Faces 0.1.2. QR 0.2.10, Gradient 0.2.10, Gradient Blend 0.2.9, Fontscale 0.2.14 laden die neuen Engines. Bildvergleich vorher/nachher: 13 145 Bilder und Ausgaben (QR, Fontscale, Gradient, Gradient Blend je HMI und HELIO, HMI Facetrack: PNG, SVG, Tool-Export) gleich, 0 Abweichungen; das `draw` der Instanz gibt dasselbe Bild wie das Tool. **QS prüfen** meldet unter Engine-API keines dieser Tools mehr.
- **Custom Type und Bildoverlay sind Instanzen von Engines: Engine Glyphs, Engine Overlay; Custom Type 0.2.14, Bildoverlay 0.2.7, Kamera 0.2.9, Case Film 0.4.61** (user, 25.10.2026: „Tools ohne zugrundeliegende Engines dürfte es also gar nicht geben“). **Engine Glyphs** (`engines/glyphs/`, 0.1.0): der Satz in den Rahmen (Versalhöhe oben, Grundlinie unten, Laufweite, Zeilenabstand, Rand, Ausrichtung) und Custom Type auf dem Takt – unverändert aus `tools/custom-type/render.js`, das entfällt; was THA gehört, kommt aus der Library (`brands/tha/library.js` → `glyphs`: Glyphen, die vier Paarungen, die Farben der Bearbeitungsmarken, Vorgaben im Film), die Regeln der Alternates (Stile, 30 % je Wort, Umlaute, Versalien) sind die Brand Engine **THA Alternates** (`brands/tha/alternates.js`, in `brand.json` → `engines`). **Engine Overlay** (`engines/overlay/`, 0.1.0): baut den WebGL-Shader aus den Ebenen einer Brand (Farbton/Sättigung, Gradationskurven, Selektive Farbkorrektur) – die Werte der PSD-Vorlage stehen jetzt als Daten in der Library (`overlay`), `brands/tha/overlay.js` entfällt; der erzeugte Shader ist Zeichen für Zeichen der bisherige (ohne Kommentare). `window.CUSTOM_TYPE`, `THA_OVERLAY` und `TAKT_TOOLS['custom-type']` bleiben, so lesen Tool, Kamera und Case Film sie wie vorher. Beide Instanzen melden sich nach der Engine-API an (`DT_ENGINES.add('glyphs' | 'overlay', 'tha', …)`, `tool.json` → `engine`); der Case Film lädt nichts mehr aus einem anderen Tool-Ordner für Custom Type. Geprüft, vorher (Stand `case-film`) gegen nachher im selben Browser: Custom Type 16 Zustände (Paarungen, Anteil, Seed, Ausrichtung, Umlaute, Formate, Satz, von Hand gewählt) – Bühne, SVG und PNG gleich; Custom Type im Case Film 6 Zustände × 7 Momente gleich, Parameter gleich; Bildoverlay 12 Zustände (Stärke, jede Ebene aus, Deckkraft, Vorher/Nachher) – Bühne und JPG gleich, eigenes PNG und ZIP gleich. `check-standard.py`: alles ok; QS prüfen meldet beide Tools nicht mehr unter Engine-API.
- **Datenfluss: Spalten Brandtools und Dashboards** (user, 25.10.2026: „im Datenfluss könnte Tools auch korrekterweise Brandtools heißen. Die Spalte Brandtools dann Dashboards“). Die Tools einer Brand sind ihre Brandtools (Instanzen der Engines), das Feld rechts ist ihr Dashboard („THA Dashboard“). Konzept §3.6, CLAUDE.md, Library-Regeln angepasst; die Seite der Brand heißt weiter „THA Brandtools“.
- **Engine-API: Tools sind Instanzen; Datenfluss zeigt sie je Brand** (user, 25.10.2026: „in meiner Vorstellung sind Engines wie Components. Die Tools sind also Instanzen von Engines. Grid müsste also sowohl bei HMI als auch bei HELIO auftauchen, nicht zusammengefasst. Tools ohne zugrundeliegende Engines dürfte es also gar nicht geben. Auch der Bereich Allgemein stimmt nicht“; „auch die API für die Engines/Tools fehlt“; „Instanzen dürfen bis zu einem gewissen Grad erweitert und angepasst werden … auf Tool-Ebene braucht es brand-spezifische Anpassungen und Overrides“). **Vertrag** im Core (`DT_ENGINES`, Konzept §3.7): je Engine und Brand eine Instanz mit `name`, `params` (Schlüssel, Art, Wort, Vorgabe), `load`, `draw(ctx, w, h, state, takt)`; eine Brand passt ihre Instanz an über Daten (Library), Regeln (Brand Engine) und benannte Overrides (`DT_ENGINES.extend`). Grid 0.2.1, Logo 0.2.1, Arrows 0.2.2 (jetzt je Brand eine eigene Instanz statt einer geteilten), Faces 0.1.1 melden ihre Instanzen an. **Datenfluss:** die Spalte Tools hat nur noch Brands, jedes Tool steht bei jeder Brand, die es nutzt (45 Felder), es kommt von seiner Engine und den Brand Engines dieser Brand; das Panel nennt die Instanz („Engine Grid × HELIO“) oder „keine Engine – Befund“, „Tool öffnen“ öffnet sie für diese Brand. **QS prüfen** meldet jedes Tool ohne Engine und jede Engine ohne Instanz nach der API: 15 Befunde – Keyvisual, Keyvisual animiert, Kamera, Custom Type, Bildoverlay, HMI Facetrack, Case Film ohne Engine; QR, Gradient (auch Gradient Blend), Fontscale ohne API.
- **Übersicht und Brandtools sagen, was beim Laden fehlt** (user, 24.10.2026: „Übersicht funktioniert nicht“ – online stand nur „Die Übersicht braucht einen lokalen Server“). Jeder Fehler beim Laden kam als dieser eine Satz, auch online. Jetzt nennt die Seite die Datei und den Grund (fehlt mit Status, oder kein JSON, weil der Server dort eine andere Seite liefert); als Datei geöffnet sagt sie, dass sie einen Server braucht. Die Abfragen, die nur der Starter beantwortet (QS, git, Ordner öffnen), lesen nur noch eine JSON-Antwort – ein Webspace, der jede fehlende Adresse mit einer HTML-Seite beantwortet, stört sie nicht mehr (nachgestellt und geprüft). Die Ursache auf dem Webspace ist damit noch nicht gefunden: die alte Fassung lief auf beiden nachgestellten Servern.
- **Schriftgröße der UI: Klein als Vorgabe** (user, 24.10.2026: „default Schriftgröße UI klein. Wird sonst zu groß“). Ohne eigene Wahl 12 px statt 13 px (`--fs-label`, Einstellung Schriftgröße); wer Mittel oder Groß gewählt hat, behält es. Die Höhen der Bedienelemente bleiben 36 / 28 px.
- **Online-fähig: `scripts/build-site.sh`** (user, 24.10.2026: „ich will heute einen Stand, der online fähig und zeigbar ist“; eigener Webspace, alles zeigen). Baut aus dem committeten Stand `dist/designtools/` und `dist/designtools.zip` (374 Dateien, 37 MB): ohne Labor-Seiten, Skripte, Starter und Notizen für Claude, mit einer Startseite, die zum Datenfluss führt. Geprüft auf einem schlichten statischen Server unter einem Unterpfad wie bei einem Webspace: Datenfluss, Pattern Library, die drei Brandtools und jedes Tool für jede seiner Brands (28 Seiten) laden ohne fehlende Datei; was nur der Starter kann (QS, Ordner öffnen, Labor aus git), blendet sich aus. Die Kamera-Tools brauchen https.
- **Jedes Feld im Datenfluss hat seinen Stand** (user, 24.10.2026: „warum haben nur manche einen Punkt?“ – „noch keinen: bitte nachholen“). Prinzipien: abgeglichen, wenn ihre Version von Hand geprüft ist (QS ausführlich, `docs/QS/pruefung.json` → `versions`) – noch keins, alle drei zeigen den Ring. Engines und Brand Engines: abgeglichen, wenn sie mit der aktuellen Version der Brand Libraries geprüft sind, aus denen sie lesen (`engine.json` / `brand.json` → `brandLibraries`, wie bei den Tools; gesetzt auf HMI 0.3.0, HELIO 0.4.0, THA 0.1.0 – der QS-Lauf zeichnet jedes Tool beider Brands ohne Fehler); Export liest keine Brand-Daten. Brandtools: abgeglichen, wenn alle ihre Tools es sind (der schlechteste Stand zeigt). Im Panel steht der Stand als Zeile. Der Punkt bleibt beim Namen, ein langer Name bricht in sich um. QS: alle 22 Teile ok.
- **Partitur aus Bausteinen; Container-Regel; Höhen-Atom; alles auf den Atomen; QS ohne Befund; Core 0.5.81** (user, 24.10.2026: "müsste die partitur nicht einfach eine querformatige palette sein?"; "achte darauf, dass diese patterns nicht gegen atome verstoßen"; "der QS check muss bei jeder erweiterung der library erfolgen"; "ziel muss es sein, mit wenigen bauteilen möglichst viel machen zu können"; "es ist ja ein container, kein button"; "sollte aus einer regel stammen"; "was ist mit den höhen"). **Partitur:** the tools are a Palette of pictures (`.chips.bilder > .chip.bild`: choose, drag, the drop target and the plus of the Palette), an act is an Abschnitt (name, length, place; a broken rule as a red Status), fold and add are Symbol-Knöpfe, the line under the stage is a Regler; new are only Schläge (`.schlaege`, marks as words in `data-b`) and Gruppe (`.gruppe`, `.gruppe-offen`). The template Case Film (`.film`, `.film-stage`, `.film-row`, `.film-grip`) is in the core; the Case Film keeps one line of page style. The music line is drawn in `--tint-3` (it was black: a canvas cannot read `light-dark()`). Changed on the way, not asked: the act ticks on the line under the stage are gone (a Regler has none), acts stand 40 px apart (sections), a Standbild's number of pictures is words under it. Metronom and Bild-Versatz moved from the settings into the Case Film (Inspektor, Inhalt, Auf diesem Gerät). **Container:** one rule at the end of `core/ui.css` – a container has an edge (`--edge`) and holds things with the corner `--r-in`; its corner is their sum, the curves parallel: Dock, Dialog, Einstellungen, Tool-Kachel (button at 16 → 28), every field of the Datenfluss (8 → 20; the Brandtools field with Starten at 8, its name at 12), Segment-Reihe (4 → 14), Auswahl, Bühnen-Optionen, Gruppe. „QS prüfen“ measures it on every page, both ways. **Höhe:** `--h-control` 36 px for everything a word sits in (Handlung, Auswahlliste, Textfeld, Segment-Reihe, Datenfluss field; they were 33.5 to 37.5), `--h-small` 28 px for symbols, the word nudged by `--caps-nudge` so the middle of its capitals is the middle. **Atome:** the QS script reports type, radius, colour and spacing written out instead of a token, in the core, the overviews and every tool; the core (about 150 values), Keyvisual, Keyvisual animiert, Custom Type, HMI Facetrack now take the nearest atom; `--r-md` is 10 (Feld, Bühne), new `--scrim`, `--shadow-lifted`, `--w-detail`. **Tool-Kachel** is a block (was each Brandtools page's own `.tile`, which collided with the Partitur). **Datenfluss:** QS and Einstellungen as two Symbol-Knöpfe (QS offers Prüfen and Ausführlich), the versions in the fields as plain monospace text, 10 px, without a frame; the Labor sign a small square with the hatch at half size. QS against the library and the script: „Alle 22 geprüften Teile sind ok.“ Not tried: dragging tools in the Partitur and the film in full screen.
- **QS-Bericht abgearbeitet bis auf die Partitur; QS ausführlich; Core 0.5.64** (user: agreed: „Fertig ist es erst, wenn „QS prüfen“ null Befunde zeigt“; two levels of QS). From 188 findings to 27 – every one left is the Case Film's Partitur and the brand dashboards' `.tile`, which shares its class with it (to decide). On the way: the library shows every part the tools really use (pattern changelog 0.9.8); Kamera's Farbfelder were chosen by `.selected` and `.active` at once – `.active` alone now, as in a Segment-Reihe; a status stands on the baseline of its row (`.status`, 0.5 px left, sub-pixel); a token's sample counts as content for the QS (its shadow is the token). **„QS ausführlich“** beside „QS prüfen“: Ebene 1 (Designprinzipien) and Ebene 2 (UX) with the questions of their docs; measurable ones automatic (first run: Case Film uses other tools' files, E1-7), the rest answered by hand in `docs/QS/pruefung.json`. **„Bericht kopieren“** puts the report as text on the clipboard.
- **Schrift in der Mitte des Buttons; QS-Lauf wie in THA Tools; Pattern Library 0.9.7** (user: "die schrift steht im button nicht in der vertikalen mitte. du übersiehst die unterlängen"; "prüfen: das springt seltsam. bitte unten auch rahmen zeigen > siehe tha tools"). Measured on the glyphs: with 10/12 px the capitals of a Handlung sat 0.73 px above the middle – the line box keeps room for descenders a label mostly lacks; now 10.75/11.25 px, the capitals' middle 0.02 px from the button's (block Handlung, every tool raised to 0.9.7). QS prüfen keeps its word and width while running and is locked; the count „3 von 20“ stands beside it; the field being checked carries the frame of the Datenfluss (`.on`), as THA Tools frames the running tool.
- **Tool-Panel zeigt, worauf das Tool steht; Versionen der Tools im Datenfluss** (user: "bei arrows (tools) kann ich nicht erkennen, auf welcher engine das tool basiert"; "warum hat die ebene tools keine versionsnummer"). A tool's panel lists its Brands with the library version it was checked with, its Engines and its Brand Engines – what the Datenfluss draws (Arrows: HMI Project 0.3.0, HELIO 0.4.0; Arrows 0.2.0, Export 0.2.0). The row Regeln is gone: it showed the old rule ids of `brand.json` (hmi-farben …), the rules live in the brand libraries now. Each tool field carries its version like every other column. Checked on the panel of the button „Tool öffnen“: type and padding the same as the library's Handlung (13 px, 500, 10/12 px – the optical centre decided before).
- **QS gegen die Pattern Library; Befunde am Feld; Core 0.5.57** (user: "genau das ist der beweis, dass du dich weder beim erstellen noch beim prüfen an die pattern lib hältst"; "dieser datenfluss muss grundlage für alles sein. das QS muss sicherstellen, dass wir uns daran halten"; "prüfen auch in übersicht markieren, wie bei THA tools"). „QS prüfen“ now also renders the library and every page off the screen (Datenfluss, library, Brandtools, each tool) and compares every element with block classes against that block's example in the library (`DT_QS.compare`, core): surface, pattern, type, edge, radius, shadow, padding – inherited type and a Farbfeld's or stage's colour (content) aside. It reports an Abweichung (looks other than its block) and a Variante ohne Vorlage (a combination of classes the library shows nowhere), each with page and count; a field with findings carries the red dot of the block Status, its findings in its title. First run: 13 Abweichungen (among them the Datenfluss's own Starten button and status dots in black fields, Keyvisual's text field, the Farbfelder of four tools) and about 70 parts or variants without an example in the library. The Brandtools field no longer lights up as a whole (its button did collide). `blocks.js` was loaded with a stale `?v=0.9.0` by the Datenfluss and the library – now 0.9.6.
- **Kopf des Datenflusses neu; Brandtools mit „Starten“; Prüfskript sieht Styles am Element; Comp23 als Ton jedes Case Films; Vorschau des HELIO-Films; Case Film 0.4.60** (user: "besseres responsives Konzept, vor allem der Kopfbereich"; "die brandtools bitte prominenter, hier wäre auch ein direkter launch hilfreich"; "das ist vollkommen unsinnig" – a row of three big launch buttons, gone again; "diese anders gestalten, z. b. höher + button"; "check-standard soll style-Attribute und graue Schrift in Tool-Seiten melden"; "bei den case filmen bitte meinen sound als default laden"; "helio case film hat noch keine eigene vorschau"). **Head:** two rows – the title with what concerns the whole (Changelog, QS prüfen; `.page-meta`), then the bar (Ansicht, Brand, Filter, all 220 px; legend right); narrow (< 760 px) everything stacks, controls full width. **Brandtools** fields in the Datenfluss are taller with their own „Starten“ (light on the black field); the name opens the panel (`.flow-node.launch`, `.flow-face`). **check-standard** reports a `style` attribute in a tool page's markup (a background alone stays – a Farbfeld shows its colour) and grey text in style attributes or set by a script; it found one at once: Keyvisual hid a row with `style="display:none"`, now `hidden` (tested with planted probes in QR, removed). **Sound:** „Comp23 · lang“ (the user's, from the THA showreel, 99 s on its bars; back from git) is the default of every Case Film again, unless a sound of one's own was kept; the labs Hüllkurve and Choreografie, which still pointed at it, play again. **HELIO preview:** 12 s of „HELIO · Botschaft“ from 0:14 at 25 fps, 448 × 252, an animated WebP like HMI's and THA's (rendered frame by frame in the page, assembled with Pillow – the installed ffmpeg lacks a library); `scripts/serve.py` may write a tool's `preview…` file for this (`POST /__preview`, only there).
- **QS-Durchlauf aus dem Datenfluss; Brand als Pulldown; Labor-Schraffur halb so stark** (user: "ich würde von hier aus gerne auch einen QS-Durchlauf mit den Prinzipien starten können mit Fehlerbericht"; "brand auswahl als pulldown"; "bitte outline um texte vor schraffur. schraffur kann 50% deckkraft haben"; "hier schraffur 50% verkleinern"). „QS prüfen“ in the bar (only on the starter): `scripts/serve.py` runs `scripts/check-standard.py` – that script only (`POST /__qs`) – and the report opens in the panel: a summary, one row per checked part with its Status (dot ok, red Befund) and the finding, a row opens its field; below, the three principles to answer by hand („ok“ ist kein Beweis). Tested with a planted unknown class in QR (reported as Befund, row opens QR), removed again. Found on the way: the script does not see an inline `style` with grey text in a tool page – a gap of the QS script. The brand choice is an Auswahlliste (Alle Brands, THA, HMI Project, HELIO). Labor's hatch at half strength with the name outlined in the field's colour; the legend's square at half the hatch size.
- **Datenfluss stimmt wieder mit dem Stand; Auswahl je Brand; Labor schraffiert; HMI-Library 0.3.0, HELIO-Library 0.4.0** (user: "entspricht die übersicht deinem arbeitsstand?"; "sinnvoll wäre die ansicht auf einzelne brands beschränken zu können"; "lass uns labor schraffieren, wie bei THA tools, nicht umranden"; "· Projekt > weglassen"). It did not: `engines/fontscale/engine.json` was missing, and as all engines loaded together the column showed none of the general engines – now each engine.json loads on its own and the file is there. A tool now comes from every engine and Brand Engine it uses (Case Film from Grid, Logo, Arrows, Faces and the Brand Engines), the Export only in its panel. The HMI and HELIO libraries had new blocks (logo, arrows, qr, gradient, fontscale, faces) under their old versions – raised to 0.3.0 and 0.4.0, the tools built and checked with them aligned. A row Alle · THA · HMI · HELIO limits the Fluss to what a brand's Brandtools stand on. Labor is hatched (`--hatch`, on black fields `--hatch-inv`). The page is called „Designtools“.
- **Ein Tool Logo; Engines Gradient, Fontscale, Faces; Live-Video in der Engine Export** (user: "was macht das aufräumen der struktur. ich werde ungeduldig"; built in parallel, four sessions). **Logo 0.3.0** (`tools/logo/`) replaces HMI Logo and HELIO Logo: opened with `?brand=`, its logo from `LOGO_ENGINE.of(brand)`; only the brand's own controls show (HMI Nur Gesichter and Icons, HELIO Fläche and the 24 orders); kept state, file names and Takt ids stay per brand. **Engine Gradient 0.1.0** for Gradient (0.2.9) and Gradient Blend (0.2.8): fields, mixing, drift, drawing, SVG, colours from an image; each brand's `gradient` block (HMI four palettes, HELIO Afterglow on black) – 89 outputs per tool equal before and after. **Engine Fontscale 0.1.0** (Fontscale 0.2.13, brand block `fontscale`: sample, accent and weight per ground, logo) and **Engine Faces 0.1.0** (HMI Faces 0.2.13, brand block `faces`; `TAKT_TOOLS['hmi-faces']` unchanged) – PNG/SVG hashes and 480 + 2592 pictures equal. Case Film and the lab Arrangieren load the Faces engine; `render.js` gone. **Engine Export 0.2.0:** `live({ canvas, seconds, fps, sound })` records a running canvas frame by frame (WebCodecs, MediaRecorder as fallback); Kamera 0.2.8 and HMI Facetrack 0.2.11 record their MP4 through it (not tried with a real camera, nor in Safari). The Logo and Grid tiles speak of the brand only („Das Zeichen der Marke“) – the Brandtools go to customers. `engines/index.json` lists Grid, Logo, Arrows, QR, Export, Gradient, Fontscale, Faces; every tool page, the Case Film for HMI and HELIO, the labs, the Brandtools and the Datenfluss load without error; check-standard ok.
- **Ein Ordner je Tool; Datenfluss mit Struktur und Brands; Core 0.5.39** (user: "was macht das aufräumen der struktur"; "das ist doch nicht fertig"; "der text projekt kann weg"; "ich will die struktur im datenfluss sehen und umschalten"; "engines und tools, die noch nicht committed wurden, also lab status haben"). **Tools flat:** `tools/hmi/*` and `tools/tha/*` moved to `tools/<id>/` – a tool is not a brand's, it names its brands in `tool.json`; paths (`../../`), `tools/index.json`, Case Film, labs, README and CLAUDE.md follow; every tool page, the Brandtools and the Datenfluss load without error. **Datenfluss shows the structure itself** (user: "wir verstehen uns vollkommen falsch. ich will nicht einfach einen umschalter"; "ausgaben ist nach wie vor da und soll weg"; "bezeichnungen uneinheitlich"; "ich will es im datenfluss sehen"): no column Ausgaben any more (every file goes through the Engine Export); every column has the same groups in the same order – Allgemein, THA, HMI Project, HELIO – so each column shows what is general and what is a brand's (Pattern Libraries: UI-Library, THA Library …; Engines: Grid … and THA Band, HMI Dominos, HELIO Kacheln; Tools: shared ones under Allgemein; Brandtools per brand with its version). What belongs to a brand is a black field (ink with paper; white in dark), what is general stays light (user: "die unterscheidung ist zu schwach"; "oder brandbezogen schwarz?" – a hatch had been tried and made the names harder to read); the open field has a ring with air. Labor – never committed, from git – is hatched as in THA Tools ("nicht umranden"), in the legend too ("entwickeln? > weglassen"; "dann anders visualisieren"); changed gets no mark (`scripts/serve.py` answers `GET /__git`, read only). The head reads „0.5.8 · Changelog“.
- **Brandtools: die Version oben als Text; Core 0.5.37, Pattern Library 0.9.5** (user: "ohne pill bitte"; "changelog nicht in den dashboards!"; "die dashboards gehen an kunden/user"). On top of a Brandtools dashboard only the version, „0.1.0“ in monospace, before the settings – no tag, no link, no changelog: the Brandtools go to customers, nothing internal shows there (rule at the block Seitenkopf). The Markdown reader moved from the Datenfluss into the core (`markdownToHtml`). Every underlined link is ink (`.link-u`), not only in a bar – a link in a page head had shown the browser's blue.
- **Pattern Library ohne „Seiten“** (user: "die machen für mich in der lib wenig sinn"). The level Seiten listed every tool a second time; where a block is used stands at the block (Verwendet in, for templates too – was „Seiten“), the tools are in the Datenfluss and the Brandtools. Gone from the UI library and the brand libraries, with its navigation group and the function that built it.
- **Übersichtsseiten: Navigation bleibt stehen, so breit wie der Inspektor; Steckbrief auf der Grundlinie; Core 0.5.35, Pattern Library 0.9.4** (user: "pattern lib: unpraktisch, dass die navleiste wegscrollt. kann sich breite an inspektor orientieren?"; "hier mal vertikale ausrichtung checken"). The page scrolled in html while body had `overflow: auto` too – the body was the scroll box that never scrolled, so the sticky navigation went with the page; now body is visible and the navigation stays (measured: at 6000 px scrolled it is at the top). Its width is the inspector's, one token `--w-panel` (340 px) for both. In the Steckbrief the name sits on the baseline of the value's first line – beside a code box or a list it had stood above (measured equal for Regeln and Aufruf).
- **Stand ohne Ampel; Core 0.5.33, Pattern Library 0.9.3** (user: "ich denke nicht, dass wir eine ampel brauchen. ich würde eher blau … verwenden, und rot nicht abgeglichen/veralteter core"; "für einen zwischenstand könnte man grau blinken nehmen"; agreed: no blue, it means editing). Abgeglichen is a dot in ink, nicht abgeglichen (to be checked) a ring in ink that breathes slowly (`--t-pulse`, still with reduced motion), veralteter Core red – the only colour, darker on light (#d70015) for contrast. Tokens `--status-*`, block Status, rule at the atom Farbe (red only for what someone must do; no green, no yellow). Datenfluss, Liste, library and Brandtools follow from the tokens; check-standard ok.
- **Monospace mit Regel; Core 0.5.32, Pattern Library 0.9.2** (user: "wann genau verwenden wir eigentlich monospaced? finde ich bei advanced gut. aber was ist die regel? und wo würde sie auf der ebene designtools angebracht sein?"). Monospace for what a machine writes or reads – versions, seeds, sizes in px, paths and file names, ids, code, state; Inter for what a person reads or operates (a slider's value too, tnum). Once each: token `--font-mono` in `core/tokens.css` (the stack had been written out seven times in `core/ui.css`), class `.mono` and the rule at the atom Schrift, a line in QS 3 pointing there; Etikett, Tabelle and Steckbrief refer to it. The Datenfluss shows versions (tags), Library, Core, Ordner, Datei, Starter in monospace, the Brandtools their version. check-standard lets an atom carry a class. Tools look as before and are aligned with 0.9.2.
- **Engine Export; Brand und Brandtools; Versionen oben; Ordner öffnen; Core 0.5.31, Pattern Library 0.9.1** (user: "eine export engine könnte alles unter ausgaben zusammenfassen"; "wir sollten uns das wording insgesamt ansehen"; "hier oben würde ich gerne auch immer die versionsnummer zeigen. die version eines brandtools könnte dann bei advanced eingebaut sein"; "das müsste doch ein button sein, oder? könnte man hier auch den folder öffnen, wenn lokal?"; "es wäre hilfreich, wenn die buttons immer oben sind"). **`engines/export/`:** every file of every tool through `EXPORT_ENGINE` – name, save, PNG, JPG, SVG, ZIP, PNG sequence, MP4 and the live capture (`record`). MP4 is drawn frame by frame and encoded with WebCodecs for every tool (the Case Film's encoder, moved to `engines/export/mp4.js`; the H.264 level now follows the frame size, so large tool exports up to 4096 px encode), MediaRecorder only as fallback. The sixteen tools dropped their own probe recordings, MediaRecorder replays and download code (about 1400 lines); Arrows 0.4.1, Grid 0.2.15, HMI Logo 0.2.14, HELIO Logo 0.2.13, Gradient 0.2.9, Gradient Blend 0.2.8, HMI Faces 0.2.12, HMI Facetrack 0.2.10, QR 0.2.9, Fontscale 0.2.12, Keyvisual 0.1.11, Keyvisual animiert 0.3.8, Bildoverlay 0.2.6, Custom Type 0.2.13, Kamera 0.2.7, Case Film 0.4.59 (built in parallel, four sessions plus the pilot and the film). Checked per tool with the hand-over caught (no download): MP4 length, size and frames, PNG, SVG, ZIP; every tool page loads without error; check-standard ok. Still their own: the live MP4 of Kamera and HMI Facetrack (a camera cannot be drawn again by time – the engine needs a live source). **Wörter:** Brand for the system term (Brands, Brand Library, Brand Engine); Designtools is the whole system, **Brandtools** what a brand gets (dashboards „THA Brandtools“ …, starters); the last column of the Datenfluss is Brandtools; Konzept 3.6, CLAUDE.md. **Versionen:** a Brandtools dashboard shows its version on top beside the settings (`brand.json` → `version`, 0.1.0); every tool shows its own version and its Brandtools' at the top of Werte in its inspector (core, from `tool.json` and `brand.json`). **Datenfluss:** „… öffnen“ is a button (`a.action` looks like the button – it was a plain link), the actions stand on top of the panel, `--sp-5` above the Steckbrief (block Handlung, library 0.9.1; tools unchanged and raised to 0.9.1); „Ordner öffnen“ beside it shows the folder in the Finder when the page runs on the starter (`scripts/serve.py`: `/__open`, only folders under its root, only with its header); the Export engine leads to the outputs.
- **Brand Engines: HMI Dominos, HELIO Kacheln, THA Band; Engines Grid und Logo 0.2.0** (user: "vom wording vielleicht auch in engines und brand engines denken"; "das band ist z.b. eine brand spezifische engine"; "aber sie setzen auf engines auf. HMI grid setzt auf grid auf, oder?"; "den begriff engine finde ich aber gut und gut erklärbar. im wording würde ich mich nicht an atomic design orientieren"). **Konzept 3.6:** Core, Engine, Brand Engine, Brand Library, Tool, Ausgabe – Atomic Design als Logik, eigene Wörter; Brand Engines setzen auf Engines auf; Belegung, Pfad und Export als kommende Engines; Steuerung innen (Tool) und außen (Film) aus einer Parameterliste. **Code:** what only one brand does left the engines, unchanged: `brands/hmi/engines/dominos.js` (the domino laying of the grid and of the logo) and `brands/helio/engines/kacheln.js` (the neighbour rules of the grid, the permutations of the logo). A Brand Engine registers its placement with each engine that is loaded (`GRID_ENGINE.placement`, `LOGO_ENGINE.placement`); the engine then makes the brand's grid or logo and keeps the mechanics (raster, scores, form, cascade, arrangement, Aufbau, takt, loading) and offers them as `kit`. Engine Grid 529 → 144 lines, Logo 932 → 186. Pages, Case Film, labs and the brand libraries load the Brand Engines after the engines. **Datenfluss:** the column Engines has the general ones and, per brand, its Brand Engines (`brand.json` → `engines`), each from its library to the engine it builds on; THA Band stands there on no engine yet (Pfad comes). **Checked:** image comparison old against new, 4 × 480 pictures (HMI Grid, HELIO Grid, HMI Logo, HELIO Logo) – 0 differences; both logo tools, Grid for both brands, Case Film, the HMI library page, the labs Arrangieren and Hüllkurve without error; check-standard ok. Not yet: one Belegung under Grid and Logo – their random draws run in a different order, so joining them changes the pictures (to decide).
- **Arrows 0.4.0, Engine Arrows 0.2.0: Ordnen, Folge und Aufbau im Tool** (user: "Pfeile: Ordnen, Folge und Aufbau ins Arrows-Tool übernehmen, damit der Film sie nutzen darf"; "ich finde es ok aus sicht des case-film tools features in tools zu übernehmen"). The motion is one function of the engine, `cellsAt(layout, o, s)`, for the tool and the film alike: the field flows at its Tempo (Feld), or the arrows turn onto a direction (Ordnen: → ↑ ↓ ←), a thirty-second of a beat apart in the Folge (von links, von rechts, von der Mitte), each turn a beat long, Weich; Aufbau: rows grow in from the top, a sixteenth apart. The tool's Bewegung has Drehen (Feld · Ordnen), Richtung and Folge with Ordnen, and Aufbau; it counts at 120 BPM from the start of the motion (and of a video or PNG sequence), Ordnen after two bars. What only the film had is gone: the field moving in steps, the spring turns (`taktSwing`), the role of the arrows (parameter Rolle) – the film now says only the moment of the turn (the third step) and its tempo. A Verlauf (Steigerung) no longer changes the arrows: the field flows at the tool's Tempo. Checked: tool (Aufbau, Ordnen) and the film draw without error, check-standard ok.
- **Engines Logo, Arrows und QR; HMI Logo 0.2.13, HELIO Logo 0.2.12, Arrows 0.3.9, QR 0.2.8; Core 0.5.28 (takt.js)** (user: "was ist mit den engines? neustrukturieren?"; "du kannst doch parallel arbeiten"). Built in parallel, each as the Engine Grid: one core, what is the brand's in `brands/<marke>/library.js` (`logo`, `arrows`, `qr`). **`engines/logo/`** – two ways of laying: `domino` (HMI, icons of one or two tiles) and `permutation` (HELIO, the four letters on the card); `HMI_LOGO`, `HELIO_LOGO`, `TAKT_TOOLS['hmi-logo' | 'helio-logo']` keep their names. **`engines/arrows/`** – the arrow of the brand the tool is opened with (HELIO its own copy); `TAKT_TOOLS['hmi-arrows']`, `HMI_ARROWS` unchanged. **`engines/qr/`** – encoder, layout, canvas, SVG and vCard; `QR_ENGINE.of(brand)`; the QR page keeps only UI and wiring (1240 → 566 lines); the brand's defaults start the controls. The old `render.js` of HMI Logo, HELIO Logo and Arrows are gone; Case Film and the labs Arrangieren and Choreografie load the engines; `engines/index.json` lists all four, the Datenfluss shows them. **Checked:** against the old code in the same page – Logo: 2 × 480 standard pictures, 2 × 9216 over its parameters, 8640 tool frames, 1152 SVG exports; Arrows: 480 + 3456 states; QR: 13 states per brand, SVG and PNG hashes equal, every variant decoded (BarcodeDetector) – 0 differences. Case Film for HMI and HELIO, the labs and the Datenfluss load without error; check-standard ok. **Not yet under the rule „nur, was das Tool kann“:** the film's Arrows – it orders all arrows onto one direction, moves the field in steps, turns with a spring, by role and in a sequence, and grows them in row by row; the tool has none of these (listed by the Engine Arrows session, unchanged). The lab Arrangieren starts silent too.
- **Case Film 0.4.58: nur, was das Tool kann – kein Federn, kein erfundener Ton** (user: "im helio case film lässt du die zeichen einem scalieren beim erscheinen. das widerspricht den animationen im tool"; "und diese neue musik ist schrecklich!!"; "die regel ist: wir nutzen nur das, was das tool kann. nichts dazuerfinden"). A part of an Aufbau with a role (Hauptaktion, Akzent) grew from 45 % or 25 % and swung 9 % or 18 % past – the tools cannot do that. Now the role gives only its moment; how it comes in is the tool's Übergang (Tauchen, Blenden, Drehen) with the tool's easing (core/takt.js; `grow` gone from `TAKT_ROLES`). The film's own easing (easeOutCubic) is gone too: it takes Linear, Weich or Federnd as the tools do, by default Weich. „Takt 120 · eigen“ (synthesized) is removed with its script: the film opens silent at its tempo until a sound is loaded; „Beispiel“ shows only when there are examples. Not yet checked against the rule: Arrows in the film (Ordnen, the scale-in, the spring turns) – the Engine Arrows session lists them.
- **Ein Tool Grid für HMI und HELIO** (user: "Ein Tool Grid"). `tools/grid/` replaces `tools/hmi/hmi-grid` and `tools/hmi/helio-grid`: opened with `?brand=hmi|helio`, it takes its grid from the engine (`GRID_ENGINE.of(brand)`), its presets, slider range (HMI 51, HELIO 58) and its word for the symbols (Icons, Kacheln) from the brand's library. Icon choice and Drehung only where the engine offers them (`selectable`, `rotatable` – HMI); HELIO starts on black. The engine has one interface for both ways of laying (`layout`, `content`, `pickFor`, `withContent`, `drawCell`, `assetOf`, `turned`). Kept state, exports and the Takt ids stay per brand (`hmi-grid-state`, `…_helio-grid.png`, `TAKT_TOOLS['helio-grid']`). Checked: both brands render and swap without error, check-standard ok. The UI itself is still markup, not data from tool.json (concept step 3).
- **Core 0.5.27: das Icon im Tab folgt der Marke** (user: "bei HELIO case film sehe ich immer noch HMI icon. ich habe den verdacht, dass das tool noch nicht richtig der brand zugeordnet ist"). The assignment was right (`?brand=helio` opens the HELIO film, the way back leads to HELIO); the page linked HMI's icons. A tool opened with `?brand=` now shows that brand's `favicon.svg` and `apple-touch-icon.png` (core, with the dock title): Case Film for HELIO and THA, QR, Arrows, Fontscale, Gradient, Gradient Blend for HELIO. Checked: the icons resolve, no 404.
- **Case Film 0.4.57: HELIO – Logo wechselt auf den Mockups** (user: "logo wechsel bei mockups"). The HELIO photos had no prints the film knew (no `FILM_PRINTS`, no blank photos), so nothing changed on them. Now as on HMI's: `scripts/film-photo-blank-helio.py` (it uses `film-photo-blank.py`'s fill; `blank()` takes an optional ink limit, default unchanged) makes six HELIO mockups without their print – T-Shirt, T-Shirts, Becher, Caps, Hoodie und Mütze, Taschen –, and `brands/helio/film.js` registers the marks the film prints anew on the beat, measured on the photos: the four letters 2×2 (HELIO Logo without card, light or dark ink), the black card with the letters (HELIO Logo with Fläche: white cup, white shirt, beanie label, cream bag), and on the black shirt a 3 × 3 HELIO Grid; turned with the photo where the print is (T-Shirts −8.5°, Hoodie −6°). Broschüre, Website and Stifte keep their print, as HMI's Flyer, Website and Stifte do. „HELIO · Botschaft“: the mockups of 35–38 change their print on the beat; 41–42 is the T-shirt (was the website), its logo changing on the beat as in HMI's.
- **HELIO: Pfeil und QR-Formen als eigene Assets, nur Afterglow; hmi-10 in Blau** (user: "[Pfeil und QR-Formen] sind die gleichen, würde ich in diesem fall doppelt als markenasset ablegen"; "gradient HELIO mit afterglow, die anderen dort löschen, hmi-10 in blau"). `brands/helio/symbols/arrow/` and `QR/` (copies of HMI's, without the PDFs); Arrows 0.3.8 and QR 0.2.8 load the shapes of the brand they are opened with; HELIO's library (0.3.0) shows them. Gradient 0.2.8 and Gradient Blend 0.2.7 keep only the brand's palettes (`gradients` in the library): HELIO Afterglow alone, HMI all four. The Case Film graphic „Logo mit Schutzraum“ (`hmi-10`) has its guides in HMI blue #0066CB instead of the old red. Checked: the four tools with `?brand=helio` load their shapes and palettes, no error.
- **Case Film 0.4.56: HELIO – HELLO! Strich für Strich, Saul Bass** (user: "HELIO case film: HELLO! bitte als SVG animation"; "alle texte > saul bass zitate"). New graphic `brands/helio/film/graphics/hello-striche` from `scripts/film-graphics-helio.py`, built the way HMI's `hi-striche` is (it reuses `film-graphics-hmi.py`'s helpers): HELLO! from the HELIO Rounded glyphs, every stroke cut out of the glyph's own outline – H (stems, crossbar), E (stem, three bars), L (stem, foot) twice, O, the bar and the dot of the ! –, 14 groups; „HELIO · Botschaft“ opens with it, a stroke every half beat over bars 1–2. Every Texttafel of the HELIO film is now Saul Bass, as in HMI's and THA's – „Design is thinking made visual.“, „Symbolize and summarize.“, „I want to make beautiful things, even if nobody cares.“, split over the same cards, ending on the whole first sentence (HMI ends on it too, not on a brand text). The graphic is in the HELIO pack's graphics.
- **Case Film 0.4.55: HELIO bekommt seinen eigenen Film** (user: "helio bekommt ebenfalls … casefilm"; the open point „the Case Film's content for HELIO“). `?brand=helio` (from the HELIO dashboard) opens the HELIO kit instead of falling back to HMI: the kit is now any brand with a film pack of its own (hmi, helio, tha). **`brands/helio/film.js`:** HELIO's pack, moved out of `brands/hmi/film.js` (kit `helio`; letters, wordmark, the nine HELIO mockup photos – back from git into `brands/helio/film/photos/`, the pack still listed them though Case Film 0.4.48 had removed them, so they were 404 in the picker –, graphics H · E · LI · O and Schriftzug; font, display glyphs, symbols and arrow borrowed from HMI; the film starts on black, `theme` from the library). **Accent per ground:** a pack may give `accentFor(theme)` – HELIO's violet is #D977D9 on black and #B224B2 on white (`brands/helio/library.js`); HMI and THA keep their one accent. **Scene types** of the HELIO kit: HELIO Logo, HELIO Grid and Arrows (a pack may borrow a beat tool of another brand, `tools`), Texttafel, Standbild; HMI's kit no longer lists HELIO's tools and pictures. **„HELIO · Botschaft · 96 s“** in `templates.js`, in the form of HMI's on Comp23's phrases (48 bars, the same acts and cuts): HELLO! in big glyphs, the grid as a wave, Arrows onto →, the logo as the accent, the tools in dialogue, the wordmark building up, the grid on white, the mockups a bar each, the end card; the words „Bessere / Interfaces / in Rekordzeit.“ … and the whole sentence at the end. Fontscale has no beat tool, so the film cannot show it.
- **Engine Grid – die erste Engine; HMI Grid 0.2.14, HELIO Grid 0.2.7, Case Film 0.4.54** (user: "die Trennung von tools und engines"; "Ja … dann baue die Engine Grid für HMI und HELIO"). `engines/grid/engine.js` computes and draws a raster of a brand's symbols for every brand; what is the brand's comes from its library (`brands/<marke>/library.js` → `grid`: symbols and widths, sizes, gaps per ground, rows per density, and how symbols are laid – `domino` for HMI, `rules` with the neighbour rules for HELIO). One core – geometry, the patterns' scores, loading, the Takt tool – two ways of laying. `tools/hmi/hmi-grid/render.js` and `tools/hmi/helio-grid/render.js` are gone; the tool pages, the Case Film and the labs load the engine; `HMI_GRID`, `HELIO_GRID` and `TAKT_TOOLS['hmi-grid' | 'helio-grid']` keep their names and members. **Checked with the image comparison** (`scripts/bild-vergleich.html`, new: an engine draws a matrix of states over the Takt, every picture a fingerprint, stored before and compared after): 960 pictures (4 patterns × 2 grounds × 2 seeds × 3 densities × 5 moments × with and without the Case Film's Hüllkurve, per brand) – 0 differences. The two tools, the Case Film and two labs load without error. `engines/<id>/engine.json` (name, version, brands, data) and `engines/index.json`; the Datenfluss has the column **Engines** between the libraries and the tools (brand libraries → engine → tools). The brand libraries show their grid live from the engine (HMI Icon-Raster, HELIO Buchstaben-Raster); every library finds the project root from its own address (the HMI one had loaded the brand font from a wrong path in tools). Still two tool pages on the one engine – one tool Grid for both brands comes with the UI as data (concept step 3).
- **Bildoverlay 0.2.5: ohne Bewegung** (user: "THA bildoverlay: bewegung kann entfallen"). The Bewegung section, its tab, the Video tab, MP4 and PNG-Sequenz are gone; Speichern offers the image (and ZIP for several). **Datenfluss:** tools grouped once per brand, in the brands' order (the groups repeated).
- **Farben der Marken; HELIO-Icon; Fontscale nach Marke und Grund; Library-Seite liest die Einstellungen** (user: HMI's and HELIO's colour charts – "diese farben auch für brands übernehmen"; "fontscale bei HMI mit akzent blau, fontscale bei helio violett. HELIO default auf schwarzen hintergrund"; "HELIO icon auch bauen", "helio hat wieder die kante"; "bei HELIO die pfeile auch schwarzen hintergrund per default (auch vorschau)"; "auch QR bei HELIO invertieren, mit vorschau"; "HELIO diesen gradient als default. auch in vorschaubild"; "HELIO default text: Bessere Interfaces in Rekordzeit"; "fontscale: bei dark/schwarzer hintergrund muss font-weight auf 500 wechseln. bei light auf demi"; "bitte font-weight auch bei den thumbs berücksichtigen"; "auch highlight farbe bei facetracking HMI anpassen"; "aktuell lande ich bei helio arrows über zurück in toolbar wieder bei HMI"; "fontscale: beschriftung HELIO und HMI in den dashboards korrigieren"; "wie kommt es dass datenfluss light ist und pattern lib dark?"). **HMI** (library 0.2.0): White, Black, Soft-Black #111111 (screen), accent Primary-Light #0066CB on light and Primary-Dark #409FFF on dark – the red #FF005E that stood in the HMI library, Fontscale, QR and the film packs was wrong. **HELIO** (0.2.0): Black, White, Soft-White #EEEEEE, accent #B224B2 on light, #D977D9 on dark, default ground black, sample text „Bessere Interfaces in Rekordzeit“, default palette Afterglow. The libraries are the source: core `brandData`, `brandColor`, `brandAccent(id, theme)`, `toolBrand()`, `startOnBrandTheme()`; Fontscale, QR, Arrows, Gradient and the Case Film's packs read them. **Fontscale 0.2.11:** accent by brand and ground; the weight follows the ground – Demi (600) on light, 500 on dark (a rule of the DIN in both libraries); HELIO starts on black with its text; the tile text no longer names a logo choice; new previews taken from the tool's own PNG (HMI light and dark in blue, HELIO in violet on black). **Arrows, QR:** HELIO starts on black, the dark preview is HELIO's. **Gradient 0.2.7:** HELIO starts with Afterglow; HELIO preview from the tool's SVG output with that palette. **HMI Facetrack:** its measuring points were already the stage blue; the two previews still showed the old red – now the stage blue. **Case Film:** the HMI and HELIO packs take their accent from the libraries (#0066CB, #B224B2). **Dock title** leads back to the dashboard of the brand the tool was opened with (core). **HELIO icon:** the four tiles H · E / LI · O in black on white like HMI's (on black the browser laid it on a light plate), with 16, 32 and 180 px; in the HELIO dashboard and HELIO tools. **Library page** applies Darstellung and Schriftgröße like every page (it followed the system only); `check-standard.py` reports an overview page that does not. Still open: the film graphic `brands/hmi/film/graphics/hmi-10` has the old red in its artwork; the Case Film's content for HELIO.
- **Marken-Libraries; HELIO wieder eigene Marke; Fontscale 0.2.9, Arrows 0.3.6** (user: "eigentlich braucht jede marke eine pattern lib", "das was jetzt bei marken steht ist ja eigentlich eine patternlib", "teilweise auch vokabular", "und teilweise regeln", "ich denke es ist sinnvoll HMI und HELIO wieder als zwei brands zu behandeln", "helio bekommt ebenfalls beide gradients, fontscale, QR und casefilm", "helio kann auch pfeile nutzen", "nennen wir nur arrows", "bei fontscale entfällt die auswahl des logos"). **`brands/<marke>/library.js`** for THA, HMI Project and HELIO: blocks (atoms to templates), rules, vocabulary, a version (0.1.0); the rules that stood in `brand.json` are only there now. Every example is rendered from the brand's own sources – THA's colours and pairings from the band module, its type and alternates from the glyphs of THA Everett Bold, HMI's and HELIO's symbols, wordmarks and the DIN font from their files; blocks that need an engine (Band, Icon-Raster, Logo …) say so instead of showing a drawing. Shown by the same page: `patterns/index.html?marke=tha|hmi|helio`, with sections Regeln and Vokabular; the navigation links all four libraries. **HELIO:** `brands/helio/` with its artwork (`symbols/`, moved from `brands/hmi/symbols/HELIO`; HELIO Grid, HELIO Logo, Fontscale and the Case Film's pack point there, all load without error), sources (`quellen/`), `brand.json`, dashboard and starter; its tools: HELIO Logo, HELIO Grid, Arrows, Gradient, Gradient Blend, QR, Fontscale, Case Film (the shared ones open with `?brand=helio`). Not yet: an icon of its own (none rather than HMI's), the Case Film's content for HELIO (it opens with HMI's), Arrows and QR in HELIO's symbols – with the engines. **Abgleich with the brand:** every tool names in `brandLibraries` the version of each of its brands' libraries it was checked with; the Datenfluss shows every brand library with its version and light, its panel opens the library; `check-standard.py` checks each brand library's form (version, blocks with level and meaning, rules, vocabulary) and hints at tools behind it. **Arrows:** the tool is called Arrows (was HMI Arrows). **Fontscale:** the logo follows the brand the tool is opened with; the choice HMI/HELIO and its probe are gone (and with them the black logo on the black chosen segment).
- **Die Library ist mit allen drei Prinzipien abgeglichen** (user: "aktuell wundert mich, dass die pattern library nur mit UI abgeglichen wird, nicht mit UX, nicht mit designprinzipien"). Each principle has a version at its top (1.0); `DT_PRINCIPLES` in `blocks.js` names the version the library was checked against. In the Datenfluss all three principles lead into the library (a bow within level 0), the library's light turns yellow when a principle is newer, its panel says against which; `check-standard.py` prints a hint for the library (tested with UX 1.1). Unit 2's title now reads „Ebene 2 · UX“.
- **Datenfluss und Pattern Library aus dem Designsystem; Abgleich je Tool; Pattern Library 0.9.0; Core 0.5.25** (user: "Ja, bau B so …"; "übersicht und pattern lib halten sich selbst nicht an die pattern lib"; "wie bei THA tools hätte ich gerne die abhängigkeiten klarer > wenn sich an pattern lib etwas ändert, zeigen welche engines/tools nicht abgeglichen sind"; "man kann denke ich auch zusammenfassen … wir sind da sehr kleinteilig"). **New blocks** in the core and the library: Status (dot and word, legend; colours as tokens `--status-ok/-warn/-error` instead of hex in the page), Etikett, Tabelle, Steckbrief (molecules); Seitenkopf, Navigation, Datenfluss, Dokument, Baustein-Karte (organisms); Übersicht (template); the inspector as reading panel (`.inspector.wide`); a link as action (`a.action`). **Dashboard and library** have no `<style>` and no style attribute of their own any more – about 50 and 60 own rules are gone; `check-standard.py` checks both like tools. **Abgleich:** the library has a version (`DT_LIBRARY` 0.9.0, `patterns/CHANGELOG.md`), a changed block gets the new version in `DT_CHANGED`, every tool names in `tool.json` „library“ the version it was checked with (all 17 at 0.9.0). The Datenfluss's traffic light is now the alignment (green abgeglichen, yellow nicht abgeglichen with the blocks, red veralteter Core; the phase moved to the list and the panel); the library shows the status of every page at „Verwendet in“ and „Geändert in“ per block; the check prints a hint per tool. Tested with a pretend change of Inspektor: all 17 tools listed. **Datenfluss:** Prinzipien → Pattern Libraries → Tools → Ausgaben → Auslieferung; the UI library and the brands stand side by side as pattern libraries, the UI library fed by all three principles, the brands only by the design principles (their form) – their content is the brand's own guide (user: "müssen die marken pattern wirklich durch unser prüfsystem?") (user: "oder wir bringen pattern library und marken auf eine ebene. das sind alles pattern library die parallel stehen"; before: "… auf ebene 0 holen"). A brand is one field (THA, HMI Project) with its rules in its panel, instead of twelve rule fields — the coming brand library (concept §3.5: blocks, rules, vocabulary per brand). **Principles renamed** (user: "2. würde ich nur noch UX nennen", "und 1 designprinzipien"): `docs/QS/1-Designprinzipien.md`, `docs/QS/2-UX.md`.
- **Die Prinzipien in drei Einheiten, jede Regel einmal** (user: "die prinzipien sollten sich auf diese 3 einheiten aufteilen. man könnte statt konzept auch ‚designkonzept‘ verwenden. semantik gehört zu UX, icons und linien zu UI. insgesamt auf redundanzen prüfen, auch in abgleich mit pattern lib"; "Ja, in dieser Reihenfolge: A …"). `docs/QS/1-Designkonzept.md` (Leitsätze, Haltung, Marke und Ergebnis, Erschließung, Ordnung, Basic/Advanced, Lebenszyklus mit Maeda, Architektur mit Engines und Datenfluss, Zusammenarbeit), `2-UX-und-WCAG.md` (Nielsen as one table of rule and question, Krug, semantics of controls, labelling, vocabulary, WCAG), `3-UI-und-Patterns.md` (the library, atoms, skeleton, Gestalt and Data-Ink, symbols and lines, the check). `docs/Grundprinzipien.md`, `DESIGN.md`, `Semantik-Bedienelemente.md`, `Icons-und-Linien.md` and `1-Konzept-und-Architektur.md` are gone into them; the QS README says where each part went. Found four places for the same rules (Nielsen twice, when/when not of a control three times, the skeleton and inspector in DESIGN and in the blocks, symbols four times) and stale ones (Basic/Advanced as a switch, a language choice, a settings gear in the tool, „Module“, `check-ui.py`) — removed. **Rules of one block stand only at the block:** the skeleton of a tool at Vorlage Tool, the objects and marks on the stage at Marken auf der Bühne, the structure of the inspector at Inspektor, the colour rule at Farbfelder. About 100 references in code and docs point to the new places (`QS 3 §3.2`, `patterns: Inspektor` …); old reports in `docs/QM/` keep theirs. The project dashboard shows three principles instead of six; CLAUDE.md and README read the new structure.
- **Custom Type 0.2.12: ↑/↓ beim Schreiben wieder da** (user: "hier fehlen inzwischen auch die pfeile zur auswahl der zeichen"). With the stage's object model (0.5.7) writing showed only the caret; DESIGN §2b0 and §2b contradicted each other. Now, while writing, the letter at the caret has ↑ above and ↓ below as the core's stage button (`stageButtonSVG(x, y, cls, up)`, new: the chevron up) where it has alternates; a click steps like the arrow keys, the caret stays. Core cache tags 0.5.23.
- **Ein Symbol, eine Bedeutung; die Regel der Segment-Reihe im Core** (user: "verwenden wir dieses icon nicht einmal für split (background) und einmal für gruppe bei video? das sollten wir nicht machen"; "ok" to the recommendations). `split-screen` means „Geteilt“ only (Keyvisual, Keyvisual animiert); Bildoverlay's Vorher / Nachher has Carbon `compare` (Bildoverlay 0.2.4), the Case Film's „Mit dem nächsten gleichzeitig“ Carbon `group-objects` (Case Film 0.4.52) (both from @carbon/icons 11.50.0 into `core/icons/carbon.json`; inventory updated). **Segment-Reihe:** `selectsAsSegments` turns a pulldown into a segment row only if its options fit unshortened in one line of the dock (252 px) at size Groß, measured with the real CSS (`segmentRowFits`). **Keyvisual animiert 0.3.7:** Bewegung (Ticker, Laufschrift, Zeichnen, Wandern) is a pulldown ("das ist noch nicht gelöst" – Wandern was cut); the probe „Vorschau“ (playing a motion while pointing at it) goes with the row. Checked every segment row of all tools against the rule: all fit, but the one in the dialog „Farben aus dem Bild“ (Gradient, Gradient Blend), which is wider than the dock and fits there.
- **Core 0.5.22: Atome an einem Ort – Hell und Dunkel mit System, Schrift als Skala, Bewegung in der Library** (user: "Ja, setz das Konzept so um … Beginne mit den Atomen" – docs/Konzept-Atomic-Design.md; "ich kann außerdem keine systematik für dark/light mode erkennen"; "verhalten/easings usw gehören auch in pattern lib"; "die headline muss immer eine einheit entsprechend des fontscalings größer sein"). **`core/tokens.css`** holds every token, `ui.css` imports it; the two token layers (the old one from THA Designtools and the UI layer) are one. **Hell/Dunkel** is decided only in its block „Modus“ (system, or Einstellungen → Darstellung): a colour is one token with both values, `light-dark(hell, dunkel)`; a measure that changes with the mode is computed from `--dark`; what cannot be computed (`--only-light`, `--only-dark`, `--hatch`) stands in the block. The 16 switches on single blocks are gone (Blau des Bearbeitens, Farbfelder, Kacheln, Schraffur; the dashboards' previews, Fontscale's logos as tokens `--only-*`, `--art-filter`); the page ground of the HMI tools is a token (`--ground`, `--ground-dark-content`) instead of a colour computed in JS once at load — it now follows a change of the mode. Measured with `scripts/modus-messen.html` (new: every element of 21 pages in Hell, Dunkel and System hell/dunkel, before and after): no difference but the intended — the selected swatch has one ring everywhere (a second ring from the old layer is gone; HMI's swatches keep their edge when selected), the browser's own controls and scrollbars follow the mode (`color-scheme`). **Schrift:** one scale, each step × 1,125 from `--fs-label`, rounded — Abschnitt 15 px (was 14), Titel 16, Seite `--fs-headline` 19 px (new: dashboards and library had the title size for the page). **Bewegung:** the core's 45 durations by hand are six tokens (`--t-press` 100 ms … `--t-pulse` 1,6 s), the one curve by hand is `--ease-out`. **Library:** new atoms Hell und Dunkel, Easings (the curves of `EASINGS`, drawn from the functions themselves), Takt und Rollen (Haupt, Akzent, Neben from `taktSwing`, with the beat); every atom lists its tokens with the light and the dark value and a sample on each ground, read from `tokens.css`. The level tag no longer uses the core's class `.chip` (the circle beside „Atom“). Pages show no template copy ("das ist ein prinzip, das von mehreren verwendet wird"), a template may name other blocks to include them (`{{#dock}}`); the templates themselves are still drawn — next step. Dashboard and library have an empty icon ("hier wird noch das tha logo verwendet – löschen": the browser showed the last icon it kept for the server). **Farbfelder:** every pairing is a dot on its ground, also for the band (user: "ich möchte überall die runden verwenden, diese ausnahme weglassen"), drawn by `pairSwatch(fg, bg)` in the core (Keyvisual 0.1.10, Keyvisual animiert, Kamera 0.2.6, Custom Type 0.2.11). **Segment-Reihe:** a rule — all options unshortened in one line, also at size Groß, else a pulldown ("dafür brauchen wir eine regel"). **Keyvisual animiert 0.3.6:** Video and Werte stood outside the inspector's body (a stray `</div>` from Core 0.5.15) — the big gap and the missing edge ("video klebt unten"). Fontscale 0.2.8 (logos by token). **check-standard.py** reports a switch for light/dark outside tokens.css (core, tools, dashboards, library), a duration or curve by hand in the core, a section of the inspector outside its body, and every stripe swatch. DESIGN §1, §3 and QS level 3 say so. Checked: library, core, all 17 tools ok.
- **HMI: Favicon ohne helle Unterlage** (user: "bitte HMI icon ohne die weisse pixel outline"; "ok"). The browser put the black square on a light plate in a dark tab bar. `brands/hmi/favicon.svg` draws only the four marks (`brands/hmi/symbols/1-1`: RadioOn, RadioOff, CheckOn, X) black on a white square with a margin, like tha.de's icon (user: "das wird komisch abgeschnitten. tha ist auch eckig" — a transparent icon got a rounded plate that cut the marks); the PNGs stay as fallback. Linked in the brand dashboard and the eleven HMI tools (fontscale 0.2.7, gradient-blend 0.2.6, gradient 0.2.6, helio-grid 0.2.6, helio-logo 0.2.11, hmi-arrows 0.3.5, hmi-faces 0.2.11, hmi-facetrack 0.2.8, hmi-grid 0.2.13, hmi-logo 0.2.12, qr 0.2.6) and the Case Film (0.4.51).
- **Pattern Library: Seiten ohne Vorschaubilder** (user: "die thumbnails gehören nicht in die pattern lib, die würde ich als assets einstufen"). The previews are the tools' assets, not patterns: each page now shows its template (Tool, or Case Film for the Case Film) with a link to open the page, and a row „Vorlage“ linking to the template block. Examples keep at most 400 px width. QS level 3 says so (3.0, Seiten).
- **THA: Icon von tha.de** (user: "bei THA bitte das icon von https://www.tha.de/ verwenden"; "das THA icon auf der übergeordneten ebene (pattern lib etc entfernen)"). `brands/tha/favicon.svg` is now the site's icon (red THA on white, 48 px, from https://www.tha.de/favicon.svg), `brands/tha/apple-touch-icon.png` its 180 px touch icon, linked in the brand dashboard and the five THA tools (bildoverlay 0.2.3, custom-type 0.2.10, kamera 0.2.5, keyvisual 0.1.9, keyvisual-animiert 0.3.5). The former mark with the full name stays the Case Film's graphic „Zeichen“, now `brands/tha/symbols/zeichen.svg`. Project dashboard and pattern library show no brand icon any more.
- **Pattern Library nach Atomic Design, Tools nur aus Patterns – geprüft; Core 0.5.21** (user: "recherchiere nochmal grundsätzlich wie man mit styleguides arbeitet und eine pattern library führt … das zugrundeliegende prinzip https://atomicdesign.bradfrost.com. stelle sicher, dass die pattern library so gebaut ist, dass die tools ausschließlich mit patterns gebaut werden. die patternlibrary … soll hier auch als best-case demonstriert werden können. berücksichtige das in der qualitätssicherung"). Research: Brad Frost, Atomic Design ch. 2–5 (five stages, the part and the whole, Pattern Lab: nesting, variations, code view, documentation, lineage; workflow: interface inventory, systems not pages; maintenance: library and product in sync, contribution, deprecation), GOV.UK Design System (example, when, how, variants, accessibility, changes). **Fifth stage „Seiten“:** the tools themselves, each with what it is really built of (read from its code) and what is its own (stage, probes); the dashboards count as pages. **Per block:** status, Wann, Wann nicht, Zugänglichkeit, states side by side (Schalter, Segment, Farbfelder, Handlung, Format), Teil von, Klassen, Verwendet in (from the code), Markup to copy; measures read from the control. **New blocks:** Dock (organism), Meldung (molecule); documentation completed for all 17 molecules and 12 organisms. **Only patterns, enforced:** `DT_CLASSES` in blocks.js names every block's classes, `DT_STATES` the states, `DT_SIGNS` the signs of blocks without a class (Regler, Format, Einstellungen); every tool declares in `tool.json` „own“ its stage, its show/hide hooks and its probes with their classes; `check-standard.py` reports a class of no block and not declared, an own style on something undeclared, a used block missing from „blocks“, and checks the library itself (documentation, classes or sign). All tools' „blocks“ now list what they really use (Dock, Inspektor, Meldung … had been missing everywhere); dead core rules `.icon-check-*` removed. **QS:** level 3 opens with the library — principle (the five stages), what a good library shows, how it is built and kept, the library as best case with its questions; DESIGN §2 „Only patterns“; level 1 architecture names the five stages. Checked: library ok, core ok, all 17 tools ok; the library shows 41 blocks in five stages, 17 pages, no block in no page.
- **Core 0.5.20: Typografie als Atom** (user: "auch typografie ist oberflächlich definiert"). Measured in a tool: eight text styles in dock and inspector; two titles differed (the inspector's title a fixed 15 px beside the dock's 16 px, not following the Schriftgröße; the settings dialog's +4 px) — both now `--fs-title`. **Atom „Schrift“** (new, split from „Abstände und Schrift“): family Inter UI (variable, Latin and Latin Extended, cv11 and ss03, tabular figures for values), everything derived from `--fs-label` (12 · 13 · 14 px); seven roles with token, size, weight and tracking — Titel, Abschnitt, Label, Bedienelement, Wert, Klein, Werte (mono) — with a live specimen; rules for weights (two at most in a group), no grey, italics or capitals in the UI, and German setting (quotes „…“, dash with spaces, decimal comma, unit with a space, ×, →, set by `deNum()`). **Atom „Abstände“** on its own with the three steps drawn. The library orders blocks within a level by their rank, and the blocks with text name Schrift among what they are made of.
- **Core 0.5.19: Pattern Library professionell, Symbole dokumentiert, eine Kachel-Regel** (user: "bei symbol ist super wenig dokumentiert. keine größen, nicht die verwendeten symbole. allgemein ist die pattern lib wenig professionell"; "mich stört die unterschiedliche einpassung in die buttons … breit hat links und rechts zu große abstände"; "das gilt natürlich auch hier und zeigt mir, dass du nicht richtig mit patterns arbeitest" — the style tiles had been left out). **Pattern Library:** a navigation by level with search and the core version; per block its level, id, meaning, the rules as a list, measures read from the rendered example (molecules and organisms), what it is made of, where it is used (the tools' `tool.json` `blocks`) and how to call it. **Symbol:** sizes (18 px in the 28 px Symbol-Knopf and beside a word, 16 px in a tile, 12 px as fold arrow and in the stage button, drawn on 32 units, stroke ≈ 1,1 px at 18 px) and the inventory of all 24 symbols the tools use, each with its Carbon id, meaning and the tools — from `scripts/symbols-inventory.py` → `patterns/symbols.json`; the ten that lived only inline in the tools (skip--back, play, maximize, chevron--right, copy, circle-dash, add, upload, text-align left/center/right) are now in `core/icons/carbon.json` too; maximize has two drawings (to unify). **Kacheln:** one rule for both kinds — icon (img) and drawn letter (svg, Custom Type) —: the content 16 px high in its own proportion, 8 px all around, so 32 px high and as wide as its content; no ground, Tönung 1 on hover, chosen a 2 px ring inside; Custom Type's direction mark beside the letter (10 px) instead of in a corner; the width classes are gone; HELIO Logo's orders follow the rule. Versions: HMI Grid, HMI Faces, HMI Facetrack, HMI Logo, HELIO Logo, Custom Type each +1. Checked: tiles in HMI Logo and Custom Type (32 px, aligned with the label, no ground), the library's 38 blocks and 24 symbols.
- **Qualitätssicherung in drei Ebenen, Grundlagen eingebettet; Core 0.5.18: Kacheln klein und bündig, Farbtokens** (user: "wir haben grundlagen ausgelagert, ich würde das lieber projektbezogen zusammenführen, auch mit blick auf qualitätssicherung. ich möchte 3 ebenen … die prinzipien bitte entsprechend zusammenführen"; "Grundlagen bitte dann auch in THA tools einbetten. ich will den ordner nicht auf oberster ebene"; the tiles: "aktuell deutlich zu gross … irgendein leichter grauton ist noch im hintergrund > bitte farbtokens prüfen"; "die buttons stehen links deutlich über, abstand zu label zu knapp"). **`docs/QS/`:** README (the three levels, the course of a check, severity, report template, where each former rule went) and one file per level — 1 Grundkonzept, Designansatz, Architektur (Leitsätze, Shneiderman, LATCH, Basic/Advanced, Maeda, choreography, the layers of the code and Atomic Design); 2 UX und WCAG (Nielsen's ten, Krug, WCAG 2.2 AA criteria with the project's rule and how to check each, cross-cutting questions, measures); 3 UI-Konsistenz und Pattern Library (blocks and probes, `check-standard.py`, semantics, Gestalt, Data-Ink, icons and lines, the rules of DESIGN.md, questions) — with `Semantik-Bedienelemente.md` and `Icons-und-Linien.md` (the Designtools' part only). The measuring script is `scripts/ui-kpi.js`. CLAUDE.md, README, DESIGN.md, Grundprinzipien, the dashboard's principles (now the three levels) and the library point there. **`Documents/Claude/Grundlagen/`** is gone from the top level: THA Tools have their copy in `THA Tools/Grundlagen/` (their CLAUDE.md, QM report and Semantik point there), the old folder is in the Trash. **Kacheln:** 32 × 32 px (the height of the other controls), wide 72 px, no ground at rest (hover Tönung 1), chosen = a 2 px ring inside the tile, so the tiles start at the fields' left edge and keep the label's distance. **Farbtokens:** with the system set to dark (no choice in the settings) `--raised`, `--muted`, `--knob`, `--accent`, `--track` kept the old layer's values (greys #4a4a4d, #9c9c9c); now the same as Dunkel chosen.
- **Core 0.5.17: Atomic Design, Kacheln als Auswahl, Case Film hell/dunkel, Griffe, Knöpfe** (user: "pattern-lib: ist aktuell wirklich nur pattern, kein atomic design … das fehlt mir komplett"; "mich wundert, dass der case film nicht zwischen dark und light mode wechselt"; "bei buttons wie zustand kopieren steht der text nicht exakt vertikal in der mitte"; "gradient: die handles erscheinen bei mir nicht"; "die quadratischen icons auch quadratisch … die breiten doppelt so breit"; "in die logik auswahl (wie bei farbe), die markierung eine outline"). **Pattern Library nach Atomic Design:** four levels — Atome (the core's tokens: Farbe, Grund und Fläche, Abstände und Schrift, Form, Linie und Schatten, Symbol, Bewegung, Trefferfläche — six new), Moleküle (16 controls), Organismen (11 parts of a tool), Vorlagen (Tool, Case Film, Dashboard — new); every block names what it is made of („Besteht aus“, linked); the page shows them level by level (`DT_LEVELS`, `level`, `uses` in blocks.js). **Kacheln:** each tile in its icon's shape — square 48 × 48, a wide icon twice as wide (`.w2`, `.w3`, `.w4`), 12 px apart; chosen is a ring in ink as with the colour fields, no longer a filled tile (HMI Grid, Faces, Facetrack, Logo; HELIO Logo's orders as wide tiles). **Case Film** follows the UI's Darstellung and Schriftgröße from the settings (it never read them); the film's own Farbe is content and stays. **Gradient, Gradient Blend:** a field is found where it is seen — the nearest whose core (half its visible radius, at least 18 px) holds the pointer; before only 18 px around its moving, unmarked centre, so its handles never appeared. **Handlung:** the label moved up a pixel (lowercase sat ~1 px low in Inter's line box), same height. Versions: Case Film 0.4.50, Gradient 0.2.5, Gradient Blend 0.2.5, HELIO Logo 0.2.9, HMI Faces 0.2.9, HMI Facetrack 0.2.6, HMI Grid 0.2.11, HMI Logo 0.2.10. Checked in the browser: Gradient's handles on a click, HMI Logo's tiles and rings, the Case Film in Hell/Dunkel/System, the library's four levels.
- **Core 0.5.16: die eigenen Styles der Tools geordnet** (user: "Ja, geh die eigenen Styles der Tools durch … und stimm mit mir ab, was kein Baustein hat"; decided: the stage belongs to the tool; Palette, Farbwahl, Dialog as blocks; single parts as probes; Partitur as a block). 272 rules on the tools' own classes, sorted. **Removed:** 19 own [hidden] rules (the core's `[hidden]` does it), a dead rule (Keyvisual's `.adv-stack`), Fontscale's own spacing under the base size (pattern Abstände), Keyvisual animiert's wrapping Bewegung row. **Into the core:** the growing text field (QR, Fontscale; Kamera's and Keyvisual animiert's band text now use it), and from Gradient and Gradient Blend, the same in both, the blocks **Palette** (chips: pick, drag, remove, + as a Symbol-Knopf), **Farbwahl** (the colour popover) and **Dialog** (Farben aus Bild) — the two tools keep only their stage. **DESIGN.md §2:** what lies on the stage belongs to the tool; everything off the stage comes from a block, a part only one tool has is a probe until a second tool needs it or the user approves it. **Probes** marked (`data-probe`, tool.json): Keyvisual's stage note with actions and the warning at the label, Facetrack's start card, Kamera's button and choice in one row, Fontscale's logos as pictures in the segment, HELIO Logo's tiles of four letters (with Keyvisual's Varianten and Keyvisual animiert's Zeitleiste and Vorschau already). **Library:** Palette, Farbwahl, Dialog and **Partitur** (the Case Film's row of acts, tools, beats and pills with the play row — a block, its styles stay with the Case Film; probes reihe and akte retired). Versions: Fontscale 0.2.6, Gradient 0.2.4, Gradient Blend 0.2.4, HELIO Logo 0.2.8, HMI Facetrack 0.2.5, HMI Logo 0.2.9, QR 0.2.5, Custom Type 0.2.8, Kamera 0.2.4, Keyvisual 0.1.8, Keyvisual animiert 0.3.4. Checked: standard check ok; Gradient's chips (28 px, round), + button and colour popover in the browser; the library shows the five new blocks; the changed tools load every file.
- **Core 0.5.15: Prüfskript grün – Bausteine freigegeben, lokale Styles in die Bausteine** (user: "ja"; "Freigeben" — the six proposals; "Ja, Baustein" — Seed-Zeile; "In die Einstellungen" — the Case Film's settings symbol; "Symbol-Knopf +" — Gradient's add field). `scripts/check-standard.py` reports `ok` for the core and all 17 tools. **Pattern Library:** Grund und Fläche, Abstände und Schrift, Inspektor, Abschnitt und Gruppe, Feldzeile and Handlung approved, their open questions answered with the state built (Case Film: Speichern in the inspector's foot, the choice's actions as symbols in the head, Verhalten as a pattern); new block **Seed-Zeile**. **Into the core**, once instead of in the tools: the seed row (seven tools), Keyvisual's whole text field and Fontscale's number field with its unit (block Textfeld), the direction mark of a tile (Kacheln), the Verhalten rows, Besonderes and the pills' places (Case Film), a wrapping `.btn-row`, the inspector head's shortening name and its foot, a 24 px tab, a disabled symbol button, a template's remove mark. **Out of the tools** as copies of the core: hidden rules, press and reduced-motion rules, dead rules (Gradient, Gradient Blend, Facetrack, Kamera, Bildoverlay). **Gradient, Gradient Blend:** the add field is a Symbol-Knopf with Carbon „add“. **QR:** the contact as the pattern's field rows (label above, one per row). **Bildoverlay:** its picture actions are a Handlung row. **Keyvisual animiert:** Bewegung's four options as a plain segment row. **Case Film:** the core inspector (`aside#inspector`, fixed at the right edge, the app beside it): head „Inspektor“ · the choice · its actions · Schließen; Werte with Zustand kopieren and Zurücksetzen (was „Dramaturgie neu laden“ in Inhalt); the settings symbol is gone — Metronom and Bild-Versatz are in the dashboard's settings („Case Film auf diesem Gerät“, kept as preferences, a value set before still counts, a change there reaches an open Case Film); the scrub line shrinks with the stage. Versions: Bildoverlay 0.2.2, Custom Type 0.2.7, Kamera 0.2.3, HELIO Grid 0.2.5, HELIO Logo 0.2.7, HMI Arrows 0.3.4, HMI Faces 0.2.8, HMI Grid 0.2.10, HMI Logo 0.2.8, QR 0.2.4 (and those raised in 0.5.14). Checked in the browser: Case Film inspector at the edge on the ground, close and reopen, Werte actions, no settings symbol, the scrub row at 800 px; the settings dialog with the Case Film group; the library with 25 blocks, none „Vorschlag“. Not seen by the check and still open: tool styles on the tools' own classes (e.g. Fontscale's logo images in the segment).
- **Core 0.5.14: QA, was die Regeln schon entscheiden** (user: "ja" — step 1 of the delivery, `scripts/check-standard.py` green; docs/QM/qa-regeln-und-patterns.md). **Grund:** the inspector stands on `--offset-bg` in every tool and at every format (user, 24.10.2026; it was `--paper` unless the format was fixed). **Trefferflächen:** the zones' presets (Alles rund / kantig) and the Case Film's fold buttons have 24 px. **Keine Linien, keine graue Schrift:** Gradient and Gradient Blend lose dead border rules (the colour fields, the add field's grey, the picture dialog's head, the colour popover), the picture points draw their white ring as a shadow, the hex and template-name fields are the core text field; Facetrack's start card has no frame; the Case Film has no line between Bühne and Partitur and none under the act heads. **Reiter wie das Dock:** Keyvisual Schrift · Band · Ecken · Bewegung · Werte, Keyvisual animiert Schrift · Bewegung · Video · Werte (sections moved with them). **Fontscale:** the logo is a switch, HMI or HELIO under it while on (was a segment with „Ohne“). Gradient 0.2.3, Gradient Blend 0.2.3, HMI Facetrack 0.2.4, Case Film 0.4.49, Keyvisual 0.1.7, Keyvisual animiert 0.3.3, Fontscale 0.2.5. Checked in the browser (tabs, switch, inspector ground #1c1c1e, fields). Open, as they need a pattern or a decision: the local styles in every tool, the dashed add field in Gradient, and the Case Film's settings symbol and inspector.
- **Tools nach Marke geordnet, HELIO bei HMI** (user: "hier ist gar nix aufgeräumt" — the tools/ folder; "HELIO und HMI gehören zusammen"; "wir können es einfach unter HMI zusammenfassen"). `tools/hmi/` holds the eleven HMI and HELIO tools, `tools/tha/` the five THA tools, `tools/case-film/` stays for every brand; folder names and tool ids unchanged, so kept states stay. `brands/helio/` is gone: its letters, card and wordmark are `brands/hmi/symbols/HELIO/` (the wordmark `HELIO/typo/`), its sources `brands/hmi/quellen/helio/`. `tools/index.json` lists folders (`hmi/hmi-grid`); the brand dashboards, the project dashboard and `scripts/check-standard.py` read them; the tools reach the core one level further up; the Case Film, the labs and the film packs load the render.js files from the new folders. CLAUDE.md and README describe it. Checked in the browser: all 17 tools, both brand dashboards (HMI 12 tiles, THA 6), the project dashboard and three labs load every file, none fails. The lab pages einstieg and spuren (another session's, not in git) still read the old list. No tool versions raised: paths only.
- **check-standard.py meldet jetzt alle Funde des QA** (user: "check-standard.py so erweitern, dass es alle gefundenen Verstöße meldet, auch beim Case Film"; Bericht `docs/QM/qa-regeln-und-patterns.md`). New: a line for the core itself (the inspector's ground depends on the format, ui.css; the zone presets under 24 px); per tool: local styles for core building blocks, lines and grey text in its own CSS, targets under 24 px set there, „Aus“/„Ohne“ as a segment option, settings in a tool, the core inspector (head Inspektor · Auswahl · Schließen, Werte with Zustand kopieren and Zurücksetzen) and its tabs in the order of the dock. The Case Film no longer leaves the checks early: only the dock's head and foot are spared, its inspector is checked like every other. The tools are found under `tools/<id>/` and `tools/<brand>/<id>/`. Result today: every tool and the core report findings (exit code 1) — they are the QA's; nothing in the tools changed. Found beyond the QA: Keyvisual's tabs (Band before Schrift) are not in the dock's order either.
- **Aufgeräumt: je Marke ausgeliefert, ohne Varianten und Labor-Reste; Case Film 0.4.48** (user: "eine saubere Ordnerstruktur, alles weg. Zu viele Versionen und Sonderlocken"; "Ja, räum nach der angepassten Liste auf, mit deinen Empfehlungen bei Ton, Keyvisual und Labor"). **Ausgeliefert** (`phase: ausgeliefert`): HMI Logo 0.2.7, HELIO Logo 0.2.6, Gradient 0.2.2, Gradient Blend 0.2.2, HMI Grid 0.2.9, HELIO Grid 0.2.4, HMI Arrows 0.3.3, HMI Faces 0.2.7, HMI Facetrack 0.2.3, QR 0.2.3, Fontscale 0.2.4 (HMI); Custom Type 0.2.6, Bildoverlay 0.2.1, Kamera 0.2.2 (THA). Still in the lab, because they have probes: Keyvisual (Varianten, Winkelhilfe), Keyvisual animiert (Zeitleiste, Vorschau), Case Film (Reihe, Akte, Charakter — Reihe and Akte are approved but not yet blocks in the library). **Case Film 0.4.48:** the rows A (Liste) and C (Takt) are gone with their switch and texts — the row is Reihe B; this also keeps a hidden inspector hidden after reloading (the switch reset the app's classes). Only „Botschaft“ per brand is left in `templates.js` (the ten lab dramaturgies and `?labor` removed, with the helpers only they used); a film saved with one of them loads its brand's „Botschaft“. Sound: only „Takt 120 · eigen“ (our own); „Beauty Flow“, „Go Cart“ and „Comp23 · lang“ removed (Comp23's original in `brands/tha/quellen/audio/`); the examples are listed once, `SOUND_EXAMPLES` in `audio.js`, after the brand's own (`assets.audio`, empty for now); the lab pages play Takt 120, and `docs/labor/arrangieren.html` loads HMI Arrows again (it had stopped at „Botschaft“ since Case Film 0.4.23). The images' „Schnitt“ is „Wechsel“. **Files removed:** 25 HELIO photos and 12 halves no template uses (Flyer, Social, Website, Stifte, T-Shirts; `HALF` and the photo scripts follow), the unused glyphs E_alt, I_alt, LI, ←←, →→, _; the one-off takeover scripts (`uebernahme-*.py`, `uebernahme-de.json`); the old reports `Bestandsaufnahme-UI.md`, `QM-Check-Keyvisual-0.29.md`, `Semantik-Pruefung-Keyvisual.md`. The PDF sources of the arrow and the HELIO letters moved to `brands/hmi/quellen/symbole/` and `brands/helio/quellen/symbole/`. References to the deleted THA Designtools updated (`CLAUDE.md`, `README.md`, the heads of `brands/tha/*.js`).
- **Starter-Server: keine abgebrochenen Verbindungen mehr** (user: "Ja, behebe den Verbindungsabbruch im Starter-Server"; observed by the Ton session: ERR_CONNECTION_RESET while a tool loaded its symbols, once engine.js, and the Case Film did not load). `scripts/serve.py` was threaded but kept the default queue of 5 waiting connections; the HMI tools ask for 60–250 files at once. Now a queue of 256 (the system allows 128) and daemon threads. Measured with as many requests at once: the old server lost 32–91 of 60–120, the new none. Takes effect when the starter is started again.
- **Quellen bei ihrer Marke; THA Designtools entfernt** (user, 24.10.2026: "THA Designtools kannst du löschen, nur noch neue version"; "Designtools-Quellen will ich nicht. Bitte brand zuordnen"). Die Originale liegen jetzt in `brands/<marke>/quellen/` (je eine README, nicht in Git): `brands/hmi/quellen/fotos/` (die HMI- und HELIO-Fotos), `brands/tha/quellen/` (`audio/Comp23.wav`, `Fonts/` mit THA Everett und TWK Everett, `00_THA_Bearbeitungsvorlage_Fotofilter.psd` — die beiden letzten aus dem alten Projekt). `../Designtools-Quellen/` und das alte `../THA Designtools/` liegen im Papierkorb. CLAUDE.md und `scripts/film-photo-halves.py` zeigen auf den neuen Ort.
- **Case Film 0.4.47: der Film liegt auf dem Ton — Einsatz erkannt, Takt korrigierbar, Reaktion auf Ton als Schwelle** (user: "wenn ich andere songs lade, ändert sich das tempo, aber man hat nicht das gefühl, dass die animation zum sound passt"; "es könnte an der unterschiedlichen 1 liegen"; "ich würde versuchen den takt zu erkennen und zu korrigieren. die reaktion wäre z.b. ein regler, wie stark reagiert werden soll"; "reaktion auf ton würde ich wie ein threshold behandeln"). **Gemessen** an Comp23, Beauty Flow, Go Cart und drei eigenen Songs (die echte Analyse gegen eine unabhängige Kurve der Anschläge): Tempo und Schlag saßen auf ±10 ms. Die Ursache war die **Eins der Phrase**: die Dramaturgien stehen auf Comp23 (Intro 2 Takte, Teil A ab Takt 3, Break 23, Teil B 27, Outro 47), Go Cart hat 8 Takte Intro (Einsatz Takt 9, voll ab 17) — die Schnitte lagen auf Takten, aber mitten in den Phrasen des Songs. Und die **Reaktion auf Ton wirkte nicht**: Lautstärke und Bass-Anschläge gingen an jedes Tool, keines las sie; die Anschläge waren zudem jede Bassnote, nur 17–26 % davon auf einem Schlag. Jetzt: die Analyse findet die Wechsel des Songs auf Schlägen (ein Auftakt auf 3 oder 4 zählt zur nächsten Eins; Go Cart Takt 9 statt 8) und **wählt den Einsatz**: der Film beginnt dort im Song, wo dessen Wechsel auf die Form der Dramaturgie fallen, höchstens 16 Takte Intro übersprungen (`soundEinsatz`, audio.js) — Comp23 ohne festen Wert auf 0,732 s (gemessen 0,736), Go Cart bei 12,5 s (Einsatz auf Takt 3, die volle Band auf Takt 11), Beauty Flow 7,5 s. Im Inspektor unter Ton: **Einsatz** ± Takt und ± Schlag, **Halbes / Doppeltes Tempo** (Footloose wurde mit 87 statt 174 BPM erkannt), **Reaktion auf Ton** als Schwelle (starke Schläge ↔ alle): je Schlag des erkannten Rasters wird gemessen, wie hart er gegenüber den Takten um ihn angeschlagen ist; nur über der Schwelle wird das ganze Bild kurz größer (bis 4 %, in 15 ms, weg in etwa 0,15 s). Gemessen: 100 % der Reaktionen auf einem Schlag; bei 0,3 nur die stärksten Akzente (Go Cart 17 in 96 s, fast alle auf einer Eins), bei 1 etwa zwei je Takt. Reaktion wird mit dem Projekt gespeichert. **Tempo auf die Hundertstel** (user: "der puls ist auf jeden fall versetzt" — "master blaster geht, comp 23 auch. anderes klappt nicht so gut"): der Film rundete das erkannte Tempo auf ganze BPM, und die Analyse fand es nur auf etwa 0,5 BPM genau — Sledgehammer (96,41 als 96) lag nach 90 s 366 ms neben den Schlägen, Get Back 355 ms, Play That Funky Music (110 statt 109,6) 574 ms. Jetzt verfolgt die Analyse die Schläge durch den ganzen Song und legt eine Gerade hindurch; der Film nimmt das Tempo ungerundet. Gemessen über 96 s an zehn Songs: Studio-Aufnahmen ±27 ms, live gespielte (Get Back, Funky) bis 56 ms, da schwankt ihr Tempo selbst. **Reaktion nach Gewicht im Takt**: ungewichtet schlug die Reaktion bei Go Cart 19 von 47 Mal auf 2, 3 oder 4 aus und bei Sledgehammer gleichmäßig auf allen vier, gegen die Tools, die auf der Eins wechseln — das wirkte versetzt; bei den Songs, die saßen (Comp23, Master Blaster), kam sie auf der Eins oder kaum. Jetzt zählt ein Akzent nach seinem Platz (Eins 1, übrige Schläge 0,6, wie taktWeight): beim Standard 0,6 Go Cart 28 von 34 auf der Eins, Beauty Flow 21 von 21, Comp23 19 von 19. Geprüft auch, ob Go Cart einen halben Schlag daneben liegt: nein — Bass-Drum am stärksten auf 1, Snare auf 2 und 4, Raster auf ±7 ms.
- **Marken getrennt: die Bilder der Marken in `brands/`, ohne Kopien; Quellen außerhalb von Git** (user: "was ist mit der dateistruktur? ordentlich aufgeräumt? brands getrennt?" — "Ja, zieh die Markenbilder nach brands/hmi und brands/helio um, ohne Kopien, und räum die Quelldateien (img/, Comp23.wav) in einen Quellen-Ordner außerhalb von Git"). The brands' artwork lay in nine tool folders (`tools/<tool>/symbols/`, 249 files, 146 of them copies), and the Case Film loaded it from other tools. Now once: `brands/hmi/symbols/` (icons 1-1 … 4-1, wordmark logo_serif, arrow, QR shapes) and `brands/helio/symbols/` (letters, card, wordmark) — HELIO, HMI's product brand, has its own folder with its artwork only (README, no dashboard). Fontscale's own drawings differed from the logo tools': HELIO's E had a spine instead of three bars — decided (user: "3 balken in logo, in wortmarke E"): the logo's letters have the three bars everywhere, the full E belongs to the wordmark (typo/, already so), Fontscale now shows the logo's E (Fontscale 0.2.3); its HMI wordmark, a pixel apart from HMI Logo's, is HMI Logo's now too (user: "ja") — no variants left. All tools, their render.js (the Case Film's and the labs' root + `brands/…`), `brands/hmi/film.js`, `scripts/film-graphics-hmi.py` and the `uses` in tool.json point there; cache tags of the render.js files raised. HMI Grid 0.2.8, HMI Faces 0.2.6, HMI Facetrack 0.2.2, HMI Logo 0.2.6, HMI Arrows 0.3.2, QR 0.2.2, HELIO Grid 0.2.3, HELIO Logo 0.2.5, Fontscale 0.2.3, Case Film 0.4.46 (paths only, nothing to see). `img/` (16 MB, the clean brand photos) and `Comp23.wav` (18 MB) moved to `../Designtools-Quellen/` (hmi-fotos, audio; README). CLAUDE.md says where artwork and sources belong. Checked: the ten tools load every file (Case Film 250, HMI Grid 75 …), none fails; standard check ok.
- **Case Film 0.4.45: Inspektor nach Mantra, Maeda, LATCH und UX-Laws** (user: "aber wie sieht es mit informations seeking mantra, laws of simplicity, latch und UX-laws aus?"; "Setz alle fünf Maßnahmen um"). **Nur Aktives** (Maeda „Hide“): a Verhalten that is off has no row any more — Farbwechsel, Teilung, Aufbau, Rolle, Verlauf, Dialog, Kanon, Nah · fern, Abbau, Charakter; an active one shows its name with Entfernen (Carbon „close“) and its values under it; **Verhalten hinzufügen** at the end of Bewegung lists what fits this tool with where it acts, and the new row is brought into view. **Bewegung nach der Zeit** (LATCH, Miller): Länge, then the groups Auftritt (Aufbau, Rolle) → Im Takt (Takt, Verlauf, the tool's own motion, Dialog, Kanon, Folge) → Raum (Nah · fern) → Abgang (Abbau, Übergang) → Charakter, each under its sub-heading; Abbau no longer stands before what happens meanwhile. **Überblick zuerst** (Shneiderman): under the name the pills of the choice, as in the Partitur; a click goes to its row. **Ein Name je Sache**: the Standbild's „Art“ is **Darstellung** (Große Zeichen, Bild, Grafik); the values of an active Verhalten stand right under its name without a second label. **Besonderes** (Von Restorff): Aufdruck wechselt, Pfeil wächst, Lebendig framed in the inspector as their pill. Measured on all tools and groups of HMI „Botschaft“: height 800–1.200 px instead of 1.200–1.560, no label twice, nothing cut off. Report: `docs/QM/case-film-inspektor.md`.
- **Case Film 0.4.44: THA „Botschaft“ wischt zweimal** (user: "bei THA könntest du noch 1-2 mal den wischer /(invertieren) verwende"; "bei 37-40 ist doch schon viel los. lieber mal bei den vielen horizontalen bändern die alle ähnlich aussehen"). Two Texttafeln — the straight bands that look alike — turn their colour over by a wipe on their second bar (Farbe im Takt · Wischen, on the bar): „I WANT TO MAKE“ (bars 17–18) and the whole sentence „DESIGN IS THINKING MADE VISUAL.“ (41–42). The flowing bands and the four bands stay as they were. A kept film gets it with „Dramaturgie neu laden“.
- **Case Film 0.4.43: der Inspektor ist der des Cores** (user: "ich habe dich mehrfach gebeten den inspektor GRUNDSÄTZLICH zu arbeiten. das ist halbgarer mist. die hälst dich nicht an pattern"; "hier z. b. sind die buttons angeschnitten"). Checked against the pattern library: the Case Film had built its inspector itself — 280 px instead of the core's 340, sections that fold with a chevron and a line above each (DESIGN §4: no divider lines), one 16 px gap for everything instead of the core's steps (label → control, control → next, section → section 40 px), action rows that could not wrap (Projekt öffnen, Entfernen cut off), Speichern only while nothing was chosen. Now it is the core's inspector in the app's grid: head (`.insp-head`: the choice's name, its actions as Carbon symbols; Case Film leads to the overview), tabs as navigation (`.insp-tabs`, one tab = one section, the one in view underlined, a click jumps there), one body of `section.field-row` with their h2 in the core's spacing, and the foot with **Speichern** always there (pattern Speichern, with its symbol, kept through an export). No folding, no lines. Charakter is a group of Bewegung under its sub-heading (`h2.sub`), not a tab — five tabs did not fit; the actions on the Verhalten stay last. Action rows wrap instead of being cut. The scroll position stays when a switch rebuilds the inspector. Checked in the browser on all 20 tools and groups of „Botschaft“ and both parts of a group, dark and light: nothing outside the inspector, tabs = sections everywhere, no block outside the library, sections 40 px apart. Open (not changed here, needs a decision): the gear „Dieses Gerät“ in the play row contradicts the pattern Einstellungen (no gear in a tool); the line between stage and Partitur contradicts DESIGN §4. Details: `docs/QM/case-film-inspektor.md`.
- **Case Film 0.4.42: Aufdruck wechselt ganz; das Grid in der Mitte von „Botschaft“ jedes Mal anders** (user: "das ist aber sehr subtil. ob man das versteht?"; "im mittleren bereich kommt das weisse grid mit dingbats mehrmals hintereinander unterscheidet sich aber nur in auflösung. könnte man auch mal farbwechsel oder anderer aufbau, andere animation machen?"). Mockups: on every step a whole new print stands (a new arrangement of the logo, a new pattern on the bag and the cup) instead of one field swapped, and it lands with a short swell (8 %, settled in about 0.1 s); the same for the T-shirt of Ergebnis. „Botschaft“: 7–8 stays the white wave that builds from the left; 17–18 is now coarse (Raster Grob), breathes in clouds (Perlin, fließend) and on the Eins of 18 black wipes over it (Farbe: Wischen); in the dialogue 19–22 the faces answer first and the grid comes last in bar 21, at random in a cascade (Kaskade, 40 %), so no grid follows a grid. Checked in the browser frame by frame.
- **Case Film 0.4.41: Aufdruck in gebrochenem Schwarz und Weiß** (user: "bei den mockups hilft es wenn man kein reines schwarz oder kein reines weiss nimmt. z. b. 111111 für schwarz. das sieht realistischer aus"). The marks printed on the mockups (and the T-shirt of Ergebnis) are no longer pure: dark ink is #111111, light ink #EEEEEE, at full strength instead of the slight transparency before; the tool's ground still leaves the photo untouched. Checked in the browser: darkest ink 12–15 on the light fabrics and cards, lightest 240 on the black T-shirt (before 0 and 255).
- **Case Film 0.4.40: je Marke nur „Botschaft“** (user: „case-film. ja“ — docs/Offene-Entscheidungen.md, Teil B). The Dramaturgie shows the one delivered per brand (HMI „Botschaft · 96 s“, THA „THA · Botschaft · 96 s“) as a readout, not a choice of one; the others (nach Phrasen, System, Manifest, Kurz, Leer …) stay for the lab — with `?labor`, or when a kept or opened film was made from one. `CASE_FILM_TEMPLATES.forKit(kit, lab)`, `.shipped(id)`. Follows the mockup prints (0.4.39, another session).
- **Case Film 0.4.39: Logo und Muster wechseln auf allen HMI-Mockups** (user: "wäre es möglich bei allen mockups das logo/pattern generativ zu wechseln?" — "wie beim tshirt"). What the T-shirt in Ergebnis did is now a property of the photo: `brands/hmi/film.js` keeps a register `FILM_PRINTS` (photo → the photo without its print and the marks a tool prints there anew, each with its frame, rotation and ink), and every Standbild that shows such a photo — whole or as a half — draws it without its print and lets the tool print it on the beat, moving with the Ken Burns. Dark ink is multiplied onto a light ground, light ink screened onto a dark one (the tool draws it white on black). Printed anew: T-Shirt, T-Shirts (black: the symbols, white: the logo with wordmark, both tilted as photographed), Becher (black: HMI Logo; white: a column of four HMI Grid symbols), Caps (both), Hoodie and the label of the Mütze, Taschen (black: the pattern as HMI Grid 4 × 3; white: the logo with wordmark), Visitenkarten (the front). Each mark has its own run of arrangements, so two caps side by side never match. Standbild → Bewegung: switch **Aufdruck wechselt** (on; only where a picture has a print), and the pill „Aufdruck wechselt“ under Besonderes. `scripts/film-photo-blank.py` makes the photos without their prints (light and dark ink, the grain measured under the mark) and cuts their halves. Not printed anew: Flyer, Social Media, Website (the mark is a small part of a layout or a screen) and Stifte (a band of symbols a few pixels high around a pencil); HELIO's mockups not yet. Checked in the browser: all 12 marks change on the beat, „Botschaft“ › Anwendung shows them, the switch brings back the photographed print, the T-shirt of Ergebnis unchanged.
- **Keyvisual animiert 0.3.2: Wandern im Film einmal ganz durch** (user: "bei THA sind seit der timing umstellung einige bänder zu kurz"; "Wandern im Film läuft pro Szene einmal ganz durch – kommt am Anfang herein, geht am Ende hinaus, dazwischen nie fast leer"). Since a flowing band gets a whole phrase (Case Film 0.4.33, four bars), Wandern's loop showed its gap: the stretch left the end of its band and came back from the start, so mid-scene only a stub was in view for 1–2 s (0.3 % of the picture). In the film the loop is now one pass laid on the scene's length (also when it is not whole bars): the stretch comes in from the start, runs whole along the band and has gone at the end — the gap falls on the cut. It brings itself in and out like Zeichnen, so the film's Aufbau/Abbau no longer wipe over it. The tool's own Wandern loops as before.
- **Core 0.5.13: Teil B der offenen Entscheidungen, Tool für Tool** (user: "Ja, setz Teil B nach deinen Empfehlungen um, Tool für Tool"; "QR. ok", "HMI logo: ja", "case-film. ja"). **Pattern Library:** new blocks **Kacheln** (the probes icon-kacheln and stil-kacheln, their CSS now in core/ui.css once instead of in five tools; HMI Grid, Faces, Facetrack, Logo, Custom Type) and **Zonen** (Keyvisual's Winkelzonen, CSS in the core — it is a control in the inspector, not a stage mark as the list had said); Auswahlliste allows four options when the names are too long for a segment (Facetrack's Mischmodus). A dock heading is a link only while its inspector section is there (HMI Logo, HMI Grid: „Bewegung“ in Statisch); the save button counts down a recording („Noch 4,0 s“) instead of showing nothing. **THA:** rule **Fotofilter** in brand.json (the four layers of the photo template), used by Bildoverlay and Kamera. **Custom Type 0.2.5:** the angle tiles show their direction in the corner (15° geneigt and rückgeneigt showed the same E); colour fields were already dots. **Fontscale 0.2.1:** the logo chosen as the logo itself (images in the segment row). **Gradient 0.2.1:** the chosen own template shows its remove mark without hover; colour fields with a visible edge (`--tint-3`). **Gradient Blend 0.2.1:** Reaktion in the inspector (Griffe), the dock fits 768 px with a picture. **HELIO Logo 0.2.4:** the 24 orders as tiles of their letters (the range stays the state); a crossfade is never longer than the Takt. **HMI Arrows 0.3.1:** „Wirbel“ for „Unruhe“. **HMI Facetrack 0.2.1:** Zurücksetzen in a photo finds every face; Gerät hidden with one camera; the mesh's 468 points r 1 px; a stage hint for editing in a photo. **HMI Logo 0.2.5:** back to Statisch the seed's arrangement comes back; the Stapel comes from the seed (seed + i). **Kamera 0.2.1:** Zurücksetzen gives the factory state also with „Letzten Zustand merken“ (the kept state is dropped, the tool opens fresh). **QR 0.2.1:** Speichern → Kontakt saves the vCard as .vcf; the contact fields in one column with the label beside the field. HMI Grid 0.2.7, HMI Faces 0.2.5, Keyvisual 0.1.6: the tile and zone CSS from the core. Not done yet: Case Film „nur Botschaft“ (another session is in its files), Hochformat and Tempo (put back in Teil A). Checked in the browser: every changed tool loads and builds its controls (24 HELIO tiles, 9 direction marks, vCard in the save menu, Reaktion in the inspector, the stage hint only in a photo, „Bewegung“ no link in Statisch), standard check ok.
- **Core 0.5.12: Teil A der offenen Entscheidungen; HMI Faces 0.2.4** (user: "A" — the recommendations of `docs/Offene-Entscheidungen.md`, part A). **Bühne weicht dem Dock aus:** `stageRoom(framed)` (core/ui.js) gives the width left of the inspector and the floating dock (from where the dock goes, not where it slides); the stage is centred in it, so the dock no longer covers the picture — in all 16 tools with a stage (they had subtracted only the inspector, Fontscale and QR inspector plus dock only while inspecting). Format Frei keeps the whole window, the picture lies behind the dock as before; in a narrow window (room under 45 %) only the inspector counts. The inspector moves the dock before the stage is laid out. **Zahlen deutsch:** `formatSeconds` writes „6,0 s“, `deNum()` sets a decimal comma between digits and a space before s/ms/px; every value readout in dock and inspector (an id ending in Val, the value beside a label, a stepper) is kept German as it changes, the start values in the markup too. **Werte** shows switches as „An → Aus“ (was „true → false“), numbers with comma, typed text in quotes. **Tippen im Rückgängig:** `initControlState` keeps text fields with an id (text, URL, e-mail, phone, textarea) as state — one step a pause in typing (0.7 s), restored on undo, kept with „Letzten Zustand merken“; Cmd+Z inside a field stays the field's own. Neue Variante stays as it is (dice directly; Keyvisual's choice of variants); Hochformat for the Raster-Familie and Tempo instead of Takt are put back (larger, not needed for the delivery). HMI Faces: Werte showed „[object HTMLInputElement] × …“ for the grid (the page's element ids instead of the sliders' values). Core version 0.5.12 in every page (the two foreign lab pages einstieg/spuren untouched). Checked in all 17 tools at 1440 × 900 and 870 px: no overlap of stage and dock with the inspector open or closed, Frei full width, QR's link undone after typing, Gradient's readouts „0,4 s“ and „6,0 s“, Werte „Körnung Aus → An“.
- **Aufräumen vor der Auslieferung (Teil C von `docs/Offene-Entscheidungen.md`)** (user: "Ja, räum Teil C auf: Probe-Markierungen bei Stepper, Textfeld und Auswahlliste entfernen und ui-kpi.js reparieren"). Stepper, Textfeld and Auswahlliste are blocks of the pattern library: their probe marks are gone from Gradient, Gradient Blend, HMI Facetrack and Keyvisual (`data-probe` in the markup, `probes` in `tool.json`), they stand under `blocks` now. Versions unchanged (no change a user sees). `../Grundlagen/messen/ui-kpi.js` measures the law of proximity again: it reads the core's field row (`.lbl`, or a group heading for one control, then any control — select, segment row, stepper, swatches), finds the next element up the tree when the control is last in its group, leaves out headings over a group of fields, and measures edge to edge as DESIGN.md §2c gives the spacing (label → control 12–14 px, control → next 28–30 px) instead of to the control's middle. HMI Grid: dock 3 pairs, worst 0.27; inspector 6 pairs, 0.6. Case Film: film 4 pairs, 0.5; tool 8 pairs, 0.38. Values measured before 23.10.2026 are not comparable.
- **Case Film 0.4.38: MP4 verliert den Ton nicht mehr stillschweigend** (user: "HMI export. ton fehlt" — "mp4"). Bild für Bild: before the picture is encoded the film asks whether the browser encodes the sound as AAC (`CF_MP4.audioSupported`); if not, it saves in real time with the sound instead and says so; an MP4 whose sound track came out empty is never saved ("Export abgebrochen: der Ton ließ sich nicht kodieren"). Before, without an AudioEncoder the MP4 silently came without sound. Echtzeit: the recording canvas was 300 × 150 instead of 1920 × 1080 (its size had slipped into a comment); with sound a container that carries audio is tried before a video-only codec. The save menu says „ohne Ton“ when no sound is loaded (a sound of one's own is not kept across a reload).
- **Case Film 0.4.37: Inspektor nach den Grundsätzen** (user: "bitte den inspektor in diesem tool mal grundsätzlich durch unsere prinzipien prüfen, ist sehr inkonsistent und unübersichtlich … reihenfolgen hierarchien beschriftungen. alles"; "Ja, bau den Inspektor nach dem vorgeschlagenen Aufbau um (Maßnahmen 1–6)"). QM report in `docs/QM/case-film-inspektor.md` (12 findings: no order of its own, „Choreografie“ and „Verhalten“ not separable, content folded away, time scattered, device settings among the film's). Now every choice follows the tools' order (DESIGN.md §2a), a section only where it acts: **Inhalt** (the tool, its kind, pictures, graphic or text; a group's parts as buttons that choose them) → **Farbe** (Wie der Film / Umgekehrt; switch Farbwechsel → Art, Schritt) → **Form** (the tool's own look, a group's Aufteilung and Schachbrett; switch Teilung → Stufen) → **Bewegung** in the order of time (Länge; Aufbau → Rolle → Art; Abbau; Verlauf → Kurve; Takt; the tool's own motion — Drehen, Folge, Rhythmus, Pfeil wächst, Ken Burns; a group's Dialog → Schritt, Kanon, Folge only while there is a Kanon; Nah · fern → Richtung; Übergang last; copy and paste of the behaviours) → **Charakter** (closed). Something that can be off is a switch, its values under it only while on — no „Aus“, „Ohne“ or „Gleichmäßig“ options left. The choice's name stands above in `--fs-title`, its actions as symbols beside it (Mit dem nächsten gleichzeitig, Löschen); Gruppe auflösen and Aus der Gruppe nehmen at the end of Inhalt. The film: Inhalt (Dramaturgie, Ton with its BPM, Dramaturgie neu laden, Projekt öffnen) → Farbe → Bewegung (Tempo, Dynamik) → Werte → Speichern alone in the foot. Metronom and Bild-Versatz belong to this screen, not to the film: a symbol **Dieses Gerät** in the play row. The explanatory hints are gone; a tool's own Rolle (HMI Arrows) is the scene's.
- **Case Film 0.4.36, Custom Type 0.2.4: Custom Type fließt wieder, Inspektor ausblenden** (user: "die funktionieren nicht mehr wirklich"; "ruckelt nur"; "könnten wir irgendwo auch das advanced icon parken? dann könnte man rechts ausblenden"). Custom Type on the beat: its Aufbau letter by letter had taken nearly the whole scene (a letter a beat), and every throw of the alternates reflowed the line and changed each glyph in one frame. Now the Aufbau falls within the first quarter of the scene (with a Rolle as a cascade), and from one throw to the next each letter glides to its new place while a changing alternate cross-fades, in the attack (0.14 s), so no ghosts stand. THA „Botschaft“: Custom Type throws on every beat again (a bar a time had made it stand still), as Hauptaktion. The play row has the tools' **Inspektor** button (Cmd+Alt+I): the inspector hides and the stage and the row take the width; kept in the preferences.
- **Case Film 0.4.35: Höhe der Reihe ziehen** (user: "die höhe der timeline würde ich gerne verschieben"). A grip at the stage's lower edge (a short bar shows on hover): dragged, it sets the row's height (at least 120 px, the stage keeps 220 px); kept in the preferences, a double-click gives the row its own height back. The row scrolls when its content is taller.
- **Core 0.5.11: Pattern „Bühne“ in allen Tools** (user: "warum misst du nach? wir haben eine pattern lib"; "Ja, leg ein Pattern „Bühne“ in der Library an (Ecken, Rand, Schatten, Grund) und setz es im Case Film und allen Tools ein"; "aber mir ist die linie zu fett"). Each tool had set its stage's corners, border and shadow in its own code, in two ways (a 1 px border plus `--shadow` — in dark two light lines, 2–4 device pixels — or a ring as a shadow). Now one pattern: `stageFrame(el, framed)` (core/ui.js) gives the class `.buehne` (core/ui.css): 10 px corners, one hairline of 1 device pixel (0.5 CSS px) and the soft drop as `--stage-frame` (light and dark), no border of its own; at Frei no frame; the ground stays `--offset-bg`. In the pattern library (Bühne, with its rules) and in DESIGN.md §2. Used by all 16 tools with a stage and the Case Film; checked in 15 (Kamera and HMI Facetrack ask for the camera). Keyvisual animiert's preview frame reads the stage's corners from the computed style. One core version (0.5.11) in every page. The Case Film's picture-count symbol is Carbon's „copy“ (the standard check had found a 16-grid symbol).
- **Case Film 0.4.34: Bühne und Reihe im Grau der Tools, die Bühne mit ihrem Schatten** (user: "im tool hätte ich den inneren bereich (alles außer inspektor) gerne im dunkelgrau wie bei tools"; "bühne sollte wie in den tools einen schatten haben"). The stage's picture has the tools' 10 px corners, panel border and `--shadow`. The stage and the row stand on `--offset-bg` (#1c1c1e dark, #eeeeee light) as in the other tools; the inspector keeps the ground.
- **Case Film 0.4.33: hält am Ende, Besonderes als Pill, THA mit Zeit zum Fließen** (user: "film würde ich nicht automatisch loopen lassen"; "vielleicht könnte man sprites mit spezial-behavior irgendwie kennzeichnen? damit es konsistent ist"; "THA: manche timings sind zu knapp. man muss die fließenden bewegungen denke ich etwas länger sehen, als beispielsweise bei HMI"). Playing stops on the last picture instead of starting over; Abspielen then starts at the beginning. A sprite that does something beyond the rules carries a pill **Besonderes**, framed instead of filled, beside its other behaviours on the tile: Logo wechselt, Pfeil wächst, Lebendig, Punkt pulsiert. THA „Botschaft“ rebuilt on Comp23's phrases like HMI's: a flowing band gets a whole phrase (four bars, 8 s; before many had one), words two bars, no Blitz or Teilung on a band; the three bands answer each other a bar each, Custom Type changes its alternates a bar at a time; Auftakt 8 s, the reveal done by 28 s, Abspann four bars, 96 s.
- **Case Film 0.4.32: das Logo auf dem T-Shirt wechselt; kein pulsierender Punkt** (user: "der pulsierende punkt gefällt mir nicht"; "auf dem tshirt (ergebnis) würde ich mir wünschen (auch außerhalb aller bisherigen regeln), dass das logo wechselt. kriegst du das hin?"). „Botschaft“ no longer pulses its points (the option stays). A picture can carry a mark printed by a tool (Standbild → Bilder, `mark: { tool, box, rate }`): the film draws the tool's mark into the measured box of the photo and multiplies it onto it like ink, moving with the Ken Burns. `scripts/film-photo-blank.py` makes the photo without its own print (the mark widened, filled from the fabric by diffusion, the fabric's grain laid back as noise of its strength): `brands/hmi/film/photos/hmi-tshirt-blank.jpg`. In Ergebnis the T-shirt (41–42) wears HMI Logo's mark, which changes its arrangement on every beat — the logo's own swap, merge and split.
- **Case Film 0.4.31: Inspektor aufgeräumt** (user: "hier musst du mal aufräumen, das ist sehr unübersichtlich"). A sprite's inspector was one long list: the tool's name twice, Aufbau as a switch among the tool's settings and again as a pill, the pills repeating the fields below them, what the film decides mixed with what the tool sets itself. Now: at the top the name (once), the text, Länge and Farbe; then groups that fold and stay as one left them — **Choreografie** (open: Rolle, Verlauf, Aufbau and Abbau once for the whole sprite, for a group Kanon and Folge, Übergang), **Verhalten** (open: Bewegung, Farbwechsel, Teilung, Nah · fern, for a group Zeigen and Schachbrett, copy and paste), **Eigene Einstellungen** (closed: the tool's own, e.g. Muster, Anteil, Raster, Drehung) and **Charakter** (closed). The pills stay under the tiles in the row; in the inspector they are gone. Names that were twice are now one each (Farbwechsel, Nah · fern).
- **Case Film 0.4.30, `core/takt.js` 0.5.22: Zeit und Easing aus einem Guss** (user: "ich glaube eine bewegung die mich noch am meisten stört ist das bounces. ich glaube zeit und easing passen hier nicht zusammen. das easing wirkt immer abgewürgt und dadurch ruckelig"; "überprüfst du zeit und easing? insgesamt?"). Every motion of the film checked. Measured: the swings were put together from two curves — the Rolle's ease-in to the hit and a sine after it, the Hüllkurve's start at full speed and a sine on top — and at the joint the speed jumped by 88–100 % of its top; the tools' 0.14 s swaps used `easeOutBack`, its swing crammed into hundredths; the beat pulse and the point's pulse rose in a jump. Now: one damped spring (`taktSpring`) for the Rolle (`taktSwing`: it leaves before the hit at rest, crosses its goal on it, swings past — Haupt 9 %, Akzent 18 %, Neben 1 % — and settles), the Hüllkurve (`x`: through the goal in 60–120 ms, 5–20 % past by the weight), HMI Arrows' turns, the Teilung, the grid's swaps (the old symbol leaves from where its lean left it); jumps in speed 2–9 % (the start of the spring within a millisecond). A part of a Rolle fades in over its first third instead of popping up at its start size, and stands only once within 0.01 % of its goal. The swaps ease out (`easeOutCubic`, also the film's default), the pulses swell in 30 ms; the lean before a swap is eased in and out. Checked frame by frame at 60 fps in HI!, the grid, the arrows, the logo, the growing arrow, the faces, the colour fields and the Abspann: no visible jump left. The lab „Choreografie“ moves by the same spring.
- **Case Film 0.4.29: Wischen und Punkt auf Texttafeln** (user: "bei textcharts könnte auch mal zwischendurch so ein schwarz/weiss wischer kommen"; "oder auch punkt pulsieren"). A Texttafel's text now turns with its Farbe: under a wipe the part already wiped is set in the turned colours (before, the type kept its colours and vanished on the turned ground). A closing point can pulse (`text.pulse`): once the line is complete, the point is drawn on its own and swells on every beat and settles in 0.18 s, the Eins the most. „Botschaft“: a black/white wipe on the Eins of the second bar of „Design is thinking“, „I want to make“ and the whole sentence at the end; the points of „made visual.“ and „nobody cares.“ pulse.
- **Case Film 0.4.28, HMI Logo 0.2.4: Abspann mit Ruhe** (user: "logo: abspann: hier ist das timing auch etwas knapp/ruckelig"). The logo's parts had shared two steps (five parts, a third of eight steps) and then kept swapping and merging on every beat to the end. With a Rolle, HMI Logo now gives each part its own step — the fields on their beats, then the wordmark — and „Botschaft“ lets it stand afterwards (motion still). The Abspann has four bars instead of two (45–48, within the ADC rule of 2–4): the logo builds in the first bar and stands for three; Ergebnis ends with the whole sentence (the accelerating pictures before the logo are gone, the logo is the close). Still 96 s.
- **Case Film 0.4.27, HMI Faces 0.2.3: Pfeil wächst, Dialog im Takt, lebendige Gesichter** (user: "0:46 … hier sind die timings noch etwas weird"; "0:50 … man würde sich wünschen, dass der pfeil länger wird (saul bass)"; "0:56 … geschwindigkeit der bewegung ist grenzwertig, fast schon zucken"; "bei den gesichtern würde man sich wünschen, dass die augen random entstehen, dann blinzeln (natürlich), dann die münder. und die münder auch mal wechseln. das soll eigentlich lebendig aussehen"). Standbild → Grafik **Pfeil wächst**: of a letter and an arrow (R→) the letter stands at the left and the arrow's shaft grows over three quarters of the scene, its head travelling to the right edge, then it holds; the brand's → is cut in three (round start, even shaft, head — measured), so only the shaft stretches; cut in the size of the decoded picture. „Botschaft“: the wide arrow grows instead of sliding; the tools' dialogue a bar each instead of every beat; the faces a step a bar. HMI Faces on the Takt-API, **Lebendig** (on by default): the eyes come in a seeded random order, then the mouths; once there, each face blinks with both eyes together, naturally and off the beat (every 2–5.5 s, now and then twice; shut in 60 ms, open in 90 ms); only the mouths change now and then, the eyes keep their kind. The tool itself is unchanged.
- **Case Film 0.4.26: Bilderzahl als Symbol** (user: "wie funktionieren die bilder bei ergebnis > gruppe. ich sehe 2 bilder, aber es erscheinen mehr"; "vielleicht mit einem icon?"). A Standbild with several pictures shows a stack and their number on its thumbnail in the row — on a member of a group, on a scene, and on a closed group as the sum; its tooltip says how they change ("4 Bilder · wechseln jeden Takt", or "im Verlauf Steigerung"). The inspector says the same under Bilder.
- **Case Film 0.4.25: Start aus Schwarz, Raster wischt, Satzzeichen als Wort, Ken Burns, An den Anfang; `core/takt.js` 0.5.19** (user: "der aufbau sollte bei schwarz beginnen"; "der aufbau HMI grid (problem) ist hölzern. ein gleichmäßigerer wischender übergang … erscheint gerade blockartig"; "kleine beschriftung spacing: weglassen"; "made visual. punkt könnte man wie wort behandeln (auch bei ?! usw)"; "bei bildern: ken burns effekt denkbar? z. b. das tshirt steht ewig"; "es gibt kein zurück an den anfang"). The film's first picture runs up from the empty ground instead of being cut into in its motion (`taktAt({ enter: 'run' })` for scene 1): HI! starts black, the H lands an eighth in. With a Rolle and many parts to a step (a grid), each part gets its own moment between its step and the next by its place in the order (`taktPhases().onsetOf`), so the Aufbau wipes through evenly and follows the curve instead of coming in blocks. The small „Spacing“ label of HMI_10 is gone from the SVG. A Texttafel reveals a closing mark (. , ! ? ; : …) as its own step, set without a space. Pictures get **Ken Burns** (Standbild → Bilder, on by default): over the scene 7 % nearer and a little to the right. A button **An den Anfang** left of Abspielen (also Pos1).
- **Case Film 0.4.24: „Botschaft“ nach den Prinzipien** (user: "Ja, ordne HMI Botschaft nach den Prinzipien neu: Zeitskala, eine Hauptaktion je Sequenz, Halt, Richtung, HMI Arrows vor dem Logo"). Rebuilt on Comp23's phrases as „nach Phrasen“ measured them (intro 1–2, part A in fours from 3, break 23–26, part B 27–46, outro 47–48): every scene starts on a phrase or its half, words stand two bars. One main action a sequence with a Rolle — HI! (Haupt, 1 2 – 4), the grid as a wave from the left (Haupt, Steigerung), HMI Arrows (Haupt: row by row, then onto → as a wave from the left), the logo HMI_10 (Akzent, Abklingen, then it stands), the faces as a wave (Haupt), the colour fields (Haupt, Steigerung), the logo at the end (Akzent); at most one behaviour beside it (the tools' dialogue, a half turning). Halt after every action: a Texttafel, the logo held, the grid only breathing, one photo. Richtung: everything goes to the right. The arrows before the logo turn the mixture into one direction; the logo hits at bar 11 (20 s), the reveal is done by 28 s. Acts: Auftakt 8 s, Problem, Enthüllung to 0:28, System, Anwendung, Ergebnis, Abspann 2 bars — no rule broken; 96 s. The former „Botschaft“ is in git (e449bce); „nach Phrasen“ stays as it is.
- **Case Film 0.4.23: Rolle, HMI Arrows im Film; `core/takt.js` 0.5.18** (user: "ja, auf gehts" — the principles of docs/labor/choreografie.html into the film). A scene has a **Rolle** (Verhalten → Rolle, also as a pill): Hauptaktion, Akzent or Nebenaktion. With one, the Aufbau of every tool and graphic comes by `taktSwing`: each part grows from the role's size (Haupt 45 %, Akzent 25 %, Neben 85 %), runs up before its moment, lands on it and swings past — `taktPhases().vis` uses its `onsetOf`, so tools need nothing new; a graphic's edge-envelope (0.4.18) gives way to it. `taktAt({ role })` carries it; the tools get it in their state too (HMI Arrows turns by it). HMI Arrows is in the Case Film's tools. „Botschaft“ (HMI): HI! as Hauptaktion, the reveal of the logo (HMI_10) as Akzent, the colour fields as Hauptaktion. Without a Rolle everything stays as it was. One `core/takt.js` version (0.5.18) in every page.
- **HMI Arrows 0.3.0 on the Takt-API; `core/takt.js`: Rollen und `taktSwing`** (user: "die pfeile können ja schon drehen im tool"; "genau, kann das grid bereits rotieren" — the film should take a tool's own motion, not draw its own). HMI Arrows' drawing (layout, 3D Perlin rotation field, painting) moved unchanged into `tools/hmi-arrows/render.js` (`HMI_ARROWS`), the tool calls it — checked pixel for pixel against the previous version in four states (light, dark, 45° steps, another seed); each layout keeps its own Perlin permutation. It registers `TAKT_TOOLS['hmi-arrows']`: its own change is the turn — Feld (the field moves on every step) or Ordnen (one turn onto a direction, → ↑ ↓ ←, on the third step) — in a Folge a thirty-second per column (from the left, the right, the middle); Aufbau row by row as a supporting action. `core/takt.js`: `TAKT_ROLES` (Hauptaktion, Akzent, Nebenaktion: run-up, wind-back, swing past, settle — in beats) and `taktSwing(s, role, spb)`, the progress of a change with anticipation (the fastest moment on the hit) and follow-through, for any tool to tween its own property. In the lab the Pfeilfeld is now HMI Arrows itself (Ordnen onto →). Not yet in the Case Film's list of tools.
- **Labor „Choreografie nach Prinzipien“ (probe)** (user: "die timings und muster innerhalb der einzelnen sequenzen wirken naiv und unkontrolliert. auch timings sind nicht aufeinander abgestimmt … das ist noch immer kein technisches problem, sondern ein prinzipien problem" — the twelve principles of animation, Jake Bartlett's eight for motion design; "Ja, bau die Vergleichsprobe im Labor"). `docs/labor/choreografie.html`: four bars of HMI „Botschaft“ — HI!, Pfeilfeld, Logo — left by the Case Film's own engine, right by rule, on one clock with Comp23 and a Metronom, with the score of the right side under both (run-up, landing, swing per part). The rules: one time scale (beat, sixteenth; every duration a multiple); a role per action (Hauptaktion grows from about half its size, runs up two sixteenths and swings a beat; the accent more of all; a Nebenaktion nearly full size, one sixteenth, hardly a swing); run-up and hit (ever faster, the fastest moment on the beat, ways of half a grid unit so no part crosses another); follow-through (past its size, damped, squash on impact); ordered overlap (a sixteenth apart, left to right or top to bottom, never by chance); staging (one thing moves at a time; the wordmark two beats after the fields); direction (everything to the right); contrast (still after every action, the „!“ as accent). The arrows of the Pfeilfeld are drawn one by one (user: "bei den pfeilen könnte man sich auch ein drehen der pfeile vorstellen"): they come in their mixed directions, and from beat 3 a wave turns them column by column, a thirty-second apart, left to right, onto → — winding back, turning ever faster, swinging past — so the mixture becomes one direction that leads into the logo. The parts are drawn once at their size and then only moved (an SVG under a changing scale is rasterised anew each frame — the right side stuttered).
- **Case Film 0.4.22: Dramaturgie „Botschaft · nach Phrasen“ — die Gegenfassung** (user: "ich behaupte noch immer, dass ist kein technisches, sondern ein design/logik problem … hier geht es darum, wie es beim betrachter ankommt"; "Ja, bau eine Gegenfassung von „Botschaft“ nach den Dramaturgie-Regeln, damit ich beide vergleichen kann"). Read as a viewer, „Botschaft“ cut 32 times in 48 bars (from bar 31 every bar), off the music's phrases (bars 10, 11, 13.88, 20, 21, 23, 24, 28, 29), stacked up to four behaviours in one or two bars, built most pictures up again after their cut, never held, and gave words a single bar. The Gegenfassung (HMI, next to „Botschaft“ in Dramaturgie) says the same with the same pictures by seven rules, written at its head in `templates.js`: phrase before bar before beat (Comp23 measured: intro 1–2, part A from 3 in phrases of 4, break 23–26, part B 27–46, outro 47); one event at a time (a cut or an Aufbau — an Aufbau only on its empty ground); one voice per scene; the picture follows the music; holding is design; a Texttafel stands two bars; hard between acts, soft inside. Measured: 20 scenes, every cut on a phrase or its half; 42 frames in which a third of the picture changes hard, against 113. „Botschaft“ stays as it was.

- **Case Film 0.4.21: Bilder vorab dekodiert** (user: "Ja, beheb den Hakler beim ersten Zeichnen eines Tools in einer Farbe"). Measured on real playback (HMI „Botschaft“, 120 Hz): the hitches were not the colours but the pictures — a photo or a part of a graphic was decoded the first time it was drawn, on the page's own thread: 24 frames over 40 ms, from 58 s on up to a second at once among the mockups, again after the loop. While playing, the pictures of the next three seconds are now decoded aside (`createImageBitmap`, `decodeAhead()` in `index.html`) and drawn from that copy (`pic()` in `engine.js`); those of scenes left behind are let go. Measured again over the whole film and the loop: no frame over 40 ms (36 between 20 and 40 ms), median 8.3 ms.

- **Case Film 0.4.20: Farbe und Teilung nach Hüllkurve und Gewicht** (user: "Ja, bau Farbe (Blitz, Wechsel, Wischen) und Teilung nach Hüllkurve und Gewicht um"). **Farbe**: turning the whole picture takes no step lighter than the „und“ — a Verlauf may drive it into eighths, never sixteenths (this replaces the interim three-a-second limit, `flipOnsets()`); and it is a hit: Blitz flashes the other colour up and lets it die away (30–80 ms by the weight; longer ran black and white through grey), Wechsel comes in fast and settles (30–80 ms), Wischen crosses fast and slows into place. **Teilung**: the count changes on the Eins when each count gets a bar or more, else on beats (`splitStep()`; the marks under the tile follow); each new part comes out of the old one it lies in and swings into place (80–160 ms). **One voice leads**: while the Teilung moves, no Blitz. **No chance in the timing**: the random accents (an inverse flash on some downbeats by Dynamik × Energie × loudness) are gone. Measured on HMI „Botschaft“: Problem flashes on the beats, then on the eighths of its last bar (four a second, before eight); a frame with a flash over 16 parts takes 5–8 ms. Still to do: the first drawing of a tool in a colour takes 120–230 ms once (a hitch at the first flash of a scene).

- **Case Film 0.4.18, HMI Grid 0.2.6, `core/takt.js` 0.5.16: Hüllkurve und Gewicht im Film** (user: "Ja, übernimm Hüllkurve und Gewicht in den Case Film, mit dem Grid und der Farbtafel zuerst"). The film hands every tool on the Takt-API `state.envelope`; HMI Grid then swaps by the step's Gewicht (the Eins all of its share, a beat 60 %, the „und“ 35 %, a sixteenth 20 %), each cell hits and swings in, the cells of the next step lean in just before it, the grid breathes with the beat — Fließend keeps its soft overlapping swaps. A graphic's Aufbau (the Farbtafel, farben.svg) grows each part out of its left edge on its onset, with a sliver as run-up, a swing past by its weight, and breathes; the Abbau keeps its own going. `taktPhases()` gives `onsetOf(rank)` for it — the same steps as `vis()`. Fixed on the way: the parts of an SVG were measured in their own coordinates, so Figma's rects placed by `transform` all sat at 0, 0 and came and went around the artboard's centre (`boxOnBoard()` takes the box through the part's matrix). Measured on HMI „Botschaft“: in Problem 71 % of the grid's change falls in the first eighth of a beat after it, the rest on the „und“ and the sixteenths; a frame takes 0.1 ms (median), 4 ms at most. Still as before: Farbe (Blitz), Teilung and the other tools.

- **Case Film 0.4.17: an eine Stelle springen und dort starten** (user: "was mir aktuell fehlt ist eine möglichkeit an eine bestimmte stelle zu springen und dort zu starten"). Under the stage a line of the whole film with a mark at every act: a click or a drag jumps there, onto the nearest beat. A click on a beat dot in the row jumps to that beat. ← → move a beat, with ⇧ a bar (onto the grid), Pos1 goes to the start. Abspielen starts where the film stands (it no longer goes back to 0 on the first play once you have jumped); jumping while it plays goes on from there, music and Metronom with it.
- **Keyvisual animiert 0.3.1, Case Film 0.4.16: Zeichnen zurück** (user: "Ja, hol Zeichnen in Keyvisual animiert und in die THA-Dramaturgien zurück"). 0.2.0 had removed Zeichnen by mistake — the user meant Wachsen. Zeichnen is back in the engine (`drawDraw`, it draws itself in and retracts by its own nature), in the tool (Bewegung: Ticker, Laufschrift, Zeichnen, Wandern) and at its twelve places in the THA dramaturgies. Measured: THA „Botschaft“ with seven Zeichnen scenes draws a frame in 0.3 ms (median), 7.8 ms at most.

- **Labor „Hüllkurve und Gewicht“ (probe), `core/takt.js` 0.5.15** (user: "das prinzip stimmt noch nicht"; "auch animationen wie bei den farbtafeln wirken abhakt, nicht weich dynamisch wie z. b. bei fischinger"; "Ja, bau das Prinzip Hüllkurve und Gewicht zuerst an einer Probeszene im Labor (Grid und Farbtafel), damit ich es vergleichen kann"). `docs/labor/huellkurve.html`: HMI „Botschaft“ › Problem (the grid) and farben.svg (the Farbtafel), each as the film draws it now beside the probe, on one calm clock with two bars of Comp23 looped, Metronom, half tempo, ←/→ frame by frame. The probe in `core/takt.js`: `taktWeight()` (Eins 1, beat 0.6, „und“ 0.35, sixteenth 0.2), `taktOnsetAt()`, `taktEnvelope()` (run-up 0.12 s, a fast hit, a swing past the goal that dies away by the weight), `taktPulse()` (the picture breathes on the beat); HMI Grid draws with it when `state.envelope` is set (only the lab does): the step's weight decides how many cells swap, each swings in. Not yet in the film.
- **Keyvisual animiert 0.3.0: Wachsen removed** (user: "bitte dieses ding entgültig wegschmeissen. es funktioneiert nicht!"; "ich dachte das wäre erledigt"). The earlier request was about Wachsen; 0.2.0 had taken Zeichnen out instead. Wachsen is gone from the engine (about 400 lines: placing, paths, sprites), the tool (button, Anzahl, Länge, Schrift steht) and the THA dramaturgies, which take Wandern there; a kept state or film with Wachsen opens with Wandern. Measured: the THA film draws a frame in 0.3 ms (median), 9.6 ms at most.

- **Case Film 0.4.14: Verhalten als Pills, Copy & Paste, Kennwerte; core blocks „Verhalten-Pills“ and „Kennwerte“** (user: "die behaviours hätte ich gerne übersichtlicher weiter unten. vielleicht wie objekte (z. b. pill form), gestapelt. cool wäre auch copy & pase von behaviours"; "das könnte auch übersichtlicher sein"). Two new blocks in `core/ui.css` 0.5.9 and the pattern library: `.pill-stack > .pill` and `dl.readouts`. Under every tile the line of words („Blitz · 3-3-2 · 1→4→16“) became a stack of pills, one per active behaviour (Aufbau, Verlauf, Bewegung, Farbe, Teilung, Maßstab, Dialog, Folge, Kanon, Charakter; „vorgezogen“ as a readout) — from one register (`BEHS` in `index.html`). A click on a pill chooses the tool and that behaviour and brings its row into view; Cmd+C copies the chosen pill, else every behaviour of the tool; Cmd+V pastes onto the chosen tool what fits there; Cmd+Z takes it back; the same as buttons at the end of Verhalten. In the inspector Verhalten moved below the tool's own settings and Charakter, with its pills on top. The film's line „32 Tools und Gruppen · 1:36 · 48 Takte.“ is a list (Länge, Takte, Tools und Gruppen).
- **Keyvisual animiert 0.2.0: Zeichnen removed** (user, on its thumbnail in the THA film: "diese dinger funktioniern einfach nicht. schlechte performance, darstellung klappt nicht. bitte aus tool und case löschen"). The motion is gone from the tool (button, `drawDraw`) and from the THA dramaturgies, which take Laufschrift there; a kept state or film with Zeichnen opens with Laufschrift. The Texttafel on the band keeps its own straight band.
- **Case Film, HMI Grid 0.2.5, `core/takt.js` 0.5.14: Blitzgrenze, Dichte — interim** (user: "das unkontrollierte rumzappeln und blinken ist noch immer da"). Measured on HMI „Botschaft“, Problem: the Steigerung drove the Blitz to sixteenths (eight flashes a second) and 40 % of the grid swapped on every sixteenth. A Farbe turns the whole picture at most three times a second (`flashOnsets()` in `engine.js`); a step shorter than a beat swaps that share of the cells (`taktShareAt()`; HMI Grid). The user: "das prinzip stimmt noch nicht" — the principle is still open.

- **Case Film: Texttafel — Zeilenabstand als Regel, Umbruch von Hand** (user: "Design is thinking bitte vor is umbrechen. bitte für zeilenabstand eine regel finden: bei schriftgrösse 130, reicht zeilabtand 130. zeichenabstan -1%. bei 320px braucht es nur 290px zeilenabstand"). A Texttafel's leading is the size up to 130 px (of the 1080 px frame) and closes linearly above it, 30 px less at 320 px — 0.84 × size + 20.5 px (`cardLead()` in `engine.js`); its headline is tracked −1 % (`letterSpacing`, where the browser has it). Lines broken by hand stay as they are when the type fills the frame, so „Botschaft“ (HMI and THA) reads DESIGN / IS THINKING — measured: 338 px type, 305 px leading. A film kept from before still has the old text: „Dramaturgie neu laden“.
- **HMI Faces 0.2.2, HMI Logo 0.2.2, HELIO Grid 0.2.2, HELIO Logo 0.2.3: Bewegung** (user: "Das Grid passt. Bring die Bewegung auch auf HMI Faces, HMI Logo, HELIO Grid und HELIO Logo"). Their swaps start through `taktSwap()` as HMI Grid's do; the logos' cells of a change no longer cascade by a fixed 60 ms. The parameter is `timing` (Bewegung), not `motion`: the logos' „Dazwischen“, Keyvisual animiert and Custom Type already use `motion` — the first version of Bewegung had hidden „Dazwischen“ from the inspector.

- **Case Film 0.4.13, HMI Grid 0.2.4: Bewegung — Takt, Kaskade, Fließend; eine ruhige Uhr** (user: "synchoronität: wir sind auf einem holzweg … die tools (vor allem grids bei HMI zappeln vollmmen wahllos umher)"; "ein bewusster wechsel zwischen fliessend und taktorierntiert wäre ein vorteil für die dramaturgie"). Measured first, with the new lab page `docs/labor/takt-messung.html` (a flash on every beat, the Metronom, two clocks side by side): in Chrome 155 (120 Hz) and Safari 27 (60 Hz), with cable headphones, the Case Film's clock stepped 1–4 ms unevenly per frame (`currentTime` moves in 5.3 ms blocks) and ran 18 ms (Chrome) or 10 ms (Safari) ahead of the sound — not what twitched. What twitched was the grid: since 0.4.11 its swaps of 0.14 s were spread at free moments over the whole step, on no musical position. `core/takt.js` 0.5.13: one rule for when the changes of a step start, `taktSwap()` — **Takt** (all on the beat, within 0.12 s), **Kaskade** (one after another on sixteenths, at most a beat long), **Fließend** (soft 0.46 s swaps overlapping over the step, on purpose without the beat); `taktPhases` takes it for the Aufbau (`timing`). Without a choice: Takt in the film, Fließend in the tool alone — as before. HMI Grid draws its swaps through it; in the Case Film **Bewegung** stands under Verhalten beside Verlauf. Measured on the picture (HMI „Botschaft“, Problem, 480 frames a second): the grid's changes now start on sixteenths. Playback: the picture follows the audio clock calmly — it advances by the frame's own time and aims at the sound as heard (output timestamp), corrected by 5 % a frame; in the film the frame-to-frame error went from 2.5 ms to 0.1 ms, and the picture no longer runs ahead. A „Bild“ value set before may need setting again.

- **HELIO Logo 0.2.2: with the Schriftzug on, the exported SVGs punch the letters out of the card** (user: "wenn die typo auf der fläche steht, sollte das logo ausgestanzt sein"; "es geht hier nur um den export"). „SVG speichern“ and the batch draw the card through a `<mask>` holding the letters (`cardAndLettersSVG()` in `render.js`), so a mark placed on a photo or colour shows that surface through them. The stage, PNG, video and the Takt (Case Film) keep the page behind the card and look as before; with the Schriftzug off nothing changes. Same change in `HMI Project Designtools` 0.46.1.
- **Case Film 0.1.0, new tool (HMI Project, lab)** (user: "aus den möglichkeiten der tools einen case-film erstellen … 90 bis max 120 sek … orientiert am takt, oskar fischinger"; "mit bpm und takten arbeiten … sound laden"; "sound analysiert (bpm, dynamik, beat detection)"; "stills einfügen"; "format 16:9 sollte ausreichen"; "split-screen … 2x2"): a storyboard of scenes measured in bars. Scene types are only the tools that already work on a beat (user: "ausgewählt werden können nur tools, die bereits der takt logik folgen"): HMI Logo, HELIO Logo, HMI Grid, HELIO Grid, HMI Faces — each with its own Aufbau and Abbau from its principle (the logo fills its parts in the swap order, the grids fill in their pattern Zufall/Perlin/Welle/Fest, the faces open eyes then mouth and close their eyes at the end) — plus Texttafel and Standbild (big glyphs as on the slides, or pictures; motion only from the cut). The tool chooses the brand; a scene's colour is Wie der Film or Umgekehrt, so the dock's Farbe turns the whole film. Split screen (2, 2×2, 3, Mosaik) with Versatz and Schachbrett, texts in the brand font (Etikett, Text, Unterzeile; Erscheinen, Hinterlegung), scene transitions. Sound: tempo, first downbeat, section changes and a loudness curve are found in the file (`tools/case-film/audio.js`); the motion follows the beat and, by Reaktion auf Ton, the sound; „Szenen an den Ton anpassen“ puts cuts on section changes. Six templates (dramaturgies) from 15 ADC case films 2022–2026 (6 Gold): System zeigen, Manifest, System enthüllen, Vorher – Nachher, Kurz, Leer. Export: MP4 with the sound (real time), PNG-Sequenz, PNG, Projekt (JSON with the stills). Brand data in `brands/hmi/film.js` (+ HELIO Rounded glyphs in `brands/hmi/film/glyphs/`), so another brand brings its own pack. Probes: storyboard, Tonspur. 16:9 only, so no Format section (`check-standard.py`: `NO_FORMAT`).
- **Case Film: Akte and a ruler in bars** (user: "in der timeline auch eine dramaturgische gliederung/struktur … und stärkerer bezug zu takten"). A lane of acts over the scenes (probe `akte`): Auftakt · Problem · Enthüllung · System · Anwendung · Ergebnis · Abspann, from the ADC research. A scene belongs to one act (Szene → Akt in the dock); an act is the run of scenes that share it, shown with its length in bars and seconds. The edge between two acts is dragged and snaps to the cuts; a click goes to the act's first scene. The ADC rules are checked on the act and said in words, underlined: Auftakt at most 15 s, the idea (end of the Enthüllung) by 30 s, Abspann 2–4 bars. The templates bring their acts; „Manifest“ and „Vorher – Nachher“ were shortened at the start so the idea stands by 30 s (same total length). The ruler counts bars: every bar numbered (every fourth when tight), the one of each four-bar phrase strong, eight-bar phrases on alternating ground, beats as ticks; scene cuts are marked under it, filled on a phrase, open off it; marks at 30 s (Idee), 90 s and 120 s. Each scene card shows its beats under it. The readout leads with „Takt 17 · Schlag 3“, and the playhead pulses on the beat while playing.
- **Takt-API, first tool: HMI Grid** (user: "die tools brauchen sowas wie eine API für das animationstool"; "das animationstool choreographiert nur und ergänzt"). `core/takt.js` is one clock for every tool that moves on the beat: `taktAt()` gives a moment (beat, step and its progress, pulse, the steps of the scene), `taktPhases()` turns a tool's own order of parts into Aufbau / Lauf / Abbau. A tool draws a state at a given moment and keeps no clock of its own, so the same moment always gives the same picture. HMI Grid's grid (symbol library, tiling, symbols per cell, drawing a cell) moved unchanged from its `index.html` into `tools/hmi-grid/render.js` (`HMI_GRID`); the tool calls it and keeps its own Animiert mode — checked pixel for pixel against the previous version in eight states (light, dark, the four patterns, another seed, no rotation, one icon off), plus Animiert and SVG export. `render.js` also registers `TAKT_TOOLS['hmi-grid']`: the tool's swap (top Anteil of cells by the pattern's score, one after the other, Stil, Beschleunigung, 0.46 s) on steps of the Takt, seeded instead of `Math.random`, Aufbau and Abbau in the order of the pattern. The Case Film now draws HMI Grid with it instead of its own stand-in; `fromToolState()` reads HMI Grid's „Zustand kopieren“.
- **Takt-API for all five beat tools: HMI Logo, HELIO Logo, HELIO Grid, HMI Faces 0.2.1 (and HMI Grid 0.2.1)** (user: "stell HMI Logo, HELIO Logo, HELIO Grid und HMI Faces genauso auf die Takt-API um"). Each tool's drawing moved unchanged into its `render.js` — `HMI_LOGO.create(cfg)` / `HELIO_LOGO.create(cfg)` (the logos read their settings live from one object, `LOGO`, which the tool's controls write), `HELIO_GRID`, `HMI_FACES` — and the tool calls it. Checked pixel for pixel against the previous version in 7–8 states each (themes, spacing, seeds/permutations, wordmark, card, faces only, icon choices, patterns, columns, duplicate eyes), plus Animiert and the tool's export (ZIP, SVG). Each also registers its beat drawer: the tool's own change one per step, seeded, so step j is the start state after j changes — HMI Logo swaps, merges and splits its 2×2 tiling; HELIO Logo moves to a new permutation; HELIO Grid swaps letters within its adjacency rules; HMI Faces swaps eyes and mouths (two eyes of a face never alike). Aufbau and Abbau come from each tool's parts: the logo's cells in reading order then the wordmark; HELIO's card, letters, wordmark; the grids by their pattern; the faces' eyes face by face, then the mouths. `core/takt.js` brings `taktPhases()` for all of them. The Case Film draws only through these now — its own stand-ins of the five tools are gone (the engine keeps Standbild and Texttafel, which no tool has).
- **Case Film: standard assets per brand** (user: "in jedem Fall pro brand standard assets wie 2-3 audio beispiele fotos grafiken"; "ja, mit assets anfangen"). Each brand pack (`brands/<brand>/film.js`) lists its film material under `assets` (photos, graphics, audio). HMI Project: 23 photos in `brands/hmi/film/photos/` (1920 × 1080, 5 MB), taken from the rebranding presentation of 21.09.2026 — the merchandise and website mockups of HMI Project (10) and HELIO (9), rendered as the presentation shows them with the marks, and four context pictures (people at machines, at the desk, in a meeting); graphics from the tools' own SVGs (Wortmarke, Pfeil, symbols; HELIO Schriftzug, letters). THA: the mark (`brands/tha/favicon.svg`) as a graphic; no photos yet (to come from THA). Audio: empty in both until licensed examples are chosen. In the Case Film: Standbild → Bild has „Aus der Marke“ (group, then picture), and a new kind **Grafik** draws a brand SVG in the scene's colour (Größe). The HMI dramaturgies fill their picture scenes with the brand's photos (applications; context pictures in the black-and-white scenes). Where the project's film assets are stored is still open (user: later).
- **Case Film: SVG graphics that build up, wide graphics that slide** (user: "standbilder: wenn das svg wären, könnte man diese doch entsprechend der elemente oder gruppen aufbauen"; "breite bilder wie den pfeil könnte man schieben. die vorlage sollten dann 2x breite haben"; "kannst du für HMI die SVG beispiele anlegen"). Five HMI examples in `brands/hmi/film/graphics/<name>/{black,white}.svg`, built from the brand's own SVGs by `scripts/film-graphics-hmi.py` with every part as a group in the order it should come: Logo zum Aufbauen (four fields, then the wordmark), Bedienelemente (two rows of controls), Pfeilfeld (row by row), HI!, and R→ at 3840 × 1080 (twice 16:9). Standbild → Grafik splits an SVG into the elements under its root (each measured in the page for the centre of its coming and going) and builds it up and takes it down part by part on the beat (Aufbau, Abbau, Schritt; the film's Stil). A graphic at least twice as wide as the frame fills the height and slides through over the scene. Größe now runs to 1 = as large as the frame allows.
- **Case Film: two music examples** (user: "lade Beauty Flow (17,3 MB) und Go Cart (8,5 MB) von incompetech.com (CC BY 4.0) als Audio-Beispiele für beide Marken, mit Quellenangabe"). In `tools/case-film/audio-examples/` (music belongs to no brand, so it is kept once and listed in both packs' `assets.audio`), with `QUELLEN.txt`: Kevin MacLeod (incompetech.com), CC BY 4.0 — the credit has to be named in the film. In the dock: **Beispiel** beside Ton laden picks one; the credit is shown after loading. The analysis finds the catalogue tempo on both (115 and 108 BPM). An example sound comes back by itself with a kept state or an opened project (a file of one's own still has to be loaded again).
- **Case Film: Metronom** (user: "wenn kein sound da, wäre die option für ein subtiles metronom toll"). The click moved from the inspector into the dock beside the sound, as the switch **Metronom**, shown only while no sound is loaded. It is a soft wooden tick (band-passed noise, 25 ms; the Eins a little brighter) scheduled on the audio clock 120 ms ahead, so it sits on the beat whatever the frame rate; the Eins at the start sounds too.
- **Case Film: Vorlage → Dramaturgie, wirkt sofort** (user: "was ich bisher überhaupt nicht verstehe ist vorlage und vorlage anwenden"; "Vorlage heißt Dramaturgie, wirkt beim Auswählen sofort (Cmd+Z holt den alten Stand zurück), der Knopf „Vorlage anwenden“ fällt weg"). Choosing a dramaturgy replaces the storyboard at once as one step; Rückgängig brings back the storyboard as it was, edits included. The button is gone.
- **Case Film 0.2.0 for THA; Keyvisual animiert 0.1.6 on the Takt-API** (user: "um das prinzip zu testen … das tool auch für THA freischalten"; "Keyvisual animiert als Takt-Tool, Texttafel auf dem Band, Vorlagen und Einstieg über das THA-Dashboard"). Keyvisual animiert's drawing (the band, its five motions, the loop on Tempo × Takte) and its start state moved unchanged into `tools/keyvisual-animiert/render.js` (`KV_ANIM`) — checked pixel for pixel against the previous version with time frozen, in all five motions at several moments. It registers `TAKT_TOOLS['keyvisual-animiert']`: the loop is laid on the scene (film tempo, the scene's bars), so every motion closes on the scene's last beat (THA rule „Takt“); Zeichnen draws in and retracts by itself, the other motions are revealed and taken away over one bar. The band is generated on a seeded random in the film, so preview, thumbnail and export agree. `brands/tha/film.js`: THA has no symbols and no webfont, so every text of a THA film is set on a band (`KV_ANIM.textBand`): a Texttafel is a straight band with the text in the ground colour, its width fitted to the text, drawn in on the beat; over a picture or a tool only the band with its type remains (a second pass masks the ground). The Case Film works per toolkit: the brand dashboards list tools with `brands` in `tool.json` too and open them with `?brand=<kit>`; a THA film offers Keyvisual animiert, Texttafel and Standbild (pictures; big glyphs only where a brand has them), its own templates („THA · Das Band · 96 s“, „THA · Kurz · 64 s“, „THA · Leer“) with acts and the ADC rules, and keeps its state apart from the HMI film. Standbild is no longer tied to HMI.
- **Case Film 0.3.0: Partitur, Sprites, Charakter, Bearbeitungsmodus (probe)** (user: "im moment ist das interface verwirrend, weil die optionen verstreut sind … alles in der timeline ist ein tool (= sprite) … die eigenschaften bearbeite ich, indem ich auf den sprite klicke und in einem bearbeitungsmodus lande … wie die bekannten tools … header bzw. speicherhinweis (hier siehe aus dem CMS kirby)"; "die timeline ist eine partitur"; "wir choreografieren"; Charakter: "jedem sprite einen grundcharakter geben … die grafischen variablen von jaques bertin"). **Partitur** (probe `partitur`, was storyboard): a ground layer like the inspector — the full width under the stage (left of the inspector), flat, its top edge sets its height (default a third, kept in the preferences, double-click resets); the dock floats above it and ends where it begins. **Dock** compact: Dramaturgie, Ton/Beispiel/Metronom, Farbe, Tempo, Taktart, Speichern; Akzent, Körnung, Folienrahmen, Dynamik, Wechsel, Beschleunigung and Übergang moved to the inspector's new tab **Film**; the Szene section is gone. **Sprite-Leiste** (probe `sprite-leiste`) under the chosen sprite, by one rule: only what concerns the film — its time (Länge, Akt, Übergang, Schritt, Aufbau, Abbau), what every sprite has alike (Farbe Wie Film/Umgekehrt, Neu würfeln) and its Charakter — never what one tool alone has; plus Bearbeiten, Duplizieren, Löschen. Sprite hinzufügen is a short list instead of a pulldown. **Charakter** (probe `charakter`): three of Bertin's ordered variables, 0–1 with the middle as the tool set it — Maßstab (size: fern ↔ nah), Dichte (texture: licht ↔ dicht), Energie (rate of change: ruhig ↔ treibend); the film says how far, the tool says how (`character: true` in its Takt entry). First for HMI Grid (Maßstab = how near the camera is, Dichte = the raster's grain, Energie = icons per step and the film's Dynamik for this sprite) and the Texttafel (type size; column width and leading; words per beat). **Bearbeitungsmodus** (probe `bearbeiten`; double-click, Eingabetaste or Bearbeiten): the sprite's own tool full size, as one knows it, under a head like Kirby's — ← Zum Film, what is edited, and once something changed a bar of the edit blue with Verwerfen / Übernehmen; nothing reaches the film before Übernehmen (one undo step). New `core/embed.js`: a tool opened with `?embed=` takes and reports its state by postMessage, does not touch its own saved state, and leaves format, colour, time and saving to the host. First tool: HMI Grid 0.2.2 (`toToolState`, Raster now read back too). The Texttafel, the Standbild and tools that cannot be embedded yet open the inspector's Sprite tab. Wording: Partitur and Sprite instead of Storyboard and Szene; no "Schnitt" (the film is choreographed).
- **Case Film: Labor „Arrangieren“, Dynamik, Charakter-Verlauf, Comp23** (user: "ich will kein after-effects … in apple keynote kann ich exakt das gleiche ohne timeline machen"; "ggf. lab verwenden"; "ordner metapher … mehrere sprites in einem ordner sind automatisch ein splitscreen"; "wo sehe ich das audio?"; "maßstab, dichte und energie auch innerhalb einer einheit zu steigern"; "was komplett fehlt … ist die dynamik"; "das video ist aktuell stinklangeweilig"). `docs/labor/arrangieren.html`: the Case Film reduced to Bühne, Reihe and Inspektor on one ground — no dock, no timeline; the choice decides the inspector (nothing = Film, a sprite, a folder, a part); three variants of the Reihe (A Liste, B Reihe, C Takt). A folder of 2–4 sprites is a split screen (drag one onto another, Cmd+G; a second click on the stage picks a part, framed in blue). The music stands in the beat dots (size = loudness, a blue mark = a section change of the music). Moving preview on hover; the result full screen (F). Engine: the **Charakter** runs from a start to an end value over a sprite (`charTo`); **accents**: on some downbeats the picture flashes to its inverse (a moving camera was tried and dropped: "nur weil das zeug irgendwie rumwackelt ist das nicht mehr dynamik"), scaled by the film's Dynamik × the sprite's Energie × the loudness of the music; HMI text overlays always flush left with a 3.5 % margin; the HMI dramaturgies set words only on Texttafeln. Default sound of the lab: `audio-examples/comp23-lang.m4a`, Comp23 from the THA showreel lengthened to 99 s on its bars (rights as the original — to be cleared).
- **Case Film: Dramaturgie „Botschaft · 96 s“** (user: "ein case film ist kein movie title. er soll etwas kommunizieren. grosse HI, grosser pfeil der sich verschiebt ist schon gut. texttafeln fehlen"; "mehr dynamik"; "du ignorierst die app"). Made only of the app's sprites: Texttafeln carry the message (1–4 words, at least a bar; one or two words in XL), between them calm holds and bursts of four sprites of one beat each (HMI Grid, HMI Faces, a 2×2 folder, an accent card), each turned over against the last; HI!, the logo building up, R→ sliding through, the brand photos, the logo at the end. 39 sprites in 96 s (the old „System zeigen“: 14). Written for Comp23; the sentences without a brand word are placeholders. Sprites can now be shorter than a bar (a beat = 0.25); acts can be set per sprite in a dramaturgy. Default of the lab „Arrangieren“, which now also loads Standbild graphics.
- **Case Film: changes inside a sprite** (user: "was m.e. komplett fehlt sind übergänge innerhalb eines sprites. wechsel von weiss nach schwarz (z.b. wischen, blitzen im takt). verändern der anzahl an splits … 1x zu 4x zu 8x"; "gruppen … als dialog zwischen zwei oder mehreren tools"; "innerhalb eines sprites wechseln von nah zu fern"). Engine: **Farbe im Takt** (`flip`: Blitz, Wechsel, Wischen on the beat or the bar); **Teilung** (`split`: the sprite's tool in 1 → 4 → 8 → 16 → 32 parts, in equal steps, checkerboard possible); **Dialog** (`dialog`: a folder's sprites take turns on the whole picture instead of sharing it); **Maßstab in Stufen** (`zoom`: near ↔ far jumps for tools with a Charakter). In the lab „Arrangieren“ under „Im Sprite · auf dem Takt“ (and Zeigen: Gleichzeitig / Dialog for a folder); „Botschaft“ uses them instead of the bursts of one-beat slides. The lab's sound now starts on the first click (the audio context was created before any click and stayed held).
- **Case Film: syncopation, mockup stills** (user: "in der musik würde man synkopieren als strategie"; "baue auch mal ein paar standbilder der mockups ein"). The steps of a change inside a sprite (Farbe, Dialog) can fall on the beat, on the „Und“ between the beats, in 3-3-2 (on 1, the „und“ of 2, and 4) or on the bar. „Botschaft“: the claim comes in on the „und“ before the Eins (anticipated), the split grid flashes 3-3-2, the dialogues answer on the „und“ and in 3-3-2; Anwendung and Ergebnis hold single mockups of the brand (T-Shirts, Caps, Taschen splitting 1 → 4, Website; Hoodie, Stifte, Becher between the words).
- **Case Film: THA „Botschaft“, acts in the row** (user: "kannst du das zum testen auch auf THA übertragen"; "mir fehlt die dramaturgie komplett in der timeline. ich neige aktuell zu B"). Lab „Arrangieren“: a switch HMI Project · THA (`?brand=tha`), with the kit's sprites, dramaturgies and brand packs. New dramaturgy **THA · Botschaft · 96 s**: words on the band carry the message; Keyvisual animiert splits (1 → 4), turns over, answers in dialogue — on the beat, on the „und“ and in 3-3-2; one card anticipated. In the row each **act** is a run of its sprites under a thin line with its name, length and place in time, and a broken ADC rule in words (Auftakt over 15 s, idea after 30 s, Abspann not 2–4 bars) — in all three variants. Keyvisual animiert 0.1.7 (film only): turned over, its colour combination swaps (Rot auf Weiß ↔ Weiß auf Rot …), so „Umgekehrt“ and the changes on the beat work for THA; the band is drawn at least 320 px across (a thumbnail or a part of a split stalled it) and kept per pixel size (a thumbnail and the stage no longer take turns rebuilding Wachsen, seconds each). Accents now turn the picture over like Umgekehrt instead of a computed inverse (which turned THA red into mint). The lab builds its row once the pictures have settled instead of for every one.
- **Case Film: B · Reihe, Verhalten, Musik je Akt, Texttafel füllt die Fläche, Prinzipien** (user: "lass uns mit B reihe weiterarbeiten"; "der begriff sprite würde ich vermeiden … bleiben wir bei tools. vielleicht gruppen besser als ordner"; "wie können behaviours sichtbarer machen, auch in bezug auf die timeline. die behaviours schaffen dramaturgie"; "in der timeline fehlt mir der bezug zum audio, ohne after-effects zu werden"; "bei texttafeln … ganze fläche nutzen (default on)"; "bei HMI stört mich der zweigeteilte aufbau des grids"; "eine übersicht der inzwischen greifenden prinzipien und deren wechselwirkung"). Lab „Arrangieren“: B is the way (A and C hidden); words Tool and Gruppe instead of Sprite and Ordner; the **Verhalten** of each tool (Aufbau, Abbau, Farbe im Takt, Teilung, Dialog, nah ↔ fern, Charakter ↗, vorgezogen) in words under it, and the beats on which it changes marked — a ring on the beat, a stroke between two beats; the inspector's „Im Sprite“ is now „Verhalten“; lengths as „2 Takte + ½ Schlag“; **the music of each act** as one fine line of its loudness with the section changes in blue under the act's name. Engine: a **Texttafel fills the frame** by default — the largest type that still fits the width and the height („Ganze Fläche“, in the lab and the tool). HMI Grid 0.2.3 (film only): with the wave the grid builds up from the left (its several crests built two or three strips at once). New page `docs/labor/prinzipien.html`: the 19 principles in five layers with their state, where they work together, what each reference gives (Fischinger, ADC, Saul Bass, Studio Dumbar, Material 3, FIELD, Bertin, iA Presenter, Maeda, Keynote/Figma, Director) and a proposed order.
- **Case Film: HI! Strich für Strich, Zeilenabstand, Saul-Bass-Platzhalter, Prinzipien als Graph** (user: "könnten wir hier den SVG aufbau mal testen?"; "hier darf der zeilenabstand nicht zu groß sein. faustregel: große titel 1,0 bis max. 1,1"; "können wir als textplatzhalter zitate von saul bass nehmen?"; "bitte nicht als tabelle. eher grafisch (wie datenfluss oder touchdesigner)"). New graphic `hi-striche` (scripts/film-graphics-hmi.py): HI! in six groups — the H's left stem, crossbar and right stem cut out of the glyph's own outline, the I, the bar and the dot of the ! — „Botschaft“ opens with it, built a stroke per beat; a Standbild graphic now takes one step per part (it came all at once in the first beat). Leading by size: large titles 1.0, mid 1.05, small 1.1. Every Texttafel of both „Botschaft“ films is now a placeholder of Saul Bass, without a credit (user: "bitte alle texttafeln ausschließlich saul bass. quelle kann entfallen"): „Design is thinking made visual.“, „Symbolize and summarize.“, „I want to make beautiful things, even if nobody cares.“, split over the cards. `docs/labor/prinzipien.html` is a node graph read left to right — references → Werkzeug · Bild → Zeit → Verhalten → Dramaturgie → Film — with wires for what works on what (dashed blue where two overlap); hovering or tapping a node lights its wires and says what comes in and goes out.
- **Case Film: Texttafeln in Versalien, ein eigenes SVG mit Grund** (user: "bitte mal alle texttafeln uppercase mit line height 100. und nimm mal dieses SVG zum testen", Typo_07.svg). A Texttafel sets its words in Versalien with a leading of 1.0 by default (switch „Versalien“ in the lab and the tool). Its weight follows its ground (user: "schwarz auf weiß > demi, weiß auf schwarz: 500"): black on white 600, white on black 500. An SVG graphic whose first element is a rectangle over the whole artboard keeps it as its ground: it stands from the start, only the other parts build up. The user's `Typo_07.svg` (HI! in three paths on black) is in `brands/hmi/film/graphics/typo-07/` and opens „Botschaft“: H, I, ! on the beat.
- **Case Film: SVGs from Figma, the user's examples** (user: "hier noch beispiele für die SVG animation", HMI_10.svg, farben.svg). Splitting an SVG into parts is one function of the engine now (`CF.svgParts`, used by the tool and the lab instead of two copies): each element under the root is a part in the order of the file; a single wrapping group — a Figma export puts everything into one clipped group — is opened and its children are the parts, with the file's defs and the wrapper kept around each; a rectangle over the whole artboard is the ground. „Botschaft“ uses both examples: the logo with its spacing drawn around it in the Enthüllung (32 parts), the colours field by field at the end of the System. In the brand pack's graphics too (HI! Typo 07, Logo mit Schutzraum, Farben).
- **Case Film: starts with „Botschaft“ and Comp23** (user: "ich möchte jetzt gerne mal live damit arbeiten und exportieren. bei THA und HMI bitte jeweils mit einem default case-film starten (unser aktueller stand)"). The tool opens with „Botschaft · 96 s“ (HMI) or „THA · Botschaft · 96 s“ (`?brand=tha`) and loads Comp23 by itself; Comp23 is the first music example of both packs, with its measured first downbeat (`eins: 0.736` — the analysis put it after the quiet intro at 4.73 s, which shifted the film against the music and past its end). The kit's assets now keep all their fields (hint, credit, eins — the credit of the Incompetech examples had been lost).
- **Case Film 0.3.1: bewegte Vorschau je Marke; Dashboards** (user: "THA thumbnail passt nicht … könnten wir auch animationen/gifs als thumb nehmen? auch bei anderen?"; "thumbnail HMI passt auch noch nicht zum Stand"; "bei tha finde ich case-film projekt nicht"; "kannst du per default den case film laden?"). The brand dashboards take a preview per brand from `tool.json` (`previews: { brand: file }`); an animated WebP plays in the tile by itself — any tool can use it. Case Film has one per brand, 11–13 s of „Botschaft“ rendered by the film's engine at 25 frames a second like the film (`preview-hmi.webp`, `preview-tha.webp`, 448 × 252, about 900 KB each; a first try at 10 fps stuttered), and a new still `preview.jpg`. Fixed: a comment had swallowed `a.dataset.id = t.id` in both dashboards (since 62f4dc5), so the tiles had no id for moving and keeping the order. The Case Film keeps its state under a new key, so a film kept from before comes not back over „Botschaft“ once.
- **Case Film 0.4.0: die neue Oberfläche ist das Tool; Custom Type im Film; Saul Bass auch bei THA** (user: "bitte den neuen ansatz übernehmen. ich sehe noch den alten"; "bei THA hätte ich custom type schon auch gerne dabei"; "bitte bei THA auch ausschließlich statements/worte von saul bass"; "dieses kleine logo im quadrat sieht komisch aus. weglassen"). `tools/case-film/index.html` is now the lab „Arrangieren“ made into the tool — Bühne, Reihe (B, acts, music per act, Verhalten on the beats) and Inspektor on one ground, no dock, no Partitur; the choice decides the inspector. Added for live work: the words of a Texttafel and every tool's own settings in the inspector (from its parameters), own pictures and brand pictures, a sound of one's own (analysed), Speichern as MP4 with the sound (real time), PNG and Projekt (JSON with own pictures), Projekt öffnen, Rückgängig/Wiederholen (Cmd+Z, Cmd+Shift+Z), Entf deletes, „Letzten Zustand merken“ keeps the film; it opens on the first tool built up. The embedded tool (Bearbeiten) of the probe is not in it yet; `check-standard.py` knows the Case Film as a tool without a dock (`NO_DOCK`). **Custom Type 0.2.2**: its typesetting moved unchanged into `tools/custom-type/render.js` (checked: the same SVG) and it registers in the Takt-API — letters built up one per step, its alternates thrown anew on every step (Wechsel) or kept (Ruhe), turned over the combination swaps. „THA · Botschaft“: every word is Saul Bass now — the cards, the band of Keyvisual animiert, Custom Type („BEAUTIFUL THINGS“, „MADE VISUAL“) — and the small mark in a square is gone; the THA preview is rendered again.
- **Case Film 0.4.1: lädt schnell** (user: "bei tha lädt das default projekt nicht"). The row's pictures no longer hold the page up: each is kept until its tool, the film's colour or the loaded assets change, and missing ones are drawn after the stage, a few at a time (Keyvisual animiert's Wachsen takes seconds at a new size, and before every picture was drawn at once, again on every change). THA opens in about two seconds. „Dramaturgie neu laden“ in the film's inspector loads the dramaturgy fresh over a kept older film.
- **Case Film 0.4.2: MP4 Bild für Bild, auf das Sample synchron** (user: "offen ist, wie gut die export qualität ist und ob alles synchron ist. falls notwendig können wir auch browser eingrenzen, z. b. nur chrome … speichern läuft asynchron um berechnungen zu reduzieren"). New `tools/case-film/mp4.js`: every frame is drawn at its own time (frame n = n / 25 s) however long it takes and encoded with WebCodecs (H.264 High, 16 Mbit/s, a key frame every 2 s, no B-frames), the sound cut from its first Eins for the film's length and encoded as AAC (256 kbit/s); the MP4 is written here (ftyp, mdat, moov — no library), with the colour (colr, BT.709) and an edit list that skips the AAC encoder's priming (measured once per export by finding a click again: 2112 samples, 44 ms, in Chrome on the Mac). Checked: a click lands on its sample in the file (0 ms off), the sound is exactly as long as the film, THA red stays 255/3/80, macOS (afinfo, QuickLook) reads the file; 12 s of THA take about 2.5 s to make (whole film about 20–30 s), the tool stays usable and a click on Speichern stops. WebCodecs: Chrome and Edge; elsewhere the real-time recording stays, marked „Echtzeit“ in the menu.
- **Case Film 0.4.3: ohne Ruckler, Mockups als Gruppen** (user: "bei THA gibt es am Ende mehrere Ruckler, die denke durch band/tools verursacht werden"; "bei HMI: gerade die mockups am ende … besser, wenn die splitscreens gruppen mit einzelnen bildern wären … die bremsen gerade die dynamik"). Warm-up: every tool of the film is drawn once at the stage's size, at several moments and in each colour of a change on the beat, while nothing else is to do (never while playing or exporting) — Keyvisual animiert lays out its band per size and colour, and that had happened the first time it came up, while playing. Measured on THA: after the warm-up every frame of the film takes under 30 ms; while it warms up, the page can stand still for some seconds once (Wachsen). „Botschaft“ (HMI): the mockups of Anwendung and Ergebnis are groups of single pictures now — a dialogue on the „und“ and on the beat, a 2×2 in a canon, a dialogue in 3-3-2 multiplying 1 → 4 → 16 → 4, two side by side a bar apart — instead of Standbilder that changed their own pictures.
- **Case Film 0.4.4: synchron zum Gehörten, Bildhälften als Gruppen** (user: "ich habe das gefühl, dass alles gerade nicht mehr so richtig synchron ist"; "einige bilder sind bereits splitscreens … wenn wir die hälften wie einzelbilder behandeln können wir mehr machen. du müsstest sie nur zerschneiden"; "taschen, tshirt und stifte sind auch 50%"; "es ist auch ok, wenn eine bildhälfte erst rechts erscheint, dann verzögert links"). Playback follows the audio clock as it is heard (`getOutputTimestamp`, else the output latency) instead of the frame clock, so picture and sound no longer drift apart. `scripts/film-photo-halves.py` cuts the 19 mockups that are two pictures side by side into their halves (`brands/hmi/film/photos/halves/`, seams found by the jump in brightness: the middle, the websites at laptop | phone). „Botschaft“ (HMI) builds Anwendung and Ergebnis from groups of halves: as a split screen they look like the photo, and each half comes on its own beat (Kanon), answers in dialogue or splits. A picture in a canon now waits for its beat instead of standing there from the start. Kanon runs from −2 to 2: negative starts with the last picture (right half, then left). The play row sits under the stage instead of over it.
- **Case Film 0.4.5: Folge einer Gruppe** (user, after an analysis of Cavalry's Stagger and Sequence: "bau die Folge für Gruppen: von links, von rechts, von außen, gemischt mit Seed – statt nur ±Kanon"). A group has a **Folge** beside the Kanon: Links and Rechts in reading order, Außen (the outer parts together first, then the inner — on 2×2 the diagonal), Gemischt (a seeded order in which every part comes once; „Neu mischen“ draws another). The Kanon is now 0–2 beats between the steps of the Folge; a negative Kanon of earlier films reads as Rechts. „Botschaft“: hoodie, bags and flyer from the right, the last picture group of HMI gemischt, the four words of THA from outside. A control that rebuilds the inspector on its own click no longer drops the selection.
- **THA im Case Film: Wachsen ohne Hänger, Custom Type in einer Größe; Keyvisual animiert 0.1.8, Custom Type 0.2.3** (user: "das hier macht eigentlich immer probleme. ruckelt, seltsame überlagerungen. auch bei aufbau"; "THA tools brauchen beim laden auch lange bzw. interface reagiert verzögert"; "bei der custom type darf die schriftgrösse nicht springen … custom type ist ein eigenes tool"). Measured: Wachsen placed two bands in 1.8–2.4 s per instance, and the film builds one per pixel size and colour (stage, thumbnails, parts of a split), so after loading THA the page stood still four times for 2–7 s; two bands often found no clear way and ran over each other. In the film Wachsen now has one band (50–70 ms, keeps clear of itself), and its ways — in grid units — are found once per seed and frame shape and shared by every size and colour. After loading no pause over 100 ms remains. The tool itself still places two bands the slow way (open). Custom Type: each throw of the alternates has its own width, and the block was fitted to the frame anew on every step, so the type jumped in size; now the frame is set once from the widest throw of the sprite and every step is placed in it (`CUSTOM_TYPE.layout` takes `o.fix`; the tool itself is unchanged).
- **Case Film 0.4.6: der Punkt blinkt** (user: "HMI: dieser punkt ist irgendwie seltsam. blinken?"). „Botschaft“ (HMI): the radio button before the reveal stood still for a bar; now it is a group of the button off and on in dialogue on the beat — aus, an, aus, an — so it is switched on when the logo comes on the Eins.
- **Case Film 0.4.7: auf den Punkt** (user: "irgendwas hat sich … mit der taktgenauigkeit verändert. das ist bei weitem nicht mehr so auf dem punkt wie es mal war … es muss 100% synchron sein"). Measured, two causes: (1) Comp23 itself — at the change to its second part the beats move 22 ms later than the grid of the first (in the original at bar 17, in the lengthened `comp23-lang.m4a` from bar 25, 48.7 s, to the end), so half the film ran a little behind the music; the file is now shortened by 22 ms in the quiet before bar 25 (5 ms crossfade, re-encoded AAC 256 kbit/s) and every beat sits 3 ms after the 120-BPM grid from 0.736 s on; the examples are fetched with a version (`v` in the brand pack) so the new file is taken. (2) Since 0.4.4 the stage followed the sound as heard, but a frame drawn now is seen at the next refresh or the one after: now it shows the moment it will be seen at, one and a half frames ahead of the heard clock (as the frame clock before 0.4.4 was by chance). The audio clock itself was checked in the browser: 13–17 ms behind `currentTime`, jitter a few ms.
- **Case Film: eigener Ton „Takt 120“** (user: "kannst du ein eigenes audio nach diesem vorbild machen?"). Comp23 measured: 2 bars of intro, part A bars 3–22 (broken beat: kick on 1 and 3, snare on 2 and 4 with ghosts, syncopated bass, few hats), a break of 4 bars with the low end alone, part B bars 27–45 (four on the floor, sixteenth bass, claps on the „und“, busy hats, fill bars), an outro of 4; about F minor. `scripts/film-audio-eigen.py` synthesises a piece of that form with its own notes (Fm – Db – Ab – Eb) in numpy — kick, snare, clap, hats, bass, plucks, pad, risers — and encodes it with afconvert: `tools/case-film/audio-examples/takt-120.m4a`, 99 s, Eins at 0.5 s, every beat on its sample, no rights of others. In both brand packs as the second example (Beispiel → Takt 120 · eigen).
- **Case Film 0.4.8: Export mit 60 fps, einen halben Frame voraus** (user: "Ja: MP4 „Bild für Bild“ mit 60 fps, H.264-Level 4.2, Bilder einen halben Frame vor dem Schlag; Echtzeit bleibt bei 30 fps"). At 25 fps a beat of 120 BPM was 12.5 frames, so every second beat — and most „und“ — fell between two frames, and a change showed in the first frame after its time, up to a frame (40 ms) late. Now MP4 „Bild für Bild“ has 60 fps (a beat of 120 BPM is 30 frames, an „und“ 15) and every frame shows its time plus half a frame (`lead` in `CF_MP4.encode`), so a change is at most 8 ms early and never late, at any tempo. H.264 level 4.2 for more than 30 fps at 1080p (4.0 below). Measured: 12 s of THA in 4.9 s (25 fps: 1.9 s), a whole film about 40 s. The real-time fallback records at 30 fps (every frame within 33 ms; 16 ms is not safe for THA). The Speichern list says which.
- **Case Film 0.4.9: Pausen im Aufbau, Mockups nur hochkant nebeneinander** (user: "bei manchen aufbausequenzen wie z. b. HI! … wenn es auch mal pausen gäbe. bei HI! z. b. 1 - 2 - pause - 4"; "bei den mockups: bitte die hochformatigen nicht in querformatige frames packen. das ist seltsam"). `core/takt.js` 0.5.9: `taktPhases` takes a rhythm of the Aufbau (`rests`: 1 2 – 4, 1 – 3 4, 1 – – 4, 1 2 3 –); on a rest no part comes and the Aufbau holds — for every tool on the Takt-API, in the Case Film first for graphics (Standbild → Grafik: Rhythmus). „Botschaft“ (HMI): HI! builds H · I · pause · !. The picture halves are upright, so they now stand only side by side: no Dialog (a half over the whole landscape frame), no Teilung and no 2 × 2 with them; their change is a half that turns on the beat to the same side of another mockup, and the website comes as its whole photo. Same lengths (Anwendung 8, Ergebnis 7 bars).
- **Case Film 0.4.10: die HMI-Fotos aus `img/`** (user: "im ordner img sind die bilder für HMI nochmal ordentlich. bitte diese nehmen"). The 16 pictures of `img/` (HMI_24–35, HELIO_29–35, 1920 × 1080) replace the photos of the same mockups in `brands/hmi/film/photos/` (re-saved at JPEG quality 88): T-Shirts, T-Shirt, Hoodie und Mütze, Caps, Becher, Taschen, Stifte, Social Media — for HMI Project and HELIO; new: **Visitenkarten** (HMI_24). Flyer, Website, Broschüre and the context pictures stay as they were (not in `img/`). The pairs part exactly at 960 px; the two T-Shirt pictures are single photos now, so they are no longer halved (`scripts/film-photo-halves.py`), and „Botschaft“ shows the T-Shirt whole. The photos are loaded with a version (`PHOTOS_V`), so no browser keeps the old ones. `img/` itself stays out of the repository.
- **Case Film 0.4.11: Wechsel landen auf dem Schlag, Metronom zurück, Bild pro Gerät** (user: "synchron ist das leider noch immer nicht. ohne das ist das tool unbrauchbar"; "das metronom ist auch weg. ich würde es gerne damit testen"). Measured on the picture, not the clock: of 102 beats with a visible change, 67 changed on the beat, 35 were half visible only 100–400 ms later — swaps of the tools (0.46 s), parts of the Aufbau (0.46 s, several per step spread over the whole beat), the text card fading in over half a beat, the wipe over 40 % of its step (0.8 s on the bar) — which reads as late however exact the clock. Now the film gives every tool an attack (`takt.attack`, `TAKT_ATTACK` 0.14 s in `core/takt.js` 0.5.11; HMI Grid, HMI Logo, HELIO Logo, HELIO Grid and HMI Faces take it, standalone they keep 0.46 s), the parts of one step come within 0.12 s, the text appears in 0.14 s, the wipe crosses in 0.28 s. Playback: picture, music and Metronom on one clock, the audio context's (the music and the ticks are scheduled on it), the picture one and a half frames ahead; moving in the row while playing restarts the clock there. **Metronom** is back (Ton), also over the music, for checking. **Bild** −80…+80 ms moves the picture against the sound for this device (speakers, headphones and screens are late by different amounts), kept in the browser.
- **Case Film 0.4.12: Verlauf — Steigerung, Atem, Auftakt, Abklingen** (user: "HMI funktioniert anders, hier spielen auf- und abbau eine wichtigere rolle. es fühlt sich so an als würde alles auf den takt reagieren, aber so wie ein fussstampfen … wenig dynamik. verzögerungen, steigerungen innerhalb einer sequenz"; "Ja, bau den Verlauf … als Verhalten und setz ihn in HMI Botschaft ein"). Every step had been on the beat, evenly — the stamping. A **Verlauf** changes the density of the steps over a sequence, as music does: Steigerung (quarters, eighths, then sixteenths — a roll into the next Eins), Atem (a hit a bar, then it holds), Auftakt (on the „und“, the Eins rests), Abklingen (sixteenths, eighths, then quarters). `core/takt.js` 0.5.12: `taktCurve()` gives the onsets, `taktAt({ curve })` steps on them, and `taktPhases` spreads the Aufbau over the whole curve, so the parts themselves come faster (or slower) — for every tool on the Takt-API. In the Case Film the Verlauf of a tool or group (Verhalten → Verlauf) also drives the pictures, Farbe and Dialog, above their own Schritt. „Botschaft“ (HMI): the flashes of Problem and the wipes of the faces come ever closer, the reveal of the logo dies away, the zooming grid breathes a hit a bar, the colour fields roll into Anwendung, the picture half turns on the „und“, and the last pair runs ever faster into the logo. Measured frame by frame: the changes fall on the onsets of each curve; the film keeps its 1:36.
- **Custom Type 0.2.1** (user: "warum hier immer noch nicht linksbündig? rand soll 4%"): the default is now left-aligned with a margin of 4 % (was centred, 10 %). Applies to a fresh start and to Zurücksetzen; a state kept with „Letzten Zustand merken“ keeps its own values.
- **Keyvisual animiert 0.1.9: Wachsen with several bands fast and without overlaps** (user: "das hier macht eigentlich immer probleme. ruckelt, seltsame überlagerungen"; "die probleme mit wachsen gibt es ja bereits im tool selbst"). Two bands took 2–3 s to place (a ladder of lengths, each walk checked at 40 moments), three and four often found no clear way and ran over each other. Now a walk is checked once for the whole loop — two close points of two bands meet exactly when their places in the loop lie less than the band's share apart (a spatial hash instead of all pairs) — and gives the longest length at which every band keeps clear, and the phase where it does. Short ways are tried first for several bands, then the time left (120 ms) goes to longer ones; the closing straights of a way take the flatter order (a hairpin had folded a band onto itself). Where Anzahl does not fit (wide bands, e.g. Breite 4 with four bands) the tool shows one band fewer at a time, at the width asked for, until the bands are at least two band widths long (user: "lieber weniger Bänder zeigen als leere"); with the default Breite this happens now and then for four bands. Measured at 1920 × 1080: 2–4 bands in 40–130 ms (up to 200 ms at Breite 3.5–4, where bands are dropped), no touching and no empty band in about 250 checked layouts (600 moments each); bands mostly as long as Länge says or longer on screen than before.

## [0.5.8] — 2026-10-22

- **Brand dashboards in the tools' UI** (user: "die dashboards sind noch fremdkörper … jedes tool eine fläche in anlehnung an die schwebende palette"): each tool is a surface like the floating palette (ground, radius, shadow, blur, title size), every picture 16:9 as on the HMI dashboard (`previewAspect` gone). The „Vorschau“ tag and the underlined titles are gone. Tiles can be moved (drag with mouse or pen, Alt + arrow; the place is the nearest grid slot, so nothing flips back); the own order is kept in the preferences per brand. Touch scrolls the page. The tile is the palette's surface with its tokens, nothing of its own. Order: HMI as before, THA as the old dashboard (`brand.json` tools). QM report: `docs/QM/dashboards.md`.
- **Core: dark panel mirrors light** (user: "kontrast darkmode passt nicht mit light mode"): light, the panel lies ~13 steps above the ground; dark it lay on it (≈ #191919 on #1c1c1e). `--panel-bg` dark is now rgba(44,44,46,0.72) (≈ #272729 on the ground) — every dock. Accepted by the user on the dock as the application shows it; rule in `DESIGN.md` §1.
- **Core: `[hidden]` always hides** — an author `display` had beaten it again (the dashboard's reset button), one rule instead of one per class.

## [0.5.6] — 2026-10-22

- **The object model in the tools** (user: "übertrag das Objektmodell auf Custom Type, Keyvisual, Gradient und Facetrack"; `DESIGN.md` §2b0). New core block: `drawStageDot`, `drawStageButton`, `hitStageButton`, `stageDotSVG`, `stageButtonSVG`, `openStageOptions` (the options beside the object, a row of choices and Löschen; Esc, a press elsewhere close it).
  - **Keyvisual**: a dot under the point the pointer is on; under the chosen point its button — Hier beginnen (only at the far end, where it has an effect) · Löschen. Deleting by Alt-click and double click is gone (one gesture: Entf or Löschen); the stage hint says so.
  - **Custom Type**: a click chooses a letter (its button shows all its forms, as they look, and Löschen), a double click writes there (counted by time and place: the first click redraws the stage), while writing only the caret; Entf and Esc for the chosen letter. The ↑/↓ discs are gone — the arrow keys still switch the alternate while writing.
  - **Gradient, Gradient Blend**: rest shows nothing; a dot under the field the pointer is on; the chosen field shows ring, centre and size handle and its button — Farbe · Löschen (while more than two remain). A click no longer opens the colour picker at once.
  - **HMI Facetrack** (photo): a dot under the face; the chosen face gets a size handle at its corner (the scroll wheel is gone) and its button — Neues Gesicht · Löschen. The separate „Gesicht löschen“ in the inspector is gone (the action belongs to the face).
- `check-standard.py` reports a scroll wheel on the stage.
- **White edge on blue marks** (user: "gib Punkt und Knopf einen weißen Rand wie die Griffe"): the hover dot and the options button carry a white edge of 1.5 device px, as the chosen handle — on a blue palette in Gradient they had vanished.

## [0.5.5] — 2026-10-22

- **One model for objects on the stage** (`DESIGN.md` §2b0): five states (rest, hover, chosen, drag, write) and one gesture per verb, tried as a click prototype on a letter, a point, a field and a face (`docs/labor/objekte.html`) and accepted by the user. Not yet carried into the tools.

## [0.5.3] — 2026-10-22

- **Lab for the marks while writing** (`docs/labor/markierungen.html`; user: "die textmarkierung gefällt mir nicht" — "das muss ich sehen. lab?"): four questions side by side on the three THA grounds — the letter under the pointer, selected text in the field, the caret, the label of the Alternates slider. **Decided: the letter under the pointer gets a blue dot (r 2.5 px) under it** (variant D; user: "blauer punkt unten macht sinn. später könnte man z. b. hier auch alternates direkt aufklappen"). **Decided: the slider is „Anzahl Alternates“** (variant A with a count word; user: "4 A: aber bitte Anzahl Alternates"). Open: selected text in the field, the caret.
- **One place marked at a time** (user: "warum ich einen buchstaben markieren kann, während der fokus wo anders ist"): while typing, only the caret's letter with its ↑/↓; the hover dot shows only when not typing. Rule in `DESIGN.md` §2b; Custom Type changed (the hover outline is gone).
- **Text field as one core block** (user: "das feld wurde schmal (höhe) text nicht mehr lesbar"): six tools grew their field by hand and measured even while it was hidden (dock collapsed) — the browser answered 0 and the field stayed flat after opening again. `fitField()` / `watchField()` in the core: measures only a shown field, never below one line, again on size or visibility change and when the fonts are in. Custom Type, Keyvisual, Keyvisual animiert, Kamera, QR, Fontscale use it; block **Textfeld** in the pattern library; `check-standard.py` reports a field grown by hand. Checked: collapsed, typed on the stage, opened — the field shows the whole text (75 px); one line 37 px.
- Found while checking, not fixed yet: the stage in Custom Type has no selection — Cmd+A selects nothing, so retyping inserts into the word.

## [0.5.2] — 2026-10-22

- **"Ich kann das Format nicht mehr ändern"** (user, Custom Type): not reproducible with the current files — real clicks change the format in Custom Type (1:1 → 9:16 → A4 → Frei), with the inspector open or closed, and every tool with a format uses the core block `initFormat` (checked). The screenshot (dock over the open inspector) shows a page from an older state: the tool pages carry no version, and `python3 -m http.server` lets the browser keep them; during the parallel rebuild there were intermediate states. **Fixed at the root:** the starters now run `scripts/serve.py`, which answers `Cache-Control: no-cache`.
- **A check against single solutions**: `scripts/check-standard.py` reads every tool against `DESIGN.md` §2a–2c (format only from the core block, stripes only with a band, no dividers, Carbon symbols only, Rückgängig/Inspektor/Speichern, one tab per section, Werte last, no heading with a same-named switch, no brand colours for stage marks, one core version). In `CLAUDE.md` and the checklist (`DESIGN.md` §7, step 0). Its first run found: 45 symbols from the old 16-px set left in the hidden export buttons of 11 tools (removed), and no Rückgängig in Keyvisual animiert.
- **Keyvisual animiert**: Rückgängig in the head (controls and what the die made), the die is "Neue Variante" with the same symbol as everywhere.
- **Core — undo**: `initControlState({ extra })` carries state that is no control (a generated band, a curve); a new action starts from what is on screen (taken at pointer- or key-down, before a checkbox flips), so what a tool changes by itself is no step and undo never brings back a state that was never shown.
- **Core — focus on the chosen segment**: a fine line inside the fill instead of a ring around it (user: "genau solche unnötigen dopplungen wollen wir nicht").

## [0.5.0] — 2026-10-22

- **Every tool through QM, basic and advanced** (user: "bitte alle tools: QM und basic/advanced mode"). The ten remaining tools were condensed by five helpers in parallel after the pattern of the grid family, then brought to one standard here: HMI Logo, HELIO Logo, Gradient, Gradient Blend, HMI Facetrack, QR, Fontscale, Bildoverlay, Custom Type, Kamera — all 0.2.0, `"detached": true`. One report per tool in `docs/QM/<tool>.md`; brief for the helpers in `docs/QM/BRIEF.md`. Every tool now: head Neue Variante (where there is chance) · Rückgängig · Inspektor; one dock in the order Format → Inhalt → Farbe → Form → Bewegung; inspector; one Speichern; the result and its exports unchanged (checked per tool, mostly byte-identical).
- **One standard instead of single solutions** (user: "vieles noch unterschiedlich (farbe usw). auch umgang mit formaten ist überall unterschiedlich, auch reihenfolgen"; "ich will einheitliche prinzipien, keine einzellösungen") — `DESIGN.md` §2a–2c:
  - **Format** — one core block `initFormat()`: 1:1 · 4:5 · 16:9 · A4 · Frei (the user's choice), Hoch/Quer as a symbol at the heading (gone at 1:1 and Frei), labels follow the orientation. Replaces five different sets in five orders (4:3 is gone; reachable via Frei). The grid tools' `initGridFormat()` sits on it: Raster as symbols (2–5 cells a side, user: "können wir das als icon zeigen?"), columns and rows in the inspector — setting them by hand means Frei. 1:1 and 16:9 from each tool's preset table, so defaults stay; 4:5 and A4 computed from the tool's own geometry.
  - **Farbe** — Farbfelder everywhere; a pairing is ground with a dot in the figure's colour; the stripe only where the figure is a band (Keyvisual, Keyvisual animiert, Kamera) — user: "die Streifendarstellung macht eigentlich nur beim Band Sinn".
  - **Marks on the stage** (§2b, Keyvisual's measures, user: "bitte auch grössen und strichstärken der markierungen bei keyvisual berücksichtigen"): edit blue for everything editable, neutral grey for structure lines and what does not snap; line 1 device px, handle r 3.5/5, label 18 px, a stage button an 18 px disc with a 24 px target; no tints, no brand colours; never exported. Core: `STAGE_MARK`, `STAGE_NEUTRAL`, `stageLine`, `drawStageHandle`, `drawStageLabel`. Applied: Gradient/Gradient Blend handles and radius guide (was white with grey shadows, dashed), HMI Facetrack landmarks and selection (was HMI red, and showed in PNG and MP4), Custom Type hover (was the letter at 72 %, read as pink) and its ↑/↓ — now blue discs that are buttons ("man versucht zu klicken"), smaller (18 px), Carbon chevrons, a 24 px target.
  - **Inspector** (§2c, user: "gut strukturiert geht anders"): one tab = one section in dock order, groups with sub-headings, a switch that turns a group of three or more on is its heading (Übergang in five tools, Filter in Kamera, Bild/Verlauf/Schweben in Facetrack), actions with their object (Facetrack's Entfernen moved to the source in the dock), Video as the last group of Bewegung in Facetrack (no section without a tab).
- **Custom Type**: Ausrichtung as three symbols (drawn on Carbon's grid; user: "haben wir dafür icons?").
- **Keyvisual**: the note about words that do not fit is solid ink like the toast (it was see-through and read as a gradient — user: "warum ist hier ein verlauf?").
- **Core**: `.select-wrap[hidden]` (a pulldown turned segment row left its chevron), symbols in segment rows 18 px, Hoch/Quer and other toggles (`data-toggle`) are part of the undo state. Core 0.4.9 in every tool.

## [0.4.5] — 2026-10-22

- **Sharp stage** (user: "renderqualität ist z. B. bei pfeilen nun deutlich schlechter (unscharf, leicht pixelig)"). The grid tools drew the stage at export size (e.g. 4776 × 2688 px) and let the browser shrink it to the box; with the stage now beside the inspector the shrink grew past 2 : 1 (2.26 : 1, was 1.7 : 1), where the browser's downscale skips pixels — edges soft and stair-stepped; in standards mode the 1 px border also sat inside the box. New in the core: `fitStage()` — the bitmap has exactly the device pixels shown, on whole pixels, the border outside (as Keyvisual); `recordCanvas()` — the video draws into a canvas of its own at export resolution. HMI Grid, HELIO Grid, HMI Arrows and HMI Faces use both; checked: stage 2110 × 1188 device px = shown, MP4 still 3964 × 2230. PNG, SVG and PNG sequence had canvases of their own and are unchanged. The other tools are checked in their QM run.

## [0.4.4] — 2026-10-22

- **QM of the grid family** (user: "übertrag das Muster von HMI Grid auf HELIO Grid, HMI Arrows und HMI Faces, mit QM-Bericht je Tool"; reports in `docs/QM-Check-HMI.md`). HELIO Grid, HMI Arrows and HMI Faces 0.2.0, `"detached": true`, built after HMI Grid: head Neue Variante · Rückgängig · Inspektor; basic Format → Farbe → own → Bewegung; inspector; one Speichern.
  - **HELIO Grid**: Muster had no effect while static and stood in the basic; now in the inspector under Bewegung, shown only while it runs. No own section (fixed square tiles).
  - **HMI Arrows**: section Pfeile — Unruhe (was "Rauschen · Skalierung 0.05") and In 45°-Schritten; Bewegung only Tempo (the field changes continuously, no swaps). The die for one slider is hidden.
  - **HMI Faces**: section Gesichter — Gleiche Augen; Augen and Mund as two groups of icon tiles in the inspector, each keeps at least one; Transparenter Hintergrund under Video. Starts at Frei 3 × 3 as before.
- **Core**:
  - `initGridFormat()` and `initMotionSwitch()` — Format/Raster rows and the Bewegung switch once, for the four grid tools (HMI Grid moved onto them); `gridFormatName()` for toasts.
  - **Undo, two bugs fixed**: a checkbox's `input` and `change` closed a step in between, before the tool's handler ran (the last eye that must stay was recorded as gone); and the step before is now saved as it stood after its handlers, not when the next click arrives (a checkbox has already flipped then). Checked with a real mouse: drag a slider, click a tile at once, two steps back.
  - A pulldown turned into a segment row hides its frame too (its chevron stood beside the row).

## [0.4.0] — 2026-10-22

- **QM HMI Grid, pattern for the grid family** (user: "QM-Durchlauf mit HMI Grid als Muster"; report `docs/QM-Check-HMI.md`). HMI Grid 0.2.0, condensed by hand and now `"detached": true` — the takeover script leaves it alone.
  - Basic in working order **Format → Farbe → Icons → Bewegung**: Format and grid density as two segment rows (16:9 · 4:3 · 1:1 · Frei; Raster Grob · Mittel · Fein · Sehr fein) instead of a pulldown of 13 codes; Frei shows Spalten/Zeilen. Farbe as swatches. Drehung (noun). Bewegung a switch as in Keyvisual, Anteil and Takt under it without numbers. One **Speichern**: PNG/SVG, or MP4/PNG-Sequenz/Standbild with length and frame rate.
  - Head: Neue Variante · Rückgängig · Inspektor. **Inspector**: Raster (Muster, Seed) · Icons · Bewegung · Video · Werte (Zustand kopieren, Zurücksetzen) — the user's rules: Muster, Seed and the choice of icons are Advanced.
  - **Icon tiles** (probe `icon-kacheln`): the choice of icons as the icons, in the grid = filled; at least one stays. Dividers gone, Carbon symbols instead of a 16-px set, toasts in the dock's words.
- **Core** (every tool):
  - `initControlState()`: the controls are the state — undo for every step (head and Cmd+Z; a click is one step, a slider drag one step when it rests, events a handler fires belong to its step), Zurücksetzen, Werte and "Letzten Zustand merken" for tools without a state object.
  - **The dock holds its top edge**: it starts centred, then grows only downward — centred, it grew both ways and the controls above jumped under the pointer (measured 85 → 38 px).
  - **Dragging at the title** (user: "drag reagiert in diesem Bereich seltsam"): the title link dragged itself; now it drags the panel, a press without movement opens the dashboard, keyboard still follows the link; 24 px target.
  - Inspector: a tab whose section is gone goes too; with everything in view the top tab is marked, not the last.
  - The ground around the stage follows Darstellung in Einstellungen, not only the system.
- `PNG saved` / `SVG saved` in German in the other HMI tools (dictionary).

## [0.3.2] — 2026-10-22

- **HMI tools in German** (user, 22.10.2026): every label, button, tooltip, aria-label and toast, from `scripts/uebernahme-de.json` (applied by the takeover script: markup text, attributes and whole JS string literals; key names the code compares against stay). `<!doctype html>` and `<html lang="de">` added — the HMI files had no skeleton and ran in quirks mode. The preset label `Custom` → `Eigene` also in `core/tiling.js`, where the tools' list comes from. Vocabulary table in `DESIGN.md` §6.
- **Farbe instead of Theme** (user: "die themes dark/light … mit den farbpaletten bei tha gleichsetzen"): the light/dark row of nine HMI tools is the block Farbfelder — round swatches „Schwarz auf Weiß“ / „Weiß auf Schwarz“, name in tooltip; the buttons keep `.mode-btn`, so the tools' code is unchanged.
- **One dock** (user: the Animation panel sat misplaced, "evtl. braucht es das in der neuen struktur nicht mehr"): the second panel of ten tools is the section Bewegung of the dock, before the export buttons, shown only in Animiert — as in Keyvisual. `sectionPanel(id)` in `core/ui.js` answers the tools' `show()`/`hide()`. HMI Logo and HELIO Logo left that panel one `</div>` short; the script closes it where the browser did.
- **Pulldowns in the design system** (user: "pulldowns passen noch nicht"): up to five options a segment row (`selectsAsSegments`, e.g. Bildrate, PNG-Größe); more: new block **Auswahlliste** — flat like a field, no native frame or arrow, Carbon chevron (`.select-wrap`). In the pattern library; to be approved.
- **HMI dashboard as before** (user): the order of the old dashboard (`tools` in `brand.json`), previews 16:9 (`previewAspect`), a dark preview in dark mode (`previewDark` in `tool.json`), HELIO inverted against the dashboard (`previewInvert`) — read from the old dashboard by the script.
- Every core and brand file a taken-over tool loads carries the core version (tiling.js still asked for `?v=0.46.0` and would have stayed cached).
- Started `docs/QM-Check-HMI.md` with the user's rules for condensing: Muster and Seed → Inspektor.

## [0.3.0] — 2026-10-22

- **MVP: every tool of THA Designtools and HMI Project Designtools in the new system** (user, 22.10.2026: "möglichst schnell als MVP"; the Datenfluss of the dashboard comes later). `scripts/uebernahme-mvp.py` copies the 14 remaining tools as they are and puts them on the new core: links to `core/ui.css` / `core/ui.js`, brand files under `brands/<id>/`, the dock title leads to the brand dashboard, a `tool.json` each (version 0.1.0, phase Entwickeln, `from` names the source version), registered in `tools/index.json`. No redesign — each tool is condensed with the user later.
  - THA: Bildoverlay, Custom Type, Kamera. HMI Project: HMI Logo, HELIO Logo, Gradient, Gradient Blend, HMI Grid, HELIO Grid, HMI Arrows, HMI Faces, HMI Facetrack, QR, Fontscale.
  - **New brand HMI Project** (`brands/hmi/`): `brand.json` with four first rules, `brand.css` declaring DIN 2014 Rounded for stage and export only (removed from the tools' UI body rule), favicons, brand dashboard and `Starten.command` generated from THA's.
  - **Core**: `core/ml/` (ml5 and the models of both projects, offline), `core/tiling.js` (seeded random); THA's shader `overlay.js` to `brands/tha/`. Core version 0.3.0 in every link.
  - **Dashboards revalidate the tool list** (`cache: 'no-cache'`): the browser kept the old `tools/index.json`, and the brand dashboard showed no HMI tools.
- Known gaps of the MVP: their `tool.json` has no `blocks` or `rules` yet, so they hang loose in the Datenfluss; tools keep their old in-tool controls (no inspector, no single Speichern).

## [0.2.2] — 2026-10-22

- **Keyvisual animiert: preview marked on the stage** — while a motion is previewed on hover, a 2 px line in the edit blue runs around the stage, 4 px outside it: what is shown is provisional, not the chosen state. A hatched band (the THA Tools hatch, in blue) was compared and dropped: too subtle.
- **Inspector head without hint text**: the description ("Einstellungen der Bewegung, der Schrift und des Videos", "Klick auf die Fläche zeigt die Einstellungen") and the tab names repeated what the tabs say. The head now names only an object picked on the stage, in the edit blue, and is empty otherwise.
- **Two dashboards, for two kinds of people** (user, 22.10.2026):
  - **Project dashboard** (`dashboard/`, for the maintainer only), like the Datenfluss of THA Tools, built after Shneiderman's mantra — overview first, zoom and filter, then details on demand: six columns Prinzipien (Grundprinzipien, Informationsarchitektur, and from `../Grundlagen` Semantik, Icons und Linien, QM-Check) → Bausteine (the pattern library as one field) → Marken (the brand's rules by Farbe, Band, Schrift, Bewegung) → Tools → Ausgaben → Auslieferung. Fields carry names only. Lines for what uses what (`blocks`, `rules`, `outputs` in each `tool.json`); pointing at a field lights up its chain. A click opens the content in a panel at the right edge like the tools' inspector — documents (principles, changelog) rendered there instead of downloaded, the pattern library's blocks, a rule with the tools using it, a tool's version, probes, rules and outputs with a button to open it; Esc closes. A filter field (shortcut /, Esc empties it) keeps the matching fields with their whole chain, in flow and list. A dot per tool — green ausgeliefert, yellow Labor with its probes, red when the tool links an older core than the others. Second view Liste: one row per field, a click opens the same panel. New data: `patterns/blocks.js` (one list of blocks for the pattern library and the dashboard), `brands/index.json`, `brands/tha/brand.json` (rules). Tried and dropped: one field per block, two-line descriptions under each field.
  - **Brand dashboard** (`brands/tha/index.html`, for users, delivered with the toolkit): "THA Designtools", the tools of the brand as cards — still in the lab: "Vorschau" —, and "Einstellungen" as a window (Schriftgröße, Darstellung, Letzten Zustand merken). No versions, probes or patterns. Its own starter `brands/tha/Starten.command`; a tool's name leads back here. `Starten.command` at the root opens the project dashboard.
  - Both on the ground of the tools (`--offset-bg`, #1C1C1E in dark mode) instead of hard black; in the Datenfluss fields, lines and rows in opaque colours mixed from ink and ground (lines showed through the translucent fields).
  - Both follow the rules of the tools' UI: title and headings in the sizes of dock and inspector, no capitals, the settings as the Carbon gear in a 28 px button, spacing by proximity (12 · 28 · 40 px), tool pictures framed like the stage, links with the core underline.
  - Tried and dropped on the way: one dashboard for both with a brand filter; settings as tiles or as a line on the page.

## [0.2.1] — 2026-10-22

- **Settings in the dashboard**: Schriftgröße, Darstellung and Letzten Zustand merken are set once in the dashboard for every tool (`renderSettings`) and take effect at once, also in tools already open (storage event, `initPrefs`). The tools lose the gear and the settings dialog; their name in the dock head leads back to the overview. Zurücksetzen stays in the tool (inspector, Werte).
- **Split guide** (Keyvisual, Keyvisual animiert; core `snapSplit`, `drawSplitGuide`): while the split is pointed at or dragged its edge shows as a thin line; within 6 px of a grid column it snaps there — blue line with "Raster · Spalte 9" — otherwise grey with the position in %. As for every object being moved: its edge is seen while it moves.
- **Blue for what is edited on the stage, in the inspector too**: the name of the object picked on the stage ("Ecke 6 · x 20 · y 19", "Band · Gerade 3 von 8") takes the edit blue, so it ties to the handle it names (token `--edit`, lighter in dark mode for 4.5 : 1). Readouts that do not name an object on the stage (Werte, tab names) stay in ink.

## [0.1.9] — 2026-10-22

- **Link underline broken at descenders, in every browser** — browsers do not agree (Safari ran the line through the g even with `text-decoration-skip: ink`, and a line under the descenders only stood lower). The core now does it: `initLinkUnderlines()` splits the text of each link into runs; letters with a descender (g j p q y Q , ;) are not underlined, the rest is, 1 px under the baseline. Links use the class `.link-u` (the jump headings are found by `data-insp`).

## [0.1.7] — 2026-10-22

- **Keyvisual animiert 0.1.3: timeline** (probe `zeitleiste`) — while Tempo, Länge or Videolänge change, the stage shows what they mean: bars as segments, beats as dots, a playhead running with the loop, the current bar and beat marked, and the length in words ("8 Takte · 19.2s · 100 BPM"; for Videolänge the loops: "3 Loops · 57.6s · je 8 Takte"). It fades 1.6 s after the last change. The principle from Keyvisual's angle guide: show the effect of a setting where it acts, only while one acts, the result in words.
- **Keyvisual animiert: preview on hover** (probe `vorschau`) — pointing at a motion plays it on the stage before choosing, with a tag "Vorschau · Wachsen – Klick übernimmt"; nothing changes until the click, leaving returns to the chosen motion (also on keyboard focus).
- **Keyvisual animiert: split moved on the stage** — drag the edge of the split (col-resize cursor near it), as in Keyvisual. Both tools do this now: a candidate for the core.
- **Link underline in Safari**: `text-decoration-skip: ink` (and `-webkit-`) besides `text-decoration-skip-ink`, since Safari kept the line through the descenders.

## [0.1.6] — 2026-10-22

- **Focus ring in full ink in dark mode too**: the dark block of the old tokens set a 60 % blue, so the ring around a focused field was a dull blue (light mode already used the ink).
- **Keyvisual: edit marks with more power** — a deeper blue (`rgb(0,102,255)`, was the system blue `rgb(10,132,255)`, about as light as THA red, so it vanished on the band) and, after Figma's path editing, one thin solid centre line in neutral grey (was dashed blue) and small handles — white with a fine blue edge, the selected one blue with a white ring.
- **Keyvisual: grid under the band** — dots and margin line were drawn over everything, so on the band they showed as noise; now they lie on the ground only, under band and type, in the mark colour of each half when split.

## [0.1.5] — 2026-10-22

- **Link underline 1 px under the baseline** (was 2 px): at 14 px the line only touched the descender of the g and ran on unbroken; now it crosses it and breaks there.
- **Keyvisual: angle guide while dragging a point** (probe `winkelhilfe`) — around the neighbour the band comes from, a thin arc through the dragged point with a dot at every spot it can snap to (one per direction of Richtungen; nothing with Raster, where the grid dots are those spots), only about 90 px to either side of the point. What corner it makes is said in the label at the two corners the dragged straight forms: angle and zone, e.g. "65° · Knick". (Zone colours on the arc, a full ring and arc pieces with gaps were tried and dropped: they did not explain themselves.)
- **Keyvisual: no dots at the edge of the frame** — half dots there read as a dotted border.

## [0.1.4] — 2026-10-22

- **Core links bumped** (`?v=0.1.4`): `core/ui.css` changed within 0.1.3 after its links had been bumped, so a browser could keep the earlier 0.1.3 stylesheet — links then still showed the old underline (3 px below the word, under the descenders instead of broken by them). Rule from now: bump the `?v=` of the core links whenever `core/` changes, also within a version.
- **Keyvisual: grid at the bottom margin** — the height of a format is rarely whole U, so the bottom margin line fell a few pixels beside a row of dots and looked imprecise. Dots within a quarter U of the margin line are left out.

## [0.1.3] — 2026-10-22

- **Precise grid** (Keyvisual): the stage width is a multiple of Raster in device pixels, so one U is whole pixels — dots, margin line and handles sit exactly on pixels, evenly spaced (measured: 45 px apart everywhere, two colours only). Grid and handles in opaque colours: with transparency, dots and margin line darkened where they overlapped. No dot on the margin line (a dot on the line read as a knot). Line widths of the handles in whole device pixels. Keyvisual animiert: the stage on whole device pixels as well.
- **Text an/aus** (Keyvisual, Keyvisual animiert): a switch next to the heading "Text", to try the band without text. Switched off, the text stays in the field; typing switches it on again.
- **Tabs and links look different**: inspector tabs as a tab bar (a track along the row, a 2 px bar under the current tab at the row's edge); links (jump headings, ways out, presets) a thin underline 2 px under the word, broken at descenders. Before, both were underlines under the text.
- **Inspector tabs follow the scroll**: the tab of the section in view is marked, from the moment the inspector opens (before, none was marked until a tab was clicked).
- **Keyvisual: text field warning** — a warning symbol (Carbon `warning--alt`, added to `core/icons/carbon.json`) next to the heading "Text" while words find no straight; the wave under such words drawn (1.5 px line, 3 px high, 8 px period) instead of a wavy text decoration, which the browser flattened as it got thicker. The notice on the stage stays hidden while the sheet of variants is open (it covered its buttons).

## [0.1.2] — 2026-10-22

- **Sharp stage** (Keyvisual, Keyvisual animiert): the canvas had a 1 px border inside its box and a fractional size, so the browser scaled the bitmap — band, type and the dot grid rendered soft and the grid looked off. Now whole CSS pixels, the frame drawn as a ring outside (box shadow); bitmap to screen exactly 2 : 1 on a Retina display.
- **Inspector symbol always in the dock head**: hidden behind a setting it could not be reached. Open or closed is remembered; the switch in the settings is gone.
- **Keyvisual: text notice on the stage**: "… finden keine Gerade" with its ways out no longer sits under the text field, where it pushed the dock down while the band width was dragged. Words are still underlined in the field; the notice appears at the bottom of the stage, the dock does not move (measured: dock height and the Farbe heading stay put).
- **Heading → control 10 px** (was 6), room for the underline of a jump heading.

## [0.1.1] — 2026-10-22

- **Keyvisual animiert 0.1.0** (`tools/keyvisual-animiert/`), from THA Designtools 0.29.7: same engine and motions (Ticker, Laufschrift, Zeichnen, Wandern, Wachsen), new skeleton — dock Format → Text → Farbe → Bewegung (motion, tempo, length as a stepper) → Speichern (MP4 1/2/4 loops, PNG sequence, PNG of the current frame); inspector with the settings of each motion, type (Satz, hyphenation), split, video; text field grows and shows capitals; Carbon symbols; the orientation button is hidden where it has no effect. Measured against the old dock (1440 × 900): controls 31 → 23 (all in view; were 25 of 31), content height 790 → 659 px, lines 19 → 0, targets under 24 px 5 → 0, proximity 0.86 → 0.47 (inspector), lowest contrast 10.7 → 14.9 : 1. Known: opening the inspector resizes the stage, which makes a generated band anew (as any window resize does).
- **Core: skeleton functions** (rule of two — Keyvisual and Keyvisual animiert need them): `initSettings` (the settings dialog, markup written by the core), `initInspector`, `initValues`, `initSteppers`, `selectsAsSegments`, `initSaveFoot`, `uiSize` / `applyUiSize` / `applyThemePref`. Keyvisual now uses them instead of its own copies. `core/hyphen.js` (hyphenation DE/EN, brand-neutral) taken over. Inspector tabs 28 px high (were 23.5 px).
- **Keyvisual 0.1.1**: on the core skeleton functions; probes left: angle zones, smart text field, sheet of variants.

## [0.1.0] — 2026-10-22

New project, set up as successor of THA Designtools 0.29.7 (which keeps running until replaced).

- **Core** (`core/ui.css`, `core/ui.js`): one UI for all tools and brands — Inter (self-hosted, variable), monochrome and flat, no grey text, spacing after the law of proximity, IBM Carbon symbols at 18 px. Taken over from the dock of THA Designtools and the lab (`THA Designtools/prototypes/dock-labor`, `ia-keyvisual`). Fixes on the way: buttons in a panel head take their own clicks (the head's drag captured them); symbol buttons without padding (the browser default squeezed symbols to 16 px); slider and switch with hit areas of 24 px (were 14 and 22 px); preferences under their own key (`designtools-prefs`).
- **Brand THA** (`brands/tha/`): band engine, THA Everett glyphs, type rules, favicon — copied unchanged from THA Designtools 0.29.7.
- **Keyvisual 0.1.0** (`tools/keyvisual/`): the IA skeleton from the lab — dock Format → Text → Farbe → Bandbreite → Bewegung → Speichern; settings dialog; inspector (Advanced) at the right edge behind the dock, click on a corner or the band jumps to its settings; sheet of variants with seeds; stepper for counted values; one angle-zone control for the corner rule; smart text field (grows, capitals, words without a straight marked in the text, ways out below); choices of up to five as segments. Probes marked `data-probe`.
- **Pattern library** (`patterns/`), **dashboard** (`dashboard/`, reads `tools/index.json` and each `tool.json`), **launcher** `Starten.command`.
- Measured against THA Designtools 0.29.7, Keyvisual dock, 1440 × 900 (`Grundlagen/messen/ui-kpi.js`): controls 27 → 20 (all in view, none scrolled away), content height 790 → 582 px, lines and frames 22 → 0, targets under 24 px 5 → 0, lowest text contrast 8.8 → 14.9 : 1, one icon grid in both (Bootstrap 16 → Carbon 32).
