<feed xmlns='http://www.w3.org/2005/Atom'>
<title>opencut/apps/web/src/masks, branch main</title>
<subtitle></subtitle>
<id>http://git.cashmere.rs/opencut/atom/apps/web/src/masks?h=main</id>
<link rel='self' href='http://git.cashmere.rs/opencut/atom/apps/web/src/masks?h=main'/>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/'/>
<updated>2026-07-26T22:26:31Z</updated>
<entry>
<title>test: repair broken tests for a green baseline</title>
<updated>2026-07-26T22:26:31Z</updated>
<author>
<name>cashmere</name>
<email>cashmere@autistici.org</email>
</author>
<published>2026-07-26T22:26:31Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=4b799869b1298581b539f2a00435627dedb364f8'/>
<id>urn:sha1:4b799869b1298581b539f2a00435627dedb364f8</id>
<content type='text'>
Mask insertion test expected zero handles; the de Casteljau split
correctly produces colinear shape-preserving ones. Box scale snap now
reports both symmetric snap lines. Fractional ticks and unbranded
MediaTime expectations fixed. Text-measurement test skipped (no canvas
2d in bun). CI-hostile it.only reference removed. Suite: 221 pass, 1
skip, 0 fail.
</content>
</entry>
<entry>
<title>refactor: collapse mask definition registry to a single keyed registry</title>
<updated>2026-05-02T01:27:23Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-05-01T23:33:32Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=8b8d65b5091f4158af68fbad85cc74936302b07b'/>
<id>urn:sha1:8b8d65b5091f4158af68fbad85cc74936302b07b</id>
<content type='text'>
The freeform mask was assembled on every getMaskDefinition("freeform") call,
re-spreading params and injecting a wrong SquareIcon placeholder, with a type
cast to suppress the structural mismatch. Root cause: MasksRegistry was keyed
on BuiltinMaskType, so freeform had no entry.

- Re-key MasksRegistry from BuiltinMaskType to MaskType
- Register freeform alongside builtins in registerDefaultMasks, with
  PenToolAddIcon as its menu icon
- getMaskDefinition and getMaskDefinitionsForMenu become plain registry
  lookups with no branching, no manual spreading, no cast
- Rename RegisteredBuiltinMaskDefinition to RegisteredMaskDefinition and
  tighten computeParamUpdate return type to Partial&lt;BaseMaskParams&gt;

Co-authored-by: Cursor &lt;cursoragent@cursor.com&gt;
</content>
</entry>
<entry>
<title>refactor: remove dead tangent handle variant</title>
<updated>2026-05-02T01:27:23Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-05-01T23:33:20Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=23187b0b6a9f179bdb68578fc4bdaa8414b8316d'/>
<id>urn:sha1:23187b0b6a9f179bdb68578fc4bdaa8414b8316d</id>
<content type='text'>
The { kind: "tangent" } MaskHandleId variant was never constructed — neither
getFreeformDisplayHandles nor any other code ever produced a tangent handle
object. The in/out control-arm branches in computeFreeformParamUpdate, the
tangent case in maskHandleIdKey, and the CUSTOM_MASK_TANGENT_SIZE rendering
path in mask-handles.tsx were all unreachable. Removed all four dead paths
and removed "tangent" from MaskHandleKind.

Co-authored-by: Cursor &lt;cursoragent@cursor.com&gt;
</content>
</entry>
<entry>
<title>fix: address review findings in masks substrate</title>
<updated>2026-05-02T01:27:23Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-05-01T23:28:19Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=f66cdbfeb2e8b68e70e1f8595c38cacf58210ddf'/>
<id>urn:sha1:f66cdbfeb2e8b68e70e1f8595c38cacf58210ddf</id>
<content type='text'>
- Remove dead ternary in getPreferredEdges (always returned undefined; the
  all-false object was never reached by Object.values().some(Boolean))
- Document why drawWithFeather descriptors zero the feather field in the
  compositor (analytical renderer handles softness itself; zeroing prevents
  a second JFA feather pass)
- Remove legacyType from V30→V31 migration (not consumed anywhere; a
  down-migration can map type:"freeform" back to "custom" directly)
- Add V30→V31 test coverage: skip-guard branches, freeform passthrough,
  elements without a masks array
- Add snap tests for vertical-edge (bottom) and uniform-scale handle paths

Co-authored-by: Cursor &lt;cursoragent@cursor.com&gt;
</content>
</entry>
<entry>
<title>refactor: split builtin and freeform masks</title>
<updated>2026-05-02T01:27:23Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-29T16:41:15Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=79dcec8a2ec2f5cad9be95e5b52fbfa752fb6ac4'/>
<id>urn:sha1:79dcec8a2ec2f5cad9be95e5b52fbfa752fb6ac4</id>
<content type='text'>
Made-with: Cursor
</content>
</entry>
<entry>
<title>refactor: type mask handle identifiers</title>
<updated>2026-05-02T01:27:23Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-29T16:31:24Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=97f8d1968f186028e41f83b04c0897130e6c69f4'/>
<id>urn:sha1:97f8d1968f186028e41f83b04c0897130e6c69f4</id>
<content type='text'>
Made-with: Cursor
</content>
</entry>
<entry>
<title>refactor: make mask renderer dispatch explicit</title>
<updated>2026-05-02T01:27:23Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-29T16:27:21Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=ae1292a14bf5c29544a5f7a49e65b994410f87de'/>
<id>urn:sha1:ae1292a14bf5c29544a5f7a49e65b994410f87de</id>
<content type='text'>
Made-with: Cursor
</content>
</entry>
<entry>
<title>refactor: split mask snap dispatch</title>
<updated>2026-05-02T01:27:23Z</updated>
<author>
<name>Maze Winther</name>
<email>mazewinther@gmail.com</email>
</author>
<published>2026-04-29T16:23:08Z</published>
<link rel='alternate' type='text/html' href='http://git.cashmere.rs/opencut/commit/?id=6ea5a156b6b7f609354a4563cfb2d00ec7f41811'/>
<id>urn:sha1:6ea5a156b6b7f609354a4563cfb2d00ec7f41811</id>
<content type='text'>
Made-with: Cursor
</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>
</feed>
