Editor has no 'last saved' indicator — Save button is enabled when paths exist but the user has no way to tell when the design was last persisted to the Gallery #215
Labels
No labels
blocked:commit-ready-failed
blocked:gate-fetch
blocked:gate-lint
blocked:gate-plan
blocked:gate-research
blocked:needs-attention
blocked:needs-decision
blocked:needs-human
blocked:no-changes
blocked:verify-failed
bug
deferred
feature-request
in-progress
needs-decompose
needs-triage
quickfix
security/medium
triage-approved
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Mark/Kimi_Agent_Brother_10_Digitizing_App#215
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Finding
src/components/editor/EditorHeader.tsx's Save button (line 220) is enabled whencanSaveis true (paths.some((p) => p.visible && p.nodes.length > 0)). Clicking it dispatcheshandleSaveand toasts "Saved" or "Updated".But the button always reads "Save" — there's no visual difference between "design has been edited since last save" and "design is clean." After a successful save, the user sees the toast (transient), and the Save button stays "Save" forever.
A user editing a design for 20 minutes:
There's no "this design is dirty" indicator.
grep -n 'isDirty\|lastSaved' src/components/editor/—isDirtyis the variable name inuseEffect(per #161) but it's not exposed to the header.Where
src/components/editor/EditorHeader.tsx:220-250src/pages/Editor.tsx:684(per #161)grep -n 'lastSaved\|savedAt' src/returns 0src/pages/Editor.tsx:835(addToast('success', ...))Suggested fix shape
Two complementary changes:
isDirtyis already tracked (per #161); plumb it as a prop toEditorHeader.lastSavedis set in thehandleSavecallback after a successful save.formatDistanceToNowis fromdate-fns(already a dependency per the rest of the app).Both indicators reset on save and re-appear on edit. Combined, they tell the user "this design is dirty, you haven't saved in 5 minutes" without requiring the user to click Save and see the toast.
Severity
Low. The user can save and see the toast. The indicator is a polish improvement.
Discovered by
Gap analysis (2026-10-02) of editor save UX.
Related
isDirtyflag is the same state.Shipped in commit
7c36f20on main.Two complementary indicators:
Save * indicator - the Save button now flips from Save to Save * when isDirty is true (Editor.tsx already tracked isDirty per #161; this just makes the header render it). Resets on save, re-appears on edit.
Saved 5 min ago subtitle - appears under the path/stitch/stop totals once a successful save stamps lastSaved. Editor.tsx now tracks lastSaved (Date | null) and sets it from both handleSave and handleSaveAsNew (both write to the gallery, so both count). Uses date-fns formatDistanceToNow (already a dep, not previously imported in src/).
Both indicators stay hidden when totals.paths === 0 so the header does not claim a save against an empty design.
5 new tests cover the Save/Save * label, lastSaved rendering, lastSaved+paths, and the empty-design guard. 1056 vitest tests pass; tsc + eslint clean; vite build green.