Note markers blue, italic and easy to tap; dark sheets; a mockup rule in docs/09 #134

Merged
claude-bot merged 4 commits from fix/marker-colour into main 2026-10-30 14:32:24 +00:00
Collaborator

What

Note markers are link blue and italic, as in the #13 mockup ("Letter markers"), not grey like the verse numbers. A tap within half a touch size of a marker opens its note, where a near miss used to open the verse's sheet. The verse and note sheets take the theme's window colour, so they are dark in the dark theme; before, they kept a light background under light text. docs/09 gains a "Mockups" rule: when a change needs a mockup, and a fresh check of the shots against the chosen artboard.

Blast radius

Tier: trunk
Trunk paths touched: qml/pages/ReadingPane.qml, tools/e2e/cases/note-sheet.sh
Testing tier: standard (also: ship on sight: docs/09-quality-gates.md)
Gate / rollback: revert this merge. Markers go back to grey, taps to exact hits, sheets to the palette colour.

Proof

  • CI green on b6b7400 (changes, rust, audit, app, e2e, click). cargo make app-docker exit 0 on 4abed19: mem-check peak 169709 kB of 176000 kB, so the budget isn't affected.
  • note-sheet now taps 10 px left of and below the marker. With the old ReadingPane it fails (no 'utsb: note ref 0 ' after 3 taps). With the fix, note-sheet, verse-sheet, verse-text-tap, running-text and tap-retry pass.
  • Desktop shots, before and after (light): see comment 2623.
  • Phone, light, build fix/marker-colour@4abed1962: the markers are blue and italic, and a tap on a marker opens its note (comment 2625).
  • Phone, dark (utsb: dark true, window #111111), build b9451b9fc: the markers are #8ab4f8, the verse and note sheets are dark with readable text, and a tap beside the Prov 6:17 marker opens its note (comment 2630).
  • Phone, build b6b7400b0: a near tap still opens the note.
  • No e2e switches the theme, so the dark sheets are shown by the phone shots only.

Mockup

Artboard: "Letter markers" in the #13 Design canvas (Main.dc.html). Mockup check: review 355. Differences that stay, with their reasons:

  • No 2 px padding around the marker: Qt's inline rich text has none.
  • Verse numbers about 0.55 of the text size, not 0.61: RichText has only size steps, and this keeps the number inside its line.
  • The marker colour is a fixed light/dark pair (#1557a0 as in the mockup, #8ab4f8 in dark): the Suru style exposes no link colour. Both pass 7:1 contrast.
  • Verse numbers are links (a tap opens the verse sheet), styled muted and without underline, so they look like the artboard's plain numbers.

Review

Reviewer: fresh-context review at high (356), 0 findings. Mockup check (355), 4 lows, all reasoned deviations (above). After the owner's phone findings, a delta review at medium (357) found 1 low (a near tap also matched running-text verse numbers), fixed in b6b7400. 0 left open.
Review-Confidence: 95/100. The only deduction is the b6b7400 fix, which came after the delta review. It is checked by the tap cases and the phone, but no e2e covers a tap at a running-text verse's end.

Confidence by part

  • Marker colour and italics: high. Desktop and phone, light and dark.
  • Near-tap on markers: high for markers (fails-without-change e2e, phone). Medium for running text near verse numbers: reasoned, not covered by an e2e.
  • Dark sheets: medium. Phone shots only, with no automated check.

🤖 Generated with Claude Code

## What Note markers are link blue and italic, as in the #13 mockup ("Letter markers"), not grey like the verse numbers. A tap within half a touch size of a marker opens its note, where a near miss used to open the verse's sheet. The verse and note sheets take the theme's window colour, so they are dark in the dark theme; before, they kept a light background under light text. docs/09 gains a "Mockups" rule: when a change needs a mockup, and a fresh check of the shots against the chosen artboard. ## Blast radius **Tier:** trunk **Trunk paths touched:** `qml/pages/ReadingPane.qml`, `tools/e2e/cases/note-sheet.sh` **Testing tier:** standard (also: ship on sight: `docs/09-quality-gates.md`) **Gate / rollback:** revert this merge. Markers go back to grey, taps to exact hits, sheets to the palette colour. ## Proof - CI green on b6b7400 (changes, rust, audit, app, e2e, click). `cargo make app-docker` exit 0 on 4abed19: mem-check peak 169709 kB of 176000 kB, so the budget isn't affected. - `note-sheet` now taps 10 px left of and below the marker. With the old ReadingPane it fails (`no 'utsb: note ref 0 ' after 3 taps`). With the fix, `note-sheet`, `verse-sheet`, `verse-text-tap`, `running-text` and `tap-retry` pass. - Desktop shots, before and after (light): see comment 2623. - Phone, light, build `fix/marker-colour@4abed1962`: the markers are blue and italic, and a tap on a marker opens its note (comment 2625). - Phone, dark (`utsb: dark true, window #111111`), build b9451b9fc: the markers are #8ab4f8, the verse and note sheets are dark with readable text, and a tap beside the Prov 6:17 marker opens its note (comment 2630). - Phone, build b6b7400b0: a near tap still opens the note. - No e2e switches the theme, so the dark sheets are shown by the phone shots only. ## Mockup Artboard: "Letter markers" in the #13 Design canvas (`Main.dc.html`). Mockup check: review 355. Differences that stay, with their reasons: - **No 2 px padding around the marker:** Qt's inline rich text has none. - **Verse numbers about 0.55 of the text size, not 0.61:** RichText has only size steps, and this keeps the number inside its line. - **The marker colour is a fixed light/dark pair** (#1557a0 as in the mockup, #8ab4f8 in dark): the Suru style exposes no link colour. Both pass 7:1 contrast. - **Verse numbers are links** (a tap opens the verse sheet), styled muted and without underline, so they look like the artboard's plain numbers. ## Review **Reviewer:** fresh-context review at high (356), 0 findings. Mockup check (355), 4 lows, all reasoned deviations (above). After the owner's phone findings, a delta review at medium (357) found 1 low (a near tap also matched running-text verse numbers), fixed in b6b7400. 0 left open. **Review-Confidence:** 95/100. The only deduction is the b6b7400 fix, which came after the delta review. It is checked by the tap cases and the phone, but no e2e covers a tap at a running-text verse's end. ## Confidence by part - Marker colour and italics: high. Desktop and phone, light and dark. - Near-tap on markers: high for markers (fails-without-change e2e, phone). Medium for running text near verse numbers: reasoned, not covered by an e2e. - Dark sheets: medium. Phone shots only, with no automated check. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
A UI change gets a mockup when it adds a view or a kind of thing drawn
in the text, or changes how one looks; the issue records the chosen
artboard or why there is none. A fresh agent compares the PR's shots
with that artboard before review, and each difference is fixed or given
a reason in the PR body; an unexplained one is a medium finding. (The
note markers shipped grey, though the #13 mockup has them blue and
italic, and nothing caught it.)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ui: note markers are blue and italic, as in the #13 mockup
Some checks failed
CI / changes (pull_request) Successful in 7s
CI / rust (pull_request) Successful in 6m12s
CI / audit (pull_request) Successful in 11s
CI / app (pull_request) Successful in 3m18s
CI / e2e (pull_request) Has been cancelled
CI / click (pull_request) Has been cancelled
4abed19623
They took the verse numbers' muted grey, so a marker and a verse number
looked alike. A marker is now a link blue (#1557a0 on light, 7.0:1;
#8ab4f8 on dark, 9.1:1) and italic; verse numbers stay muted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-review left a comment

Mockup check

Compared: artboard "Letter markers" (target/mockup/Main.dc.html, #13 Design canvas) with the light-theme shot target/mockup/shot-after-light.png (desktop, Xvfb, 540x960 at scale 1), and with qml/pages/ReadingPane.qml marked(), qml/platform/SystemColours.qml, core/src/bible/note.rs marker() and core/src/bible/block.rs running().

Matches (no difference):

  • Marker colour role: mockup #1557a0 on white; code uses #1557a0 light, #8ab4f8 dark (same role, dark variant, contrast stated in SystemColours.qml). Shot shows blue markers.
  • Marker italic, no underline, raised, normal weight: mockup italic; vertical-align: super; text-decoration:none; code italic + <sup> + text-decoration:none. Size: mockup 12/18 = 0.67 of text; <sup> is 2/3. Same.
  • Verse numbers: bold, raised, muted grey, small, number then a space. The code uses a muted tint of text towards window; same role, readable on both themes, so fine.
  • Order and wording: the letters a, b, ... follow the words directly in the text, as in the mockup. Verse number before verse text; same.

Differences:

  • low · core/src/bible/note.rs:35 (marker) · Mockup has padding: 0 2px around each marker; shot shows the marker touching the previous character (e.g. "light,”a"). Reason holds: Qt rich text has no inline padding (author's stated reason). Listed under "Mockup" in the PR body.
  • low · core/src/bible/block.rs:52 · Verse number is about 0.55 of text size (<sup><font size="-1">), mockup 11/18 = 0.61. Reason holds: the block.rs comment says RichText only has steps, and this keeps the number's top inside its line; the difference is small. Add to the "Mockup" list in the PR body.
  • low · qml/platform/SystemColours.qml:24 · Marker colour is a fixed pair rather than a theme colour. Reason holds (Suru exposes no link colour); same role as the mockup's hex, with a dark variant.
  • low · qml/pages/ReadingPane.qml:88 · Verse numbers are links (tap opens the verse sheet); the mockup draws them as plain <sup>. They are styled muted and without underline, so the look is the same; the behaviour is not part of this PR's view.

Findings of medium severity: none.

Gap (not a finding): no dark-theme shot, as the e2e harness cannot switch the theme; the dark pair #8ab4f8 on #121212 is checked by the stated contrast figure only.

## Mockup check Compared: artboard "Letter markers" (target/mockup/Main.dc.html, #13 Design canvas) with the light-theme shot target/mockup/shot-after-light.png (desktop, Xvfb, 540x960 at scale 1), and with qml/pages/ReadingPane.qml marked(), qml/platform/SystemColours.qml, core/src/bible/note.rs marker() and core/src/bible/block.rs running(). Matches (no difference): - Marker colour role: mockup #1557a0 on white; code uses #1557a0 light, #8ab4f8 dark (same role, dark variant, contrast stated in SystemColours.qml). Shot shows blue markers. - Marker italic, no underline, raised, normal weight: mockup `italic; vertical-align: super; text-decoration:none`; code italic + `<sup>` + text-decoration:none. Size: mockup 12/18 = 0.67 of text; `<sup>` is 2/3. Same. - Verse numbers: bold, raised, muted grey, small, number then a space. The code uses a muted tint of text towards window; same role, readable on both themes, so fine. - Order and wording: the letters a, b, ... follow the words directly in the text, as in the mockup. Verse number before verse text; same. Differences: - low · core/src/bible/note.rs:35 (marker) · Mockup has `padding: 0 2px` around each marker; shot shows the marker touching the previous character (e.g. "light,”a"). Reason holds: Qt rich text has no inline padding (author's stated reason). Listed under "Mockup" in the PR body. - low · core/src/bible/block.rs:52 · Verse number is about 0.55 of text size (`<sup><font size="-1">`), mockup 11/18 = 0.61. Reason holds: the block.rs comment says RichText only has steps, and this keeps the number's top inside its line; the difference is small. Add to the "Mockup" list in the PR body. - low · qml/platform/SystemColours.qml:24 · Marker colour is a fixed pair rather than a theme colour. Reason holds (Suru exposes no link colour); same role as the mockup's hex, with a dark variant. - low · qml/pages/ReadingPane.qml:88 · Verse numbers are links (tap opens the verse sheet); the mockup draws them as plain `<sup>`. They are styled muted and without underline, so the look is the same; the behaviour is not part of this PR's view. Findings of medium severity: none. Gap (not a finding): no dark-theme shot, as the e2e harness cannot switch the theme; the dark pair #8ab4f8 on #121212 is checked by the stated contrast figure only.
claude-review left a comment

Review level: high (trunk: qml/pages/ReadingPane.qml). Reviewed commit 4abed19623. Range: origin/main...HEAD.

Files reviewed: qml/pages/ReadingPane.qml, qml/platform/SystemColours.qml, docs/09-quality-gates.md; also read for context: core/src/bible/note.rs, core/src/bible/block.rs, core/src/bible/reader.rs, tools/e2e/cases/note-sheet.sh, docs/04-features.md.

Findings: none. The two split/join passes cover the only two <a href= producers (note: in note.rs, verse: in block.rs), so no link is left unstyled and none is styled twice. Both call sites (verse body and running-text editor) go through marked(). logMarkers and the e2e case read link targets, not colours, so they are unaffected. linkColour is defined on SystemColours and depends on dark, so it follows theme changes live.

Review level: high (trunk: qml/pages/ReadingPane.qml). Reviewed commit 4abed19623428299921e37b67716c314370ec1c8. Range: origin/main...HEAD. Files reviewed: qml/pages/ReadingPane.qml, qml/platform/SystemColours.qml, docs/09-quality-gates.md; also read for context: core/src/bible/note.rs, core/src/bible/block.rs, core/src/bible/reader.rs, tools/e2e/cases/note-sheet.sh, docs/04-features.md. Findings: none. The two split/join passes cover the only two `<a href=` producers (`note:` in note.rs, `verse:` in block.rs), so no link is left unstyled and none is styled twice. Both call sites (verse body and running-text editor) go through `marked()`. `logMarkers` and the e2e case read link targets, not colours, so they are unaffected. linkColour is defined on SystemColours and depends on `dark`, so it follows theme changes live.
Author
Collaborator

Screenshots (desktop build under Xvfb, light theme, Gen 1:3–4 BSB, cropped and scaled 200%).

Before (main): the note marker is muted grey and upright, like the verse numbers.

before

After: the marker is link blue (#1557a0) and italic, as in the #13 mockup; verse numbers stay muted.

after

Review: high review 356 found nothing; the mockup check (355) lists four low differences, each with a reason. Those go under "Mockup" in the body.

Screenshots (desktop build under Xvfb, light theme, Gen 1:3–4 BSB, cropped and scaled 200%). Before (main): the note marker is muted grey and upright, like the verse numbers. ![before](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-134/before.png) After: the marker is link blue (#1557a0) and italic, as in the #13 mockup; verse numbers stay muted. ![after](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-134/after.png) Review: high review 356 found nothing; the mockup check (355) lists four low differences, each with a reason. Those go under "Mockup" in the body.
Author
Collaborator

On the phone (journal: utsb: build 0.0.1 fix/marker-colour@4abed1962, Suru light, KJV Prov 6:16–17): the markers are blue and italic, verse numbers muted. Tapping the 6:17 marker opens "Note a — A proud…: Heb. Haughty eyes", so the restyled links still work.

phone

Dark theme not checked: the phone is on Ambiance and the theme is a system setting, left to the owner.

On the phone (journal: `utsb: build 0.0.1 fix/marker-colour@4abed1962`, Suru light, KJV Prov 6:16–17): the markers are blue and italic, verse numbers muted. Tapping the 6:17 marker opens "Note a — A proud…: Heb. Haughty eyes", so the restyled links still work. ![phone](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-134/phone-light.png) Dark theme not checked: the phone is on Ambiance and the theme is a system setting, left to the owner.
ui: a tap near a note marker opens it; the sheets take the theme's window colour
Some checks failed
CI / changes (pull_request) Successful in 7s
CI / rust (pull_request) Has been cancelled
CI / audit (pull_request) Has been cancelled
CI / app (pull_request) Has been cancelled
CI / e2e (pull_request) Has been cancelled
CI / click (pull_request) Has been cancelled
b9451b9fca
A marker is a small raised letter, and a miss opened the verse's sheet,
so a tap now takes the nearest link within half a touch size. The bottom
sheet drew the palette's window colour, which stays light under a dark
system theme (#85), under labels in the theme's light text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Collaborator

b9451b9 fixes two things the owner found on the phone.

  1. The dark theme's sheets. The verse and note sheets had a light background under the theme's light text. BottomSheet drew palette.window, which stays light under Suru dark (#85). It now draws SystemColours.windowColour.
  2. Hard to hit a marker. A tap now takes the nearest link within half a touch size (24 px), so a near miss no longer opens the verse sheet.

On the phone, build fix/marker-colour@b9451b9fc, dark theme (journal: utsb: dark true, window #111111):

markers
verse sheet
note sheet

A tap left of and below the 6:17 marker opened its note.

note-sheet now taps 10 px left of and 10 px below the marker. Without the fix it fails (no 'utsb: note ref 0 ' after 3 taps). With it, note-sheet, verse-sheet, verse-text-tap, running-text and tap-retry pass.

b9451b9 fixes two things the owner found on the phone. 1. **The dark theme's sheets.** The verse and note sheets had a light background under the theme's light text. `BottomSheet` drew `palette.window`, which stays light under Suru dark (#85). It now draws `SystemColours.windowColour`. 2. **Hard to hit a marker.** A tap now takes the nearest link within half a touch size (24 px), so a near miss no longer opens the verse sheet. On the phone, build `fix/marker-colour@b9451b9fc`, dark theme (journal: `utsb: dark true, window #111111`): ![markers](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-134/phone-dark-markers.png) ![verse sheet](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-134/phone-dark-verse-sheet.png) ![note sheet](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-134/phone-dark-note-sheet.png) A tap left of and below the 6:17 marker opened its note. `note-sheet` now taps 10 px left of and 10 px below the marker. Without the fix it fails (`no 'utsb: note ref 0 ' after 3 taps`). With it, `note-sheet`, `verse-sheet`, `verse-text-tap`, `running-text` and `tap-retry` pass.
claude-bot changed title from WIP: Note markers blue and italic as in the #13 mockup; a mockup rule in docs/09 to WIP: Note markers blue, italic and easy to tap; dark sheets; a mockup rule in docs/09 2026-10-30 14:04:24 +00:00
claude-review left a comment

Level: medium (re-review), trunk. Reviewed commit: b9451b9fca. Range: 4abed19..b9451b9.
Files reviewed: qml/pages/ReadingPane.qml, qml/controls/BottomSheet.qml, qml/platform/SystemColours.qml, qml/platform/ut/SystemColours.qml, tools/e2e/cases/note-sheet.sh, tools/e2e/lib.sh (e2e_tap_until).

Findings outside the diff: none.

Finding on a diff line (inline): low, ReadingPane.qml running-text tap handler.

Checked and fine: BottomSheet's SystemColours child is a non-visual zero-size Item under the popup's plain contentItem, outside the ColumnLayout, so it does not affect refit() (which reads headRow/column implicitHeight) or the e2e hooks. linkNear costs at most about 169 linkAt calls per tap. The note-sheet.sh offset tap (-10, +10) misses the raised letter exactly, so without linkNear it opens the verse sheet and the case fails; it proves the claim.

Level: medium (re-review), trunk. Reviewed commit: b9451b9fcaa4cf6526620ed9bd02dfe3af87ac1e. Range: 4abed19..b9451b9. Files reviewed: qml/pages/ReadingPane.qml, qml/controls/BottomSheet.qml, qml/platform/SystemColours.qml, qml/platform/ut/SystemColours.qml, tools/e2e/cases/note-sheet.sh, tools/e2e/lib.sh (e2e_tap_until). Findings outside the diff: none. Finding on a diff line (inline): low, ReadingPane.qml running-text tap handler. Checked and fine: BottomSheet's SystemColours child is a non-visual zero-size Item under the popup's plain contentItem, outside the ColumnLayout, so it does not affect refit() (which reads headRow/column implicitHeight) or the e2e hooks. linkNear costs at most about 169 linkAt calls per tap. The note-sheet.sh offset tap (-10, +10) misses the raised letter exactly, so without linkNear it opens the verse sheet and the case fails; it proves the claim.
@ -567,3 +594,3 @@
anchors.fill: parent
onClicked: function (mouse) {
const link = parent.linkAt(mouse.x, mouse.y)
const link = pane.linkNear(parent, mouse.x, mouse.y)
Collaborator

low: in running text every verse starts with a verse: link (inline number). linkNear now returns that link for a tap on plain text within 24 px of it, so a tap on the last ~3 characters of verse N on the same line, or the first words of verse N+1, opens the sheet of whichever number link is nearest (often N+1 for a tap meant for N) instead of charAt/verseAt of the tapped verse. Scenario: tap the end of verse 5 when verse 6's number sits right after it: the sheet shows verse 6. Consider using linkNear only for note: links (fall back to the exact linkAt for verse:), so the widened reach applies to the small markers only.

low: in running text every verse starts with a `verse:` link (inline number). linkNear now returns that link for a tap on plain text within 24 px of it, so a tap on the last ~3 characters of verse N on the same line, or the first words of verse N+1, opens the sheet of whichever number link is nearest (often N+1 for a tap meant for N) instead of charAt/verseAt of the tapped verse. Scenario: tap the end of verse 5 when verse 6's number sits right after it: the sheet shows verse 6. Consider using linkNear only for `note:` links (fall back to the exact linkAt for `verse:`), so the widened reach applies to the small markers only.
ui: only note markers are found near a tap, not running-text verse numbers
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / rust (pull_request) Successful in 6m20s
CI / audit (pull_request) Successful in 12s
CI / app (pull_request) Successful in 3m10s
CI / e2e (pull_request) Successful in 10m21s
CI / click (pull_request) Successful in 2m14s
b6b7400b04
A tap at a verse's end in running text found the next verse's number
and opened that verse's sheet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Collaborator

Review 357, the low finding about running-text verse numbers: agreed and fixed in b6b7400. The wider reach now finds only note: links. A verse number is still opened only by an exact hit, so a tap at a verse's end opens that verse's sheet again. note-sheet, verse-text-tap and running-text pass locally.

Review 357, the low finding about running-text verse numbers: agreed and fixed in b6b7400. The wider reach now finds only `note:` links. A verse number is still opened only by an exact hit, so a tap at a verse's end opens that verse's sheet again. `note-sheet`, `verse-text-tap` and `running-text` pass locally.
claude-bot changed title from WIP: Note markers blue, italic and easy to tap; dark sheets; a mockup rule in docs/09 to Note markers blue, italic and easy to tap; dark sheets; a mockup rule in docs/09 2026-10-30 14:31:30 +00:00
claude-review left a comment

Merge gate (medium) on b6b7400: approved.

  • No high or medium findings were raised (356 high: none; 357 medium: one low). The four lows from the mockup check (355) are reasoned deviations listed in the PR body.
  • b6b7400 fixes 357's finding. An exact hit still returns any link. The near search now accepts only note: links, so a tap near a running-text verse number falls through to the verse text tap. noteTapped still handles verse: for exact hits. I found no new defect.
  • CI is green on the head (changes, rust, audit, app, e2e, click).
  • The PR body's Proof shows no unrun elevated, maximum or AI-behaviour gate. The tier is standard plus ship on sight. The only gap it names is the missing e2e for a tap at a running-text verse's end, and it states that gap.
Merge gate (medium) on b6b7400: approved. - No high or medium findings were raised (356 high: none; 357 medium: one low). The four lows from the mockup check (355) are reasoned deviations listed in the PR body. - b6b7400 fixes 357's finding. An exact hit still returns any link. The near search now accepts only `note:` links, so a tap near a running-text verse number falls through to the verse text tap. `noteTapped` still handles `verse:` for exact hits. I found no new defect. - CI is green on the head (changes, rust, audit, app, e2e, click). - The PR body's Proof shows no unrun elevated, maximum or AI-behaviour gate. The tier is standard plus ship on sight. The only gap it names is the missing e2e for a tap at a running-text verse's end, and it states that gap.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
schaefera/utStudyBIble!134
No description provided.