Skip to content

docs(planning): log the persistent saved-state indicator todo - #135

Merged
dknauss merged 1 commit into
mainfrom
docs/persistent-saved-indicator-todo
Aug 10, 2026
Merged

docs(planning): log the persistent saved-state indicator todo#135
dknauss merged 1 commit into
mainfrom
docs/persistent-saved-indicator-todo

Conversation

@dknauss

@dknauss dknauss commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Captures the design question raised at Phase 25's checkpoint: should the save marker persist?

The problem

The indicator is event feedback that erases itselfmaestro.js ~L1748 sets a 2s timer flipping savedidle, blanking both glyph and SR text. Seconds after a rename commits there's no on-screen answer to "did that save?", and the only recourse is to change something else and watch again.

Phase 25 reserved the status slot so it stopped shoving the toolbar sideways — the jarring half. This is the other half, and it's a design change rather than a bug fix, so it was deliberately kept out of 25-02 rather than smuggled in under the layout work.

Why persistent is the WordPress-native answer

Core doesn't use the self-erasing toast:

Surface Pattern
Block editor "Saved" persists until the document is dirty again
Classic autosave "Draft saved at 3:15:45 pm." — persistent, timestamped
Customizer Encoded in the control: Publish → Published (disabled)
Quick Edit No chip — the updated row is the feedback

Gutenberg is the closest precedent because both autosave: the user never presses Save, so they need standing reassurance rather than a moment of it.

The proposal keeps it glyph-only (the toolbar is icon-only by design, slot is 24px) and stays empty until the first save, since claiming "Saved" on entry would be a small lie.

Two caveats, recorded rather than left to be discovered

1 · It collides with the modified dot. That per-row means "differs from the WordPress default"not "unsaved". A persistent toolbar check alongside it puts two persistent indicators on screen meaning different things, and the difference isn't self-evident. The todo lists options including the one it explicitly doesn't recommend: repurposing the dot to mean "unsaved" would break the documented WCAG 1.4.1 non-colour-signal reasoning at maestro.js ~L136-146.

2 · The live region wants a listen, not an assumption. role=status + aria-live + aria-atomic="true" already pairs with an explicit speak() on the same transition — a double-announcement risk. Pre-existing rather than introduced, but persistence makes it more noticeable, and this is the natural moment to check.

One correction to something I said out loud

I'd flagged that the error state might also self-erase and be worth checking. It doesn't — the timer is gated on if ( ok ), so an error correctly persists until the next change. Verified before writing this up.

🤖 Generated with Claude Code

The save indicator is event feedback that erases itself: maestro.js ~L1748 sets
a 2s timer flipping 'saved' back to 'idle', blanking both the glyph and the SR
text. Seconds after a rename commits there is no on-screen answer to "did that
save?", and the only recourse is to change something else and watch again.

Phase 25 reserved the status slot so it stopped shoving the toolbar sideways —
the jarring half. This is the other half, and it is a design change rather than
a bug fix, which is why it was deliberately kept out of 25-02 rather than
smuggled in under the layout work.

Core does not use the self-erasing toast. Block editor persists "Saved" until
the document is dirty again; classic autosave persists a timestamp; the
Customizer encodes it in the action control; Quick Edit lets the updated row BE
the feedback. Gutenberg is the closest precedent because both autosave, so the
user never presses Save and needs standing reassurance rather than a moment of
it. The proposal keeps it glyph-only (the toolbar is icon-only by design and the
slot is 24px) and stays empty until the first save, since claiming "Saved" on
entry would be a small lie.

Two caveats recorded, both raised in review rather than discovered later:

1. It collides with the existing per-row modified dot, which means "differs from
   the WordPress default" — NOT "unsaved". Two persistent indicators meaning
   different things is a decision to take deliberately, and the note lists the
   options including the one NOT recommended (repurposing the dot would break
   the documented WCAG 1.4.1 non-colour-signal reasoning).
2. The live region pairs role=status + aria-live + aria-atomic with an explicit
   speak() on the same transition, risking double-announcement. Pre-existing
   rather than introduced, but persistence makes it more noticeable and this is
   the natural moment to listen.

Also corrects a worry I had raised out loud: the ERROR state does not
self-erase. The timer is gated on `if ( ok )`, so an error correctly persists
until the next change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@dknauss
dknauss merged commit dcfbd1d into main Aug 10, 2026
14 of 15 checks passed
@dknauss
dknauss deleted the docs/persistent-saved-indicator-todo branch August 10, 2026 04:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant