import type { Dict } from './dict'; export const ru: Dict = { header: { workspace: 'Рабочая область', catalog: 'Каталог', sectionsAria: 'Разделы', footerNote: 'Все операции выполняются локально в вашем браузере — файлы никуда не отправляются.' }, categories: { convert: 'Конвертация', alpha: 'Прозрачность', color: 'Цвет', geometry: 'Геометрия', filters: 'Фильтры', text: 'Текст', analyze: 'Анализ', generate: 'Генерация' }, home: { defaultTitle: 'easy-png-tools — PNG-утилиты прямо в браузере', heroTitle: 'Что делаем с изображением?', heroLead: 'Найдите инструмент — все операции выполняются локально в браузере.', restoreLast: '↩ Вернуть последний: {title}', changeTool: '← Сменить инструмент' }, catalog: { pageTitle: 'Все инструменты — easy-png-tools', metaDescription: 'Полный каталог PNG-утилит: конвертация, прозрачность, цвет, геометрия, анализ и генерация изображений.', heading: 'Каталог инструментов', lead: '{count} утилит для работы с PNG. Все операции выполняются локально в браузере.' }, toolPage: { fallbackTitle: 'Инструмент', legendSource: 'Исходник', legendSummary: 'Сводка', legendResult: 'Результат', legendParams: 'Параметры', stepHeading: 'Шаг {n}', removeStepAria: 'Убрать шаг', stepError: 'Шаг {n} ({title}): {msg}' }, chain: { stepLabel: 'Шаг {n}: {title}', inputLegend: 'Вход', resultLegend: 'Результат', paramsLegend: 'Параметры', busyTitle: 'Обработка…', busyHint: 'Выполняется шаг цепочки', removeStepAria: 'Убрать шаг' }, sourceCard: { replaceImage: 'Заменить изображение' }, resultCard: { emptyTitle: 'Результат появится здесь', emptyHint: 'Сначала загрузите исходное изображение слева', processingTitle: 'Обработка…', processingHint: 'Изображение обрабатывается, это займёт немного времени', recalc: 'Пересчёт…', nextTool: '⛓ Следующий инструмент', breakChain: '✂ Оборвать цепочку' }, paramsCard: { noParams: 'У этого инструмента нет параметров — результат уже готов.' }, textInput: { heading: 'Текст', placeholder: 'Вставьте данные сюда', aria: 'Текстовые данные', decode: 'Декодировать' }, textResult: { outputAria: 'Текстовый результат', copied: 'Скопировано', copy: 'Копировать', downloadTxt: 'Скачать .txt' }, download: { busy: 'Готовим файл…', file: 'Скачать .{ext}' }, infoPanel: { dimensions: 'Размеры', alpha: 'Альфа-канал', alphaYes: 'есть — есть полупрозрачные пиксели', alphaNo: 'нет', colorCount: 'Уникальных цветов (RGBA)' }, dropZone: { pickDefault: 'Перетащите изображение сюда или нажмите, чтобы выбрать файл', overlayDefault: 'Отпустите файл, чтобы заменить изображение' }, search: { placeholder: 'Найдите инструмент…', aria: 'Поиск инструмента', nothingFound: 'Ничего не найдено — попробуйте другое слово.' }, ui: { showMask: 'Показать маску', decrease: 'Уменьшить', increase: 'Увеличить', reset: 'Сбросить', pipette: 'Пипетка', themeLight: 'Светлая тема', themeDark: 'Тёмная тема', overlayTitle: 'Знак', overlayDrop: 'Перетащите PNG-знак или нажмите', overlayRemove: 'Убрать знак' }, errors: { noImageRun: 'Этот инструмент не обрабатывает изображения', workerFailed: 'Ошибка исполнения в воркере', workerUnavailable: 'Воркер недоступен', notFound: 'Инструмент не найден', noWatermark: 'Сначала выберите картинку-знак', badTransform: 'Вырожденная матрица трансформации', skewAngle: 'Углы наклона не могут быть 90° или -90°', badHex: 'Некорректный HEX-цвет: "{value}"', radiusInt: 'Радиус должен быть целым неотрицательным числом', kernelSize: 'Ядро не совпадает с изображением по размеру', sizeInt: 'Ширина и высота должны быть целыми числами ≥ 1', cropBounds: 'Область обрезки не пересекает изображение', noCanvasCtx: 'Canvas 2D context недоступен в этом окружении', badBase64: 'Ожидается base64-строка или data-uri изображения', qualityRange: 'quality должно быть в диапазоне 0..1', svgSize: 'Не удалось определить размер SVG', svgLoad: 'Не удалось загрузить SVG — проверьте разметку', encodeUnsupported: 'Браузер не поддерживает кодирование в {mime}', unsupportedFile: 'Неподдерживаемый формат файла ({type}). Поддерживаются PNG, JPEG, WebP, GIF и BMP.', widthInt: 'Ширина изображения должна быть целым числом ≥ 1', noHexPixels: 'Не найдено hex-значений пикселей', badPixelToken: 'Каждый пиксель — 8 hex-символов RRGGBBAA, значения через пробел', pixelCountMismatch: 'Число пикселей ({count}) не делится на ширину {width} без остатка', toolNotFound: 'Инструмент "{id}" не найден', badJson: 'Файл не является корректным JSON', badPipelineShape: 'Структура файла не похожа на цепочку шагов', pipelineVersion: 'Неподдерживаемая версия цепочки: {version}', noSteps: 'В файле нет списка шагов', paramNumber: 'Параметр "{id}" должен быть числом', paramString: 'Параметр "{id}" должен быть строкой', paramBool: 'Параметр "{id}" должен быть значением флажка', resizeSize: 'Ширина и/или высота должны быть положительными', cropSize: 'Ширина и высота области обрезки должны быть положительными', sizePositive: 'Размеры должны быть положительными и конечными' }, tools: { 'jpg-to-png': { title: 'Конвертировать JPG в PNG', description: 'Открывает JPEG и сохраняет его как PNG без потерь. Прозрачность, если была, сохраняется.' }, 'webp-to-png': { title: 'Конвертировать WebP в PNG', description: 'Перекодирует WebP-изображение в универсальный PNG.' }, 'gif-to-png': { title: 'Конвертировать GIF в PNG', description: 'Достаёт первый кадр GIF-анимации и сохраняет его как PNG.' }, 'bmp-to-png': { title: 'Конвертировать BMP в PNG', description: 'Перекодирует BMP в компактный PNG без потерь.' }, 'ico-to-png': { title: 'Конвертировать ICO в PNG', description: 'Превращает иконку .ico в обычный PNG нужного размера.' }, 'png-to-bmp': { title: 'Конвертировать PNG в BMP', description: 'Сохраняет изображение в 24-битный BMP без альфа-канала: прозрачность заменяется чёрным фоном.' }, 'png-to-base64': { title: 'PNG в Base64', description: 'Кодирует изображение в base64-строку для вставки в код или стили.' }, 'base64-to-png': { title: 'Base64 в PNG', description: 'Декодирует base64-строку или data-uri обратно в картинку. Вставьте строку слева.' }, 'png-to-data-uri': { title: 'PNG в Data URI', description: 'Строит полный data-uri (data:image/png;base64,…) для встраивания в HTML/CSS.' }, 'data-uri-to-png': { title: 'Data URI в PNG', description: 'Декодирует data:image/…;base64,… обратно в файл картинки.' }, 'png-to-hex': { title: 'PNG в HEX-пиксели', description: 'Показывает все пиксели как hex-значения rrggbbaa — по строкам, через пробел.' }, 'hex-to-png': { title: 'HEX-пиксели в PNG', description: 'Собирает картинку из hex-значений rrggbbaa (через пробел). Укажите ширину — высота рассчитается сама.', params: { width: 'Ширина изображения' } }, 'resize-png': { title: 'Изменить размер PNG', description: 'Масштабирование изображения с билинейной интерполяцией. При сохранении пропорций одна сторона задаёт масштаб, а если указаны обе — изображение вписывается в эти размеры.', params: { width: 'Ширина (0 — авто)', height: 'Высота (0 — авто)', keepAspect: 'Сохранять пропорции' } }, 'crop-png': { title: 'Обрезать PNG', description: 'Вырезает прямоугольную область. Координаты и размеры выходят за границы изображения — область усекается до пересечения с картинкой.', params: { x: 'X (слева)', y: 'Y (сверху)', width: 'Ширина области', height: 'Высота области' } }, 'rotate-png': { title: 'Повернуть PNG', description: 'Поворот на 90°, 180° или 270° по часовой стрелке без потери качества.', params: { angle: 'Угол поворота' }, options: { angle: { '90': '90° по часовой', '180': '180°', '270': '270° по часовой' } } }, 'flip-png': { title: 'Отразить PNG', description: 'Зеркальное отражение по горизонтали или вертикали без потери качества.', params: { axis: 'Ось отражения' }, options: { axis: { horizontal: 'По горизонтали (слева направо)', vertical: 'По вертикали (сверху вниз)' } } }, 'add-padding-png': { title: 'Добавить поля PNG', description: 'Расширяет холст во все стороны на выбранное число пикселей.', params: { padding: 'Поля, px', transparent: 'Прозрачные поля', color: 'Цвет полей' } }, 'add-border-png': { title: 'Добавить рамку PNG', description: 'Рисует цветную рамку вокруг изображения выбранной толщины.', params: { thickness: 'Толщина рамки, px', color: 'Цвет рамки' } }, 'fit-on-background-png': { title: 'Вписать PNG на фон', description: 'Помещает изображение по центру полотна заданного размера с прозрачным или цветным фоном.', params: { width: 'Ширина полотна', height: 'Высота полотна', transparent: 'Прозрачный фон', color: 'Цвет фона' } }, 'tile-png': { title: 'Замостить PNG', description: 'Повторяет изображение сеткой из выбранного числа столбцов и строк.', params: { columns: 'Столбцов', rows: 'Строк' } }, 'center-by-alpha-png': { title: 'Центрировать PNG по содержимому', description: 'Находит непрозрачную часть изображения и размещает её по центру прежнего холста.' }, 'blur-png': { title: 'Размытие PNG', description: 'Гауссово размытие: три прохода разделяемого бокса — быстро при любом радиусе. Прозрачные края не темнеют.', params: { radius: 'Радиус, px' } }, 'sharpen-png': { title: 'Резкость PNG', description: 'Подчёркивает края ядром резкости; сила задаёт смесь с оригиналом. 0% — без изменений.', params: { strength: 'Сила, %' } }, 'grayscale-png': { title: 'Чёрно-белый PNG', description: 'Переводит изображение в оттенки серого по яркостной формуле BT.601. Альфа сохраняется.' }, 'invert-colors-png': { title: 'Инвертировать цвета PNG', description: 'Обращает каждый цветовой канал (255 − значение). Альфа не меняется.' }, 'adjust-brightness-contrast-png': { title: 'Яркость и контраст PNG', description: 'Изменяет яркость и контраст в диапазоне от −100 до +100. Значение 0 — без изменений.', params: { brightness: 'Яркость', contrast: 'Контраст' } }, 'change-png-opacity': { title: 'Изменить прозрачность PNG', description: 'Умножает альфа-канал на процент: 0% — полностью прозрачный, 100% — без изменений.', params: { percent: 'Прозрачность, %' } }, 'sepia-png': { title: 'Эффект сепии', description: 'Тонирует изображение в тёплые коричневые тона классической сепии.' }, 'change-png-hue': { title: 'Сменить оттенок PNG', description: 'Сдвиг цветового тона по кругу. Насыщенность и яркость сохраняются.', params: { degrees: 'Сдвиг тона, °' } }, 'extract-channel-png': { title: 'Извлечь канал PNG', description: 'Оставляет выбранный канал — красный, зелёный или синий — в оттенках серого.', params: { channel: 'Канал' }, options: { channel: { red: 'Красный', green: 'Зелёный', blue: 'Синий' } } }, 'swap-channels-png': { title: 'Переставить каналы PNG', description: 'Меняет местами два цветовых канала — быстрый способ получить необычный окрас.', params: { pair: 'Пара каналов' }, options: { pair: { 'r-g': 'Красный ↔ Зелёный', 'r-b': 'Красный ↔ Синий', 'g-b': 'Зелёный ↔ Синий' } } }, 'black-and-white-png': { title: 'Чёрно-белый PNG по порогу', description: 'Жёсткая бинаризация по яркости: каждый пиксель становится чёрным или белым.', params: { threshold: 'Порог яркости, %' } }, 'posterize-png': { title: 'Постеризация PNG', description: 'Уменьшает число уровней каждого канала — плакатный эффект.', params: { levels: 'Уровней на канал' } }, 'two-colors-png': { title: 'Два цвета PNG', description: 'Перекрашивает изображение в два выбранных цвета по порогу яркости.', params: { lightColor: 'Цвет светлых участков', darkColor: 'Цвет тёмных участков', threshold: 'Порог яркости, %' } }, 'convert-png-to-jpg': { title: 'Конвертировать PNG в JPG', description: 'Прозрачность накладывается на выбранный цвет подложки (по умолчанию белый), результат сохраняется в JPEG.', params: { background: 'Цвет подложки', quality: 'Качество JPEG' } }, 'convert-png-to-webp': { title: 'Конвертировать PNG в WebP', description: 'Перекодирует изображение в WebP с настраиваемым качеством. Прозрачность сохраняется.', params: { quality: 'Качество WebP' } }, 'remove-alpha-channel-png': { title: 'Убрать альфа-канал PNG', description: 'Накладывает изображение на белый фон и сохраняет без прозрачности.' }, 'set-alpha-channel-png': { title: 'Задать альфа-канал PNG', description: 'Присваивает всем пикселям одинаковую прозрачность, цвета не меняются.', params: { percent: 'Прозрачность, %' } }, 'extract-alpha-mask-png': { title: 'Извлечь маску альфы PNG', description: 'Превращает прозрачность в чёрно-белую непрозрачную маску.' }, 'round-corners-png': { title: 'Скруглить углы PNG', description: 'Обрезает углы по радиусу, заданному в процентах от половины меньшей стороны.', params: { radius: 'Радиус скругления, %' } }, 'invert-alpha-png': { title: 'Инвертировать альфа-канал PNG', description: 'Непрозрачные области становятся прозрачными и наоборот.' }, 'remove-background-png': { title: 'Удалить фон PNG (умно)', description: 'Убирает однотонный фон: по цвету с допуском, только внешние области от краёв или весь совпадающий цвет. Умеет сглаживать границу.', params: { color: 'Цвет фона', tolerance: 'Допуск похожести, %', outerOnly: 'Только внешние области', smooth: 'Сглаживание границы, проходы' } }, 'add-stroke-png': { title: 'Обвести PNG', description: 'Добавляет цветную обводку-кольцо вокруг непрозрачного содержимого заданной толщины.', params: { color: 'Цвет обводки', thickness: 'Толщина, px' } }, 'find-contour-png': { title: 'Найти контур PNG', description: 'Оставляет только линию по границе непрозрачных областей выбранного цвета и толщины.', params: { color: 'Цвет линии', thickness: 'Толщина линии, px' } }, 'make-thicker-png': { title: 'Утолщить PNG', description: 'Расширяет непрозрачные области на заданное число пикселей.', params: { radius: 'На сколько px' } }, 'make-thinner-png': { title: 'Утончить PNG', description: 'Сужает непрозрачные области — утоньшает штрихи надписей и деталей.', params: { radius: 'На сколько px' } }, 'harden-alpha-png': { title: 'Жёсткие края PNG', description: 'Бинаризует альфа-канал по порогу: полупрозрачные пиксели становятся либо полностью прозрачными, либо непрозрачными.', params: { threshold: 'Порог альфы, %' } }, 'despeckle-alpha-png': { title: 'Убрать мусор PNG', description: 'Открытие: убирает одиночные полупрозрачные пиксели и мелкие крапинки.', params: { radius: 'Радиус очистки, px' } }, 'close-holes-png': { title: 'Закрыть дыры PNG', description: 'Закрытие: заполняет одиночные прозрачные точки внутри объекта.', params: { radius: 'Радиус закрытия, px' } }, 'remove-color-from-png': { title: 'Удалить цвет из PNG (прозрачность)', description: 'Делает прозрачными все пиксели, близкие к выбранному цвету. Порог задаёт допустимое отклонение в процентах от максимального цветового расстояния.', params: { targetColor: 'Цвет для удаления', tolerance: 'Порог похожести, %' } }, 'png-info': { title: 'Информация о PNG', description: 'Показывает размеры, наличие альфа-канала и количество уникальных цветов загруженного изображения.' }, 'create-empty-png': { title: 'Создать пустой PNG', description: 'Генерирует холст выбранного размера — прозрачный или залитый цветом.', params: { width: 'Ширина', height: 'Высота', transparent: 'Прозрачный', color: 'Цвет' } }, 'single-color-png': { title: 'Создать одноцветный PNG', description: 'Генерирует прямоугольник заданного размера и цвета.', params: { width: 'Ширина', height: 'Высота', color: 'Цвет' } }, 'random-noise-png': { title: 'Создать случайный шум PNG', description: 'Генерирует картинку со случайными пикселями. Зерно фиксирует результат: одно зерно — одна картинка.', params: { width: 'Ширина', height: 'Высота', seed: 'Зерно' } }, 'linear-gradient-png': { title: 'Создать градиент PNG', description: 'Генерирует плавный переход между двумя цветами по горизонтали или вертикали.', params: { width: 'Ширина', height: 'Высота', fromColor: 'Цвет начала', toColor: 'Цвет конца', direction: 'Направление' }, options: { direction: { horizontal: 'По горизонтали', vertical: 'По вертикали' } } }, 'color-wheel-png': { title: 'Цветовой круг PNG', description: 'Круг HSL: оттенок по окружности, насыщенность от центра к краю, выбранная светлота.', params: { width: 'Размер', lightness: 'Светлота, %' } }, 'complementary-png': { title: 'Комплементарная палитра PNG', description: 'Два противоположных цвета круга — базовый и его дополнение.', params: { baseColor: 'Базовый цвет', width: 'Ширина', layout: 'Раскладка' }, options: { layout: { grid: 'Сетка', strip: 'Полоса' } } }, 'triadic-png': { title: 'Триадная палитра PNG', description: 'Три цвета через 120° друг от друга на цветовом круге.', params: { baseColor: 'Базовый цвет', width: 'Ширина', layout: 'Раскладка' }, options: { layout: { grid: 'Сетка', strip: 'Полоса' } } }, 'tetradic-png': { title: 'Тетрадная палитра PNG', description: 'Четыре цвета — две комплементарные пары, шаг 90° по кругу.', params: { baseColor: 'Базовый цвет', width: 'Ширина', layout: 'Раскладка' }, options: { layout: { grid: 'Сетка', strip: 'Полоса' } } }, 'analogous-png': { title: 'Аналоговая палитра PNG', description: 'Соседние оттенки вокруг базового — спокойная родственная гамма.', params: { baseColor: 'Базовый цвет', width: 'Ширина', layout: 'Раскладка', spread: 'Разброс оттенка, °', count: 'Сколько цветов' }, options: { layout: { grid: 'Сетка', strip: 'Полоса' } } }, 'monochromatic-png': { title: 'Монохромная палитра PNG', description: 'Тоны одного оттенка: меняется светлота в выбранном диапазоне, тон и насыщенность фиксированы.', params: { baseColor: 'Базовый цвет', width: 'Ширина', layout: 'Раскладка', count: 'Сколько цветов', range: 'Диапазон светлоты, %' }, options: { layout: { grid: 'Сетка', strip: 'Полоса' } } }, 'shades-png': { title: 'Градация оттенка PNG', description: 'Ступени базового цвета от исходного к более тёмному.', params: { baseColor: 'Базовый цвет', width: 'Ширина', layout: 'Раскладка', count: 'Сколько цветов', depth: 'Глубина затемнения, %' }, options: { layout: { grid: 'Сетка', strip: 'Полоса' } } }, 'mix-colors-png': { title: 'Смешать цвета PNG', description: 'Усредняет несколько hex-цветов в один свотч. Введите значения через запятую; неверные токены пропускаются.', params: { colors: 'Цвета (hex через запятую)', width: 'Ширина' } }, 'blend-two-png': { title: 'Перелив двух цветов PNG', description: 'Непрерывный горизонтальный градиент между двумя цветами.', params: { colorA: 'Цвет A', colorB: 'Цвет B', width: 'Ширина' } }, 'step-colors-png': { title: 'Ступени между цветами PNG', description: 'Дискретный набор равномерно распределённых ступеней между двумя цветами.', params: { colorA: 'Цвет A', colorB: 'Цвет B', steps: 'Сколько ступеней', width: 'Ширина', layout: 'Раскладка' }, options: { layout: { grid: 'Сетка', strip: 'Полоса' } } }, 'sort-colors-png': { title: 'Отсортировать цвета PNG', description: 'Рисует ваш hex-список свотчами, отсортированными по тону, яркости или насыщенности. Неверные токены пропускаются.', params: { colors: 'Цвета (hex через запятую)', order: 'Сортировка', width: 'Ширина', layout: 'Раскладка' }, options: { order: { hue: 'Оттенок', luma: 'Яркость', sat: 'Насыщенность' }, layout: { grid: 'Сетка', strip: 'Полоса' } } }, 'png-is-grayscale': { title: 'Проверить: PNG монохромный?', description: 'Сообщает, состоит ли изображение только из оттенков серого.', results: { grayscaleYes: 'Да — все пиксели являются оттенками серого.', grayscaleNo: 'Нет — найдены цветные пиксели.' } }, 'png-to-hsl': { title: 'Разложить PNG в HSL', description: 'Раскладывает изображение на компоненты Тон, Насыщенность и Светлота.', params: { component: 'Компонент', display: 'Режим показа' }, options: { component: { h: 'Тон (H)', s: 'Насыщенность (S)', l: 'Светлота (L)' }, display: { gray: 'Градациями серого', color: 'Пространство как RGB' } } }, 'png-to-hsv': { title: 'Разложить PNG в HSV', description: 'Раскладывает изображение на Тон, Насыщенность и Яркость (Value).', params: { component: 'Компонент', display: 'Режим показа' }, options: { component: { h: 'Тон (H)', s: 'Насыщенность (S)', v: 'Яркость (V)' }, display: { gray: 'Градациями серого', color: 'Пространство как RGB' } } }, 'png-to-hsi': { title: 'Разложить PNG в HSI', description: 'Раскладывает изображение на Тон, Насыщенность и Интенсивность.', params: { component: 'Компонент', display: 'Режим показа' }, options: { component: { h: 'Тон (H)', s: 'Насыщенность (S)', i: 'Интенсивность (I)' }, display: { gray: 'Градациями серого', color: 'Пространство как RGB' } } }, 'png-to-cmyk': { title: 'PNG в CMYK-цвета', description: 'Раскладывает изображение на печатные компоненты: Голубой, Пурпурный, Жёлтый и Чёрный (Key).', params: { component: 'Компонент', display: 'Режим показа' }, options: { component: { c: 'Голубой (C)', m: 'Пурпурный (M)', y: 'Жёлтый (Y)', k: 'Чёрный (K)' }, display: { gray: 'Градациями серого', color: 'Пространство как RGB' } } }, 'png-to-ycbcr': { title: 'PNG в YCbCr-цвета', description: 'Раскладывает изображение на Яркость (Y) и цветоразностные компоненты Cb / Cr.', params: { component: 'Компонент', display: 'Режим показа' }, options: { component: { y: 'Яркость (Y)', cb: 'Синий-разностный (Cb)', cr: 'Красный-разностный (Cr)' }, display: { gray: 'Градациями серого', color: 'Пространство как RGB' } } }, 'png-to-lab': { title: 'PNG в LAB-цвета', description: 'Раскладывает изображение на perceptual-компоненты: Светлость, зелёный–пурпурный и синий–жёлтый.', params: { component: 'Компонент', display: 'Режим показа' }, options: { component: { l: 'Светлость (L)', a: 'Зелёный–пурпурный (a)', b: 'Синий–жёлтый (b)' }, display: { gray: 'Градациями серого', color: 'Пространство как RGB' } } }, 'circle-mask-png': { title: 'Круглая маска PNG', description: 'Вырезает из изображения круг. Диаметр задаётся в процентах от меньшей стороны.', params: { size: 'Диаметр, % меньшей стороны', offsetX: 'Смещение X, %', offsetY: 'Смещение Y, %' } }, 'square-mask-png': { title: 'Прямоугольная маска PNG', description: 'Вырезает прямоугольник со сторонами в процентах от меньшей стороны изображения.', params: { widthPct: 'Ширина, % меньшей стороны', heightPct: 'Высота, % меньшей стороны', offsetX: 'Смещение X, %', offsetY: 'Смещение Y, %' } }, 'star-mask-png': { title: 'Маска-звезда PNG', description: 'Вырезает звезду с настраиваемым числом лучей, глубиной впадин и поворотом.', params: { points: 'Лучи', innerRadius: 'Радиус впадин, %', size: 'Внешний радиус, % меньшей стороны', rotation: 'Поворот, °', offsetX: 'Смещение X, %', offsetY: 'Смещение Y, %' } }, 'wavy-mask-png': { title: 'Волнистая маска PNG', description: 'Вырезает круг с волнистым краем: радиус модулируется синусом с заданной амплитудой и частотой.', params: { size: 'Базовый радиус, % меньшей стороны', amplitude: 'Амплитуда волн, %', waves: 'Количество волн', phase: 'Фаза, °', offsetX: 'Смещение X, %', offsetY: 'Смещение Y, %' } }, 'trim-empty-space-png': { title: 'Обрезать пустые поля PNG', description: 'Обрезает прозрачные рамки вокруг содержимого. Пиксели с альфой выше порога считаются содержимым.', params: { threshold: 'Порог альфы' } }, 'change-canvas-size-png': { title: 'Изменить размер холста PNG', description: 'Задаёт точный размер холста: лишнее обрезается, недостающее дополняется прозрачностью. Якорь выбирает, какая часть изображения остаётся.', params: { width: 'Ширина', height: 'Высота', anchor: 'Якорь' }, options: { anchor: { 'top-left': 'Сверху слева', 'top-center': 'Сверху по центру', 'top-right': 'Сверху справа', 'middle-left': 'По центру слева', center: 'По центру', 'middle-right': 'По центру справа', 'bottom-left': 'Снизу слева', 'bottom-center': 'Снизу по центру', 'bottom-right': 'Снизу справа' } } }, 'change-aspect-ratio-png': { title: 'Изменить соотношение сторон PNG', description: 'Вписывает изображение в целевое соотношение сторон: обрезать центр до заполнения или дополнить прозрачностью.', params: { ratio: 'Целевое отношение', mode: 'Режим' }, options: { ratio: { '1:1': '1:1', '4:3': '4:3', '3:4': '3:4', '3:2': '3:2', '2:3': '2:3', '16:9': '16:9', '9:16': '9:16' }, mode: { crop: 'Обрезать до заполнения', pad: 'Дополнить до вписывания' } } }, 'swap-orientation-png': { title: 'Поменять ориентацию PNG', description: 'Поворачивает изображение на 90°, если ориентация отличается от целевой — ландшафт становится портретом и наоборот. Квадрат не трогается.', params: { target: 'Целевая ориентация' }, options: { target: { portrait: 'Портрет', landscape: 'Ландшафт' } } }, 'symmetric-copy-png': { title: 'Симметричная копия PNG', description: 'Удваивает холст, зеркалируя сохранённую половину на пустую — мгновенный симметричный узор.', params: { axis: 'Линия зеркала', keepSide: 'Какая сторона остаётся' }, options: { axis: { vertical: 'Вертикальная (ширина ×2)', horizontal: 'Горизонтальная (высота ×2)' }, keepSide: { left: 'Левая', right: 'Правая', top: 'Верхняя', bottom: 'Нижняя' } } }, 'show-transparent-png': { title: 'Показать прозрачные области PNG', description: 'Подсвечивает выбранным цветом каждый прозрачный или полупрозрачный пиксель — дыры становятся заметными.', params: { mode: 'Режим маски', color: 'Цвет подсветки', opacity: 'Непрозрачность подсветки, %' }, options: { mode: { binary: 'Чёрно-белая маска', highlight: 'Цветная подсветка' } } }, 'show-grayscale-pixels-png': { title: 'Показать серые пиксели PNG', description: 'Находит пиксели с почти равными каналами и рисует их маску. Допуск — в единицах канала.', params: { tolerance: 'Допуск по каналам', mode: 'Режим маски', color: 'Цвет подсветки', opacity: 'Непрозрачность подсветки, %' }, options: { mode: { binary: 'Чёрно-белая маска', highlight: 'Цветная подсветка' } } }, 'show-color-pixels-png': { title: 'Показать цветные пиксели PNG', description: 'Находит цветные (не серые) пиксели за пределами допуска и рисует их маску.', params: { tolerance: 'Допуск по каналам', mode: 'Режим маски', color: 'Цвет подсветки', opacity: 'Непрозрачность подсветки, %' }, options: { mode: { binary: 'Чёрно-белая маска', highlight: 'Цветная подсветка' } } }, 'light-pixel-mask-png': { title: 'Маска светлых пикселей PNG', description: 'Выбирает пиксели ярче порога яркости.', params: { threshold: 'Порог яркости, %', mode: 'Режим маски', color: 'Цвет подсветки', opacity: 'Непрозрачность подсветки, %' }, options: { mode: { binary: 'Чёрно-белая маска', highlight: 'Цветная подсветка' } } }, 'dark-pixel-mask-png': { title: 'Маска тёмных пикселей PNG', description: 'Выбирает пиксели темнее порога яркости.', params: { threshold: 'Порог яркости, %', mode: 'Режим маски', color: 'Цвет подсветки', opacity: 'Непрозрачность подсветки, %' }, options: { mode: { binary: 'Чёрно-белая маска', highlight: 'Цветная подсветка' } } }, 'unique-color-mask-png': { title: 'Маска уникальных цветов PNG', description: 'Выбирает цвета, которые встречаются не чаще заданного числа раз, — редкие и одиночные пиксели.', params: { rarity: 'Максимум повторов', mode: 'Режим маски', color: 'Цвет подсветки', opacity: 'Непрозрачность подсветки, %' }, options: { mode: { binary: 'Чёрно-белая маска', highlight: 'Цветная подсветка' } } }, 'extract-color-from-png': { title: 'Извлечь цвет из PNG', description: 'Оставляет только пиксели, близкие к выбранному цвету, остальное делает прозрачным — обратное «Удалить цвет».', params: { color: 'Какой цвет оставить', tolerance: 'Допуск похожести, %' } }, 'watermark-tile-png': { title: 'Плитка-водяной знак PNG', description: 'Покрывает изображение повторяющейся диагональной полупрозрачной плиткой текста — защитный водяной знак.', params: { text: 'Текст', fontSize: 'Размер шрифта, px', color: 'Цвет текста', opacity: 'Непрозрачность, %', angle: 'Угол, °', stepX: 'Шаг X, px', stepY: 'Шаг Y, px', font: 'Шрифт', bold: 'Жирный' }, options: { font: { sans: 'Без засечек', serif: 'С засечками', mono: 'Моноширинный' } } }, 'watermark-image-png': { title: 'Знак картинкой PNG', description: 'Накладывает другой PNG (логотип, подпись): масштаб от ширины холста, прозрачность, позиция 3×3. Знак живёт, пока открыта страница, — после восстановления цепочки выберите его заново.', params: { scale: 'Ширина знака, % от холста', opacity: 'Непрозрачность, %', position: 'Позиция', margin: 'Отступ, px' }, options: { position: { 'top-left': 'Сверху слева', 'top-center': 'Сверху по центру', 'top-right': 'Сверху справа', 'middle-left': 'По центру слева', center: 'По центру', 'middle-right': 'По центру справа', 'bottom-left': 'Снизу слева', 'bottom-center': 'Снизу по центру', 'bottom-right': 'Снизу справа' } } }, 'add-text-png': { title: 'Надпись на PNG', description: 'Рисует текст на изображении: шрифт, размер, цвет, жирность, позиция на сетке 3×3 и опциональная подложка.', params: { text: 'Текст', fontSize: 'Размер шрифта, px', color: 'Цвет текста', font: 'Шрифт', bold: 'Жирный', position: 'Позиция', margin: 'Отступ, px', plate: 'Подложка', plateColor: 'Цвет подложки', plateOpacity: 'Прозрачность плашки, %' }, options: { font: { sans: 'Без засечек', serif: 'С засечками', mono: 'Моноширинный' }, position: { 'top-left': 'Сверху слева', 'top-center': 'Сверху по центру', 'top-right': 'Сверху справа', 'middle-left': 'По центру слева', center: 'По центру', 'middle-right': 'По центру справа', 'bottom-left': 'Снизу слева', 'bottom-center': 'Снизу по центру', 'bottom-right': 'Снизу справа' } } }, 'date-stamp-png': { title: 'Дата-штамп PNG', description: 'Ставит текущую дату и время по строке формата (токены YYYY MM DD hh mm ss). Оформление — как у надписи.', params: { format: 'Формат', fontSize: 'Размер шрифта, px', color: 'Цвет текста', font: 'Шрифт', bold: 'Жирный', position: 'Позиция', margin: 'Отступ, px', plate: 'Подложка', plateColor: 'Цвет подложки', plateOpacity: 'Прозрачность плашки, %' }, options: { font: { sans: 'Без засечек', serif: 'С засечками', mono: 'Моноширинный' }, position: { 'top-left': 'Сверху слева', 'top-center': 'Сверху по центру', 'top-right': 'Сверху справа', 'middle-left': 'По центру слева', center: 'По центру', 'middle-right': 'По центру справа', 'bottom-left': 'Снизу слева', 'bottom-center': 'Снизу по центру', 'bottom-right': 'Снизу справа' } } }, 'skew-png': { title: 'Наклонить PNG', description: 'Сдвигает содержимое по горизонтали и вертикали — эффект перспективы.', params: { degX: 'Наклон по X, °', degY: 'Наклон по Y, °' } }, 'rotate-free-png': { title: 'Повернуть на произвольный угол', description: 'Поворот на любой угол. Холст расширяется под новые габариты, углы остаются прозрачными.', params: { angle: 'Угол, °' } }, 'zoom-png': { title: 'Приблизить PNG', description: 'Увеличивает содержимое к центру. Холст прежнего размера — края обрезаются.', params: { scale: 'Масштаб, %' } }, 'shift-png': { title: 'Сдвинуть PNG', description: 'Перемещает содержимое на заданное смещение по X и Y.', params: { offsetX: 'Смещение X, px', offsetY: 'Смещение Y, px', color: 'Цвет фона' } }, 'vignette-png': { title: 'Виньетка PNG', description: 'Плавно затемняет края изображения, центр не затрагивает.', params: { strength: 'Сила затемнения, %' } }, 'jpeg-artifacts-png': { title: 'Артефакты JPEG', description: 'Имитирует пережатие в JPEG с низким качеством — видимые квадраты и размытие цветов.', params: { quality: 'Качество JPEG' } }, 'gamma-png': { title: 'Гамма-коррекция PNG', description: 'Корректирует яркость средних тонов. <1 темнее, >1 светлее, 1 — без изменений.', params: { value: 'Гамма' } }, 'auto-contrast-png': { title: 'Автоконтраст PNG', description: 'Растягивает диапазон каждого канала на весь доступный диапазон яркости.' }, 'temperature-png': { title: 'Температура PNG', description: 'Положительные значения делают изображение теплее (оранжевее), отрицательные — холоднее (синеватее).', params: { percent: 'Температура' } }, 'tint-png': { title: 'Тонировать PNG', description: 'Умножает цветовые каналы на выбранный оттенок с заданной силой.', params: { color: 'Цвет тонирования', strength: 'Сила, %' } }, 'svg-to-png': { title: 'SVG в PNG', description: 'Декодирует SVG-разметку в растровое изображение. Вставьте SVG-код слева.', params: { width: 'Ширина результата, px' } }, 'png-is-transparent': { title: 'Проверить: PNG прозрачный?', description: 'Сообщает, есть ли в изображении прозрачные или полупрозрачные пиксели.', results: { transparentYes: 'Да — есть прозрачные или полупрозрачные пиксели.', transparentNo: 'Нет — все пиксели полностью непрозрачны.' } }, 'png-orientation': { title: 'Ориентация PNG', description: 'Сообщает, портрет это, ландшафт или квадрат.', results: { orientationPortrait: 'Портрет — высота больше ширины.', orientationLandscape: 'Ландшафт — ширина больше высоты.', orientationSquare: 'Квадрат — стороны равны.' } } } };