feat(person-mention): discoverability hint for the @ trigger in the editor #370
Reference in New Issue
Block a user
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?
Context
PR #369 (issue #362 / PR-B1) shipped the @-mention typeahead for transcription blocks but did not add a visible hint that the
@trigger exists. A first-time transcriber has no way to discover the feature without being told or stumbling on it.This was raised by Leonie in #369 cycle-2 review as the only remaining concern. Explicitly not a B1 blocker — Leonie's recommendation was "ship and validate with the existing 2 transcribers first, then iterate."
Proposal
Add a subtle hint near the textarea (mirroring the existing
transcription_block_quote_hintpattern) when the textarea is focused and empty. Suggested copy:Tipp: @ tippen um eine Person zu verlinkenTip: type @ to link a personSugerencia: escribe @ para vincular a una personaHint appears as a one-line muted string below the textarea, only when:
@)Acceptance criteria
Given a first-time transcriber focuses an empty transcription block textarea
When the focus lands
Then a one-line hint "Tipp: @ tippen um eine Person zu verlinken" appears below the textarea
Given the transcriber types any character (including
@)When the textarea is no longer empty
Then the hint disappears
Given the transcriber blurs the textarea
When focus moves away
Then the hint disappears
Out of scope
Effort
≈ 4 lines of Svelte + 3 Paraglide keys. Single small PR.
🎨 Leonie Voss — UI/UX Design Lead
Walked through the discoverability hint design with Marcel. The original "muted line below the textarea" framing turned out to be a worse fit than expected — the existing
transcription_block_quote_hintis a contextual feedback hint (after-selection), not a discoverability hint, so "mirroring the pattern" would put the new hint in a low-attention zone between the editor and the footer. We pivoted to a stronger placement.Decisions
Placement: inline as part of the editor placeholder. The hint sits where the cursor blinks, not below the fold. No new DOM slot, no layout shift, no
{#if}block. The existing<p class="mt-1 text-xs text-ink-3">slot stays reserved for the quote hint only.Show-condition: whenever the editor is empty (regardless of focus) — broader than the original spec's "focus + empty". Tiptap's natural placeholder behavior. Visible at a glance even before clicking.
Copy — show the syntax inline + describe the result, not just the trigger:
Text eingeben — mit @Name eine Person aus dem Archiv verknüpfenType text — use @name to link a person from the archiveEscriba el texto — use @nombre para vincular a una persona del archivoThree deliberate choices: (a)
@Nameshows the syntax inline so no separate explanation is needed; (b)aus dem Archivgrounds the result — users understand this connects to existing data, not free text; (c)verknüpfenoververlinkenmatches the family-archive tone and describes the relationship being formed.Layout shift: N/A — placeholder lives inside the fixed editor box.
Visual styling: Flat muted text via Tiptap's default
.is-editor-empty::beforerendering. No<kbd>pill for@Name— would require a custom Tiptap plugin/overlay, not worth it for B1. The@symbol is recognizable on its own.Accessibility: No extra
aria-describedby. Best-effort placeholder behavior is fine for a hint; the mention typeahead itself remains keyboard-operable regardless of whether the placeholder is announced. Addingaria-describedbyfor every focus event would get noisy fast.Dismissal persistence: Solved for free by placeholder semantics. Empty shows, typed hides, backspace shows again. No
localStorageflag, no "seen" state.Mobile/touch — accepted as known limitation for B1
On a German tablet keyboard,
@is a long-press onQ(iPad) or AltGr+Q (laptop). The text "type @" tells the user what to do but not how to physically produce the character. Accepted for B1: most transcribers are on laptops; iPad use is secondary. If validation with the existing 2 transcribers shows iPad friction on the@key, we reopen the@-insert-button discussion as a separate issue. Not now.Implementation impact
Smaller than the original estimate. The issue proposed ~4 lines of Svelte + 3 new Paraglide keys for a separate hint element. With this approach we modify the 3 existing
transcription_block_placeholderstrings — no new keys, no new component logic, no new DOM. Effectively a 3-line i18n change plus visual verification.My read
This is a textbook case for "discoverability via placeholder, not via afterthought-paragraph". The hint lives where the user's eyes already are, disappears the moment it's no longer needed, and reinforces the result (
Person aus dem Archiv verknüpfen) — not just the trigger. Ship it.marcel referenced this issue2026-04-30 10:37:56 +02:00
Implementation complete
Branch:
feat/issue-370-at-mention-placeholder-hintPR: #379
What was done
Implemented Leonie's design decision from the review comment: update the 3 existing
transcription_block_placeholderi18n strings to embed the@Nametrigger inline. No new DOM, no new keys, no new component logic.Commit:
54b4b964Changes
frontend/messages/de.json"Text eingeben — mit @Name eine Person aus dem Archiv verknüpfen"frontend/messages/en.json"Type text — use @name to link a person from the archive"frontend/messages/es.json"Escriba el texto — use @nombre para vincular a una persona del archivo"PersonMentionEditor.svelte.spec.tstranscription_block_placeholder contains @ mention trigger for discoverabilityTests
All 22 PersonMentionEditor tests green including the new one. Pre-existing failures in
layout.svelte.spec.tsandhilfe/transkription/page.svelte.spec.tsare unrelated to this change.