Skip to content

test: golden-master interaction traces with a browser cross-check - #281

Merged
STRML merged 6 commits into
masterfrom
test/golden-traces
Oct 31, 2026
Merged

STRML merged 6 commits into
masterfrom
test/golden-traces

Conversation

@STRML

@STRML STRML commented Oct 31, 2026

Copy link
Copy Markdown
Collaborator

Pins every observable output of Resizable and ResizableBox before the perf and clarity refactors. No file under lib/ changes.

scenario ─▶ real react-draggable handlers (one act() per event) ─▶ trace
                                                                     │
  callbacks + size + event kind, rendered width/height,              ▼
  handles rendered, getBoundingClientRect reads      __golden__/<scenario>.golden.json
                                                                     ▲
  42 scenarios ─▶ Chromium (Playwright, real mouse) ─▶ same trace ───┘ exact match

418 scenarios: both components, all 8 handles alone and together, axis, min/max constraints, lockAspectRatio, transformScale 0.5/1/2, handle as element and as function, draggableOpts, controlled sizes the parent does and does not update, mouse and touch, a final mouseup delta, unmount mid-resize, StrictMode. Two cadences: one render per event, and a whole gesture with no re-render (the #255 case).

jsdom returns zero rects, so the w/n position correction never ran in tests before. A small layout shim computes rects from inline styles, which exercises it. The browser run checks the shim: 42 of 42 traces match real Chromium exactly. The rectReads counter is jsdom-only and is the one field left out of that comparison. It is pinned so the planned "skip the layout read for s/e handles" change shows up as an intended diff.

Bugs are pinned, not fixed. Each has a scenario tagged "knownBug":

id today
5.1 lockAspectRatio drifts under a binding max (100x50 -> 120x91.8 -> 120x113.9)
5.2 lockAspectRatio with axis="x" still changes height
5.3a-c NaN sizes: ResizableBox axis="y" without width, lock with height 0
5.4 ResizableBox can call onResize after onResizeStop
5.5 the mouseup delta is dropped
5.6 draggableOpts.onStart/onDrag/onStop are documented but overwritten
5.7 a function handle without a ref throws on mousedown
5.8 constrained start
5.9 axis="none" also suppresses onResizeStart/onResizeStop
5.11 an element handle's own ref is overwritten

Mutation check: breaking the w/n correction at lib/Resizable.tsx:110,114 fails 54 scenarios with readable diffs.

playwright@1.62.1 (the version react-grid-layout pins) becomes a devDependency, and CI runs yarn golden:browser after the unit tests. Regenerate with yarn golden:update. Any later golden diff must be explained in its PR; __tests__/golden/README.md has the rules.

Status - 2026-10-31

Check (local, on 4d4056b) Result
yarn test 5 suites, 501 passed
two consecutive golden runs 0 diffs
yarn golden:browser 42 / 42 match
lint / typecheck 0 errors (1 pre-existing warning) / pass
coverage branches 84.8% -> 89.9%; Resizable.tsx 100% on all four

Review gate: codex-review.sh with __golden__/** excluded as generated (4.3 MB).

Test plan

  • CI green on this head, including the browser cross-check
  • Review gate passes on this head

STRML added 3 commits October 31, 2026 16:55
Freeze callback order, event kinds, handle identity, DOM sizes and layout reads through real DraggableCore events. Moving fake layout and two render cadences expose north/west correction and stale-prop accumulation.

Keep audited bugs as named goldens so fixes require intentional trace diffs. Type-check test support and run all golden cases in the normal suite.
Run the shared fixture against lib source and real Chromium layout so the fake layout model can be checked independently. Compare callbacks and DOM fields with the committed jsdom traces using trusted mouse input.

Keep Playwright in a standalone browser project and support installed browser paths for offline use. Browser launch aborted in this sandbox, so runtime parity remains unverified.
The browser runner loaded Playwright from a nested package.json that nothing installed, so it could only run by hand. Move playwright@1.62.1 to a root devDependency (the version react-grid-layout pins) and run yarn golden:browser in CI after the unit tests. Locally: 42 of 42 browser traces match their jsdom golden files.
@coderabbitai

coderabbitai Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 434 files, which is 134 over the limit of 300.

To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch.

Usage-priced reviews support at most 300 files.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 5b32664b-ea00-4d40-ac18-fbfc6cfae41a
Commits

Reviewing files that changed from the base of the PR and between 1b40303 and d4d728c.

Files ignored due to path filters: 1
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
Files selected for processing: 434
  • .github/workflows/test.yml
  • __tests__/golden/README.md
  • __tests__/golden/__golden__/Resizable-all-handles-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-all-handles-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-constraints-max-binding-return-lock-false.golden.json
  • __tests__/golden/__golden__/Resizable-constraints-max-binding-return-lock-true.golden.json
  • __tests__/golden/__golden__/Resizable-constraints-max-not-binding-lock-false.golden.json
  • __tests__/golden/__golden__/Resizable-constraints-max-not-binding-lock-true.golden.json
  • __tests__/golden/__golden__/Resizable-constraints-min-binding-return-lock-false.golden.json
  • __tests__/golden/__golden__/Resizable-constraints-min-binding-return-lock-true.golden.json
  • __tests__/golden/__golden__/Resizable-constraints-min-not-binding-lock-false.golden.json
  • __tests__/golden/__golden__/Resizable-constraints-min-not-binding-lock-true.golden.json
  • __tests__/golden/__golden__/Resizable-constraints-tight-min-max-lock-false.golden.json
  • __tests__/golden/__golden__/Resizable-constraints-tight-min-max-lock-true.golden.json
  • __tests__/golden/__golden__/Resizable-constraints-unbounded-lock-false.golden.json
  • __tests__/golden/__golden__/Resizable-constraints-unbounded-lock-true.golden.json
  • __tests__/golden/__golden__/Resizable-e-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-e-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-e-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-e-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-e-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-e-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-e-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-e-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-e-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-e-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-e-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-e-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-e-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-e-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-e-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-e-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-n-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-n-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-n-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-n-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-n-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-n-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-n-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-n-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-n-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-n-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-n-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-n-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-n-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-n-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-n-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-n-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-ne-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-ne-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-ne-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-ne-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-ne-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-ne-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-ne-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-ne-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-ne-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-ne-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-ne-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-ne-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-ne-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-ne-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-ne-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-ne-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-nw-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-nw-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-nw-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-nw-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-nw-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-nw-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-nw-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-nw-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-nw-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-nw-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-nw-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-nw-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-nw-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-nw-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-nw-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-nw-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-options-0-0.golden.json
  • __tests__/golden/__golden__/Resizable-options-0-1.golden.json
  • __tests__/golden/__golden__/Resizable-options-0-2.golden.json
  • __tests__/golden/__golden__/Resizable-options-0-3.golden.json
  • __tests__/golden/__golden__/Resizable-options-1-0.golden.json
  • __tests__/golden/__golden__/Resizable-options-1-1.golden.json
  • __tests__/golden/__golden__/Resizable-options-1-2.golden.json
  • __tests__/golden/__golden__/Resizable-options-1-3.golden.json
  • __tests__/golden/__golden__/Resizable-options-2-0.golden.json
  • __tests__/golden/__golden__/Resizable-options-2-1.golden.json
  • __tests__/golden/__golden__/Resizable-options-2-2.golden.json
  • __tests__/golden/__golden__/Resizable-options-2-3.golden.json
  • __tests__/golden/__golden__/Resizable-options-3-0.golden.json
  • __tests__/golden/__golden__/Resizable-options-3-1.golden.json
  • __tests__/golden/__golden__/Resizable-options-3-2.golden.json
  • __tests__/golden/__golden__/Resizable-options-3-3.golden.json
  • __tests__/golden/__golden__/Resizable-s-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-s-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-s-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-s-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-s-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-s-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-s-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-s-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-s-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-s-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-s-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-s-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-s-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-s-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-s-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-s-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-se-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-se-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-se-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-se-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-se-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-se-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-se-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-se-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-se-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-se-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-se-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-se-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-se-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-se-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-se-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-se-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-sw-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-sw-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-sw-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-sw-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-sw-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-sw-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-sw-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-sw-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-sw-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-sw-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-sw-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-sw-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-sw-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-sw-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-sw-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-sw-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-w-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-w-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-w-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-w-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-w-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-w-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-w-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-w-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-w-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-w-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-w-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-w-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-w-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/Resizable-w-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/Resizable-w-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/Resizable-w-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-all-handles-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-constraints-max-binding-return-lock-false.golden.json
  • __tests__/golden/__golden__/ResizableBox-constraints-max-binding-return-lock-true.golden.json
  • __tests__/golden/__golden__/ResizableBox-constraints-max-not-binding-lock-false.golden.json
  • __tests__/golden/__golden__/ResizableBox-constraints-max-not-binding-lock-true.golden.json
  • __tests__/golden/__golden__/ResizableBox-constraints-min-binding-return-lock-false.golden.json
  • __tests__/golden/__golden__/ResizableBox-constraints-min-binding-return-lock-true.golden.json
  • __tests__/golden/__golden__/ResizableBox-constraints-min-not-binding-lock-false.golden.json
  • __tests__/golden/__golden__/ResizableBox-constraints-min-not-binding-lock-true.golden.json
  • __tests__/golden/__golden__/ResizableBox-constraints-tight-min-max-lock-false.golden.json
  • __tests__/golden/__golden__/ResizableBox-constraints-tight-min-max-lock-true.golden.json
  • __tests__/golden/__golden__/ResizableBox-constraints-unbounded-lock-false.golden.json
  • __tests__/golden/__golden__/ResizableBox-constraints-unbounded-lock-true.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-e-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-n-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-ne-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-nw-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-0-0.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-0-1.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-0-2.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-0-3.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-1-0.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-1-1.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-1-2.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-1-3.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-2-0.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-2-1.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-2-2.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-2-3.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-3-0.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-3-1.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-3-2.golden.json
  • __tests__/golden/__golden__/ResizableBox-options-3-3.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-s-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-se-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-sw-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-both-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-both-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-both-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-both-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-none-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-none-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-none-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-none-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-x-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-x-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-x-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-x-topleft-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-y-bottomright-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-y-bottomright-per-event.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-y-topleft-batched.golden.json
  • __tests__/golden/__golden__/ResizableBox-w-y-topleft-per-event.golden.json
  • __tests__/golden/__golden__/box-cadence-B-stale-props-255.golden.json
  • __tests__/golden/__golden__/browser-Resizable-e-bottomright.golden.json
  • __tests__/golden/__golden__/browser-Resizable-e-topleft.golden.json
  • __tests__/golden/__golden__/browser-Resizable-n-bottomright.golden.json
  • __tests__/golden/__golden__/browser-Resizable-n-topleft.golden.json
  • __tests__/golden/__golden__/browser-Resizable-ne-bottomright.golden.json
  • __tests__/golden/__golden__/browser-Resizable-ne-topleft.golden.json
  • __tests__/golden/__golden__/browser-Resizable-nw-bottomright.golden.json
  • __tests__/golden/__golden__/browser-Resizable-nw-topleft.golden.json
  • __tests__/golden/__golden__/browser-Resizable-s-bottomright.golden.json
  • __tests__/golden/__golden__/browser-Resizable-s-topleft.golden.json
  • __tests__/golden/__golden__/browser-Resizable-se-bottomright.golden.json
  • __tests__/golden/__golden__/browser-Resizable-se-topleft.golden.json
  • __tests__/golden/__golden__/browser-Resizable-sw-bottomright.golden.json
  • __tests__/golden/__golden__/browser-Resizable-sw-topleft.golden.json
  • __tests__/golden/__golden__/browser-Resizable-w-bottomright.golden.json
  • __tests__/golden/__golden__/browser-Resizable-w-topleft.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-e-bottomright.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-e-topleft.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-n-bottomright.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-n-topleft.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-ne-bottomright.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-ne-topleft.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-nw-bottomright.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-nw-topleft.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-s-bottomright.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-s-topleft.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-se-bottomright.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-se-topleft.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-sw-bottomright.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-sw-topleft.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-w-bottomright.golden.json
  • __tests__/golden/__golden__/browser-ResizableBox-w-topleft.golden.json
  • __tests__/golden/__golden__/browser-controlled-frozen.golden.json
  • __tests__/golden/__golden__/browser-grid-relative-deltas.golden.json
  • __tests__/golden/__golden__/browser-known-lock-axis-x.golden.json
  • __tests__/golden/__golden__/browser-known-mouseup-delta.golden.json
  • __tests__/golden/__golden__/browser-lock-max-binding.golden.json
  • __tests__/golden/__golden__/browser-scale-0.5-nw.golden.json
  • __tests__/golden/__golden__/browser-scale-0.5-se.golden.json
  • __tests__/golden/__golden__/browser-scale-2-nw.golden.json
  • __tests__/golden/__golden__/browser-scale-2-se.golden.json
  • __tests__/golden/__golden__/browser-strict-box.golden.json
  • __tests__/golden/__golden__/cadence-B-stale-props-255.golden.json
  • __tests__/golden/__golden__/callback-false-is-ignored.golden.json
  • __tests__/golden/__golden__/controlled-clamp.golden.json
  • __tests__/golden/__golden__/controlled-frozen.golden.json
  • __tests__/golden/__golden__/draggable-cancel.golden.json
  • __tests__/golden/__golden__/draggable-disabled.golden.json
  • __tests__/golden/__golden__/draggable-double-scale.golden.json
  • __tests__/golden/__golden__/draggable-handle-selector.golden.json
  • __tests__/golden/__golden__/draggable-no-user-select.golden.json
  • __tests__/golden/__golden__/grid-relative-deltas.golden.json
  • __tests__/golden/__golden__/handle-size-large.golden.json
  • __tests__/golden/__golden__/handle-size-small.golden.json
  • __tests__/golden/__golden__/known-aspect-max-drift-batched.golden.json
  • __tests__/golden/__golden__/known-aspect-max-drift.golden.json
  • __tests__/golden/__golden__/known-axis-none.golden.json
  • __tests__/golden/__golden__/known-box-missing-width.golden.json
  • __tests__/golden/__golden__/known-box-resize-after-stop.golden.json
  • __tests__/golden/__golden__/known-draggable-handlers-overwritten.golden.json
  • __tests__/golden/__golden__/known-element-ref-overwritten.golden.json
  • __tests__/golden/__golden__/known-function-without-ref.golden.json
  • __tests__/golden/__golden__/known-incompatible-axis.golden.json
  • __tests__/golden/__golden__/known-lock-axis-x.golden.json
  • __tests__/golden/__golden__/known-lock-zero-height.golden.json
  • __tests__/golden/__golden__/known-mouseup-delta.golden.json
  • __tests__/golden/__golden__/known-scale-zero.golden.json
  • __tests__/golden/__golden__/known-start-constrained.golden.json
  • __tests__/golden/__golden__/strict-box.golden.json
  • __tests__/golden/__golden__/strict-resizable.golden.json
  • __tests__/golden/__golden__/touch-nw-moving-layout.golden.json
  • __tests__/golden/__golden__/unmount-mouse.golden.json
  • __tests__/golden/__golden__/unmount-touch.golden.json
  • __tests__/golden/browser/README.md
  • __tests__/golden/browser/app.tsx
  • __tests__/golden/browser/run.cjs
  • __tests__/golden/expectGolden.ts
  • __tests__/golden/fixture.tsx
  • __tests__/golden/harness.ts
  • __tests__/golden/recorder.ts
  • __tests__/golden/scenarios.ts
  • __tests__/golden/scenarios/interactions.golden.test.tsx
  • __tests__/golden/serialize.test.ts
  • __tests__/golden/serialize.ts
  • jest.config.js
  • package.json
  • tsconfig.golden.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@github-actions

Copy link
Copy Markdown

Packj audit found 1/1 risky dependencies.

Click here for details

Registry Package Version Risks
npm react-draggable 4.5.0

undesirable

. Click for details
  • package is old or abandoned: 493 days old
  • invalid or no author email: no email
  • Triggered by workflow run 48 on commit 020b2de66172290cdc2cfa191d42487a7a94c93d

    Sentinels ({$undefined}, {$number}) are plain objects, so a trace value could change to a lookalike without changing its golden file, and value.map turned array holes into null. Ordinary objects with a "$" key are now wrapped in {$escaped}, and holes encode as {$hole: true}. Same fix as react-grid-layout#2320 round 1. No golden file changed; a new serializer test covers each collision.
    @github-actions

    Copy link
    Copy Markdown

    Packj audit found 1/1 risky dependencies.

    Click here for details

    Registry Package Version Risks
    npm react-draggable 4.5.0

    undesirable

    . Click for details
  • package is old or abandoned: 493 days old
  • invalid or no author email: no email
  • Triggered by workflow run 49 on commit dc4d825f201f675304769465b83484b40c2fefc0

    Review P2: the recorder kept only width and height from the box's style attribute, so a refactor that dropped a user's style (the fixture passes color: red) left every trace unchanged. Record all inline style properties, sorted. All 418 goldens regenerate with one style list each; nothing else moves.
    
    The browser cross-check failed on Linux CI while passing 42/42 locally, and the failing lines live only in the job log. On GitHub Actions the runner now also prints an ::error workflow command per failure, so the diff shows up as a check annotation.
    @github-actions

    Copy link
    Copy Markdown

    Packj audit found 1/1 risky dependencies.

    Click here for details

    Registry Package Version Risks
    npm react-draggable 4.5.0

    undesirable

    . Click for details
  • package is old or abandoned: 493 days old
  • invalid or no author email: no email
  • Triggered by workflow run 50 on commit b93d992bd0b9c43c82d77e24f883245163ddab17

    Root cause: both runners queue requestAnimationFrame until the final animation-frame step, which also held react-draggable's scheduleRemoveUserSelectStyles cleanup. In browser-strict-box the s drag leaves a native Range selection (handle s to handle se) that covers the w handle. On Linux Chromium the w mousedown lands inside that selection and starts a native drag: dragstart/dragover/dragend replace mousemove/mouseup, so DraggableCore never sees the moves or the release, stays dragging, and later gestures resize through two handles at once (width 1890).
    
    Fix: drain queued frames, unrecorded and inside act, before each gesture (goldenBrowser.settle() in app.tsx, called from run.cjs; the same drain in harness.ts), as real frames would between separate drags. The final gesture's cleanup keeps its recorded animation-frame step. No golden files change.
    
    Verified: yarn golden:browser 42/42 in mcr.microsoft.com/playwright:v1.62.1-noble and on macOS; yarn test 502/502 with no golden diffs.
    @github-actions

    Copy link
    Copy Markdown

    Packj audit found 1/1 risky dependencies.

    Click here for details

    Registry Package Version Risks
    npm react-draggable 4.5.0

    undesirable

    . Click for details
  • package is old or abandoned: 493 days old
  • invalid or no author email: no email
  • Triggered by workflow run 51 on commit 61765cda9c7dab35e62e3a0bc5c0d01333db305d

    @STRML
    STRML merged commit 65f8176 into master Oct 31, 2026
    4 checks passed
    @STRML
    STRML deleted the test/golden-traces branch October 31, 2026 21:31
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Labels

    None yet

    Projects

    None yet

    Development

    Successfully merging this pull request may close these issues.

    1 participant