Files
scrabble-game/docs/ICON_BRANDBOOK.md
T
Ilia Denisov dbe2c4cb94
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
feat(icons): rebrand app icon; slice the full set from one master
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.
2026-07-13 21:49:29 +02:00

8.0 KiB
Raw Blame History

Erudit app-icon — brand book

The single source of truth for how the Erudit icon is constructed. It is written to be reproducible from words alone: a designer with this document and the Spectral font can rebuild the icon exactly, at any size, without pixel-matching anything.

Two rules make that possible:

  1. The icon is a square. Every size and position below is a fraction of the square's side (equivalently, a percentage). Nothing is in pixels. Draw the square at whatever resolution you need and scale each value to it.
  2. The origin is the top-left corner. x grows right, y grows down. So "center 48.1% / 49.2%" means a point 0.481·side from the left and 0.492·side from the top.

The companion generator in ../assets/icons/brand/ is the machine version of this exact spec (build-icon.mjs, where each constant is the same fraction printed here). The docs/ICONS.md map covers the opposite concern — which files/sizes we slice this master into for each platform.

Anatomy

Construction scheme

Bottom-to-top the icon is six layers: tile → wood grain → light sheen → shadow → letter «Э» → star ✻. The letter and star are always drawn last, at full ink colour; the grain and the two gradients only ever touch the background.

Palette

The icon ships as a light and a dark variant (a matched pair — the light tile carries dark ink, the dark tile carries light ink). Each variant uses four colours.

Role Light Dark
Tile — the wooden body #e6b053 #4a3316
Ink — the «Э» and the ✻ #5a3a12 #f2d9a0
Grain — the vertical stripes #d8a54e #432e14
Sheen — diagonal light white, α 0 → 15 % white, α 0 → 15 %
Shadow — diagonal dark black, α 15 → 0 % black, α 15 → 0 %

The grain colour is intentionally close to the tile — a hair darker — so the stripes read as wood texture, not as stripes.

1 — Tile

A square with rounded corners, corner radius 17 % of the side, filled with the Tile colour. This is the whole background; there is no separate outer frame or border. Corners are baked at 17 %; platform masks (iOS/Android) may round further on top.

2 — Wood grain

Subtle vertical planks over the tile:

  • Divide the width into 6 equal columns (each 1/6 of the side wide).
  • On the right edge of each column, draw one vertical stripe, width 1/32 of the side (≈ 3.1 %), running the full height.
  • Move the whole set of six stripes left by 1/16 of the side (= two stripe widths).
  • Tilt every stripe 4° (clockwise, about its own centre).
  • Draw the stripes past the top and bottom edges so the tilt leaves no empty corners, then clip the whole set to the tile (so the rounded corners stay clean).
  • Colour: Grain.

3 — Light sheen · 4 — Shadow

Two linear gradients along the same diagonal, from the bottom-left corner to the top-right corner, each clipped to the tile and sitting above the grain, below the letter:

  • Sheen — white. Fully transparent at the bottom-left, rising to 15 % opacity at the top-right. Brightens the top-right.
  • Shadow — black. 15 % opacity at the bottom-left, fading to transparent at the top-right. Deepens the bottom-left.

Together they give the tile a lit-from-the-top-right, resting-in-shadow-at-the-bottom-left sense of depth. Both percentages are a tuning knob (--sheen, --shade).

5 — The letter «Э»

  • Typeface: Spectral, Bold (SIL OFL; pinned in the brand folder).
  • Glyph: the Cyrillic capital «Э» (U+042D).
  • Size: scale the glyph so its ink bounding box is 60.5 % of the side tall (its width then follows the font — about 53.2 %).
  • Position: place the center of that bounding box at 48.1 % / 49.2 % (just up and left of the icon center).
  • Colour: Ink.

6 — The star ✻

A six-spoke teardrop asterisk (the "score" mark that replaces a tile's point number):

  • Each spoke tapers to a point at the center and ends in a round bulb; a central disc equal to a bulb fuses the six spokes.
  • Outer diameter: 17.3 % of the side.
  • Bulb radius (and the central disc): 22 % of the star's radius.
  • Position: center at 78.8 % / 78.8 % — tucked to the lower-right of the «Э», like a subscript, with a clear gap from the letter.
  • Colour: Ink.

Spectral has no ✻ glyph, so the star is drawn geometrically, not set as type. The exact construction is in build-icon.mjs (starPath).

Composition intent

The «Э» and the ✻ are treated as one group. Its combined bounding box measures about 65.9 % × 68.6 % of the side, and it is placed so its bottom-right corner sits at 87.5 % / 87.5 % of the icon (the lower-right corner of an inner 12.5 % … 87.5 % safe square). That is what pushes the composition down-and-right and leaves the star room in the corner. When re-deriving positions, this is the anchor to preserve.

This bottom-right bias suits a full-bleed icon (iOS / PWA / favicon, which show almost the whole square). Android crops more, so it uses a separate two-layer build — see the next section. The master itself is never moved for Android.

Android adaptive icon (two layers)

Android icons are 108×108 dp and the OS applies its own mask (circle, squircle, rounded square…). Only the inner 66 dp = 61 % of the side, centred is guaranteed visible under every mask; the outer ~1/6 ring is used for the mask and motion effects. So Android is not the full-bleed master — it is built as two layers:

  • Background — the tile with wood grain and the light/shadow gradients, full-bleed and square (no rounded corners; the OS supplies the shape). It fills the whole 108 dp layer, so the sacrificial outer ring is just more wood.
  • Foregroundonly the «Э» + ✻, transparent, re-placed to sit safely inside the mask:
    • «Э»: box height 53.9 %, box center 52.3 % / 49.5 %.
    • ✻: outer diameter 13.2 % (smaller than the master's), center 76.3 % / 72.7 %, tucked closer to the letter.
    • The mark is centred, then nudged right 8 % / down 3 % so it reads optically centred under the round mask, and the whole group fits within the 61 % safe zone.

Everything else (palette, grain, gradients, star construction) is identical to the master.

Variants in use

The light variant is the primary icon (launcher, favicon, apple-touch, PWA). The dark variant is shipped in addition wherever the platform can pick by appearance (e.g. an SVG favicon via prefers-color-scheme). Where a platform allows only one icon, use light.

Reproduce

cd assets/icons/brand
npm i opentype.js
# full master (iOS / PWA / favicon), either variant:
node build-icon.mjs --variant light --layer full        > icon-light.svg
# Android adaptive layers:
node build-icon.mjs --variant light --layer background   > icon-light-android-background.svg
node build-icon.mjs --variant light --layer foreground   > icon-light-android-foreground.svg
# the construction figure:
node build-icon.mjs --variant light --scheme             > icon-construction.svg
node render-png.mjs  icon-light.svg  icon-light.png  1024   # any size

--layer is full (default), background, or foreground. All outputs are committed alongside the generator in ../assets/icons/brand/.

Masters

Light Dark
Full (iOS / PWA / favicon) light dark
Android background lbg dbg
Android foreground lfg dfg