Display: Paper or White light ground (#95) #143

Merged
claude-bot merged 5 commits from feat/lectern-light-ground into main 2026-10-30 21:16:37 +00:00
Collaborator

What

Part 2 of 5 of #95.

  • Display settings gain a "Light background" choice: Paper (the default) or White.
  • The choice is stored as ui.light_white and read by every SystemColours through Theme.lightWhite, so a switch shows at once on every page.
  • Dark mode ignores it. The row is greyed out while the system is dark, with a note saying why.
  • RowButton (cross-references, the verse sheet's actions, Modules and Starter rows) now sits on the page's or the sheet's own ground. On the phone, Suru drew a white plate under flat buttons, so rows showed white on Paper. It keeps a grey tint while pressed and gets a focus ring.
  • A new e2e case, light-ground, covers the setting. language-switch now scrolls Settings to the language options first.

Refs #95.

Blast radius

Tier: trunk
Trunk paths touched: qt/src/reading_model.rs, qml/pages/ReadingPane.qml, qml/Main.qml, core/src/worker.rs (test only), tools/e2e/
Testing tier: standard (UI, a setting, an e2e case)
Gate / rollback: Paper stays the default, so the only change users see until they pick White is that the rows are no longer white on the phone. To undo, revert this merge. The setting is one new key with no migration, and it is ignored once the code is gone.

Proof

  • cargo make exits 0. The new test is the_light_ground_is_paper_until_white_is_chosen. Fails-without-change: with the default flipped to "1", the test fails.
  • cargo make app-docker exits 0 (on 4d587ab).
    • mem-check peak PSS is 164374 kB (normal) and 169509 kB (slow), against a budget of 176000 kB.
    • Time to text on screen is 314 ms.
  • cargo make i18n reports 139 strings translated and none missing; the German strings are added.
  • E2E_CASES=light-ground cargo make shots passes in light mode. It goes Paper → White → kill -9 → White → Paper → kill → Paper.
    • In dark mode (--dark), the row is greyed out.
    • Fails-without-change: with SystemColours.white forced to false, it fails with "no 'utsb: dark false, window #ffffff'".
  • E2E_CASES=language-switch cargo make shots passes. Before the fix it failed with German at y 976 in a 960 px window.
  • RowButton:
    • qmllint is clean.
    • E2E_CASES="verse-sheet note-sheet starter-install module-manager" passes (4 passed) on 3a926d1, and verse-sheet plus module-manager pass on ad75aa3.
    • On the phone, build feat/lectern-light-ground@ad75aa3f9, Paper, the Esther 2:8 verse sheet: the cross-reference row's pixels are #FAF8F3, the sheet ground (1063 of 1080 pixels on a line through the row; the rest is text).
    • Before the fix, the same row was #FFFFFF from y 2012 to 2263 px.
    • The desktop uses the Default style, so only the phone can show this; desktop shots can't.
    • Focus ring, with a scratch e2e case that wasn't committed:
      • It opens the Genesis 1:1 sheet and presses Tab four times with xdotool, saving a shot after each.
      • Each press moves the focus: 1329 and 2522 pixels change between shots.
      • After the second Tab, the first cross-reference row has a 2 px blue palette.highlight ring on the Paper ground, and the other rows are plain.
      • Checked in the Default style, light only. The phone has no keyboard.
  • CI is green on ad75aa3 for all jobs: changes, rust, audit, app, e2e and click.
  • Phone: see the checklist comment and comment 2765.

Mockup

Compared against artboard C "Ink and lapis" (https://claude.ai/artifact/MwvxmpLR96sZkwbiCwAhp6): screen 6 (John 3 on paper), screen 7 (John 3 on white) and screen 10 (Menu on white), colours only.

  • The White ground, text, lapis numbers, note markers and red letters match screen 7.
  • Rows in sheets sit on the sheet's ground, as on screen 2.
  • The footer bar is still Suru's #E0E0E0, where screen 10 shows the surface colour #F7F8FA. Suru controls and the footer pill come in part 3 (docs/10-design.md).
  • The Settings control has no artboard. It follows the page's Sans/Serif button pair.

Resources (docs/07)

  • One more setting sent at start and one bool in the Theme singleton, colours only.
  • RowButton's own background replaces the style's, one Rectangle per row as before.
  • PSS is within budget (see Proof). Start-up is unchanged (314 ms to text).
  • The window starts on Paper and switches to White before the text shows, because settings arrive asynchronously.

Review

Reviewer:

  • First round: a fresh-context code-review at high (0 findings) and a mockup check (1 low finding, answered: not a deviation, see Mockup).
  • CI fix 4d587ab: a delta review at medium (review 371, 0 findings).
  • RowButton fix 3a926d1: a delta review at medium (review 372). It had 1 low finding: no keyboard focus indicator. Fixed in ad75aa3 with a 2 px ring in the style's highlight while visualFocus.
  • Totals: 2 findings, 1 fixed in code, 1 answered, 0 deferred, 0 left open.

Review-Confidence: 95/100 (audit on ad75aa3). The audit deducted 5 because the focus-ring fix to review 372's finding had no further review round.

Confidence by part

  • The core setting: high, small and tested both ways.
  • QML and SystemColours: high on the desktop (e2e both ways) and checked on the phone in light mode.
  • RowButton: high for the ground (phone pixels) and the focus ring (desktop shot). The ring was not seen under Suru or in dark mode.
  • The e2e changes: high. The scroll waits for the page's own position report and fails loudly.

🤖 Generated with Claude Code

## What Part 2 of 5 of #95. - Display settings gain a "Light background" choice: **Paper** (the default) or **White**. - The choice is stored as `ui.light_white` and read by every `SystemColours` through `Theme.lightWhite`, so a switch shows at once on every page. - Dark mode ignores it. The row is greyed out while the system is dark, with a note saying why. - `RowButton` (cross-references, the verse sheet's actions, Modules and Starter rows) now sits on the page's or the sheet's own ground. On the phone, Suru drew a white plate under flat buttons, so rows showed white on Paper. It keeps a grey tint while pressed and gets a focus ring. - A new e2e case, `light-ground`, covers the setting. `language-switch` now scrolls Settings to the language options first. Refs #95. ## Blast radius **Tier:** trunk **Trunk paths touched:** `qt/src/reading_model.rs`, `qml/pages/ReadingPane.qml`, `qml/Main.qml`, `core/src/worker.rs` (test only), `tools/e2e/` **Testing tier:** standard (UI, a setting, an e2e case) **Gate / rollback:** Paper stays the default, so the only change users see until they pick White is that the rows are no longer white on the phone. To undo, revert this merge. The setting is one new key with no migration, and it is ignored once the code is gone. ## Proof - `cargo make` exits 0. The new test is `the_light_ground_is_paper_until_white_is_chosen`. Fails-without-change: with the default flipped to "1", the test fails. - `cargo make app-docker` exits 0 (on 4d587ab). - mem-check peak PSS is 164374 kB (normal) and 169509 kB (slow), against a budget of 176000 kB. - Time to text on screen is 314 ms. - `cargo make i18n` reports 139 strings translated and none missing; the German strings are added. - `E2E_CASES=light-ground cargo make shots` passes in light mode. It goes Paper → White → kill -9 → White → Paper → kill → Paper. - In dark mode (`--dark`), the row is greyed out. - Fails-without-change: with `SystemColours.white` forced to `false`, it fails with "no 'utsb: dark false, window #ffffff'". - `E2E_CASES=language-switch cargo make shots` passes. Before the fix it failed with German at y 976 in a 960 px window. - RowButton: - `qmllint` is clean. - `E2E_CASES="verse-sheet note-sheet starter-install module-manager"` passes (4 passed) on 3a926d1, and verse-sheet plus module-manager pass on ad75aa3. - On the phone, build `feat/lectern-light-ground@ad75aa3f9`, Paper, the Esther 2:8 verse sheet: the cross-reference row's pixels are #FAF8F3, the sheet ground (1063 of 1080 pixels on a line through the row; the rest is text). - Before the fix, the same row was #FFFFFF from y 2012 to 2263 px. - The desktop uses the Default style, so only the phone can show this; desktop shots can't. - Focus ring, with a scratch e2e case that wasn't committed: - It opens the Genesis 1:1 sheet and presses Tab four times with xdotool, saving a shot after each. - Each press moves the focus: 1329 and 2522 pixels change between shots. - After the second Tab, the first cross-reference row has a 2 px blue `palette.highlight` ring on the Paper ground, and the other rows are plain. - Checked in the Default style, light only. The phone has no keyboard. - CI is green on ad75aa3 for all jobs: changes, rust, audit, app, e2e and click. - Phone: see the checklist comment and comment 2765. ## Mockup Compared against artboard C "Ink and lapis" (https://claude.ai/artifact/MwvxmpLR96sZkwbiCwAhp6): screen 6 (John 3 on paper), screen 7 (John 3 on white) and screen 10 (Menu on white), colours only. - The White ground, text, lapis numbers, note markers and red letters match screen 7. - Rows in sheets sit on the sheet's ground, as on screen 2. - The footer bar is still Suru's #E0E0E0, where screen 10 shows the surface colour #F7F8FA. Suru controls and the footer pill come in part 3 (docs/10-design.md). - The Settings control has no artboard. It follows the page's Sans/Serif button pair. ## Resources (docs/07) - One more setting sent at start and one bool in the Theme singleton, colours only. - RowButton's own background replaces the style's, one Rectangle per row as before. - PSS is within budget (see Proof). Start-up is unchanged (314 ms to text). - The window starts on Paper and switches to White before the text shows, because settings arrive asynchronously. ## Review **Reviewer:** - First round: a fresh-context `code-review` at high (0 findings) and a mockup check (1 low finding, answered: not a deviation, see Mockup). - CI fix 4d587ab: a delta review at medium (review 371, 0 findings). - RowButton fix 3a926d1: a delta review at medium (review 372). It had 1 low finding: no keyboard focus indicator. Fixed in ad75aa3 with a 2 px ring in the style's highlight while `visualFocus`. - Totals: 2 findings, 1 fixed in code, 1 answered, 0 deferred, 0 left open. **Review-Confidence:** 95/100 (audit on ad75aa3). The audit deducted 5 because the focus-ring fix to review 372's finding had no further review round. ## Confidence by part - The core setting: high, small and tested both ways. - QML and SystemColours: high on the desktop (e2e both ways) and checked on the phone in light mode. - RowButton: high for the ground (phone pixels) and the focus ring (desktop shot). The ring was not seen under Suru or in dark mode. - The e2e changes: high. The scroll waits for the page's own position report and fails loudly. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ui: Paper or White light ground in SystemColours, a choice in Display settings, e2e case (#95)
Some checks failed
CI / changes (pull_request) Successful in 11s
CI / rust (pull_request) Successful in 7m6s
CI / audit (pull_request) Successful in 11s
CI / app (pull_request) Successful in 3m31s
CI / e2e (pull_request) Failing after 11m28s
CI / click (pull_request) Has been skipped
49d19782ac
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-review left a comment

Fresh-context review (claude-review)

Level: high. Blast radius: trunk (qt/src/reading_model.rs, core/src/worker.rs test only). Testing tier: standard.
Reviewed commit: 49d19782ac
Range: origin/main...HEAD

Files reviewed:
core/src/settings.rs, core/src/worker.rs, qt/src/reading_model.rs, qml/platform/SystemColours.qml, qml/platform/ut/SystemColours.qml (unchanged, checked), qml/theme/Theme.qml, qml/theme/qmldir, qml/pages/ReadingPane.qml, qml/pages/DisplaySettings.qml, qml/pages/SettingsPage.qml, qml/Main.qml, tools/e2e/cases/light-ground.sh, tools/e2e/lib.sh, docs/10-design.md, po/de.po, po/utstudybible.schaefera.pot

Findings: none at high, medium or low severity.

Checked and found sound:

  • Setting plumbing: LIGHT_WHITE is in ALL, so it is sent at start before the first Loaded. The worker test's expected start list matches (appended last). The glue's setting() match arm, the Default-derived light_white: false, and set_flag follow the existing flag pattern.
  • Theme.lightWhite is a singleton property set by ReadingPane (the StackView's initial item, so always present) in Component.onCompleted and on change. SystemColours instances in Main, pages and sheets all re-evaluate through the singleton binding. Dark ignores the setting (white: !dark && Theme.lightWhite).
  • DisplaySettings: the C++ checked updates do not break the QML bindings, and an autoExclusive button cannot be unchecked by clicking it. The enabled log reflects the effective state, so the dark-theme greyed check in the e2e case holds. The new section is within the first screen of the 540x960 e2e window.
  • Docs: the White table in docs/10-design.md matches the values in SystemColours. The pot and de.po entries match the new qsTr strings.
  • Note, not a defect: on a cold start with White chosen, the window's first frame can be paper until the setting arrives, which is just before the text (the e2e case asserts that order).

CI was still pending at review time (reviewed commits only).

Fresh-context review (claude-review) Level: high. Blast radius: trunk (qt/src/reading_model.rs, core/src/worker.rs test only). Testing tier: standard. Reviewed commit: 49d19782ac3be8d584852b0a94befd55d761a7d6 Range: origin/main...HEAD Files reviewed: core/src/settings.rs, core/src/worker.rs, qt/src/reading_model.rs, qml/platform/SystemColours.qml, qml/platform/ut/SystemColours.qml (unchanged, checked), qml/theme/Theme.qml, qml/theme/qmldir, qml/pages/ReadingPane.qml, qml/pages/DisplaySettings.qml, qml/pages/SettingsPage.qml, qml/Main.qml, tools/e2e/cases/light-ground.sh, tools/e2e/lib.sh, docs/10-design.md, po/de.po, po/utstudybible.schaefera.pot Findings: none at high, medium or low severity. Checked and found sound: - Setting plumbing: LIGHT_WHITE is in ALL, so it is sent at start before the first Loaded. The worker test's expected start list matches (appended last). The glue's `setting()` match arm, the Default-derived `light_white: false`, and `set_flag` follow the existing flag pattern. - Theme.lightWhite is a singleton property set by ReadingPane (the StackView's initial item, so always present) in Component.onCompleted and on change. SystemColours instances in Main, pages and sheets all re-evaluate through the singleton binding. Dark ignores the setting (`white: !dark && Theme.lightWhite`). - DisplaySettings: the C++ `checked` updates do not break the QML bindings, and an autoExclusive button cannot be unchecked by clicking it. The `enabled` log reflects the effective state, so the dark-theme greyed check in the e2e case holds. The new section is within the first screen of the 540x960 e2e window. - Docs: the White table in docs/10-design.md matches the values in SystemColours. The pot and de.po entries match the new qsTr strings. - Note, not a defect: on a cold start with White chosen, the window's first frame can be paper until the setting arrives, which is just before the text (the e2e case asserts that order). CI was still pending at review time (reviewed commits only).
claude-review left a comment

Mockup check

Compared: Lapis.dc.html screens 6 (paper), 7 (white), 10 (menu, white) against qml/platform/SystemColours.qml and the light-ground e2e shots (reading-paper, reading-white, settings-paper/white, menu), looked at at 50%. Scope as given: only the White and Paper colours on grounds, surfaces, hairlines, text, verse numbers, markers and red letters.

No medium findings.

Matches the artboard exactly (hex compared to source):

  • White: ground #FFFFFF, surface #F7F8FA, hairline #E3E5E9, text #1F2023, secondary #5F636B, accent/lapis #1E4FA8, red #A3231A, highlight #EEF2FA (screens 7 and 10).
  • Paper: #FAF8F3 / #FFFFFF / #E4DFD3 / #22201C / #6B6458 / highlight #F1ECE0 (screen 6).
  • Shots: the window is #ffffff / text #1f2023 in White and #faf8f3 in Paper; verse numbers are lapis and red letters are the dark red on both grounds, as on screens 6 and 7. core/src/render.rs uses the same lapis and red on both light grounds, which is correct because the artboard keeps them identical.
  • The Paper/White setting follows the Settings page pattern (no artboard).

Low:

  • The footer bar in the shots is Suru's #E0E0E0, not the surface role (#F7F8FA on screen 10, #FFFFFF on screen 6), and the popup menu is plain white. docs/10-design.md says Suru controls keep their look until later parts and the pill is a later PR, so this is not a deviation here. The PR body has no "Mockup" section though (docs/09 asks for one); add a line naming artboards 6/7/10 and this footer/popup/Suru-button difference with that reason.
  • Not checkable in the shots: note markers (no notes in Matthew 5) and the highlighted verse (later PR). Dark shots are not produced by this case; dark values are unchanged by the diff (white is false when dark).
## Mockup check Compared: Lapis.dc.html screens 6 (paper), 7 (white), 10 (menu, white) against `qml/platform/SystemColours.qml` and the light-ground e2e shots (reading-paper, reading-white, settings-paper/white, menu), looked at at 50%. Scope as given: only the White and Paper colours on grounds, surfaces, hairlines, text, verse numbers, markers and red letters. No medium findings. Matches the artboard exactly (hex compared to source): - White: ground #FFFFFF, surface #F7F8FA, hairline #E3E5E9, text #1F2023, secondary #5F636B, accent/lapis #1E4FA8, red #A3231A, highlight #EEF2FA (screens 7 and 10). - Paper: #FAF8F3 / #FFFFFF / #E4DFD3 / #22201C / #6B6458 / highlight #F1ECE0 (screen 6). - Shots: the window is #ffffff / text #1f2023 in White and #faf8f3 in Paper; verse numbers are lapis and red letters are the dark red on both grounds, as on screens 6 and 7. `core/src/render.rs` uses the same lapis and red on both light grounds, which is correct because the artboard keeps them identical. - The Paper/White setting follows the Settings page pattern (no artboard). Low: - The footer bar in the shots is Suru's #E0E0E0, not the `surface` role (#F7F8FA on screen 10, #FFFFFF on screen 6), and the popup menu is plain white. docs/10-design.md says Suru controls keep their look until later parts and the pill is a later PR, so this is not a deviation here. The PR body has no "Mockup" section though (docs/09 asks for one); add a line naming artboards 6/7/10 and this footer/popup/Suru-button difference with that reason. - Not checkable in the shots: note markers (no notes in Matthew 5) and the highlighted verse (later PR). Dark shots are not produced by this case; dark values are unchanged by the diff (`white` is false when dark).
Author
Collaborator

Reply to the mockup check (low, footer ToolBar): agreed, not a deviation in this part. The footer and popup keep Suru's look until the later parts of #95 (docs/10-design.md). Added a "Mockup" section to the PR body naming artboards 6/7/10 and this difference with that reason. No code change; the reviewed commit 49d1978 stays the head.

Reply to the mockup check (low, footer ToolBar): agreed, not a deviation in this part. The footer and popup keep Suru's look until the later parts of #95 (docs/10-design.md). Added a "Mockup" section to the PR body naming artboards 6/7/10 and this difference with that reason. No code change; the reviewed commit 49d1978 stays the head.
e2e: language-switch scrolls Settings to the language options first (#95)
All checks were successful
CI / changes (pull_request) Successful in 9s
CI / rust (pull_request) Successful in 7m43s
CI / audit (pull_request) Successful in 12s
CI / app (pull_request) Successful in 3m42s
CI / e2e (pull_request) Successful in 11m9s
CI / click (pull_request) Successful in 2m41s
4d587abc2e
The light background row moved them below the window's bottom (y 976 in
a 960 px window), so the tap on Deutsch missed.

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

Delta review

Level: medium. Commit: 4d587abc2e. Range: 49d19782ac3be8d584852b0a94befd55d761a7d6..4d587abc2e5fc19ccb5cf7c86486226f6a3fcdc0 (one commit). Blast radius: trunk (tools/e2e/).
Files: tools/e2e/cases/language-switch.sh

Findings: none at medium or high.

Checked:

  • The reporter Timer (300 ms, restarted by onContentYChanged) is debounced, so the second report comes only after the wheel burst (15 clicks, 20 ms apart) has stopped moving contentY. The only other triggers are Component.onCompleted and StackView.onActivated, which fire before the first report. The second report therefore comes from the scroll.
  • Slider (LabelledSlider and the text-size slider) uses the Controls 2 default wheelEnabled=false, so the wheel cannot change a setting value.
  • If the page did not scroll at all, e2e_wait fails with a clear timeout and does not pass silently.

Residual risk (low): 15 notches (about 60 px each, so roughly 900 px) must reach the end of the page. If Settings grows longer than the window plus that distance, the language options would be reported off-screen and the tap would miss. The case does not check the reported y against e2e_h.

Delta review Level: medium. Commit: 4d587abc2e5fc19ccb5cf7c86486226f6a3fcdc0. Range: 49d19782ac3be8d584852b0a94befd55d761a7d6..4d587abc2e5fc19ccb5cf7c86486226f6a3fcdc0 (one commit). Blast radius: trunk (tools/e2e/). Files: tools/e2e/cases/language-switch.sh Findings: none at medium or high. Checked: - The reporter Timer (300 ms, restarted by onContentYChanged) is debounced, so the second report comes only after the wheel burst (15 clicks, 20 ms apart) has stopped moving contentY. The only other triggers are Component.onCompleted and StackView.onActivated, which fire before the first report. The second report therefore comes from the scroll. - Slider (LabelledSlider and the text-size slider) uses the Controls 2 default wheelEnabled=false, so the wheel cannot change a setting value. - If the page did not scroll at all, e2e_wait fails with a clear timeout and does not pass silently. Residual risk (low): 15 notches (about 60 px each, so roughly 900 px) must reach the end of the page. If Settings grows longer than the window plus that distance, the language options would be reported off-screen and the tap would miss. The case does not check the reported y against e2e_h.
Author
Collaborator

Phone check, build feat/lectern-light-ground@4d587abc2 (Volla Plinius, light mode)

Checked by me with ute2e and the journal:

  • The app starts on Paper: utsb: dark false, window #faf8f3, text #22201c. There are no QML errors. The only DENIED line is the known Libertine D-Bus one.
  • Settings → Display shows "Light background" with Paper and White, plus the note "Applies when the phone is in light mode." The buttons are at (106, 478) and (304, 478), on screen.
  • Tapping White switches at once: window #ffffff, text #1f2023. The Settings page turns white and stays readable.
  • White survives a restart. The window starts on Paper and turns White before the text shows (dark … #ffffff comes before showing Ps 1). The reading pane samples #FFFFFF, with lapis verse numbers.
  • Tapping Paper switches back (window #faf8f3). The phone is left on Paper.
  • Red letters on White: not checkable here, because the phone's Bible doesn't mark the words of Jesus. The CI shots cover them (light-ground reading on White).

For the owner:

  • Feel: try White against Paper on a few pages. Is White the plain white you wanted (artboard screen 7)?
  • Dark mode: with the system in dark mode, the "Light background" row should be greyed out with the note saying why. I don't change your system settings, so this is yours to check.
  • Sign-off.

🤖 Generated with Claude Code

## Phone check, build `feat/lectern-light-ground@4d587abc2` (Volla Plinius, light mode) Checked by me with ute2e and the journal: - [x] The app starts on Paper: `utsb: dark false, window #faf8f3, text #22201c`. There are no QML errors. The only DENIED line is the known Libertine D-Bus one. - [x] Settings → Display shows "Light background" with Paper and White, plus the note "Applies when the phone is in light mode." The buttons are at (106, 478) and (304, 478), on screen. - [x] Tapping White switches at once: `window #ffffff, text #1f2023`. The Settings page turns white and stays readable. - [x] White survives a restart. The window starts on Paper and turns White before the text shows (`dark … #ffffff` comes before `showing Ps 1`). The reading pane samples #FFFFFF, with lapis verse numbers. - [x] Tapping Paper switches back (`window #faf8f3`). The phone is left on Paper. - [ ] Red letters on White: not checkable here, because the phone's Bible doesn't mark the words of Jesus. The CI shots cover them (`light-ground` reading on White). For the owner: - [ ] **Feel:** try White against Paper on a few pages. Is White the plain white you wanted (artboard screen 7)? - [ ] **Dark mode:** with the system in dark mode, the "Light background" row should be greyed out with the note saying why. I don't change your system settings, so this is yours to check. - [ ] Sign-off. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
ui: RowButton on the page's own ground, so Suru's white plate is gone on Paper (#95)
Some checks failed
CI / changes (pull_request) Successful in 15s
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
3a926d1493
Cross-reference rows in the verse sheet (and the other flat row buttons)
showed as white rows on the Paper ground on the phone: Suru draws a white
plate under a flat Button. The background is now transparent, with a grey
tint while pressed that reads on Paper, White and dark.

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

Delta review, level medium, commit 3a926d1, range 4d587ab..3a926d1

Files: qml/controls/RowButton.qml (reviewed with its users TaskRow.qml, RefRows.qml, StarterPage.qml, ModulesPage.qml, VerseSheet.qml).

No high or medium findings. None of the five users override background, checked or highlighted, so none relied on the old plate. Press feedback is kept (grey 0.18 tint on down), which reads on Paper, White and dark. The disabled dim still comes from opacity.

Findings outside the diff:

  • low · qml/controls/RowButton.qml:18 · The custom background draws nothing for visualFocus, so with a hardware keyboard or switch access the focused row has no indicator (the Default style's focus ring is gone with the replaced background). Touch use on the phone is unaffected.
Delta review, level medium, commit 3a926d1, range 4d587ab..3a926d1 Files: qml/controls/RowButton.qml (reviewed with its users TaskRow.qml, RefRows.qml, StarterPage.qml, ModulesPage.qml, VerseSheet.qml). No high or medium findings. None of the five users override background, checked or highlighted, so none relied on the old plate. Press feedback is kept (grey 0.18 tint on `down`), which reads on Paper, White and dark. The disabled dim still comes from opacity. Findings outside the diff: - low · qml/controls/RowButton.qml:18 · The custom background draws nothing for `visualFocus`, so with a hardware keyboard or switch access the focused row has no indicator (the Default style's focus ring is gone with the replaced background). Touch use on the phone is unaffected.
ui: RowButton shows a focus ring in the style's highlight (review 372) (#95)
All checks were successful
CI / changes (pull_request) Successful in 9s
CI / rust (pull_request) Successful in 9m10s
CI / audit (pull_request) Successful in 20s
CI / app (pull_request) Successful in 5m9s
CI / e2e (pull_request) Successful in 12m18s
CI / click (pull_request) Successful in 4m26s
ad75aa3f93
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Collaborator

Answer to review 372. It found one low issue: no keyboard focus indicator on RowButton. Fixed in ad75aa3: a 2 px ring in the style's palette.highlight while visualFocus.

The owner's report that cross-references were bright white on Paper is fixed in 3a926d1. Suru drew a white plate under the flat RowButton; it now sits on the sheet's own ground.

The phone has build feat/lectern-light-ground@ad75aa3f9. In the Esther 2:8 verse sheet the cross-reference row is #FAF8F3 (Paper); on the previous build it was #FFFFFF. The same button is used by the verse sheet's actions and by the Modules and Starter rows, so those lose the white plate too.

One more item for the checklist above: in Paper mode, open a verse sheet and check that the cross-references look right, including the grey tint when you press one.

**Answer to review 372.** It found one low issue: no keyboard focus indicator on `RowButton`. Fixed in ad75aa3: a 2 px ring in the style's `palette.highlight` while `visualFocus`. **The owner's report** that cross-references were bright white on Paper is fixed in 3a926d1. Suru drew a white plate under the flat `RowButton`; it now sits on the sheet's own ground. The phone has build `feat/lectern-light-ground@ad75aa3f9`. In the Esther 2:8 verse sheet the cross-reference row is #FAF8F3 (Paper); on the previous build it was #FFFFFF. The same button is used by the verse sheet's actions and by the Modules and Starter rows, so those lose the white plate too. One more item for the checklist above: in Paper mode, open a verse sheet and check that the cross-references look right, including the grey tint when you press one.
Author
Collaborator

Phone sign-off from the owner on build feat/lectern-light-ground@ad75aa3f9, which covers the checklist in 2759 and 2765: "Signed off, good to go".

Phone sign-off from the owner on build `feat/lectern-light-ground@ad75aa3f9`, which covers the checklist in 2759 and 2765: "Signed off, good to go".
claude-review left a comment

Merge gate, level medium, commit ad75aa3f93. Approved.

Checks:

  1. Head is ad75aa3f93: pass.
  2. Reviews 369, 370, 371, 372 and the author's replies (2754, 2765, PR body Review section): no high or medium findings. The mockup low was answered (Mockup section added). Review 372's low (no focus indicator) is fixed in ad75aa3. Review 371's residual low (scroll distance in language-switch) is not a defect. Nothing is left open.
  3. Delta 3a926d1..ad75aa3 is one commit, a 2 px border in row.palette.highlight when row.visualFocus on RowButton's background Rectangle. No defect: the press tint is kept, nothing changes with the mouse or touch, and there is no logic or layout change.
  4. CI on head: changes, rust, audit, app, e2e and click are all success.
  5. Proof has no unrun elevated, maximum or AI-behaviour gate (standard tier). Review-Confidence 95 is in the body. The owner's phone sign-off is the latest issue comment (2766, on ad75aa3f9).

Note, not a blocker: the PR is still a draft with a "WIP:" title, and the API reports mergeable=false. Check this before merging.

Merge gate, level medium, commit ad75aa3f93c3ad55c8b443919057064f6d6b05dc. Approved. Checks: 1. Head is ad75aa3f93c3ad55c8b443919057064f6d6b05dc: pass. 2. Reviews 369, 370, 371, 372 and the author's replies (2754, 2765, PR body Review section): no high or medium findings. The mockup low was answered (Mockup section added). Review 372's low (no focus indicator) is fixed in ad75aa3. Review 371's residual low (scroll distance in language-switch) is not a defect. Nothing is left open. 3. Delta 3a926d1..ad75aa3 is one commit, a 2 px border in row.palette.highlight when row.visualFocus on RowButton's background Rectangle. No defect: the press tint is kept, nothing changes with the mouse or touch, and there is no logic or layout change. 4. CI on head: changes, rust, audit, app, e2e and click are all success. 5. Proof has no unrun elevated, maximum or AI-behaviour gate (standard tier). Review-Confidence 95 is in the body. The owner's phone sign-off is the latest issue comment (2766, on ad75aa3f9). Note, not a blocker: the PR is still a draft with a "WIP:" title, and the API reports mergeable=false. Check this before merging.
claude-bot changed title from WIP: Display: Paper or White light ground (#95) to Display: Paper or White light ground (#95) 2026-10-30 21:16:29 +00:00
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!143
No description provided.