Repository navigation
Conversation
…box (AST-078, draft) A draft system spec amending spec:AST-059 FR8: an anchor-mode layer resolves against the box its anchor paints after transforms, in every engine, from its first frame and while the transform changes; a transformed anchor's painted box becomes the runtime's second observation where the engine resolves the untransformed box. Decisions pending owner review.
|
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.
Approval of this draft waits on a maintainer decision: it intentionally changes spec:AST-059 FR8 (and architecture:layer-runtime INV12) from one runtime observation to two, so a maintainer needs to update that existing spec for the change, or decline it, and to approve or reject the new FR1–FR3 (painted-box placement in every engine, from the first frame and while the transform moves). Two points in the record also need fixing before it can be approved:
- FR2 requires following a transform that changes while the layer is open, but FR3 and DEC-2 leave no observation to notice one that starts on an anchor that had no transform at open (the FR2 row's "translated by a 300ms transition while open"), so one of them should state its scope explicitly.
- The open-work search says no open pull request touches transformed anchors, but #5398 handles an anchor inside an animating ancestor transform by delaying the show, so it should be named along with how FR2 relates to it.
[Automated review]
| - **FR2 — From the first frame and while it moves.** A layer opened while its | ||
| anchor is under a transform MUST paint against the painted box in its first | ||
| frame. When a transform on the anchor or an ancestor changes while the layer | ||
| is open, including an animated one, the layer MUST follow the painted box in | ||
| every frame. | ||
| - **FR3 — Untransformed anchors are unchanged.** A layer whose anchor has no | ||
| transform on it or its ancestors MUST be placed exactly as `spec:AST-059` | ||
| places it, with no added observation. |
There was a problem hiding this comment.
FR2 and FR3 pull against each other for an anchor that has no transform when the layer opens and gains one while it is open (the FR2 verification row's "translated by a 300ms transition while open"). FR2 requires following that transform in every frame, but FR3 forbids any added observation for an untransformed anchor (its row fails on "an observation started for it"), and DEC-2 limits the second observation to an anchor already under a transform. Please scope one of them explicitly: for example, limit FR2's second sentence to an anchor under a transform at open and name the appearing-transform case as a non-goal, or let FR3 and DEC-2 admit the watch that notices a transform starting while the layer is open.
There was a problem hiding this comment.
Fixed in ecfed2c by letting FR3 and DEC-2 admit the watch. FR2 now covers a transform that starts, changes or ends while the layer is open. DEC-2 makes the anchor's painted box the second observation only in engines that resolve the untransformed box, read before the first paint and while a layer is open. FR3 keeps untransformed geometry unchanged and adds no observation in an engine that resolves the painted box. Following only a transform present at open is now the rejected line, because a trigger that a keyboard or a sliding panel starts moving after the layer opens would be left behind. The body also names #5398 now: it delays a show until a finite ancestor animation settles, and FR2 composes with it.
…s open, scopes the second observation to engines that need it, and registers its DEC headings
There was a problem hiding this comment.
Approval of this draft still waits on a maintainer decision: it intentionally changes spec:AST-059 FR8 and architecture:layer-runtime INV12 from one runtime observation to two, so a maintainer needs to update that existing spec for the change (or decline it) and approve or reject FR1–FR3 and DEC-1/DEC-2 as now written, including that engines resolving the untransformed box observe every open anchored layer's painted box, transformed or not. The FR2/FR3 scope and #5398 points are resolved. One record fix remains: the Current-state impact gives both observations the cadence "thereafter only while the layer is open", which would also replace the visibility observation's current "thereafter only when the anchor's visibility changes", so please keep that clause and state the painted-box cadence separately.
[Automated review]
| while the layer is open. Each is read before the layer's first paint and | ||
| thereafter only while the layer is open. FR8's guarantee that a layer never |
There was a problem hiding this comment.
This gives both observations one cadence, "thereafter only while the layer is open". For the visibility observation that replaces spec:AST-059 FR8's current "thereafter only when the anchor's visibility changes", and the amendment doesn't list that as a change. Suggest keeping FR8's visibility clause as it is and stating the painted-box cadence on its own, for example: "Visibility is read before the first paint and thereafter only when it changes; the painted box is read before the first paint and thereafter only while the layer is open." If the new visibility cadence is intended, name it as part of the FR8 change so the owner rules on it.
There was a problem hiding this comment.
Fixed in 45b0e40. Current-state impact keeps FR8's visibility clause as it is (read before the first paint and thereafter only when it changes) and states the painted-box cadence on its own: read before the first paint and thereafter only while the layer is open, in an engine that resolves the untransformed box.
…es the painted-box cadence on its own
There was a problem hiding this comment.
Approval of this draft waits on a maintainer decision: it intentionally changes spec:AST-059 FR8 and architecture:layer-runtime INV12 from one runtime observation to two, so a maintainer needs to update that existing spec for the change (or decline it) and approve or reject FR1–FR3 and DEC-1/DEC-2 as written, including that engines resolving the untransformed box read every open anchored layer's painted box while it is open. The visibility-cadence fix is in, the record validates, and nothing else needs to change while that decision is pending.
[Automated review]
Why: In Safari, a menu ignores a CSS transform on its button's panel. It opens where the button would be without the transform. On an iOS 26.2 simulator, a popover painted 164px below its button.
What: This draft asks the layer runtime to place each layer against the button a person sees, in every browser. It lets the runtime take a second measurement where a browser needs it. Buttons without a transform are unaffected.
How to check: In Safari, open the Popover story, shift its content up with a CSS transform, and open the popover.
Exact decision needed
Whether
spec:AST-059FR8 admits a second runtime observation, so a layer whose trigger sits under a CSS transform lands against the trigger a person sees.Existing authority searched
spec:AST-059(current, cixzhang): FR8 allows one observation and no measuring after paint; this separate draft carries the amendment.architecture:layer-runtimeINV12 restates FR8.spec:AST-002FR2: a caller placement prop is derivable.Decision
Proposed; pending owner review by cixzhang. FR1: placement, fallbacks and the off-screen hold use the anchor's painted box in every engine, and the runtime owns the correction. FR2: from the first frame, and in every frame while a transform changes. FR3: untransformed anchors are unchanged. DEC-2: that is FR8's second observation, only where needed and only while open.
Rejected alternatives
A caller placement or coordinates prop; measuring after paint and moving the layer.
Claim scope and non-goals
No public API change; fixed and custom positioning and engines without anchor positioning stay out.
Evidence and implementation relationship
The Popover story, its root under
translate3d(0, -160px, 0):In Safari a ComplexSelector panel covers its translated trigger, and an open layer never follows an animated transform. Implementation follows once the owner decides.
Writing rubric results
Rejected:line per DEC.Scope
Validation
pnpm check:knowledgealigned; Prettier andgit diff --checkclean.