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>
This commit is contained in:
null 2026-08-18 20:10:19 -05:00
parent 081257f69c
commit 807b8a4600
3 changed files with 19 additions and 4 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -27,11 +27,18 @@ replace in
| `05_PrivacyIllustration` | 5 Privacy promise | `PrivacyIllustration` | | `05_PrivacyIllustration` | 5 Privacy promise | `PrivacyIllustration` |
| `06_NotificationPrivacyIllustration` | 6 Reminder privacy | *new* | | `06_NotificationPrivacyIllustration` | 6 Reminder privacy | *new* |
| `07_ForecastIllustration` | 7 First forecast | *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 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 **identical dimensions per card**, so a theme switch swaps the image without
moving the layout. 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 ## 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 Each of these was a correction during review, and every one of them would be easy
@ -64,13 +71,21 @@ Tracked as **#29**, which stays open until the app renders these:
2. Add the light/dark preview pair per step, per [`../README.md`](../README.md). 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. 3. Reconcile step copy — `PRODUCT_PLAN.md` owns the screen wording.
`EmptyStateIllustration`, the Today "nothing logged yet" state, has no card here. **One inconsistency to settle when these are redrawn:** the fourteen onboarding
Onboarding would otherwise ship real art while Today keeps a placeholder visible illustrations are contained cards with a rounded frame, and the two
in the same session. `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 ## Format
WebP at the delivered resolution — 204 KB for all fourteen, against 3.4 MB as 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 PNG, and the same format [`../../data/img/`](../../data/img/) uses for the marks
privacyllc.dev renders. The delivery `.zip` archives are deliberately not privacyllc.dev renders. The delivery `.zip` archives are deliberately not
tracked; see [`.gitignore`](.gitignore). tracked; see [`.gitignore`](.gitignore).