Settings redesign: flat list and pages (#148 step 1) #149

Merged
claude-bot merged 9 commits from feat/redesign-settings into main 2026-11-03 09:41:21 +00:00
Collaborator

What

Settings becomes the board E flat list with sub-pages: Text and layout, Light background, Language, Module sources. Text and layout has a fixed-height sample of two verses, and all three sliders take effect at each step. New controls (SectionLabel, ValueRow, LapisSwitch, Segmented), new e2e cases settings-pages and slider-steps. Refs #148.

Blast radius

Tier: trunk
Trunk paths touched: tools/e2e/, tools/mem-check/ (CI PSS baseline 176000 -> 185000 kB; docs/09 and docs/01 say why)
Testing tier: standard (also: UI, gate config)
Gate / rollback: revert this merge.

Proof

  • CI green on 7799369: changes, rust, audit, app, e2e, click.
  • Local e2e on the final code: slider-steps, display-spacing, display-settings, display-settings-kill, settings-pages, running-text, verse-text-tap, 7 passed.
  • Fails without the change: slider-steps with the old LabelledSlider gives FAIL: no 'utsb: line spacing 200' (x1) after 10 s.
  • Memory: cargo make app-docker peak PSS 171658 kB normal, 177250 kB slow, budget 185000 kB. main itself measured 175827 kB in the slow profile, so the baseline moves to 185000 kB, 10% over the normal median again. This change adds no start-up work and loads no new module data. A slider drag now re-lays out the reading text at each step, as text size already did.
  • Phone: the owner tried feat/redesign-settings@779936938 and replied "Works, go for it". An earlier round on the phone led to the two-verse sample, readable slider labels in dark, per-step sliders and the fixed height. Build left installed.
  • Mockup: board E artboards E1, E2, E3, E9. Deviations: sliders are still Suru-styled; the sample is two fixed verses (John 3:16-17) at a fixed height, cut short at large sizes; About opens the existing build info popup.

Screenshots

Text and layout, light (final):

Text and layout, light

The two dark shots were taken before the sample changed; the rest of each page is the same.

Text and layout, dark (E9):

Text and layout, dark

Settings list, dark:

Settings list, dark

Review

Reviewer: fresh-context code-review at high on bc3c56d (2 low findings, 2 fixed in 20de951), then medium delta reviews on fd2775f and 7799369 (no findings). 0 declined, 0 deferred, 0 left open.
Review-Confidence: 85/100, trunk was reviewed at high with two medium deltas and CI is green, but no test drives the new About row or the Module sources switches.

Confidence by part

  • Text and layout, its sliders and sample: high, covered by e2e and tried on the phone.
  • Settings list and sub-pages: medium, e2e opens each page and the owner tried the build.
  • About row and Module sources switches: low, no e2e drives them. settings-pages only opens that page and shoots it. Look here first.
  • mem-check baseline: high, numbers from the CI runs above.

🤖 Generated with Claude Code

## What Settings becomes the board E flat list with sub-pages: Text and layout, Light background, Language, Module sources. Text and layout has a fixed-height sample of two verses, and all three sliders take effect at each step. New controls (SectionLabel, ValueRow, LapisSwitch, Segmented), new e2e cases settings-pages and slider-steps. Refs #148. ## Blast radius **Tier:** trunk **Trunk paths touched:** tools/e2e/, tools/mem-check/ (CI PSS baseline 176000 -> 185000 kB; docs/09 and docs/01 say why) **Testing tier:** standard (also: UI, gate config) **Gate / rollback:** revert this merge. ## Proof - CI green on 7799369: changes, rust, audit, app, e2e, click. - Local e2e on the final code: slider-steps, display-spacing, display-settings, display-settings-kill, settings-pages, running-text, verse-text-tap, 7 passed. - Fails without the change: slider-steps with the old LabelledSlider gives `FAIL: no 'utsb: line spacing 200' (x1) after 10 s`. - Memory: `cargo make app-docker` peak PSS 171658 kB normal, 177250 kB slow, budget 185000 kB. main itself measured 175827 kB in the slow profile, so the baseline moves to 185000 kB, 10% over the normal median again. This change adds no start-up work and loads no new module data. A slider drag now re-lays out the reading text at each step, as text size already did. - Phone: the owner tried `feat/redesign-settings@779936938` and replied "Works, go for it". An earlier round on the phone led to the two-verse sample, readable slider labels in dark, per-step sliders and the fixed height. Build left installed. - Mockup: board E artboards E1, E2, E3, E9. Deviations: sliders are still Suru-styled; the sample is two fixed verses (John 3:16-17) at a fixed height, cut short at large sizes; About opens the existing build info popup. ## Screenshots Text and layout, light (final): ![Text and layout, light](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-149/settings-text-layout-light.png) The two dark shots were taken before the sample changed; the rest of each page is the same. Text and layout, dark (E9): ![Text and layout, dark](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-149/settings-text-layout-dark.png) Settings list, dark: ![Settings list, dark](https://code.austinschaefer.com/schaefera/utStudyBIble/wiki/raw/images/pr-149/settings-list-dark.png) ## Review **Reviewer:** fresh-context `code-review` at high on bc3c56d (2 low findings, 2 fixed in 20de951), then medium delta reviews on fd2775f and 7799369 (no findings). 0 declined, 0 deferred, 0 left open. **Review-Confidence:** 85/100, trunk was reviewed at high with two medium deltas and CI is green, but no test drives the new About row or the Module sources switches. ## Confidence by part - Text and layout, its sliders and sample: high, covered by e2e and tried on the phone. - Settings list and sub-pages: medium, e2e opens each page and the owner tried the build. - About row and Module sources switches: low, no e2e drives them. settings-pages only opens that page and shoots it. Look here first. - mem-check baseline: high, numbers from the CI runs above. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
e2e: drive Settings through its pages; settings-pages case (#148)
Some checks failed
CI / changes (pull_request) Successful in 9s
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
bc3c56d64a
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-review left a comment

Fresh-context review. Level: high. Blast radius: trunk (tools/e2e/lib.sh, tools/e2e/cases/). Reviewed commit: bc3c56d64a. Range: origin/main...HEAD.

I found no high or medium defects, so this is a COMMENT. I read every hunk of tools/e2e/lib.sh and tools/e2e/cases/ in context. I followed each changed helper to its callers and to the log lines emitted by the new QML pages: display-settings, display-spacing, display-settings-kill, running-text, verse-text-tap, light-ground, language-switch, typed-reference, tap-retry, module-manager, the red-letters cases and tools/mem-check/run.sh. Nothing in those paths breaks:

  • Every log prefix the helpers wait on is emitted by the new pages.
  • The e2e_in_sub flag is cleared in e2e_tap_back before the under-menu step.
  • Pushed pages re-report on StackView.onActivated, so a tap after the wait lands after the transition.

Findings outside the diff: none.

Files reviewed: tools/e2e/lib.sh, tools/e2e/cases/settings-pages.sh, tools/e2e/cases/display-spacing.sh, tools/e2e/cases/language-switch.sh, tools/e2e/cases/light-ground.sh, tools/e2e/cases/running-text.sh, tools/e2e/cases/verse-text-tap.sh, tools/e2e/cases/typed-reference.sh, tools/e2e/cases/tap-retry.sh, tools/e2e/cases/module-manager.sh, tools/e2e/cases/display-settings.sh, tools/e2e/cases/display-settings-kill.sh, tools/e2e/cases/red-letters*.sh, tools/mem-check/run.sh, qml/pages/SettingsPage.qml, qml/pages/TextLayoutPage.qml, qml/pages/LanguagePage.qml, qml/pages/LightBackgroundPage.qml, qml/pages/ModuleSourcesPage.qml, qml/controls/LapisSwitch.qml, qml/controls/qmldir, qml/qml.qrc, CLAUDE.md, docs/09-quality-gates.md (log-line references).

Low findings are inline.

Fresh-context review. Level: high. Blast radius: trunk (tools/e2e/lib.sh, tools/e2e/cases/). Reviewed commit: bc3c56d64ad00f3430c359746332c057ac2159e7. Range: origin/main...HEAD. I found no high or medium defects, so this is a COMMENT. I read every hunk of tools/e2e/lib.sh and tools/e2e/cases/ in context. I followed each changed helper to its callers and to the log lines emitted by the new QML pages: display-settings, display-spacing, display-settings-kill, running-text, verse-text-tap, light-ground, language-switch, typed-reference, tap-retry, module-manager, the red-letters cases and tools/mem-check/run.sh. Nothing in those paths breaks: - Every log prefix the helpers wait on is emitted by the new pages. - The e2e_in_sub flag is cleared in e2e_tap_back before the under-menu step. - Pushed pages re-report on StackView.onActivated, so a tap after the wait lands after the transition. Findings outside the diff: none. Files reviewed: tools/e2e/lib.sh, tools/e2e/cases/settings-pages.sh, tools/e2e/cases/display-spacing.sh, tools/e2e/cases/language-switch.sh, tools/e2e/cases/light-ground.sh, tools/e2e/cases/running-text.sh, tools/e2e/cases/verse-text-tap.sh, tools/e2e/cases/typed-reference.sh, tools/e2e/cases/tap-retry.sh, tools/e2e/cases/module-manager.sh, tools/e2e/cases/display-settings.sh, tools/e2e/cases/display-settings-kill.sh, tools/e2e/cases/red-letters*.sh, tools/mem-check/run.sh, qml/pages/SettingsPage.qml, qml/pages/TextLayoutPage.qml, qml/pages/LanguagePage.qml, qml/pages/LightBackgroundPage.qml, qml/pages/ModuleSourcesPage.qml, qml/controls/LapisSwitch.qml, qml/controls/qmldir, qml/qml.qrc, CLAUDE.md, docs/09-quality-gates.md (log-line references). Low findings are inline.
@ -0,0 +15,4 @@
e2e_shot settings-text-layout
e2e_tap_back_one
e2e_in_sub=0
e2e_wait 'utsb: settings typing ' 2
Collaborator

low · The waits on lines 18, 24 and 30 use absolute counts (settings typing 2, 3, 4), where lib.sh's e2e_tap_back and line 39 count relative to a baseline. The Settings reporter restarts on contentY and column-height changes, so one extra fire while the list is first shown would already satisfy ... 2. Then e2e_settings_page taps the next row while the Back transition is still running. StackView drops that tap, and e2e_settings_page has no retry, so it fails with no 'utsb: display ground ' (x1) after 10 s. This is a latent flake, not a deterministic failure. Fix: take e2e_seen=$(e2e_count ...) before each Back, as line 33 does.

low · The waits on lines 18, 24 and 30 use absolute counts (`settings typing` 2, 3, 4), where lib.sh's e2e_tap_back and line 39 count relative to a baseline. The Settings reporter restarts on contentY and column-height changes, so one extra fire while the list is first shown would already satisfy `... 2`. Then e2e_settings_page taps the next row while the Back transition is still running. StackView drops that tap, and e2e_settings_page has no retry, so it fails with `no 'utsb: display ground ' (x1)` after 10 s. This is a latent flake, not a deterministic failure. Fix: take `e2e_seen=$(e2e_count ...)` before each Back, as line 33 does.
@ -0,0 +40,4 @@
# The search field narrows the list to the rows that match.
e2e_tap $((e2e_w / 2)) 100
xdotool type --delay 40 "lang"
Collaborator

low · The header says the typeface choice is saved and shown, and that the search field filters the rows. Nothing asserts either: the case only takes a shot after typing lang. A regression where the search stops filtering, or the typeface does not persist, would pass this case. Fix: assert on a log line, for example a settings rows report after the filter, or read the app's text-scale or serif log.

low · The header says the typeface choice is saved and shown, and that the search field filters the rows. Nothing asserts either: the case only takes a shot after typing `lang`. A regression where the search stops filtering, or the typeface does not persist, would pass this case. Fix: assert on a log line, for example a `settings rows` report after the filter, or read the app's text-scale or serif log.
e2e settings-pages: relative Back waits; assert the typeface is saved and the search filters (#148)
Some checks failed
CI / changes (pull_request) Successful in 8s
CI / rust (pull_request) Successful in 6m31s
CI / audit (pull_request) Successful in 13s
CI / app (pull_request) Failing after 4m41s
CI / e2e (pull_request) Has been skipped
CI / click (pull_request) Has been skipped
20de951edd
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Collaborator

Round 1 answers (fix commit 20de951):

  • settings-pages.sh:18 (absolute wait counts): fixed. Each Back now takes a count of settings typing reports first and waits for one more.
  • settings-pages.sh:43 (header claims not asserted): fixed. The case taps Serif on Text and layout and waits for settings rows ... serif true after Back. After typing lang it waits for settings rows ... shown 1. For these, the settings rows report now carries shown N and serif, and Text and layout reports display typeface.

settings-pages and display-settings pass locally.

Round 1 answers (fix commit 20de951): - settings-pages.sh:18 (absolute wait counts): fixed. Each Back now takes a count of `settings typing` reports first and waits for one more. - settings-pages.sh:43 (header claims not asserted): fixed. The case taps Serif on Text and layout and waits for `settings rows ... serif true` after Back. After typing `lang` it waits for `settings rows ... shown 1`. For these, the settings rows report now carries `shown N` and `serif`, and Text and layout reports `display typeface`. settings-pages and display-settings pass locally.
mem-check: CI baseline 185000 kB, 10% over the normal median again (#148)
All checks were successful
CI / changes (pull_request) Successful in 8s
CI / rust (pull_request) Successful in 7m30s
CI / audit (pull_request) Successful in 12s
CI / app (pull_request) Successful in 3m51s
CI / e2e (pull_request) Successful in 14m18s
CI / click (pull_request) Successful in 2m44s
596dfdd5e5
Main was at 170 MB normal and 175.8 MB slow after the #95 look (run 297,
173 kB under 176000); this PR measured 167 MB normal and 176-180 MB slow
(run 299). The phone budget (80 MB) is unchanged.

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

Other comments:

  • In the settings text view, it would be good to have two verses instead of just one so the user can visualize the verse spacing setting as well.
  • Dark mode text setting labels for "Line spacing" and "Space between verses" seems to still have the dark color associated with the light theme, rather than with the light color associated with the dark theme.
  • In the settings view, change "Finding your place" to "Navigation"
Other comments: - In the settings text view, it would be good to have two verses instead of just one so the user can visualize the verse spacing setting as well. - Dark mode text setting labels for "Line spacing" and "Space between verses" seems to still have the dark color associated with the light theme, rather than with the light color associated with the dark theme. - In the settings view, change "Finding your place" to "Navigation"
settings: two sample verses, readable slider labels in dark, Navigation section (#148)
Some checks failed
CI / changes (pull_request) Successful in 5s
CI / rust (pull_request) Successful in 3m51s
CI / audit (pull_request) Successful in 9s
CI / app (pull_request) Successful in 2m19s
CI / e2e (pull_request) Failing after 13m22s
CI / click (pull_request) Has been skipped
fd2775f16a
Owner's comments on #149: the sample shows the space between verses; the
slider labels take the theme's colours, not the palette's, which stays
light in the dark theme (#84); FINDING YOUR PLACE becomes NAVIGATION.

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

All three comments are fixed in fd2775f:

  • Two verses in the sample: Text and layout now shows John 3:16–17 with the space between verses between them, sized the way the reading pane sizes it. With Running text on, they share one paragraph, so the gap doesn't show there.
  • Dark mode labels: "Line spacing" and "Space between verses" had no colour of their own, so they took Suru's palette, which stays light in the dark theme (#84). They now use the theme's text colour, and their values use the secondary colour, as in E9.
  • "Finding your place": the section is now NAVIGATION, in English and German.

Checked locally: cargo make app-docker and the e2e cases settings-pages, display-settings, display-spacing and running-text pass, and I looked at the Text and layout shot in dark. The Xvfb shot isn't the phone's Suru, so the label colour still needs a look on the phone.

🤖 Generated with Claude Code

All three comments are fixed in fd2775f: - **Two verses in the sample:** Text and layout now shows John 3:16–17 with the space between verses between them, sized the way the reading pane sizes it. With Running text on, they share one paragraph, so the gap doesn't show there. - **Dark mode labels:** "Line spacing" and "Space between verses" had no colour of their own, so they took Suru's palette, which stays light in the dark theme (#84). They now use the theme's text colour, and their values use the secondary colour, as in E9. - **"Finding your place":** the section is now NAVIGATION, in English and German. Checked locally: `cargo make app-docker` and the e2e cases settings-pages, display-settings, display-spacing and running-text pass, and I looked at the Text and layout shot in dark. The Xvfb shot isn't the phone's Suru, so the label colour still needs a look on the phone. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-review left a comment

Review level: medium (delta review). Reviewed commit: fd2775f16a. Range: bc3c56d..HEAD.

Findings: none high, medium or low. I traced these changes and found no concrete failure:

  • The two-verse sample in TextLayoutPage and the properties it uses (verseGap, runningText, serif).
  • The new typeface and shown/serif log lines, and the e2e_last/e2e_wait/e2e_count helpers that settings-pages.sh now relies on.
  • The LabelledSlider SystemColours import.
  • The budget-kb change to 185000 against the docs figures (167 MB normal, 176-180 MB slow).
  • The po and pot entries for the new strings.

Not run: I did not execute the e2e case or the gates; this was static review only.

Files reviewed:
docs/01-pathway.md
docs/09-quality-gates.md
po/de.po
po/lectern.aps.pot
qml/controls/LabelledSlider.qml
qml/pages/SettingsPage.qml
qml/pages/TextLayoutPage.qml
tools/e2e/cases/settings-pages.sh
tools/e2e/lib.sh (helpers only)
tools/mem-check/budget-kb
qml/pages/ReadingPane.qml (verseGap/runningText only)
qml/theme/Theme.qml (where, verseGap only)

Review level: medium (delta review). Reviewed commit: fd2775f16ace3bc97991bc0f8a9d674671fe9963. Range: bc3c56d..HEAD. Findings: none high, medium or low. I traced these changes and found no concrete failure: - The two-verse sample in TextLayoutPage and the properties it uses (verseGap, runningText, serif). - The new typeface and shown/serif log lines, and the e2e_last/e2e_wait/e2e_count helpers that settings-pages.sh now relies on. - The LabelledSlider SystemColours import. - The budget-kb change to 185000 against the docs figures (167 MB normal, 176-180 MB slow). - The po and pot entries for the new strings. Not run: I did not execute the e2e case or the gates; this was static review only. Files reviewed: docs/01-pathway.md docs/09-quality-gates.md po/de.po po/lectern.aps.pot qml/controls/LabelledSlider.qml qml/pages/SettingsPage.qml qml/pages/TextLayoutPage.qml tools/e2e/cases/settings-pages.sh tools/e2e/lib.sh (helpers only) tools/mem-check/budget-kb qml/pages/ReadingPane.qml (verseGap/runningText only) qml/theme/Theme.qml (where, verseGap only)
settings: cap the sample's height, so large text keeps the sliders on the page (#148)
Some checks failed
CI / changes (pull_request) Successful in 5s
CI / rust (pull_request) Successful in 4m6s
CI / audit (pull_request) Successful in 10s
CI / app (pull_request) Successful in 2m24s
CI / e2e (pull_request) Has been cancelled
CI / click (pull_request) Has been cancelled
e64d651db4
display-settings-kill failed in CI: at 200% text and line spacing the two
verses pushed the verse gap slider below the window. Cut short, the sample
keeps where the verses meet, so the space between them still shows. The page
reports on a setting's change too, as the sample's height may not change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Line spacing and the verse gap saved only on release, unlike text size.
The sample shrank with tiny text and moved the sliders; it is now one
height at every size. slider-steps checks each slider with the button
still down, and fails on the old control.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge remote-tracking branch 'origin/main' into feat/redesign-settings
All checks were successful
CI / changes (pull_request) Successful in 4s
CI / rust (pull_request) Successful in 4m2s
CI / audit (pull_request) Successful in 9s
CI / app (pull_request) Successful in 2m23s
CI / e2e (pull_request) Successful in 13m20s
CI / click (pull_request) Successful in 1m26s
7799369386
claude-review left a comment

Delta review, medium level, trunk (tools/e2e). Commit 7799369. Range fd2775f..HEAD (excluding CLAUDE.md).

Files: qml/controls/LabelledSlider.qml, qml/pages/TextLayoutPage.qml, tools/e2e/lib.sh, tools/e2e/cases/slider-steps.sh, tools/e2e/cases/display-spacing.sh.

No defects with a concrete failure scenario found. Checked: onMoved commits per step and the value binding follows the model (same as the text size slider); the report timer now keys off reading.changed, so the fixed-height sample no longer shifts slider coordinates between the e2e reports; the sample's y offset for the cut-short case; e2e_hold_slider_to's press at x-40 then move to the end, and the log-count waits in slider-steps.sh.

Delta review, medium level, trunk (tools/e2e). Commit 7799369. Range fd2775f..HEAD (excluding CLAUDE.md). Files: qml/controls/LabelledSlider.qml, qml/pages/TextLayoutPage.qml, tools/e2e/lib.sh, tools/e2e/cases/slider-steps.sh, tools/e2e/cases/display-spacing.sh. No defects with a concrete failure scenario found. Checked: onMoved commits per step and the value binding follows the model (same as the text size slider); the report timer now keys off reading.changed, so the fixed-height sample no longer shifts slider coordinates between the e2e reports; the sample's y offset for the cut-short case; e2e_hold_slider_to's press at x-40 then move to the end, and the log-count waits in slider-steps.sh.
claude-bot changed title from WIP: Settings redesign: flat list and pages (#148 step 1) to Settings redesign: flat list and pages (#148 step 1) 2026-11-03 09:23:46 +00:00
claude-review left a comment

Merge gate: approved on 7799369.

  • Reviews 388 (high), 389 and 392 (medium deltas): no high or medium findings; the two low findings from 388 were fixed in 20de951.
  • No commits follow 7799369, the last reviewed commit and the head.
  • CI is green on head (combined status success: changes, rust, audit, app, e2e, click).
  • The PR Proof lists no unrun elevated, maximum or AI-behavior gate; the testing tier is standard. The phone trial was done.
  • Residual risk, as the audit states: no e2e case taps the About row or toggles the Module sources switches (Review-Confidence 85).
Merge gate: approved on 7799369. - Reviews 388 (high), 389 and 392 (medium deltas): no high or medium findings; the two low findings from 388 were fixed in 20de951. - No commits follow 7799369, the last reviewed commit and the head. - CI is green on head (combined status success: changes, rust, audit, app, e2e, click). - The PR Proof lists no unrun elevated, maximum or AI-behavior gate; the testing tier is standard. The phone trial was done. - Residual risk, as the audit states: no e2e case taps the About row or toggles the Module sources switches (Review-Confidence 85).
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!149
No description provided.