Brings the Expo app onto main: the four screens from the design doc,
the design tokens, and the GLSL port of the dither background.
The branch was rooted while main was still unborn, so the two histories
are unrelated and the merge needs --allow-unrelated-histories. No files
overlap; main carried only .webklar-preview.json.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Scaffold an Expo + TypeScript app for Dokio, the app that scans
Behördenpost and explains it in plain language, and build the four
screens specified in "Dokio Design.dc.html":
4a Onboarding, full-bleed dither gradient
4b Home, dithered scan card
3a Kamera, mocked viewfinder
3b Archiv, search + filters + month groups
Design tokens from the turn 4 blue palette live in src/theme.ts.
Content is mocked in src/data/letters.ts, taken verbatim from the doc.
DitherBackground is a GLSL port of the doc's dither-bg.js, which drew a
low-resolution canvas and upscaled it with image-rendering: pixelated;
the fragment shader snaps to the same grid instead. Two notes on the
port:
- The original's fract(sin(x) * 43758.5453) hash only distributes well
in float64. A fragment shader's highp float has ~24 mantissa bits, so
it collapsed to a near-constant field and the gradient bands rendered
straight rather than warped. Replaced with Hoskins' hash, verified
against the original running side by side.
- The 4x4 Bayer matrix is built recursively rather than as a lookup,
which avoids dynamic array indexing; the construction reproduces all
16 entries of the original exactly.
The camera screen deliberately stops short of expo-camera: the
viewfinder is a static stand-in, so the flow is navigable without
permissions. The 2a result screen is not part of turns 3 and 4 and is
not included.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>