feat(vk): VK community cover #285

Merged
developer merged 3 commits from feature/vk-group-cover into development 2026-07-27 14:03:31 +00:00
Owner

Cover art for the VK community (1920x768) plus the generator that renders it. The
community avatar (the «Э» tile) is uploaded separately — this is only the backdrop.

Ships two covers, same camera and crop, differing only in light: cover-night-spot.png
(dark, board in a warm spotlight) and cover-day-spot.png (light). build-cover.mjs
reproduces exactly those two files.

The board is a legal position, and that is checked rather than asserted.
ГРАМОТНОСТЬ opens through the centre square (its Т on H8) and СОПЕРНИК / ЭРУДИЦИЯ / УМ
each hook onto a shared letter. assertLegal re-reads the finished grid on every run and
fails the build if the centre is uncovered, if a declared word is missing, or if any
maximal run of two or more letters is a word nobody played. All four words were verified
against ru_erudit.dawg through the engine's own alphabet encoder; tile values come from
scrabble-solver rules.Erudit().

Composition respects VK's keep-outs, measured off VK's own template (committed here as
assets/vk/VK_group_cover_template.fig): the top 130 px some clients crop, and the avatar
circle VK overlays on the bottom-left in its mobile app. ZONES=1 paints both over the
render. That avatar is why the words are arranged as two long horizontals — the
alternative arrangement (LAYOUT=cross) hangs ЭРУДИЦИЯ down the left, straight under it.

No new dependency. skia-canvas is borrowed from the render sidecar's node_modules
rather than installed a second time for a one-off asset build, and the letters are set in
the icon brand folder's Spectral-Bold.ttf.

Assets and one standalone script only — no service, UI or deploy code is touched.

Cover art for the VK community (1920x768) plus the generator that renders it. The community avatar (the «Э» tile) is uploaded separately — this is only the backdrop. Ships two covers, same camera and crop, differing only in light: `cover-night-spot.png` (dark, board in a warm spotlight) and `cover-day-spot.png` (light). `build-cover.mjs` reproduces exactly those two files. **The board is a legal position, and that is checked rather than asserted.** ГРАМОТНОСТЬ opens through the centre square (its Т on H8) and СОПЕРНИК / ЭРУДИЦИЯ / УМ each hook onto a shared letter. `assertLegal` re-reads the finished grid on every run and fails the build if the centre is uncovered, if a declared word is missing, or if any maximal run of two or more letters is a word nobody played. All four words were verified against `ru_erudit.dawg` through the engine's own alphabet encoder; tile values come from `scrabble-solver` `rules.Erudit()`. **Composition respects VK's keep-outs**, measured off VK's own template (committed here as `assets/vk/VK_group_cover_template.fig`): the top 130 px some clients crop, and the avatar circle VK overlays on the bottom-left in its mobile app. `ZONES=1` paints both over the render. That avatar is why the words are arranged as two long horizontals — the alternative arrangement (`LAYOUT=cross`) hangs ЭРУДИЦИЯ down the left, straight under it. **No new dependency.** skia-canvas is borrowed from the render sidecar's `node_modules` rather than installed a second time for a one-off asset build, and the letters are set in the icon brand folder's `Spectral-Bold.ttf`. Assets and one standalone script only — no service, UI or deploy code is touched.
developer added 3 commits 2026-07-27 13:59:59 +00:00
Adds VK's own cover template (1920x768) and a self-contained generator that
renders an Эрудит board in perspective with ГРАМОТНОСТЬ / СОПЕРНИК /
ЭРУДИЦИЯ / УМ already played, in six art-direction variants for review.

The position is checked, not asserted: assertLegal re-reads the finished grid
and fails the build unless the centre is covered, every declared word is on the
board, and no maximal run of two or more letters is a word nobody played. All
four words are in the Эрудит dictionary and tile values come from
scrabble-solver rules.Erudit().

The camera has pitch only, so the perspective warp reduces to an exact
per-scanline remap of a flat texture; tile thickness is filled as 3D quads
between the board plane and the tile plane. skia-canvas is borrowed from the
render sidecar rather than installed a second time for a one-off asset build.

Composition respects the two VK keep-outs measured off the template: the top
130 px some clients crop, and the mobile avatar circle over the bottom-left —
which is why the default word arrangement keeps that corner empty.
Sets the letter in the tile's top-left corner with the value staying bottom
right — the in-game tile layout — instead of centring it. The glyph is placed
by its ink box rather than the text origin, so every letter lands on the same
corner whatever its side bearings and ascent.

Adds day-spot: the same crop and camera as night-spot on a light ground, so the
chosen composition exists as a light/dark pair.
chore(vk): keep the two chosen covers, drop the rest
CI / changes (pull_request) Successful in 5s
CI / unit (pull_request) Has been skipped
CI / integration (pull_request) Has been skipped
CI / ui (pull_request) Has been skipped
CI / conformance (pull_request) Has been skipped
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Has been skipped
b53e23fe4d
The dark and light covers move up beside the generator as the shipped assets;
the six exploratory variants and the contact sheet go.

Trims the generator to match: VARIANTS is now only the two covers, and with the
retired variants gone so are the knobs nothing reaches any more — the wordmark
caption, the branded palette, the whole-board height fit and the non-brand tile
face. Left behind, they would read as supported options that no output exercises.

`node build-cover.mjs` now reproduces exactly the two committed PNGs.
owner approved these changes 2026-07-27 14:00:55 +00:00
developer merged commit 9506f89d9e into development 2026-07-27 14:03:31 +00:00
developer deleted branch feature/vk-group-cover 2026-07-27 14:03:31 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: developer/scrabble-game#285