# Spec Delta ## MODIFIED Requirements ### Requirement: Неразрушающее редактирование фотографии Система SHALL поддерживать неразрушающее редактирование фотографий. Параметры правок (свет, цвет и эффекты) SHALL храниться в метаданных фото, а отредактированная версия SHALL создаваться как отдельные объекты (роли `edit`, `edit_thumb`, `edit_medium`, `edit_preview`) рядом с исходными вариантами. Рендер SHALL выполняться по исходному объекту фото, а не по его уменьшенным вариантам. Исходный объект SHALL оставаться неизменным, а скачивание SHALL отдавать оригинал. Сброс правок SHALL удалять и параметры, и отредактированную версию. Правки SHALL применяться только к изображениям. #### Scenario: Сохранение правок - **WHEN** пользователь сохраняет правки фото (свет, цвет и/или эффекты) - **THEN** параметры сохраняются в метаданных, отредактированная версия рендерится в фоне, а после рендера фото получает URL отредактированных вариантов #### Scenario: Фоновая подготовка версий - **WHEN** правки фото сохранены - **THEN** система готовит варианты сетки и полноразмерную версию в фоне и сообщает о готовности #### Scenario: Рендер по оригиналу - **WHEN** готовится отредактированная версия фото - **THEN** световые и цветовые правки, а также эффекты применяются к пикселям исходного объекта, а не к его уменьшенной копии #### Scenario: Неразрушачность - **WHEN** фото отредактировано - **THEN** исходный объект и его варианты остаются неизменными #### Scenario: Сброс правок - **WHEN** пользователь сбрасывает правки - **THEN** параметры и отредактированная версия удаляются, а фото снова показывается в исходном виде #### Scenario: Права на правки - **WHEN** правки сохраняет пользователь без прав на это фото - **THEN** система отклоняет запрос #### Scenario: Редактирование видео - **WHEN** пользователь пытается отредактировать видео - **THEN** система отклоняет запрос #### Scenario: Цветовые правки сохраняются и рендерятся - **WHEN** пользователь сохраняет цветовые правки фото: баланс белого (температура/оттенок), сочность (vibrance), насыщенность, цветовой микшер по оттенкам, цветокоррекцию (тени/средние тона/света, яркость зон, наложение, баланс) или поканальную коррекцию - **THEN** параметры цвета сохраняются в метаданных, отредактированная версия рендерится в фоне, а после рендера фото получает URL отредактированных вариантов #### Scenario: Цветовые правки применяются к пикселям исходного объекта - **WHEN** готовится отредактированная версия фото с цветовыми правками - **THEN** цветовые правки применяются к пикселям исходного объекта после световых правок, а не к его уменьшенной копии #### Scenario: Пустые цветовые правки не сохраняются - **WHEN** в цветовых параметрах заданы только наложение/баланс или оттенок колеса без силы и яркости - **THEN** правки считаются пустыми и фото не получает цветовую версию #### Scenario: Пустые правки эффектов не сохраняются - **WHEN** во всех эффектах заданы только значения по умолчанию (сила эффекта, виньетки и зерна равна нулю) - **THEN** правки считаются пустыми и фото не получает новую отредактированную версию ## ADDED Requirements ### Requirement: Текстура Клиент SHALL позволять настраивать текстуру фото в диапазоне -100..100. Положительные значения SHALL усиливать контраст мелких деталей, отрицательные — ослаблять его. Эффект SHALL применяться к исходному кадру после световых и цветовых правок. #### Scenario: Усиление текстуры - **WHEN** пользователь увеличивает значение текстуры - **THEN** мелкие детали становятся контрастнее, а общая тональность кадра не меняется #### Scenario: Ослабление текстуры - **WHEN** пользователь уменьшает значение текстуры ниже нуля - **THEN** мелкие детали сглаживаются #### Scenario: Текстура в пределах допустимого - **WHEN** клиент присылает значение текстуры вне диапазона -100..100 - **THEN** сервер ограничивает его ближайшей границей диапазона ### Requirement: Чёткость Клиент SHALL позволять настраивать чёткость фото в диапазоне -100..100. Положительные значения SHALL усиливать локальный контраст средних частот, отрицательные — смягчать его. Чёткость SHALL NOT создавать заметных ореолов на границах контрастных объектов. Эффект SHALL применяться после световых и цветовых правок. #### Scenario: Усиление чёткости - **WHEN** пользователь увеличивает значение чёткости - **THEN** локальный контраст средних тонов растёт, а границы контрастных объектов остаются без заметных ореолов #### Scenario: Ослабление чёткости - **WHEN** пользователь уменьшает значение чёткости ниже нуля - **THEN** изображение становится мягче ### Requirement: Убрать дымку Клиент SHALL позволять ослаблять или усиливать дымку в диапазоне -100..100. При положительных значениях сервер SHALL оценивать дымку по кадру и возвращать контраст и насыщенность удалённых участков; отрицательные значения SHALL добавлять дымку. #### Scenario: Удаление дымки - **WHEN** пользователь увеличивает значение «Убрать дымку» на кадре с дымкой - **THEN** дальние планы становятся контрастнее и насыщеннее #### Scenario: Добавление дымки - **WHEN** пользователь уменьшает значение «Убрать дымку» ниже нуля - **THEN** кадр становится менее контрастным, как при дымке ### Requirement: Виньетка Клиент SHALL позволять настраивать виньетку: силу -100..100, среднюю точку и растушёвку 0..100 (по умолчанию 50), округлость -100..100, света 0..100, а также режим «Свет», «Цвет» или «Закарасить». Режим «Свет» SHALL затемнять или осветлять края, «Цвет» — тонировать их выбранным цветом с сохранением светлоты, «Закарасить» — заливать их выбранным цветом. #### Scenario: Затемнение краёв - **WHEN** пользователь задаёт положительную силу виньетки в режиме «Свет» - **THEN** края кадра затемняются, а центр остаётся без изменений #### Scenario: Осветление краёв - **WHEN** пользователь задаёт отрицательную силу виньетки в режиме «Свет» - **THEN** края кадра осветляются #### Scenario: Цветная виньетка - **WHEN** пользователь выбирает режим «Цвет» или «Закарасить» и задаёт цвет виньетки - **THEN** края кадра тонируются или заливаются этим цветом с силой, заданной ползунком виньетки #### Scenario: Геометрия виньетки - **WHEN** пользователь меняет среднюю точку, растушёвку или округлость - **THEN** меняются размер, мягкость и форма зоны виньетки #### Scenario: Защита светов - **WHEN** пользователь увеличивает значение «Света» в режиме «Свет» - **THEN** яркие участки в зоне виньетки сохраняют яркость #### Scenario: Нулевая сила виньетки - **WHEN** сила виньетки равна нулю - **THEN** виньетка не влияет на изображение независимо от остальных параметров ### Requirement: Зерно Клиент SHALL позволять добавлять зерно с силой, размером и шероховатостью в диапазоне 0..100 (по умолчанию размер 25, шероховатость 50). Зерно SHALL быть детерминированным: повторный рендер одних и тех же параметров SHALL давать одинаковый шум. #### Scenario: Добавление зерна - **WHEN** пользователь увеличивает силу зерна - **THEN** на изображении появляется шум, заметный в средних тонах #### Scenario: Размер и шероховатость - **WHEN** пользователь меняет размер или шероховатость зерна - **THEN** меняются крупность и контрастность шума #### Scenario: Детерминированность зерна - **WHEN** сервер повторно рендерит фото с теми же параметрами зерна - **THEN** рисунок шума совпадает с предыдущим рендером #### Scenario: Нулевая сила зерна - **WHEN** сила зерна равна нулю - **THEN** зерно не влияет на изображение ### Requirement: Живой предпросмотр эффектов Клиент SHALL показывать эффекты в просмотрщике до завершения серверного рендера. После готовности серверной версии клиент SHALL показывать её. Предпросмотр пространственных эффектов (текстура, чёткость, дымка) MAY отличаться от серверного рендера деталями, но SHALL передавать характер эффекта. #### Scenario: Эффекты видны сразу - **WHEN** пользователь двигает ползунок эффекта - **THEN** просмотрщик обновляет изображение без ожидания серверного рендера #### Scenario: Серверная версия заменяет предпросмотр - **WHEN** серверный рендер эффектов завершён - **THEN** просмотрщик показывает серверную версию #### Scenario: Предпросмотр без WebGL - **WHEN** аппаратное ускорение недоступно - **THEN** клиент показывает эффекты доступным способом или показывает их после серверного рендера, не блокируя интерфейс ### Requirement: Свёрнутые секции редактора Редактор SHALL показывать все сворачиваемые секции инструментов свёрнутыми по умолчанию. Клиент SHALL сохранять состояние каждой секции (свёрнута или развёрнута) в браузере пользователя и восстанавливать его при повторном открытии редактора и перезагрузке страницы. Состояние SHALL NOT зависеть от выбранного фото. #### Scenario: Первое открытие редактора - **WHEN** пользователь впервые открывает редактор фото - **THEN** все секции инструментов («Свет», «Цвет», «Эффекты» и их вложенные блоки) свёрнуты #### Scenario: Состояние запоминается - **WHEN** пользователь разворачивает секцию «Эффекты» и перезагружает страницу - **THEN** секция «Эффекты» остаётся развёрнутой #### Scenario: Состояние переживает смену фото - **WHEN** пользователь переключает фото в редакторе - **THEN** свёрнутость секций не меняется ### Requirement: Редактирование только из просмотрщика Клиент SHALL показывать вкладку «Редактирование» только когда фото открыто в просмотрщике. В режиме сетки правая панель SHALL показывать только «Сведения» и SHALL NOT отображать инструменты редактирования. #### Scenario: Фото выбрано в сетке - **WHEN** пользователь выбирает фото в сетке, не открывая просмотрщик - **THEN** в правой панели отображается только вкладка «Сведения» #### Scenario: Фото открыто в просмотрщике - **WHEN** пользователь открывает фото в просмотрщике - **THEN** в правой панели доступны «Сведения» и «Редактирование» #### Scenario: Возврат из просмотрщика в сетку - **WHEN** пользователь возвращается из просмотрщика в сетку - **THEN** вкладка «Редактирование» скрыта, панель показывает «Сведения»