- Detect 'pano360' tag and open the photo in a spherical viewer - Mini-WebGL equirect viewer (no deps): drag to look, wheel FOV, Space reset - Load original as origin-clean bitmap; fall back to flat image without WebGL - 360 indicator in viewer and badge on grid tiles
40 lines
2.7 KiB
Markdown
40 lines
2.7 KiB
Markdown
# Proposal
|
|
|
|
## Why
|
|
|
|
Пользователь загружает сферические 360-панорамы, но просмотрщик показывает их как обычное
|
|
плоское фото — искажённую equirect-развёртку. Нужен режим обзора панорамы по тегу `pano360`.
|
|
|
|
## What Changes
|
|
|
|
- **Детект по тегу.** Фото считается 360-панорамой, если среди его тегов есть `pano360`
|
|
(без учёта регистра и пробелов по краям). Теги персональные, поэтому на публичных
|
|
share-страницах и у других участников 360 не включается — фолбэк на плоский просмотр.
|
|
- **Мини-WebGL вьюер.** В просмотре появляется equirect-обзор на `<canvas>`: перетаскивание —
|
|
осмотр, колесо — угол обзора (FOV), `Space` — сброс вида. Стрелки и лента по-прежнему
|
|
переключают фото, `f` — полный экран. Без сторонних библиотек.
|
|
- **Источник изображения.** Грузится оригинал с даунскейлом до `min(4096, MAX_TEXTURE_SIZE)`;
|
|
при неудаче — `preview`. Новый вариант на бэкенде не заводится.
|
|
- **Фолбэк.** Нет WebGL или сбой загрузки/декодирования — показывается обычное плоское фото.
|
|
- **Индикация.** В топбаре просмотра виден признак «360»; на плитке сетки — бейдж «360».
|
|
|
|
## Capabilities
|
|
|
|
### New Capabilities
|
|
|
|
Нет.
|
|
|
|
### Modified Capabilities
|
|
|
|
- `ui-workspace`: добавляется требование «Просмотр 360-панорамы» (детект по тегу, сферический
|
|
обзор, управление, фолбэк, ограничение на share-страницах).
|
|
|
|
## Impact
|
|
|
|
- **Frontend:** новый `lib/pano.ts` (детект тега) и `lib/components/PanoViewer.svelte`
|
|
(WebGL equirect); правки `lib/components/Viewer.svelte` (переключение режима, клавиши,
|
|
фолбэк, индикатор) и `lib/components/PhotoGrid.svelte` (бейдж). Возможна новая иконка в
|
|
`lib/icons/registry.ts`.
|
|
- **Backend:** не затрагивается.
|
|
- **Совместимость:** поведение плоского просмотра сохраняется; 360 — дополнительный режим.
|