Files
ds-galo/openspec/changes/pano360-viewer/proposal.md
T
iu fc4233cd57 feat(ui): 360 panorama viewer by pano360 tag
- 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
2026-10-11 17:41:28 +03:00

2.7 KiB

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 — дополнительный режим.