Covers the end-to-end flows per slice: markers (m shortcut + scrub- ruler interactions), script tracks/frames (open dialog, action types, forward-only firing rules), button clip creation and drag-to-track, ButtonInstance dialog (label, onClick, disabled, transitions), canvas runtime (pointer state machine, drag-out cancel behavior, scripted state flips), transitions (matched layer blend vs crossfade, easing), the DSL language reference with examples, a quick sanity pass for the HTML export runtime, and which in-app test suites to look for. Also documents the two known limitations (no in-app button state authoring, scripts not baked into the server PNG/MP4 render) and a small devtools cheat sheet for poking the pinia store directly. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.7 KiB
Macro Clips & Scripts — Testing Guide
Eine Walkthrough für die Features aus docs/macro-clips-and-scripts.md.
Start: App mit npm run dev, leeres Projekt öffnen („New Project" im
Welcome-Dialog).
1. Marker
Ziel: Sprungziele auf der Haupt-Timeline setzen und benennen.
- Playhead an eine beliebige Stelle ziehen (z. B. t = 2 s).
mdrücken → ein Marker wird an der Playhead-Position angelegt und ein Rename-Prompt öffnet sich. Namen eingeben (z. B.intro),Enter.- Marker erscheint als kleine Fahne oben auf der Scrub-Ruler.
- Interaktionen am Marker:
- Einfacher Klick → Playhead springt dort hin.
- Drag → Marker zeitlich verschieben.
- Doppelklick → Rename.
- Marker anwählen,
Backspace/Delete→ löscht ihn.Esc→ entauswählt.
Erwartung:
- Mehrere Marker bleiben zeitlich sortiert.
- Zweiter Marker mit gleichem Namen bekommt automatisch Suffix (
intro 2). - Namen müssen Scene-weit unique sein (Rename zeigt Fehler-Dialog bei Kollision und öffnet den Prompt erneut).
2. Script-Tracks & Action-Frames
Ziel: Zeit-gebundene Aktionen definieren, die bei Playback feuern.
- Im Timeline-Header die Code-Taste (
</>-Icon) klicken → ein neuer Script-Track wird angelegt (kleinere Zeile als Clip-Tracks). - Auf der leeren Script-Lane an beliebiger Zeitposition klicken → ein neuer Action-Frame wird erstellt und der ScriptFrameDialog öffnet sich.
- Im Dialog Add action drücken → ein Dropdown zeigt alle Action-Typen.
- Beispiel:
Pauseauswählen → nur Typ, keine Params nötig. - Weitere Action hinzufügen:
Jump to marker→ Marker-Name aus dem Dropdown wählen (dafür muss aus Schritt 1 ein Marker existieren).
- Beispiel:
- Dialog schließen mit Done.
- Mehrere Actions pro Frame sind erlaubt — die Zahl rechts neben dem Frame-Dot zeigt deren Anzahl.
Testen:
- Playhead VOR den Action-Frame ziehen, dann
Space(Play). - Playback läuft, und genau wenn der Playhead über den Frame hinausgeht, feuern die Actions in Listen-Reihenfolge.
- Beispiel
pause + jumpToMarker intro→ Playback pausiert und Playhead springt zumintro-Marker.
Erwartung:
- Beim Scrubben (Ziehen des Playheads oder Marker-Klick) feuern keine Actions.
- Beim Loop-Wrap (von
playbackOutzurück nachplaybackIn) feuern ebenfalls keine Actions. - Rückwärtsbewegen der Zeit feuert nichts.
3. Button-Clips erzeugen und platzieren
Ziel: Einen klickbaren Button definieren, auf die Stage bringen und onClick-Actions hinterlegen.
- In der Asset-Sidebar den Abschnitt Buttons →
+klicken. Namen eingeben (z. B.PlayButton),Enter. - Der Button erscheint in der Liste mit einem Cursor-Icon. Die 4 States sind automatisch als bunte Rects vorausgefüllt (blau / hellblau / dunkelblau / grau).
- Button-Clip aus der Sidebar auf eine Clip-Track ziehen (Drag-and-Drop).
- Wenn keine Clip-Track existiert, in den Timeline-Bereich unter den Tracks droppen → neue Clip-Track entsteht automatisch.
- Auf der Clip-Track erscheint ein 4-Zellen-Block (
N H P D) an der Drop-Position. - Auf dem Canvas erscheint der Button (standardmäßig in der Stage-Mitte) — wenn der Playhead ≥ Instanz-Startzeit.
Button editieren:
- Auf den 4-Zellen-Block klicken → ButtonInstanceDialog öffnet sich.
- Label vergeben (z. B.
play) — wichtig, weil:- Im DSL über
btn:playreferenzierbar. - Im Dropdown von
Set button state-Actions sichtbar.
- Im DSL über
- On click → Actions definieren (z. B.
PlayundJump to marker intro). - Start disabled aktivieren → Button startet grau/schraffiert, reagiert nicht auf Klicks.
- Done.
4. Button-Runtime auf der Stage testen
Voraussetzung: Ein Button ist platziert und der Playhead ist auf oder nach dessen Startzeit.
- Maus über den Button bewegen → Farbe wechselt zu hellblau (
hover). - Maus-Down → Farbe wird dunkelblau (
pressed). - Maus-Up (immer noch im Button) →
onClick-Actions feuern; State geht zurück zuhover. - Maus-Down und rausziehen vor dem Maus-Up → kein
onClick, State kehrt zunormalzurück (Standard-Browser-Button-Verhalten). - Disabled-Button hat keine Hover-/Press-Reaktion, ignoriert Klicks.
Skript-getriggert:
- In einem ScriptFrame eine
Set button state-Action mit Target = Button-Label und state =pressedanlegen. - Beim Playback überqueren → der Button schaltet visuell in
pressed, ohne dass der User hovert. Set button disabled/Enabletoggelt den Disabled-Flag zur Laufzeit.
5. Transitions zwischen States
Ziel: Glatter visueller Übergang zwischen States statt hartem Wechsel.
- ButtonInstance-Dialog öffnen (4-Zellen-Block klicken).
- Unter Transitions →
+ Add transition. - Zeile:
normal → hover, Duration0.15, EasingeaseOut. - Weitere Zeile:
hover → normal, Duration0.2, EasingeaseOut. - Done.
- Auf dem Canvas Maus über den Button → die Farbe fadet zwischen Blau und Hellblau über 150 ms, statt instant zu wechseln.
Hinweise:
- Transitions sind Clip-scoped, d. h. sie gelten für alle Instanzen des Buttons.
- Layer werden zwischen den beiden States per
namegematcht (beim Default-Seed heißen alle Face-Layer schlichtFace→ werden immer interpoliert). Unmatched Layer faden nur rein/raus (Crossfade). - Ohne Transition: State-Wechsel ist sofort (Verhalten wie vor Slice 7).
6. Script-DSL testen
Ziel: Komplexere Logik in einer kompakten Textform statt manuellem Zusammenklicken mehrerer Actions.
- ScriptFrameDialog öffnen (oder ButtonInstanceDialog).
- Add action → Typ
Run scriptwählen. - Im Textarea:
// setzt Pause und springt an den intro-Marker pause jump @intro state btn:play pressed disable btn:play - Done.
Testen:
- Frame überqueren → alle parsed Aktionen feuern in Reihenfolge.
- Falsche Syntax → Warnung erscheint in der Devtools-Konsole
(
[animatr] Script line N: ...). Die fehlerhafte Zeile wird übersprungen; valide Zeilen feuern trotzdem.
DSL-Referenz (aktueller Sprachumfang):
// Kommentar (bis Zeilenende)
play // Playback starten
pause // Playback pausieren
rewind // Playhead → playbackIn (in-point)
jump 2.5 // Zeit in Sekunden
jump #135 // Frame-Nummer (durch fps geteilt)
jump @markerName // benannter Marker
state btn:label <state> // <state> ∈ normal|hover|pressed|disabled
enable btn:label
disable btn:label
7. Export-Runtime prüfen
Ziel: Sicherstellen dass Buttons, Scripts, Marker im exportierten Projekt genauso funktionieren wie im Editor.
- Menü → Export (oder beliebiger Export-Trigger je nach UI).
AnimatrPlayer-HTML-Export wählen → Datei öffnen im Browser.- Erwartet:
- Buttons rendern an ihren Positionen, mit Pointer-Reaktion.
- onClick feuert die hinterlegten Aktionen (z. B.
jump @introspringt im exportierten Player-Playhead zum Marker). - Transitions animieren sauber.
- Script-Frames feuern bei natürlichem Playback.
- Devtools-Konsole im Export-Tab →
window.AnimatrPlayer.__vsollte'6'ergeben. Cache-Probleme? Hard-Reload mit Shift+Cmd+R / Ctrl+F5.
8. Runtime-Tests (in-app)
Ctrl+Shift+Alt+T öffnet den Test-Runner. Relevante Suiten:
scene store — markers/script tracks & frames/button clips & instancesactions — evalAction with mock runtimeactions — script type expands via evalActionscriptDsl — parserbutton runtime — state machine + action wiringscene store — tick fires script frames forward-only
Alle sollten grün laufen.
Bekannte Einschränkungen
- Kein Button-State-Editor in der UI: Die 4 States sind beim Seed mit
farbigen Rects vorausgefüllt. Um die Optik anzupassen müsste man
aktuell
scene.buttonClips[i].states[…]direkt im gespeicherten Projekt-JSON editieren. Ein eigener Edit-Modus ist geplant, aber nicht implementiert. - Server-Render (PNG-Sequence / MP4) bakt Script-Actions und
Button-Interaktionen bewusst nicht ein — das wäre keine deterministische
Animation mehr. Scripts wirken nur in der interaktiven
Browser-Laufzeit (Editor +
AnimatrPlayer-HTML-Export).
Devtools-Cheat-Sheet
Für Tests ohne UI:
// Pinia store im Devtools:
const s = __pinia.state.value.scene
const store = useSceneStore() // im Vue-Devtools verfügbar
// Button-Instanz direkt einen bestimmten State geben:
const rt = useButtonRuntime()
rt.setState(instanceId, 'pressed')
rt.reset()
// Alle Marker sehen:
console.table(store.scene.markers)
// Alle Button-Instanzen:
console.table(store.scene.buttonInstances)