feat(#389): mobile wave A — phone navigation shell #520

Merged
Cordy merged 8 commits from fix-389a into main 2026-09-13 18:21:16 +00:00
Owner

Wave A of the #389 mobile pass, per the approved mockup and the decisions recorded on the issue (bottom tab bar; functional admin; star+kebab rows follow in wave B).

≤819px (tab-bar tier):

  • Bottom tab bar (Personal, Recents, Favourites, Spaces, More) — the sidebar has always been display:none below 820px with no replacement, leaving those views unreachable. Tabs proxy the existing nav-* buttons; active state syncs from setView via window.__syncTab; hidden navs (e.g. Spaces without permission) hide their tab; the Transfers unseen-dot surfaces on More.
  • More sheet: Shares, Transfers, Federated, Deleted files under their existing visibility rules + Administration (gated on feat.admin).
  • Shell: #app bottom padding + 100dvh, safe-area insets; tab bar hidden in adminmode (wave D revisits).

≤480px (phone tier):

  • Every .menu/.fbpop popover becomes a bottom sheet: one shared CSS mechanism (grabber, 46px rows, 76dvh cap, safe-area padding) + scrim via body:has(...) at z-80 under sheets at z-90 — document-level click-away close keeps working unchanged.
  • Top-bar search collapses to a magnifier that expands to a full-width row (16px input so iOS doesn't zoom) with Cancel.

Desktop invariant (≥820px): all new CSS is fenced behind max-width media blocks except one base #searchtoggle, #searchcancel, #tabbar{display:none} rule; injected elements are inert there. A build gate in the one-shot scanned all six <style> blocks and asserted no phone selector leaks outside the media fences; both inline script blocks pass node --check.

i18n: navMore, phCancel ×4 (en/de-CH/fr/it), reusing existing nav*/adminSettings keys for everything else.

Waves B–D (list & actions, layers, admin drill-in + editor bar) follow as separate releases.

Wave A of the #389 mobile pass, per the approved mockup and the decisions recorded on the issue (bottom tab bar; functional admin; star+kebab rows follow in wave B). **≤819px (tab-bar tier):** - Bottom tab bar (Personal, Recents, Favourites, Spaces, More) — the sidebar has always been `display:none` below 820px with no replacement, leaving those views unreachable. Tabs proxy the existing `nav-*` buttons; active state syncs from `setView` via `window.__syncTab`; hidden navs (e.g. Spaces without permission) hide their tab; the Transfers unseen-dot surfaces on More. - More sheet: Shares, Transfers, Federated, Deleted files under their existing visibility rules + Administration (gated on `feat.admin`). - Shell: `#app` bottom padding + `100dvh`, safe-area insets; tab bar hidden in adminmode (wave D revisits). **≤480px (phone tier):** - Every `.menu`/`.fbpop` popover becomes a bottom sheet: one shared CSS mechanism (grabber, 46px rows, 76dvh cap, safe-area padding) + scrim via `body:has(...)` at z-80 under sheets at z-90 — document-level click-away close keeps working unchanged. - Top-bar search collapses to a magnifier that expands to a full-width row (16px input so iOS doesn't zoom) with Cancel. **Desktop invariant (≥820px):** all new CSS is fenced behind max-width media blocks except one base `#searchtoggle, #searchcancel, #tabbar{display:none}` rule; injected elements are inert there. A build gate in the one-shot scanned all six `<style>` blocks and asserted no phone selector leaks outside the media fences; both inline script blocks pass `node --check`. i18n: `navMore`, `phCancel` ×4 (en/de-CH/fr/it), reusing existing `nav*`/`adminSettings` keys for everything else. Waves B–D (list & actions, layers, admin drill-in + editor bar) follow as separate releases.
feat(#389): mobile wave A - phone navigation shell
All checks were successful
ci / test-and-build (pull_request) Successful in 54s
68c67e437b
Below 820px the sidebar has always been display:none with no
replacement, leaving Recents/Favourites/Spaces/Shares/Trash/Transfers
/Admin unreachable. This wave injects a bottom tab bar (Personal,
Recents, Favourites, Spaces, More) synced with setView's active-nav
logic, plus a More sheet proxying the hidden sidebar buttons under
their existing visibility rules with counts/dots. At <=480px one
shared mechanism turns every .menu/.fbpop popover into a bottom sheet
(scrim via body:has, grabber, 46px rows, safe-area padding), the
top-bar search collapses to a magnifier that expands to a full-width
16px-input row with Cancel, and the shell moves to dvh + safe-area
units. All of it is fenced behind max-width media queries and
phone-only JS injection; a build gate asserts no phone selector
leaks outside the media blocks, so >=820px desktop is untouched.
Cordy scheduled this pull request to auto merge when all checks succeed 2026-09-13 18:20:25 +00:00
Cordy merged commit fbcf24c131 into main 2026-09-13 18:21:16 +00:00
Cordy deleted branch fix-389a 2026-09-13 18:21:19 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
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: Cordy/Cairn#520
No description provided.