1212 - [ Why it is a list, and why it is required] ( #why-it-is-a-list-and-why-it-is-required )
1313 - [ Where the zone blocks: does it write to the control it sits in?] ( #where-the-zone-blocks-does-it-write-to-the-control-it-sits-in )
1414 - [ The third question: whose value is it?] ( #the-third-question-whose-value-is-it )
15+ - [ The fourth question: whose wait is it?] ( #the-fourth-question-whose-wait-is-it )
1516 - [ On something you draw yourself] ( #on-something-you-draw-yourself )
1617 - [ When the affordance should sit OUTSIDE instead] ( #when-the-affordance-should-sit-outside-instead )
1718 - [ navi steps back; a plain ` onClick ` does not] ( #navi-steps-back-a-plain-onclick-does-not )
@@ -278,7 +279,7 @@ that gesture. Whose **value** an element carries is a separate question, and
278279group around it, so what it holds never joins that value (see
279280[ form_changed.md] ( ./form_changed.md#a-control-that-answers-for-itself ) ).
280281
281- The three come apart, which is why they are three props:
282+ They come apart, which is why they are separate props:
282283
283284| the element | says |
284285| ------------------------------------------------------- | --------------------------------------------------------------------------- |
@@ -291,6 +292,39 @@ Reading `standalone` as "ignore everything around me" is the trap: `disabled`,
291292because "what do I hold" and "may anything be changed here" are not the same
292293question.
293294
295+ ### The fourth question: whose wait is it?
296+
297+ A running action says two things at once. To the control: I am mid-action —
298+ busy, a second press refused, the error callout if it fails. To everything
299+ around it: nothing here moves on — the form does not submit, and the popup does
300+ not close (see
301+ [ popup_open.md] ( ./popup_open.md#the-popup-owns-its-open-state ) ).
302+
303+ The second half is a promise about an answer: a send holds something neither
304+ committed nor given up, so the screen showing it stays. It is exactly wrong for
305+ a run that was started to be LEFT running — activating a service worker update,
306+ which lands only once the browser switches over and can be held by the page's
307+ own in-flight work for minutes. Waiting is not the point; the app goes on being
308+ used and the feedback is somewhere else entirely. ` actionStandalone ` says the
309+ wait is the control's own:
310+
311+ ``` jsx
312+ < Button action= {() => activateUpdate ()} actionStandalone>
313+ Activate
314+ < / Button>
315+ ```
316+
317+ Everything the control does for itself stays: it renders busy, it refuses a
318+ second press, and it raises the error callout — which is why it keeps ` action `
319+ rather than re-implementing the three by hand. What changes is that no ancestor
320+ is told: the form around it submits, and the panel it sits in closes on Escape,
321+ on the backdrop and on its cross.
322+
323+ The question that picks it is what closing over the run would lose. An answer
324+ being sent: everything — the popup is the only place its failure can be read,
325+ and ` actionStandalone ` there is how a save fails behind a closed popup. Something
326+ the app watches from somewhere else: nothing — it was never being watched here.
327+
294328### On something you draw yourself
295329
296330` selfInteractions ` is a ` Box ` prop too, so an affordance does not have to become
0 commit comments