Menu page (tiles, Continue), top page headers, sharp icons (#95 part 4) #146

Merged
claude-bot merged 6 commits from feat/lectern-menu into main 2026-10-31 16:03:35 +00:00
Collaborator

Part 4 of #95.

What

  • The pill's ⋮ opens a Menu page (artboard board C, screen 5): Modules and Settings tiles (Lucide icons in lapis, serif labels), then CONTINUE, a card back to where you were reading (module badge, reference, the Bible's name).
  • Every page except the reading pane has a top header, as on the artboard: an arrow Back, a 26 px serif title, the page's actions and ⋮. Settings, Modules, Go to, the starter page and the Menu share it (owner, 2026-10-31).
  • Icons are sharp on the phone: @2x/@3x copies of each PNG, so Qt loads them at the screen's pixel ratio instead of scaling up a logical-size image.

Blast radius

Tier: trunk
Trunk paths touched: qml/Main.qml, qml/pages/ReadingPane.qml, tools/e2e/ (lib.sh, cases menu-page, display-settings, typed-reference)
Testing tier: standard (also: ship on sight: styling, icons, docs, translations)
Gate / rollback: no flag; revert this merge. No schema or settings change, no core or glue change.

Proof

  • CI on 6073513: green, run 293: rust (fmt, clippy, tests + coverage, deny, audit), app (C++/QML lint, -Werror build, clang-tidy; mem-check peak PSS 167723 kB normal / 172377 kB slow, budget 176000 kB), e2e (38 passed + 4 slow profile, 12 min), click.
  • Fails without the change (new case menu-page):
    • tiles' icons tinted with ink instead of lapis → FAIL "tiles' icon is not lapis… ('#22201c #22201c #1e4fa8 #22201c')".
    • Settings opened with stack.replace (Menu lost) → FAIL "no 'utsb: menu continue ' (x2) after 10 s" (Back no longer returns to the Menu).
  • E2E locally (cargo make e2e-docker, 6073513's QML): 38 cases passed, plus 4 in the slow profile. Every existing case drives the moved Back and ⋮ through lib.sh; the picker's typing field is tapped where the page reports it (utsb: picker field x y), not at a fixed point.
  • Memory: within budget on CI (above). The local slow profile was noisy (171–181 MB), so I ran an A/B on one Rust build against fe00f85's QML: the base read just as high (173–191 MB), so the noise is the host's, not this PR's. The @2x/@3x copies are the same 96 px image, so the memory per icon is unchanged.
  • Shots (cargo make shots, 3 cases passed), below.
  • Phone (Suru): fe00f85 checked in comment 2822 (every Menu path: tiles, Continue, Back to the Menu, then the reading pane). The header build (3c8ad25 + the @2x/@3x copies, same QML as head) shows the header on Menu, Settings, Modules (its ⋮ menu opens below the bar) and Go to. An A/B of the icons with and without @3x shows the blur gone (shot below).

Review

Reviewer: fresh-context review at high (380, 4d3c484): no findings. Mockup check (381): 3 lows. The bar's arrow, position and face became the top header (3c8ad25, owner's call); the Continue subtitle (the module's full description) is recorded as a deviation in docs/10 (a5ecd2c); the dark bar's grey was PageBar's, which now has no background. Delta 382 (fe00f85, medium): 2 lows, no change needed. Delta 383 (6073513, medium, the header, icons and e2e tap): no findings. Deferred: the header's search field, #138. Left open: none.
Review-Confidence: 100/100, a high first review plus medium deltas cover every trunk change through 6073513, nothing left open, CI and the break tests back the new behaviour; not covered by any gate: the owner's phone sign-off on the header's feel and dark mode.

Confidence by part

  • Menu page and its Continue card: high; e2e with fails-without-change, phone checked.
  • Top header across pages: medium; e2e drives every page's Back and ⋮, and phone shots of four pages look right. Read PageBar.qml (implicit height with background: null) and the starter page, whose header shows only while installing or adding Bibles.
  • Navigation in Main.qml (Menu kept under Settings and Modules, cleared on "no Bible"): high; reviewed at high, e2e.
  • Icons @2x/@3x: high; A/B on the phone.

Mockup deviations (artboard: board C, target/mockup/Lapis.dc.html), in docs/10:

  • No search field in the header (#138).
  • History and Bookmarks tiles left out until those features exist.
  • The Continue subtitle is the module's description, which can be long and is elided.

Screenshots

Desktop (Xvfb, Default style):

Menu, light Menu, dark
menu light menu dark

Phone (Suru, Paper):

Menu Settings Modules, ⋮ open Go to
phone menu phone settings phone modules phone picker

Icons without and with @3x:

icons A/B

🤖 Generated with Claude Code

Part 4 of #95. ## What - The pill's ⋮ opens a Menu page (artboard board C, screen 5): Modules and Settings tiles (Lucide icons in lapis, serif labels), then CONTINUE, a card back to where you were reading (module badge, reference, the Bible's name). - Every page except the reading pane has a top header, as on the artboard: an arrow Back, a 26 px serif title, the page's actions and ⋮. Settings, Modules, Go to, the starter page and the Menu share it (owner, 2026-10-31). - Icons are sharp on the phone: @2x/@3x copies of each PNG, so Qt loads them at the screen's pixel ratio instead of scaling up a logical-size image. ## Blast radius **Tier:** trunk **Trunk paths touched:** `qml/Main.qml`, `qml/pages/ReadingPane.qml`, `tools/e2e/` (`lib.sh`, cases `menu-page`, `display-settings`, `typed-reference`) **Testing tier:** standard (also: ship on sight: styling, icons, docs, translations) **Gate / rollback:** no flag; revert this merge. No schema or settings change, no core or glue change. ## Proof - CI on 6073513: green, run 293: rust (fmt, clippy, tests + coverage, deny, audit), app (C++/QML lint, -Werror build, clang-tidy; mem-check peak PSS 167723 kB normal / 172377 kB slow, budget 176000 kB), e2e (38 passed + 4 slow profile, 12 min), click. - Fails without the change (new case `menu-page`): - tiles' icons tinted with ink instead of lapis → FAIL "tiles' icon is not lapis… ('#22201c #22201c #1e4fa8 #22201c')". - Settings opened with `stack.replace` (Menu lost) → FAIL "no 'utsb: menu continue ' (x2) after 10 s" (Back no longer returns to the Menu). - E2E locally (`cargo make e2e-docker`, 6073513's QML): 38 cases passed, plus 4 in the slow profile. Every existing case drives the moved Back and ⋮ through `lib.sh`; the picker's typing field is tapped where the page reports it (`utsb: picker field x y`), not at a fixed point. - Memory: within budget on CI (above). The local slow profile was noisy (171–181 MB), so I ran an A/B on one Rust build against fe00f85's QML: the base read just as high (173–191 MB), so the noise is the host's, not this PR's. The @2x/@3x copies are the same 96 px image, so the memory per icon is unchanged. - Shots (`cargo make shots`, 3 cases passed), below. - Phone (Suru): fe00f85 checked in comment 2822 (every Menu path: tiles, Continue, Back to the Menu, then the reading pane). The header build (3c8ad25 + the @2x/@3x copies, same QML as head) shows the header on Menu, Settings, Modules (its ⋮ menu opens below the bar) and Go to. An A/B of the icons with and without @3x shows the blur gone (shot below). ## Review **Reviewer:** fresh-context review at high (380, 4d3c484): no findings. Mockup check (381): 3 lows. The bar's arrow, position and face became the top header (3c8ad25, owner's call); the Continue subtitle (the module's full description) is recorded as a deviation in docs/10 (a5ecd2c); the dark bar's grey was PageBar's, which now has no background. Delta 382 (fe00f85, medium): 2 lows, no change needed. Delta 383 (6073513, medium, the header, icons and e2e tap): no findings. Deferred: the header's search field, #138. Left open: none. **Review-Confidence:** 100/100, a high first review plus medium deltas cover every trunk change through 6073513, nothing left open, CI and the break tests back the new behaviour; not covered by any gate: the owner's phone sign-off on the header's feel and dark mode. ## Confidence by part - Menu page and its Continue card: high; e2e with fails-without-change, phone checked. - Top header across pages: medium; e2e drives every page's Back and ⋮, and phone shots of four pages look right. Read `PageBar.qml` (implicit height with `background: null`) and the starter page, whose header shows only while installing or adding Bibles. - Navigation in `Main.qml` (Menu kept under Settings and Modules, cleared on "no Bible"): high; reviewed at high, e2e. - Icons @2x/@3x: high; A/B on the phone. Mockup deviations (artboard: board C, target/mockup/Lapis.dc.html), in docs/10: - No search field in the header (#138). - History and Bookmarks tiles left out until those features exist. - The Continue subtitle is the module's description, which can be long and is elided. ## Screenshots Desktop (Xvfb, Default style): | Menu, light | Menu, dark | |---|---| | ![menu light](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-146/menu-page.png) | ![menu dark](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-146/menu-page-dark.png) | Phone (Suru, Paper): | Menu | Settings | Modules, ⋮ open | Go to | |---|---|---|---| | ![phone menu](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-146/phone-menu.png) | ![phone settings](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-146/phone-settings.png) | ![phone modules](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-146/phone-modules-menu.png) | ![phone picker](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-146/phone-picker.png) | Icons without and with @3x: ![icons A/B](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-146/phone-icons-ab.png) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
ui: the pill's menu opens a Menu page: tiles and Continue (#95 part 4)
Some checks failed
CI / changes (pull_request) Successful in 6s
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
4d3c484e04
MenuPage replaces the popup menu: Modules and Settings tiles (MenuTile) and a
Continue card back to the reading place. e2e: menu-page case; e2e_menu taps
the tile, e2e_tap_back leaves both pages.

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

Fresh-context review, level: high (blast radius: trunk; trunk paths qml/Main.qml, qml/pages/ReadingPane.qml, tools/e2e/).
Reviewed commit: 4d3c484e04
Range: origin/main...HEAD

Files reviewed:
docs/10-design.md, po/de.po, po/utstudybible.schaefera.pot, qml/Main.qml, qml/controls/MenuTile.qml, qml/controls/qmldir, qml/pages/MenuPage.qml, qml/pages/ReadingPane.qml, qml/qml.qrc, tools/e2e/cases/display-settings.sh, tools/e2e/cases/menu-page.sh, tools/e2e/lib.sh; read for context: qml/pages/SettingsPage.qml, qml/platform/SystemColours.qml, qml/theme/Theme.qml, qml/controls/RowButton.qml, qml/controls/PageBar.qml, qt/src/reading_model.rs (refresh_bibles, bibles_revision, bible_description), tools/e2e/run.sh, tools/mem-check/run.sh, and every e2e case that uses e2e_menu / e2e_open_modules / e2e_tap_settings / e2e_tap_back / e2e_tap_close.

Findings: none with a concrete failure scenario at high, medium or low.

What I checked and found sound:

  • Main.qml: showMenu connects the tiles' signals to pages pushed on top of the Menu; the noBible path (stack.pop(null) then the starter page) clears the Menu too, and "bible installed" pops only the starter, so no stale Menu is left when the last Bible is removed from the manager opened from the Menu.
  • ReadingPane: nothing else references the removed Menu, modulesRequested or settingsRequested (grep over qml, tools, docs, qt).
  • MenuPage: every member it uses exists (biblesRevision, refreshBibles, bibleCount, bibleName, bibleDescription, SystemColours roles, Theme.where and serifFamily, both icon PNGs); fullName re-evaluates on biblesRevision and moduleName.
  • e2e: e2e_under_menu is set in e2e_menu (not in a subshell) and reset in e2e_start; e2e_tap_back's first tap waits on the Menu page's re-report, which the StackView.onActivated reporter produces, so the two-tap Back is consistent for the callers (module-manager, display-settings, red-letters, light-ground, etc.). display-settings.sh loses the old popup menu's icon-colour check, which no longer applies.

Not verified by me, left to CI and the phone: whether a tap on a tile's icon area (the ToolButton inside MenuTile's contentItem, above or below the sibling MouseArea in z-order) reaches the MouseArea. The e2e case taps the tile centre only, so it would not show a dead icon area; worth tapping the icon and the label on the phone.

Fresh-context review, level: high (blast radius: trunk; trunk paths qml/Main.qml, qml/pages/ReadingPane.qml, tools/e2e/). Reviewed commit: 4d3c484e04161c8c790879a4d558d88c6f5ec599 Range: origin/main...HEAD Files reviewed: docs/10-design.md, po/de.po, po/utstudybible.schaefera.pot, qml/Main.qml, qml/controls/MenuTile.qml, qml/controls/qmldir, qml/pages/MenuPage.qml, qml/pages/ReadingPane.qml, qml/qml.qrc, tools/e2e/cases/display-settings.sh, tools/e2e/cases/menu-page.sh, tools/e2e/lib.sh; read for context: qml/pages/SettingsPage.qml, qml/platform/SystemColours.qml, qml/theme/Theme.qml, qml/controls/RowButton.qml, qml/controls/PageBar.qml, qt/src/reading_model.rs (refresh_bibles, bibles_revision, bible_description), tools/e2e/run.sh, tools/mem-check/run.sh, and every e2e case that uses e2e_menu / e2e_open_modules / e2e_tap_settings / e2e_tap_back / e2e_tap_close. Findings: none with a concrete failure scenario at high, medium or low. What I checked and found sound: - Main.qml: showMenu connects the tiles' signals to pages pushed on top of the Menu; the noBible path (stack.pop(null) then the starter page) clears the Menu too, and "bible installed" pops only the starter, so no stale Menu is left when the last Bible is removed from the manager opened from the Menu. - ReadingPane: nothing else references the removed Menu, modulesRequested or settingsRequested (grep over qml, tools, docs, qt). - MenuPage: every member it uses exists (biblesRevision, refreshBibles, bibleCount, bibleName, bibleDescription, SystemColours roles, Theme.where and serifFamily, both icon PNGs); fullName re-evaluates on biblesRevision and moduleName. - e2e: e2e_under_menu is set in e2e_menu (not in a subshell) and reset in e2e_start; e2e_tap_back's first tap waits on the Menu page's re-report, which the StackView.onActivated reporter produces, so the two-tap Back is consistent for the callers (module-manager, display-settings, red-letters, light-ground, etc.). display-settings.sh loses the old popup menu's icon-colour check, which no longer applies. Not verified by me, left to CI and the phone: whether a tap on a tile's icon area (the ToolButton inside MenuTile's contentItem, above or below the sibling MouseArea in z-order) reaches the MouseArea. The e2e case taps the tile centre only, so it would not show a dead icon area; worth tapping the icon and the label on the phone.
claude-review left a comment

Mockup check

Compared: Lapis.dc.html, Board C, screen 5 "Menu (one level down), light", and the palette notes, against target/shots/menu-page-01-menu-light.png and menu-page-01-menu-dark.png (menu-page case, run at 4d3c484), and against qml/pages/MenuPage.qml and qml/controls/MenuTile.qml.

Matches the artboard:

  • Tile grid: 2 columns, 10 px gap, 96 px tiles, 12 px radius, 1 px hairline border, 14 px padding, 20 px page margin. Icon is top left at 26 px in lapis, label bottom left in Crimson Pro 19 px.
  • CONTINUE label: 11 px with 2 px letter spacing, secondary colour, 4 px inset (the artboard's 24 px).
  • Continue card: hairlines above and below, 42 px outlined circle with the module name at 12 px bold and 0.7 px letter spacing in lapis, 19 px serif reference, 13 px secondary full name, chevron at the right.
  • Colour roles come from SystemColours and match the palette notes: ground #FAF8F3 / #17161A, text #22201C / #ECE8E0, accent #1E4FA8 / #8FB0F0, hairline #E4DFD3. Light and dark both read correctly.
  • Wording and order are the same: Modules, Settings, then CONTINUE.

Differences the PR body gives a sound reason for (no finding): History and Bookmarks tiles left out (no feature yet), no search field (not built), chevron as a text glyph, bold in place of 600 (Qt has no 600 weight on this font).

Low:

  • qml/controls/PageBar.qml:30 and :39. The artboard has a top bar with a Lucide back arrow and a 26 px Crimson Pro "Menu" title. The shot has the app-wide bottom PageBar with a "‹ Back" text button and a 13 px bold sans title. The PR body says only "big serif title left out (title is in the bar)", which does not explain the arrow, the bar's position or the title's face. The bottom bar is the app convention (docs/04, thumb reach), but the body's "Mockup" section should say so.
  • qml/pages/MenuPage.qml:~160. The artboard's Continue subtitle is a short name ("American Standard Version"). The shot shows the full SWORD description, which is elided with "…" for KJV ("King James Version (1769) with Strongs Numbers and Morphol…"). Module data, not a styling difference. Worth knowing because the elided text carries no meaning.
  • In the dark shot the bottom bar is light grey. It is PageBar, unchanged by this PR, and is the Xvfb style's own colouring, so not this PR's concern.

No medium findings.

## Mockup check Compared: Lapis.dc.html, Board C, screen 5 "Menu (one level down), light", and the palette notes, against target/shots/menu-page-01-menu-light.png and menu-page-01-menu-dark.png (menu-page case, run at 4d3c484), and against qml/pages/MenuPage.qml and qml/controls/MenuTile.qml. Matches the artboard: - Tile grid: 2 columns, 10 px gap, 96 px tiles, 12 px radius, 1 px hairline border, 14 px padding, 20 px page margin. Icon is top left at 26 px in lapis, label bottom left in Crimson Pro 19 px. - CONTINUE label: 11 px with 2 px letter spacing, secondary colour, 4 px inset (the artboard's 24 px). - Continue card: hairlines above and below, 42 px outlined circle with the module name at 12 px bold and 0.7 px letter spacing in lapis, 19 px serif reference, 13 px secondary full name, chevron at the right. - Colour roles come from SystemColours and match the palette notes: ground #FAF8F3 / #17161A, text #22201C / #ECE8E0, accent #1E4FA8 / #8FB0F0, hairline #E4DFD3. Light and dark both read correctly. - Wording and order are the same: Modules, Settings, then CONTINUE. Differences the PR body gives a sound reason for (no finding): History and Bookmarks tiles left out (no feature yet), no search field (not built), chevron as a text glyph, bold in place of 600 (Qt has no 600 weight on this font). Low: - qml/controls/PageBar.qml:30 and :39. The artboard has a top bar with a Lucide back arrow and a 26 px Crimson Pro "Menu" title. The shot has the app-wide bottom PageBar with a "‹ Back" text button and a 13 px bold sans title. The PR body says only "big serif title left out (title is in the bar)", which does not explain the arrow, the bar's position or the title's face. The bottom bar is the app convention (docs/04, thumb reach), but the body's "Mockup" section should say so. - qml/pages/MenuPage.qml:~160. The artboard's Continue subtitle is a short name ("American Standard Version"). The shot shows the full SWORD description, which is elided with "…" for KJV ("King James Version (1769) with Strongs Numbers and Morphol…"). Module data, not a styling difference. Worth knowing because the elided text carries no meaning. - In the dark shot the bottom bar is light grey. It is PageBar, unchanged by this PR, and is the Xvfb style's own colouring, so not this PR's concern. No medium findings.
docs: record the Menu page's bar and Continue subtitle deviations from the artboard (review 1, #95)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / rust (pull_request) Successful in 5m7s
CI / audit (pull_request) Successful in 11s
CI / app (pull_request) Successful in 3m46s
CI / e2e (pull_request) Successful in 12m59s
CI / click (pull_request) Successful in 1m49s
a5ecd2c2a3
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Collaborator

Round 1 answers (fix commit a5ecd2c, docs only).

  • PageBar (low, bar position/arrow/title face): accepted as a recorded deviation, not a code change. The bottom PageBar is the app-wide convention (thumb reach, docs/04); restyling it to the artboard's top bar with arrow and serif title touches every page and is a separate change. Mockup deviation is now listed in docs/10-design.md under the Menu page, and applies to the PR body's Mockup section too: bottom bar, text Back, bold sans title.
  • Continue subtitle (low): module data, not styling. SWORD has no short name, only the description, so it is shown elided. Recorded in docs/10-design.md.
  • Not-verified note (tile icon area taps): left for the phone check; the checklist will include tapping a tile's icon and its label.
Round 1 answers (fix commit a5ecd2c, docs only). - PageBar (low, bar position/arrow/title face): accepted as a recorded deviation, not a code change. The bottom PageBar is the app-wide convention (thumb reach, docs/04); restyling it to the artboard's top bar with arrow and serif title touches every page and is a separate change. Mockup deviation is now listed in docs/10-design.md under the Menu page, and applies to the PR body's Mockup section too: bottom bar, text Back, bold sans title. - Continue subtitle (low): module data, not styling. SWORD has no short name, only the description, so it is shown elided. Recorded in docs/10-design.md. - Not-verified note (tile icon area taps): left for the phone check; the checklist will include tapping a tile's icon and its label.
e2e: the Menu's tile colours checked, Back-to-Menu counted once the page is up (#95)
Some checks failed
CI / changes (pull_request) Successful in 7s
CI / rust (pull_request) Successful in 5m21s
CI / audit (pull_request) Successful in 9s
CI / app (pull_request) Successful in 2m51s
CI / e2e (pull_request) Has been cancelled
CI / click (pull_request) Has been cancelled
fe00f85fae
The tiles log their icon and label colours; menu-page asserts lapis icons
and text-coloured names in both modes (replaces the removed menu-icon check).
The Menu reports itself only while it is the shown page, and the case
counts after Settings/Modules opened, so a late report can't pass for
Back returning to the Menu.

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

Review level: medium, delta. Commit fe00f85. Range a5ecd2c..fe00f85.

Files: qml/controls/MenuTile.qml, qml/pages/MenuPage.qml, tools/e2e/cases/menu-page.sh (also read tools/e2e/lib.sh, qml/controls/PageBar.qml).

No high or medium findings.

  • The status guard in the reporter timer is sound. Every path that should log still restarts the timer through StackView.onActivated, including the return from Settings and Modules. The guard also stops a Menu hidden under a pushed page from logging, which is what the n counts relied on.
  • Other consumers of the 'utsb: menu ' lines (e2e_menu, e2e_tap_back, e2e_page_menu) only count 'menu continue', 'menu modules' or 'menu settings' with a trailing space. The new 'menu tile icon' line matches none of them.
  • The tile-colour check compares the same string formats on both sides (Qt colour strings), so it will not fail on formatting.

Low, no action needed:

  • low · tools/e2e/cases/menu-page.sh:31 · The sed reads the 'tile icon' line right after 'menu modules' appears. The reporter logs both in one handler, and e2e_shot runs between them, so the race is theoretical. If it ever triggers, the case fails with an empty '$tile' rather than passing wrongly.
  • low · tools/e2e/cases/menu-page.sh:27 · The lapis hex values are hard-coded here, apart from Theme. A palette change fails the case loudly (fail-closed), not silently.
Review level: medium, delta. Commit fe00f85. Range a5ecd2c..fe00f85. Files: qml/controls/MenuTile.qml, qml/pages/MenuPage.qml, tools/e2e/cases/menu-page.sh (also read tools/e2e/lib.sh, qml/controls/PageBar.qml). No high or medium findings. - The status guard in the reporter timer is sound. Every path that should log still restarts the timer through StackView.onActivated, including the return from Settings and Modules. The guard also stops a Menu hidden under a pushed page from logging, which is what the n counts relied on. - Other consumers of the 'utsb: menu ' lines (e2e_menu, e2e_tap_back, e2e_page_menu) only count 'menu continue', 'menu modules' or 'menu settings' with a trailing space. The new 'menu tile icon' line matches none of them. - The tile-colour check compares the same string formats on both sides (Qt colour strings), so it will not fail on formatting. Low, no action needed: - low · tools/e2e/cases/menu-page.sh:31 · The sed reads the 'tile icon' line right after 'menu modules' appears. The reporter logs both in one handler, and e2e_shot runs between them, so the race is theoretical. If it ever triggers, the case fails with an empty '$tile' rather than passing wrongly. - low · tools/e2e/cases/menu-page.sh:27 · The lapis hex values are hard-coded here, apart from Theme. A palette change fails the case loudly (fail-closed), not silently.
Author
Collaborator

Phone check on fe00f85 (Volla, Suru, Paper; journal build 0.0.1 feat/lectern-menu@fe00f85fa), driven with ute2e:

  • The pill's ⋮ opens the Menu page: Modules and Settings tiles, Continue card "Gen 10 · Berean Standard Bible".
  • Tile colours on the phone: menu tile icon #1e4fa8 label #22201c accent #1e4fa8 text #22201c (lapis icons, names in the text colour; Suru doesn't tint them).
  • Settings → settings opened; Back → the Menu again (menu continue logged), not the text.
  • Modules → modules rows 274 ready; Back → the Menu again.
  • Continue → the reading pane at Genesis 10, BSB, where it was.

Also on fe00f85: menu-page now checks the tile colours (light #1e4fa8, dark #8fb0f0), and Back-to-Menu is counted once the opened page is up (a stray second report of the Menu used to satisfy it). Fails without the change: icons tinted with the text colour → FAIL on the colour check; Settings opened with stack.replace → FAIL "no 'utsb: menu continue ' (x2)". Delta review 382: clean (2 lows, no change needed).

For the owner:

  • Feel of the Menu page (tile size, Continue card) and dark mode on the phone.
  • Sign-off. Open question: the artboard's top header (← Menu + search field). Here the Menu keeps the app-wide bottom page bar (deviation in docs/10), and search is #138.
Phone check on fe00f85 (Volla, Suru, Paper; journal `build 0.0.1 feat/lectern-menu@fe00f85fa`), driven with ute2e: - [x] The pill's ⋮ opens the Menu page: Modules and Settings tiles, Continue card "Gen 10 · Berean Standard Bible". - [x] Tile colours on the phone: `menu tile icon #1e4fa8 label #22201c accent #1e4fa8 text #22201c` (lapis icons, names in the text colour; Suru doesn't tint them). - [x] Settings → `settings opened`; Back → the Menu again (`menu continue` logged), not the text. - [x] Modules → `modules rows 274 ready`; Back → the Menu again. - [x] Continue → the reading pane at Genesis 10, BSB, where it was. Also on fe00f85: menu-page now checks the tile colours (light `#1e4fa8`, dark `#8fb0f0`), and Back-to-Menu is counted once the opened page is up (a stray second report of the Menu used to satisfy it). Fails without the change: icons tinted with the text colour → FAIL on the colour check; Settings opened with `stack.replace` → FAIL "no 'utsb: menu continue ' (x2)". Delta review 382: clean (2 lows, no change needed). For the owner: - [ ] Feel of the Menu page (tile size, Continue card) and dark mode on the phone. - [ ] Sign-off. Open question: the artboard's top header (← Menu + search field). Here the Menu keeps the app-wide bottom page bar (deviation in docs/10), and search is #138.
ui: every page's bar is a top header, as the artboard: arrow Back, serif title (#95)
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / rust (pull_request) Successful in 5m25s
CI / audit (pull_request) Successful in 10s
CI / app (pull_request) Successful in 2m48s
CI / e2e (pull_request) Successful in 13m7s
CI / click (pull_request) Successful in 1m49s
3c8ad25c86
Owner, 2026-10-31: the Menu's "← Menu" header now, on every page so none
is the odd one out (replaces the 2026-10-27 bottom-bar rule in docs/04).
PageBar is the page's header: the pill's arrow Back, the title in the
serif at 26 px, actions and ⋮ at the right, its menu opening below.
e2e taps Back and ⋮ at the top corners; the Picker reports its typing
field's place for typed-reference. Gates not yet run on this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner: the Menu's icons looked blown up. Without an @Nx file Qt loads a
PNG icon at its logical size and the 2.625 screen scale blurs it; with
one it loads at device resolution (A/B on the phone: the tile with an
@3x copy sharp, the one without blurred). render.sh writes the copies;
still PNGs, no QtSvg (docs/07 budgets).

PageBar without a background had no height on the phone (the title
overlapped the page): contentHeight is one touch target.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
e2e: tap the picker's typing field where it says it is, under the new header (#95)
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / rust (pull_request) Successful in 3m53s
CI / audit (pull_request) Successful in 9s
CI / app (pull_request) Successful in 2m21s
CI / e2e (pull_request) Successful in 12m35s
CI / click (pull_request) Successful in 1m25s
60735130b6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-review left a comment

Level: medium, delta. Commit 6073513. Range fe00f85..6073513.

Files reviewed: docs/04-features.md, docs/06-sources.md, docs/10-design.md, po/de.po, po/utstudybible.schaefera.pot, qml/controls/PageBar.qml, qml/controls/MenuTile.qml, qml/controls/IconMenuItem.qml, qml/pages/MenuPage.qml, ModulesPage.qml, PickerPage.qml, SettingsPage.qml, StarterPage.qml, VerseSheet.qml, qml/qml.qrc (all 6 new @2x/@3x pairs listed), qml/icons/*@2x/@3x.png (listed only), tools/e2e/lib.sh, tools/e2e/cases/typed-reference.sh, tools/icons/render.sh.

Findings: none at medium or high. I traced each of these and found no failing scenario:

  • Every icon.source user (PageBar, MenuTile, IconMenuItem, ModulesPage, VerseSheet) sets icon.width/height, so the @2x/@3x lookup does not change their logical size.
  • The header's Back and ⋮ taps (28,32 and w-28,32) match the padding and Theme.touch geometry.
  • Page menus open under the bar (y = bar.height).
  • The Starter's footer buttons are untouched.
  • The Picker's "picker field" log is emitted after the grid log and is counted from before the picker opens.

No diff-line comments.

Level: medium, delta. Commit 6073513. Range fe00f85..6073513. Files reviewed: docs/04-features.md, docs/06-sources.md, docs/10-design.md, po/de.po, po/utstudybible.schaefera.pot, qml/controls/PageBar.qml, qml/controls/MenuTile.qml, qml/controls/IconMenuItem.qml, qml/pages/MenuPage.qml, ModulesPage.qml, PickerPage.qml, SettingsPage.qml, StarterPage.qml, VerseSheet.qml, qml/qml.qrc (all 6 new @2x/@3x pairs listed), qml/icons/*@2x/@3x.png (listed only), tools/e2e/lib.sh, tools/e2e/cases/typed-reference.sh, tools/icons/render.sh. Findings: none at medium or high. I traced each of these and found no failing scenario: - Every icon.source user (PageBar, MenuTile, IconMenuItem, ModulesPage, VerseSheet) sets icon.width/height, so the @2x/@3x lookup does not change their logical size. - The header's Back and ⋮ taps (28,32 and w-28,32) match the padding and Theme.touch geometry. - Page menus open under the bar (y = bar.height). - The Starter's footer buttons are untouched. - The Picker's "picker field" log is emitted after the grid log and is counted from before the picker opens. No diff-line comments.
claude-bot changed title from WIP: Menu page: tiles and Continue (#95 part 4) to Menu page (tiles, Continue), top page headers, sharp icons (#95 part 4) 2026-10-31 14:57:53 +00:00
Author
Collaborator

Ready for your phone sign-off. CI is green on 6073513 and Review-Confidence is 100. The build on the phone (3c8ad25 + icon copies) has the same QML as head.

I checked these on the phone myself (shots in the body):

  • ⋮ in the pill → Menu; the tiles open Modules and Settings; Back returns to the Menu, then to the text; Continue goes back to the text
  • Top header on Menu, Settings, Modules (⋮ menu opens below it) and Go to
  • Icons sharp (A/B with and without @3x)

For you:

  • The header's feel: arrow Back at the top left, serif title (reach and size OK on your phone?)
  • Dark mode (system setting): Menu and a page header legible, tiles' icons lapis
  • Sign-off. After that I run the gate approval and merge, then start part 5 (Lectern rebrand)

🤖 Generated with Claude Code

Ready for your phone sign-off. CI is green on 6073513 and Review-Confidence is 100. The build on the phone (3c8ad25 + icon copies) has the same QML as head. I checked these on the phone myself (shots in the body): - [x] ⋮ in the pill → Menu; the tiles open Modules and Settings; Back returns to the Menu, then to the text; Continue goes back to the text - [x] Top header on Menu, Settings, Modules (⋮ menu opens below it) and Go to - [x] Icons sharp (A/B with and without @3x) For you: - [ ] The header's feel: arrow Back at the top left, serif title (reach and size OK on your phone?) - [ ] Dark mode (system setting): Menu and a page header legible, tiles' icons lapis - [ ] Sign-off. After that I run the gate approval and merge, then start part 5 (Lectern rebrand) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Author
Collaborator

Owner sign-off on the phone (2026-10-31, in session): "Looks good". That covers the header's feel, dark mode and the checklist in comment 2832. Next: the gate approval, then the merge.

🤖 Generated with Claude Code

Owner sign-off on the phone (2026-10-31, in session): "Looks good". That covers the header's feel, dark mode and the checklist in comment 2832. Next: the gate approval, then the merge. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-review left a comment

Merge gate: approved at 6073513.

Checked:

  • Reviews 380 (high), 381 (mockup), 382 and 383 (deltas): no high or medium findings. The lows are answered in the PR body and docs/10.
  • The PR head equals 6073513, the last reviewed commit. git log 6073513..HEAD is empty, so no commits came after the last review round.
  • CI on 6073513 is green: changes, rust, audit, app, e2e, click (run 293).
  • Testing tier is standard plus ship on sight. Full E2E ran (CI and local), with break tests showing the new menu-page case fails without the change. No elevated, maximum or AI-behavior gate is left unrun.
  • Review-Confidence 100 is stated in the body. The owner's phone sign-off ("Looks good") is recorded in PR comment 2833.
Merge gate: approved at 6073513. Checked: - Reviews 380 (high), 381 (mockup), 382 and 383 (deltas): no high or medium findings. The lows are answered in the PR body and docs/10. - The PR head equals 6073513, the last reviewed commit. `git log 6073513..HEAD` is empty, so no commits came after the last review round. - CI on 6073513 is green: changes, rust, audit, app, e2e, click (run 293). - Testing tier is standard plus ship on sight. Full E2E ran (CI and local), with break tests showing the new `menu-page` case fails without the change. No elevated, maximum or AI-behavior gate is left unrun. - Review-Confidence 100 is stated in the body. The owner's phone sign-off ("Looks good") is recorded in PR comment 2833.
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!146
No description provided.