TextFormatter [0.4.5]

Markdown (GitHub flavored):
Почему пропущены версии 0.4.1–0.4.4? После релиза 0.4.0 накопилось
много улучшений, которые требовали согласованной доработки: одно
исправление тянуло за собой другое, добавлялись новые модули. Промежуточные
версии были бы нестабильны и ломали бы пользовательский опыт. Поэтому
все изменения собраны в один крупный патч.

### Added

- **Командная палитра (Ctrl+K)** — fuzzy-поиск по всем действиям
  приложения. Не нужно запоминать хоткеи. Показывает текущее
  состояние переключателей: ✓/✕ для вкл/выкл, бейдж с темой
  для светлой/тёмной.
- **Просмотр diff (Ctrl+D)** — сравнение левого и правого полей.
  Наглядно видно, что именно изменил формат.
- **История версий файла (Ctrl+H)** — каждое сохранение оставляет
  снимок в `%APPDATA%/history/`. Можно откатиться к любой из 50
  последних версий, не потеряв текущий файл на диске.
- **Онбординг** — приветственные слайды при первом запуске:
  открытие папки, двустороннее форматирование, полезные хоткеи.
- **fs-watch** — приложение следит за открытым файлом и
  предлагает перезагрузить его, если файл изменён извне
  (VS Code, Notepad и т.д.).
- **Drag-to-resize** левой панели — тяните за границу, ширина
  сохраняется между сессиями.
- **Многоуровневый статус-бар** — при зажатом Ctrl показывает
  доступные хоткеи текущего уровня
  (Ctrl → Ctrl+Shift → Ctrl+Alt → Ctrl+Shift+Alt) с подсказками,
  какой модификатор ещё можно зажать.
- **Кнопки скролла в статус-баре** — в режиме хоткеев по краям
  появляются стрелки ◀ ▶, чтобы прокручивать длинный список
  действий, не отпуская модификатор. Появляются только когда
  действительно не влезает.
- **Кастомные пресеты оформления** — «Сохранить текущее как
  пресет», переименование, удаление. Настройка «что применять
  из пресета» — галочки для темы / акцента / шрифтов / размеров /
  плотности.
- **Свои модалки** для подтверждения и ввода имени вместо
  системных `prompt`/`confirm` — стилизованы под тему,
  работают на двух языках.
- **Кастомные хоткеи** — все действия переназначаются через UI,
  конфликты разрешаются автоматически (старый владелец комбинации
  теряет её). В настройках появились **подвкладки по категориям**
  (Файл / Редактор / Навигация), чтобы не прокручивать длинный
  список. Биндить можно только комбинации с `Ctrl+…` или `F1–F12`.
- **Хоткей для модалки «Горячие клавиши»** — по умолчанию
  `Ctrl+Shift+H`, переназначается как любое другое действие.
- **Перетаскивание файлов и папок в дереве** — тяните файл
  в папку, чтобы переместить. При наведении цель подсвечивается,
  рядом с курсором плывёт бейдж с именем. Можно бросить в корень —
  для этого внизу дерева есть отдельная зона.
- **«Показать в проводнике»** — по правому клику на файл или папку.
- **Подсказки с информацией о файле** — при наведении показывается
  имя, расширение, размер, дата изменения, дата создания и путь.
  Подсказки поддерживают заголовок (`# Заголовок` в начале текста),
  переносы строк и отображение горячей клавиши внизу.
- **Форматирование JSON** — при открытии `.json` файл красиво
  выравнивается с отступами, ключи не трогаются. В Настройках →
  Редактор есть переключатель «Форматировать JSON» — если
  выключить, JSON остаётся в одну строку как на диске.
- **Превью пресетов оформления** — у светлой и тёмной темы
  в настройках теперь есть картинки-миниатюры.
- **Меню-бар с дропдаунами** — Файл / Правка / Поиск / О программе.
  Справа от каждого пункта виден его текущий хоткей. Кнопки
  «Настройки» и «Поддержать» вынесены в правый угол меню.
  Пункты, требующие открытого файла (Сохранить, Отменить,
  Форматировать, Копировать, Diff и т.д.), неактивны, пока
  файл не открыт.
- **Плавающее окно поиска в файле** — открывается по `Ctrl+F`,
  из меню, из тулбара или по правому клику. Окно можно
  перетаскивать за заголовок, регулировать прозрачность
  (для удобного сравнения с текстом). Позиция и прозрачность
  сохраняются между сессиями. Закрывается только крестиком —
  клик по фону и `Esc` намеренно не срабатывают, чтобы не
  терять введённый запрос случайно.
- **Автоподстановка выделения в поиск** — выделили слово в
  редакторе → `Ctrl+F` → слово уже введено в поле поиска.
- **Пустая замена = удаление** — если оставить поле «Заменить на»
  пустым, кнопки «Заменить» и «Заменить всё» работают как
  удаление найденного.
- **Обёртка выделенного текста MC-кодами** — если выделить
  фрагмент и вставить цветовой код, он оборачивает выделение
  открывающим и закрывающим тегом (`&c` → `&cтекст&r`,
  `<red>` → `<red>текст</red>`, `<color:#f00>` →
  `<color:#f00>текст</color>`), а не просто вставляется
  в позицию курсора. То же самое для градиентов и HEX-цветов.
- **Разделение MC-кодов на цвета и форматы** — на вкладке
  «Стандартные коды» теперь две секции: «Цвета» (16) и
  «Форматы» (6). Раньше всё было в одном списке.
- **Хоткей для цветовых кодов** — можно назначить через
  настройки, как любое другое действие. По умолчанию не задан.
- **Вкладка «Обновления» в настройках** — вся работа
  с обновлениями перенесена сюда: проверка, скачивание,
  установка, «что нового», ссылка на GitHub-релиз. Показывает
  текущую версию и (если есть) новую. После нажатия
  «Проверить обновления» появляется уведомление о результате.
- **Кнопка «Закрыть файл»** в шапке редактора рядом с иконкой
  истории — мгновенно закрывает открытый файл, не трогая его
  на диске.
- **Вкладки настроек-карточки** — каждая вкладка теперь
  выглядит как карточка: иконка сверху, название снизу. Сетка
  ровная, ничего не ломается на узких экранах.
- **Отдельный шрифт для редактора** — помимо шрифта интерфейса
  можно выбрать свой шрифт для поля ввода. Настройки →
  Внешний вид → «Шрифт редактора».
- **Свой диалог восстановления бэкапа** — если приложение
  было аварийно закрыто с несохранёнными правками, при
  следующем запуске появляется собственная модалка (в стиле
  программы), а не системное окно. Кнопки «Восстановить» /
  «Удалить бэкап».
- **Автооткрытие созданного файла** — при создании нового
  файла в дереве он сразу открывается в редакторе.
- **Правильное создание в выбранной папке** — если создать
  папку, а потом внутри неё создать файл или ещё одну папку —
  новый элемент появится именно внутри, а не рядом со старым
  выделением.

### Changed

- **Поиск в файле** — вместо встроенной панели CodeMirror
  открывается собственное плавающее окно (см. Added). Ищет
  **всегда в поле «Ввод»**, даже если вызов был из окна
  результата — это логично, потому что результат только для
  чтения.
- **Правый клик в поле ввода** — убраны избыточные пункты:
  Undo / Redo / Cut / Paste / Emoji / MC-коды / Поиск / Горячие
  клавиши скрыты в поле результата. Остались только
  «Копировать» и «Выделить всё».
- **Локализация** полностью переработана — тексты разбиты
  по категориям (`tooltip.*`, `toast.*`, `menubar.*`,
  `context-menu.*`, `modal.*`, `editor.*`, `statusbar.*`,
  `label.*`, `color.*`, `format.*`, `sidebar.*`, `hotkeys.*`),
  чтобы легче поддерживать.
- **Меню «О программе»** — пункт «История изменений» переехал
  сюда из окна «Об авторе». «Проверить обновления» ведёт на
  вкладку Updates в настройках с автостартом проверки.
- Статус-бар при зажатом Ctrl больше не дублирует модификатор
  в каждом хоткее — бейдж «зажато сейчас» слева, хоткеи справа
  без повторения.
- Поле результата показывает текст «как в игре»: цветовые коды
  скрыты, но при копировании возвращаются.
- **Установщик** — собственное имя, иконка, описание,
  установка в `%LOCALAPPDATA%\Programs\TextFormatter` без
  прав администратора.
- **Служебный файл `_backup.json`** больше не показывается
  в дереве и в поиске. Открывается через `Ctrl+O`, но только
  на чтение — редактирование запрещено, чтобы случайно
  не повредить резервную копию.
- **Названия пресетов вынесены в переводы** — при смене
  языка интерфейса карточки пресетов переименовываются
  корректно.
- **Автосохранение в фоне работает аккуратнее** — записывает
  резервную копию только когда есть что сохранять, а не
  каждые 30 секунд вхолостую.
- **Список расширений для открытия файлов урезан** — теперь
  в диалоге «Открыть файл» только форматы, реально
  используемые в Minecraft-конфигах: `yml`, `yaml`, `json`,
  `toml`, `properties`, `conf`, `cfg`, `ini`, `env`, `xml`,
  `html`, `md`, `txt`, `log`, `csv`, `tsv`, `diff`, `patch`
  и пара служебных. Убраны `.css`, `.js`, `.ts`, `.rs`,
  `.py` и прочие языки программирования.
- **Убран `.msi` установщик** — теперь только `.exe` (NSIS).
  `.msi` был нужен только для корпоративных развёртываний,
  обычным пользователям не требуется.
- **Меню-бар переведён на конфиг** — все пункты описаны
  в `config/menuItems.ts`. Легче добавлять новые, не
  трогая компонент.
- **Полная переработка стилей** — CSS переведён на SCSS
  с модульной организацией: `styles/layout/`,
  `styles/modals/`, `styles/libs/`, `styles/ui/`. Введены
  переменные для отступов, размеров шрифтов, ширины модалок,
  таймингов анимаций. Легче поддерживать и добавлять новые
  компоненты.

### Fixed

- **Градиент `<gradient:...>` не сбрасывался** на `<reset>`
  или `&r` — продолжал заливать текст после сброса.
- **Скроллбар в статус-баре** при зажатом Ctrl (не влезали
  все хоткеи) — теперь скролл есть, но невидим.
- **Файл помечался как «несохранённый»** при запуске
  приложения, даже если пользователь ничего не вводил.
- **Дубликаты в «Недавних»** при открытии одного файла
  через разные пути (`D:\folder\file.txt` и
  `D:/folder/file.txt`). Нормализация путей.
- **Переименование файла в существующий** перезаписывало
  его. Теперь — проверка существования, ошибка «уже
  существует».
- **Переименование открытого файла** не обновляло путь
  в редакторе и статус-баре. Теперь синхронизируется.
- **Открытие папки через тулбар** не закрывало текущий
  файл из старой папки. Теперь закрывает (с предложением
  сохранить).
- **`<gradient>` из нескольких цветов** отображался как
  средний цвет — теперь посимвольная интерполяция даёт
  плавный переход.
- **Ctrl+P** открывал диалог печати браузера — заблокирован.
- **Ctrl+J** открывал панель загрузок WebView — заблокирован.
- **Ctrl+Shift+P** открывал диалог печати — заблокирован.
- **Ctrl+U** открывал исходник страницы — заблокирован.
- **Ctrl+R / Ctrl+Shift+R / F5** перезагружали страницу —
  заблокированы.
- **Alt+← / Alt+→** переключали историю навигации —
  заблокированы.
- **Ctrl+F в редакторе** перехватывался CodeMirror —
  открывалась его панель, а не наша модалка. Теперь
  `Ctrl+F` **всегда** открывает наше окно поиска.
- **ПКМ → «Вставить» не работало** — теперь вставка через
  контекстное меню работает корректно, не запрашивая
  разрешение на буфер обмена.
- **ПКМ → «Поиск»** открывал скрытую панель CodeMirror.
  Теперь открывает нашу модалку поиска.
- **При клике на другой файл не показывалось предупреждение**
  о несохранённых изменениях — изменения сбрасывались молча.
- **Путь в редакторе не обновлялся** после перемещения файла.
- **Последняя строка дерева обрезалась снизу** на некоторых
  размерах окна.
- **Иконки папок не обновлялись** при раскрытии/закрытии.
- **При перетаскивании появлялась синяя полоса** браузера
  и иногда «залипал» курсор.
- **Клик по папке срабатывал не всегда** — теперь стабильно.
- **На больших папках приложение тормозило при открытии** —
  обход папки стал заметно быстрее: пропускаются лишние
  служебные каталоги (`node_modules`, `.git`, `target`
  и другие), дерево строится параллельно.
- **Поиск по файлам работал медленно** на больших папках —
  ускорен в несколько раз, плюс исключены те же служебные
  каталоги.
- **Лаги при нажатии Ctrl** — интерфейс подвисал
  на 2–4 секунды из-за лишних ререндеров. Устранено,
  переключение в режим хоткеев теперь мгновенное.
- **Кнопки скролла наезжали на хоткеи** в статус-баре —
  теперь встроены в поток и появляются только при реальном
  переполнении.
- **Прыжки интерфейса на 1–2 px** при клике по вкладкам
  хоткеев в настройках.
- **Проверить обновления в меню** ничего не показывало —
  теперь открывается вкладка Updates с автостартом
  и уведомлением о результате.
- **Ctrl+Z / Ctrl+Y между файлами** заменяли содержимое
  нового файла старым — история правок теперь сбрасывается
  при смене файла.
- **Тултип уезжал за монитор** при длинном тексте
  или если элемент у края — теперь автоматически выбирает
  сторону с наибольшим свободным местом, ограничивает
  ширину по размеру окна и добавляет вертикальный скролл
  для очень длинных подсказок.
- **Пресеты после сброса** — карточка активного пресета
  становилась неактивной, а акцент на светлой теме брался
  с тёмной. Теперь активный пресет вычисляется из текущего
  оформления — если совпадает с каким-то пресетом, он
  подсвечивается.
- **Наложение модальных окон** — можно было открыть
  несколько одновременно. Теперь при открытии новой
  модалки все остальные закрываются.
- **Удаление открытого файла после save-prompt** —
  программа сначала удаляла файл, потом предлагала
  сохранить (в пустоту). Теперь при удалении не
  спрашивает про сохранение — файл сразу удаляется.
- **Удалённый файл в «Недавних»** — если файла уже нет
  на диске, он убирается из списка с уведомлением
  «Файл не найден».
- **Биндинг хоткеев** — Alt+X или Shift+X записывались
  как комбинация, но не работали. Теперь разрешены только
  `Ctrl+…` или `F1–F12`.
- **Биндинг триггерил действия** — пока записывается
  новая комбинация, все остальные действия заблокированы,
  чтобы не срабатывало сохранение / открытие и т.д.
- **Модалка «Горячие клавиши»** не открывалась через свой
  хоткей — исправлено.
- **Цветовые коды по хоткею** не открывались —
  исправлено.
- **Мышка пропадала** при сохранении через `Ctrl+N → Save as`
  (системный диалог выбора пути). Теперь курсор
  сохраняется корректно при любых нативных диалогах.
- **Ссылки открывались внутри приложения** — теперь
  все http(s), mailto и tel открываются в системном
  браузере, приложение остаётся работоспособным.
- **Поиск по папкам при пустой папке** — писало
  «Папка не указана», но при этом бесконечно грузило
  и блокировало кнопку. Теперь сразу показывает ошибку,
  кнопка остаётся активной, можно ввести папку и
  повторить поиск.
- **Кириллица в поиске по папкам** — подсветка
  съезжала в конец строки. Теперь позиция считается
  корректно для любых символов.
- **Мышка пропадала при ресайзе сайдбара**, если фокус
  уходил из окна (Alt+Tab, нативный диалог). Теперь
  курсор сбрасывается при потере/возврате фокуса.

### Security

- Пакеты обновлений подписываются Ed25519 и проверяются
  перед установкой.
- Убраны неиспользуемые зависимости, обновлены минорные
  версии.
- Отключены горячие клавиши браузера, которые могли
  открыть DevTools, исходник страницы, диалог печати
  или панель загрузок. Теперь эти комбинации
  заблокированы на уровне приложения — их можно
  свободно переназначать на действия TextFormatter.
ВерхНиз