fix(web): snooze option rows no longer overflow on narrow viewports#28627
Problem
Snooze option rows in Settings > Threads overflow the settings card horizontally on narrow viewports. The fields cluster in SnoozePresetFields (When select w-32 + number field w-32 + unit select w-28 + two gap-2 gaps = 384 px minimum) is a flex item with default min-width: auto, so it cannot shrink below its content. On a ~360 px phone viewport the unit select crosses the card boundary and is clipped by the viewport edge, leaving roughly half the unit dropdown off-screen.
Repro: open app.t3.codes on a ~360 px mobile browser (or narrow a desktop window below ~420 px), open Settings > Threads, scroll to Snooze > Snooze options.
Change
Add min-w-0 flex-wrap to the SnoozePresetFields wrapper div in apps/web/src/components/settings/SnoozePresetsSettings.tsx. min-w-0 lets the cluster shrink below its content width and flex-wrap drops the unit select (or the at time input) to a second line when the row is narrower than the controls' minimum widths - the individual selects keep their own minimum widths, so shrinking alone would still overflow. Desktop layout is unchanged: the 1024 px before/after captures are byte-identical.
Fixes #28618.
Scope and approval
Small, focused fix of an obvious visual bug, filed and diagnosed in #28618 before this PR. One problem, one file, one className change.
Verification
vp i- passedvp test run apps/web/src/components/settings/SnoozePresetsSettings.logic.test.ts- 4 tests passedvp run check:changed- all applicable checks passedgit diff --check- passed
Before/after captures (headless Chromium, standalone reproduction of the card's flex layout, both row variants):
360 px, duration row - before: unit select clipped at the card edge; after: wraps to a second line, nothing clipped:
320 px, both row variants - before: same clipping; after: each control fits, wrapping as needed:
Not verified: the logged-in app.t3.codes settings page on a physical phone - captures come from a standalone reproduction of the exact flex structure, and viewport measurements were taken in headless Chromium.
Written with gpt-6.1-sol in T3 Code.
Checks
Approvability
Verdict: Approved at 6f52fe2
Macroscope's review found this PR approvable — Snooze preset controls can now wrap within narrow settings rows instead of overflowing. This is a localized layout change with no changes to saved settings or snooze behavior.
You can add or adjust custom eligibility rules. Learn more.
Important
Review skipped
Review was skipped as selected files did not have any reviewable changes.
External image Run configuration
- Source mode: Auto
- Repository: pingdotgg/t3code
- Branch: main
- File: .coderabbit.config.ts
- Commit: 8760d06
- Layers: Repository TS config
- Review profile: CHILL
- Plan: Advanced
- Run ID:
a81126c1-3896-46ae-91f9-7dd946f57461
External image Commits
Reviewing files that changed from the base of the PR and between 6f52fe2f80c3e3bd74a8bb1734e4670b0e9a63f7 and c562238ce523740a5404d4208aa945276c8fac0c.
You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.
Use the checkbox below for a quick retry:
- Trigger review
No actionable comments were generated in the recent review.
External image Recent review info
-
External image Run configuration
- Source mode: Auto
- Repository: pingdotgg/t3code
- Branch: main
- File: .coderabbit.config.ts
- Commit: 8760d06
- Layers: Repository TS config
- Review profile: CHILL
- Plan: Advanced
- Run ID:
39484f09-849f-4cd4-8d96-b2189c2554d7
External image Commits
Reviewing files that changed from the base of the PR and between 8760d063e903406c8e8f695b0852c0a15fc1e00f and 6f52fe2f80c3e3bd74a8bb1734e4670b0e9a63f7.
External image Files selected for processing: 1
apps/web/src/components/settings/SnoozePresetsSettings.tsx
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.
Walkthrough
The snooze preset fields container now allows its controls to wrap and prevents the container from exceeding its available minimum width.
Changes: Snooze preset layout
Layer / File(s) Summary Snooze preset field wrapping
apps/web/src/components/settings/SnoozePresetsSettings.tsxThe fields container gains min-w-0andflex-wrap, allowing the controls to wrap within the available width.Estimated code review effort: 1 (Trivial) | ~3 minutes
Change: Bug fix · Severity of issue fixed: Low
Possibly related issues
- pingdotgg/t3code#28618 — Reports that snooze preset controls overflow the settings card on narrow viewports; this change updates the fields container to wrap and shrink.
Possibly related PRs
- pingdotgg/t3code#27802 — Changes wrapping layouts and minimum-width behavior in the same settings component.
- pingdotgg/t3code#28021 — Changes wrapping behavior in the
SnoozePresetFieldscontainer. - pingdotgg/t3code#28223 — Updates flexible, wrapping layouts in the same settings component.
Suggested reviewers:
t3dotgg
Merge Risk: External image Minimal · previous review 6f52f
The snooze controls can wrap within the settings card at narrow widths, with no merge-blocking risk identified.
Pre-merge checks: Passed 4
Check name Status Explanation Title check Passed The title clearly and concisely describes the main fix: preventing snooze option rows from overflowing on narrow viewports. Description check Passed The description covers the problem, reproduction steps, implementation, scope and approval basis, verification results, screenshots, and the remaining physical-device verification limitation. Linked Issues check Passed Issue #28618requires snooze option controls to stay inside the card and shrink or wrap on narrow viewports. The PR changes theSnoozePresetFieldswrapper fromflex items-center gap-2to `flex min…Out of Scope Changes check Passed The whole-PR diff contains one className change in apps/web/src/components/settings/SnoozePresetsSettings.tsx. The change directly supports the narrow-viewport behavior required by issue#28618. No …Full details: Linked Issues check
Explanation
Issue
#28618requires snooze option controls to stay inside the card and shrink or wrap on narrow viewports. The PR changes theSnoozePresetFieldswrapper fromflex items-center gap-2toflex min-w-0 flex-wrap items-center gap-2. This permits the fields cluster to shrink and wrap its controls. The reported logic test and changed-check results provide supporting automated verification.
Full details: Out of Scope Changes check
Explanation
The whole-PR diff contains one className change in
apps/web/src/components/settings/SnoozePresetsSettings.tsx. The change directly supports the narrow-viewport behavior required by issue#28618. No unrelated product or repository changes are present.
Finishing Touches
Generate unit tests (beta)
- Create a new PR
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Added 1 commit
- fix(web): snooze option rows no longer overflow on narrow viewportsc562238
Note
Written by gpt-6.1-sol on behalf of Maria
Verified in a real dev environment
verified head c562238ce523740a5404d4208aa945276c8fac0c as-is on a linux boat vm, using the real dev web app, repository playwright, and /usr/bin/google-chrome.
- reproduced on
github/main(e6e2ab05cc) in a separate worktree before starting the pr server. at 320 px, the unit control ended at x=527 while the row ended at x=281. duration and time controls overflowed. - on the exact pr head, all snooze row buttons and inputs fit inside their rows at 320 and 360 px. duration, unit, and time controls wrap. checked light and dark themes. at 1280 px, fields remain on one line.
- created a project pointing at the real checkout through add project, then started a codex
gpt-6.1-solthread through the composer. the real provider turn completed and returnedsnooze verification ready. - at 360 px, edited amount and unit, switched between duration and tomorrow/time, and confirmed both values were retained. added and removed an option. reloaded and confirmed the saved two-minute preset persisted.
- opened the real thread's context menu: the saved two-minute preset appeared, selecting it moved the thread to snoozed, and wake thread returned it to the inbox.
- blacksmith:
vp test run apps/web/src/components/settings/SnoozePresetsSettings.logic.test.tspassed all four tests.vp run check:changed 8760d063e903406c8e8f695b0852c0a15fc1e00fpassed format, lint, knip, affected typechecks, adjacent tests, and react compiler coverage. the explicit pr base was needed because the worker has a shallow source snapshot.
before, main at 360 px with default presets:
main: snooze controls overflow at 360 px
after, pr at 360 px with the same default presets:
pr: snooze controls wrap inside the card at 360 px
real settings interaction, trimmed to 11 seconds; uploaded playback and seeking checked:
editing snooze amount, unit, and time at 360 px
completed real codex gpt-6.1-sol turn in the web client
Not verified
physical phone browsers, native ios/android clients, and electron on macos/windows were not exercised on this linux vm. other providers, relay/tunnel connections, and automatic timed wake were not exercised. this is a web-only css change; no code changes were needed during verification.
Could we have the summary text aligned with the input boxes and have the "X" remain at the right. It makes more sense vissually
Thanks, @imluckii, for diagnosing and fixing the snooze-row overflow. #28223 now includes the same wrapping change in ccde655b8f, so this is covered on main. If the separate alignment suggestion still matters, please open a smaller PR for it.