Commit Graph
1937 Commits
Author SHA1 Message Date
Miguel Ángel 3a28ef41ae perf(studio): a long film's media durations write the store once per file, not once per clip (#6745)
* fix(studio): a film that cuts one file into many clips plays smoothly while their durations load

* test(studio): the metadata test counts one store write per file
2026-11-03 18:54:17 +00:00
WaterrrForever 12ce8c2ffd chore: release v0.9.9 (#7095) 2026-11-03 11:28:41 -05:00
Miguel Ángel 9ceced05e2 chore: release v0.9.8 (#7077) 2026-11-03 09:15:54 +00:00
James RussoandClaude Opus 5.5 8c799ebd1b chore: release v0.9.7 (#7064)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-03 05:21:25 +00:00
James RussoandClaude Opus 5.5 112ba53302 fix(studio): motion blur falls back for a WebGL canvas Studio reaches first (#7060)
* fix(core): motion blur notices a WebGL canvas the Studio page touched first

When a same-origin host page (Studio) reaches a preview element before the
scene does, for example through a MutationObserver record, Chrome gives that
element the host's prototype. The scene's getContext("webgl") then ran the
host's unpatched getContext, so the canvas never reached the accelerated
canvas set, capture motion blur stayed on, and the WebGL canvas froze during
preview playback.

The tracker now records a canvas in the set of the canvas's own window, and
installs itself in a same-origin parent too, compiled with the parent's own
Function. Cross-origin parents are skipped.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(studio): track accelerated canvases in Studio's window, not the embedder's

The preview runtime no longer installs the canvas tracker in its parent
window. That ran on every preview boot, so any same-origin page embedding
the player got its getContext wrapped, and a host CSP without
unsafe-eval reported a violation on each load. Studio now installs the
tracker in its own window when its Player module loads, and core
exposes it at @hyperframes/core/page-motion-blur.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* chore: keep the comment share of the touched files from rising

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-03 03:59:23 +00:00
Jerrai 398ef50624 chore: release v0.9.6 (#7037) 2026-11-02 20:19:33 +00:00
James RussoandClaude Opus 5.5 4c1c1782af test(studio): quarantine the seqplainkeys cases whose undo sometimes leaves the box off (#6990)
* test(studio): quarantine the seqplainkeys case whose undo sometimes leaves the box 240px off

seqplainkeys-none-center-r0-root-z100 failed 2 of 3 runs in the merge group
for two version-bump PRs (#6970, #6987). In each failing undo the bytes come
back but the box stays 240.42px off, which is a Studio undo race, not noise.
It stays measured and listed; #6989 tracks the fix, which removes this entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(studio): quarantine the two sibling seqplainkeys center cases with the same undo race

center-r30-root (undo box 313.6px off) and center-r0-nested (redo box
240.7px off) ejected 3 and 1 merge-queue entries since 10-30, the same race
as center-r0-root. With all three quarantined, the gate passes on the shard
results of all 8 failed merge-group runs since 10-30; main's gate fails each.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(studio): quarantine the pct and px seqplainkeys cases with the same undo race

The race also hits the pct and px placements: 5 more cases left the box
230-400px off after undo or redo in the 9 failed merge-group runs since
10-30. Merge-group run 41485305789 bounced #6990 on px-r0-nested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 17:44:31 +00:00
James RussoandClaude Opus 5.5 ceea238911 test(studio): the dev server render job tests wait up to 20 s for the render (#6992)
vi.waitFor gives up after 1 s by default, inside a describe that already
allows 30 s per test. On a loaded Windows runner the blur test saw the job
still "rendering" at 1 s and failed the #6980 merge group (job 125103352086).
Reproduced by making the mocked render take 1.5 s: main fails with the same
"expected 'rendering' to be 'complete'"; this passes.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 16:50:02 +00:00
Miguel Ángel c14d92a227 chore: release v0.9.5 (#7025) 2026-11-02 16:20:52 +00:00
Miguel Ángel 34a8d48160 chore: release v0.9.4 (#7018) 2026-11-02 14:33:44 +00:00
Miguel Ángel cd5984261a fix(studio): an undo that drops the keyframes clears the transform the old preview still shows (#7005)
A restore that removes the GSAP script cannot be patched in place, so the preview reloads - and until it lands it keeps the transform the timeline composed, though the file it is going back to places the box with CSS alone. Only the elements the restored script stops animating are repainted; anything it still animates keeps what the timeline gave it.
2026-11-02 12:29:46 +00:00
Miguel Ángel f6536e9f5d chore: release v0.9.3 (#7010) 2026-11-02 12:04:35 +00:00
Miguel Ángel a46412ee07 fix(studio): a preview reload writes the composition as it is now, not as it was when it asked (#6998)
* fix(studio): a preview swap writes the composition as it is now, not as it was when it asked

Claude-Session: https://claude.ai/code/session_01BzWPCkrNkiYrpRYeqVmKyK

* fix(studio): a shadow reload that a write outran loads the file again

Claude-Session: https://claude.ai/code/session_01BzWPCkrNkiYrpRYeqVmKyK

* fix(studio): count the project's revision once per write, not again on its echo

Claude-Session: https://claude.ai/code/session_01BzWPCkrNkiYrpRYeqVmKyK

* refactor(studio): move the swap freshness check next to the swap it guards

* refactor(studio): name the refetch bound instead of explaining it
2026-11-02 09:52:07 +00:00
Miguel Ángel 5e50ac1c47 chore: release v0.9.2 (#6994)
* chore: release v0.9.2

* chore: release v0.9.2
2026-11-02 08:42:46 +00:00
Miguel Ángel 5fca435623 feat(studio): hosts can ask which action holds a key combination (#6979)
* feat(studio): hosts can ask which Studio action holds a key combination

* fix(studio): the clash check skips a key map entry that is not a combo

* refactor(studio): studioKeyClash in fewer lines
2026-11-02 07:42:18 +00:00
James RussoandClaude Opus 5.5 870569a431 chore: release v0.9.1 (#6987)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-02 07:14:25 +00:00
James RussoandClaude Opus 5.5 f1391156e0 chore: release v0.9.0 (#6980)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-02 05:14:22 +00:00
Miguel Ángel f0b2dd0cdb chore: release v0.8.231 (#6971) 2026-11-02 03:34:08 +00:00
Miguel Ángel 9fa02badfc feat(studio): every editor and player shortcut is remappable (#6966)
* feat(studio): shortcut combos in the key resolver

* feat(studio): every editor shortcut is a remappable combo

* refactor(studio): playback keys dispatch through one table

* fix(studio): combo parsing without backtracking, symbol keys match, fewer comments

* style(studio): format the shortcut files

* chore(studio): drop a doc comment the ratchet counts

* chore(studio): drop a doc comment the ratchet counts

* fix(studio): modifier combos fire for playback keys, caption guard and held stop key follow the map
2026-11-02 02:38:23 +00:00
Miguel Ángel fb2c28e8aa chore: release v0.8.230 (#6962) 2026-11-01 23:52:11 +00:00
Miguel Ángel 57d23598a7 feat(studio): hosts can remap Studio's single-key shortcuts (#6957)
* feat(studio): hosts can remap Studio's single-key shortcuts

* fix(studio): razor exit key and jump-to-in stay live when remapped
2026-11-01 22:40:12 +00:00
Miguel Ángel 7d8cdfbb8b fix(studio): a preview reload that timed out is tried once more, so an edit is not left unseen (#6953)
* fix(studio): a preview reload that timed out is tried once more, so an edit is not left unseen

* fix(studio): trim the retry hook's comments to the package's share
2026-11-01 21:50:31 +00:00
Vance Ingalls 5540f49121 chore: release v0.8.229 (#6951) 2026-11-01 12:42:11 -08:00
Miguel Ángel 0ab4931159 fix(studio): a clip's thumbnail strip stays put while you trim it (#6942)
* fix(studio): a clip's thumbnail strip stays put while you trim it

* fix(studio): cover the trim-to-hold link and drop the comment

* refactor(studio): the held trim range lives in its own small hook

* refactor(studio): the thumbnail's held request inputs move into one hook

* chore(studio): drop the hook docstring
2026-11-01 20:16:52 +00:00
Miguel Ángel 3179348d9a chore: release v0.8.228 (#6943)
* chore: release v0.8.228

* docs(release): the v0.8.228 notes say what limiting a mix far over the ceiling costs
2026-11-01 18:14:51 +00:00
Miguel Ángel 7aa3a447e2 chore: release v0.8.227 (#6936) 2026-11-01 16:16:13 +00:00
Miguel Ángel a23cc59ee1 fix(studio): opening the thumbnail browser no longer stalls the server to read its version (#6931) 2026-11-01 15:43:24 +00:00
Miguel Ángel f08f07ab64 chore: release v0.8.226 (#6917) 2026-11-01 06:04:20 +00:00
Miguel Ángel a7075fcb6c feat(studio): a host that draws its own loader can turn off both of Studio's preview loaders (#6911)
* feat(studio): a host that draws its own loader can turn off both of Studio's preview loaders

Player and NLEPreview take loadingUi: 'none', which hides the composition cover
and the 'Preparing preview assets' wait while still reporting that the preview is
loading. suppressLoadingOverlay keeps its narrower meaning: skip only the
composition cover on a later load.

* refactor(studio): name who draws the loader in the value, loadingUi 'studio' | 'host'

The value says the host draws its own loader, so no doc line has to tell it apart
from suppressLoadingOverlay, and the files' comment share does not rise.

* refactor(studio): the loader choice sits outside Player, the stage size beside NLEPreview

Player's draw decision moves to a small helper so the component's complexity does
not rise, and resolvePreviewStageSize moves to its own file so NLEPreview stays
under the 600-line cap with the new prop.

* refactor(studio): Player reads the host's loader choice without another destructured prop

Destructuring one more prop raised Player's cognitive complexity above main's; the
rest of the props carries loadingUi instead.

* refactor(studio): NLEPreview's stage constants live in one small module

* style(studio): format NLEPreview's stage import
2026-11-01 04:32:07 +00:00
Miguel Ángel bba3676a37 feat(core): the playback health reading says which clock the film followed (#6906)
* feat(core): the playback health reading says which clock the film followed

* style(core): format the clock's new reading

* refactor(core): let the clock's names say what the comments said
2026-10-31 23:29:33 +00:00
Miguel Ángel b687d06235 chore: release v0.8.225 (#6898) 2026-10-31 20:58:04 +00:00
Miguel Ángel 2239771efd chore: release v0.8.224 (#6885) 2026-10-31 15:13:39 -04:00
Miguel Ángel 168429d514 fix(studio): preserve identity for stale metadata completions (#6755)
* fix(studio): preserve identity for stale metadata completions

* test(studio): keep metadata regression output quiet
2026-10-31 16:14:38 +00:00
Miguel Ángel 2439b62acd chore: release v0.8.223 (#6869) 2026-10-30 19:11:14 -07:00
Miguel Ángel 359b6c8a38 feat(core): playback health reports how long a video on screen showed no moving picture (#6856)
* feat(core): playback health reports how long a video on screen showed no moving picture

* fix(core): a frozen picture is judged by the clip's own timing, not the film's

* style(core): shorten a test comment under the line limit

* fix(core): the frozen-picture check reads a video from any realm

* refactor(core): cut the frozen-picture comments the comment ratchet counts
2026-10-30 18:48:25 +00:00
Miguel Ángel 9b0df610cc perf(studio): a long timeline no longer lays itself out on every render while it settles (#6855)
* perf(studio): a long timeline no longer lays itself out on every render while it settles

* perf(studio): compare row data with sameData and drop the added comments
2026-10-30 18:30:14 +00:00
Miguel Ángel e28dbe4ce4 chore: release v0.8.222 (#6846) 2026-10-30 18:04:36 +00:00
Miguel Ángel b20d0a62ce fix(studio): a split at a clip's edge leaves the file unchanged (#6826)
* fix(studio): a split at a clip's edge leaves the file unchanged

* fix(studio): keep the split margin's doc within the comment width

* chore(studio-server): keep the split margin's comments within the file's share
2026-10-30 13:01:29 +00:00
Miguel Ángel d83f276743 perf(studio): films with thousands of timed clips stop re-reading every clip each frame (#6805)
* perf(studio): films with thousands of timed clips stop re-reading every clip each frame

* perf(studio): drop the added comment lines the ratchet counts
2026-10-30 07:27:26 +00:00
Miguel Ángel b93c01c75a ci(studio): run the merge queue edit accuracy grid in 30 shards (#6804) 2026-10-30 07:05:16 +00:00
Miguel Ángel f4bbbe1074 chore: release v0.8.221 (#6802) 2026-10-30 06:41:36 +00:00
Miguel Ángel 36cf990d99 test(studio): edit accuracy screenshots are viewport-only and taken in the confirmation re-runs (#6795)
* test(studio): edit accuracy evidence screenshots capture only the viewport

* test(studio): edit accuracy screenshots only in the gate's confirmation re-runs

* test(studio): keep the inStudio doc comment on inStudio
2026-10-30 06:07:59 +00:00
Miguel Ángel 2a9dd05983 ci(studio): split edit accuracy into 15 PR shards packed by measured case time (#6784)
* ci(studio): run the pull request edit accuracy slice in 10 shards

* ci(studio): run the pull request edit accuracy slice in 15 shards

* ci(studio): pack edit accuracy shards by measured case time so they finish together

* ci(studio): load shard timings with require so happy-dom tests can import the grid

* ci(studio): the slow runner stop judges runner speed, not how long a shard's first cases are

* ci(studio): keep the slow runner comment on one line under 120 characters
2026-10-30 05:11:50 +00:00
Miguel Ángel 360ca9cf61 chore: release v0.8.220 (#6781) 2026-10-30 03:37:22 +00:00
Miguel Ángel 6c78dee993 perf(studio): a long project's timeline stops redrawing every clip when its elements change (#6773) 2026-10-30 03:24:28 +00:00
Miguel Ángel a30a520970 chore: release v0.8.219 (#6775) 2026-10-30 02:07:39 +00:00
James Russo f7db6ba40c chore: release v0.8.218 (#6758) 2026-10-29 23:31:55 +00:00
Miguel Ángel 4e2a1c215a chore: release v0.8.217 (#6751) 2026-10-29 15:13:36 +00:00
Miguel Ángel 17ffe479dc feat(studio): a preview reload that gives up on the runtime says how far the page got (#6747)
* feat(studio): a preview reload that gives up on the runtime says how far the page got

* refactor(studio): read the reload's page phase in one place, before the frame is let go

* test(studio): every reload page phase is covered, and the hook gains no branch for it

* refactor(studio): the reload page phase reads the window only once the frame has a document
2026-10-29 14:37:08 +00:00
Miguel Ángel 6df754fbf3 chore: release v0.8.216 (#6735) 2026-10-29 10:01:01 +00:00