opencode-config/docs/handoff/pr-195-update-cover-without-subtitle.md
Sergey cdd8ba20e3
chore(assets): update cover without subtitle (#195)
* chore(assets): update cover without subtitle

* fix(assets): restore optional slots in cover template for engine tests

* docs(handoff): add handoff + ADR for PR #195 cover update

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-01 01:03:14 +03:00

3.8 KiB
Raw Permalink Blame History

pr title
195 chore(assets): update cover without subtitle

Что сделано

Обновил обложку репозитория (issue #194) — три правки в существующих файлах, без структурных изменений:

  1. cover.svg — увеличен icon-слот.opencode/draw-image/templates/cover.svg: слот icon 400×400 → 520×520, позиция x=312 → x=252 (центрирование по 1024-канвасу: (1024520)/2=252). Заголовок {{title}} переведён в lowercase (opencode config), font-size 72 → 80, позиция y=870 → y=830 (компенсация роста icon-слота, чтобы title не налезал на логотип).
  2. Опциональные слоты движка сохранены<text> с {{subtitle}} и слоты sub-icon/badge оставлены в шаблоне. Удаление <text> сломало бы тесты render.optional.test.ts / e2e.optional.test.ts (PR#144), которые проверяют, что пустой subtitle → нет <text> элемента. Финальный assets/cover.png отренерен БЕЗ subtitle-аргумента — render.ts conditional-regex (PR#144) удаляет <text> строку с {{subtitle}} при falsy args.subtitle.
  3. Регенерация assets/cover.png + cover.meta.json — перерендерено через draw-image CLI (template=cover, icon=opencode, title="opencode config", без subtitle). Новый хеш 646197c4… (был de803675…), generatedAt 2026-07-31. Размер 1024×1024 сохранён (density:72, PR#161).

Изменены 3 файла: cover.svg, cover.png, cover.meta.json. README, brand.json, тесты — не затронуты.

Почему

Финальный вариант обложки (без subtitle, с крупным логотипом 520×520 и lowercase-заголовком) выглядит чище и лучше подходит для showcase на slaid098.dev. Сохранение опциональных слотов движка (sub-icon/badge/subtitle) в шаблоне — сознательное решение: шаблон остаётся универсальным для других репо, а conditional-логика render.ts (PR#144) гарантирует, что незаполненные слоты не оставляют пустых элементов в финальном PNG.

Pending

— (после merge: при желании можно применить тот же шаблон к другим репо slaid098 через draw-image — отдельный шаг, как после PR#158)

Watch out

  • PR body vs фактический diff — PR body утверждает «Убрал subtitle из шаблона», но <text> с {{subtitle}} остался в cover.svg. Это не расхождение с intent: subtitle убран из финального PNG (через отсутствие аргумента), а не из шаблона. Шаблон сохраняет слот для переиспользования.
  • Хэш cover.meta.json изменилсяcomputeHash (sha256) зависит от SVG-контента и generatedAt. Все cached PNG будут перерендерены при следующем вызове CLI, если файл удалён (meta.json hash не меняется, но пиксели differ).
  • icon-слот 520×520 при x=252 — нижний край иконки на y=180+520=700, title на y=830 (font-size 80, baseline). Зазор ~130px — достаточно для Geist Sans. Если увеличить icon дальше (>560), title начнёт налезать.