Privacy-Period-Tracker/docs/design/dist
null 807b8a4600 docs: add the empty-state illustration, completing the set
EmptyStateIllustration in both themes — Today's "nothing logged yet" state, and
the one illustration the onboarding set did not cover. Without it, onboarding
would have shipped real art while Today kept a placeholder a user sees in the
same session.

Deliberately unnumbered: it is not an onboarding step. Its ring is empty because
nothing has been logged, which is the same ring the other illustrations fill with
cycle-day markers — that is what makes the empty state read as waiting rather
than broken.

Two things recorded in dist/README.md for whoever redraws these as vectors:

- The fourteen onboarding illustrations are contained cards with a rounded
  frame; these two are full-bleed with none. The frame should be consistent
  across the set or deliberately absent from all of it.
- TodayScreen.kt calls EmptyStateIllustration(color = ..., size = ...) with a
  single colour. These are full-colour drawings, so the vector version takes no
  colour parameter and that call site changes with it.

Both were checked at the 110-160 dp the illustrations are actually drawn at, by
rendering them at that size rather than assuming: the detail survives, including
the five faint dots under the ring.

WebP at delivered resolution: 312 KB for all sixteen against 6.8 MB as PNG.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 20:10:19 -05:00
..
Dark docs: add the empty-state illustration, completing the set 2026-08-18 20:10:19 -05:00
Light docs: add the empty-state illustration, completing the set 2026-08-18 20:10:19 -05:00
.gitignore docs: onboarding illustrations, matched light and dark 2026-08-18 19:53:23 -05:00
README.md docs: add the empty-state illustration, completing the set 2026-08-18 20:10:19 -05:00

README.md

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 §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:

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.
  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 110160 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/ uses for the marks privacyllc.dev renders. The delivery .zip archives are deliberately not tracked; see .gitignore.