ModalRenderer
Modal -- a trigger on the surface, and a dialog behind it.
Not a container. The guide calls this a "Modal Entry Point": what the surface shows is the trigger child, and the content child exists only while the dialog is open. So this renderer draws one of its two children and holds the other in reserve, which is why a closed Modal composes nothing of its content -- and why an unopened modal's subtree costs no instances.
The trigger's taps are intercepted, and its own action does not run. "The modal logic intercepts interactions (taps/clicks) on the trigger" is the guide's own sentence, and it has to be read that strongly to work at all: every trigger in the corpus is a Button, and a Button consumes its own clicks -- a wrapper waiting for one that got through would never open. So the tap's release is taken in the pointer input's PointerEventPass.Initial pass, before the child sees it; see interceptTaps, which says why it is the release and nothing earlier. The cost is real and worth naming: a trigger carrying an action does not dispatch it, so an agent that wanted to be told the modal opened does not find out. Opening the dialog and dispatching is not available as a third option -- the two would have to be the same gesture, and a Button that received it would take it.
What the interception does not reach is a pointer, and that is a real gap rather than a rounding error. It is a pointerInput, so it sits on the touch and mouse path only: a keyboard Enter on the focused trigger, and an accessibility service activating it, both go straight to the Button's own clickable -- which dispatches the trigger's action and leaves the dialog shut, the exact inverse of what a tap does. The semantics block below was written to close the accessibility half and does not, because a merging node does not absorb a child that merges too, so the Button stays a separately activatable node of its own. A Modal whose trigger is disabled by a failing check is open to a tap for the same reason: this node cannot see the child's enabled state. Closing all three means the trigger opening the modal itself rather than having its input stolen, which is a change to how a renderer reaches its children.
Closing is a button, a tap outside, and the platform's back gesture. The guide asks for a mechanism and offers three; Compose's Dialog already carries the second and third, and the explicit control is here because the other two are invisible. Its name comes from LocalA2uiStrings -- a Modal has no text in the catalog to borrow, which is the same bind a picker's confirm and cancel are in.
The dialog is a centred surface rather than a bottom sheet. The guide splits the two by platform -- popup on desktop, sheet on mobile -- and this module draws one surface for every target it publishes to; a host that wants the sheet on Android registers its own Modal renderer, which is the same escape hatch Icon offers. A renderer arriving as a modal's content once segfaulted Kotlin/Native when it was built on a Material 3 Surface, and the Dialog did not prevent it; what does is the key on each component's Render call, which ModalScrollSwapTest holds on this path (#31).
Open-ness is the renderer's state, like Tabs's selected index. The catalog gives a Modal nothing to bind it to, so an agent can neither open one nor learn that it is open.