Transcription Read Mode — Final Spec

A focused reading experience for completed transcriptions. Uses the clean split layout: PDF scan on the left, flowing prose on the right. All editing chrome is stripped — no block borders, no comment threads, no toolbars. The text reads like a letter, not like an editing interface.

Familienarchiv
Final
2026-04-05 · @leonievoss
Design rationale

Transcribe mode is for editing. But most visits to a completed transcription are for reading — comparing the handwriting with the typed text, sharing with family, or just revisiting a letter. Read mode strips away all editing chrome and presents the transcription as flowing prose alongside the original scan.

The clean split was chosen over the full-page reader (PDF hidden) and the interleaved view (cropped PDF per block) because it preserves the familiar side-by-side layout from transcribe mode while dramatically reducing visual noise. Users can switch between reading and editing without re-learning the spatial layout.

Kept
  • Transcription text (flowing prose)
  • PDF scan viewer (same position)
  • Topbar (title, Details toggle, person chips)
  • Mode switcher (Lesen / Bearbeiten)
  • Resizable split handle
  • Scroll sync (click paragraph ↔ PDF)
Removed
  • Block borders & numbered badges
  • Contenteditable / cursor
  • Comment threads & “Kommentieren” buttons
  • Presence dots & user indicators
  • Hint strip (“Markiere eine Passage…”)
  • Drag handles, sort controls
  • Auto-save status indicator
  • Add-block CTA
  • History / “Verlauf” button

S1 — Desktop read mode

S1
Side-by-side split: PDF scan on the left with dimmed annotation outlines, flowing serif prose on the right. The mode switcher shows “Lesen” as active. Clicking a paragraph briefly highlights the matching PDF region (turquoise flash, 1.5s fade).
Primary reading state — the default view when a transcription exists.
Desktop · 1040px
MR
Brief von Heinrich an Martha, 14. Mai 1943
Heinrich R.
MR
Martha R.
Details ▼
LesenBearbeiten
Liebe Martha,
Dein Heinrich
Liebe Martha,
ich schreibe Dir heute aus dem Lazarett in Breslau. Mach Dir keine Sorgen, es geht mir den Umständen entsprechend gut. Der Arzt sagt [unleserlich] Wochen noch dauern wird.
Die Kinder sollen wissen, dass ich an sie denke. Sag dem kleinen Fritz, er soll auf seine Mutter aufpassen. Und Lotte soll weiter so fleißig in der Schule sein.
In ewiger Liebe,
Dein Heinrich
4 Abschnitte Zuletzt bearbeitet: Oma Inge, 14:23

S1 · Desktop read mode

/* Same side-by-side layout as transcribe mode, but the right panel renders
 * the transcription as continuous flowing prose instead of block cards.
 *
 * Key differences from transcribe mode:
 * - No block borders, headers, footers, or numbered badges
 * - No contenteditable — text is plain rendered HTML
 * - No comment threads, no "Kommentieren" buttons
 * - No presence dots, no hint strip, no auto-save indicator
 * - Annotation rects on PDF are dimmed (opacity ~0.3, no badges)
 * - Still clickable for scroll-sync
 * - Status bar shows: "4 Abschnitte · Zuletzt bearbeitet: Oma Inge, 14:23"
 *
 * Scroll sync:
 * - Click paragraph → matching PDF annotation flashes turquoise (1.5s fade)
 * - Click PDF annotation → matching paragraph gets subtle bg highlight (1.5s fade)
 * - PDF auto-scrolls to center the annotation in the viewport */
ElementValueNotes
Text panel
FontTinos (serif), 16px, line-height 1.85Generous reading typography
Padding24px 32pxComfortable margins like a book page
ParagraphsOne <p> per transcription blockmb-4 between paragraphs
[unleserlich]italic, text-ink-2, font-size: 0.9emSubtle but readable
HoverSubtle turquoise bg at 6% opacityHint that paragraphs are clickable
PDF panel
AnnotationsDimmed: border-opacity 0.3, bg-opacity 0.04Still clickable for scroll-sync
BadgesHiddenNo numbered circles in read mode
Scroll syncClick para → PDF scrolls, flash 1.5sTurquoise tint at 18% → fade to 4%
Status bar
Content"N Abschnitte · Zuletzt bearbeitet: Name, HH:mm"Uses most recent updated_at across blocks
Height28px, sand backgroundSame as transcribe mode status bar

S2 — Scroll sync highlight

S2
The user clicked the second paragraph. The matching PDF annotation flashes with a turquoise highlight that fades over 1.5 seconds. The paragraph itself gets a subtle background tint. This is the only interactive element in read mode — no editing, no comments.
Click-to-highlight interaction — bidirectional scroll sync between text and scan.
Desktop · 1040px
MR
Brief von Heinrich an Martha, 14. Mai 1943
Heinrich R.
MR
Martha R.
Details ▼
LesenBearbeiten
Liebe Martha,
Dein Heinrich
Liebe Martha,
ich schreibe Dir heute aus dem Lazarett in Breslau. Mach Dir keine Sorgen, es geht mir den Umständen entsprechend gut. Der Arzt sagt [unleserlich] Wochen noch dauern wird.
Die Kinder sollen wissen, dass ich an sie denke. Sag dem kleinen Fritz, er soll auf seine Mutter aufpassen. Und Lotte soll weiter so fleißig in der Schule sein.
In ewiger Liebe,
Dein Heinrich
4 Abschnitte Zuletzt bearbeitet: Oma Inge, 14:23

S2 · Scroll sync highlight

/* Bidirectional scroll sync with visual feedback.
 *
 * Text → PDF:
 *   1. User clicks a paragraph
 *   2. Paragraph gets .highlighted class (turquoise bg at 10%)
 *   3. Matching annotation rect gets .highlight-flash class
 *   4. PDF viewport scrolls to center the annotation
 *   5. Both highlights fade over 1.5s via CSS animation
 *
 * PDF → Text:
 *   1. User clicks a dimmed annotation rect
 *   2. Annotation flashes (same .highlight-flash)
 *   3. Matching paragraph gets .highlighted
 *   4. Text panel scrolls to center the paragraph
 *   5. Both fade over 1.5s
 *
 * Implementation: each paragraph has data-block-id matching the
 * transcription block's annotation_id. The annotation rects already
 * have annotation IDs from transcribe mode. */
ElementValueNotes
Highlight animation
Paragraph bgrgba(0,199,177,.10)Turquoise at 10%, fades to 0
Annotation flashrgba(0,199,177,.18) → .04Border returns to .3 opacity
Duration1.5s ease-outCSS animation, no JS timers needed
Scroll behaviorsmooth, block: centerscrollIntoView({ behavior: 'smooth', block: 'center' })
Data binding
Paragraph attrdata-block-id="{annotation_id}"Links text to PDF annotation
Annotation attrdata-annotation-id="{id}"Already exists from transcribe mode

S3 — No transcription (empty state)

S3
When no transcription blocks exist, the mode switcher defaults to “Bearbeiten” and the right panel shows an empty state encouraging the user to start transcribing. The “Lesen” tab is disabled (greyed out).
Empty state — no read mode available until at least one block exists.
Desktop · 1040px
MR
Brief von Heinrich an Martha, 14. Mai 1943
Details ▼
LesenBearbeiten
Liebe Martha,
Dein Heinrich
Noch keine Transkription
Zeichne Bereiche auf dem Scan und tippe den Text ab, um eine Transkription zu erstellen.

S3 · Empty state

/* When transcription_blocks count is 0:
 * - Mode switcher defaults to "Bearbeiten"
 * - "Lesen" tab is disabled: opacity 0.35, cursor: not-allowed, not clickable
 * - Right panel shows empty state with pencil icon, title, and description
 * - No status bar (nothing to show)
 *
 * As soon as the first block is saved, "Lesen" becomes enabled.
 * The mode does NOT auto-switch — user stays in Bearbeiten. */
ElementValueNotes
Empty state
IconPencil in 48px sand circleCentered vertically in panel
Title"Noch keine Transkription"i18n key: transcription_empty_title
Description"Zeichne Bereiche auf dem Scan…"i18n key: transcription_empty_desc
Mode switcher
Lesen tabDisabled: opacity .35, not-allowedEnabled when block count > 0
Default"Bearbeiten" activeEnters transcribe mode directly

S4 — Mobile read mode

S4
On mobile, the split view becomes vertical: a collapsible PDF strip (70px) at the top, flowing text below. The mode switcher abbreviates “Bearbeiten” to “Bearb.” to fit. Tapping the PDF strip expands it; tapping again collapses. Paragraphs are still tappable for scroll-sync.
Mobile layout — stacked vertical with collapsible scan strip.
Mobile · 320px
14:23••• WiFi 🔋
Brief von Heinrich, 14.05.1943
LesenBearb.
Liebe Martha,
▲ Scan vergrößern

Liebe Martha,

ich schreibe Dir heute aus dem Lazarett in Breslau. Mach Dir keine Sorgen, es geht mir den Umständen entsprechend gut. Der Arzt sagt [unleserlich] Wochen noch dauern wird.

Die Kinder sollen wissen, dass ich an sie denke. Sag dem kleinen Fritz, er soll auf seine Mutter aufpassen. Und Lotte soll weiter so fleißig in der Schule sein.

In ewiger Liebe,
Dein Heinrich

4 Abschnitte Oma Inge, 14:23
Mobile · 320px · scan expanded
14:23••• WiFi 🔋
Brief von Heinrich, 14.05.1943
LesenBearb.
Liebe Martha,
Dein Heinrich
▼ Scan verkleinern

Liebe Martha,

ich schreibe Dir heute aus dem Lazarett in Breslau…

S4 · Mobile read mode

/* On viewports < 768px, the side-by-side split becomes vertical:
 * - PDF scan strip at top (collapsed: 70px, expanded: ~50vh)
 * - Flowing text below, full-width
 * - Tap PDF strip to toggle expand/collapse
 * - Expand hint text: "▲ Scan vergrößern" / "▼ Scan verkleinern"
 *
 * Mode switcher abbreviates: "Lesen | Bearb."
 * Scroll-sync: tapping a paragraph briefly highlights the matching
 * region in the expanded PDF. If PDF is collapsed, it auto-expands
 * first, then scrolls to the annotation.
 *
 * Same status bar at the bottom, same flowing prose styling. */
ElementValueNotes
PDF strip
Collapsed height70pxShows miniature scan preview
Expanded height~50vh or max 300pxSmooth CSS transition (300ms ease)
ToggleTap anywhere on stripHint text in bottom-right corner
Text area
FontTinos, 15px, line-height 1.9Slightly larger than desktop for touch
Padding16pxFull-width, no wasted space
Mode switcher
Labels"Lesen | Bearb."Abbreviated to fit mobile topbar
Font size10pxCompact but readable
Scroll sync on mobile
Tap paragraphExpand PDF if collapsed, then highlightAuto-expand + scroll + flash
Tap annotationCollapse PDF, scroll text to paragraphSmart collapse after showing match

S5 — Mode switcher states

S5
The mode switcher is a segmented control in the topbar that replaces the previous “Transkribieren” turquoise button. It governs three visual states: Lesen (read mode, this spec), Bearbeiten (transcribe/edit mode), and the existing Annotieren button (yellow comment annotations). The modes are mutually exclusive.
Segmented control — replacing the turquoise “Transkribieren” button.
Lesen active
LesenBearbeiten
✎ Annotieren
Bearbeiten active
LesenBearbeiten
✎ Annotieren
Annotieren active (separate button)
LesenBearbeiten
✎ Annotieren
No transcription blocks
LesenBearbeiten
✎ Annotieren

S5 · Mode switcher states

/* Three mutually exclusive modes:
 *
 * 1. Lesen (read)      — this spec. Flowing prose, dimmed annotations, no editing.
 * 2. Bearbeiten (edit)  — annotation-transcription-final-spec. Block cards, contenteditable.
 * 3. Annotieren         — yellow comment annotations on PDF. Separate button, not in segmented control.
 *
 * The segmented control only contains Lesen + Bearbeiten.
 * Annotieren is a separate button that, when active, deselects both Lesen and Bearbeiten
 * (both appear deselected/dimmed in the segmented control).
 *
 * When the user clicks Annotieren while in read/transcribe mode:
 *   → Enter annotate mode, both segmented items dim
 * When the user clicks a segmented item while in annotate mode:
 *   → Exit annotate mode, enter the selected mode
 *
 * State: let mode: 'read' | 'transcribe' | 'annotate' = $state(...)
 * Default: 'read' if blocks.length > 0, else 'transcribe'
 * The "Annotieren" button is hidden if !canAnnotate || !isPdf */
ElementValueNotes
Segmented control
Items"Lesen" | "Bearbeiten"Mobile: "Lesen" | "Bearb."
Active stylebg:navy, color:#fffRounded within the pill
Inactive stylebg:transparent, color:mutedHover: bg:sand
Dimmed styleBoth items at opacity .5Only when annotate mode is active
Disabled (Lesen)opacity .35, cursor not-allowedWhen no transcription blocks exist
Annotieren button
DefaultGhost style (border:muted)Same as current topbar button
Activebg:navy, color:#fffFilled state when annotate mode on
VisibilitycanAnnotate && isPdfHidden for non-PDF documents
Accessibility
Segmentedrole="tablist", children role="tab"aria-selected on active tab
Annotierenaria-pressed={annotateMode}Toggle button semantics
Disabled tabaria-disabled="true", tabindex="-1"Not focusable when no blocks

Implementation Guide — Transcription Read Mode (Clean Split)

1. Overview

Read mode is the default view for documents that have transcription blocks. It reuses the same side-by-side split layout as transcribe mode but replaces the editable block cards with flowing serif prose. The goal is a distraction-free reading experience that still lets users compare handwriting with typed text.

2. Mode State Management

The document detail page manages a single mode state that governs the entire view:

let mode: 'read' | 'transcribe' | 'annotate' = $state(
  blocks.length > 0 ? 'read' : 'transcribe'
);

3. Component Architecture

3a. New components

ComponentPurpose
TranscriptionReadView.svelteRight panel content in read mode. Renders transcription blocks as flowing prose (<article> with <p> per block). Handles scroll-sync click handlers.
ModeSwitcher.svelteSegmented control (Lesen | Bearbeiten). Props: mode (bindable), hasBlocks (disables Lesen when false). Emits mode changes.

3b. Modified components

ComponentChange
DocumentTopBar.svelteReplace the Transkribieren button with ModeSwitcher. Keep the Annotieren button separate. Add mode bindable prop.
[id]/+page.svelteAdd mode state. Conditionally render TranscriptionReadView vs TranscriptionEditView in the right panel based on mode.
PdfAnnotationLayer.svelteAccept dimmed prop. When true: annotation rects get opacity 0.3, no numbered badges, but remain clickable for scroll-sync.

4. Read View Rendering

4a. Text rendering

4b. Scroll sync

5. PDF Annotations in Read Mode

6. Status Bar

7. Mobile Layout (viewport < 768px)

8. Empty State

9. i18n Keys

Keydeen
mode_readLesenRead
mode_editBearbeitenEdit
mode_edit_shortBearb.Edit
transcription_status_sections{n} Abschnitte{n} sections
transcription_status_last_editedZuletzt bearbeitet: {name}, {time}Last edited: {name}, {time}
transcription_empty_titleNoch keine TranskriptionNo transcription yet
transcription_empty_descZeichne Bereiche auf dem Scan und tippe den Text ab, um eine Transkription zu erstellen.Draw regions on the scan and type the text to create a transcription.
scan_expandScan vergrößernExpand scan
scan_collapseScan verkleinernCollapse scan

10. Accessibility