92 lines
4.8 KiB
Markdown
92 lines
4.8 KiB
Markdown
# Onboarding illustrations — the decided direction
|
||
|
||
```
|
||
Status: Current
|
||
Owner: _null
|
||
Last reviewed: 2026-08-18
|
||
Governs: docs/design/dist/** — the onboarding illustration set and what it is for
|
||
Review trigger: Any illustration added or replaced here; the onboarding artwork
|
||
in issue #29 landing in the app
|
||
```
|
||
|
||
> **References, not shipping assets.** Nothing in this folder goes in the APK.
|
||
> These are the decided direction for onboarding, drawn from
|
||
> [`../BRAND_GUIDE.md`](../BRAND_GUIDE.md) §22's master prompt. The vectors that
|
||
> eventually ship are drawn *from* these.
|
||
|
||
Seven illustrations in a matched light/dark pair, named for the composables they
|
||
replace in
|
||
[`../../../core/designsystem/src/main/kotlin/dev/privacyllc/period/designsystem/art/Illustrations.kt`](../../../core/designsystem/src/main/kotlin/dev/privacyllc/period/designsystem/art/Illustrations.kt):
|
||
|
||
| File stem | Onboarding step | Composable |
|
||
| --- | --- | --- |
|
||
| `01_WelcomeIllustration` | 1 Welcome | `WelcomeIllustration` |
|
||
| `02_LastPeriodIllustration` | 2 Last period start | *new* |
|
||
| `03_PeriodEndIllustration` | 3 Period end | *new* |
|
||
| `04_LearningIllustration` | 4 Previous history | `LearningIllustration` |
|
||
| `05_PrivacyIllustration` | 5 Privacy promise | `PrivacyIllustration` |
|
||
| `06_NotificationPrivacyIllustration` | 6 Reminder privacy | *new* |
|
||
| `07_ForecastIllustration` | 7 First forecast | *new* |
|
||
| `EmptyStateIllustration` | — not onboarding | `EmptyStateIllustration` |
|
||
|
||
Each stem exists as `Light/<stem>_light.webp` and `Dark/<stem>_dark.webp`, at
|
||
**identical dimensions per card**, so a theme switch swaps the image without
|
||
moving the layout.
|
||
|
||
`EmptyStateIllustration` is the odd one and deliberately unnumbered: it is
|
||
Today's "nothing logged yet" state, not an onboarding step, and it is also drawn
|
||
in the onboarding previews. Its ring is empty because nothing has been logged —
|
||
the same ring the other illustrations fill with cycle-day markers, which is what
|
||
makes the empty state read as *waiting* rather than *broken*.
|
||
|
||
## What these got right, and why it is worth not undoing
|
||
|
||
Each of these was a correction during review, and every one of them would be easy
|
||
to reintroduce by regenerating carelessly:
|
||
|
||
- **No text of any kind is painted into the pixels.** The app renders all seven
|
||
titles and subtitles itself through `Heading(...)` in `OnboardingScreen.kt`.
|
||
Art carrying its own title prints every heading twice, cannot be translated,
|
||
cannot scale with the user's font size, and is invisible to TalkBack.
|
||
- **No step-number badge.** `LearningIllustration` is not only onboarding step 4
|
||
— it is also the Insights empty state, where a "4" means nothing. Baked numbers
|
||
also freeze the running order, and this flow has already changed shape once. A
|
||
step indicator, if wanted, belongs in live UI where TalkBack can read it.
|
||
- **`07_Forecast` shows a calendar and a cycle arc, and names no fields.** An
|
||
earlier draft drew a forecast panel listing *Fertile window* and *Ovulation*,
|
||
which the real first-forecast screen deliberately does not show — on a fresh
|
||
install it reports confidence Low and Today reads "Not enough history to
|
||
estimate". A later draft named the correct fields but painted *Confidence —
|
||
Low* permanently, which is wrong for anyone with a settled cycle. Naming
|
||
nothing is the only version that cannot contradict the live forecast.
|
||
- **The dark set is a real dark composition**, not the light one dimmed — the
|
||
midnight-plum ground `BRAND_GUIDE.md` §22 specifies.
|
||
|
||
## Still to do before anything ships
|
||
|
||
Tracked as **#29**, which stays open until the app renders these:
|
||
|
||
1. Redraw as Compose vector paths behind the existing replaceable names, taking
|
||
colour from theme tokens rather than shipping two raster sets.
|
||
2. Add the light/dark preview pair per step, per [`../README.md`](../README.md).
|
||
3. Reconcile step copy — `PRODUCT_PLAN.md` owns the screen wording.
|
||
|
||
**One inconsistency to settle when these are redrawn:** the fourteen onboarding
|
||
illustrations are contained cards with a rounded frame, and the two
|
||
`EmptyStateIllustration` files are full-bleed with no frame. Both scale
|
||
acceptably at the 110–160 dp these are actually drawn at — checked by rendering
|
||
them at size rather than assumed — but the frame should be consistent across the
|
||
set, or deliberately absent from all of it.
|
||
|
||
A second, smaller one: `TodayScreen.kt` currently calls
|
||
`EmptyStateIllustration(color = ..., size = ...)` with a single colour. These are
|
||
full-colour drawings, so the vector version will not take a colour parameter and
|
||
that call site changes with it.
|
||
|
||
## Format
|
||
|
||
WebP at the delivered resolution — 312 KB for all sixteen, against 6.8 MB as
|
||
PNG, and the same format [`../../data/img/`](../../data/img/) uses for the marks
|
||
privacyllc.dev renders. The delivery `.zip` archives are deliberately not
|
||
tracked; see [`.gitignore`](.gitignore).
|