docs(android): M12 phase 4 as landed #116

Merged
whitlocktech merged 1 commits from docs/android-theming-nav-phase-4 into edge 2026-08-08 11:51:21 +00:00
Member

§5.6 rewritten with the decisions the build had to make, plus a "Phase 4 as landed" section and the in §8. Targets edge, like every M12 phase.

Three questions the drafted §5.6 left open

All three were put to the org lead before any code, and all three are now written into the section with the reasoning that settled them:

1. The top bar falls back to the text. §5.6 said the logo replaces the uppercased name and, separately, that "an asset that fails to load is the same as no asset" — which taken literally would leave the title blank on a 404. The section now names the top bar as the one place where "empty" is not "nothing": everywhere else something else on the surface already says the instance's name, but there the logo is the title, so "the same as no asset" resolves to the text. It also records that there is deliberately no fallback while the load is in flight, because drawing the text first would flash text → logo on every navigation for one frame.

2. The hero is a fixed 180dp band, cropped. The website's hero is a CSS background driven by hero_layout, which the app does not port, so the app needs a rule of its own — and the website's default hero is a square emblem, so an uploaded square is a case to expect rather than an edge one. At the app's usual intrinsic-aspect idiom that square is a ~360dp block that pushes the status card off the first screenful.

3. It sits inside Home's 20dp padding with themed corners, clipping to shapes.medium so it follows --radius-card like every other surface, rather than going full-bleed.

Also new in §5.6

  • The 32dp / 24dp logo heights and the six-times-height width cap (the website's maxWidth: height * 6).
  • The accessibility split, stated as a rule rather than left to each call site: decorative wherever the name is also on screen in text, named only where the logo stands alone.
  • That the app takes no fallback hero image where the website substitutes its own emblem — §2 outranks the mirror.

"Phase 4 as landed"

Records how the empty-slot rule is enforced (every size modifier hangs off the image, so an uncomposed image composes no padding either — which is what keeps a brand?.hero != null check out of HomeScreen), that the failure flag is keyed on the URL so a fixed upload recovers on the next refresh, why the blank check runs on both sides of the resolver, and that the phase costs the APK nothing.

And the limit worth being plain about: the drawing cannot be tested here at all. The app carries no Robolectric and no androidTest source set, so a composable body cannot run in a JVM test; only the decision of whether to draw is pure. That makes phase 4 the one with the most riding on AC-5's on-device walk.

Android-app: RunicGateway/Android-app#37.


  • AI-assisted: written with Claude Code (Claude Opus 5)
§5.6 rewritten with the decisions the build had to make, plus a "Phase 4 as landed" section and the ✅ in §8. Targets `edge`, like every M12 phase. ### Three questions the drafted §5.6 left open All three were put to the org lead before any code, and all three are now written into the section with the reasoning that settled them: **1. The top bar falls back to the text.** §5.6 said the logo *replaces* the uppercased name and, separately, that "an asset that fails to load is the same as no asset" — which taken literally would leave the title blank on a 404. The section now names the top bar as **the one place where "empty" is not "nothing"**: everywhere else something else on the surface already says the instance's name, but there the logo *is* the title, so "the same as no asset" resolves to the text. It also records that there is deliberately no fallback *while the load is in flight*, because drawing the text first would flash text → logo on every navigation for one frame. **2. The hero is a fixed 180dp band, cropped.** The website's hero is a CSS background driven by `hero_layout`, which the app does not port, so the app needs a rule of its own — and the website's *default* hero is a square emblem, so an uploaded square is a case to expect rather than an edge one. At the app's usual intrinsic-aspect idiom that square is a ~360dp block that pushes the status card off the first screenful. **3. It sits inside Home's 20dp padding with themed corners**, clipping to `shapes.medium` so it follows `--radius-card` like every other surface, rather than going full-bleed. ### Also new in §5.6 - The **32dp / 24dp** logo heights and the **six-times-height width cap** (the website's `maxWidth: height * 6`). - The accessibility split, stated as a rule rather than left to each call site: decorative wherever the name is also on screen in text, named only where the logo stands alone. - That the app takes **no fallback hero image** where the website substitutes its own emblem — §2 outranks the mirror. ### "Phase 4 as landed" Records how the empty-slot rule is enforced (every size modifier hangs off the image, so an uncomposed image composes no padding either — which is what keeps a `brand?.hero != null` check out of `HomeScreen`), that the failure flag is keyed on the URL so a fixed upload recovers on the next refresh, why the blank check runs on **both** sides of the resolver, and that the phase costs the APK nothing. And the limit worth being plain about: **the drawing cannot be tested here at all.** The app carries no Robolectric and no `androidTest` source set, so a composable body cannot run in a JVM test; only the decision of *whether* to draw is pure. That makes phase 4 the one with the most riding on AC-5's on-device walk. Android-app: RunicGateway/Android-app#37. --- - [x] AI-assisted: written with Claude Code (Claude Opus 5)
wtclaude added 1 commit 2026-08-08 11:15:33 +00:00
§5.6 gains the three decisions the drafted section left open — the top bar's
text fallback, the hero's fixed cropped band, and the accessibility split
between a decorative logo and a named one — each with the reasoning that
settled it, so none is re-litigated from scratch. Adds the 32dp/24dp logo
heights, the six-times-height width cap, and the note that the app takes no
fallback hero image where the website substitutes its own emblem.

"Phase 4 as landed" records how the empty-slot rule is enforced by layout
rather than by a conditional at each call site, why the blank check runs on
both sides of the resolver, and the honest limit of the phase's tests: the
drawing cannot be tested here at all, since the app has no Robolectric and no
androidTest source set, so only the decision of whether to draw is pure.

Phase 4 ticked in §8.

Co-Authored-By: Claude <noreply@anthropic.com>
whitlocktech merged commit 67e110201b into edge 2026-08-08 11:51:21 +00:00
whitlocktech deleted branch docs/android-theming-nav-phase-4 2026-08-08 11:51:21 +00:00
Sign in to join this conversation.
No description provided.