aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers/specs/2026-08-20-compose-and-send-design.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/superpowers/specs/2026-08-20-compose-and-send-design.md')
-rw-r--r--docs/superpowers/specs/2026-08-20-compose-and-send-design.md45
1 files changed, 40 insertions, 5 deletions
diff --git a/docs/superpowers/specs/2026-08-20-compose-and-send-design.md b/docs/superpowers/specs/2026-08-20-compose-and-send-design.md
index f410d00..aade2d1 100644
--- a/docs/superpowers/specs/2026-08-20-compose-and-send-design.md
+++ b/docs/superpowers/specs/2026-08-20-compose-and-send-design.md
@@ -262,14 +262,49 @@ declares a struct field named `signals`.
countdown through to completion. It is modelled on Gmail's undo-send, and it is
what settles what "cancel" can mean here.
+Three rows, the same three in every state, so nothing reflows and the window
+never jumps:
+
+```
++-----------------------------------------+
+| Sending in 5... | status label
+| ##################................. | bar, DETERMINATE, draining
+| [ Undo ] | enabled
++-----------------------------------------+
+
++-----------------------------------------+
+| Sending... | then: Filing sent copy...
+| #######################################| bar, INDETERMINATE
+| [ Undo ] | visible, disabled
++-----------------------------------------+
+```
+
+**The bar changes mode, it does not change place.** During the countdown it is
+determinate and drains as the seconds pass, because a countdown has measurable
+progress. It becomes indeterminate (`setRange(0, 0)`) when `send_command`
+starts, because a send does not. This is why item 134's widget class must expose
+both modes rather than hardcoding the indeterminate one.
+
+**Undo stays visible after it disables**, rather than disappearing. A control
+that vanishes re-lays out the popup mid-operation, and a greyed Undo says why
+cancelling is no longer possible where an absent one only looks like it was
+never offered.
+
+The stages, in order:
+
```
-Sending in 5... [ Undo ] countdown running, Undo live
-Sending... [ Undo ] send_command running, Undo disabled
-Filing sent copy... DraftStore writing to the sent folder
-Removing draft... the draft revision is unlinked
- popup and composer both close
+Sending in N... the countdown, Undo live
+Sending... send_command running, Undo disabled
+Filing sent copy... DraftStore writing to the account's sent folder
+Removing draft... the draft revision is unlinked
+ popup and composer both close
```
+**The status label takes its width from the longest string it can hold, in the
+current language, not from its content.** Italian "Rimozione della bozza..." is
+longer than "Removing draft...", so a label sized to content resizes the popup
+between stages, which is the jumping the fixed layout exists to avoid.
+
**The delay is where cancelling is safe, and it is the only place it is.**
Nothing has reached a server during the countdown, so Undo means genuinely
nothing happened. Killing `send_command` once it is running does not: the