chore(openspec): archive thumbnail-variants and sync main specs

This commit is contained in:
iu
2026-10-11 19:57:12 +03:00
parent f1b3b01bdf
commit d059d042f0
12 changed files with 49 additions and 8 deletions
@@ -0,0 +1,47 @@
# Proposal
## Why
Сетка миниатюр часто отображает изображение крупнее, чем единственный вариант `thumb` (200px),
потому что между миниатюрой 200px и превью 1200px нет промежуточного размера. При увеличении
плиток (малое число колонок) и на экранах с высокой плотностью пикселей фото расплывается;
обложки альбомов в обзоре и вовсе отдают только 200px.
## What Changes
- Добавить четвёртый вариант `medium` — квадратный кроп 800×800, WebP — и роль `medium` в
журнале объектов. `thumb` перевести на квадратный кроп 200×200; `preview` остаётся вписанным
1200×1200 для просмотрщика.
- API фото SHALL отдавать `medium_url` рядом с `thumb_url`/`preview_url`; данные обложки
альбома SHALL отдавать URL более крупного варианта обложки.
- Сетка фото и обзор альбомов SHALL выбирать вариант под фактический размер плитки через
`srcset` (200/800/1200) и `sizes`, а не всегда тянуть 200px.
- Миграция расширяет ограничение роли `photo_objects` значением `medium` (Postgres и SQLite) и
ставит в очередь перегенерацию вариантов для уже загруженных фото.
- Из-за смены кропа у `thumb` существующие миниатюры перегенерируются (квадратными) вместе с
добавлением `medium`.
## Capabilities
### New Capabilities
Нет.
### Modified Capabilities
- `photos`: требование «Варианты изображений» — четыре варианта, квадратный кроп grid-вариантов.
- `media-objects`: требование «Журнал объектов» — роль `medium` в наборе ролей.
- `albums`: требование «Отображение обложки альбома» — URL обложки крупнее миниатюры.
- `ui-workspace`: новое требование — сетка и обзор альбомов подбирают вариант изображения под
размер плитки.
## Impact
- Backend: `photos/{pipeline,worker,objects,models,service,store,sqlite_store}.go`,
`albums/{models,store,sqlite_store,service}.go`, миграции Postgres и SQLite, бэкфилл
`variant_jobs`, контрактные тесты `repo/contract`.
- Frontend: `PhotoGrid.svelte` и обзор альбомов (`(app)/+page.svelte`).
- API: новые поля `medium_url` (фото) и URL medium-обложки (альбом); существующие клиенты
продолжают работать (аддитивно).
- Хранилище: +1 производный объект (800px WebP) на фото; preview у существующих фото
перегенерируется впустую и удаляется сборщиком мусора по ссылкам.