Files
multica/apps/desktop
Bowser 035bd20e5b MUL-5842: fix(layout): fold inbox and chat to one column below lg (#6543)
* fix(layout): fold inbox and chat to one column below lg

On a tablet or a folded inner screen the inbox and chat pages spend
256px on the nav and another 320px on the list column, leaving the
reading pane a couple hundred pixels — 203px on a Pixel Fold inner
screen at 851px, 118px at 768px.

Both pages already have a complete single-column list/detail branch with
its own back affordance and test coverage; it was only reachable below
768px. Widen the trigger instead of adding a layout:

- `useIsCompact()` (max-width 1023px) alongside `useIsMobile()`, sharing
  one implementation. Inbox, chat and the sidebar provider switch to it,
  so below `lg` the pages take one column and the nav becomes a sheet.
  The provider's context field is renamed to `isCompact` to match, since
  a consumer reading `isMobile` would assume the phone breakpoint.
- Between `lg` and `xl` the two panes stay, but the nav auto-collapses on
  entering the band and restores on leaving it. A manual re-open inside
  the band sticks until the next crossing.
- The header's sidebar trigger is visible wherever the nav is not a
  permanent column (`xl:hidden`).

At and above 1280px nothing changes: the persisted panel sizes and the
resizable nav width are untouched.

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

* fix(layout): give settings a nav trigger and align the sidebar CSS gate

Follow-ups to folding the list/detail pages below `lg`, all three in the
768–1023 range the previous commit opened up:

- Settings builds its own chrome instead of a `PageHeader`, so it never
  rendered a sidebar trigger. That was harmless while the nav was a fixed
  column at those widths; now the nav is a closed sheet and the page had
  no control to reopen it, stranding touch users. `MobileSidebarTrigger`
  is exported as `CollapsedNavTrigger` and reused there.
- The in-flow sidebar's CSS gate said `md` while `useIsCompact()` said
  `lg`. Since the hook only resolves after the first paint, every load in
  between painted a 256px sidebar for a frame before collapsing it into a
  sheet. Both gates are `lg` now.
- The auto-collapse listener's ref is refreshed in an effect rather than
  during render.

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

---------

Co-authored-by: bowser-bot <bowser-bot@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 11:01:56 +08:00
..