Projects BibleWeb Personal Translation Builder Ctrl+S explicit save
Planned

Ctrl+S explicit save

Area: Personal Translation Builder Milestone: v3

Context

Problem: Word selections are saved automatically, but users accustomed to desktop applications expect Ctrl+S to trigger a save. Without this feedback, users may worry their work isn't being saved.

Solution: Add a Ctrl+S keyboard listener in the interlinear popup that triggers the existing save API and shows a brief "Saved" toast notification for reassurance.

Not included: Undo/redo or save history. This is just a manual trigger for the existing auto-save mechanism.

Functional

When the interlinear popup is open, pressing Ctrl+S saves all current word selections to the server and shows a brief confirmation.

User flow:

  1. User is in the interlinear popup with word selections
  2. Presses Ctrl+S
  3. All selections for the current verse are saved to the server
  4. A brief "Saved" toast notification appears (1-2 seconds)

Edge cases:

  • If not authenticated, saves to localStorage only (no server call)
  • If already up to date (no changes), still shows "Saved" for reassurance
  • Prevents browser's default Ctrl+S behavior (save page dialog)

UX & Design

Keyboard shortcut: Ctrl+S (Cmd+S on Mac)

Toast notification:

  • Text: "Saved" (or "Opgeslagen" in Dutch)
  • Duration: 1.5 seconds
  • Position: bottom of the interlinear popup
  • Style: subtle, non-intrusive

Technical

Implementation:

  • Add keydown listener in InterlinearPopup.svelte
  • Check for e.key === 's' && (e.ctrlKey || e.metaKey)
  • Call e.preventDefault() to block browser save dialog
  • Call existing syncToServer() function
  • Show toast notification

Files:

  • apps/web/src/lib/components/bible/InterlinearPopup.svelte (modify — add keyboard listener)

Status

Current: PLANNED Milestone: v3 Priority: Low — auto-save already works, this is a comfort feature

History:

  • Feature requested as part of the personal translation builder UX polish

Dependencies:

  • Requires: word selection persistence (DONE), server sync API (DONE)
  • Blocks: nothing