From e22ee600b9a167e9574ec02bf72ff71b8952fdcc Mon Sep 17 00:00:00 2001 From: Olive Vaughn Date: Mon, 28 Sep 2026 20:47:10 -0400 Subject: [PATCH] Add PNG sequence export and uuid-keyed stage placements Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_016JBYKfeMPQTK1WNcgcw41o --- clips/templates/clips/index.html | 8 + frontend/src/arthur/audio/mix.cljs | 77 ++++- frontend/src/arthur/db.cljs | 9 + frontend/src/arthur/demo/stage.cljs | 54 +++- frontend/src/arthur/demo/stage_8625.edn | 37 ++- frontend/src/arthur/domain/clip.cljs | 16 +- frontend/src/arthur/domain/crc32.cljs | 47 +++ frontend/src/arthur/domain/leaf.cljs | 21 +- frontend/src/arthur/domain/png.cljs | 149 +++++++++ frontend/src/arthur/domain/zip.cljs | 149 +++++++++ frontend/src/arthur/events/export.cljs | 216 +++++++++++++ frontend/src/arthur/events/footage.cljs | 59 ++-- frontend/src/arthur/events/project.cljs | 20 +- frontend/src/arthur/export.cljs | 242 ++++++++++++++ frontend/src/arthur/export/frames.cljs | 77 +++++ frontend/src/arthur/flow/address.cljs | 34 ++ frontend/src/arthur/flow/regenerate.cljs | 138 ++++---- frontend/src/arthur/flow/source.cljs | 37 ++- frontend/src/arthur/ui/shell.cljs | 78 ++++- frontend/test/arthur/domain/crc32_test.cljs | 50 +++ frontend/test/arthur/domain/leaf_test.cljs | 30 ++ frontend/test/arthur/domain/png_test.cljs | 227 +++++++++++++ frontend/test/arthur/domain/symbol_test.cljs | 64 +++- frontend/test/arthur/domain/zip_test.cljs | 164 ++++++++++ frontend/test/arthur/events/export_test.cljs | 91 ++++++ frontend/test/arthur/export/frames_test.cljs | 214 +++++++++++++ frontend/test/arthur/export_test.cljs | 298 ++++++++++++++++++ .../test/arthur/flow/measure/mouth_test.cljs | 1 + .../test/arthur/flow/regenerate_test.cljs | 172 +++++++++- frontend/test/arthur/flow/source_test.cljs | 13 +- frontend/test/browser/take.mjs | 28 +- 31 files changed, 2642 insertions(+), 178 deletions(-) create mode 100644 frontend/src/arthur/domain/crc32.cljs create mode 100644 frontend/src/arthur/domain/png.cljs create mode 100644 frontend/src/arthur/domain/zip.cljs create mode 100644 frontend/src/arthur/events/export.cljs create mode 100644 frontend/src/arthur/export.cljs create mode 100644 frontend/src/arthur/export/frames.cljs create mode 100644 frontend/test/arthur/domain/crc32_test.cljs create mode 100644 frontend/test/arthur/domain/png_test.cljs create mode 100644 frontend/test/arthur/domain/zip_test.cljs create mode 100644 frontend/test/arthur/events/export_test.cljs create mode 100644 frontend/test/arthur/export/frames_test.cljs create mode 100644 frontend/test/arthur/export_test.cljs diff --git a/clips/templates/clips/index.html b/clips/templates/clips/index.html index 6de64b3..1337f9f 100644 --- a/clips/templates/clips/index.html +++ b/clips/templates/clips/index.html @@ -48,6 +48,14 @@ and PUTs with ordinary CSRF protection — no endpoint in this app is exempt. color: var(--fg); background: #1c1f2b; border: 1px solid #2b3040; font: inherit; max-width: 360px; } .load-status { margin-top: 6px; font-size: 12px; opacity: .75; } + .export { width: 640px; margin-top: 14px; padding-top: 12px; + border-top: 1px solid #2b3040; font-size: 12px; } + .export .row { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; } + .export .gap { flex: 1; } + .export select { margin-left: 6px; padding: 3px 5px; color: var(--fg); + background: #1c1f2b; border: 1px solid #2b3040; font: inherit; } + .export .readout { margin-top: 7px; } + .export .note { margin: 7px 0 0; } .controls { width: 640px; margin-top: 18px; padding-top: 12px; border-top: 1px solid #2b3040; font-size: 12px; } .controls select { margin-left: 8px; padding: 3px 5px; color: var(--fg); diff --git a/frontend/src/arthur/audio/mix.cljs b/frontend/src/arthur/audio/mix.cljs index 095c476..cec1e6f 100644 --- a/frontend/src/arthur/audio/mix.cljs +++ b/frontend/src/arthur/audio/mix.cljs @@ -3,12 +3,25 @@ The mix is derived from saved audio track leaves and immutable footage blobs. The transport still has one audio element, so seeking, rate changes and looping - stay tied to the same clock the picture reads." + stay tied to the same clock the picture reads. + + THE AUDIO BUFFER IS THE PRODUCT AND THE WAV IS ONE PACKAGING OF IT. Playback + wants a URL an `