Repository navigation
Merged
Conversation
…alidation paused An engine node opens its bracket in a layout effect and closes it in a passive effect. A Suspense boundary that hides the document and shows it again runs the layout effects again, and not the passive ones, on React 18 and 19: the bracket opened then never closed, and the form kept validation paused, so a required field emptied after that showed no error and left the form valid. `useBracket` (components/useBracket.ts) opens a bracket only for a bracket and key that no passive effect has closed one for since it last ran. RenderComponent and Modal use it.
An Expand's content goes when its collapse's animation ends, from its own timer, and a table's rows go when they collapse, the table's own state, or when a host's data has fewer of them. Nothing mounts then whose node would bracket the fields that go, so each one validated every field left and told them all, as a closed popup's did before. `Expand` takes a `bracket`, which the engine hands it, and ExpandList through it, and opens it around its content mounting and going. `TableView` brackets a change of which rows are expanded, and of how many items it has. Both go through `useBracket`. Beside 100 other required fields, in jsdom: an Expand's collapse 60800 field states and 15150 validators before, 600 and 100 now; a table's 50 rows collapsing 25302 and 6275, now 606 and 101; data with 5 of 50 rows 57450 and 14307, now 1755 and 333. In Chromium, collapsing an Expand that holds a 200-row table beside 200 required fields took 535 ms, and takes 124.
…de 200 fields Three documents put the tabs document's 200-row table beside 200 required fields: shown by a `showIf`, in a popup, and in an Expand. Each times the action that brings the table and the one that takes it away, which #220, #223 and the Expand brackets made cost one pass over the form: only the jsdom contract held them until now. The tabs document and these share the table's declaration, and the tabs test and these share `alternate`. The ceilings are estimated from an Apple M4's numbers at the ratios #222 measured, until the runner has measured them.
The runner's first measure of them, in this PR's browser-perf run: reveal 107, 109 and 39 ms, popup 104, 136 and 44, expand 112, 240 and 158 (mount, the action that brings the table, the one that takes it away). The ceilings estimated from the M4 were 3.6 to 5.4 times that. They are 2.5 times it now, and at least 100 ms for an action, as the header says.
…branch already holds
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The browser check (
npm run test:perf, the advisorybrowser-perfjob) gains three documents. Until now, #220, #223 and #225 were held only by the jsdom contract (later-mount-budget.test.js), which counts field states and validators, not time. Each document is the 200-row table of thetabsdocument, a required text column and a bounded number column, beside 200 required fields:revealshowIfpopupexpandThe 200 fields beside the table are what made these actions cost: each field that came or went validated every one of them.
tabsdocument and these three share the table's declaration. Thetabstest and these three sharealternate, which times an action that brings the table and the one that takes it away, in turn.Ceilings
They follow the header's rule: two and a half times what GitHub's runner measured, and at least 100 ms for an action.
browser-perfrun.What they catch. These ceilings flag a regression of the size #223 and #225 removed. On the M4, a popup's close took 447 ms before #223, and an Expand's collapse 535 before #225. A smaller one is the jsdom contract's to catch, as for every document here. #223's probe fix is one: it took the show from 153 ms to 98.
Gates
The PR changes the browser check, its documents and
CLAUDE.mdonly.lint:js,lint:css,typecheck,test:coverage,build,test:react16andtest:react17exit 0 on it, on Node 24.14.0, and so did all eight CI jobs.lint:jsandnpm run test:perfexit 0 on it. All eight documents are under their ceilings.reveal111 / 148 / 48,popup114 / 153 / 52,expand148 / 241 / 181 (mount / bring / take away).#224 and #225 are merged. This branch merged master with
-s ours, since master's tree is the tree it was stacked on.🤖 Generated with Claude Code