summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* docs: record completed roadmap slicescashmere2026-07-272-40/+32
| | | | | | AGENTS.md gains the versions/voiceover/transfer domains and the features flag module; roadmap marks slices 1-6 done and notes deletion of flagged-off code as the next strip step.
* feat: wire versioning/transfer/voice-over actions and header UIcashmere2026-07-273-18/+149
| | | | | | | | | Shared wiring for the six roadmap slices in one commit: action ids and handlers for create-checkpoint, toggle-versions-panel, export-project-archive, and voice-over; the freeze-frame handler awaits the duration prompt before capture; editor header gains the versions popover and export menu item (and loses the feedback popover and Discord item, part of the branding strip).
* feat: voice-over recording into the timelinecashmere2026-07-276-0/+592
| | | | | | | | | MediaRecorder mic capture (defensive mimeType picking, permission/no-mic toasts) with elapsed display in the timeline toolbar. Stop produces an audio asset and inserts it at the playhead on an audio track as ONE BatchCommand undo step, freeze-frame precedent. voice-over action registered, no default keybinding. 20 tests; smoke-tested in Chromium with a fake mic end to end.
* feat: single-file project import/export (.ocp)cashmere2026-07-2713-5/+1596
| | | | | | | | | | | fflate zip container: project.json (serialized project incl. schema version) + media files with a manifest. Export gathers all project media (missing blobs warn, never abort) after save-flush; import validates everything before any write, migrates older archives through the storage migration registry, remaps media ids, and creates a new project with rollback on failure. Entry points: projects page import/export, editor header menu, export-project-archive action. 29 tests incl. full round-trip.
* feat: git-like project versioning (v1)cashmere2026-07-2720-83/+1709
| | | | | | | | | | | Linear per-project history per notes/project-versioning.md: named checkpoints (thumbnail via renderer.captureFrame) plus auto-checkpoints on save (60s throttle, ring of 20, named never rotate). Restore writes a safety checkpoint first, then swaps the document outside undo/redo. Media assets referenced by any version are pinned against deletion. Migration v31-v32 stamps the schema; the version store lives in its own IDB database with an in-memory fallback for tests. Versions popover in the editor header for jump/rename/delete. 12 new tests.
* refactor: strip landing page and upstream brandingcashmere2026-07-2713-603/+33
| | | | | | / redirects to /projects; marketing landing components, the feedback popover + API route, and all Discord links removed (editor header, footer, onboarding copy).
* feat: freeze-duration promptcashmere2026-07-274-0/+281
| | | | | | | Freeze frame now asks for the duration (decimal seconds, 0 < d <= 600) before capture, via a promise-based zustand store mounted as an editor-global dialog. Last-used duration persists and prefills. Cancel aborts before capture with no commands.
* feat: gate sounds/stickers/effects UI behind feature flagscashmere2026-07-275-9/+31
| | | | | | | FEATURES in src/features.ts (all false) hides the assets-panel tabs and views, the clip effects properties tab, and the timeline effects badge. Existing project data still renders and stays editable (standalone effect tab, sticker config, renderer nodes untouched).
* docs: project versioning design notecashmere2026-07-271-0/+103
| | | | | | Linear history with named checkpoints plus rotating auto-checkpoints, content-addressed media dedup, jump-only v1. Owner decisions recorded; branches and diff view explicitly out of scope.
* docs: record green baseline and quality gatescashmere2026-07-272-12/+20
|
* ci: run tests and typecheck for realcashmere2026-07-272-6/+14
| | | | | | | | The test step was a no-op stub. CI now installs at the repo root (where bun.lock and bunfig.toml live), builds via the root script, typechecks, and runs bun test. Adds 'just verify' as the same local gate (tests + typecheck + build). Full lint stays out of the gate until the planned feature stripping lands.
* test: repair broken tests for a green baselinecashmere2026-07-274-9/+18
| | | | | | | | | 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.
* fix: update stale adapter and registry call sitescashmere2026-07-273-22/+22
| | | | | | IndexedDBAdapter and DefinitionRegistry.register switched to object params; these call sites still used positional args and were silent no-ops at runtime (sticker providers never actually registered).
* fix: restore missing keybinding validation guardscashmere2026-07-273-0/+50
| | | | | | | | persistence.ts imported isActionWithOptionalArgs and isShortcutKey, neither of which existed at runtime — loading persisted custom keybindings would crash. Adds actions/guards.ts (excluding required-args actions per TActionArgsMap) and isShortcutKey in keybinding.ts; the nine previously dead persistence tests now pass.
* docs: add roadmap and session notescashmere2026-07-261-0/+119
| | | | | | | Captures the freeze-duration-prompt task, GPU/CPU rendering state, prioritized roadmap (strip landing/branding, disable unfinished domains, self-contained project files, voice-over, versioning, desktop binary), and known pre-existing breakage.
* chore: add justfile with common commandscashmere2026-07-263-1/+71
| | | | | | Recipes wrap the documented bun/turbo/cargo/docker commands; 'just test <path>' passes through to bun test, 'just dev' ensures .env.local exists. just is added to the nix devshell so it is available after nix develop.
* docs: mark MediaPreview guard done in AGENTS.mdcashmere2026-07-261-4/+3
|
* fix: guard MediaPreview against image assets without urlcashmere2026-07-261-1/+12
| | | | | | | The image branch rendered <Image src={item.url ?? ""}>, crashing the assets panel for any image asset lacking url. It now falls back to thumbnailUrl and then to the existing MediaTypePlaceholder, mirroring the video branch's fallback.
* docs: update AGENTS.md freeze-frame and testing notescashmere2026-07-261-6/+7
|
* feat: single undo step for freeze framecashmere2026-07-264-21/+261
| | | | | | | | | The handler fired four separate commands (asset add, split, move, insert), producing four undo steps. It now builds one BatchCommand and executes it once. The new ShiftSplitRemainderCommand resolves the split's right-side elements lazily at execute() so it can be composed after the split in the batch, and rebuilds the inner move on redo since a re-executed split generates fresh element ids.
* test: preload opencut-wasm mock for bun testcashmere2026-07-262-0/+168
| | | | | | | | The published opencut-wasm package is wasm-pack bundler-target glue whose .wasm ESM import bun's test runner does not instantiate, so any test importing @/wasm failed at module evaluation. Register a faithful pure-TS stand-in (mirrors rust/crates/time semantics) via a bunfig [test] preload before any test module evaluates.
* feat: freeze frame at playheadcashmere2026-07-268-21/+334
| | | | | | | | | | | Enable the timeline toolbar freeze-frame button: capture the composited canvas as PNG, add it as an image media asset, split the video element at the playhead, shift the right part by the freeze duration, and insert a 3-second image element in the gap. Adds RendererManager.captureFrame(), reused by createSnapshot(). Also adds the Nix devshell (flake.nix/flake.lock: bun + nodejs) and AGENTS.md repository guidelines.
* docs: readmeMaze2026-05-171-0/+157
|
* docs: mark repo as archived legacyMaze Winther2026-05-161-165/+3
|
* chore: update copyright yearMaze2026-05-061-2/+2
|
* docs: fix readmeMaze Winther2026-05-021-22/+49
|
* Merge branch 'domain-import'Maze Winther2026-05-022-27/+57
|\
| * docs: move NOTES.md fileMaze Winther2026-05-023-176/+206
| |
* | chore: ignore migrations fileMaze Winther2026-05-022-37/+3
| |
* | chore: remove fileMaze Winther2026-05-021-977/+0
| |
* | refactor: collapse mask definition registry to a single keyed registryMaze Winther2026-05-023-47/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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<BaseMaskParams> Co-authored-by: Cursor <cursoragent@cursor.com>
* | refactor: remove dead tangent handle variantMaze Winther2026-05-023-49/+22
| | | | | | | | | | | | | | | | | | | | | | 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 <cursoragent@cursor.com>
* | fix: address review findings in masks substrateMaze Winther2026-05-025-12/+116
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - 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 <cursoragent@cursor.com>
* | docs: capture mask rust migration notesMaze Winther2026-05-021-0/+36
| | | | | | | | Made-with: Cursor
* | refactor: split builtin and freeform masksMaze Winther2026-05-0232-273/+508
| | | | | | | | Made-with: Cursor
* | refactor: type mask handle identifiersMaze Winther2026-05-0211-209/+252
| | | | | | | | Made-with: Cursor
* | refactor: make mask renderer dispatch explicitMaze Winther2026-05-0214-559/+660
| | | | | | | | Made-with: Cursor
* | refactor: split mask snap dispatchMaze Winther2026-05-024-45/+85
| | | | | | | | Made-with: Cursor
* | refactor: animate params over timeMaze Winther2026-05-0232-1134/+1419
| |
* | chore: cleanupMaze Winther2026-05-0210-272/+41
| |
* | refactor: unify element paramsMaze Winther2026-05-0253-1360/+2019
| |
* | chore: switch from biome to eslint + prettier; fix ton of lint issuesMaze Winther2026-05-02159-5221/+5596
| |
* | chore: untrack cargo-tools filesMaze Winther2026-05-021-1/+1
| |
* | chore: remove accidental fileMaze Winther2026-04-262-10/+1
| | | | | | | | Made-with: Cursor
* | fix: restore README header, badges, links, and star chartMaze Winther2026-04-261-24/+47
| | | | | | | | Made-with: Cursor
* | refactor: split animation helpers by domainMaze Winther2026-04-2667-1511/+2718
|\|
| * refactor: split animation helpers by domainMaze Winther2026-04-2643-1322/+1628
| |
| * refactor: centralize editor interaction stateMaze Winther2026-04-2538-4754/+5673
| | | | | | | | | | | | | | | | 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
| * fix: surface unsupported video codec on import, fix Input leaksMaze Winther2026-04-254-144/+165
| |
| * perf: improve rendering performance by ~20xMaze Winther2026-04-2211-322/+745
| |