feat(photos): добавить пресеты кривой и починить переключение фото
- PCHIP для предпросмотра и серверного рендера - пресеты всех каналов в профиле, импорт и экспорт - мерж настроек auth без потери разделов - сохранение вкладки и правок текущего фото при переключении
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
# Spec Delta
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Тоновая кривая
|
||||
Тоновая кривая SHALL задаваться контрольными точками для каналов RGB, R, G и B. Крайние точки SHALL существовать по умолчанию, SHALL двигаться по обеим осям и SHALL задавать плоские участки вне себя. Кривая SHALL быть плавной и монотонной между точками; первый клик по полю SHALL добавлять точку между крайними. Сброс SHALL возвращать линейную кривую.
|
||||
|
||||
#### Scenario: Крайние узлы существуют с самого начала
|
||||
- **WHEN** пользователь открывает инструмент «Кривая»
|
||||
- **THEN** у каждого канала уже есть крайние точки, и их можно перетаскивать
|
||||
|
||||
#### Scenario: Добавление точки
|
||||
- **WHEN** пользователь кликает по свободному полю кривой
|
||||
- **THEN** между крайними точками добавляется новая точка, а крайние остаются на месте
|
||||
|
||||
#### Scenario: Подвижные крайние узлы
|
||||
- **WHEN** пользователь двигает крайнюю точку по x или y
|
||||
- **THEN** вне крайних точек кривая остаётся плоской, а между точками — плавной
|
||||
|
||||
#### Scenario: Плавная интерполяция
|
||||
- **WHEN** кривая сохранена и отрендерена
|
||||
- **THEN** предпросмотр и итоговое фото используют одну и ту же плавную монотонную кривую
|
||||
|
||||
#### Scenario: Встроенные пресеты
|
||||
- **WHEN** пользователь выбирает «Линейный», «Средний контраст» или «Сильный контраст»
|
||||
- **THEN** кривые всех четырёх каналов заменяются кривыми пресета (контраст — в RGB, R/G/B — линейные), а подпись показывает выбранный пресет
|
||||
|
||||
#### Scenario: Пользовательская правка
|
||||
- **WHEN** пользователь вручную меняет точки кривой
|
||||
- **THEN** подпись показывает «Пользовательский»
|
||||
|
||||
#### Scenario: Сброс
|
||||
- **WHEN** пользователь сбрасывает кривую
|
||||
- **THEN** текущий канал возвращается к линейной кривой с крайними точками
|
||||
|
||||
#### Scenario: Независимые каналы
|
||||
- **WHEN** пользователь выбирает канал R, G или B
|
||||
- **THEN** он меняет только выбранный канал, остальные каналы остаются прежними
|
||||
|
||||
### Requirement: Переключение фото в редакторе
|
||||
При переключении фото правая панель SHALL сохранять выбранную вкладку. Несохранённые правки SHALL сохраняться тому фото, для которого они сделаны, в том числе если пользователь уже переключился на другое фото. Ответы фоновых запросов SHALL NOT подменять текущее фото или его параметры.
|
||||
|
||||
#### Scenario: Вкладка не меняется
|
||||
- **WHEN** пользователь переключает фото
|
||||
- **THEN** выбранная вкладка правой панели остаётся прежней
|
||||
|
||||
#### Scenario: Правки уходят текущему фото
|
||||
- **WHEN** пользователь меняет настройки после переключения
|
||||
- **THEN** изменения сохраняются текущему фото, а не предыдущему
|
||||
|
||||
#### Scenario: Фоновое сохранение не подменяет фото
|
||||
- **WHEN** сохранение предыдущего фото завершается после переключения
|
||||
- **THEN** панель продолжает показывать текущее фото, а его параметры не меняются
|
||||
|
||||
### Requirement: Пользовательские пресеты кривой
|
||||
Пользователь SHALL сохранять текущие кривые всех каналов (RGB, R, G и B) как именованный пресет, применять, переименовывать и удалять его. Пресет SHALL содержать кривую для каждого из четырёх каналов. Пресеты SHALL храниться в профиле пользователя и SHALL быть приватными. Импорт и экспорт SHALL выполняться JSON-файлом; импорт SHALL добавлять пресеты в профиль.
|
||||
|
||||
#### Scenario: Сохранение пресета
|
||||
- **WHEN** пользователь сохраняет текущие кривые под именем
|
||||
- **THEN** пресет появляется в списке и сохраняется в профиле вместе с кривыми RGB, R, G и B
|
||||
|
||||
#### Scenario: Применение пресета
|
||||
- **WHEN** пользователь выбирает пользовательский пресет
|
||||
- **THEN** кривые всех четырёх каналов заменяются сохранёнными, а текущий канал не меняется
|
||||
|
||||
#### Scenario: Переименование и удаление
|
||||
- **WHEN** пользователь переименовывает или удаляет пресет
|
||||
- **THEN** список пресетов и профиль обновляются
|
||||
|
||||
#### Scenario: Приватность пресетов
|
||||
- **WHEN** другой пользователь открывает свои пресеты
|
||||
- **THEN** он не видит пресеты первого пользователя
|
||||
|
||||
#### Scenario: Экспорт пресетов
|
||||
- **WHEN** пользователь экспортирует пресеты
|
||||
- **THEN** он получает JSON-файл с пользовательскими пресетами и кривыми всех четырёх каналов
|
||||
|
||||
#### Scenario: Импорт пресетов
|
||||
- **WHEN** пользователь импортирует корректный JSON-файл
|
||||
- **THEN** пресеты добавляются или обновляются в его профиле
|
||||
|
||||
#### Scenario: Некорректный файл или пресет
|
||||
- **WHEN** имя или кривая хотя бы одного канала недопустимы
|
||||
- **THEN** система отклоняет пресет и не меняет профиль
|
||||
Reference in New Issue
Block a user