Add font size and conversation density preferences - #5644
Conversation
|
🤖 Updated font size and conversation density snapshots. Default font + Comfy density15px standard text with balanced conversation spacing. Larger font + Compact density16px standard text while conversation spacing stays compact. Smaller font + Spacious densityCurrent production typography while conversations keep more breathing room. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1f92c81c10
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1a9fa4f299
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6166fa1cd7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
|
Codex Review: Didn't find any major issues. More of your lovely PRs please. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d914d31f73
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
jedwards27
left a comment
There was a problem hiding this comment.
Verdict: REQUEST CHANGES
Reviewed: f8692fa9b52ddcfeb4b95fb4862109983509f131..f0a8ef938a39ff3b8f473b8a0ba4ae002d7771f6 (exact head f0a8ef938a39ff3b8f473b8a0ba4ae002d7771f6)
Risk: medium — app-wide, persisted typography and density state with cross-window synchronization and keyboard-zoom composition.
Blocking finding
A full storage clear leaves the old keyboard zoom multiplier live in other open windows.
desktop/src/shared/lib/fontSizePreference.ts:22-23,42-51,58-72 keeps textZoomFactor only in module memory. Its storage listener handles event.key === null, but it reloads only buzz.appearance.fontSize and reapplies Default through that stale multiplier. Separately, desktop/src/app/useWebviewZoomShortcuts.ts:64-85,91-96,122-125 reads buzz:text-scale only on mount and does not listen for storage changes, so neither its live factor nor zoomFactorRef resets when another window calls localStorage.clear().
I reproduced this from a clean checkout: after Larger + 1.5× keyboard zoom, dispatching the full-clear storage event changes data-font-size to default but leaves --buzz-type-rem at 24px; Default should be 16px. The next Cmd-minus also starts from the stale ref. That breaks the PR's explicit contract to synchronize preferences across open windows, including full local-storage clears during sign-out/dev reset.
Please synchronize/reset the keyboard text-scale state on the same storage boundary, including key === null, and regression-test the composed state. The existing clear assertion at desktop/src/shared/lib/fontSizePreference.test.mjs:90-97 cannot detect this because it does not first activate a non-1 zoom factor; applying 1.5 before the clear makes the current implementation fail.
Other reviewed behavior
The accessibility and direct interaction shape is otherwise sound: the segmented control uses a named fieldset/legend, exposes selection, preserves focus-visible treatment, respects reduced motion, and restores saved state on pointer cancellation/window blur (desktop/src/shared/ui/segmented-control.tsx:81-216; workflow assertions in desktop/tests/e2e/buzz-theme-screenshots.spec.ts:738-755,1019-1140). Fresh Playwright artifacts for Default/Comfy, Larger/Compact, and Smaller/Spacious were inspected and showed legible, unclipped controls and previews. The change remains within its Desktop appearance scope and does not expand relay, tenancy, identity, native persistence, or security contracts.
Validation at matching HEAD
git merge-base HEAD f8692fa...→ pinned base;git diff --check f8692fa...HEAD→ pass; clean worktree.- Independent focused preference suites → 13/13 pass.
- Fresh
build:e2e+ full font-size/density workflow → 1/1 pass, with three inspected screenshots. just desktop-typecheck→ pass.just desktop-check→ pass (existing Biome warnings, exit 0).- Adversarial full-clear probe → fail as expected for this finding:
{"selected":"default","attribute":"default","typeRem":"24px"},probe_rc=1; expected16px. - Full
just desktop-testwas attempted but exceeded the 600-second shared-harness limit before a summary; it is neither claimed pass nor product failure. - Exact-head CI is green for Desktop Core, four smoke shards, two integration shards, relay E2E, macOS build, and release candidate. Those jobs do not cover the zoomed cross-window clear above.
Manual/native evidence: fresh browser workflow screenshots inspected; no native Tauri/VoiceOver run. Native AX behavior remains residual risk, but it does not weaken the deterministic blocking state-transition failure.
|
🤖 Addressed the cross-window keyboard zoom lifecycle finding in
Added a real two-page, same-origin Playwright regression that starts at Larger + 1.5×, clears storage from the peer window, verifies the primary window returns to Default at |
jedwards27
left a comment
There was a problem hiding this comment.
Verdict: APPROVE
Reviewed: f8692fa9b52ddcfeb4b95fb4862109983509f131..17a440888ec308cac81d58e99b52f1c961047e30 (exact head 17a440888ec308cac81d58e99b52f1c961047e30)
Risk: medium — app-wide persisted typography/density state, keyboard-zoom composition, and cross-window reset synchronization.
The prior blocker is resolved. desktop/src/app/useWebviewZoomShortcuts.ts:122-137 now handles both buzz:text-scale storage changes and full clears, reloads the persisted/default factor, updates zoomFactorRef, reapplies composed typography, and removes the listener on unmount. This resets both rendered pixels and the baseline for the next keyboard shortcut.
The two-page regression at desktop/tests/e2e/profile.spec.ts:2561-2643 exercises Larger + 1.5× in one window, localStorage.clear() in another, then verifies Default/16px/cleared scale and a subsequent Cmd-minus from 1.0 (0.9, 14.4px). Mutation testing established causality: removing storage synchronization reproduced the former 24px-instead-of-16px failure; restoring exact-head code passed.
No unresolved material findings remain. The complete affected behavior was rechecked for product/UI/accessibility and systems/integration concerns. Controls, selection indicators, previews, row boundaries, and neighboring settings remained legible and unclipped across Default/Comfy, Larger/Compact, and Smaller/Spacious. The change does not expand relay, tenancy, auth, native persistence, migration, or security contracts.
Validation at matching HEAD
- Full Desktop package suite: 5,000/5,000 pass, 0 fail/skip.
just desktop-typecheck: pass.just desktop-check: pass (2 existing warnings + 2 infos; exit 0).just desktop-build: pass.- Fresh
pnpm -C desktop build:e2e: pass. - Corrected cross-window clear row: 1/1 pass.
- Full appearance interaction/workflow row: 1/1 pass.
- Causal mutation: 1/1 fails as required with stale
24px; restored exact-head build/test: 1/1 pass. git diff --check: pass; review worktrees clean.- Exact-head required CI is green, including Desktop Core/build, four smoke shards, two integration shards, release candidate, Rust lint, Windows, and DCO. The PR is mergeable.
Manual/native evidence: fresh browser screenshots for the three representative appearance combinations were inspected and showed distinct, legible, unclipped states. No native Tauri/VoiceOver journey was run.
Residual risk: OS-delivered shortcut and native screen-reader behavior were not independently exercised. The corrective delta changes browser storage/event synchronization, is covered causally in two windows, and introduces no native code, so this is not a material blocker.
wesbillman
left a comment
There was a problem hiding this comment.
Carl, an automated reviewer, commenting via Wes’s GitHub account.
Royal Court verdict: APPROVE
Reviewed exact head 17a440888ec308cac81d58e99b52f1c961047e30 against merge base f8692fa9b52ddcfeb4b95fb4862109983509f131. All four review lanes found no material code, product, accessibility, persistence, or integration defects.
The persisted font-size and conversation-density stores initialize before React, normalize invalid values, keep previews non-persistent, and synchronize matching-key and full-clear events across windows. Keyboard zoom now updates both its live shortcut ref and composed typography when another window changes or clears buzz:text-scale, resolving the earlier stale-multiplier defect. The two-window regression causally exercises Larger + 1.5x, peer localStorage.clear(), reset to Default/16px, and the next decrement from 1.0.
The virtual typography rem keeps layout geometry fixed while scaling type; density owns spacing independently. The shared segmented control retains native keyboard buttons, named-group semantics, committed aria-pressed state during preview, reduced-motion behavior, and cancellation on pointer loss, blur, and unmount. Representative E2E coverage checks computed geometry, persistence, scrubbing, cancellation, real conversation surfaces, and cross-window reset.
Validation evidence at this head: git diff --check is clean; all applicable GitHub checks are successful or skipped; existing exact-head validation reports 5,000/5,000 Desktop tests plus typecheck, check, build, focused E2E, and a causal mutation test. I did not duplicate CI-equivalent suites locally.
Tests changed substantially because behavior changed: preference unit coverage, appearance interaction/screenshots, real conversation geometry, and the two-window zoom/full-clear regression were added or updated.
Non-code merge note: GitHub currently reports the branch dirty due to an AGENTS.md conflict with current main; resolve/rebase and re-review the resulting head. This approval expires if HEAD moves. Residual risk is native Tauri/VoiceOver and OS-delivered shortcut behavior, which was not independently exercised beyond renderer coverage and supplied media.
Signed-off-by: kenny lopez <klopez4212@gmail.com> Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: kenny lopez <klopez4212@gmail.com> Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: kenny lopez <klopez4212@gmail.com> Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: kenny lopez <klopez4212@gmail.com> Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Co-authored-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Co-authored-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Co-authored-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Co-authored-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Co-authored-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Co-authored-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
…yout previews - Font size ramp is now 13/14/15px (Smaller/Default/Larger) so Default matches production's 14px standard text instead of bumping everyone up - Links and Thread layout switch from dropdowns to the same segmented control as Font size and Conversation density, with scrub-to-preview - SettingsSegmentedControl derives its columns from the option count (was hardcoded 3); legend moved off the grid so it can't skew layout - New live previews: a sample link card (Buzz-gradient SVG thumbnail baked from theme tokens) and a thread layout diagram (inline SVG on theme tokens) that follow the displayed/scrubbed option - Each setting row + its preview grouped as one container so the shared divider no longer separates a preview from its controls - Preview tag restyled as a quiet uppercase annotation, not a control - previewLinkPreviewStyle/previewThreadViewMode override hooks added, matching the existing previewFontSize pattern Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
The virtual typography rem values changed when Smaller/Default/Larger moved from 14/15/16px to 13/14/15px standard text; the tests assert exact --buzz-type-rem pixel values and needed the new expectations. Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
17a4408 to
9117017
Compare
jedwards27
left a comment
There was a problem hiding this comment.
Verdict: APPROVE
Reviewed: 4f9727a4b3d76389f862faa15241e16e2dd36108..91170172eddbdf3a0612e31e2091b6106ab3d408 (exact head 91170172eddbdf3a0612e31e2091b6106ab3d408)
Risk: high — user-visible typography preferences interact with persisted state, cross-window synchronization, keyboard zoom composition, and virtualized conversation layout.
Behavior/contracts traced: preference defaults, preview/cancel/blur behavior, persistence and storage clear, cross-window propagation, keyboard zoom composition, root-versus-virtual typography scaling, density/virtualization behavior, settings accessibility, responsive rendering, and CI/release scope. The series remains focused on the stated preference feature and aligns with VISION.md / TESTING.md. Apparent unrelated files in a raw two-dot comparison are base drift; GitHub's merge topology preserves the base-only script.
Findings: no material blocking or non-blocking findings.
Validation at matching clean head:
pnpm typecheck— passpnpm check— pass (pre-existing/non-material warnings only)cd desktop && pnpm test -- src/shared/lib/conversationDensityPreference.test.mjs src/shared/lib/fontSizePreference.test.mjs— 13/13 passpnpm build— pass (known chunk/dynamic-import warnings only)pnpm -C desktop build:e2e— pass- Playwright
app font size and conversation density apply independently— pass - base/head whitespace check — pass
- Applicable Desktop Core, build, smoke, integration, release-candidate, DCO, and guard jobs — pass at this head
Manual evidence: generated default/comfy, compact/larger, and spacious/smaller states were inspected. Controls and selection states were clear; previews matched choices; no clipping, overlap, or obvious accessibility regression was observed. The implementation keeps the actual root at 16px and scales virtual typography rem, avoiding accidental resizing of rem-based geometry.
Residual risk: exhaustive OS/browser assistive-technology coverage was not performed. Any new head invalidates this approval.
— :bot: Jude’s code review agent
wesbillman
left a comment
There was a problem hiding this comment.
Carl, an automated reviewer, commenting via Wes’s GitHub account.
Royal Court verdict: APPROVE
Reviewed exact head 91170172eddbdf3a0612e31e2091b6106ab3d408 against merge base 50a71137e6f1c56f66e2f7348a917b2d2a1798f0. The Court found no material code, product, accessibility, persistence, or integration defects. This verdict expires if HEAD moves.
The prior cross-window reset blocker remains closed. useWebviewZoomShortcuts handles matching buzz:text-scale storage changes and full clears, reloads the persisted/default factor, updates zoomFactorRef, and reapplies composed typography. The two-window regression exercises Larger + 1.5x, peer localStorage.clear(), reset to Default/16px, and the next decrement from 1.0 to 0.9/14.4px.
Font size changes the virtual typography rem without resizing rem-based layout geometry; conversation density independently owns spacing. Persisted preferences normalize invalid values, initialize before React, and synchronize matching-key and full-clear events. The shared segmented control retains native buttons, named fieldset semantics, committed aria-pressed state during preview, focus-visible and reduced-motion behavior, and scrub cancellation on pointer loss, blur, and unmount. The rebased diff preserves the timeline-virtualization compatibility fix and the updated AGENTS.md typography contract.
Validation at this exact clean head: git diff --check passed. All applicable GitHub checks are successful, including Desktop Core/build, four smoke shards, two integration shards, Desktop E2E relay, release candidate, DCO, and guards. Existing exact-head evidence also reports typecheck/check/build, 13/13 focused preference tests, E2E build, and the focused appearance workflow. I did not duplicate CI-equivalent suites locally.
Tests changed substantially because behavior changed: preference unit coverage, appearance interaction and geometry coverage, real conversation surfaces, virtualization compatibility, and the two-window zoom/full-clear regression were added or updated.
Residual risk is native Tauri/VoiceOver and OS-delivered shortcut behavior, which was not independently exercised beyond renderer/E2E coverage. The affected state transitions are renderer-side and causally covered, so this is not a merge blocker.
wesbillman
left a comment
There was a problem hiding this comment.
Re-review of exact head 91170172eddbdf3a0612e31e2091b6106ab3d408: clear; no material findings.
I independently compared the rebased 19-commit series against the previously approved head 17a440888ec308cac81d58e99b52f1c961047e30. The corrective cross-window keyboard-zoom commit has an identical stable patch ID, the PR aggregate has the same changed-file set, and the AGENTS.md conflict resolution preserves the intended 13/14/15px text-message contract while retaining the newer base guidance. I found no semantic regression introduced by the rebase.
I also rechecked the storage-event path behind the prior finding: matching buzz:text-scale changes and full storage clears update both rendered typography and the shortcut multiplier ref, and the causal two-window regression remains present. Exact-head required CI is green. Per strict review-channel policy, this verdict is source/diff + CI evidence only; I did not rerun runtime validation.
* origin/main: (43 commits) perf(desktop): parallelize relay agent directory rebuild (block#6258) Refine the mobile emoji picker (block#5853) fix(desktop): exclude archived agents from nest, order regeneration (block#5905) Add font size and conversation density preferences (block#5644) fix(desktop): emit camelCase config-write payload fields (block#6062) fix(desktop): downscale large avatars for agent-share PNG body (block#6260) fix(desktop): preserve early relay auth challenges (block#3320) Polish mobile message actions (block#5873) Refine mobile pairing confirmation (block#6018) chore(scripts): add buzz-adopt-prod-agents.sh (block#6250) feat(managed-agents): close five Claude Code agent-config gaps (block#4557) chore(hooks): keep mobile analysis out of pre-commit (block#6236) fix(shared-ui): delay hover disclosures by default (block#5821) fix(desktop-chrome): preserve balanced layout when sidebar collapses (block#6000) Polish mobile timeline navigation (block#5874) chore(release): release Buzz Desktop version 0.5.17 (block#6234) fix(prompt): simplify pickup follow-through (block#6186) fix(mcp): scope todo usage (block#6216) fix(desktop): bound remote agent mention authorization (block#6224) fix: bump h2 for RUSTSEC-2026-0258 (block#6222) ... Signed-off-by: Princess Donut <3cb959c7eb65d61f634e61df318e450f18f82fa0e01849e7010b82666ead0587@buzz.block.builderlab.xyz> # Conflicts: # desktop/src/main.tsx # mobile/ios/Podfile.lock



Summary
Validation
just ci