# 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** система отклоняет пресет и не меняет профиль