diff --git a/ClaudeBrandingReview.md b/ClaudeBrandingReview.md index f80e1812..dac2c3f5 100644 --- a/ClaudeBrandingReview.md +++ b/ClaudeBrandingReview.md @@ -7,12 +7,23 @@ should reuse existing assets, and which brand issues belong in implementation or image work as user-generated prompt handoff; backlog items here are Codex-owned assets to generate, add to the repo, and verify. -**Current state (2026-06-27 audit):** the This-or-That redesign (C-DARK-UI-001) + Premium-unlock modal (A13) are done. -**But two large brand backlogs are now OPEN** (found by the 2026-06-27 asset audit): (1) **most illustrations are -light-only** — only 12 of ~25 have a dark variant, and **all 10 `pack_art_*` banners + all `illustration_couple_*` -heroes are light-only**, so they show light/pink art on a dark screen; (2) **~60 distinct generic Material icons** are -used across ~201 call sites (generic hearts, Person, Lock, Star…) — **brand rule: every icon must be a custom Closer -glyph.** See **Brand standards** + the two backlog tables below. +**Current state (2026-06-28 re-audit against the code/resources — supersedes the 2026-06-27 audit):** +- **Backlog 1 (dark illustration variants) — essentially DONE.** `drawable-night-nodpi/` now holds a dark variant for + **every** non-transparent surface: all 22 `illustration_*` (incl. all `illustration_couple_*` heroes, `daily_question`, + `partner_activation`, `tonight_partner_prompt`, `together_empty`) **and all 10 `pack_art_*` banners**. Only **3** + transparent celebration assets have no dark variant — `illustration_premium_unlock`, `illustration_spin_wheel`, + `illustration_streak_milestone` — which rule 1 exempts *if* they read on both themes (verify, don't assume). Decoupled + in-app-Dark + system-Light now renders the dark art correctly app-wide after the **C-DARKART-002** fix (see below), so + the "light/pink art on a dark screen" defect class is closed for these surfaces. +- **Backlog 2 (custom glyphs) — assets DONE, wiring MOSTLY OPEN.** **~63 `glyph_*.xml` now exist** (the entire icon + backlog below has been created), but only **23 distinct glyphs are wired in code** and **~196 generic `Icons.*` call + sites remain unreplaced** (ArrowBack ×31, Lock ×17, Person ×16, Favorite ×12, Check ×11, …). So this is no longer + "make glyphs" — it's a **code task: swap each `Icons.*` for the already-made `glyph_*`** (rule 2). See the icon table. +- **C-DARKART-002 (theming mechanism, fixed 2026-06-28):** `MainActivity` now drives `AppCompatDelegate.setDefaultNightMode` + from the in-app `ThemeMode`, so the real Configuration `uiMode` follows the app theme and **all** art resolution — + `painterResource` AND `BrandIllustration`, `drawable-night*` included — follows the in-app theme. This supersedes the + old "only `BrandIllustration` follows the theme" caveat. +- Done earlier: This-or-That redesign (C-DARK-UI-001) + Premium-unlock modal (A13). > Branding **defects** (off-brand color, clipped/low-contrast art, a **light image on a dark screen**, a **generic > Material icon**) → `ClaudeReport.md`. Pure "could be warmer / feature" ideas → `Future.md` `## QA`. **New art/glyphs to @@ -24,9 +35,11 @@ glyph.** See **Brand standards** + the two backlog tables below. Two non-negotiable brand rules. A violation of either is a **bug** (`ClaudeReport.md`) **and** the asset to create is logged here as Codex-owned image/glyph work: 1. **Every image has a LIGHT and a DARK variant that matches the IN-APP theme.** No light/pink art on a dark screen, no - dark art on a light screen. `drawable-nodpi/` = light, `drawable-night-nodpi/` = dark (auto-selected by - `BrandIllustration` via the in-app-theme config override). Transparent/celebration art that genuinely reads on **both** - themes is the only exemption — **verify it, don't assume.** A surface missing its variant = bug + add the asset below. + dark art on a light screen. `drawable-nodpi/` = light, `drawable-night-nodpi/` = dark. Since **C-DARKART-002** + (2026-06-28) the dark variant is auto-selected by the real Configuration `uiMode`, which `MainActivity` syncs to the + in-app `ThemeMode` via `AppCompatDelegate.setDefaultNightMode` — so **both** `painterResource` and `BrandIllustration` + resolve `-night` correctly even in the decoupled in-app-Dark + system-Light state. Transparent/celebration art that + genuinely reads on **both** themes is the only exemption — **verify it, don't assume.** A surface missing its variant = bug. 2. **Every icon/glyph is a custom Closer glyph — NO generic Material icons, no generic hearts.** Material `Icons.*` (ArrowBack, Favorite, Person, Lock, Star, PlayArrow, …) are placeholders, not brand. Each in use is replaced by a bespoke glyph in the Closer house style, logged in the icon backlog below for Codex to make + add (`glyph_*`). @@ -39,43 +52,40 @@ facial/detail rendering, clean vector-like edges, and gentle gradients only. **R anything that looks materially richer than the existing asset family. For any new batch, generate and review **one sample first** against the existing contact sheet before saving more assets. -## Image theme-variant coverage (light + dark per surface) — backlog: make the missing DARK variants -> Goal: every image row has BOTH a light and a dark asset. Audited 2026-06-27. +## Image theme-variant coverage (light + dark per surface) — ✅ essentially COMPLETE +> Re-verified against `res/` on 2026-06-28. Every non-transparent surface now has BOTH a light (`drawable-nodpi/`) and a +> dark (`drawable-night-nodpi/`) asset with the identical filename. -| Illustration | Light | Dark | Action | +| Illustration | Light | Dark | Status | |---|---|---|---| -| account_deletion_goodbye · answer_history_empty · bucket_list_empty · connection_challenges_header · date_match_empty · date_match_success · memory_lane_capsule · messages_empty · pairing_success · past_games_empty · privacy_recovery · quiet_hours | ✅ | ✅ | none — both exist | -| **illustration_couple_paywall** (Paywall) | ✅ | ❌ | **MAKE DARK** (`drawable-night-nodpi/`) | -| **illustration_couple_subscription** (Subscription) | ✅ | ❌ | **MAKE DARK** | -| **illustration_couple_onboarding** (Onboarding) | ✅ | ❌ | **MAKE DARK** | -| **illustration_couple_invite** (Pairing/invite) | ✅ | ❌ | **MAKE DARK** | -| **illustration_couple_history** | ✅ | ❌ | **MAKE DARK** (or confirm unused) | -| **illustration_daily_question** (Today hero) | ✅ | ❌ | **MAKE DARK** | -| **illustration_partner_activation** (Home) | ✅ | ❌ | **MAKE DARK** | -| **illustration_tonight_partner_prompt** (Home) | ✅ | ❌ | **MAKE DARK** | -| **illustration_together_empty** (Activity) | ✅ | ❌ | **MAKE DARK** | -| **pack_art_*** ×10 (communication, deep_reflection, desire, family_commitment, fun_date, future_goals, home_life, intimacy, money_values, trust_repair) | ✅ | ❌ | **MAKE DARK** for each pack banner (or prove the banner reads correctly on dark) | -| reveal_celebration · streak_milestone · premium_unlock · spin_wheel | ✅ (transparent) | n/a | transparent/celebration — **verify reads on both themes**; add dark only if it doesn't | +| **All 22 `illustration_*`** — account_deletion_goodbye · answer_history_empty · bucket_list_empty · connection_challenges_header · couple_history · couple_invite · couple_onboarding · couple_paywall · couple_subscription · daily_question · date_match_empty · date_match_success · memory_lane_capsule · messages_empty · pairing_success · partner_activation · privacy_recovery · quiet_hours · reveal_celebration · together_empty · tonight_partner_prompt | ✅ | ✅ | **both exist** — dark variants added since the 2026-06-27 audit | +| **All 10 `pack_art_*`** (communication, deep_reflection, desire, family_commitment, fun_date, future_goals, home_life, intimacy, money_values, trust_repair) | ✅ | ✅ | **both exist**; pack banners verified live dark (C-DARKART-002 round) | +| illustration_premium_unlock · illustration_spin_wheel · illustration_streak_milestone | ✅ (transparent) | — | transparent/celebration — **exempt per rule 1 IF they read on both themes; verify** (only remaining "no dark" assets) | -**Prompt for the missing dark variants:** regenerate each light asset above in the **dark/aubergine** house palette -(deep aubergine `#24122F` ground, lavender `#B98AF4` / soft-pink `#F7C8E4` accents, blush highlights) so it reads on a -dark surface, **same composition + flat 2D vector style + transparent/feathered edges** as the light version, exported to -`drawable-night-nodpi/` with the **identical filename**. Re-run Pass C's decoupled-theme check after adding each. +**Remaining (small):** spot-check the freshly-added dark variants in Pass C (light + dark) for contrast/clipping — they +exist + resolve correctly via the C-DARKART-002 uiMode-sync (pack art + Today hero verified live across all 4 theme/art +states); the rest resolve by the same mechanism but haven't each been eyeballed. Then verify the 3 transparent celebration +assets read on dark; add a dark variant only if one doesn't. **Orphan:** `illustration_couple_history` has both +light+dark variants but **no code reference** (superseded by `illustration_answer_history_empty`) — dead asset, candidate +for removal. -> **⛔ CLAUDE — also run `scripts/theme-scan.sh` Tier 1E** every round: any direct `painterResource(R.drawable.illustration_*` -> or `painterResource(R.drawable.pack_art_*)` not routed through `BrandIllustration` will fail to follow the decoupled -> in-app theme and should either be converted to `BrandIllustration` or added to this table as a missing-variant candidate. -> The scanner is allowed to be improved; document any new patterns in its header. +> **⛔ CLAUDE — decoupled-theme art now works app-wide** (C-DARKART-002): raw `painterResource(R.drawable.illustration_*`/ +> `pack_art_*)` follows the in-app theme via the Configuration `uiMode` sync, so it no longer *needs* `BrandIllustration` +> to get the right `-night` variant. `scripts/painter-xml-scan.sh` (crash guard) + Pass C's decoupled check (system-light + +> in-app-Dark) remain the per-round guards. -## Icon/glyph audit — generic Material icons to replace with custom Closer glyphs (backlog: make these) -> Audited 2026-06-27: **~60 distinct Material icons across ~201 call sites.** Brand rule #2 — each becomes a bespoke -> `glyph_*` in the house style. Existing custom glyphs (reuse/extend, don't regress): the G/G2 set -> (`glyph_paired_cards`, `glyph_how_well`, `glyph_sealed_answer`, `glyph_connection_challenge`, `glyph_memory_capsule`, -> `glyph_date_card_heart`, `glyph_question_packs`, `glyph_bucket_list`, `glyph_past_games`, `glyph_spin_wheel`, -> `glyph_couple_premium`, `glyph_privacy_lock`, `glyph_delete_account`, `glyph_how_well`, + closer_mark/daily_card/ -> quiet_hours_moon/export_data). **To make** (high-traffic first): +## Icon/glyph audit — glyphs are MADE; the open work is WIRING them (swap `Icons.*` → `glyph_*`) +> Re-audited against the code 2026-06-28: **~63 `glyph_*.xml` now exist — the entire list below has been created** — but +> the code still has **~196 generic `Icons.*` call sites** and only **23 distinct glyphs are wired**. Brand rule #2 is +> therefore now a **CODE task, not asset work**: replace each `Icons.*` with `ImageVector.vectorResource(R.drawable.glyph_*)` +> + `Icon(tint=…)`. The "(≈uses)" counts below are the **remaining unreplaced** Material call sites (2026-06-28). +> **Already wired (23):** paired_cards · how_well · sealed_answer · connection_challenge · memory_capsule · date_card_heart +> · question_packs · bucket_list · past_games · spin_wheel · couple_premium · privacy_lock · delete_account · couple · +> daily_card · forward · home · lock · play · settings · streak · chat · closer_heart_keyhole. **NB:** `lock`, `play`, +> `forward`, `home` are wired in *some* places but Material equivalents (`Icons.Filled.Lock` ×17, `PlayArrow` ×5, +> `ArrowForward` ×8, `Home` ×1) still linger — finish those swaps. Every glyph named in the table below already exists. -| Generic icon (≈uses) | Used for | Make custom glyph | +| Generic icon (≈remaining uses) | Used for | Wire to `glyph_*` (✅ asset exists) | |---|---|---| | `ArrowBack` (31) | every top-bar back | `glyph_back` (brand chevron) | | `Favorite` / `FavoriteBorder` (17/5) | **generic hearts** — likes, love, daily | `glyph_heart` (the Closer two-equal-halves heart, filled + outline) | @@ -94,7 +104,9 @@ dark surface, **same composition + flat 2D vector style + transparent/feathered | `Mic`/`Pause` · `Timeline`/`TrendingUp`/`Psychology` · `Fingerprint`/`Key`/`Shield` · `Edit`/`Add`/`Share`/`Refresh`/`Warning`/`CalendarToday`/`Cake`/`CardGiftcard`/`AttachMoney`/`HourglassEmpty`/`QuestionAnswer`/`Palette`/`OpenInNew` (1 each) | voice · progress · security · misc | one bespoke `glyph_*` each, in house style | Replace each `Icons.*` call site with `ImageVector.vectorResource(R.drawable.glyph_*)` + `Icon(tint=…)` (the existing -wiring pattern). Until a glyph exists, the Material icon is a **placeholder = a logged brand defect**, not acceptable for ship. +wiring pattern — see any wired glyph for the idiom). The glyphs now all exist, so a remaining `Icons.*` call site is an +**unfinished wiring = a logged brand defect**, not acceptable for ship. A `scripts/` scanner that greps `Icons\.` call +sites (excluding files that already wire the matching glyph) would make this measurable per round — currently ~196 remain. --- @@ -193,24 +205,26 @@ QA premium ON → modal on BOTH 5554 (dark) and 5556 (light); dismiss → relaun ## Glyph Status -The original G-set plus G2 set are copied into `app/src/main/res/drawable-nodpi/glyph_*.xml`. Source SVGs live in -`docs/brand/generated-art/glyphs/source-svg/`; Android handoff vectors live in -`docs/brand/generated-art/glyphs/android-vector/`. +**~63 `glyph_*.xml` now exist** in `app/src/main/res/drawable-nodpi/` — the original G/G2 set PLUS the full Material-icon +replacement set (back, heart, heart_outline, lock, lock_open, person, couple, check, forward, play, close, star, eye, +eye_off, copy, sync, photo, camera, send, chat, trash, home, settings, bell, streak, mic, pause, timeline, trending_up, +psychology, fingerprint, key, shield, edit, add, share, refresh, warning, calendar, cake, card_giftcard, attach_money, +hourglass, question_answer, palette, open_in_new, …). Source SVGs: `docs/brand/generated-art/glyphs/source-svg/`; +Android vectors: `docs/brand/generated-art/glyphs/android-vector/`. -**Wired + verified live (13 of 17):** -- Play hub cards: `paired_cards`, `how_well`, `sealed_answer`, `connection_challenge`, `memory_capsule`, - `date_card_heart`, `question_packs`, `bucket_list`, `past_games`. -- WaitingForPartner per-game glyphs: `spin_wheel`, `paired_cards`, `how_well`, `sealed_answer`. -- Settings rows: `couple_premium`, `privacy_lock`, `delete_account`. +**Wired in code (23 distinct, verified 2026-06-28):** `paired_cards`, `how_well`, `sealed_answer`, +`connection_challenge`, `memory_capsule`, `date_card_heart`, `question_packs`, `bucket_list`, `past_games`, `spin_wheel` +(Play-hub cards + WaitingForPartner); `couple_premium`, `privacy_lock`, `delete_account`, `settings` (Settings); plus +`couple`, `daily_card`, `forward`, `home`, `lock`, `play`, `streak`, `chat`, `closer_heart_keyhole`. -**Generated but intentionally unused for now (4 of 17):** -- `closer_mark` — notifications already use `ic_notification_closer`. -- `daily_card` — Today uses its hero illustration. -- `quiet_hours_moon` — Quiet hours uses `illustration_quiet_hours`. -- `export_data` — no export-data row exists yet. +**Created but NOT yet wired (~40):** every glyph in the icon-audit table whose Material equivalent still appears in code — +`back` (vs ArrowBack ×31), `heart`/`heart_outline` (vs Favorite ×12/×5), `person` (vs Person ×16), `check` (×11), +`close` (×7), `star` (×6), `eye`/`eye_off` (×5/×2), `copy` (×4), `send` (×3), `sync` (×3), `photo`/`camera`, `trash` (×3), +`bell`, `mic`, `pause`, `timeline`, `trending_up`, `psychology`, `fingerprint`, `key`, `shield`, `edit`, `add`, `share`, +`refresh`, `warning`, `calendar`, `cake`, `card_giftcard`, `attach_money`, `hourglass`, `question_answer`, `palette`, +`open_in_new`, `quiet_hours_moon`, `export_data`, `closer_mark`. **This is the open work** — see the icon-audit table. White monochrome vectors are re-tinted by `Icon(tint = ...)` and loaded via `ImageVector.vectorResource(...)`. -`glyph_paired_cards` is also the preferred motif for the This-or-That backdrop redesign tracked as C-DARK-UI-001. --- @@ -289,7 +303,7 @@ Legend: ✅ on-brand / no art needed · ➕ reuse/wire existing art · 🔤 bran | Past Games (empty/list) | `illustration_past_games_empty` wired | ✅ | | Your Progress / Activity | stats | 🔤 brand-colored charts; reuse `streak_milestone` for milestones | | Paywall / Subscription | couple art present | ✅ strong (couple illustration + “one subscription for both”) | -| Premium unlock modal | `illustration_premium_unlock` ready, not wired | ➕ implement one-time modal for purchaser + partner | +| Premium unlock modal | `illustration_premium_unlock` wired in `PremiumUnlockOverlay` (R13) | ✅ one-time modal for purchaser + partner; verified live both themes | | WaitingForPartner | per-game glyphs + copy | ✅ | | Settings + sub-pages | dense lists | ✅ keep clean — **no illustrations**; brand via section headers/color only 🔤 | | Security / Recovery phrase | `illustration_privacy_recovery` wired | ✅ | @@ -302,19 +316,15 @@ Legend: ✅ on-brand / no art needed · ➕ reuse/wire existing art · 🔤 bran ## Generation Backlog -**Two OPEN backlogs (2026-06-27 audit) — see the tables up top:** -1. **Dark illustration variants** — make `drawable-night-nodpi/` versions of every light-only image: all - `illustration_couple_*` heroes, `daily_question`, `partner_activation`, `tonight_partner_prompt`, `together_empty`, - and all 10 `pack_art_*` banners (see **Image theme-variant coverage**). -2. **Custom glyphs to replace ~60 generic Material icons** (see **Icon/glyph audit**) — every icon must be a bespoke - `glyph_*`, starting with the highest-traffic (back, heart, lock, person, check, forward, play, close, star). +**Status (2026-06-28 re-audit) — the asset-generation backlogs are essentially DONE; the remaining work is CODE:** +1. **Dark illustration variants — ✅ DONE.** `drawable-night-nodpi/` has a dark variant for every non-transparent + surface (all 22 `illustration_*` + all 10 `pack_art_*`). Remaining: verify the 3 transparent celebration assets + (`premium_unlock`, `spin_wheel`, `streak_milestone`) read on dark, and Pass-C spot-check the new variants. +2. **Custom glyphs — ✅ ASSETS DONE, ⚠️ WIRING OPEN.** ~63 `glyph_*.xml` exist (the full backlog is created), but + **~196 generic `Icons.*` call sites are still unwired** and only 23 glyphs are referenced in code. The open task is a + **code swap** — replace each `Icons.*` with `ImageVector.vectorResource(R.drawable.glyph_*)` — not new asset work. -Do not regenerate **completed** illustration/glyph art unless a QA pass logs a specific defect; the above are net-new. - -**Generated glyph files:** `glyph_closer_mark`, `glyph_paired_cards`, `glyph_daily_card`, `glyph_sealed_answer`, -`glyph_memory_capsule`, `glyph_date_card_heart`, `glyph_quiet_hours_moon`, `glyph_couple_premium`, -`glyph_export_data`, `glyph_delete_account`, `glyph_how_well`, `glyph_connection_challenge`, `glyph_question_packs`, -`glyph_bucket_list`, `glyph_past_games`, `glyph_spin_wheel`, `glyph_privacy_lock`. +Do not regenerate **completed** illustration/glyph art unless a QA pass logs a specific defect. --- diff --git a/docs/brand/generated-art/glyphs/glyph-contact-sheet.png b/docs/brand/generated-art/glyphs/glyph-contact-sheet.png index b9b922b9..7a349873 100644 Binary files a/docs/brand/generated-art/glyphs/glyph-contact-sheet.png and b/docs/brand/generated-art/glyphs/glyph-contact-sheet.png differ diff --git a/docs/brand/generated-art/glyphs/preview-png/glyph_connection_challenge.png b/docs/brand/generated-art/glyphs/preview-png/glyph_connection_challenge.png index 3057e1b2..0a4fec31 100644 Binary files a/docs/brand/generated-art/glyphs/preview-png/glyph_connection_challenge.png and b/docs/brand/generated-art/glyphs/preview-png/glyph_connection_challenge.png differ