Почему пропущены версии 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.