Mockups
These are drawn as SVG in apps/docs/src/components/mockups.tsx rather than exported from a
design tool, deliberately: they live in git, they diff on review, and they cannot drift out of the
repository the way a link to a design file does.
They are intent, not pixel specification — the real thing uses system fonts, system spacing, and Liquid Glass, none of which an SVG can honestly represent.
When a screen changes, this page changes in the same PR.
Crags — the home tab
The list you land on. Large title with the iOS scroll behaviour, a search field in the navigation bar rather than behind a button, and cards that are Liquid Glass surfaces over the background.
Note what is not here: no loading state. The list comes from on-device SQLite.
The sector screen is the one that has to be right. Two rules for it:
- Tapping a line selects the route; tapping a route highlights its line. Both directions, always, with a haptic tap on each. It is the only interaction that matters here.
- The sheet never covers the part of the photo you are looking at. Dragging it down is a system sheet gesture, not a custom one.
Route detail and logging
The logging sheet is where principle 5 shows up: partners are on the first screen, not behind a disclosure triangle, and the ascent saves whether or not there is signal.
What these mockups deliberately do not show
- Fonts and exact spacing. The app uses the system font at system sizes so it inherits Dynamic Type. Anything drawn here is an approximation.
- Liquid Glass. The flat translucent panels above are a stand-in. The real surfaces refract and have a specular edge — see iOS native feel.
- Motion. Sheet detents, the tab bar minimising on scroll, and the haptic on route selection are all part of the design and none of them survive a static image.
Editing them
The SVG lives in apps/docs/src/components/mockups.tsx, not inline in this file, for a mechanical
reason worth knowing: MDX parses text inside a multi-line JSX element as markdown. A
<text>9:41</text> that Prettier splits across three lines renders as a paragraph inside the SVG
rather than as SVG text, and the mockup silently turns into a list of stray words. In a .tsx
file it is just JSX and the problem does not exist.
Related
- iOS native feel — what "slick" means concretely
- Product principles — why these screens are laid out this way
- Roadmap — which of these screens actually exist yet