Problem: When a user has written notes on specific verses, they need a visual cue in the reader so they can see which verses have notes — without opening the notes list.
Solution: A subtle dashed underline on the first few words of verses that have notes. Clicking the underline opens the note editor directly.
Not included: Showing the note content inline in the reader, or a note count badge. This is just a presence indicator.
When a verse has a note attached to it, the first 5 words of that verse get a subtle dashed underline. This tells the reader "there's a note here." Clicking the underlined text opens the note editor for that verse.
User flow:
Edge cases:
Visual:
border-bottom: 1.5px dashed var(--color-header, rgb(140, 160, 200))Interaction:
Note: Despite the feature name saying "dots," the actual implementation uses a dashed underline, not dot markers.
Computation (in +page.svelte):
const noteVerseIds = $derived(
new Set(
(data.verses as Verse[])
.filter((v) => getVerseNote(v.bookId, v.chapter, v.verse))
.map((v) => v.id)
)
);
getVerseNote() does O(1) lookup from a Map<"bookId:chapter:verse", VerseNote> in the notes storeRendering (in VerseText.svelte):
hasNote is true, noteIndicatorWords splits the primary text and wraps the first min(5, words.length) words in <span class="note-indicator">onnoteclick(verse) with stopPropagation() to prevent context menuFiles:
apps/web/src/lib/components/bible/VerseText.svelte — indicator rendering + click handlerapps/web/src/lib/components/bible/VerseList.svelte — passes noteVerseIds Set to each VerseTextapps/web/src/lib/stores/notes.svelte.ts — notes store with Map-based O(1) lookupapps/web/src/routes/(app)/read/[[book]]/[[chapter]]/+page.svelte — computes noteVerseIdsCurrent: DONE Milestone: v1 Priority: Medium — connects the reader to the notes system
History:
Dependencies: