Mobile and touch foundations across the shared primitives, plus the accessibility groundwork they depend on.
Custom Tailwind variant touch: (@media (pointer: coarse)) so primitives can grow for a thumb without loosening desktop density. Button sizes and icon buttons already reach the 44px minimum on touch; Input, Textarea, and SelectTrigger grow the same way and render at 16px below md so a focused field never triggers iOS Safari's auto-zoom.
DialogContent (and everything built on it — FormDialog, ConfirmDialog) becomes a bottom sheet below 640px: anchored to the bottom edge, rounded top corners, its own internal scroll, safe-area padding, and a footer that stacks full-width (primary on top) instead of a right-aligned row. Sheet gained side="bottom" for short option lists with the same shell.
MobileTabBar — a bottom tab bar for phones (hidden from md up): Home plus the org's three highest-tier core modules, each labelled, plus a More tab opening the full navigation sheet. Hides itself on composer/wizard/print routes (/new, /edit, /supersede, /setup, /print) so it never stacks with a sticky form footer; those routes get a hamburger instead.
ComposerShell's mobile layout: the sticky header keeps only Back + title below sm, and Cancel / secondary / primary actions move into a bar sticky bottom-0 inside the page's own scroll area (never fixed), padded with pb-safe-2, so the primary action stays one thumb away on long forms.
Safe-area utilities (pt-safe/pb-safe/px-safe, and the calc variants pb-safe-*/pt-safe-*) reading env(safe-area-inset-*), enabled by viewport-fit=cover in app/layout.tsx's viewport export. New .hscroll utility for chip/tab rows that must stay on one line and scroll instead of wrapping; h-dvh/min-h-dvh replace h-screen everywhere so mobile browser chrome can't clip a full-height layout.
Field gained an error prop — wires aria-invalid and aria-describedby onto the control and renders the message with role="alert", replacing hand-rolled error spans. Focus-visible rings added to the shell's raw controls (dialog/sheet close buttons, MobileTabBar links and its More button) using the standard ring string.
Design-system gallery: new Mobile & touch section with live examples of touch:, hit-target, 16px mobile inputs, the bottom-sheet dialog and Sheet, .hscroll, safe areas/h-dvh, and a static MobileTabBar preview in a phone-width frame; new Accessibility section with the WCAG 2.2 AA checklist (touch targets, focus rings, aria-labels, Field error, live regions, colour + text status, reduced motion, one h1 per page, aria-current).