feat(appearance): app-wide font size and conversation density with Crew previews - #317
Conversation
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
NOTES (handover)DONE
IN PROGRESSNothing half-implemented. Wound down on the stop-and-document order right after TODO / NEXT
|
Port the upstream Buzz 0.5.18 font-size and conversation-density preferences onto Crew's appearance settings, keeping Crew Dark/Light as the chrome themes and the syntax palette independent. Cmd +/- and the font-size preference now drive a virtual typography rem (--buzz-type-rem) instead of the real root font size, so text scales without resizing rem-based layout geometry. Fixes #290 Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
0e0c9bd to
0f37a59
Compare
Screenshots + recording (after rebase onto main)Full-window evidence of Appearance → Display (font size, conversation density, live preview) and the appearance-font-density-walkthrough.mp4 Appearance → DisplayAppearance Display larger type Timeline density |
Inline screenshots (after rebase)These are hosted on Appearance → Display (font size, density, live preview)Timeline: comfortable / compact / spacious / larger typeRecording: appearance-font-density-walkthrough.mp4 Rebased onto |








Summary
Ports the Buzz 0.5.18 Tier 2 appearance work (block#5644, block#6193) onto Crew: an
app-wide font size preference (
smaller | default | larger) and aconversation density preference (
compact | comfortable | spacious), bothpersisted in local storage, applied to the root element before React renders,
and previewed live in Appearance settings.
Mechanically, both preferences drive CSS variables rather than component
branches:
Conversation surfaces then use semantic Tailwind tokens (
text-message,text-message-timestamp,leading-message-author,py-conversation-row,mt-conversation-body,mt-conversation-paragraph) instead of fixedtext-sm leading-5/py-1literals, so channels, DMs, threads, Inbox,Markdown and the composer all follow the preferences from one place.
Notable behaviour change:
useWebviewZoomShortcuts(Cmd +/-) now scales--buzz-type-reminstead ofdocument.documentElement.style.fontSize. The realroot stays at 16px, so zoom scales text without also resizing rem-based
widths, gaps, radii and controls.
tests/e2e/top-chrome-zoom-clearance.spec.tswas updated to assert the virtual type scale (and that the real root holds at
16px) — its intent (fixed nav geometry under zoom) is unchanged and still
enforced.
Crew divergences from upstream
yellow-green sidebar gradient is not restored (Crew Dark theme (Cursor-flavored): color-is-information token set + chrome/syntax theme split #204, D-063). The new
preview card is transparent so it renders in the active Crew chrome.
navigation changes. Only the appearance scope of upstream(sync): Tier 2 appearance — font/density + previews with Crew Dark (#5644, #6193) #290 is ported.
Links(link preview style) andThread layoutsettings arekept as-is under
Preferences; the new controls live in aDisplaygroup.Related issue
Fixes #290 (part of the 0.5.18 sync stack, meta #285)
Testing
TDD:
fontSizePreference.test.mjsandconversationDensityPreference.test.mjswere added first (RED: 2 failures, modules missing), then the modules; the new
tests/e2e/crew-appearance-density.spec.tsfailed against a bundle built frommain(nofont-size-control/conversation-density-control) before thesettings work landed.
Gates (all run individually;
just cinot run — its mobiledart formatleghangs in this environment):
pnpm --filter buzz checkpnpm --filter buzz typecheckpnpm --filter buzz testpnpm exec playwright test --project=smoke(full)just test-unitbuzz-cli/buzz-dbinventory assertionsNo Rust files changed, so
just check-compilewas not required. The twojust test-unitfailures (buzz-clicommand-inventory count,buzz-dbembedded_migrator_contains_consolidated_initial_schema31 vs 30) reproduceunchanged on a clean base worktree at the merge base — they are not from this
change. Of the 63 full-smoke failures, 60 reproduce on a base-built bundle
(
project-pr-review,project-commit-detail,thread-pr-hub,responsive-matrix, …); the remaining three were the threetop-chrome-zoom-clearancezoom assertions, which pass after the spec update,plus one flaky 1px
video-attachmenthover assertion that passes on re-run.Full-window evidence (1280x720 viewport,
fullPage, whole app: sidebar +settings/timeline):
Appearance settings, before → after (scrolled to the bottom of the panel)
Timeline density: comfortable → compact → spacious
Font size: larger
NOTES (handover)
DONE
fontSizePreference.ts+conversationDensityPreference.ts(storage keysbuzz.appearance.fontSize,buzz.appearance.conversationDensity; rootattributes
data-font-size,data-conversation-density), initialised inmain.tsxbefore render, with unit tests (*.test.mjs).shared/styles/globals/typography.css(virtual type rem + densityvariables), Tailwind typography/spacing tokens,
cn.tstailwind-mergeextension for the new
text-message*group.MessageRow,MessageHeader,MessageTimestamp,markdown.tsx,composer.css,useRichTextEditor,InboxMessageRow,InboxListPane.SegmentedControl+ConversationDisplaySettings(font size, conversationdensity, live conversation preview) in a
Displaygroup in Appearance.top-chrome-zoom-clearancespecupdated accordingly.
crew-appearance-density.spec.ts(registered in the smokeproject): settings controls + Crew guardrails, density persistence and
timeline metrics, font-size scaling — all full-page screenshots.
/home/ubuntu/evidence/{before,after}/*.png,red-unit-tests.log,gate-check.log,gate-typecheck.log,gate-unit-tests.log,gate-just-test-unit.log,red-e2e-appearance.log,green-e2e-appearance.log,e2e-smoke-full.log,e2e-base-failing-subset.log,gate-e2e-zoom-video.log.IN PROGRESS
Nothing half-implemented. Wound down on the stop-and-document order right after
pushing; the only unfinished activity was CI observation (deliberately skipped —
the parent session serialises CI).
TODO / NEXT
parent session's serialisation.
Crew's existing
Linkssetting — judged out of upstream(sync): Tier 2 appearance — font/density + previews with Crew Dark (#5644, #6193) #290's scope; revisit if themeta issue disagrees.
tailwind.config.js,cn.ts,markdown.tsxandAppearanceSettingsControls.tsxare likely conflict points with sibling0.5.18 sync PRs.
just test-unitremains red onmainfor unrelatedbuzz-cli/buzz-dbinventory assertions and will stay red here.Link to Devin session: https://app.devin.ai/sessions/f7f9afbc9e094854b3fafc2ac373fdcc
Requested by: @oscarlehuu