Skip to main content
Most access is on mobile devices, often mid-range Android phones on variable networks. Mobile is the primary platform, not a responsive afterthought.

Principles

  1. Start with mobile — design the smallest screen, then enhance.
  2. Optimise for touch — 48px minimum targets, actions within thumb reach.
  3. Minimise data — lazy-load images, compress assets, do not make requests you can avoid.
  4. Work offline — core features function without a connection.
  5. Paint fast — show skeleton content immediately, load data progressively.

Bottom navigation

Put app-level navigation in the thumb zone on mobile, and in a sidebar on desktop:
Four or five items maximum. Beyond that the targets get too small, which defeats the reason for putting them there.

Sheet rather than dialog

On mobile a bottom sheet is easier to reach and dismiss than a centred modal:

Touch targets

Every interactive element is at least 48px in the touch dimension.
For a list of tappable rows, the item component already provides the right target:

Progressive loading

Sequential mounting

See lazy loading.

Images

  • loading="lazy" below the fold.
  • Explicit width and height to prevent layout shift.
  • A thumbnail or placeholder first.

Memory

Network awareness

navigator.onLine tells you the device has a connection, not that your server is reachable — treat a true as weak evidence and let the request failing be the real signal.

Text input

type="email" puts the @ on the keyboard; type="tel" gives a number pad; inputMode="numeric" gives digits without the telephone semantics. autoComplete removes typing altogether, which on a phone on a slow network is the largest single saving available.

Summary