docs(openspec): описать правки редактора, сделанные без спецификаций
Дополнены спеки ui-workspace (сворачивание кривой, живая гистограмма, точки кривой, навигация в зуме, Space к центру), media-objects (роли edit*, привязка отредактированной версии, отдельная очередь рендера правок), photos (рендер по оригиналу) и dev-make-workflow (сборка WASM-модуля).
This commit is contained in:
@@ -53,3 +53,22 @@ Android-клиента и устанавливает его на выбранн
|
|||||||
#### Scenario: Явная цель
|
#### Scenario: Явная цель
|
||||||
- **WHEN** `make` запущен с именем цели, например `make frontend`
|
- **WHEN** `make` запущен с именем цели, например `make frontend`
|
||||||
- **THEN** выполняется именно эта цель
|
- **THEN** выполняется именно эта цель
|
||||||
|
|
||||||
|
### Requirement: Сборка WASM-модуля фильтров
|
||||||
|
Фильтры правок в браузере SHALL считаться WASM-модулем, собираемым из исходников на
|
||||||
|
Rust в каталоге `frontend/wasm/light`. Сборка фронтенда SHALL обновлять модуль перед
|
||||||
|
сборкой статики. Если инструмент сборки модуля недоступен, SHALL использоваться готовый
|
||||||
|
модуль из репозитория, а сборка SHALL NOT прерываться. Готовый модуль SHALL храниться
|
||||||
|
в репозитории, чтобы фронтенд собирался без Rust-инструментов.
|
||||||
|
|
||||||
|
#### Scenario: Сборка фронтенда с модулем
|
||||||
|
- **WHEN** выполняется сборка фронтенда
|
||||||
|
- **THEN** перед сборкой статики обновляется WASM-модуль фильтров
|
||||||
|
|
||||||
|
#### Scenario: Нет Rust-инструментов
|
||||||
|
- **WHEN** инструмент сборки модуля недоступен
|
||||||
|
- **THEN** используется готовый модуль из репозитория, а сборка завершается успешно
|
||||||
|
|
||||||
|
#### Scenario: Готовый модуль в репозитории
|
||||||
|
- **WHEN** репозиторий проверяется на чистоту
|
||||||
|
- **THEN** собранный модуль фильтров присутствует в нём
|
||||||
|
|||||||
@@ -25,7 +25,8 @@
|
|||||||
|
|
||||||
Каждый физический объект SHALL иметь ровно одну запись в слое метаданных с ключом,
|
Каждый физический объект SHALL иметь ровно одну запись в слое метаданных с ключом,
|
||||||
MIME-типом, размером, габаритами и состоянием; фото SHALL ссылаться на объекты по
|
MIME-типом, размером, габаритами и состоянием; фото SHALL ссылаться на объекты по
|
||||||
ролям original, thumb, medium, preview и playback.
|
ролям original, thumb, medium, preview, playback, edit, edit_thumb, edit_medium и
|
||||||
|
edit_preview.
|
||||||
|
|
||||||
#### Scenario: Привязка ролей
|
#### Scenario: Привязка ролей
|
||||||
|
|
||||||
@@ -42,10 +43,18 @@ MIME-типом, размером, габаритами и состоянием;
|
|||||||
- **WHEN** видео обработано
|
- **WHEN** видео обработано
|
||||||
- **THEN** медиа ссылается на объект playback наряду с оригиналом и постером
|
- **THEN** медиа ссылается на объект playback наряду с оригиналом и постером
|
||||||
|
|
||||||
|
#### Scenario: Привязка отредактированной версии
|
||||||
|
|
||||||
|
- **WHEN** фото отредактировано и отредактированная версия отрендерена
|
||||||
|
- **THEN** фото ссылается на объекты edit, edit_thumb, edit_medium и edit_preview рядом с
|
||||||
|
исходными вариантами
|
||||||
|
|
||||||
### Requirement: Совместные объекты
|
### Requirement: Совместные объекты
|
||||||
Несколько фото SHALL иметь возможность ссылаться на один и тот же физический
|
Несколько фото SHALL иметь возможность ссылаться на один и тот же физический
|
||||||
объект; перенос и копирование SHALL изменять только ссылки и SHALL не изменять
|
объект; перенос и копирование SHALL изменять только ссылки и SHALL не изменять
|
||||||
объекты хранилища.
|
объекты хранилища. Отредактированная версия SHALL создаваться и привязываться только
|
||||||
|
к тому фото, чьи правки её породили, в отличие от обычных вариантов, которые
|
||||||
|
разделяются копиями того же оригинала.
|
||||||
|
|
||||||
#### Scenario: Копирование
|
#### Scenario: Копирование
|
||||||
- **WHEN** пользователь копирует фото в другой альбом
|
- **WHEN** пользователь копирует фото в другой альбом
|
||||||
@@ -55,6 +64,16 @@ MIME-типом, размером, габаритами и состоянием;
|
|||||||
- **WHEN** пользователь переносит фото в другой альбом
|
- **WHEN** пользователь переносит фото в другой альбом
|
||||||
- **THEN** изменяется только привязка к альбому, объекты хранилища не меняются
|
- **THEN** изменяется только привязка к альбому, объекты хранилища не меняются
|
||||||
|
|
||||||
|
#### Scenario: Правка не распространяется на копии
|
||||||
|
- **WHEN** фото скопировали в другой альбом, а затем отредактировали исходное фото
|
||||||
|
- **THEN** отредактированные объекты привязаны только к отредактированному фото, а копия
|
||||||
|
остаётся в исходном виде
|
||||||
|
|
||||||
|
#### Scenario: Копия отредактированного фото
|
||||||
|
- **WHEN** фото с уже отрендеренной отредактированной версией копируют в другой альбом
|
||||||
|
- **THEN** копия разделяет те же объекты, включая отредактированные, но не наследует
|
||||||
|
параметры правок
|
||||||
|
|
||||||
### Requirement: Сборка мусора по ссылкам
|
### Requirement: Сборка мусора по ссылкам
|
||||||
Объект хранилища SHALL удаляться только когда на него не ссылается ни одно фото и ни один
|
Объект хранилища SHALL удаляться только когда на него не ссылается ни одно фото и ни один
|
||||||
аватар пользователя; удаление альбома и попадание фото в корзину SHALL сохранять объекты.
|
аватар пользователя; удаление альбома и попадание фото в корзину SHALL сохранять объекты.
|
||||||
@@ -93,7 +112,9 @@ MIME-типом, размером, габаритами и состоянием;
|
|||||||
однократным выполнением и повтором при сбое; готовый результат SHALL
|
однократным выполнением и повтором при сбое; готовый результат SHALL
|
||||||
транслироваться подписчикам альбома. Очередь SHALL поддерживать настраиваемую
|
транслироваться подписчикам альбома. Очередь SHALL поддерживать настраиваемую
|
||||||
пропускную способность, SHALL обрабатывать более свежие фото раньше остальных и
|
пропускную способность, SHALL обрабатывать более свежие фото раньше остальных и
|
||||||
SHALL различать короткие задания изображений и длительные задания видео.
|
SHALL различать короткие задания изображений и длительные задания видео. Рендер
|
||||||
|
отредактированных версий SHALL использовать отдельную очередь, чтобы правки не
|
||||||
|
блокировали генерацию обычных вариантов.
|
||||||
|
|
||||||
#### Scenario: Повтор после рестарта
|
#### Scenario: Повтор после рестарта
|
||||||
- **WHEN** процесс перезапускается с незавершёнными заданиями
|
- **WHEN** процесс перезапускается с незавершёнными заданиями
|
||||||
@@ -115,6 +136,10 @@ SHALL различать короткие задания изображений
|
|||||||
- **WHEN** выполняется длительная подготовка видео
|
- **WHEN** выполняется длительная подготовка видео
|
||||||
- **THEN** задание удерживается на весь срок выполнения и не вытесняет генерацию вариантов изображений
|
- **THEN** задание удерживается на весь срок выполнения и не вытесняет генерацию вариантов изображений
|
||||||
|
|
||||||
|
#### Scenario: Рендер правок не блокирует варианты
|
||||||
|
- **WHEN** в фоне выполняется рендер отредактированной версии
|
||||||
|
- **THEN** генерация обычных вариантов продолжается независимо от него
|
||||||
|
|
||||||
### Requirement: Аватар пользователя как объект журнала
|
### Requirement: Аватар пользователя как объект журнала
|
||||||
Аватар пользователя SHALL храниться как объект журнала, привязанный к пользователю по ролям,
|
Аватар пользователя SHALL храниться как объект журнала, привязанный к пользователю по ролям,
|
||||||
соответствующим нарезкам аватара. Замена и удаление аватара SHALL менять привязку, а объекты
|
соответствующим нарезкам аватара. Замена и удаление аватара SHALL менять привязку, а объекты
|
||||||
|
|||||||
@@ -286,9 +286,10 @@ SHALL быть доступно и для фото без альбома (нап
|
|||||||
Система SHALL поддерживать неразрушающее редактирование фотографий. Параметры правок
|
Система SHALL поддерживать неразрушающее редактирование фотографий. Параметры правок
|
||||||
SHALL храниться в метаданных фото, а отредактированная версия SHALL создаваться как
|
SHALL храниться в метаданных фото, а отредактированная версия SHALL создаваться как
|
||||||
отдельные объекты (роли `edit`, `edit_thumb`, `edit_medium`, `edit_preview`) рядом с
|
отдельные объекты (роли `edit`, `edit_thumb`, `edit_medium`, `edit_preview`) рядом с
|
||||||
исходными вариантами. Исходный объект SHALL оставаться неизменным, а скачивание SHALL
|
исходными вариантами. Рендер SHALL выполняться по исходному объекту фото, а не по
|
||||||
отдавать оригинал. Сброс правок SHALL удалять и параметры, и отредактированную версию.
|
его уменьшенным вариантам. Исходный объект SHALL оставаться неизменным, а скачивание
|
||||||
Правки SHALL применять только к изображениям.
|
SHALL отдавать оригинал. Сброс правок SHALL удалять и параметры, и отредактированную
|
||||||
|
версию. Правки SHALL применять только к изображениям.
|
||||||
|
|
||||||
#### Scenario: Сохранение правок
|
#### Scenario: Сохранение правок
|
||||||
- **WHEN** пользователь сохраняет правки фото
|
- **WHEN** пользователь сохраняет правки фото
|
||||||
@@ -298,6 +299,10 @@ SHALL храниться в метаданных фото, а отредакти
|
|||||||
- **WHEN** правки фото сохранены
|
- **WHEN** правки фото сохранены
|
||||||
- **THEN** система готовит варианты сетки и полноразмерную версию в фоне и сообщает о готовности
|
- **THEN** система готовит варианты сетки и полноразмерную версию в фоне и сообщает о готовности
|
||||||
|
|
||||||
|
#### Scenario: Рендер по оригиналу
|
||||||
|
- **WHEN** готовится отредактированная версия фото
|
||||||
|
- **THEN** правки применяются к пикселям исходного объекта, а не к его уменьшенной копии
|
||||||
|
|
||||||
#### Scenario: Неразрушачность
|
#### Scenario: Неразрушачность
|
||||||
- **WHEN** фото отредактировано
|
- **WHEN** фото отредактировано
|
||||||
- **THEN** исходный объект и его варианты остаются неизменными
|
- **THEN** исходный объект и его варианты остаются неизменными
|
||||||
|
|||||||
@@ -263,9 +263,9 @@ SHALL выдвигать правую панель поверх содержим
|
|||||||
Просмотр SHALL поддерживать зум колесом мыши без прокрутки, с привязкой к указателю и
|
Просмотр SHALL поддерживать зум колесом мыши без прокрутки, с привязкой к указателю и
|
||||||
верхним пределом 200% размеров фото. Клавиши `+` и `-` SHALL менять масштаб на шаг, сохраняя
|
верхним пределом 200% размеров фото. Клавиши `+` и `-` SHALL менять масштаб на шаг, сохраняя
|
||||||
точку в центре просмотра. `Space` SHALL возвращать изображение из любого зума во
|
точку в центре просмотра. `Space` SHALL возвращать изображение из любого зума во
|
||||||
вписанный вид, а из вписанного — в 100%. При зуме SHALL догружаться оригинал изображения.
|
вписанный вид, а из вписанного — в 100% от оригинала с центрированием по центру кадра.
|
||||||
Стрелки соседних фото SHALL появляться у левой/правой кромки и прятаться в зуме. Зум SHALL
|
При зуме SHALL догружаться оригинал изображения. Зум SHALL работать и в полноэкранном
|
||||||
работать и в полноэкранном режиме.
|
режиме.
|
||||||
|
|
||||||
#### Scenario: Зум колесом к указателю
|
#### Scenario: Зум колесом к указателю
|
||||||
- **WHEN** пользователь вращает колесо мыши над фото
|
- **WHEN** пользователь вращает колесо мыши над фото
|
||||||
@@ -278,16 +278,27 @@ SHALL выдвигать правую панель поверх содержим
|
|||||||
|
|
||||||
#### Scenario: Пробел
|
#### Scenario: Пробел
|
||||||
- **WHEN** пользователь нажимает `Space`
|
- **WHEN** пользователь нажимает `Space`
|
||||||
- **THEN** из вписанного вида изображение переходит в 100%, а из любого зума возвращается во вписанный
|
- **THEN** из вписанного вида изображение переходит в 100% от оригинала по центру кадра, а из
|
||||||
|
любого зума возвращается во вписанный
|
||||||
|
|
||||||
#### Scenario: Оригинал в зуме
|
#### Scenario: Оригинал в зуме
|
||||||
- **WHEN** пользователь входит в зум
|
- **WHEN** пользователь входит в зум
|
||||||
- **THEN** догружается оригинал изображения и подменяется по факту загрузки
|
- **THEN** догружается оригинал изображения и подменяется по факту загрузки
|
||||||
|
|
||||||
|
### Requirement: Навигация в зуме
|
||||||
|
Стрелки соседних фото SHALL появляться у левой/правой кромки и прятаться в зуме. Клавиши
|
||||||
|
со стрелками в зуме SHALL перемещать изображение, а переключение соседних фото SHALL
|
||||||
|
оставаться за мышью и кнопками у краёв. В зуме пользователь SHALL перемещать изображение
|
||||||
|
перетаскиванием и прокруткой.
|
||||||
|
|
||||||
#### Scenario: Стрелки соседних фото
|
#### Scenario: Стрелки соседних фото
|
||||||
- **WHEN** курсор находится у левой или правой кромки области просмотра
|
- **WHEN** курсор находится у левой или правой кромки области просмотра
|
||||||
- **THEN** показывается соответствующая стрелка, скрываясь сразу после ухода; в зуме стрелки скрыты
|
- **THEN** показывается соответствующая стрелка, скрываясь сразу после ухода; в зуме стрелки скрыты
|
||||||
|
|
||||||
|
#### Scenario: Стрелки в зуме
|
||||||
|
- **WHEN** фото увеличено, и пользователь жмёт стрелки клавиатуры
|
||||||
|
- **THEN** изображение перемещается, а переключение соседних фото не происходит
|
||||||
|
|
||||||
#### Scenario: Панорамирование
|
#### Scenario: Панорамирование
|
||||||
- **WHEN** фото увеличено
|
- **WHEN** фото увеличено
|
||||||
- **THEN** пользователь может перемещать изображение перетаскиванием и прокруткой
|
- **THEN** пользователь может перемещать изображение перетаскиванием и прокруткой
|
||||||
@@ -779,27 +790,28 @@ SHALL очищаться. При отсутствии сети приложен
|
|||||||
### Requirement: Вкладка «Редактирование»
|
### Requirement: Вкладка «Редактирование»
|
||||||
Правая панель фото SHALL содержать вкладку «Редактирование» с инструментом «Свет»:
|
Правая панель фото SHALL содержать вкладку «Редактирование» с инструментом «Свет»:
|
||||||
ползунки экспозиции, контраста, светов, теней, белых и чёрных, а также точечную кривую
|
ползунки экспозиции, контраста, светов, теней, белых и чёрных, а также точечную кривую
|
||||||
с выбором канала. График кривой SHALL показывать гистограмму каналов фото: выбранный
|
с выбором канала. Правки SHALL применяться к фото сразу и отправляться на сервер после
|
||||||
канал — своим цветом, мастер-канал — всеми тремя. Правки SHALL применяться к фото сразу и
|
десяти секунд без изменений либо при переключении фото. Переключатель «Сброс» SHALL
|
||||||
отправляться на сервер после десяти секунд без изменений либо при переключении фото.
|
удалять параметры правок и отредактированную версию фото. Сетка и просмотр SHALL
|
||||||
Переключатель «Сброс» SHALL удалять параметры правок и отредактированную версию фото.
|
показывать отредактированную версию фото, когда она отрендерена. Обновление фото SHALL
|
||||||
Сетка и просмотр SHALL показывать отредактированную версию фото, когда она отрендерена.
|
сохранять открытую вкладку панели.
|
||||||
|
|
||||||
#### Scenario: Отложенная отправка
|
|
||||||
- **WHEN** пользователь меняет ползунок и не трогает панель десять секунд
|
|
||||||
- **THEN** правки отправляются на сервер, а сервер рендерит фото в фоне
|
|
||||||
|
|
||||||
#### Scenario: Вкладки панели
|
#### Scenario: Вкладки панели
|
||||||
- **WHEN** открыта правая панель фото
|
- **WHEN** открыта правая панель фото
|
||||||
- **THEN** видны вкладки «Сведения» и «Редактирование»
|
- **THEN** видны вкладки «Сведения» и «Редактирование»
|
||||||
|
|
||||||
|
#### Scenario: Отложенная отправка
|
||||||
|
- **WHEN** пользователь меняет ползунок и не трогает панель десять секунд
|
||||||
|
- **THEN** правки отправляются на сервер, а сервер рендерит фото в фоне
|
||||||
|
|
||||||
#### Scenario: Сохранение правок
|
#### Scenario: Сохранение правок
|
||||||
- **WHEN** пользователь отпускает ползунок
|
- **WHEN** пользователь отпускает ползунок
|
||||||
- **THEN** правки сохраняются, а после рендера фото в сетке и просмотре показывается отредактированная версия
|
- **THEN** правки сохраняются, а после рендера фото в сетке и просмотре показывается отредактированная версия
|
||||||
|
|
||||||
#### Scenario: Правки видны сразу
|
#### Scenario: Правки видны сразу
|
||||||
- **WHEN** пользователь меняет ползунок, а сервер ещё не отрендерил фото
|
- **WHEN** пользователь меняет ползунок, а сервер ещё не отрендерил фото
|
||||||
- **THEN** видимая область фото в просмотре показывает правки без ожидания рендера
|
- **THEN** видимая область фото в просмотре показывает правки без ожидания рендера — и во
|
||||||
|
вписанном виде, и в зуме
|
||||||
|
|
||||||
#### Scenario: Фильтры считаются в браузере
|
#### Scenario: Фильтры считаются в браузере
|
||||||
- **WHEN** браузер рисует предпросмотр правок
|
- **WHEN** браузер рисует предпросмотр правок
|
||||||
@@ -812,3 +824,25 @@ SHALL очищаться. При отсутствии сети приложен
|
|||||||
#### Scenario: Зум при правках
|
#### Scenario: Зум при правках
|
||||||
- **WHEN** фото отредактировано, и пользователь увеличивает его
|
- **WHEN** фото отредактировано, и пользователь увеличивает его
|
||||||
- **THEN** браузер рисует видимую область с правками, пока сервер не отрендерил фото, а зум не сбрасывается при обновлении фото
|
- **THEN** браузер рисует видимую область с правками, пока сервер не отрендерил фото, а зум не сбрасывается при обновлении фото
|
||||||
|
|
||||||
|
### Requirement: График тональной кривой
|
||||||
|
График кривой SHALL показывать гистограмму каналов фото: выбранный канал — своим
|
||||||
|
цветом, мастер-канал — всеми тремя. Гистограмма SHALL пересчитываться с учётом
|
||||||
|
текущих правок. Точки кривой SHALL добавляться кликом по полю графика, перетаскиваться
|
||||||
|
и перемещаться стрелками клавиатуры. Блок «Кривая» SHALL сворачиваться и разворачиваться
|
||||||
|
по клику на заголовок, по умолчанию SHALL быть свёрнут, а кнопки выбора канала SHALL
|
||||||
|
оставаться доступными.
|
||||||
|
|
||||||
|
#### Scenario: Живая гистограмма
|
||||||
|
- **WHEN** пользователь двигает ползунок или точку кривой
|
||||||
|
- **THEN** гистограмма на графике пересчитывается с учётом текущих правок
|
||||||
|
|
||||||
|
#### Scenario: Точки кривой
|
||||||
|
- **WHEN** пользователь кликает по полю графика, перетаскивает точку или жмёт стрелки с
|
||||||
|
фокусом на точке
|
||||||
|
- **THEN** точка добавляется, перемещается и меняет кривую
|
||||||
|
|
||||||
|
#### Scenario: Сворачивание кривой
|
||||||
|
- **WHEN** пользователь открывает инструмент «Свет»
|
||||||
|
- **THEN** блок «Кривая» свёрнут, кнопки выбора канала доступны, а по клику на заголовок
|
||||||
|
график разворачивается и сворачивается обратно
|
||||||
|
|||||||
Reference in New Issue
Block a user