Repository navigation
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
AI review status for this pull request.
|
There was a problem hiding this comment.
This pull request is on hold for an owner decision: AlertDialog's touch motion rests only on draft spec:AST-094 (FR4, FR5, FR7, FR8 and DEC-1), and FR4 narrows the current architecture:theme-tokens INV3, so an engineering owner has to approve or amend those requirements. An engineering owner records the decision by commenting /approve-spec <full head SHA> on the pull request, and the author may do so if they are an engineering owner. Separately from that decision:
- Land the stacked pull requests first and rebase, so this diff is only the AlertDialog motion commit instead of 25,379 authored lines.
- While the alert fades out under touch, keyboard and assistive-technology activations still run
onAction, and Escape callsonOpenChange(false)again; make the leaving alert inert. - Under React StrictMode, an AlertDialog that mounts open never starts its presentation and stays invisible and modal; the status effect should own and clean up its animation frame.
- The
adaptivethreshold change contradictscomponent:SelectorDEC-1; split it out or keep the current query. - The
lintjob failed on this head with an ESLint out-of-memory error and needs a rerun.
[Automated review]
| ref={ref} | ||
| isOpen={isOpen} | ||
| ref={mergedRef} | ||
| isOpen={motion.isPresented} |
There was a problem hiding this comment.
Under a coarse pointer this keeps the native dialog open for the 404 ms fade (504 ms backstop), but only touch and pen are inert (useActionGroupTracking.ts:186). The still-focused Delete takes a second Enter or AT activation and runs onAction again (:271), and Escape calls onOpenChange(false) again. Consider making the content inert while isLeaving, or dropping onAction, cancel and dismissal once isOpen is false.
There was a problem hiding this comment.
Fixed in 6dca4bf: while the alert leaves (closed by the caller, still presented during its fade), AlertDialog drops a click, Enter or assistive-technology activation on an action, Cancel, and Escape, as UIKit delivers no input during a dismissal. Focus stays where it is, so Dialog returns it to the opener. The new case 'on iOS, while the alert leaves, runs nothing' failed before the fix (onAction ran).
| const was = statusRef.current; | ||
| const now: Status = !isPresented ? 'hidden' : isOpen ? 'open' : 'leaving'; | ||
| statusRef.current = now; | ||
| if (!isEnabled || was === now) { |
There was a problem hiding this comment.
Under StrictMode replay of a mount-open alert (for example useImperativeAlertDialog's first show()), statusRef is already 'open', so this returns. Meanwhile the cleanup at :211 has cancelled the presentation frame, so the panel stays at opacity 0 and scale 1.2 and touches stay inert. Giving this effect its own cleanup (cancel the frame, restore statusRef) would make the replay re-run the opening (architecture:react-component-runtime INV3).
There was a problem hiding this comment.
The presentation no longer waits for an animation frame (it starts in the effect that opens the dialog), so a StrictMode replay has nothing to cancel, as the later review notes. 6dca4bf adds the StrictMode mount-open case: the alert presents and takes touches once the presentation completes.
| // and large touch displays stay anchored, phones in either orientation get | ||
| // the sheet. The query is the shared touch presentation's | ||
| // (utils/touchPresentation.ts). | ||
| export const COMPACT_TOUCH_PRESENTATION_QUERY = COMPACT_TOUCH_QUERY; |
There was a problem hiding this comment.
This moves adaptive from (max-width: 768px) and (pointer: coarse) to (width < 744px) or (height < 500px). Current component:Selector DEC-1 records that "adaptive keeps its width-and-pointer query". The change belongs in its own pull request with an owner decision, or this should keep the current query.
PR Analysis Report
Generated by PR Enrichment workflow | View current CI run |
f3b37d2 to
6e2412f
Compare
There was a problem hiding this comment.
This pull request is on hold for an owner decision: AlertDialog's touch motion rests only on draft spec:AST-094 (FR4, FR5, FR7, FR8 and DEC-1), and FR4 narrows the current architecture:theme-tokens INV3, so an engineering owner needs to approve or amend those requirements. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request, and the author may do so if they are an engineering owner. Separately from that decision:
- Land the stacked pull requests first and rebase, so this diff is only the AlertDialog motion commit instead of 26,547 authored lines.
- While the alert fades out under touch, keyboard and assistive-technology activations still run
onActionand Escape callsonOpenChange(false)again; make the leaving alert inert. - Under React StrictMode, an AlertDialog that mounts open never starts its presentation and stays invisible and unresponsive to touch; let the status effect own and clean up its animation frame.
- The
adaptivethreshold change contradictscomponent:SelectorDEC-1; split it out or keep the current query. - The
lintjob runs out of memory on this head while the base passes.
[Automated review]
6e2412f to
b635c03
Compare
There was a problem hiding this comment.
This pull request is on hold for an owner decision: AlertDialog's touch motion rests only on draft spec:AST-094 (FR4, FR5, FR7, FR8 and DEC-1), and FR4 narrows the current architecture:theme-tokens INV3, so an engineering owner needs to approve or amend those requirements. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request, and the author may do so if they are an engineering owner. Separately from that decision:
- Land the stacked pull requests first and rebase, so this diff is only the AlertDialog motion commit instead of 27,525 authored lines.
- While the alert fades out under touch, keyboard, click and assistive-technology activations still run
onAction, and Escape callsonOpenChange(false)again; make the leaving alert inert. - The
adaptivethreshold change contradictscomponent:SelectorDEC-1; split it out or keep the current query. - The
lintjob runs out of memory on this head whilemainpasses. - Add a StrictMode mount-open test for the new motion effect; the StrictMode presentation issue raised on the earlier head no longer applies.
[Automated review]
b635c03 to
1c55503
Compare
There was a problem hiding this comment.
This pull request is on hold for an owner decision: AlertDialog's iPhone and iPad motion rests only on draft spec:AST-094 (FR5, FR7, DEC-1), and that record's FR4 and DEC-1 forbid the theme-tunable touch motion this head adds through defineTheme({motion: {springs, durations, curves}}), so an engineering owner needs to settle which holds, and whether the two non-component experimental subpaths are an acceptable boundary under spec:AST-017 FR21. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request once the record says so, and the author may do so if they are an engineering owner. Separately from that decision:
- While the alert fades out on iOS, keyboard and assistive-technology activations still run
onActionand Escape callsonOpenChange(false)again; make the leaving alert inert. - Under Reduce Motion the iOS fades last 404 ms on a spring, but
design:reduced-motionDR2 allows an opacity-only change of 200 ms or less, and DR4 bars theme values that lengthen it. - The compact test's 744 px width contradicts
spec:AST-012FR9 (the theme'smdpoint or a height under 500), and theplatformadaptation condition extends the vocabulary FR2 closes. - Land the stacked pull requests first and rebase, so this diff is only the AlertDialog motion commit instead of 31,379 authored lines.
- Add a StrictMode mount-open test for the new motion effect.
[Automated review]
| ref={ref} | ||
| isOpen={isOpen} | ||
| ref={mergedRef} | ||
| isOpen={motion.isPresented} |
There was a problem hiding this comment.
While the alert fades out on iOS, Dialog stays an open modal here, but only the touch tracker consults the inert window (:250). A second Enter or assistive-technology activation of the still-focused Delete runs onAction again (:285), and Escape calls onOpenChange(false) on an alert the caller already closed. Making the content inert while isPresented && !isOpen, or dropping the handlers once isOpen is false, would close that window.
There was a problem hiding this comment.
Fixed at 7c77707: while the alert fades out, a click on an action or Cancel, Enter, an assistive-technology activation and Escape do nothing (isLeaving guards the three handlers). AlertDialog.test.tsx covers it.
| const handle = panel.animate( | ||
| {opacity: 1, scale: 1}, | ||
| {spring: springs.alertPresent}, | ||
| {crossfade: springs.alertPresent}, |
There was a problem hiding this comment.
Under Reduce Motion this fades on springs.alertPresent, a 404 ms curve, and the exit at :252 does the same on springs.alertDismiss. design:reduced-motion DR2 (current) requires an opacity-only change that finishes in 200 ms or less on a coarse pointer, and DR1 rules out springs.
| export const TOUCH_QUERY = '(pointer: coarse)'; | ||
|
|
||
| /** The viewport is compact: layout behaviours. */ | ||
| export const COMPACT_QUERY = '(width < 744px), (height < 500px)'; |
There was a problem hiding this comment.
spec:AST-012 FR9 (current) defines compact as width below the theme's effective md point or height below 500, used by this resolver and by Selector's adaptive, with no size numbers of their own. 744px keeps a number of its own and gives the popover at 744–767 px where FR9 gives the sheet.
| * is everything else. Pair `ios` with `pointer: 'coarse'` for a touch | ||
| * profile, such as touch motion tuned per platform. | ||
| */ | ||
| platform?: 'ios' | 'other'; |
There was a problem hiding this comment.
spec:AST-012 FR2 (current) closes the when vocabulary to width, height, pointer, contrast and motion: "Future environment fields require explicit additions to this closed vocabulary." platform needs that amendment first, or should come out of this pull request; AlertDialog's motion does not use it.
1c55503 to
6dca4bf
Compare
|
Addressed at 6dca4bf:
Waiting in the reviewers' queue: the spec decision (draft AST-094 FR4, FR5, FR7, FR8, DEC-1 and theme-tokens INV3; the alert's springs and durations are now theme motion roles) and the |
There was a problem hiding this comment.
This pull request is on hold for an owner decision: AlertDialog's iPhone and iPad motion rests only on draft spec:AST-094 (FR5, FR7, DEC-1), and that record's FR4 and DEC-1 forbid the theme-tunable touch motion this head adds through defineTheme({motion: {springs, durations, curves}}), so an engineering owner needs to settle which holds, and whether the two non-component experimental subpaths are an acceptable boundary under spec:AST-017 FR21. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request once the record says so, and the author may do so as an engineering owner. Separately from that decision:
- Under Reduce Motion the iOS fades last 404 ms on a spring, but
design:reduced-motionDR2 allows an opacity-only change of 200 ms or less, and DR4 bars theme values that lengthen it. - The changeset and docs say no click, key or assistive-technology activation reaches the alert during either transition, but during the entrance they still run
onActionandonOpenChange; gate them until the presentation completes or narrow the text. - The compact test's 744 px width contradicts
spec:AST-012FR9 and the compact definitionmainnow exports, and theplatformadaptation condition extends the vocabulary FR2 closes. - Land the stacked pull requests first and rebase, so this diff is only the AlertDialog motion commit instead of 31,567 authored lines.
[Automated review]
| // or an assistive-technology activation on an action, and Escape, do | ||
| // nothing until it is hidden. Focus stays where it is, so Dialog returns it | ||
| // to the opener when the fade ends. | ||
| const isLeaving = motion.isDriving && motion.isPresented && !isOpen; |
There was a problem hiding this comment.
This drops clicks, keys and Escape only while the alert leaves. During the entrance only the touch tracker consults the 435 ms window (:270), so a keyboard or assistive-technology activation of Delete still runs onAction, and Cancel or Escape still calls onOpenChange(false), while .changeset/alertdialog-touch-motion.md and the usage docs say nothing reaches the alert during either transition. Either gate these handlers on the same window as acceptsTouches() (with a keyboard-during-entrance test), or narrow the changeset, docs and file header to touches.
6dca4bf to
3b4bd41
Compare
|
/approve-spec 62c9b4a |
1 similar comment
|
/approve-spec 62c9b4a |
|
/approve-spec dd1c162 |
There was a problem hiding this comment.
Requesting changes: the touch entrance and fade-out, the inert leaving alert with toasts kept live above it, and the 320 px phone width match the AlertDialog record an engineering owner approved for this head, and a mouse on a desktop sees no change.
- The owner's real-device iOS Safari pass and the Android Chrome emulator recording (Chrome with Gboard: default, Remove animations and a slow profile), which the FR6/PR2 verification row and
spec:AST-094Platform support and DEC-27 require at the exact head, are still missing; the iPhone pass and the Android recording linked in the description were taken on earlier commits.
Once both are posted for the head you intend to merge, nothing else blocks; CI has not run yet because the pull request is a draft.
[Automated review]
|
/approve-spec c7f3449 |
There was a problem hiding this comment.
Requesting changes: the touch entrance and fade-out, the inert leaving alert with toasts kept live above it, and the 320 px phone width match the AlertDialog record an engineering owner approved for this head, and a mouse on a desktop sees no change.
- The owner's real-device iOS Safari pass and the Android Chrome emulator recording (Chrome with Gboard: default, Remove animations and a slow profile), which the FR6/PR2 verification row and
spec:AST-094Platform support and DEC-27 require at the exact head, are still missing; the runs in the description were taken on earlier commits.
Once both are posted for the head you intend to merge, nothing else blocks. CI has not run yet because the pull request is a draft.
[Automated review]
There was a problem hiding this comment.
Approval waits on an engineering owner: component:AlertDialog and architecture:layer-runtime are edited at this head, and the spec approval given on the previous commit does not carry over to it. This head only merges main, and the record text is the same as the text approved before, so an engineering owner (the author included, as an engineering owner) records the decision by commenting /approve-spec <full head SHA> on this pull request.
- The owner's real-device iOS Safari pass and the Android Chrome emulator recording (Chrome with Gboard: default, Remove animations and a slow profile), which the FR6/PR2 verification row and
spec:AST-094Platform support and DEC-27 require at the exact head, are still missing; the runs in the description were taken on earlier commits.
The touch entrance, the inert fade-out with toasts kept live above it, and the 320 px phone width behave as the record describes in Chromium, and a mouse on a desktop sees no change. CI has not run yet because the pull request is a draft.
[Automated review]
|
/approve-spec b86bb05 |
A top-layer ToastViewport moves its host into the latest open modal and back out. Each move renders the toast's card again, and the card's starting style applied once more. So a toast already on screen started a transform transition at every move: a Dialog, a modal Drawer or a scrim sheet that opened or closed over it. The card's starting style now applies only until the toast's row starts to open, as the row's own does, and the row passes that state to the card. A move then renders an entered card at rest and starts nothing. This replaces the two private start properties the row set on the card, so they leave the docs and the registry's list too.
…it/c18-alerts-pr2
There was a problem hiding this comment.
Requesting changes. The AlertDialog touch look, the inert fade-out with toasts kept live above it, and the 320 px phone width match the owner-approved component:AlertDialog record and behave as described in Chromium, but this head also merges #10223 and the exact-head device runs are still missing.
- Drop the merge of #10223 from this branch and land that Toast fix through #10223: it is a separate change to every modal's toast host, and it takes this pull request from 1,993 to 2,124 authored lines, past the 2,000-line scope limit.
.changeset/toast-moved-card-still.mdsays a toast "no longer restarts its card's slide", but on main a moved card already stays still (offset 0 px, identity transform and full opacity on every frame; only a transition between identical values starts), so that wording should say what actually changes when it lands in #10223.- The owner's real-device iOS Safari pass and the Android Chrome emulator recording (Chrome with Gboard: default, Remove animations and a slow profile), which the FR6/PR2 verification row and
spec:AST-094Platform support and DEC-27 require at the exact head, are still missing.
CI has not run because the pull request is a draft.
[Automated review]
| '@astryxdesign/core': patch | ||
| --- | ||
|
|
||
| [fix] A toast already on screen no longer restarts its card's slide when a Dialog, a modal Drawer or a scrim sheet opens or closes over it. Its card now enters only once, as its row does. |
There was a problem hiding this comment.
On main nothing visibly restarts here: once a row has started to open it sets the card's starting values to opacity 1 and a 0 px slide, so a move starts a transform transition between identical values. A per-frame probe across a Dialog close on main keeps the card's offset at 0 px, its transform at identity and its opacity at 1, and the host-move spec run against main fails only on its list of started transitions. Suggest saying what changes, for example: "A toast's card no longer starts a CSS transition when a Dialog, a modal Drawer or a scrim sheet opens or closes over it; it already stayed still." This belongs with #10223 once its merge leaves this branch.
|
/approve-spec d244534 |
There was a problem hiding this comment.
Requesting changes. The AlertDialog touch look, the inert fade-out with toasts kept live above it, and the 320 px phone width match the owner-approved component:AlertDialog record and behave as described in Chromium and WebKit, and the Toast change from #10223 has left this pull request now that #10223 is on main.
- The owner's real-device iOS Safari pass and the Android Chrome emulator recording (Chrome with Gboard: default, Remove animations and a slow profile), which the FR6/PR2 verification row and
spec:AST-094Platform support and DEC-27 require at the exact head, are still missing; post both for the head intended to merge.
CI has not run because the pull request is a draft.
[Automated review]
Repeating "Delete item", then "Delete", moves the toast the alert's action raised into each alert and back out, and the action updates the toast in place. The case records every transition or animation that starts on the toast's row or card. The first alert's entrance shows up, and the later alerts start nothing.
|
/approve-spec d0f8d96 |
There was a problem hiding this comment.
Requesting changes. The AlertDialog touch look, the inert fade-out with toasts kept live above it, and the 320 px phone width match the owner-approved component:AlertDialog record and pass their browser cases in Chromium and WebKit at this head, including the new case that a toast the alert raises enters only once.
- The owner's real-device iOS Safari pass and the Android Chrome emulator recording (Chrome with Gboard: default, Remove animations and a slow profile), which the FR6/PR2 verification row and
spec:AST-094Platform support and DEC-27 require at the exact head, are still missing; post both for the head intended to merge.
CI has not run because the pull request is a draft.
[Automated review]
The header's second @input sentence ran to 26 words with no verb. It now reads as two sentences, each with its verb.
|
/approve-spec 773374e |
There was a problem hiding this comment.
Requesting changes. The AlertDialog touch look, the inert fade-out with toasts kept live above it, and the 320 px phone width match the owner-approved component:AlertDialog record; the pull request is unchanged since the last review.
- Regression:
mainmovedLayer/inputHold.tsto realm-safe node checks (utils/nodeType) and this head conflicts with it, so mergemainand write the new checks inisInGlobalHost(inputHold.ts:118,:122) and inuseAlertMotion.ts:177withisNode,isElementandisHTMLElement, so the toast-host exemption also holds for a toast in another window's document. - The owner's real-device iOS Safari pass and the Android Chrome emulator recording (Chrome with Gboard: default, Remove animations and a slow profile), which the FR6/PR2 verification row and
spec:AST-094Platform support and DEC-27 require at the exact head, are still missing; post both for the head intended to merge, which after the merge is a new head.
The non-blocking INV29 suggestion on the AlertDialog.tsx file header still stands. CI has not run because the pull request is a draft.
[Automated review]
| let node: Node | null = target instanceof Node ? target : null; | ||
| node != null; | ||
| node = parentAcrossShadow(node) | ||
| ) { | ||
| if (node instanceof Element && isModalOutletHost(node)) { |
There was a problem hiding this comment.
Regression: since the last review, main moved this file's node checks to isNode and isElement from utils/nodeType, so a layer's input hold reads nodes from another window's document (a same-origin iframe or a Picture-in-Picture window), and this head now conflicts with that change at the imports. After the merge these two instanceof checks would be the hold's only realm-bound ones: a toast row created in another window's document fails target instanceof Node, so holdsTouch and holdsPressAt would hold it during the alert's fade (spec:AST-090 FR13). Merge main and write them as isNode(target) and isElement(node), and the refocus check in useAlertMotion.ts:177 as isHTMLElement(focused).
| * @input Uses React, StyleX, Dialog, Layout, Heading, Text, Button and the | ||
| * touch presentation resolver. It also uses the action-group tracking | ||
| * (hooks/useActionGroupTracking), the press-group context | ||
| * (hooks/pressGroupContext) and the group pointers | ||
| * (hooks/useGroupPressTracking). It takes its touch motion from | ||
| * useAlertMotion and the alert entries of the UIKit constants table |
There was a problem hiding this comment.
Non-blocking (INV29): with this rewrite the file header is 18 lines (15 on the base), past the record's "about 12 lines at most", and @input spans six lines. One sentence of names keeps it short:
* @input React, StyleX, Dialog, Layout, Heading, Text, Button,
* useTouchPresentation, the action-group hooks, useAlertMotion and alertControllerA leaving alert's hold left a press on a toast alone only when the press landed on a node of this window, and the alert gave its blurred action focus back only in the same way. In a same-origin iframe, an instanceof check against this window's classes fails for the frame's nodes. Both now use the realm-safe node checks from meta#10224, so a toast in a leaving alert takes a tap in an iframe too, and a reopen gives focus back there. Same-document behavior is unchanged.
The alert closes when its exit ends, outside the tap. A new case counts each DOM change after which the toast's card sits in a dialog that no longer displays, across three alerts. It must be none.
|
/approve-spec 362ea7f |
There was a problem hiding this comment.
Requesting changes. The AlertDialog touch look, the inert fade-out with toasts kept live above it, and the 320 px phone width match the owner-approved component:AlertDialog record, and the realm-safe node checks from main now reach the new code in Layer/inputHold.ts and useAlertMotion.ts.
- The owner's real-device iOS Safari pass and the Android Chrome emulator recording (Chrome with Gboard: default, Remove animations and a slow profile), which the FR6/PR2 verification row (
AlertDialog.spec.md:233) andspec:AST-094Platform support and DEC-27 require at the exact head, are still missing for this head.
The non-blocking INV29 suggestion on the AlertDialog.tsx file header still stands. CI has not run because the pull request is a draft.
[Automated review]
Stack: #8084 → #8095
This pull request lands before #8095, which builds on it. #10086, now on main, keeps a toast the alert's action raises from entering twice when the alert closes; #10223, also on main, keeps the alert's moves from starting a transition on that toast; and #10251, also on main, hands that toast back in the commit that closes the alert, so no frame paints without it.
Behavior module: AlertDialog's touch motion (
useAlertMotion, inpackages/core/src/AlertDialog/useAlertMotion.ts), with the Layer input hold it uses (packages/core/src/Layer/inputHold.ts).User need
On a phone, AlertDialog plays the theme's desktop entrance: it rises 16 px and grows from 95% while the dimming pops on, and it closes at once. The iOS alert shrinks into place from 1.2 while it and the dimming fade in, and fades out to close. Main already holds a tap during the entrance, through Dialog's input hold.
Problem and solution fit
spec:AST-003FR16).Current specification
component:AlertDialogFR6, FR7 and FR9, with DEC-4: an alert's motion is not a gesture, so it plays the theme's tokens on every pointer (spec:AST-094FR45; Specs decision, 2026-11-02). The touch exit plays even with the dialog exit switch off (spec:AST-090FR14,spec:AST-094FR7). An alert open in server markup opens at rest (spec:AST-013FR13). FR6's turn-back from mid-transition is a recorded gap with its own pull request; With #8342 merged, Dialog holds pointer input while the alert enters, and the leaving alert holds its input with the same Layer hold, so FR7 ships whole. AlertDialog keeps no input gate of its own, apart from an Escape guard. The toast viewport stays visible and operable above the current native modal (spec:AST-003FR16, FR18), also while the hold keeps a leaving modal's content inert;architecture:layer-runtimegains that sentence. It builds on #9706, #9771 and #8342, all merged.Public delta and caller burden
No API change. Under a touch presentation the look, the held input while the alert leaves and the phone width change. A mouse keeps today's motion, and a caller's
widthstill wins. The private modal-outlet registry gains a mark for global hosts; no public export changes.Design and alternatives
AlertDialog gives Dialog its own keyframes under a touch presentation, so the browser plays them on the compositor. The dimming inherits the alert's timing (a backdrop inherits from its dialog), which also carries Reduce Motion's 200 ms. The hook closes the dialog at the fade's end, and holds the dialog's input with the Layer module's layer-scope hold until then. Inert content does not stop the dialog's own cancel event, so AlertDialog drops Escape while it leaves.
The shared hold keeps the toast viewport live, so every caller of a dismissal hold gets it, not only AlertDialog. ToastViewport marks the host it moves into the latest open modal. A dismissal hold leaves marked hosts out of the inert content, and its press hold and the gesture host's gate leave a press on them alone; a presentation's hold still holds a press anywhere, as on main. The hold's shield is a top-layer element shown after the toast viewport, so the hold then sends the top-layer entry signal that a non-modal sheet already sends, and the toast viewport re-enters the top layer above the shield. Holding a narrower element inside the dialog would not do it: the shield still covers the viewport from the top layer, and the press hold listens on the window. The hold's and the alert motion's node checks are aligned with #10224's realm-safe guards (
isNode,isElement,isHTMLElement): a toast in a dismissing alert in a same-origin iframe stays live, and a reopen there gives the action its focus back. Same-document behavior is unchanged.Evidence
useAlertMotion.tsis byte-identical between 058b372 and this head. The input hold's inert set and the toast viewport's top-layer order changed since, andAlertDialog.tsxnow passesonActionstraight to the button, so a recording at this head, with the new story, is pending. The recording at 058b372 covers the normal profile, Remove animations and a slow profile (4× CPU throttling). Every frame was logged with the dialog's opacity, scale and position, the dimming's opacity, and each pointer event:Scope
Testing
This head (362ea7f) merges main into 773374e, with #10251, and adds two commits: this change's own node checks aligned with #10224's realm-safe guards, with same-document behavior unchanged, and a check that a toast the alert raises stays painted when the alert closes. The merge leaves this change's own lines in its 16 files as they were at 773374e. Gates at this head, on main 9a8d14d:
pnpm build,pnpm typecheck, Storybook, the Layer, AlertDialog, Toast, Dialog, gestures, hooks and ButtonGroup units (2,757) and AlertDialog's accessibility contract (5) pass.Local gates at c7f3449, on main b9e3dc2. That head merges main and takes its press-group marker (through the group's context) into
AlertDialog.tsx; the other 15 files are unchanged:CI=true pnpm lint(no errors), the build,pnpm typecheck, Storybook, the AlertDialog, Toast, Layer, Dialog, hooks and ButtonGroup units (1,876) and AlertDialog's accessibility contract (5) pass. Both AlertDialog interaction specs, the toast viewport's move spec and Dialog's touch entrance: Chromium twice, 33 of 33 each; WebKit in CI's container twice, 62 passed (the 4 skipped cases are Chromium-only).The same change at dd1c162, on main 813c58c:
CI=true pnpm lint(no errors), the build,pnpm typecheck, Storybook,pnpm test:ui(21,300),pnpm test:node(16,742),check:knowledge,check:repo,specs:for --diffandreview:prepass.test:noderan with plain git first on the path, as CI's runners have it: with the devserver's git wrapper on a loaded box, three files this change does not touch timed out (a CLI text and JSON parity hook, the knowledge check's delegation case and the search ranker's whole-name case), and with plain git they pass on this head and on main alike, in three paired rounds on two cores and in a full run of both at once.api:report --checkreports drift already on main, none of it from this change.pnpm typecheck.Writing rubric results
component:AlertDialog: FR6 plays the theme's tokens, with the exit fade on even while the dialog exit switch is off; its turn-back clause carries an implementation gap, listed under Current-state impact. FR7 ships whole: its gap sentence and its Current-state entry are gone, and its verification row names the entrance and exit cases with all five cells. DEC-4, readiness,system_specs, Governing rules and the FR6/PR2 verification row match what ships. No motion role is added.architecture:layer-runtime: one addition to the modal-outlet paragraph, in the present tense: an input hold can make a leaving modal's content inert, the host stays live, and the hold announces its shield's entry, so toasts stay operable above the shield. It names what the code does, with no change history.ToastViewport.modalHost.test.tsx, already in the record'sverified_by.