feat(icons): rebrand app icon; slice the full set from one master
CI / changes (pull_request) Successful in 3s
CI / unit (pull_request) Successful in 11s
CI / integration (pull_request) Successful in 23s
CI / ui (pull_request) Successful in 1m13s
CI / conformance (pull_request) Successful in 9s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m54s

The SVG tracer export failed, so the icon was designed collaboratively from
scratch: a wooden «Э» tile with a ✻ score-subscript in Spectral Bold, wood
grain and diagonal light/shadow. Construction is specified in fractions of the
side in docs/ICON_BRANDBOOK.md; the reference generator, pinned Spectral font
and committed masters live in assets/icons/brand/.

One master -> the whole set (assets/icons/brand/build-set.mjs + build-android-res.mjs):
- web (ui/public): favicon.svg (light+dark via prefers-color-scheme), favicon.ico,
  apple-touch, PWA any + maskable (+ dark variants), og-image reskinned to
  «Эрудит» / Игра в слова
- Capacitor layers: ui/assets/{icon,icon-foreground,icon-background}.png
- Android launcher res, all densities, NO inset, + monochrome themed layer
  (anydpi xml: background+foreground+monochrome)
- manual-upload art: assets/icons/brand/{vk,tg,store} (square, no rounding)

Primary variant light; dark where the platform can theme (favicon.svg). The old
LiberationSans generator (assets/icons/build) is removed; docs/ICONS.md retargeted
onto the single master. ANDROID_PLAN icon-rebrand item marked done.
This commit is contained in:
Ilia Denisov
2026-07-13 21:49:29 +02:00
parent 8c5b659ddf
commit dbe2c4cb94
84 changed files with 753 additions and 365 deletions
+25 -24
View File
@@ -64,11 +64,9 @@ Kept current as parts land so a fresh session resumes without re-deriving. Verif
> ### ▶ RESUME HERE — 2026-07-13 (documents track + release-prep)
>
> **Where we are.** The legal-documents track and the release-prep hygiene are DONE. The RuStore
> release is now gated on **owner-side** items (icon vector, keystore, RuStore account). The owner is
> bringing the **icon vector** next; **when it lands, resume by generating the icon set** per
> [`docs/ICONS.md`](docs/ICONS.md), then continue the release chain below. Do not re-do or re-litigate
> the finished work; do not re-ask the locked decisions.
> **Where we are.** The legal-documents track, the release-prep hygiene, **and the icon rebrand** are
> DONE. The RuStore release is now gated on **owner-side** items only (keystore, RuStore account) plus
> the merge/tag chain. Do not re-do or re-litigate the finished work; do not re-ask the locked decisions.
>
> **Branches / PRs (current working branch: `feature/android-release-prep`).**
> - `development` — has the **legal-documents track**, merged via **PR #253** (green, deployed to the
@@ -102,13 +100,16 @@ Kept current as parts land so a fresh session resumes without re-deriving. Verif
> added [`docs/ICONS.md`](docs/ICONS.md) (the single-master icon/logo format reference).
>
> **Remaining to release (owner-gated unless the agent is named).**
> 1. **Icon rebrand.** OWNER brings a final **vector (SVG)** master (+ optional format guides). AGENT
> then generates every target per `docs/ICONS.md`. Obligatory source files: the vector + a
> **1024×1024 opaque PNG**; recommended: `ui/assets/icon-foreground.png` + `icon-background.png` for
> a proper Android/iOS adaptive icon. Today the web favicon generator (`assets/icons/`) and the
> hand-placed PWA icons drift — unify onto the new master. **Open sub-decision (settle with the owner
> when the vector arrives):** retarget the `assets/icons/` generator onto the new vector, or drop in
> the output files and keep the generator for the OG card only.
> 1. **Icon rebrand — DONE.** The SVG-tracer export failed, so the icon was designed **collaboratively
> from scratch** (wooden «Э» tile + ✻ subscript, Spectral Bold). The construction is fully specified
> in fractions of the side in [`docs/ICON_BRANDBOOK.md`](docs/ICON_BRANDBOOK.md), with the reference
> generator + pinned font + masters in [`assets/icons/brand/`](assets/icons/brand/). One master →
> the whole set sliced by `brand/build-set.mjs` (+ `build-android-res.mjs`): web (favicon light+dark,
> apple-touch, PWA any + maskable, og-image reskinned to «Эрудит» / Игра в слова), the Capacitor
> layers `ui/assets/{icon,icon-foreground,icon-background}.png`, the Android launcher res (all
> densities, **no inset**, **+ monochrome** themed layer), and manual-upload art (`brand/{vk,tg,store}`).
> Primary variant **light**; dark where the platform can theme (favicon.svg). The old LiberationSans
> generator (`assets/icons/build/`) is removed; targets are mapped in `docs/ICONS.md`.
> 2. **Merge PR #254** → `development` (owner approval), then **promote `development` → `master`** and
> **tag `vX.Y.Z`** for the release (the version stamps the APK `versionName`/`versionCode` and the
> `X-Client-Version` header).
@@ -138,9 +139,9 @@ Kept current as parts land so a fresh session resumes without re-deriving. Verif
builds a debug APK that installs and **cold-launches to the Login screen** on the Pixel_10 emulator.
`svelte-check` 0 errors, `vitest` 584 passed. Build recipe + toolchain gotchas live in
`.claude/CLAUDE.md` → "Native Android build (Capacitor)".
**Launcher icon:** a **temporary** placeholder is in place — `ui/assets/icon.png` (the maskable «Э»
brand mark upscaled 512→1024) → `pnpm android:assets` regenerated the Android launcher/adaptive
icons + splashes. Superseded by the icon rebrand below.
**Launcher icon:** the temporary placeholder was **superseded by the icon rebrand** — the launcher
now uses the two-layer adaptive icon (background + foreground + monochrome) generated from the brand
master; see the RESUME block (item 1), `docs/ICON_BRANDBOOK.md` and `docs/ICONS.md`.
- **B. Native web-build correctness — ✅ DONE & verified (2026-07-12).** New `ui/src/lib/origin.ts`
`gatewayOrigin()`; the two `location.origin` landmines fixed (`game/Game.svelte` export/share URL,
`screens/Wallet.svelte` site-root) — `transport.ts:32` already resolves via `VITE_GATEWAY_URL`, left
@@ -251,11 +252,10 @@ Kept current as parts land so a fresh session resumes without re-deriving. Verif
then O2O7; the release chain (PR→development→contour→master→tag→dispatch `android-build`) follows. None of
O1O7 is started. Branch `feature/android-native`, local/unpushed.
Open logistics (not code): **mandatory icon rebrand (future)** — author ONE vector master and generate
*every* icon from it (web `favicon.svg` / PWA `icon-*` / maskable, Android adaptive, future iOS). Today
the formats drift — `favicon.svg` is a rounded bordered tile, `icon-maskable-512.png` a full-bleed
square, visibly different — and the Android launcher icon is only a temporary upscale of the maskable
(`capacitor-assets` insets it 16.7% into the adaptive safe zone). `~/.claude/bin/gitea-ci-watch.py` is present.
Icon rebrand — **DONE** (was "one master → every icon"): a single Spectral «Э» master now drives web
(favicon light+dark / PWA any + maskable / apple-touch / og), the Capacitor layers and the Android
adaptive res (no inset, + monochrome), plus VK/TG/store art. Specced in `docs/ICON_BRANDBOOK.md`,
mapped in `docs/ICONS.md`, generated from `assets/icons/brand/`. `~/.claude/bin/gitea-ci-watch.py` is present.
RuStore publication prerequisites gate release only.
---
@@ -404,8 +404,8 @@ is: scaffold → native-correct → gate → offline-first → CI → docs → r
```
Call once from bootstrap. `atNavigationRoot` = current route is `lobby`/`login`
(mirror `routeDepth(...) === 0` from `App.svelte:50-54`, reading `router.svelte.ts`).
- **Launcher icon (owner asset):** owner supplies a 1024×1024 «Э» icon at `ui/assets/icon.png`
(+ optional `splash.png`); `pnpm android:assets` generates adaptive icons.
- **Launcher icon:** DONE — generated from the brand master into the Capacitor layers
`ui/assets/{icon,icon-foreground,icon-background}.png` and the Android res; see `docs/ICONS.md`.
**Done when:** `npx cap sync android` succeeds against a real `pnpm build`, and (from `ui/android/`)
`./gradlew assembleDebug` produces a debug APK that installs and cold-launches to the login screen.
@@ -768,8 +768,9 @@ Wire in `ui/android/app/build.gradle` `defaultConfig`:
> **Status 2026-07-13 — see the ▶ RESUME block at the top of §Progress.** Since this chain was
> written, a **legal-documents track** was added and merged (PR #253 — the RuStore hosted
> privacy-policy URL and the `/privacy/ /eula/ /offer/` pages), and a **release-prep hygiene** patch is
> in flight (PR #254, open). The remaining gates are the **icon vector**, the **keystore** and the
> **RuStore account** (all owner-side). The steps below are the original release chain; the resume
> in flight (PR #254, open), and the **icon rebrand is DONE** (brand master → full set; see the RESUME
> block). The remaining gates are the **keystore** and the **RuStore account** (owner-side). The steps
> below are the original release chain; the resume
> block supersedes them with the current, exhaustive state.
0. **Land the offline-model redesign — ✅ DONE (O1O7, 2026-07-13; staged detail below).** Resolved the deferred