<feed xmlns='http://www.w3.org/2005/Atom'>
<title>opencut/apps/web/src/timeline/controllers, branch main</title>
<subtitle></subtitle>
<id>http://git.cashmere.rs/opencut/atom/apps/web/src/timeline/controllers?h=main</id>
<link rel='self' href='http://git.cashmere.rs/opencut/atom/apps/web/src/timeline/controllers?h=main'/>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/'/>
<updated>2026-08-16T04:16:56Z</updated>
<entry>
<title>feat: add transitions, track mixing, and voiceover controls</title>
<updated>2026-08-16T04:16:56Z</updated>
<author>
<name>cashmere</name>
<email>cashmere@autistici.org</email>
</author>
<published>2026-08-16T04:16:56Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=f1043734438c8518a302f698d9ae6583a75f0c14'/>
<id>urn:sha1:f1043734438c8518a302f698d9ae6583a75f0c14</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: lens effects tab, standalone motion effects, clip/asset rename, preview popout</title>
<updated>2026-08-09T00:37:37Z</updated>
<author>
<name>cashmere</name>
<email>cashmere@autistici.org</email>
</author>
<published>2026-08-09T00:37:37Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=c555f1eaebff90749bdc543592cfa80a060b29e2'/>
<id>urn:sha1:c555f1eaebff90749bdc543592cfa80a060b29e2</id>
<content type='text'>
- New Lens category in the assets panel: Blur, Motion Blur, Zoom In/Out,
  Pan x4, Shake, Pulse, Spin, Custom Zoom. EffectDefinition gains a
  category field; tabs with an empty category are hidden, and the
  properties-panel 'Open effects' button opens the first non-empty one.
- Motion effects work standalone: dropping them on the timeline creates
  an effect-track element that animates (scale/translate/rotate) every
  track below it, computed purely in the TS frame descriptor - no wasm
  changes, identical in preview and export. supportsStandalone removed.
- Motion Blur: directional gaussian smear (amount + angle) reusing the
  existing WGSL shader with arbitrary u_direction.
- Custom Zoom: start/end scale params (keyframable clip-level).
- MotionOffset gains optional rotate, accumulated clip-level and applied
  to standalone layer quads via rotationDegrees.
- Rename clips (timeline context menu) and media assets (media panel
  context menu) via a shared RenameDialog; asset rename persists through
  storageService with rollback on error.
- Preview pops out into a Document Picture-in-Picture window and docks
  back; button hidden where the API is unsupported.
- Export keeps running when the export popover is closed; only the
  explicit Cancel button aborts.
- Captions and Adjustment tabs removed from the assets panel.
</content>
</entry>
<entry>
<title>feat: pan &amp; zoom motion presets</title>
<updated>2026-08-08T08:40:12Z</updated>
<author>
<name>cashmere</name>
<email>cashmere@autistici.org</email>
</author>
<published>2026-08-02T17:59:32Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=237248321a1a40b9b98e7e0a6df156d0aa247ef0'/>
<id>urn:sha1:237248321a1a40b9b98e7e0a6df156d0aa247ef0</id>
<content type='text'>
Ken Burns-style motion effects (zoom in/out, pan left/right/up/down) that
drag onto clips like regular effects. Instead of shader passes they
evaluate a per-frame transform offset in resolveVisualState, so they
stack with keyframed transforms and work in preview and export.

- intensity param (0-100%, keyframable) scales the whole effect
- easing select maps progress through the graph editor's bezier presets
- supportsStandalone: false hides them from effect-track creation
- empty shader pass groups are filtered out so pass-less effects and
  zero-intensity blur no longer crash the compositor
</content>
</entry>
<entry>
<title>feat: ripple-extend resize, timeline filmstrip, export hardening</title>
<updated>2026-07-28T17:41:14Z</updated>
<author>
<name>cashmere</name>
<email>cashmere@autistici.org</email>
</author>
<published>2026-07-28T17:41:14Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=e837e7504379e100ff3b56282577ec67bb88bec9'/>
<id>urn:sha1:e837e7504379e100ff3b56282577ec67bb88bec9</id>
<content type='text'>
Yesterday's verified web session (gates green: 316 tests, tsc, build):
- ripple-extend pushes right-hand chain on static-element resize
- per-position video filmstrip thumbnails with zoom-adaptive density
- fps-aware export bitrate, 2s keyframes, even-dim export canvas
- freeze frame uses fixed 3s duration, prompt removed
</content>
</entry>
<entry>
<title>refactor: unify element params</title>
<updated>2026-05-02T01:27:23Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-28T23:28:50Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=2ee0a44735d2b930348e9774909638b2c1909738'/>
<id>urn:sha1:2ee0a44735d2b930348e9774909638b2c1909738</id>
<content type='text'>
</content>
</entry>
<entry>
<title>chore: switch from biome to eslint + prettier; fix ton of lint issues</title>
<updated>2026-05-02T01:27:23Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-28T22:37:56Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=a9b9cf6bf50f08723896659634f2e6afc17bcd42'/>
<id>urn:sha1:a9b9cf6bf50f08723896659634f2e6afc17bcd42</id>
<content type='text'>
</content>
</entry>
<entry>
<title>refactor: split animation helpers by domain</title>
<updated>2026-04-26T18:44:07Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-26T18:44:07Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=6b1f38a9a31a0eedaa7abea70f232960469351d5'/>
<id>urn:sha1:6b1f38a9a31a0eedaa7abea70f232960469351d5</id>
<content type='text'>
</content>
</entry>
<entry>
<title>refactor: thinner hooks</title>
<updated>2026-04-26T15:31:28Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-26T15:31:28Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=56ca09692a308b22455420d11376ff8d41244c47'/>
<id>urn:sha1:56ca09692a308b22455420d11376ff8d41244c47</id>
<content type='text'>
</content>
</entry>
<entry>
<title>refactor: split animation helpers by domain</title>
<updated>2026-04-26T02:04:30Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-26T02:04:30Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=0b7597b31fa956c7f3d4838923b545ba5e341422'/>
<id>urn:sha1:0b7597b31fa956c7f3d4838923b545ba5e341422</id>
<content type='text'>
</content>
</entry>
<entry>
<title>refactor: centralize editor interaction state</title>
<updated>2026-04-25T01:56:22Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-25T01:56:22Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=6a22a3ecbdff2d0e6a4c24c8db40bb86bc01b692'/>
<id>urn:sha1:6a22a3ecbdff2d0e6a4c24c8db40bb86bc01b692</id>
<content type='text'>
Move timeline and preview gestures into dedicated controllers so hooks stay thin around editor state and DOM events.

This also routes drag and playback synchronization through manager APIs and reuses persistent wasm surfaces so scrubbing, seeking, and preview rendering stay in sync.

Made-with: Cursor
</content>
</entry>
</feed>
