<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
  <title>VueCraft NPM — Что нового</title>
  <subtitle>Хронологический журнал изменений всех пакетов VueCraft: что и когда выходило, по датам и версиям.</subtitle>
  <id>https://npm.vuecraft.ru/changelog/</id>
  <link rel="self" href="https://npm.vuecraft.ru/changelog/feed.xml"/>
  <link href="https://npm.vuecraft.ru/changelog/"/>
  <updated>2026-10-09T00:00:00Z</updated>
  <entry>
    <title>DevToolz 0.5.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-09-devtoolz-0-5-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-09-devtoolz-0-5-0"/>
    <updated>2026-10-09T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Изменено: команды для изображений &lt;code&gt;image-hash&lt;/code&gt; и &lt;code&gt;image-batch&lt;/code&gt; и их модули в &lt;code&gt;devtoolz ui&lt;/code&gt; переехали в отдельный пакет &lt;a href=&quot;https://npm.vuecraft.ru/packages/mediatoolz/&quot;&gt;MediaToolz&lt;/a&gt;. В DevToolz обе команды остались заглушками: они печатают &lt;code&gt;image-batch has moved to @macrulez/mediatoolz — run it with: npx @macrulez/mediatoolz image-batch …&lt;/code&gt; и завершаются с кодом 2, так что скрипт, который всё ещё их вызывает, падает громко. Заглушки будут убраны в одной из следующих версий. Чтобы перейти, установите &lt;code&gt;@macrulez/mediatoolz&lt;/code&gt;, используйте те же команды и флаги и перенесите папку &lt;code&gt;.devtoolz/image-batch/&lt;/code&gt; в &lt;code&gt;.mediatoolz/image-batch/&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/mediatoolz/guide/installation.html#переход-с-devtoolz&quot;&gt;Переход с DevToolz&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Изменено: &lt;code&gt;devtoolz ui&lt;/code&gt; сохраняет два модуля, проверки кода и очистку, а файловый браузер показывает только папки.&lt;/li&gt;
&lt;li&gt;Изменено: DevToolz больше не зависит от &lt;code&gt;hazehash&lt;/code&gt;, &lt;code&gt;blurhash&lt;/code&gt;, &lt;code&gt;thumbhash&lt;/code&gt; и &lt;code&gt;sharp&lt;/code&gt;, поэтому ставится легче и никогда не предлагает установить нативную библиотеку изображений. Программный API больше не экспортирует &lt;code&gt;runImageHash&lt;/code&gt;, &lt;code&gt;runImageBatch&lt;/code&gt; и связанные типы; их экспортирует &lt;code&gt;@macrulez/mediatoolz&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DevToolz 0.4.3</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-09-devtoolz-0-4-3</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-09-devtoolz-0-4-3"/>
    <updated>2026-10-09T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Изменено: в интерфейсе у &lt;strong&gt;Convert&lt;/strong&gt; появился переключатель &lt;strong&gt;Resize the images&lt;/strong&gt;, по умолчанию выключенный. Пока он не включён, изображения только конвертируются в выбранный формат, а поля размера скрыты (запуск без размеров никогда ничего не уменьшает; см. &lt;a href=&quot;https://npm.vuecraft.ru/packages/mediatoolz/guide/image-batch.html#методы-задания-размера&quot;&gt;Методы задания размера&lt;/a&gt;); раньше с самого начала был подставлен список ширин (&lt;code&gt;800, 1600&lt;/code&gt;), и каждое изображение уменьшалось дважды.&lt;/li&gt;
&lt;li&gt;Изменено: в интерфейсе &lt;strong&gt;Image Hash&lt;/strong&gt; по умолчанию отмечены hazehash и доминирующий цвет; blurhash и thumbhash выключены.&lt;/li&gt;
&lt;li&gt;Добавлено: &lt;code&gt;--no-resize&lt;/code&gt; отключает размеры сохранённой конфигурации на один запуск.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>MediaToolz 0.1.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-09-mediatoolz-0-1-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-09-mediatoolz-0-1-1"/>
    <updated>2026-10-09T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Изменено: нативная библиотека изображений &lt;code&gt;sharp&lt;/code&gt; теперь ставится вместе с пакетом, так что &lt;code&gt;image-hash&lt;/code&gt;, &lt;code&gt;image-batch&lt;/code&gt; и &lt;code&gt;mediatoolz ui&lt;/code&gt; работают сразу после &lt;code&gt;npm install -g @macrulez/mediatoolz&lt;/code&gt;, без предупреждения и без вопроса при первом запуске. Предложение установить &lt;code&gt;sharp&lt;/code&gt; в &lt;code&gt;~/.mediatoolz/deps&lt;/code&gt; осталось только на редкий случай, когда его бинарника нет (установка с &lt;code&gt;--omit=optional&lt;/code&gt;, неподдерживаемая платформа). См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/mediatoolz/guide/installation.html&quot;&gt;Установку&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>MediaToolz 0.1.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-09-mediatoolz-0-1-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-09-mediatoolz-0-1-0"/>
    <updated>2026-10-09T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: пакет. &lt;code&gt;image-hash&lt;/code&gt;, &lt;code&gt;image-batch&lt;/code&gt; и &lt;code&gt;ui&lt;/code&gt; перенесены сюда из &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/&quot;&gt;DevToolz&lt;/a&gt; 0.4.3 как есть, с теми же командами, флагами и настройками. Что изменилось при переносе: команда называется &lt;code&gt;mediatoolz&lt;/code&gt;, конфигурации и пресеты резкости лежат в &lt;code&gt;.mediatoolz/image-batch/&lt;/code&gt;, управляемая копия &lt;code&gt;sharp&lt;/code&gt; — в &lt;code&gt;~/.mediatoolz/deps&lt;/code&gt;, а файл кэша &lt;code&gt;image-hash&lt;/code&gt; по умолчанию — &lt;code&gt;.mediatoolz-image-hash-cache.json&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/mediatoolz/guide/installation.html#переход-с-devtoolz&quot;&gt;Переход с DevToolz&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Polyrepo 1.3.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-09-polyrepo-cli-1-3-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-09-polyrepo-cli-1-3-1"/>
    <updated>2026-10-09T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: форма Publish и мастер релиза показывают версию пакета на npm рядом с локальной и фильтр &lt;strong&gt;Only ahead of npm&lt;/strong&gt;, чтобы было понятно, что стоит публиковать. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/polyrepo-cli/guide/ui.html#команды&quot;&gt;Веб-интерфейс&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: когда публикация падает из-за того, что npm требует ссылку для входа, ключ безопасности или passkey, отчёт предлагает &lt;strong&gt;Publish in a terminal&lt;/strong&gt;: в папке пакета открывается окно терминала с командой публикации, где npm может принять вход. Раньше интерфейс умел только запросить одноразовый код. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/polyrepo-cli/guide/ui.html#вход-по-ссылке-ключу-или-passkey&quot;&gt;Вход по ссылке, ключу или passkey&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: строки в списке пакетов подсвечиваются по статусу: красным при локальных изменениях, жёлтым, если версия новее, чем на npm, и акцентным цветом, если пакета на npm нет.&lt;/li&gt;
&lt;li&gt;Новое: кнопка &lt;strong&gt;Refresh&lt;/strong&gt; над списком пакетов в каждой форме команды и в мастере релиза заново читает ветки, состояние git и версии на npm без перезагрузки страницы.&lt;/li&gt;
&lt;li&gt;Изменено: кнопка запуска команды закреплена внизу страницы, как и кнопки мастера релиза.&lt;/li&gt;
&lt;li&gt;Изменено: карточки запуска из нескольких шагов (например, тег и затем релиз) идут друг под другом на всю ширину.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DevToolz 0.4.2</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-08-devtoolz-0-4-2</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-08-devtoolz-0-4-2"/>
    <updated>2026-10-08T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: &lt;code&gt;devtoolz ui&lt;/code&gt; запускает локальный веб-интерфейс и открывает его в браузере. Он входит в пакет и слушает только &lt;code&gt;127.0.0.1&lt;/code&gt;, под одноразовым токеном в напечатанном адресе; запросы с чужим &lt;code&gt;Host&lt;/code&gt; или &lt;code&gt;Origin&lt;/code&gt; отклоняются. Настраивается флагами &lt;code&gt;--port&lt;/code&gt;, &lt;code&gt;--host&lt;/code&gt;, &lt;code&gt;--no-open&lt;/code&gt;, &lt;code&gt;--token&lt;/code&gt; и &lt;code&gt;--cwd&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/ui.html&quot;&gt;Веб-интерфейс&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;strong&gt;Code checks&lt;/strong&gt; выполняет одиннадцать проверок (мёртвые экспорты, пустые catch, тесты-сироты, регистр импортов, циклические импорты, TODO-комментарии, устаревшие &lt;code&gt;@ts-ignore&lt;/code&gt;, неиспользуемые зависимости, пути в &lt;code&gt;package.json&lt;/code&gt;, примеры в README, npm-скрипты в документации) на любой выбранной папке. Обзор запускает их все и показывает карточку для каждой. Находки сгруппированы по файлам, фильтруются и открываются рядом с кодом: с подсветкой синтаксиса, выделенной строкой и ссылкой на редактор. Циклы импорта можно показать и графом.&lt;/li&gt;
&lt;li&gt;Новое: &lt;strong&gt;Code cleanup&lt;/strong&gt; удаляет комментарии или вызовы &lt;code&gt;console&lt;/code&gt; с предварительным просмотром: сканирование перечисляет файлы и показывает настоящий diff для каждого, по умолчанию ничего не выбрано, а меняются только отмеченные файлы, после подтверждения. Файл, изменившийся после сканирования, пропускается. Оригиналы сначала копируются за пределы проекта, и очистку можно откатить.&lt;/li&gt;
&lt;li&gt;Новое: &lt;strong&gt;Image Hash&lt;/strong&gt; в интерфейсе — папки выбираются в файловом браузере с миниатюрами, сразу видно, сколько в них изображений, отмечаются плейсхолдеры, а результат — галерея, где каждое изображение стоит рядом с плейсхолдерами, декодированными из его хешей, с выводом, который можно скопировать, скачать или записать в файл.&lt;/li&gt;
&lt;li&gt;Новое: &lt;strong&gt;Image Batch&lt;/strong&gt; в интерфейсе — конвертация быстрыми настройками или сохранённой конфигурацией с предпросмотром плана, прогрессом и миниатюрами «было → стало»; редактор конфигураций формой с вкладкой JSON и проверкой на лету; пресеты резкости с предпросмотром, который сравнивает изображение до и после; бэкапы замещённых оригиналов с восстановлением.&lt;/li&gt;
&lt;li&gt;Изменено: &lt;code&gt;image-batch&lt;/code&gt; принимает рамку &lt;code&gt;--size&lt;/code&gt; как переопределение запуска в программном API, а каждый результат запуска теперь содержит абсолютные пути источника и результата.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DevToolz 0.4.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-08-devtoolz-0-4-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-08-devtoolz-0-4-1"/>
    <updated>2026-10-08T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: &lt;code&gt;sharpen&lt;/code&gt; добавляет выходную резкость после изменения размера в манере Lightroom: &lt;code&gt;for&lt;/code&gt; (&lt;code&gt;screen&lt;/code&gt;, &lt;code&gt;matte&lt;/code&gt; или &lt;code&gt;glossy&lt;/code&gt;) и &lt;code&gt;amount&lt;/code&gt; (&lt;code&gt;low&lt;/code&gt;, &lt;code&gt;standard&lt;/code&gt; или &lt;code&gt;high&lt;/code&gt;) выбирают значения из таблицы, а тонкие настройки &lt;code&gt;radius&lt;/code&gt;, &lt;code&gt;flat&lt;/code&gt;, &lt;code&gt;jagged&lt;/code&gt; и &lt;code&gt;threshold&lt;/code&gt; заменяют любое из них. Каждая проверяется по диапазону, который принимает sharp, а неверное значение сообщается с названием поля и диапазоном до начала записи. Рецепт, в котором &lt;code&gt;sharpen&lt;/code&gt; не указан, резкостью не обрабатывается. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/mediatoolz/guide/image-batch.html#резкость&quot;&gt;Резкость&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;image-batch sharpen&lt;/code&gt; сохраняет пресеты резкости и управляет ими (&lt;code&gt;sharpen new|list|show|rm&lt;/code&gt;; без подкоманды терминал открывает список, где пресет можно показать, изменить, скопировать или удалить). Пресет используется по имени: &lt;code&gt;&amp;quot;sharpen&amp;quot;: &amp;quot;web-crisp&amp;quot;&lt;/code&gt; или &lt;code&gt;{ &amp;quot;preset&amp;quot;: &amp;quot;web-crisp&amp;quot;, &amp;quot;amount&amp;quot;: &amp;quot;high&amp;quot; }&lt;/code&gt; в конфигурации, &lt;code&gt;--sharpen web-crisp&lt;/code&gt; в командной строке. Пресеты лежат в &lt;code&gt;.devtoolz/image-batch/sharpen/&lt;/code&gt; проекта или в &lt;code&gt;~/.devtoolz/image-batch/sharpen/&lt;/code&gt; для всех проектов. Шесть встроенных пресетов (&lt;code&gt;web-light&lt;/code&gt;, &lt;code&gt;web-crisp&lt;/code&gt;, &lt;code&gt;web-detail&lt;/code&gt;, &lt;code&gt;thumbnail&lt;/code&gt;, &lt;code&gt;print-matte&lt;/code&gt;, &lt;code&gt;print-glossy&lt;/code&gt;) работают без создания чего-либо. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/mediatoolz/guide/image-batch.html#пресеты-резкости&quot;&gt;Пресеты резкости&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: флаги &lt;code&gt;--sharpen&lt;/code&gt;, &lt;code&gt;--sharpen-for&lt;/code&gt;, &lt;code&gt;--sharpen-amount&lt;/code&gt;, &lt;code&gt;--sharpen-radius&lt;/code&gt;, &lt;code&gt;--sharpen-flat&lt;/code&gt;, &lt;code&gt;--sharpen-jagged&lt;/code&gt; и &lt;code&gt;--sharpen-threshold&lt;/code&gt; у &lt;code&gt;image-batch&lt;/code&gt;, &lt;code&gt;init&lt;/code&gt; и &lt;code&gt;sharpen new&lt;/code&gt;. Мастер &lt;code&gt;init&lt;/code&gt; спрашивает о резкости и предлагает сохранённые пресеты, а редактор рецептов в &lt;code&gt;config&lt;/code&gt; выбирает пресет или собственные значения.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DevToolz 0.4.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-08-devtoolz-0-4-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-08-devtoolz-0-4-0"/>
    <updated>2026-10-08T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: команда &lt;a href=&quot;https://npm.vuecraft.ru/packages/mediatoolz/guide/image-batch.html&quot;&gt;&lt;code&gt;image-batch&lt;/code&gt;&lt;/a&gt; пакетно меняет размер, конвертирует и пережимает растровые изображения по правилам. Правила хранятся в переиспользуемой конфигурации (или во флагах); папки, откуда брать картинки, и место для результатов выбираются при каждом запуске, поэтому одна конфигурация подходит для любого проекта. Работает на той же библиотеке &lt;code&gt;sharp&lt;/code&gt;, что и &lt;code&gt;image-hash&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Новое: три места для результатов — &lt;code&gt;-o &amp;lt;dir&amp;gt;&lt;/code&gt; (отдельная папка с повторением структуры исходников, &lt;code&gt;--flat&lt;/code&gt; её убирает), &lt;code&gt;--beside&lt;/code&gt; (рядом с каждым исходником) и &lt;code&gt;--replace&lt;/code&gt; (поверх самих исходных файлов, каждый в своём формате: уменьшить слишком большие оригиналы или пережать их на месте). Указывается ровно одно из них.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;--replace&lt;/code&gt; под защитой. Он просит подтверждение (&lt;code&gt;--yes&lt;/code&gt; без терминала), сначала копирует оригиналы в &lt;code&gt;.image-batch-backup/&amp;lt;дата&amp;gt;/&lt;/code&gt; вместе с &lt;code&gt;journal.json&lt;/code&gt; (&lt;code&gt;--backup &amp;lt;dir&amp;gt;&lt;/code&gt;, &lt;code&gt;--no-backup&lt;/code&gt;), заменяет файл, только если результат меньше (&lt;code&gt;--no-only-if-smaller&lt;/code&gt;), никогда не обрабатывает один и тот же файл дважды с теми же настройками, а &lt;code&gt;--dry-run&lt;/code&gt; показывает настоящие размеры до и после. &lt;code&gt;image-batch restore &amp;lt;backup&amp;gt;&lt;/code&gt; возвращает оригиналы.&lt;/li&gt;
&lt;li&gt;Новое: размеры через &lt;code&gt;widths&lt;/code&gt;, &lt;code&gt;heights&lt;/code&gt;, &lt;code&gt;size&lt;/code&gt; с &lt;code&gt;fit&lt;/code&gt;, &lt;code&gt;scale&lt;/code&gt; (&lt;code&gt;@2x&lt;/code&gt;), а также по длинной стороне (&lt;code&gt;longEdge&lt;/code&gt;, &lt;code&gt;--long&lt;/code&gt;), по короткой (&lt;code&gt;shortEdge&lt;/code&gt;, &lt;code&gt;--short&lt;/code&gt;), по площади в мегапикселях (&lt;code&gt;megapixels&lt;/code&gt;, &lt;code&gt;--megapixels&lt;/code&gt;) и в процентах (&lt;code&gt;percent&lt;/code&gt;, &lt;code&gt;--percent&lt;/code&gt;). Длинная и короткая сторона не зависят от ориентации, поэтому одна настройка подходит для галереи из альбомных и портретных кадров. &lt;code&gt;matchOrientation&lt;/code&gt; (&lt;code&gt;--match-orientation&lt;/code&gt;) разворачивает рамку «ширина × высота» для изображений другой ориентации. Размеры больше исходного не увеличиваются, пока &lt;code&gt;withoutEnlargement&lt;/code&gt; не равен &lt;code&gt;false&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;maxBytes&lt;/code&gt; (&lt;code&gt;--max-size 200KB&lt;/code&gt;) ограничивает размер каждого файла: качество снижается ровно настолько, насколько нужно, а файл, который не удаётся уложить в предел, не записывается, а попадает в отчёт. Работает для jpg, webp, avif, heif, jp2 и png с палитрой.&lt;/li&gt;
&lt;li&gt;Новое: форматы jpg, png, webp, avif, gif, tiff, jp2 и heif с важными для каждого опциями (&lt;code&gt;quality&lt;/code&gt;, &lt;code&gt;mozjpeg&lt;/code&gt;, &lt;code&gt;palette&lt;/code&gt; у png, &lt;code&gt;lossless&lt;/code&gt; у webp, &lt;code&gt;effort&lt;/code&gt; у avif, …), которые задаются в конфигурации или через &lt;code&gt;--codec&lt;/code&gt;, и уровни качества &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt; и &lt;code&gt;best&lt;/code&gt;, раскрывающиеся в число для каждого формата. Сжатие с потерями молча не включается, а неверная опция или значение сообщаются с подсказкой до начала записи.&lt;/li&gt;
&lt;li&gt;Новое: имена файлов по шаблону — &lt;code&gt;{name}&lt;/code&gt;, &lt;code&gt;{ext}&lt;/code&gt;, &lt;code&gt;{orig}&lt;/code&gt;, &lt;code&gt;{dir}&lt;/code&gt;, &lt;code&gt;{format}&lt;/code&gt;, &lt;code&gt;{width}&lt;/code&gt;, &lt;code&gt;{height}&lt;/code&gt;, &lt;code&gt;{size}&lt;/code&gt;, &lt;code&gt;{long}&lt;/code&gt;, &lt;code&gt;{short}&lt;/code&gt;, &lt;code&gt;{mp}&lt;/code&gt;, &lt;code&gt;{percent}&lt;/code&gt;, &lt;code&gt;{scale}&lt;/code&gt;, &lt;code&gt;{index:3}&lt;/code&gt;, &lt;code&gt;{hash}&lt;/code&gt;, &lt;code&gt;{date}&lt;/code&gt; — с разумным умолчанием для каждого метода размера. Шаблон, выходящий за выходную папку, неизвестная переменная или два результата с одним именем — это ошибка до начала записи.&lt;/li&gt;
&lt;li&gt;Новое: выбор файлов — &lt;code&gt;-r&lt;/code&gt;, &lt;code&gt;--include&lt;/code&gt;, &lt;code&gt;--exclude&lt;/code&gt;, &lt;code&gt;--files-from&lt;/code&gt;, glob-шаблоны, &lt;code&gt;--list&lt;/code&gt; и &lt;code&gt;-i, --select&lt;/code&gt;, интерактивный список, в котором снимаются отметки с ненужных файлов.&lt;/li&gt;
&lt;li&gt;Новое: результаты, которые уже сделал прошлый запуск, пропускаются; для любого другого существующего файла терминал спрашивает один раз (перезаписать этот, перезаписать все, пропустить, пропустить все, выйти), а без терминала файлы пропускаются с кодом выхода 1 или решают &lt;code&gt;--overwrite&lt;/code&gt;, &lt;code&gt;--skip-existing&lt;/code&gt; и &lt;code&gt;--no-overwrite&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;--hazehash&lt;/code&gt; (&lt;code&gt;--budget&lt;/code&gt;), &lt;code&gt;--blurhash&lt;/code&gt;, &lt;code&gt;--thumbhash&lt;/code&gt; и &lt;code&gt;--dominant-color&lt;/code&gt; вместе с &lt;code&gt;--emit &amp;lt;file&amp;gt;&lt;/code&gt; записывают манифест всего созданного с плейсхолдерами в форме манифеста плейсхолдеров &lt;code&gt;vue-image-kit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;init&lt;/code&gt; создаёт конфигурацию, а &lt;code&gt;config&lt;/code&gt; (&lt;code&gt;config list|show|rm|new&lt;/code&gt;) показывает, правит, копирует и удаляет конфигурации. Они лежат в &lt;code&gt;.devtoolz/image-batch/&lt;/code&gt; проекта или в &lt;code&gt;~/.devtoolz/image-batch/&lt;/code&gt; для всех проектов, а метод размера и форматы выбираются из списков.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Polyrepo 1.3.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-08-polyrepo-cli-1-3-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-08-polyrepo-cli-1-3-0"/>
    <updated>2026-10-08T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: &lt;code&gt;polyrepo commit&lt;/code&gt; коммитит то, что &lt;code&gt;npm audit fix&lt;/code&gt;, &lt;code&gt;npm update&lt;/code&gt; или &lt;code&gt;sync-deps&lt;/code&gt; оставили в рабочем дереве (&lt;code&gt;package.json&lt;/code&gt; и lock-файлы, либо все отслеживаемые изменения с &lt;code&gt;--scope all&lt;/code&gt;), не сталкиваясь с правилами веток. На feature-ветке коммит ложится туда. На основной ветке polyrepo читает правила хостинга (rulesets и защита веток GitHub, защищённые ветки GitLab и ваша роль): если прямые коммиты разрешены, он коммитит и отправляет; если нужен pull/merge request или правила прочитать не удалось, создаёт ветку, коммитит туда, отправляет её, открывает PR/MR и оставляет основную ветку нетронутой. Прямой push, который хостинг всё же отклонил, переносит коммит в ветку автоматически. Настраивается через &lt;code&gt;--message&lt;/code&gt;, &lt;code&gt;--mode&lt;/code&gt;, &lt;code&gt;--branch&lt;/code&gt;, &lt;code&gt;--no-push&lt;/code&gt;, &lt;code&gt;--no-pr&lt;/code&gt;, &lt;code&gt;--stay&lt;/code&gt;, &lt;code&gt;--dry-run&lt;/code&gt;, &lt;code&gt;--packages&lt;/code&gt; и &lt;code&gt;--yes&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/polyrepo-cli/guide/commit.html&quot;&gt;Коммит изменений&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: интерфейс показывает частично исправленный &lt;code&gt;npm audit fix&lt;/code&gt; как &lt;strong&gt;Partly done&lt;/strong&gt;, а не как неудачу, с блоком &lt;strong&gt;What is left&lt;/strong&gt;, сгруппированным по обновлению, которое исправляет каждую уязвимость, и кнопками: предпросмотр &lt;code&gt;--force&lt;/code&gt;, аудит только production-зависимостей, обновление одной зависимости или применение &lt;code&gt;--force&lt;/code&gt; после подтверждения. В отчётах аудита и outdated по цветному блоку на пакет с заметной кнопкой &lt;strong&gt;Fix vulnerabilities…&lt;/strong&gt; / &lt;strong&gt;Update dependencies…&lt;/strong&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/polyrepo-cli/guide/ui.html#что-делать-с-наиденным&quot;&gt;Что делать с найденным&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: после команды, меняющей зависимости, интерфейс показывает, что изменилось в &lt;code&gt;package.json&lt;/code&gt; и lock-файлах, с изменением &lt;code&gt;package.json&lt;/code&gt; в виде диффа, и предлагает &lt;strong&gt;Commit…&lt;/strong&gt; (диалог читает правила веток и рекомендует прямой коммит либо ветку и PR/MR), &lt;strong&gt;Discard…&lt;/strong&gt; и &lt;strong&gt;Run tests&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Новое: под каждым предупреждением и ошибкой отчёт предлагает следующие шаги для этой ситуации (закоммитить или отложить в stash грязное дерево, проверить вход в npm, опубликовать снова с одноразовым паролем, переключиться на основную ветку, запустить снова и другое), а завершённые bump, tag, publish, commit или clone подсказывают, что обычно идёт следом. Отменённый или прерванный запуск предлагает запустить снова и проверить окружение, запуск, который ничего не сделал, помечается &lt;strong&gt;Needs attention&lt;/strong&gt;, а когда сервер остановили, страница сообщает об этом.&lt;/li&gt;
&lt;li&gt;Новое: после команды, меняющей репозитории, таблица Packages в фоне обновляет только затронутые ею пакеты.&lt;/li&gt;
&lt;li&gt;Новое: URL в отчётах и логах кликабельны.&lt;/li&gt;
&lt;li&gt;Изменено: единый стиль кнопок во всём интерфейсе: обычные, основные, опасные (с рамкой) и критические (сплошные, для необратимых подтверждений), с иконками и мягкой тенью.&lt;/li&gt;
&lt;li&gt;Изменено: карточки отчёта с длинным выводом занимают всю ширину, а вывод упавшей команды раскрывается сам. Страница Packages и отчёты показывают спиннер по центру, пока грузятся, и больше не мигают пустым состоянием при возврате на Packages.&lt;/li&gt;
&lt;li&gt;Изменено: пакет публикуется без тестов и исходников интерфейса, а веб-интерфейс автоматически пересобирается перед каждой публикацией.&lt;/li&gt;
&lt;li&gt;Исправлено: на Windows аргумент с пробелами, например сообщение &lt;code&gt;git commit -m &amp;quot;chore: bump version&amp;quot;&lt;/code&gt;, разбивался на несколько аргументов, из-за чего ломались коммиты, которые делает &lt;code&gt;bump&lt;/code&gt;, и другие команды. &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;gh&lt;/code&gt;, &lt;code&gt;glab&lt;/code&gt; и &lt;code&gt;node&lt;/code&gt; теперь запускаются напрямую, а у всех остальных команд аргументы корректно заключаются в кавычки.&lt;/li&gt;
&lt;li&gt;Исправлено: команды, запущенные из интерфейса, больше не печатают предупреждение &lt;code&gt;NO_COLOR … is ignored due to FORCE_COLOR&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Polyrepo 1.2.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-08-polyrepo-cli-1-2-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-08-polyrepo-cli-1-2-0"/>
    <updated>2026-10-08T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: &lt;code&gt;polyrepo ui&lt;/code&gt; запускает локальный веб-интерфейс и открывает его в браузере. Он входит в пакет и слушает только &lt;code&gt;127.0.0.1&lt;/code&gt; под одноразовым токеном в напечатанном адресе; запросы с чужим &lt;code&gt;Host&lt;/code&gt; или &lt;code&gt;Origin&lt;/code&gt; отклоняются, а всё, что меняет репозиторий, требует явного подтверждения. &lt;code&gt;--port&lt;/code&gt;, &lt;code&gt;--host&lt;/code&gt;, &lt;code&gt;--no-open&lt;/code&gt; и &lt;code&gt;--token&lt;/code&gt; настраивают его. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/polyrepo-cli/guide/ui.html&quot;&gt;Веб-интерфейс&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;strong&gt;Packages&lt;/strong&gt; показывает все пакеты одной таблицей, проблемы посчитаны и работают как фильтры по клику (локальные изменения, не на основной ветке, нет в npm или отстаёт от него, отличается от origin, устаревшие зависимости). Монорепозитории — цветные блоки, которые сворачиваются и выбирают все свои пакеты разом, ветка и статус показаны чипами, а выбранное открывает Bump, Publish, Tag, Sync deps, Switch branch или Run command с уже отмеченными пакетами.&lt;/li&gt;
&lt;li&gt;Новое: &lt;strong&gt;Commands&lt;/strong&gt; — форма для каждой команды с теми же опциями, что у флагов. Список пакетов показывает ветку и наличие локальных изменений у репозитория, умеет фильтровать и запоминает именованные наборы. &lt;strong&gt;Review and run&lt;/strong&gt; показывает сводку того, что изменится, с кнопкой &lt;strong&gt;Preview (dry run)&lt;/strong&gt;; завершённый предпросмотр предлагает &lt;strong&gt;Run for real…&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Новое: мастер &lt;strong&gt;Release&lt;/strong&gt; проводит по шагам: пакеты, версия, опции и итог, и запускает &lt;code&gt;bump&lt;/code&gt;, при желании сначала с предпросмотром.&lt;/li&gt;
&lt;li&gt;Новое: &lt;strong&gt;Runs&lt;/strong&gt; показывают отчёт — первое, что видно у завершённого запуска: счётчики, список &lt;strong&gt;Needs attention&lt;/strong&gt; с проблемами, которых не было в предыдущем запуске, карточку на каждую часть проверки или на каждый пакет и таблицы команд, которые только читают, с действиями &lt;strong&gt;Update…&lt;/strong&gt; и &lt;strong&gt;Fix…&lt;/strong&gt;. Полный лог можно искать, ограничивать проблемами, сворачивать и сохранять. Вопросы команды приходят диалогами, запуск можно отменить, а история хранит запуски вместе с логами.&lt;/li&gt;
&lt;li&gt;Новое: &lt;strong&gt;Settings&lt;/strong&gt; правит конфиг (roots, дополнительные пакеты, хосты GitLab) с выбором папки и живым списком найденных пакетов, показывает, под кем выполнен вход в &lt;code&gt;gh&lt;/code&gt;, &lt;code&gt;glab&lt;/code&gt; и &lt;code&gt;npm&lt;/code&gt; и какие инструменты найдены. Здесь же задаются диапазон цветов блоков монорепозиториев, сохранённые наборы пакетов и системные уведомления.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;Ctrl+K&lt;/code&gt; открывает палитру для страницы, команды, недавнего запуска или пакета.&lt;/li&gt;
&lt;li&gt;Новое: форма Publish и мастер релиза принимают одноразовый пароль для npm-аккаунта с двухфакторной аутентификацией. В историю запусков он не попадает.&lt;/li&gt;
&lt;li&gt;Изменено: команды сообщают о ходе работы через небольшой рантайм, а не печатают напрямую. Вывод в терминале и вопросы остались прежними.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DevToolz 0.3.3</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-07-devtoolz-0-3-3</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-07-devtoolz-0-3-3"/>
    <updated>2026-10-07T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: &lt;code&gt;image-hash&lt;/code&gt; генерирует &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/overview.html&quot;&gt;hazehash&lt;/a&gt; с &lt;code&gt;-t hazehash&lt;/code&gt; (или &lt;code&gt;-t all&lt;/code&gt;). При том же размере он точнее blurhash и thumbhash, хранит соотношение сторон и, только если у изображения есть прозрачные пиксели, альфа-канал. Во всех списках типов хешей и во всех выводах (JSON, CSV, таблица &lt;code&gt;--dry-run&lt;/code&gt;) он идёт первым, перед blurhash. По умолчанию, &lt;code&gt;-t both&lt;/code&gt;, по-прежнему blurhash и thumbhash. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/mediatoolz/guide/image-hash.html#что-генерируется&quot;&gt;Image Hash&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;--budget &amp;lt;bytes&amp;gt;&lt;/code&gt; задаёт наибольший размер одного hazehash, от 7 до 48 байт (по умолчанию &lt;code&gt;28&lt;/code&gt;; формат настроен на диапазон 16–48). Это потолок: плоскому или плавному изображению нужно меньше байт. Бюджет, слишком малый для изображения с прозрачностью (меньше 9 байт), сообщается как проблема этого изображения, а значение вне диапазона 7–48 завершает команду с кодом 2.&lt;/li&gt;
&lt;li&gt;Примечание: &lt;code&gt;--cache&lt;/code&gt; теперь запоминает и бюджет, поэтому кэш-файл, записанный прежней версией, один раз пересчитывается.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.7.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-07-vue-image-kit-1-7-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-07-vue-image-kit-1-7-1"/>
    <updated>2026-10-07T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Исправлено: превью теперь ведёт себя в точности как изображение, вместо которого оно показано. Раньше плейсхолдер &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; был пустым &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; с инлайн &lt;code&gt;width: 100%&lt;/code&gt; и &lt;code&gt;height: auto&lt;/code&gt;, поэтому при &lt;code&gt;width: 50%&lt;/code&gt;, фиксированной высоте или родителе, сжимающемся по содержимому, он отличался по размеру от загруженной картинки, и вёрстка прыгала при начале загрузки. Теперь это &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; с теми же атрибутами &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; и теми же классами (прозрачное изображение того же размера в &lt;code&gt;src&lt;/code&gt;, хеш в фоне), и браузер размеряет его по тем же правилам и тому же CSS, что настоящую картинку. Размер блока не меняется и пока файл скачивается: до прихода первых байт &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; несёт &lt;code&gt;contain-intrinsic-size&lt;/code&gt; из своих &lt;code&gt;width&lt;/code&gt;×&lt;code&gt;height&lt;/code&gt;. Если в тесте или стилях вы искали плейсхолдер как &lt;code&gt;span&lt;/code&gt;, ищите &lt;code&gt;img[aria-hidden=&amp;quot;true&amp;quot;]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.7.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-07-vue-image-kit-1-7-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-07-vue-image-kit-1-7-0"/>
    <updated>2026-10-07T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Плейсхолдеры HazeHash — предпочтительные: новый проп &lt;code&gt;hazehash&lt;/code&gt; у &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; и поле &lt;code&gt;hazehash&lt;/code&gt; в &lt;code&gt;SourcePlaceholder&lt;/code&gt;, &lt;code&gt;ImageMeta&lt;/code&gt; и записях манифеста. Строка в 7–48 байт (по умолчанию 28) из опциональной peer-зависимости &lt;code&gt;hazehash&lt;/code&gt; декодируется в размытое превью с правильными пропорциями и альфа-каналом. &lt;code&gt;hazehash&lt;/code&gt; побеждает &lt;code&gt;blurhash&lt;/code&gt;, &lt;code&gt;thumbhash&lt;/code&gt; и &lt;code&gt;placeholder&lt;/code&gt;; &lt;code&gt;v-lazy-img&lt;/code&gt; и &lt;code&gt;useBackgroundImage()&lt;/code&gt; тоже его используют. Пакет подгружается по требованию; без него один раз пишется предупреждение и берётся следующий плейсхолдер.&lt;/li&gt;
&lt;li&gt;Инструменты сборки умеют делать HazeHash: &lt;code&gt;mode: 'hazehash'&lt;/code&gt; для плагина Vite и опции Nuxt, &lt;code&gt;placeholders --mode hazehash&lt;/code&gt;, &lt;code&gt;generate --hazehash&lt;/code&gt;, импорты &lt;code&gt;?hazehash&lt;/code&gt; и &lt;code&gt;?placeholder=hazehash&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Новая настройка &lt;code&gt;tuning.budget&lt;/code&gt; (&lt;code&gt;--budget&lt;/code&gt;, &lt;code&gt;&amp;amp;budget=&lt;/code&gt; в импорте): размер строки HazeHash в байтах, 7–48, по умолчанию 28.&lt;/li&gt;
&lt;li&gt;Изменено: режим плейсхолдеров по умолчанию — &lt;code&gt;hazehash&lt;/code&gt;, если установлен пакет &lt;code&gt;hazehash&lt;/code&gt;, иначе &lt;code&gt;blurhash&lt;/code&gt;. Чтобы сохранить BlurHash, задайте &lt;code&gt;mode: 'blurhash'&lt;/code&gt;; пакет &lt;code&gt;hazehash&lt;/code&gt; нужно установить в приложение, потому что хеши декодирует браузер.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>HazeHash 0.1.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-06-hazehash-0-1-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-06-hazehash-0-1-1"/>
    <updated>2026-10-06T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Первый релиз: три пакета, &lt;code&gt;hazehash&lt;/code&gt;, &lt;code&gt;hazehash-vue&lt;/code&gt; и &lt;code&gt;hazehash-nuxt&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/overview.html&quot;&gt;Обзор&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hazehash&lt;/code&gt; превращает изображение в хеш из 16–48 байт (по умолчанию 28) и обратно в размытое превью, с соотношением сторон и необязательным альфа-каналом внутри. При 28 байтах средняя перцептивная ошибка на 49% ниже, чем у BlurHash, и на 20% ниже, чем у ThumbHash. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/encoding.html&quot;&gt;Кодирование изображений&lt;/a&gt;, &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/decoding.html&quot;&gt;Декодирование хешей&lt;/a&gt; и &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/benchmark.html&quot;&gt;Бенчмарк&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Точки входа для декодера (&lt;code&gt;hazehash&lt;/code&gt;, &lt;code&gt;hazehash/decode&lt;/code&gt;), энкодера (&lt;code&gt;hazehash/encode&lt;/code&gt;), хелпера для canvas (&lt;code&gt;hazehash/canvas&lt;/code&gt;) и файловых хелперов для Node.js (&lt;code&gt;hazehash/node&lt;/code&gt;, с необязательной peer-зависимостью &lt;code&gt;sharp&lt;/code&gt;). См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/canvas.html&quot;&gt;Рисование в canvas&lt;/a&gt; и &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/node-files.html&quot;&gt;Кодирование файлов в Node.js&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Команда &lt;code&gt;hazehash&lt;/code&gt; с &lt;code&gt;encode&lt;/code&gt;, &lt;code&gt;decode&lt;/code&gt; и &lt;code&gt;info&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/cli-encode.html&quot;&gt;Команда encode&lt;/a&gt; и &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/cli-decode-info.html&quot;&gt;Команды decode и info&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hazehash-vue&lt;/code&gt;: компонент &lt;code&gt;PlaceholderImage&lt;/code&gt; и composable &lt;code&gt;usePlaceholder()&lt;/code&gt;, серверная разметка которых не может разойтись при гидрации. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/placeholder-image.html&quot;&gt;Компонент PlaceholderImage&lt;/a&gt; и &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/use-placeholder.html&quot;&gt;Состояние плейсхолдера&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hazehash-nuxt&lt;/code&gt;: модуль, который регистрирует компонент и генерирует хеши для ваших картинок при сборке, с кэшем по размеру и времени изменения файла. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/nuxt-module.html&quot;&gt;Модуль Nuxt&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Формат версии 1 не будет меняться: хеш декодируется одинаково во всех будущих релизах. Формат описан на странице &lt;a href=&quot;https://npm.vuecraft.ru/packages/hazehash/guide/hash-format.html&quot;&gt;Формат хеша&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.6.2</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-05-vue-image-kit-1-6-2</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-05-vue-image-kit-1-6-2"/>
    <updated>2026-10-05T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Исправлено: с &lt;code&gt;sources&lt;/code&gt; или объектом в &lt;code&gt;src&lt;/code&gt; &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; рендерит &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;, и &lt;code&gt;class&lt;/code&gt;, &lt;code&gt;style&lt;/code&gt; и другие атрибуты, переданные компоненту, попадали на &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;, а не на &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;, который показывает картинку, — поэтому &lt;code&gt;border-radius&lt;/code&gt;, &lt;code&gt;object-fit&lt;/code&gt; и похожие правила из собственного класса пользователя не давали видимого эффекта, хотя тот же класс на обычном &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; работал. Теперь атрибуты всегда попадают на элемент, который показывает картинку: плейсхолдер, блок ошибки или &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;, в том числе внутри &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;. Сам &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; рендерится с &lt;code&gt;display: contents&lt;/code&gt;, поэтому в раскладке не участвует, и &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; раскладывается так, будто стоит сам по себе. Обработчики событий, переданные в &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; (&lt;code&gt;@click&lt;/code&gt; и др.), тоже привязываются к &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; и работают рядом с собственной обработкой &lt;code&gt;load&lt;/code&gt;/&lt;code&gt;error&lt;/code&gt; компонента. Если стиль или тест обращался к &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; через класс или атрибут &lt;code&gt;data-*&lt;/code&gt;, заданный на &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt;, обращайтесь к &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; или к родительскому элементу. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/responsive-images.html#компоновка-без-обертки&quot;&gt;Компоновка без обёртки&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.6.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-05-vue-image-kit-1-6-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-05-vue-image-kit-1-6-1"/>
    <updated>2026-10-05T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Исправлено: начиная с 1.6.0 &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; на сервере рендерил фрагмент, из-за чего &lt;code&gt;class&lt;/code&gt;, &lt;code&gt;style&lt;/code&gt; и другие атрибуты, переданные ему, не попадали на &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;, а Vue печатал предупреждение &lt;code&gt;Extraneous non-props attributes (class) were passed to component but could not be automatically inherited because component renders fragment or text or teleport root nodes&lt;/code&gt;. Теперь фрагмент рендерится только там, где он нужен, — для ленивой картинки с &lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/vimage.html#ssrplaceholder&quot;&gt;&lt;code&gt;ssrPlaceholder&lt;/code&gt;&lt;/a&gt; и готовым превью, — и в этом случае атрибуты передаются на &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; явно. Во всех остальных состояниях на сервере и на клиенте снова один элемент.&lt;/li&gt;
&lt;li&gt;Исправлено: &lt;code&gt;class&lt;/code&gt; теперь добавляется и на изображение внутри &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt; у отложенной картинки, чтобы без JavaScript она выглядела так же.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DevToolz 0.3.2</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-03-devtoolz-0-3-2</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-03-devtoolz-0-3-2"/>
    <updated>2026-10-03T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Исправлено: все опции со списком через запятую (&lt;code&gt;--ext&lt;/code&gt;, &lt;code&gt;--type&lt;/code&gt;, &lt;code&gt;--tags&lt;/code&gt;, &lt;code&gt;--methods&lt;/code&gt;, &lt;code&gt;--lang&lt;/code&gt;, &lt;code&gt;--test-suffix&lt;/code&gt;, &lt;code&gt;--source-ext&lt;/code&gt;) теперь принимают и пробелы, а &lt;code&gt;image-hash&lt;/code&gt; принимает пути через пробел. PowerShell передаёт &lt;code&gt;a,b&lt;/code&gt; программе одним аргументом &lt;code&gt;a b&lt;/code&gt;, и эти опции раньше его отвергали, поэтому &lt;code&gt;devtoolz image-hash -t blurhash,thumbhash,color&lt;/code&gt; там падал.&lt;/li&gt;
&lt;li&gt;Исправлено: пакет теперь собирается автоматически перед каждой публикацией (&lt;code&gt;prepublishOnly&lt;/code&gt;). Версия 0.3.1 ушла со старой сборкой, без исправления выше.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DevToolz 0.3.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-03-devtoolz-0-3-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-03-devtoolz-0-3-1"/>
    <updated>2026-10-03T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Примечание: этот релиз опубликован со сборкой, собранной до исправления списков (см. 0.3.2), поэтому исправления в нём нет. Используйте 0.3.2.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DevToolz 0.3.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-03-devtoolz-0-3-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-03-devtoolz-0-3-0"/>
    <updated>2026-10-03T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: команда &lt;code&gt;image-hash&lt;/code&gt; генерирует плейсхолдеры &lt;a href=&quot;https://blurha.sh&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;blurhash&lt;/a&gt; и &lt;a href=&quot;https://evanw.github.io/thumbhash/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;thumbhash&lt;/a&gt; для растровых изображений. Принимает файлы и/или директории (в том числе через запятую, &lt;code&gt;-r&lt;/code&gt; для поддиректорий) и печатает в stdout, пишет один файл (&lt;code&gt;-o&lt;/code&gt;) или файл на каждое изображение (&lt;code&gt;--per-file&lt;/code&gt;, &lt;code&gt;--out-dir&lt;/code&gt;, имена настраиваются через &lt;code&gt;--suffix&lt;/code&gt; и &lt;code&gt;--out-ext&lt;/code&gt;, например &lt;code&gt;photo.jpg.blurhash.txt&lt;/code&gt;). Форматы: &lt;code&gt;json&lt;/code&gt;, &lt;code&gt;plain&lt;/code&gt;, &lt;code&gt;csv&lt;/code&gt;, &lt;code&gt;ts&lt;/code&gt; и &lt;code&gt;js&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/mediatoolz/guide/image-hash.html&quot;&gt;Хеши изображений&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;image-hash&lt;/code&gt; требует нативную библиотеку &lt;code&gt;sharp&lt;/code&gt;, которая вместе с devtoolz не ставится. Первый запуск предлагает установить её в &lt;code&gt;~/.devtoolz/deps&lt;/code&gt; (&lt;code&gt;-y&lt;/code&gt;/&lt;code&gt;--yes&lt;/code&gt; соглашается заранее; без терминала и без &lt;code&gt;-y&lt;/code&gt; команда останавливается с сообщением). &lt;code&gt;sharp&lt;/code&gt;, уже установленная рядом с devtoolz, используется как есть.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;image-hash&lt;/code&gt; умеет ещё доминирующий цвет (&lt;code&gt;color&lt;/code&gt;) и крошечный PNG в виде data URI (&lt;code&gt;preview&lt;/code&gt;) через &lt;code&gt;-t&lt;/code&gt;, а &lt;code&gt;--components auto&lt;/code&gt; подбирает компоненты blurhash по соотношению сторон.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;image-hash&lt;/code&gt; принимает &lt;code&gt;http(s)&lt;/code&gt; URL и список путей из файла или stdin (&lt;code&gt;--files-from&lt;/code&gt;), а ключи в выводе настраиваются через &lt;code&gt;--key-base&lt;/code&gt; и &lt;code&gt;--key-prefix&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;image-hash --cache&lt;/code&gt; пропускает неизменившиеся изображения, &lt;code&gt;--update&lt;/code&gt; вливает результат в существующий выходной файл, &lt;code&gt;--prune&lt;/code&gt; убирает записи пропавших изображений, а &lt;code&gt;--check&lt;/code&gt; падает (код 1), если выходные файлы отсутствуют или устарели, — сделан для CI. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/mediatoolz/guide/image-hash.html#как-держать-выходнои-фаил-актуальным&quot;&gt;Как держать выходной файл актуальным&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;image-hash&lt;/code&gt; показывает счётчик прогресса в терминале, находит &lt;code&gt;sharp&lt;/code&gt;, уже установленный в проекте, где команда запущена, правильно хеширует CMYK-изображения, отклоняет оборванные файлы и изображения больше &lt;code&gt;--max-pixels&lt;/code&gt; и объясняет такие сбои простыми словами.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;image-hash --dry-run&lt;/code&gt; ничего не пишет и показывает результат таблицей, а под ней перечисляет файлы, которые были бы записаны.&lt;/li&gt;
&lt;li&gt;Новое: цветной вывод у каждой команды по одной общей палитре — пути, позиции &lt;code&gt;:строка:столбец&lt;/code&gt;, имена, заголовки, подсказки и иконки статуса &lt;code&gt;full-check&lt;/code&gt; получили каждый свой цвет. &lt;code&gt;--color&lt;/code&gt; (или &lt;code&gt;FORCE_COLOR&lt;/code&gt;) включает цвет, когда вывод перенаправлен или идёт в CI; &lt;code&gt;NO_COLOR&lt;/code&gt;, &lt;code&gt;TERM=dumb&lt;/code&gt; и &lt;code&gt;--plain&lt;/code&gt; оставляют его выключенным. Текст каждого отчёта не изменился, добавляются только escape-коды. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/overview.html#вывод-и-цвета&quot;&gt;Вывод и цвета&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Изменено: &lt;code&gt;--quiet&lt;/code&gt; больше не выключает цвет, а только убирает баннер и вывод чистого прогона. &lt;code&gt;--plain&lt;/code&gt; по-прежнему выключает сразу цвет, баннер и поздравление.&lt;/li&gt;
&lt;li&gt;Добавлено в программный API: &lt;code&gt;runImageHash&lt;/code&gt; и &lt;code&gt;renderImageHashReport&lt;/code&gt;, с типами опций, отчёта и записи.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.6.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-03-vue-image-kit-1-6-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-03-vue-image-kit-1-6-0"/>
    <updated>2026-10-03T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Автоматические плейсхолдеры для импортируемых изображений. &lt;code&gt;placeholders: { imports: true }&lt;/code&gt; (в Nuxt: &lt;code&gt;vueImageKit: { placeholders: { imports: true } }&lt;/code&gt;) считает плейсхолдер при сборке для каждого изображения, которое скрипт или однофайловый компонент импортирует default-импортом, — включая импорты, которые Vue генерирует из &lt;code&gt;src=&amp;quot;…&amp;quot;&lt;/code&gt; в шаблоне, и те, в которые разворачивается &lt;code&gt;import.meta.glob(…, { eager: true })&lt;/code&gt;. Без запроса &lt;code&gt;?placeholder&lt;/code&gt; и без правок шаблонов: плейсхолдер регистрируется под самим импортированным значением (dev-URL или хешированный URL сборки), поэтому &lt;code&gt;&amp;lt;VImage :src=&amp;quot;hero&amp;quot; /&amp;gt;&lt;/code&gt; сам находит своё размытие и размер — в dev, в сборке и при серверном рендеринге. Настраивается через &lt;code&gt;mode&lt;/code&gt;, &lt;code&gt;extensions&lt;/code&gt; и &lt;code&gt;exclude&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/vite-plugin.html#плеисхолдер-для-каждого-импортируемого-изображения&quot;&gt;Плейсхолдер для каждого импортируемого изображения&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новый экспорт &lt;code&gt;registerPlaceholder(src, data)&lt;/code&gt;. &lt;code&gt;VImage&lt;/code&gt;, &lt;code&gt;v-lazy-img&lt;/code&gt; и &lt;code&gt;useBackgroundImage()&lt;/code&gt; ищут &lt;code&gt;src&lt;/code&gt; в этом реестре после манифеста &lt;code&gt;placeholders&lt;/code&gt;, так что манифест передавать не обязательно.&lt;/li&gt;
&lt;li&gt;Битое растровое изображение больше не роняет сборку, когда плейсхолдер считается через переписанные импорты: печатается предупреждение, и плейсхолдера у него нет.&lt;/li&gt;
&lt;li&gt;Новый проп &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; — &lt;code&gt;ssrPlaceholder&lt;/code&gt; (включается явно, по умолчанию &lt;code&gt;false&lt;/code&gt;). Отрендеренный на сервере &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; получает готовое превью (&lt;code&gt;data:&lt;/code&gt; URL из &lt;code&gt;placeholder&lt;/code&gt;, &lt;code&gt;image.placeholder&lt;/code&gt; или реестра) как CSS-фон, поэтому у картинки есть blur ещё до запуска JavaScript; без пропса ничего не меняется. Ленивая картинка при этом ещё и удерживается: сервер отдаёт прозрачный пиксель вместо настоящего &lt;code&gt;src&lt;/code&gt;, а настоящий &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; кладёт в &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt;, поэтому тяжёлый файл скачивается только когда картинка приближается к области просмотра, а поисковики и посетители без JavaScript всё равно его получают (нетерпеливая картинка — &lt;code&gt;lazy=&amp;quot;false&amp;quot;&lt;/code&gt; или &lt;code&gt;priority&lt;/code&gt; — сохраняет &lt;code&gt;src&lt;/code&gt;). После гидрации превью продолжает показываться под картинкой, а сервер и клиент рендерят одинаковый результат, поэтому hydration mismatch нет. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/placeholders.html#превью-в-серверном-html&quot;&gt;Превью в серверном HTML&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новая опция &lt;code&gt;placeholders.imports.preview&lt;/code&gt; (&lt;code&gt;true&lt;/code&gt; или список шаблонов путей: директория, точный файл, часть пути или glob вроде &lt;code&gt;src/**/hero-*.webp&lt;/code&gt;; сравниваются с настоящим путём файла от корня проекта, поэтому импорты через алиасы работают). &lt;code&gt;exclude&lt;/code&gt; принимает те же шаблоны. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/vite-plugin.html#выбор-изображении-по-пути&quot;&gt;Выбор изображений по пути&lt;/a&gt;. Плагин дополнительно рисует готовое превью для импортируемых изображений и регистрирует его, поэтому в шаблоне достаточно &lt;code&gt;&amp;lt;VImage :src=&amp;quot;hero&amp;quot; ssr-placeholder /&amp;gt;&lt;/code&gt;. По умолчанию выключена; на этапе сборки нужен пакет &lt;code&gt;thumbhash&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/vite-plugin.html#готовое-превью-для-серверного-рендеринга&quot;&gt;Готовое превью для серверного рендеринга&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Записи реестра и &lt;code&gt;registerPlaceholder()&lt;/code&gt; принимают готовое превью (&lt;code&gt;placeholder&lt;/code&gt; или &lt;code&gt;preview&lt;/code&gt;). Реестр живёт в &lt;code&gt;globalThis&lt;/code&gt;, поэтому серверная и клиентская копии пакета используют один и тот же.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.5.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-03-vue-image-kit-1-5-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-03-vue-image-kit-1-5-0"/>
    <updated>2026-10-03T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Импорты плейсхолдеров принимают список полей. &lt;code&gt;?placeholder=color,blurhash&lt;/code&gt; возвращает ровно эти поля; поля — &lt;code&gt;blurhash&lt;/code&gt;, &lt;code&gt;thumbhash&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;, &lt;code&gt;size&lt;/code&gt;, &lt;code&gt;preview&lt;/code&gt; (крошечный PNG в виде data URI), &lt;code&gt;aspect&lt;/code&gt; (&lt;code&gt;width / height&lt;/code&gt;) и &lt;code&gt;all&lt;/code&gt;, в любом порядке. &lt;code&gt;&amp;amp;shape=raw&lt;/code&gt; возвращает имена как в списке (а &lt;code&gt;size&lt;/code&gt; — объектом) вместо имён пропсов &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt;. Старые одиночные значения (&lt;code&gt;?placeholder&lt;/code&gt;, &lt;code&gt;=blurhash&lt;/code&gt;, &lt;code&gt;=thumbhash&lt;/code&gt;, &lt;code&gt;=color&lt;/code&gt;) сохраняют свою форму. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/vite-plugin.html#выбор-того-что-считать&quot;&gt;Выбор того, что считать&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;По одному значению: &lt;code&gt;?color&lt;/code&gt;, &lt;code&gt;?size&lt;/code&gt;, &lt;code&gt;?aspect&lt;/code&gt; и &lt;code&gt;?preview&lt;/code&gt; рядом с уже существующими &lt;code&gt;?blurhash&lt;/code&gt; и &lt;code&gt;?thumbhash&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Настройки для одного импорта: &lt;code&gt;?blurhash&amp;amp;components=6x4&lt;/code&gt;, &lt;code&gt;&amp;amp;sample=64&lt;/code&gt;, &lt;code&gt;&amp;amp;strategy=average&lt;/code&gt;. Они никогда не затрагивают общий кэш и манифест.&lt;/li&gt;
&lt;li&gt;Новая опция &lt;code&gt;types&lt;/code&gt; Vite-плагина. Шаблон модуля TypeScript допускает одну &lt;code&gt;*&lt;/code&gt;, поэтому импорт со списком или с настройками нельзя типизировать встроенными декларациями; с &lt;code&gt;types: true&lt;/code&gt; плагин пишет &lt;code&gt;src/vik-imports.d.ts&lt;/code&gt; для каждого такого импорта, который встретил (вместо этого можно указать путь), со свободной типизацией и необязательными полями.&lt;/li&gt;
&lt;li&gt;Встроенные декларации (&lt;code&gt;@macrulez/vue-image-kit/vite/client&lt;/code&gt;) дополнены &lt;code&gt;?color&lt;/code&gt;, &lt;code&gt;?size&lt;/code&gt;, &lt;code&gt;?preview&lt;/code&gt; и &lt;code&gt;?aspect&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Новое скалярное имя принимается только как голый флаг (&lt;code&gt;?size&lt;/code&gt;, а не &lt;code&gt;?size=large&lt;/code&gt;), так что одноимённый параметр другого плагина не перехватывается.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.4.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-03-vue-image-kit-1-4-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-03-vue-image-kit-1-4-1"/>
    <updated>2026-10-03T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Исправлено: в &lt;code&gt;vite dev&lt;/code&gt; плагин мог бесконечно перегенерировать изображения. Горячее обновление запускало &lt;code&gt;generate()&lt;/code&gt; для любого изменившегося файла-изображения, включая файлы, которые сам &lt;code&gt;generate()&lt;/code&gt; писал в &lt;code&gt;output&lt;/code&gt;, а при &lt;code&gt;incremental: false&lt;/code&gt; каждый проход перезаписывал их и запускал следующий — сотни запусков в секунду. Теперь горячее обновление запускается только для изображения внутри &lt;code&gt;input&lt;/code&gt; и никогда для изображения внутри &lt;code&gt;output&lt;/code&gt;, а проходы не накладываются друг на друга: изменения, пришедшие во время работы, объединяются в один повторный запуск. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/vite-plugin.html&quot;&gt;Vite-плагин&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Исправлено: папка &lt;code&gt;output&lt;/code&gt; внутри &lt;code&gt;input&lt;/code&gt; пропускается при сканировании &lt;code&gt;input&lt;/code&gt; и больше не подаётся обратно как исходные изображения.&lt;/li&gt;
&lt;li&gt;Исправлено: dev-сервер больше не перезагружает страницу на каждый сгенерированный файл; манифест плейсхолдеров следит только за папками из &lt;code&gt;placeholders.dirs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Исправлено: огромный SVG (например, 30000×30000) ронял &lt;code&gt;?placeholder&lt;/code&gt; на лимите пикселей sharp. Теперь размер читается из собственных &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt;/&lt;code&gt;viewBox&lt;/code&gt; файла, а цвет считается по небольшому рендеру.&lt;/li&gt;
&lt;li&gt;Исправлено: битый SVG ронял всю сборку на &lt;code&gt;?placeholder&lt;/code&gt;. Теперь плагин предупреждает и возвращает объявленный размер (или пустой объект); битое растровое изображение по-прежнему падает.&lt;/li&gt;
&lt;li&gt;Изменено: &lt;code&gt;?blurhash&lt;/code&gt; и &lt;code&gt;?thumbhash&lt;/code&gt; для SVG печатают предупреждение, что у вектора есть только цвет, и указывают на &lt;code&gt;?placeholder&lt;/code&gt;, вместо молчаливого возврата пустой строки.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Responsive Media 2.2.2</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-responsive-media-2-2-2</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-responsive-media-2-2-2"/>
    <updated>2026-10-02T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Изменено: общий объект &lt;code&gt;responsiveState&lt;/code&gt;, который создаётся один раз на весь пакет, раньше создавался в момент загрузки любой части пакета, поэтому сборщик не мог его убрать. Теперь он создаётся в отдельном исходном файле, а в &lt;code&gt;package.json&lt;/code&gt; пакет объявляет &lt;code&gt;sideEffects: false&lt;/code&gt;. Сборщик больше не оставляет общее состояние, если импортируется только часть пакета: &lt;code&gt;useMediaQuery&lt;/code&gt; из &lt;code&gt;responsive-media/vue&lt;/code&gt; уменьшился примерно с 6,7 кБ до 0,6 кБ в минифицированном виде, а &lt;code&gt;responsive-media/container&lt;/code&gt; — с 7,7 кБ до 6,8 кБ. Поведение и публичный API не изменились.&lt;/li&gt;
&lt;li&gt;Добавлено: &lt;code&gt;npm run size&lt;/code&gt; в репозитории пакета измеряет все точки входа и типичные импорты. Результат tree-shaking охраняет тест. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/responsive-media/guide/reference.html&quot;&gt;Справочник&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Responsive Media 2.2.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-responsive-media-2-2-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-responsive-media-2-2-1"/>
    <updated>2026-10-02T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Исправлено: при отложенной гидратации компонент, который гидратируется позже первого тика после монтирования — асинхронный компонент, лениво гидратируемая секция, — встречал настоящее состояние вместо серверного и расходился. Плагин Vue теперь принимает &lt;code&gt;commit: 'manual'&lt;/code&gt;: значения сервера остаются, пока не вызвана &lt;code&gt;commitHydration()&lt;/code&gt;, а запасным вариантом служит &lt;code&gt;commitTimeout&lt;/code&gt; (по умолчанию 10 секунд); &lt;code&gt;defineResponsive()&lt;/code&gt; возвращает &lt;code&gt;commitHydration&lt;/code&gt; рядом с &lt;code&gt;plugin&lt;/code&gt;. Модуль Nuxt использует это: он переключает, когда Nuxt сообщает &lt;code&gt;app:suspense:resolve&lt;/code&gt;, то есть когда страница догидратировалась. Для обычного Vue по умолчанию остаётся &lt;code&gt;'auto'&lt;/code&gt; — следующий тик после монтирования. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/responsive-media/guide/ssr-hydration.html&quot;&gt;SSR и гидратация&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Responsive Media 2.2.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-responsive-media-2-2-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-responsive-media-2-2-0"/>
    <updated>2026-10-02T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: гидратация без несовпадений. В Vue &lt;code&gt;defineResponsive()&lt;/code&gt; принимает &lt;code&gt;hydration: 'deferred'&lt;/code&gt;: пока приложение монтируется поверх серверной разметки, плагин держит значения сервера и применяет настоящие на следующем тике, так что Vue не сообщает о несовпадении при гидратации. Клиентское приложение никогда не откладывается. В React хуки теперь возвращают серверный снимок (&lt;code&gt;getSsrState()&lt;/code&gt;) как &lt;code&gt;getServerSnapshot&lt;/code&gt;, поэтому гидратация больше не заканчивается recoverable-ошибкой, когда размер браузера отличается от &lt;code&gt;ssrState&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/responsive-media/guide/ssr-hydration.html&quot;&gt;SSR и гидратация&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: подсказки запроса для сервера. &lt;code&gt;resolveSsrState(config, input, options?)&lt;/code&gt; выбирает серверное состояние по &lt;code&gt;cookie&lt;/code&gt; (собственные &lt;code&gt;&amp;lt;ширина&amp;gt;x&amp;lt;высота&amp;gt;&lt;/code&gt; браузера) и &lt;code&gt;user-agent&lt;/code&gt; (&lt;code&gt;mobile&lt;/code&gt;, &lt;code&gt;tablet&lt;/code&gt; или &lt;code&gt;desktop&lt;/code&gt;), а составными частями служат &lt;code&gt;detectDevice()&lt;/code&gt;, &lt;code&gt;serializeViewportCookie()&lt;/code&gt;, &lt;code&gt;parseViewportCookie()&lt;/code&gt;, &lt;code&gt;statesFromSize()&lt;/code&gt; и &lt;code&gt;getSsrState()&lt;/code&gt;. В Vue плагин принимает результат как &lt;code&gt;app.use(plugin, { ssrState })&lt;/code&gt;, а на сервере даёт каждому приложению собственное состояние, так что параллельные запросы больше не делят одно.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;useMediaQuery()&lt;/code&gt; в Vue принимает строку, ref или геттер и пересоздаёт подписку при изменении запроса.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;useResponsiveValue(map, fallback?)&lt;/code&gt; в Vue и React — значение первого активного брейкпоинта из &lt;code&gt;map&lt;/code&gt;; типизируется по конфигу, если пришёл из &lt;code&gt;defineResponsive()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;useUserPreferences()&lt;/code&gt; в Vue и React — &lt;code&gt;dark&lt;/code&gt;, &lt;code&gt;light&lt;/code&gt;, &lt;code&gt;reducedMotion&lt;/code&gt;, &lt;code&gt;highContrast&lt;/code&gt;, &lt;code&gt;lowContrast&lt;/code&gt;, &lt;code&gt;noHover&lt;/code&gt;, &lt;code&gt;coarsePointer&lt;/code&gt;, &lt;code&gt;forcedColors&lt;/code&gt; и &lt;code&gt;print&lt;/code&gt; поверх пресета доступности, без настройки; и &lt;code&gt;getUserPreferencesState()&lt;/code&gt; для обычного JavaScript.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;useViewportSize(options?)&lt;/code&gt; в Vue и React, а в ядре &lt;code&gt;getViewportSize()&lt;/code&gt; / &lt;code&gt;subscribeViewportSize()&lt;/code&gt; — размер окна числами, с ограничением частоты.&lt;/li&gt;
&lt;li&gt;Новое: CSS из того же конфига — &lt;code&gt;toMediaQueries()&lt;/code&gt;, &lt;code&gt;toScssModule()&lt;/code&gt;, &lt;code&gt;toScssMap()&lt;/code&gt;, &lt;code&gt;toCustomMedia()&lt;/code&gt; и &lt;code&gt;toTailwindScreens()&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/responsive-media/guide/css-integration.html&quot;&gt;Интеграция с CSS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;responsive-media/testing&lt;/code&gt; — &lt;code&gt;createViewportMock()&lt;/code&gt; заменяет &lt;code&gt;window.matchMedia&lt;/code&gt; управляемым вьюпортом (&lt;code&gt;setViewport()&lt;/code&gt;, &lt;code&gt;setFeature()&lt;/code&gt;), а &lt;code&gt;evaluateMediaQuery()&lt;/code&gt; — сам вычислитель. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/responsive-media/guide/testing.html&quot;&gt;Тестирование&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое в модуле Nuxt: &lt;code&gt;hydration&lt;/code&gt; (по умолчанию &lt;code&gt;'deferred'&lt;/code&gt;), &lt;code&gt;ssrHints&lt;/code&gt; (&lt;code&gt;'cookie'&lt;/code&gt;, &lt;code&gt;'user-agent'&lt;/code&gt;), &lt;code&gt;ssrDevices&lt;/code&gt;, &lt;code&gt;cookie&lt;/code&gt;, &lt;code&gt;devBadge&lt;/code&gt; (плашка с брейкпоинтом при разработке) и &lt;code&gt;css&lt;/code&gt; (&lt;code&gt;scss&lt;/code&gt;, &lt;code&gt;customMedia&lt;/code&gt; — генерируемые файлы стилей). &lt;code&gt;useResponsiveValue&lt;/code&gt;, &lt;code&gt;useUserPreferences&lt;/code&gt; и &lt;code&gt;useViewportSize&lt;/code&gt; тоже подключаются автоматически. Ключ &lt;code&gt;responsive&lt;/code&gt; в &lt;code&gt;nuxt.config.ts&lt;/code&gt; теперь типизирован, так что редактор подсказывает и проверяет его. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/responsive-media/guide/nuxt-integration.html&quot;&gt;Интеграция с Nuxt&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Изменено: модуль Nuxt теперь по умолчанию использует &lt;code&gt;hydration: 'deferred'&lt;/code&gt;, так что первый рендер на клиенте использует значения сервера, а настоящие приходят сразу после монтирования. Чтобы сохранить поведение 2.1, задайте &lt;code&gt;hydration: 'immediate'&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Исправлено: &lt;code&gt;useResponsive()&lt;/code&gt; в React возвращал настоящее состояние как серверный снимок, из-за чего гидратация расходилась всякий раз, когда размер браузера отличался от догадки сервера. Теперь он возвращает серверный снимок.&lt;/li&gt;
&lt;li&gt;Документация: &lt;a href=&quot;https://npm.vuecraft.ru/packages/responsive-media/guide/other-frameworks.html&quot;&gt;Другие фреймворки&lt;/a&gt; показывает Svelte, Solid и Angular на существующем объекте состояния, который уже следует контракту стора.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Responsive Media 2.1.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-responsive-media-2-1-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-responsive-media-2-1-0"/>
    <updated>2026-10-02T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: модуль Nuxt &lt;code&gt;responsive-media/nuxt&lt;/code&gt;. Опишите брейкпоинты один раз в ключе
&lt;code&gt;responsive&lt;/code&gt; файла &lt;code&gt;nuxt.config.ts&lt;/code&gt; (&lt;code&gt;breakpoints&lt;/code&gt;, &lt;code&gt;order&lt;/code&gt;, &lt;code&gt;debounce&lt;/code&gt;,
&lt;code&gt;ssrState&lt;/code&gt;); &lt;code&gt;useResponsive()&lt;/code&gt; и &lt;code&gt;useBreakpoints()&lt;/code&gt; подключаются автоматически
и типизированы по этим брейкпоинтам, &lt;code&gt;useMediaQuery()&lt;/code&gt; и &lt;code&gt;useContainerState()&lt;/code&gt;
тоже подключаются автоматически, а плагин устанавливает общее состояние на
приложение. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/responsive-media/guide/nuxt-integration.html&quot;&gt;Интеграция с Nuxt&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;defineResponsive(config, options?)&lt;/code&gt; в &lt;code&gt;responsive-media/vue&lt;/code&gt; и
&lt;code&gt;responsive-media/react&lt;/code&gt;. Она применяет конфиг и возвращает &lt;code&gt;useResponsive&lt;/code&gt; и
&lt;code&gt;useBreakpoints&lt;/code&gt; (в Vue ещё и &lt;code&gt;plugin&lt;/code&gt;), у которых состояние и ключи
брейкпоинтов выводятся из &lt;code&gt;config&lt;/code&gt;, так что опечатка вроде &lt;code&gt;isAbove('nope')&lt;/code&gt; —
ошибка компиляции, а обобщённый параметр писать вручную не нужно.&lt;/li&gt;
&lt;li&gt;Новое: опция &lt;code&gt;ssrState&lt;/code&gt; в &lt;code&gt;SetConfigOptions&lt;/code&gt;. Когда &lt;code&gt;matchMedia&lt;/code&gt; или
&lt;code&gt;ResizeObserver&lt;/code&gt; недоступны — на сервере, — перечисленные ключи принимают
эти значения вместо &lt;code&gt;false&lt;/code&gt;, так что сервер может отрендерить раскладку. Она
работает для &lt;code&gt;createResponsiveState()&lt;/code&gt;, &lt;code&gt;createContainerState()&lt;/code&gt;,
&lt;code&gt;setResponsiveConfig()&lt;/code&gt; и модуля Nuxt.&lt;/li&gt;
&lt;li&gt;Типы: &lt;code&gt;useContainerState()&lt;/code&gt; выводит ключи возвращаемого состояния из конфига
(Vue и React), а &lt;code&gt;BreakpointHelpers&lt;/code&gt; принимает необязательный тип ключа,
&lt;code&gt;BreakpointHelpers&amp;lt;K extends string = string&amp;gt;&lt;/code&gt;. Существующий код продолжает
компилироваться.&lt;/li&gt;
&lt;li&gt;Исправлено: &lt;code&gt;useBreakpoints()&lt;/code&gt; в Vue игнорировал заданный &lt;code&gt;order&lt;/code&gt;, когда
состояние предоставлялось через &lt;code&gt;ResponsivePlugin&lt;/code&gt;, и использовал порядок ключей
конфига — поэтому &lt;code&gt;current&lt;/code&gt; мог называть не тот брейкпоинт, если два порядка
различались. Теперь используется заданный &lt;code&gt;order&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Новая необязательная peer-зависимость: &lt;code&gt;@nuxt/kit&lt;/code&gt; (&lt;code&gt;^3.9.0 || ^4.0.0&lt;/code&gt;), нужная
только для &lt;code&gt;responsive-media/nuxt&lt;/code&gt;; Nuxt её уже предоставляет.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Visual Linker 0.4.3</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-visual-linker-0-4-3</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-visual-linker-0-4-3"/>
    <updated>2026-10-02T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Изменено (поведение по умолчанию): &lt;code&gt;hover&lt;/code&gt; и &lt;code&gt;highlight&lt;/code&gt; теперь включаются по запросу.&lt;/strong&gt; Раньше линия реагировала на курсор в любой диаграмме: получала состояние &lt;code&gt;hover&lt;/code&gt; с прибавкой к толщине, показывала курсор-указатель над своей областью нажатия, а наведение на блок подсвечивало его соединения. Теперь ничего из этого не происходит, пока вы не включите режим, так что диаграмма, на которую просто смотрят, остаётся неподвижной. Курсор-указатель на линии появляется, только если для неё включён hover или она выделяемая. Чтобы вернуть прежнее поведение, задайте &lt;code&gt;interaction: { hover: true, highlight: true }&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Новое: &lt;code&gt;interaction.hover&lt;/code&gt; и &lt;code&gt;interaction.highlight&lt;/code&gt;.&lt;/strong&gt; Два независимых флага, оба по умолчанию &lt;code&gt;false&lt;/code&gt;. &lt;code&gt;hover&lt;/code&gt; — курсор над линией, &lt;code&gt;highlight&lt;/code&gt; — курсор над блоком подсвечивает его соединения. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/states.html#включение-hover-и-highlight&quot;&gt;Визуальные состояния&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Новое: &lt;code&gt;hoverable&lt;/code&gt; у соединения и &lt;code&gt;highlightable&lt;/code&gt; у блока.&lt;/strong&gt; Каждый включает или выключает свой режим для одной сущности, и локальное значение сильнее глобального. &lt;code&gt;highlightable&lt;/code&gt; также доступен как опция &lt;code&gt;v-vl-block&lt;/code&gt;, поле пропа &lt;code&gt;blocks&lt;/code&gt; и атрибут &lt;code&gt;data-vl-highlightable&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Без изменений:&lt;/strong&gt; события &lt;code&gt;connection:mouseenter&lt;/code&gt;, &lt;code&gt;connection:mouseleave&lt;/code&gt;, &lt;code&gt;connection:click&lt;/code&gt;, &lt;code&gt;block:mouseenter&lt;/code&gt; и &lt;code&gt;block:mouseleave&lt;/code&gt; приходят как раньше, а состояния &lt;code&gt;selected&lt;/code&gt; и &lt;code&gt;focus&lt;/code&gt;, выделение и управление с клавиатуры от новых флагов не зависят. Корзина &lt;code&gt;hover&lt;/code&gt; или &lt;code&gt;highlight&lt;/code&gt; ничего не делает, пока её режим выключен. Оба флага можно менять через &lt;code&gt;setConfig&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Visual Linker 0.4.2</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-visual-linker-0-4-2</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-visual-linker-0-4-2"/>
    <updated>2026-10-02T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Порт с якорем больше не прижимается обрезающей обёрткой внутри якорного блока.&lt;/strong&gt; У порта с &lt;code&gt;anchorBlockId&lt;/code&gt; или &lt;code&gt;anchorEl&lt;/code&gt; точка рисуется на границе якоря, но обрезан ли он, решала именно эта точка. Строка внутри элемента с &lt;code&gt;overflow: hidden&lt;/code&gt; — скруглённого переключателя, карточки — внутри блока с отступами, привязанная к нижней границе блока, имеет точку ниже обёртки, поэтому её линию подтягивало к краю обёртки, и она теряла маркер и точку порта. Теперь, обрезан ли такой порт, решает его собственный элемент: видимая строка оставляет точку на границе якоря, а ушедшая за край прокрутки прижимается, как раньше. Порты без якоря не изменились. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/scrolling-containers.html&quot;&gt;Прокручиваемые контейнеры&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Visual Linker 0.4.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-visual-linker-0-4-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-visual-linker-0-4-1"/>
    <updated>2026-10-02T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Строки принимаются везде, где был enum.&lt;/strong&gt; Типы &lt;code&gt;lines.curve&lt;/code&gt;, &lt;code&gt;shape&lt;/code&gt; и &lt;code&gt;orient&lt;/code&gt; маркера и &lt;code&gt;side&lt;/code&gt; порта были объединениями членов enum'ов, поэтому TypeScript отклонял &lt;code&gt;curve: 'straight'&lt;/code&gt; или &lt;code&gt;shape: 'arrow'&lt;/code&gt; с ошибкой &lt;code&gt;Type '&amp;quot;straight&amp;quot;' is not assignable to type 'ConnectionCurve'&lt;/code&gt;, хотя в рантайме обе записи работали. Теперь это обычные объединения строк (&lt;code&gt;'bezier' | 'straight' | 'smoothstep'&lt;/code&gt;, &lt;code&gt;'circle' | 'square' | 'diamond' | 'arrow'&lt;/code&gt;, &lt;code&gt;'top' | 'right' | 'bottom' | 'left'&lt;/code&gt;, &lt;code&gt;'auto' | 'fixed'&lt;/code&gt;), и члены enum'ов под них по-прежнему подходят, так что существующий код продолжает компилироваться. &lt;code&gt;VLConnectionCurveEnum&lt;/code&gt;, &lt;code&gt;VLMarkerShapeEnum&lt;/code&gt;, &lt;code&gt;VLFixedSideEnum&lt;/code&gt; и &lt;code&gt;VLOrientEnum&lt;/code&gt; по-прежнему экспортируются. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/configuration.html&quot;&gt;Структура конфигурации&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Visual Linker 0.4.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-visual-linker-0-4-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-02-visual-linker-0-4-0"/>
    <updated>2026-10-02T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Breaking (все пакеты):&lt;/strong&gt; плоский &lt;code&gt;VisualLinkerOptions&lt;/code&gt; заменён одним структурированным &lt;code&gt;VisualLinkerConfig&lt;/code&gt;, разбитым по тому, что он оформляет: &lt;code&gt;theme&lt;/code&gt;, &lt;code&gt;lines&lt;/code&gt;, &lt;code&gt;markers&lt;/code&gt;, &lt;code&gt;ports&lt;/code&gt;, &lt;code&gt;labels&lt;/code&gt;, &lt;code&gt;blocks&lt;/code&gt; и &lt;code&gt;interaction&lt;/code&gt;. Все опции &lt;code&gt;defaultXxx&lt;/code&gt; убраны; у каждой настройки теперь есть место в группе. &lt;code&gt;style&lt;/code&gt; соединения имеет ту же форму, что и группа &lt;code&gt;lines&lt;/code&gt;, плюс &lt;code&gt;markers: { start, end }&lt;/code&gt;. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/configuration.html&quot;&gt;Структура конфигурации&lt;/a&gt;. Старые имена соответствуют новым так:&lt;/p&gt;
&lt;table tabindex=&quot;0&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;0.3.x&lt;/th&gt;
&lt;th&gt;0.4.0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;defaultCurve&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lines.curve&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;defaultCurvature&lt;/code&gt;, &lt;code&gt;defaultCurveMinReach&lt;/code&gt;, &lt;code&gt;defaultCurveMaxReach&lt;/code&gt;, &lt;code&gt;defaultCurveAngleBlend&lt;/code&gt;, &lt;code&gt;defaultCurveAngleMaxOffset&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lines.bezier.curvature&lt;/code&gt;, &lt;code&gt;minReach&lt;/code&gt;, &lt;code&gt;maxReach&lt;/code&gt;, &lt;code&gt;angleBlend&lt;/code&gt;, &lt;code&gt;angleMaxOffset&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;defaultCornerRadius&lt;/code&gt;, &lt;code&gt;defaultMaxTrunkReach&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lines.smoothstep.cornerRadius&lt;/code&gt;, &lt;code&gt;lines.smoothstep.maxTrunkReach&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;avoidObstacles&lt;/code&gt;, &lt;code&gt;obstaclePadding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lines.routing.avoidObstacles&lt;/code&gt;, &lt;code&gt;lines.routing.padding&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jumps&lt;/code&gt;, &lt;code&gt;defaultAnimated&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lines.jumps&lt;/code&gt;, &lt;code&gt;lines.animated&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;showPorts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ports.show&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;defaultPortRadius&lt;/code&gt;, &lt;code&gt;defaultPortColor&lt;/code&gt;, &lt;code&gt;defaultPortStrokeColor&lt;/code&gt;, &lt;code&gt;defaultPortStrokeWidth&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ports.radius&lt;/code&gt;, &lt;code&gt;ports.fill&lt;/code&gt;, &lt;code&gt;ports.stroke&lt;/code&gt;, &lt;code&gt;ports.strokeWidth&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;defaultPortSpread&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ports.spread&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;defaultCircleMarkerSize&lt;/code&gt;, &lt;code&gt;defaultSquareMarkerSize&lt;/code&gt;, &lt;code&gt;defaultDiamondMarkerSize&lt;/code&gt;, &lt;code&gt;defaultArrowMarkerSize&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;markers.sizes.circle&lt;/code&gt;, &lt;code&gt;square&lt;/code&gt;, &lt;code&gt;diamond&lt;/code&gt;, &lt;code&gt;arrow&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draggable&lt;/code&gt;, &lt;code&gt;dragGridSize&lt;/code&gt;, &lt;code&gt;dragBounds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;blocks.draggable&lt;/code&gt;, &lt;code&gt;blocks.drag.grid&lt;/code&gt;, &lt;code&gt;blocks.drag.bounds&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;selectable&lt;/code&gt;, &lt;code&gt;clipToScrollParents&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;interaction.selectable&lt;/code&gt;, &lt;code&gt;interaction.clipToScrollParents&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style.curvature&lt;/code&gt;, &lt;code&gt;curveMinReach&lt;/code&gt;, &lt;code&gt;curveMaxReach&lt;/code&gt;, &lt;code&gt;curveAngleBlend&lt;/code&gt;, &lt;code&gt;curveAngleMaxOffset&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;style.bezier.curvature&lt;/code&gt;, &lt;code&gt;minReach&lt;/code&gt;, &lt;code&gt;maxReach&lt;/code&gt;, &lt;code&gt;angleBlend&lt;/code&gt;, &lt;code&gt;angleMaxOffset&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style.cornerRadius&lt;/code&gt;, &lt;code&gt;style.maxTrunkReach&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;style.smoothstep.cornerRadius&lt;/code&gt;, &lt;code&gt;style.smoothstep.maxTrunkReach&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style.avoidObstacles&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;style.routing.avoidObstacles&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style.startMarker&lt;/code&gt;, &lt;code&gt;style.endMarker&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;style.markers.start&lt;/code&gt;, &lt;code&gt;style.markers.end&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style.hoverStyle&lt;/code&gt;, &lt;code&gt;style.selectedStyle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;style.hover&lt;/code&gt;, &lt;code&gt;style.selected&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hoverStyle.markerSize&lt;/code&gt;, &lt;code&gt;selectedStyle.markerSize&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;size&lt;/code&gt; в собственных &lt;code&gt;hover&lt;/code&gt; и &lt;code&gt;selected&lt;/code&gt; маркера&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VisualLinkerOptions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;VisualLinkerConfig&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Breaking (Vue):&lt;/strong&gt; проп &lt;code&gt;options&lt;/code&gt; компонента &lt;code&gt;&amp;lt;VisualLinker&amp;gt;&lt;/code&gt; теперь называется &lt;code&gt;config&lt;/code&gt;, а &lt;code&gt;UseVisualLinkerOptions&lt;/code&gt; у &lt;code&gt;useVisualLinker()&lt;/code&gt; больше не расширяет опции движка: в нём &lt;code&gt;config&lt;/code&gt;, &lt;code&gt;blocks&lt;/code&gt; и &lt;code&gt;connections&lt;/code&gt;. &lt;code&gt;config&lt;/code&gt; реактивен, поэтому его изменение перерисовывает диаграмму. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/component.html#config&quot;&gt;Компонент VisualLinker&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Breaking (Vue):&lt;/strong&gt; общая конфигурация переехала из глобального объекта в &lt;code&gt;provide&lt;/code&gt;/&lt;code&gt;inject&lt;/code&gt; Vue. &lt;code&gt;setVisualLinkerDefaults()&lt;/code&gt;, &lt;code&gt;resetVisualLinkerDefaults()&lt;/code&gt;, &lt;code&gt;visualLinkerDefaults&lt;/code&gt; и тип &lt;code&gt;VisualLinkerDefaults&lt;/code&gt; удалены. Передайте конфигурацию в &lt;code&gt;app.use(VisualLinkerPlugin, { config })&lt;/code&gt;, а позже меняйте её через &lt;code&gt;useVisualLinkerConfig()&lt;/code&gt;. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/shared-config.html&quot;&gt;Общая конфигурация&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Breaking (Nuxt):&lt;/strong&gt; опции модуля теперь сама конфигурация движка — те же группы &lt;code&gt;theme&lt;/code&gt;, &lt;code&gt;lines&lt;/code&gt;, &lt;code&gt;markers&lt;/code&gt;, &lt;code&gt;ports&lt;/code&gt;, &lt;code&gt;labels&lt;/code&gt;, &lt;code&gt;blocks&lt;/code&gt; и &lt;code&gt;interaction&lt;/code&gt; — вместо отдельного плоского списка (&lt;code&gt;defaultCurve&lt;/code&gt;, &lt;code&gt;portRadius&lt;/code&gt;, &lt;code&gt;curvature&lt;/code&gt;, …). Они должны быть сериализуемы в JSON. Четыре настройки, до которых старый список не дотягивался (&lt;code&gt;defaultCornerRadius&lt;/code&gt;, &lt;code&gt;defaultMaxTrunkReach&lt;/code&gt;, &lt;code&gt;draggable&lt;/code&gt;, &lt;code&gt;dragBounds&lt;/code&gt;), стали обычными полями. Клиентского плагина больше нет: один универсальный плагин регистрирует директивы и устанавливает конфигурацию. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/nuxt-module.html&quot;&gt;Модуль Nuxt&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Breaking (core):&lt;/strong&gt; маркер, заданный в &lt;code&gt;markers.start&lt;/code&gt; или &lt;code&gt;markers.end&lt;/code&gt;, заменяет встроенную точку порта на этом конце у каждого соединения — так же, как это всегда делал маркер, заданный у одного соединения. Цвета маркеров теперь следуют и за цветами линий из темы.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;New (core):&lt;/strong&gt; визуальные состояния для каждой визуальной сущности. Линии, маркеры, порты и подписи принимают корзины &lt;code&gt;highlight&lt;/code&gt;, &lt;code&gt;hover&lt;/code&gt;, &lt;code&gt;selected&lt;/code&gt; и &lt;code&gt;focus&lt;/code&gt; с полями самой сущности, которые накладываются на базовые в этом порядке. В состоянии маркер может поменять &lt;code&gt;shape&lt;/code&gt;, &lt;code&gt;size&lt;/code&gt;, цвета, обводку, &lt;code&gt;arrow&lt;/code&gt; или целый &lt;code&gt;svg&lt;/code&gt;; порт может вырасти, подпись — сменить заливку. Маркеры, порты и подписи следуют состоянию своего соединения. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/states.html&quot;&gt;Визуальные состояния&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;New (core):&lt;/strong&gt; состояние &lt;code&gt;highlight&lt;/code&gt;. Наведённый блок теперь переводит свои соединения в &lt;code&gt;highlight&lt;/code&gt;, отдельно от &lt;code&gt;hover&lt;/code&gt; — курсора над самой линией. Пока корзина &lt;code&gt;highlight&lt;/code&gt; не задана, оно выглядит так же, как &lt;code&gt;hover&lt;/code&gt;, поэтому существующие конфигурации выглядят как раньше.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;New (core):&lt;/strong&gt; &lt;code&gt;opacity&lt;/code&gt; для линий, маркеров, портов и подписей, в том числе по состояниям. Маркер без собственной &lt;code&gt;opacity&lt;/code&gt; блёкнет вместе со своей линией, а анимированная линия перемножает её со своим притемнением.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;New (core):&lt;/strong&gt; темы. &lt;code&gt;theme&lt;/code&gt; — это набор токенов цветов — &lt;code&gt;line&lt;/code&gt;, &lt;code&gt;lineHover&lt;/code&gt;, &lt;code&gt;lineSelected&lt;/code&gt;, &lt;code&gt;selectedHalo&lt;/code&gt;, &lt;code&gt;focusRing&lt;/code&gt;, &lt;code&gt;portFill&lt;/code&gt;, &lt;code&gt;portStroke&lt;/code&gt;, &lt;code&gt;labelBackground&lt;/code&gt;, &lt;code&gt;labelBorder&lt;/code&gt;, &lt;code&gt;labelText&lt;/code&gt;, — которые записываются в CSS-переменные. Экспортируются &lt;code&gt;lightTheme&lt;/code&gt;, &lt;code&gt;darkTheme&lt;/code&gt; и &lt;code&gt;defineTheme(overrides, base)&lt;/code&gt;. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/themes.html&quot;&gt;Темы&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;New (core):&lt;/strong&gt; группа &lt;code&gt;labels&lt;/code&gt; — &lt;code&gt;background&lt;/code&gt;, &lt;code&gt;border&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;, &lt;code&gt;fontSize&lt;/code&gt;, &lt;code&gt;paddingX&lt;/code&gt;, &lt;code&gt;paddingY&lt;/code&gt; и &lt;code&gt;opacity&lt;/code&gt; подписей, которые рисует библиотека, с состояниями — а также &lt;code&gt;ports.side&lt;/code&gt; и &lt;code&gt;ports.offset&lt;/code&gt; как значения по умолчанию для портов, у которых нет своих.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;New (core):&lt;/strong&gt; конфигурацию можно менять, пока движок работает. &lt;code&gt;setConfig(patch)&lt;/code&gt; глубоко сливает (ключ со значением &lt;code&gt;undefined&lt;/code&gt; удаляется), &lt;code&gt;replaceConfig(next)&lt;/code&gt; заменяет, &lt;code&gt;getConfig()&lt;/code&gt; возвращает копию. Перетаскивание и выделение подключаются или отключаются в соответствии с ней, и всё перерисовывается. Дополнительно экспортируются &lt;code&gt;mergeConfig&lt;/code&gt;, &lt;code&gt;patchConfig&lt;/code&gt; и &lt;code&gt;mergeMarkerInputs&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;New (Vue):&lt;/strong&gt; общая конфигурация. &lt;code&gt;VisualLinkerPlugin&lt;/code&gt; принимает &lt;code&gt;{ config }&lt;/code&gt;; &lt;code&gt;useVisualLinkerConfig()&lt;/code&gt; возвращает реактивный объект; &lt;code&gt;provideVisualLinkerConfig(initial?)&lt;/code&gt; задаёт свою для поддерева; &lt;code&gt;installVisualLinkerConfig&lt;/code&gt;, &lt;code&gt;createSharedConfig&lt;/code&gt; и &lt;code&gt;VISUAL_LINKER_CONFIG_KEY&lt;/code&gt; нужны интеграциям. Каждая диаграмма сливает её под своим &lt;code&gt;config&lt;/code&gt;, а изменение перерисовывает все диаграммы. Ничего глобального нет, поэтому несколько приложений на странице не мешают друг другу.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Changed (core):&lt;/strong&gt; событие &lt;code&gt;block:mouseenter&lt;/code&gt; переводит соединения блока в &lt;code&gt;highlight&lt;/code&gt;, а не в &lt;code&gt;hover&lt;/code&gt;, и под курсором в состоянии &lt;code&gt;hover&lt;/code&gt; остаётся только линия, над которой он находится.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.4.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-01-vue-image-kit-1-4-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-01-vue-image-kit-1-4-0"/>
    <updated>2026-10-01T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Плейсхолдеры для папок целиком. &lt;code&gt;npx vue-image-kit placeholders --dir public/images&lt;/code&gt; считает каждое изображение папки, рекурсивно, и добавляет его
в манифест под тем URL, по которому оно отдаётся. Поэтому изображение, чей
&lt;code&gt;src&lt;/code&gt; собирается во время выполнения (&lt;code&gt;:src=&amp;quot;category.image&amp;quot;&lt;/code&gt;), тоже
получает плейсхолдер. &lt;code&gt;--dir src/img=/assets/img&lt;/code&gt; задаёт папку, которая
отдаётся с другого URL, а &lt;code&gt;--url&lt;/code&gt; добавляет одно удалённое или CDN-изображение
без &lt;code&gt;--remote&lt;/code&gt;. Подробнее — в разделе
&lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/cli-placeholders.html#папки-и-url&quot;&gt;Папки и URL&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Плагин Vite собирает такой же манифест сам. С
&lt;code&gt;vueImageKit({ generate: false, placeholders: { dirs: [...] } })&lt;/code&gt; он доступен
как виртуальный модуль &lt;code&gt;virtual:vue-image-kit/placeholders&lt;/code&gt;, пересобирается
при изменении файла в этих папках и кешируется между сборками. Подробнее — в
разделе
&lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/vite-plugin.html#манифест-плеисхолдеров-из-папок&quot;&gt;Манифест плейсхолдеров из папок&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Модуль Nuxt регистрирует всё сам. &lt;code&gt;vueImageKit: { placeholders: { dirs: [...] } }&lt;/code&gt; добавляет плагин Vite и передаёт манифест каждому &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; —
запускать команду и добавлять запись в &lt;code&gt;vite.plugins&lt;/code&gt; не нужно. Прежняя
строковая форма, путь к файлу манифеста, работает как раньше, а &lt;code&gt;manifest&lt;/code&gt;
объединяет такой файл с остальным. Подробнее — в разделе
&lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/nuxt-module.html#опции-модуля&quot;&gt;Опции модуля&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новые импорты Vite, которые считают только плейсхолдер и не пишут файлы.
&lt;code&gt;import placeholder from './photo.jpg?placeholder'&lt;/code&gt; возвращает
&lt;code&gt;{ blurhash, placeholderColor, width, height }&lt;/code&gt; — это пропсы самого
&lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt;, поэтому достаточно &lt;code&gt;&amp;lt;VImage v-bind=&amp;quot;placeholder&amp;quot; /&amp;gt;&lt;/code&gt;.
&lt;code&gt;?placeholder=thumbhash&lt;/code&gt; возвращает ThumbHash вместо BlurHash,
&lt;code&gt;?placeholder=color&lt;/code&gt; — только доминирующий цвет и размер, а новый импорт
&lt;code&gt;?blurhash&lt;/code&gt; — только строку BlurHash, как &lt;code&gt;?thumbhash&lt;/code&gt;. Они работают и через
&lt;code&gt;import.meta.glob(..., { query: '?placeholder' })&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Новая опция &lt;code&gt;generate: false&lt;/code&gt; у плагина Vite. С ней плагин больше не
обрабатывает всю папку &lt;code&gt;input&lt;/code&gt; при старте и при горячих обновлениях, а
только отвечает на импорты &lt;code&gt;?vik&lt;/code&gt;, &lt;code&gt;?placeholder&lt;/code&gt;, &lt;code&gt;?blurhash&lt;/code&gt;,
&lt;code&gt;?thumbhash&lt;/code&gt; и на виртуальный манифест. Папка &lt;code&gt;input&lt;/code&gt; может не существовать.
Подробнее — в разделе
&lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/vite-plugin.html#только-плеисхолдеры-без-изменения-размеров&quot;&gt;Только плейсхолдеры, без изменения размеров&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Хеши можно настраивать: &lt;code&gt;--components 4x3&lt;/code&gt; (компоненты BlurHash),
&lt;code&gt;--sample 100&lt;/code&gt; (размер, до которого изображение уменьшается перед расчётом)
и &lt;code&gt;--color dominant|average&lt;/code&gt; у команды, а также &lt;code&gt;tuning: { components, sample, color }&lt;/code&gt; в файле конфигурации, плагине Vite и модуле Nuxt. При смене
настроек кеш сбрасывается. Подробнее — в разделе
&lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/vite-plugin.html#настроика-хешеи&quot;&gt;Настройка хешей&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Плагин Vite кеширует плейсхолдеры в том же файле, что и команда
&lt;code&gt;placeholders&lt;/code&gt;, поэтому повторная сборка читает только изменившиеся
изображения.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v-lazy-img&lt;/code&gt; и &lt;code&gt;useBackgroundImage()&lt;/code&gt; читают манифест плейсхолдеров. Если у
них нет своего &lt;code&gt;placeholder&lt;/code&gt;, пока изображение грузится, они показывают
декодированное размытие и доминирующий цвет записи для своего &lt;code&gt;src&lt;/code&gt;, а
команда &lt;code&gt;placeholders&lt;/code&gt; заполняет манифест для их статических использований.
Подробнее — в разделе
&lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/cli-placeholders.html#v-lazy-img-и-usebackgroundimage&quot;&gt;v-lazy-img и useBackgroundImage()&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;?thumbhash&lt;/code&gt; и &lt;code&gt;?blurhash&lt;/code&gt; теперь считают значения так же, как команда
&lt;code&gt;placeholders&lt;/code&gt; — BlurHash поверх белого фона, ThumbHash с вписыванием в
100×100, — так что одно и то же изображение получает один и тот же хеш в
обоих случаях.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.3.2</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-01-vue-image-kit-1-3-2</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-01-vue-image-kit-1-3-2"/>
    <updated>2026-10-01T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Запись &lt;code&gt;sources&lt;/code&gt; (art direction) теперь может нести собственный
плейсхолдер — &lt;code&gt;blurhash&lt;/code&gt;, &lt;code&gt;thumbhash&lt;/code&gt;, &lt;code&gt;placeholder&lt;/code&gt; или &lt;code&gt;placeholderColor&lt;/code&gt;
рядом с &lt;code&gt;src&lt;/code&gt;, либо &lt;code&gt;ImageMeta&lt;/code&gt; из импорта &lt;code&gt;?vik&lt;/code&gt;. Пока брейкпоинт этой
записи активен, &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; показывает её плейсхолдер в её пропорциях, а не
плейсхолдер корневого изображения, — так blurhash вертикального фото больше
не растягивается в горизонтальный бокс планшета. Совпавшая запись заменяет
весь набор плейсхолдеров корня; записи без плейсхолдера и брейкпоинты, на
которых ни одна запись не совпала, по-прежнему используют плейсхолдер корня.
Записи манифеста плейсхолдеров тоже ищутся по &lt;code&gt;src&lt;/code&gt; источника. Новый
экспортируемый тип: &lt;code&gt;SourcePlaceholder&lt;/code&gt;. Подробнее — в разделе
&lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/responsive-images.html#плеисхолдеры-на-бреикпоинт&quot;&gt;Плейсхолдеры на брейкпоинт&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Команда &lt;code&gt;npx vue-image-kit placeholders&lt;/code&gt; теперь заполняет и записи
&lt;code&gt;sources&lt;/code&gt;. Каждая статически определяемая запись литерала
&lt;code&gt;:sources=&amp;quot;{ … }&amp;quot;&lt;/code&gt; получает плейсхолдер, даже если собственный &lt;code&gt;src&lt;/code&gt;
изображения динамический, — через манифест или прямо в литерале. Записи, у
которых плейсхолдер уже есть, не трогаются. Подробнее — в разделе
&lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/cli-placeholders.html#источники-art-direction&quot;&gt;Источники art direction&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.3.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-01-vue-image-kit-1-3-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-01-vue-image-kit-1-3-1"/>
    <updated>2026-10-01T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;У команды &lt;code&gt;npx vue-image-kit placeholders&lt;/code&gt; появился флаг &lt;code&gt;--replace&lt;/code&gt;. Раньше
команда пропускала &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt;, у которых плейсхолдер уже задан. С флагом
&lt;code&gt;--replace&lt;/code&gt; она заменяет такой плейсхолдер на новый — того вида, что указан
в &lt;code&gt;--mode&lt;/code&gt;. Заменяются только атрибуты с обычным значением: &lt;code&gt;blurhash&lt;/code&gt;,
&lt;code&gt;thumbhash&lt;/code&gt;, &lt;code&gt;placeholder&lt;/code&gt;, &lt;code&gt;placeholder-color&lt;/code&gt; и &lt;code&gt;placeholder-mode&lt;/code&gt;.
Привязанные значения (например, &lt;code&gt;:thumbhash=&amp;quot;item.hash&amp;quot;&lt;/code&gt;) и &lt;code&gt;:image&lt;/code&gt;
остаются без изменений. Подробнее — в разделе
&lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/cli-placeholders.html#замена-существующих-плеисхолдеров&quot;&gt;Замена существующих плейсхолдеров&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.3.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-01-vue-image-kit-1-3-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-01-vue-image-kit-1-3-0"/>
    <updated>2026-10-01T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новая команда &lt;strong&gt;&lt;code&gt;npx vue-image-kit scan&lt;/code&gt;&lt;/strong&gt; — отчёт о том, как vue-image-kit
используется в проекте. Находит каждый &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; (в шаблонах, JSX и
вызовах &lt;code&gt;h()&lt;/code&gt;, в том числе под локальным алиасом импорта), каждый
&lt;code&gt;v-lazy-img&lt;/code&gt; и каждый вызов &lt;code&gt;useImage()&lt;/code&gt;/&lt;code&gt;useBackgroundImage()&lt;/code&gt;, определяет
источник каждого изображения — локальный импорт, путь из &lt;code&gt;public/&lt;/code&gt; (с
проверкой, что файл существует), CDN с указанием провайдера, удалённый URL,
импорт &lt;code&gt;?vik&lt;/code&gt; или динамическое значение — и выводит количество использований
по источникам и файлам, статистику пропсов и предупреждения: нет &lt;code&gt;alt&lt;/code&gt;, нет
размеров, нет плейсхолдера, файл не найден. Отчёт можно сохранить в JSON,
Markdown или CSV, а &lt;code&gt;--fail-on&lt;/code&gt; превращает команду в проверку для CI.
Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/cli-scan.html&quot;&gt;CLI — отчёт об использовании&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новая команда &lt;strong&gt;&lt;code&gt;npx vue-image-kit placeholders&lt;/code&gt;&lt;/strong&gt; — вычисляет BlurHash,
ThumbHash или доминирующий цвет изображения и его исходный размер для каждого
&lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt;, у которого ещё нет плейсхолдера. Локальные изображения и файлы из
&lt;code&gt;public/&lt;/code&gt; читаются с диска, CDN и удалённые — скачиваются только с флагом
&lt;code&gt;--remote&lt;/code&gt;. Результат попадает в манифест плейсхолдеров для изображений,
которые приложение может найти по &lt;code&gt;src&lt;/code&gt;, либо прямо в шаблон — для локальных
импортов и для всего проекта, если манифест не зарегистрирован. Файлы с
незакоммиченными изменениями не правятся. Подробнее —
&lt;a href=&quot;https://npm.vuecraft.ru/packages/vue-image-kit/guide/cli-placeholders.html&quot;&gt;CLI — плейсхолдеры для готовой вёрстки&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; теперь может брать плейсхолдер и размеры из &lt;strong&gt;манифеста
плейсхолдеров&lt;/strong&gt;, зарегистрированного один раз через
&lt;code&gt;app.use(VImageKitPlugin, { placeholders })&lt;/code&gt; или новую опцию &lt;code&gt;placeholders&lt;/code&gt;
модуля Nuxt, вместо пропсов на каждом использовании. Явные пропсы и проп
&lt;code&gt;image&lt;/code&gt; по-прежнему в приоритете; приложения без манифеста это не затрагивает.
Новые экспорты: &lt;code&gt;PLACEHOLDERS_KEY&lt;/code&gt;, &lt;code&gt;PlaceholderEntry&lt;/code&gt;, &lt;code&gt;PlaceholderManifest&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Новая функция &lt;code&gt;detectCdnProvider()&lt;/code&gt; в &lt;code&gt;@macrulez/vue-image-kit/cdn&lt;/code&gt; — сообщает,
к какому из автоматически распознаваемых CDN относится URL.&lt;/li&gt;
&lt;li&gt;CLI теперь разделён на команды — &lt;code&gt;generate&lt;/code&gt; (по-прежнему команда по
умолчанию), &lt;code&gt;scan&lt;/code&gt; и &lt;code&gt;placeholders&lt;/code&gt;, — у каждой своя &lt;code&gt;--help&lt;/code&gt;. Если не
установлен &lt;code&gt;sharp&lt;/code&gt; или &lt;code&gt;thumbhash&lt;/code&gt;, CLI показывает команду установки для npm,
pnpm и yarn.&lt;/li&gt;
&lt;li&gt;Исправлено: генерация ThumbHash (&lt;code&gt;generate --thumbhash&lt;/code&gt; и импорты
&lt;code&gt;?thumbhash&lt;/code&gt;/&lt;code&gt;?vik&lt;/code&gt; во Vite-плагине) падала на вертикальных изображениях —
картинка уменьшалась только до ширины 100px, и всё, что выше, чем шире,
оставалось за пределами допустимых для ThumbHash 100×100. Теперь изображение
вписывается в 100×100.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Visual Linker 0.3.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-10#2026-10-01-visual-linker-0-3-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-10#2026-10-01-visual-linker-0-3-0"/>
    <updated>2026-10-01T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New (core):&lt;/strong&gt; опция &lt;code&gt;selectable&lt;/code&gt; — соединения становятся фокусируемыми кнопками (порядок Tab совпадает с порядком в &lt;code&gt;connections&lt;/code&gt;), которые выделяются кликом или Enter/Space, а Ctrl/Cmd/Shift переключает соединение в мультивыделении; Escape или нажатие указателя в другом месте снимает выделение. Delete/Backspace отправляет &lt;code&gt;connection:delete-request&lt;/code&gt;, а сама библиотека данные не удаляет. Новое: &lt;code&gt;setSelectedConnections(ids)&lt;/code&gt;, событие &lt;code&gt;connection:selectionchange&lt;/code&gt;, &lt;code&gt;ConnectionStyle.selectedStyle&lt;/code&gt; и CSS-переменные &lt;code&gt;--vl-selected-color&lt;/code&gt; / &lt;code&gt;--vl-focus-color&lt;/code&gt;. Каждая линия теперь несёт &lt;code&gt;role=&amp;quot;img&amp;quot;&lt;/code&gt; и &lt;code&gt;aria-label&lt;/code&gt; (&lt;code&gt;ConnectionDescriptor.ariaLabel&lt;/code&gt;, по умолчанию «Connection: a → b»). Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/selection.html&quot;&gt;Выделение и доступность&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New (core):&lt;/strong&gt; &lt;code&gt;ConnectionDescriptor.labels&lt;/code&gt; — любое число подписей в любом месте линии (&lt;code&gt;position&lt;/code&gt;: &lt;code&gt;'start'&lt;/code&gt;, &lt;code&gt;'middle'&lt;/code&gt;, &lt;code&gt;'end'&lt;/code&gt; или доля 0..1; &lt;code&gt;offset&lt;/code&gt;, &lt;code&gt;rotate&lt;/code&gt;, &lt;code&gt;className&lt;/code&gt;). Подпись с &lt;code&gt;text&lt;/code&gt; рисует сама библиотека как SVG-«таблетку» (&lt;code&gt;--vl-label-bg&lt;/code&gt;, &lt;code&gt;--vl-label-border&lt;/code&gt;, &lt;code&gt;--vl-label-color&lt;/code&gt;), подпись без него — только позиция. &lt;code&gt;ConnectionLayout.labels&lt;/code&gt; содержит рассчитанные точку и угол каждой подписи. Новые типы: &lt;code&gt;ConnectionLabel&lt;/code&gt;, &lt;code&gt;LabelLayout&lt;/code&gt;. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/connection-labels.html&quot;&gt;Подписи соединений&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New (core):&lt;/strong&gt; &lt;code&gt;ConnectionStyle.animated&lt;/code&gt; / &lt;code&gt;defaultAnimated&lt;/code&gt; — узор из штрихов или точек, бегущий вдоль линии (&lt;code&gt;speed&lt;/code&gt;, &lt;code&gt;direction&lt;/code&gt;, &lt;code&gt;shape&lt;/code&gt;, &lt;code&gt;dash&lt;/code&gt;, &lt;code&gt;gap&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;, &lt;code&gt;width&lt;/code&gt;); он рисуется отдельным оверлеем на одном CSS и отключается при &lt;code&gt;prefers-reduced-motion&lt;/code&gt;. Новый тип: &lt;code&gt;ConnectionFlow&lt;/code&gt;. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/animated-flow.html&quot;&gt;Анимированный поток&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New (core):&lt;/strong&gt; &lt;code&gt;avoidObstacles&lt;/code&gt; / &lt;code&gt;obstaclePadding&lt;/code&gt; (и &lt;code&gt;ConnectionStyle.avoidObstacles&lt;/code&gt;) — линии &lt;code&gt;smoothstep&lt;/code&gt; прокладываются в обход других блоков, а не сквозь них, и перестраиваются на лету при перетаскивании блоков; линия, у которой обычный маршрут уже свободен, не меняется, а если маршрута нет, остаётся обычный. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/routing.html&quot;&gt;Маршрутизация и пересечения&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New (core):&lt;/strong&gt; &lt;code&gt;jumps&lt;/code&gt; (и &lt;code&gt;ConnectionStyle.jumps&lt;/code&gt;) — линия &lt;code&gt;smoothstep&lt;/code&gt; делает небольшую полукруглую дугу там, где пересекает линию другого соединения, как на электрических схемах. Новый тип: &lt;code&gt;JumpsOption&lt;/code&gt;. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/routing.html#мостики-на-пересечениях&quot;&gt;Маршрутизация и пересечения&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New (core):&lt;/strong&gt; &lt;code&gt;clipToScrollParents&lt;/code&gt; — порт, уехавший из видимой области внутри обрезающего предка (строка в прокручиваемом списке, &lt;code&gt;overflow: hidden&lt;/code&gt;), больше не оставляет линию висеть над посторонним содержимым: по умолчанию &lt;code&gt;'pin'&lt;/code&gt; прижимает этот конец к краю видимой области и убирает его маркер и точку порта, &lt;code&gt;'hide'&lt;/code&gt; скрывает соединение, &lt;code&gt;false&lt;/code&gt; возвращает прежнее поведение. В &lt;code&gt;ConnectionLayout&lt;/code&gt; появились &lt;code&gt;fromClipped&lt;/code&gt; / &lt;code&gt;toClipped&lt;/code&gt;. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/scrolling-containers.html&quot;&gt;Прокручиваемые контейнеры&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New (core):&lt;/strong&gt; разведение по порту — &lt;code&gt;BlockDescriptor.portSpread&lt;/code&gt;, &lt;code&gt;PortDescriptor.spread&lt;/code&gt; и &lt;code&gt;defaultPortSpread&lt;/code&gt; (&lt;code&gt;true&lt;/code&gt; или &lt;code&gt;{ gap, padding }&lt;/code&gt;, по умолчанию 16 и 8) дают каждому соединению, которое делит сторону порта, свой виртуальный порт, упорядоченный так, чтобы линии не пересекались. Новые типы: &lt;code&gt;PortSpread&lt;/code&gt;, &lt;code&gt;PortSpreadOptions&lt;/code&gt;. Подробнее — &lt;a href=&quot;https://npm.vuecraft.ru/packages/visual-linker/guide/port-spreading.html&quot;&gt;Разведение соединений по порту&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New (Vue):&lt;/strong&gt; проп &lt;code&gt;selected&lt;/code&gt; (&lt;code&gt;v-model:selected&lt;/code&gt;) и события &lt;code&gt;connection-selectionchange&lt;/code&gt;, &lt;code&gt;connection-delete-request&lt;/code&gt; и &lt;code&gt;update:selected&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New (Vue):&lt;/strong&gt; &lt;code&gt;#connection-label&lt;/code&gt; вызывается по одному разу на каждую подпись без &lt;code&gt;text&lt;/code&gt; — &lt;code&gt;{ connection, label, point, angle, rotation, from, to }&lt;/code&gt; — и ставит подпись в её точку, повернув на &lt;code&gt;rotation&lt;/code&gt;. Без &lt;code&gt;labels&lt;/code&gt; он работает как раньше: одна подпись посередине линии.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New (Vue):&lt;/strong&gt; &lt;code&gt;portSpread&lt;/code&gt; у &lt;code&gt;v-vl-block&lt;/code&gt; и в элементах &lt;code&gt;blocks&lt;/code&gt;, &lt;code&gt;spread&lt;/code&gt; у &lt;code&gt;v-vl-port&lt;/code&gt; и атрибуты &lt;code&gt;data-vl-port-spread&lt;/code&gt; / &lt;code&gt;data-vl-spread&lt;/code&gt; (&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; или &lt;code&gt;&amp;quot;true&amp;quot;&lt;/code&gt; включает, &lt;code&gt;&amp;quot;false&amp;quot;&lt;/code&gt; выключает, &lt;code&gt;&amp;quot;24&amp;quot;&lt;/code&gt; задаёт промежуток, &lt;code&gt;&amp;quot;24 4&amp;quot;&lt;/code&gt; — промежуток и отступ).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Changed (Vue):&lt;/strong&gt; слот &lt;code&gt;#marker&lt;/code&gt; не рендерится для конца соединения, прижатого к краю прокручиваемого контейнера.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New (Nuxt):&lt;/strong&gt; опции модуля &lt;code&gt;portSpread&lt;/code&gt;, &lt;code&gt;clipToScrollParents&lt;/code&gt;, &lt;code&gt;animated&lt;/code&gt;, &lt;code&gt;avoidObstacles&lt;/code&gt;, &lt;code&gt;obstaclePadding&lt;/code&gt; и &lt;code&gt;jumps&lt;/code&gt;, которые применяются как значения по умолчанию для каждого &lt;code&gt;&amp;lt;VisualLinker&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Visual Linker 0.2.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-30-visual-linker-0-2-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-30-visual-linker-0-2-0"/>
    <updated>2026-09-30T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Breaking (Vue):&lt;/strong&gt; &lt;code&gt;&amp;lt;VisualLinker&amp;gt;&lt;/code&gt; больше не рендерит обёртку &lt;code&gt;&amp;lt;div class=&amp;quot;vl-block&amp;quot;&amp;gt;&lt;/code&gt; вокруг слота &lt;code&gt;#block-&amp;lt;id&amp;gt;&lt;/code&gt; для каждого блока. Теперь он оборачивает вашу собственную разметку в default-слоте, а блоки находятся в ней на любой глубине, внутри любых компонентов-обёрток. Для миграции перенесите содержимое слотов в default-слот и пометьте каждый элемент-блок через &lt;code&gt;v-vl-block=&amp;quot;id&amp;quot;&lt;/code&gt; (или &lt;code&gt;data-vl-block=&amp;quot;id&amp;quot;&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&quot;language-vue&quot;&gt;&lt;button title=&quot;Copy code&quot; data-copied=&quot;Copied&quot; class=&quot;copy&quot;&gt;&lt;/button&gt;&lt;span class=&quot;lang&quot;&gt;vue&lt;/span&gt;&lt;pre&gt;&lt;!--::markdown-it-async::9i28ci4dav8wvpzdvzqvi::--&gt;&lt;code&gt;&amp;lt;!-- 0.1.x --&amp;gt;
&amp;lt;VisualLinker :blocks=&amp;quot;blocks&amp;quot; :connections=&amp;quot;connections&amp;quot;&amp;gt;
  &amp;lt;template v-for=&amp;quot;b in blocks&amp;quot; #[`block-${b.id}`]=&amp;quot;{}&amp;quot; :key=&amp;quot;b.id&amp;quot;&amp;gt;
    &amp;lt;MyCard :data=&amp;quot;b&amp;quot; /&amp;gt;
  &amp;lt;/template&amp;gt;
&amp;lt;/VisualLinker&amp;gt;

&amp;lt;!-- 0.2.0 --&amp;gt;
&amp;lt;VisualLinker :connections=&amp;quot;connections&amp;quot;&amp;gt;
  &amp;lt;MyCard v-for=&amp;quot;b in blocks&amp;quot; :key=&amp;quot;b.id&amp;quot; v-vl-block=&amp;quot;b.id&amp;quot; :data=&amp;quot;b&amp;quot; /&amp;gt;
&amp;lt;/VisualLinker&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Breaking (Vue):&lt;/strong&gt; проп &lt;code&gt;blocks&lt;/code&gt; стал необязательным. Запись может напрямую зарегистрировать элемент через новое поле &lt;code&gt;el&lt;/code&gt; (template ref, геттер, элемент или CSS-селектор) либо — без &lt;code&gt;el&lt;/code&gt; — лишь добавить конфигурацию (порты, настройки перетаскивания) блоку, уже помеченному в шаблоне.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Новое (Vue):&lt;/strong&gt; директивы &lt;code&gt;v-vl-block&lt;/code&gt; / &lt;code&gt;v-vl-port&lt;/code&gt;, экспортируются как &lt;code&gt;vVlBlock&lt;/code&gt; / &lt;code&gt;vVlPort&lt;/code&gt;. Порт привязывается к ближайшему блоку вокруг него или к блоку, указанному в его опции &lt;code&gt;block&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Новое (Vue):&lt;/strong&gt; обычные &lt;code&gt;data-vl-*&lt;/code&gt; атрибуты — способ пометить блоки и порты вообще без JavaScript (&lt;code&gt;data-vl-block&lt;/code&gt;, &lt;code&gt;data-vl-draggable&lt;/code&gt;, &lt;code&gt;data-vl-drag-handle&lt;/code&gt;, &lt;code&gt;data-vl-drag-bounds&lt;/code&gt;, &lt;code&gt;data-vl-port&lt;/code&gt;, &lt;code&gt;data-vl-port-block&lt;/code&gt;, &lt;code&gt;data-vl-side&lt;/code&gt;, &lt;code&gt;data-vl-offset&lt;/code&gt;, &lt;code&gt;data-vl-anchor&lt;/code&gt;, &lt;code&gt;data-vl-linker&lt;/code&gt;); имена экспортируются как &lt;code&gt;VL_ATTR&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Новое (Vue):&lt;/strong&gt; живое обнаружение — блоки и порты, добавленные, удалённые или перепомеченные после монтирования (&lt;code&gt;v-if&lt;/code&gt;, &lt;code&gt;v-for&lt;/code&gt;, сторонняя разметка), подхватываются автоматически.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Новое (Vue):&lt;/strong&gt; проп &lt;code&gt;scope&lt;/code&gt; — &lt;code&gt;'container'&lt;/code&gt; (по умолчанию) или &lt;code&gt;'page'&lt;/code&gt;: связывает элементы в любом месте документа и рисует в слое &lt;code&gt;position: fixed&lt;/code&gt;, телепортированном в &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Новое (Vue):&lt;/strong&gt; проп &lt;code&gt;name&lt;/code&gt; вместе с опцией &lt;code&gt;linker&lt;/code&gt; у директив / атрибутом &lt;code&gt;data-vl-linker&lt;/code&gt; — чтобы закрепить элемент за конкретным &lt;code&gt;&amp;lt;VisualLinker&amp;gt;&lt;/code&gt;; проп &lt;code&gt;zIndex&lt;/code&gt; для слоя отрисовки. Прочие атрибуты, переданные в &lt;code&gt;&amp;lt;VisualLinker&amp;gt;&lt;/code&gt;, теперь попадают на его корневой элемент.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Новое (Vue):&lt;/strong&gt; &lt;code&gt;VisualLinkerPlugin&lt;/code&gt; — &lt;code&gt;app.use()&lt;/code&gt; глобально регистрирует &lt;code&gt;&amp;lt;VisualLinker&amp;gt;&lt;/code&gt; и обе директивы. Также экспортируются типы &lt;code&gt;VisualLinkerScope&lt;/code&gt;, &lt;code&gt;BlockDirectiveOptions&lt;/code&gt;, &lt;code&gt;BlockDirectiveValue&lt;/code&gt;, &lt;code&gt;PortDirectiveOptions&lt;/code&gt;, &lt;code&gt;PortDirectiveValue&lt;/code&gt;, &lt;code&gt;RefFriendlyDragBounds&lt;/code&gt; и &lt;code&gt;RefFriendlyElement&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Изменено (Vue):&lt;/strong&gt; слой отрисовки рендерится только на клиенте после монтирования — серверный рендер совпадает с проходом гидратации.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Новое (Nuxt):&lt;/strong&gt; &lt;code&gt;v-vl-block&lt;/code&gt; / &lt;code&gt;v-vl-port&lt;/code&gt; регистрируются универсальным плагином — в том числе на сервере, так что &lt;code&gt;data-vl-*&lt;/code&gt; атрибуты уже есть в серверном HTML.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Новое (core):&lt;/strong&gt; &lt;code&gt;MarkerConfig.arrow&lt;/code&gt; — &lt;code&gt;true&lt;/code&gt; или &lt;code&gt;{ color?, gap? }&lt;/code&gt; (новый тип &lt;code&gt;MarkerArrowConfig&lt;/code&gt;) рисует наконечник стрелки прямо перед маркером circle/square/diamond, острие которого упирается ровно во внешний край фигуры с учётом обводки. Маркер со стрелкой всегда использует &lt;code&gt;orient: 'auto'&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Изменено (core):&lt;/strong&gt; подсвеченное соединение рисуется поверх соседних, а другие соединения, заканчивающиеся в той же точке, скрывают там свой маркер — маркеры обычного размера больше не перекрывают подсвеченный.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Исправлено (core):&lt;/strong&gt; соединение с явным &lt;code&gt;style.width&lt;/code&gt; теряло утолщение при наведении/подсветке — явная инлайн-ширина перебивала CSS-правило. Теперь утолщение тоже применяется инлайн.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Изменено (core):&lt;/strong&gt; перетаскивание сдвигает блок через отдельное CSS-свойство &lt;code&gt;translate&lt;/code&gt; вместо &lt;code&gt;transform&lt;/code&gt; — сдвиг складывается с уже имеющейся у блока трансформацией, а не затирает её.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>InView 0.3.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-26-inview-0-3-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-26-inview-0-3-0"/>
    <updated>2026-09-26T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Задержка стаггера у &lt;code&gt;createRevealController&lt;/code&gt; теперь полностью
пропускается при &lt;code&gt;prefers-reduced-motion: reduce&lt;/code&gt; — переключение
класса/атрибута по-прежнему происходит как обычно, пропускается только
сама задержка по времени.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;createElementTracker&lt;/code&gt; (а вместе с ним и composables/хуки
&lt;code&gt;useElementViewport&lt;/code&gt;/&lt;code&gt;useParallaxLayer&lt;/code&gt;, построенные на нём, для Vue и
React) принимает элемент &lt;code&gt;root&lt;/code&gt;, чтобы считать &lt;code&gt;viewportProgress&lt;/code&gt;/
&lt;code&gt;distanceFromCenter&lt;/code&gt; относительно прокручиваемого контейнера вместо
окна — для параллакс-слоя или трекера позиции внутри &lt;code&gt;overflow: auto&lt;/code&gt;
(панель дашборда, модалка). Сам &lt;code&gt;rect&lt;/code&gt; в любом случае остаётся
привязанным к окну.&lt;/li&gt;
&lt;li&gt;Опции &lt;code&gt;useElementVisibility&lt;/code&gt; теперь реактивны в обоих адаптерах.
&lt;strong&gt;Vue:&lt;/strong&gt; &lt;code&gt;threshold&lt;/code&gt;/&lt;code&gt;rootMargin&lt;/code&gt;/&lt;code&gt;root&lt;/code&gt;/&lt;code&gt;once&lt;/code&gt; принимают ref/геттер —
изменение &lt;code&gt;threshold&lt;/code&gt;/&lt;code&gt;rootMargin&lt;/code&gt;/&lt;code&gt;root&lt;/code&gt; вызывает настоящую
переподписку, &lt;code&gt;once&lt;/code&gt; обновляется вживую без пересоздания подписки.
&lt;strong&gt;React:&lt;/strong&gt; &lt;code&gt;once&lt;/code&gt;/&lt;code&gt;onEnter&lt;/code&gt;/&lt;code&gt;onLeave&lt;/code&gt; теперь обновляются вживую при
каждом ре-рендере (раньше замораживались на том рендере, где подписка
впервые создавалась), а свежий инлайн-массив &lt;code&gt;threshold&lt;/code&gt; на каждом
рендере больше не вызывает лишнюю переподписку.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Новые Vue composables:&lt;/strong&gt; &lt;code&gt;useRevealController&lt;/code&gt; (создаёт
&lt;code&gt;createRevealController&lt;/code&gt; при монтировании, уничтожает при
размонтировании), &lt;code&gt;usePrefersReducedMotion&lt;/code&gt; (реактивный &lt;code&gt;Ref&amp;lt;boolean&amp;gt;&lt;/code&gt;,
в отличие от статической &lt;code&gt;prefersReducedMotion()&lt;/code&gt;), &lt;code&gt;useStagger&lt;/code&gt;,
&lt;code&gt;useScrollTo&lt;/code&gt;, &lt;code&gt;useScrollSpy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Новые React-хуки:&lt;/strong&gt; &lt;code&gt;useReveal&lt;/code&gt; (эквивалент Vue-директивы &lt;code&gt;v-reveal&lt;/code&gt;
— автоматически переключает класс/атрибут), &lt;code&gt;useRevealController&lt;/code&gt;,
&lt;code&gt;usePrefersReducedMotion&lt;/code&gt;, &lt;code&gt;useStagger&lt;/code&gt;, &lt;code&gt;useScrollTo&lt;/code&gt;, &lt;code&gt;useScrollSpy&lt;/code&gt; —
той же формы, что и Vue composables выше.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Новое в &lt;code&gt;@macrulez/inview-core&lt;/code&gt;:&lt;/strong&gt; &lt;code&gt;createScrollSpy&lt;/code&gt; (отслеживает,
какой из списка целевых элементов сейчас находится в «активной» полосе
около вертикального центра viewport — для подсветки активного пункта
навигации) и &lt;code&gt;scrollToElement&lt;/code&gt; (плавно прокручивает контейнер, чтобы
элемент оказался у его края, с отступом в px).&lt;/li&gt;
&lt;li&gt;Контроллер, который возвращает &lt;code&gt;createRevealController&lt;/code&gt;, получил
&lt;code&gt;observe(el)&lt;/code&gt;/&lt;code&gt;unobserve(el)&lt;/code&gt; (для элементов вне скана по &lt;code&gt;selector&lt;/code&gt;) и
&lt;code&gt;refresh(selector?)&lt;/code&gt; (разовый скан с другим селектором, в дополнение к
уже существующему &lt;code&gt;refresh()&lt;/code&gt; без аргументов). Атрибут
&lt;code&gt;data-reveal-attribute&lt;/code&gt; на конкретном элементе теперь переопределяет
&lt;code&gt;activeAttribute&lt;/code&gt; так же, как &lt;code&gt;data-reveal-class&lt;/code&gt; уже переопределял
&lt;code&gt;activeClass&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Список автоимпортов Nuxt теперь включает &lt;code&gt;useRevealController&lt;/code&gt;,
&lt;code&gt;usePrefersReducedMotion&lt;/code&gt;, &lt;code&gt;useStagger&lt;/code&gt;, &lt;code&gt;useScrollTo&lt;/code&gt;, &lt;code&gt;useScrollSpy&lt;/code&gt;,
&lt;code&gt;createScrollSpy&lt;/code&gt; и &lt;code&gt;scrollToElement&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DevToolz 0.2.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-25-devtoolz-0-2-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-25-devtoolz-0-2-1"/>
    <updated>2026-09-25T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: команда &lt;code&gt;full-check&lt;/code&gt; прогоняет все остальные команды за один проход, каждую в её безопасном режиме только для чтения, и показывает одну сводную таблицу. Три команды, способные писать (&lt;code&gt;strip-comments&lt;/code&gt;, &lt;code&gt;console-strip&lt;/code&gt;, &lt;code&gt;case-check&lt;/code&gt;), всегда вызываются как превью. Обычный запуск в настоящем терминале спрашивает про &lt;code&gt;stale-ts-ignore&lt;/code&gt; — единственную медленную команду; управляют этим &lt;code&gt;--skip&lt;/code&gt; и &lt;code&gt;--no-prompt&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/full-check.html&quot;&gt;Полная проверка&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Добавлено в программный API: &lt;code&gt;runFullCheck&lt;/code&gt;, &lt;code&gt;renderFullCheckReport&lt;/code&gt; и их типы. Сам &lt;code&gt;full-check&lt;/code&gt; собирается из собственных функций &lt;code&gt;run*()&lt;/code&gt; остальных команд, которые корень пакета уже экспортировал.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DevToolz 0.2.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-25-devtoolz-0-2-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-25-devtoolz-0-2-0"/>
    <updated>2026-09-25T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новое: &lt;code&gt;unused-deps&lt;/code&gt; находит зависимости в &lt;code&gt;package.json&lt;/code&gt;, на которые нет ни одного импорта, и «фантомные» зависимости, которые импортируются, но не объявлены. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/dependency-graph.html#unused-deps&quot;&gt;Граф зависимостей&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;circular-imports&lt;/code&gt; находит циклы импортов и показывает каждый как полную цепочку; циклы, состоящие только из &lt;code&gt;import type&lt;/code&gt;, скрыты, пока не передан &lt;code&gt;--include-types&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/dependency-graph.html#circular-imports&quot;&gt;Граф зависимостей&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;empty-catch&lt;/code&gt; находит &lt;code&gt;catch&lt;/code&gt;-блоки, которые проглатывают ошибку, включая те, что только логируют её. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/code-hygiene.html#empty-catch&quot;&gt;Гигиена кода&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;todo-report&lt;/code&gt; собирает комментарии &lt;code&gt;TODO&lt;/code&gt;/&lt;code&gt;FIXME&lt;/code&gt;/&lt;code&gt;HACK&lt;/code&gt; вместе с их текстом, с &lt;code&gt;--tags&lt;/code&gt; и «трещоткой» &lt;code&gt;--max&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/code-hygiene.html#todo-report&quot;&gt;Гигиена кода&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;scripts-check&lt;/code&gt; сверяет скрипты &lt;code&gt;package.json&lt;/code&gt; с README/документацией и CI-воркфлоу, а &lt;code&gt;orphan-tests&lt;/code&gt; находит тестовые файлы, у которых пропал исходник. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/consistency-checks.html&quot;&gt;Проверка согласованности&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Новое: &lt;code&gt;stale-ts-ignore&lt;/code&gt; находит &lt;code&gt;@ts-ignore&lt;/code&gt;, который больше ничего не подавляет, сравнивая два реальных тайпчека всего проекта. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/stale-ts-ignore.html&quot;&gt;Устаревшие @ts-ignore&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Добавлено в программный API: функции &lt;code&gt;run*()&lt;/code&gt; и &lt;code&gt;render*Report()&lt;/code&gt; новых команд.&lt;/li&gt;
&lt;li&gt;Изменено: граф импортов и поиск настоящих комментариев вынесены из отдельных команд в общие утилиты, которыми теперь пользуются несколько команд; загрузчик &lt;code&gt;tsconfig.json&lt;/code&gt; у &lt;code&gt;readme-check&lt;/code&gt; вынесен так же.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>DevToolz 0.1.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-25-devtoolz-0-1-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-25-devtoolz-0-1-0"/>
    <updated>2026-09-25T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Первый релиз: один бинарник &lt;code&gt;devtoolz&lt;/code&gt; с шестью командами. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/overview.html&quot;&gt;Обзор&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;strip-comments&lt;/code&gt; и &lt;code&gt;console-strip&lt;/code&gt; убирают комментарии и оставленные &lt;code&gt;console.log&lt;/code&gt;/&lt;code&gt;debugger&lt;/code&gt;; по умолчанию — превью, &lt;code&gt;-y&lt;/code&gt; записывает, &lt;code&gt;--diff&lt;/code&gt; показывает unified diff по каждому файлу. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/cleanup.html&quot;&gt;Очистка кода&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dead-exports&lt;/code&gt; находит именованные экспорты, которые нигде не импортируются, с учётом публичных точек входа пакета, цепочек реэкспорта и воркспейсов. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/dead-exports.html&quot;&gt;Мёртвые экспорты&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;case-check&lt;/code&gt; находит импорты, регистр которых не совпадает с файлом на диске, с &lt;code&gt;--fix&lt;/code&gt;. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/case-check.html&quot;&gt;Проверка регистра&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exports-doctor&lt;/code&gt; и &lt;code&gt;readme-check&lt;/code&gt; проверяют пакет со стороны потребителя: заявленные в &lt;code&gt;package.json&lt;/code&gt; пути против диска и блоки кода в README против собственных типов пакета. См. &lt;a href=&quot;https://npm.vuecraft.ru/packages/devtoolz/guide/package-checks.html&quot;&gt;Проверка пакета&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Network Dashboard 0.4.2</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-25-vue-network-dashboard-0-4-2</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-25-vue-network-dashboard-0-4-2"/>
    <updated>2026-09-25T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Несколько примеров &lt;code&gt;addMock&lt;/code&gt;/&lt;code&gt;addMockToGroup&lt;/code&gt; в README и гайде по
мокированию не указывали обязательное поле &lt;code&gt;enabled&lt;/code&gt; — при
копировании как есть правило не прошло бы типопроверку, а если это
обойти — мок молча пропускался бы в рантайме (&lt;code&gt;addMock&lt;/code&gt;/
&lt;code&gt;addMockToGroup&lt;/code&gt; проверяют &lt;code&gt;rule.enabled&lt;/code&gt; перед применением).&lt;/li&gt;
&lt;li&gt;Задокументированная сигнатура &lt;code&gt;addMockToGroup&lt;/code&gt; указывала
&lt;code&gt;rule: Partial&amp;lt;MockRule&amp;gt;&lt;/code&gt; — реальный тип &lt;code&gt;Omit&amp;lt;MockRule, 'id'&amp;gt;&lt;/code&gt;, все
поля кроме &lt;code&gt;id&lt;/code&gt; по-прежнему обязательны.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Responsive Media 2.0.2</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-25-responsive-media-2-0-2</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-25-responsive-media-2-0-2"/>
    <updated>2026-09-25T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Пример &lt;code&gt;useContainerState&lt;/code&gt; в гайде по интеграции с Vue вызывал
&lt;code&gt;useTemplateRef('card')&lt;/code&gt; без явного типового аргумента — дефолт самого
Vue (&lt;code&gt;unknown&lt;/code&gt;) не удовлетворяет параметру &lt;code&gt;useContainerState&lt;/code&gt;'s
&lt;code&gt;Ref&amp;lt;Element | null&amp;gt;&lt;/code&gt;, поэтому пример в исходном виде фактически не
компилировался. Теперь показан
&lt;code&gt;useTemplateRef&amp;lt;HTMLDivElement&amp;gt;('card')&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>State Machine 0.2.7</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-25-vue-state-machine-0-2-7</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-25-vue-state-machine-0-2-7"/>
    <updated>2026-09-25T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Примеры кода в README всё ещё импортировали нескопированное имя
&lt;code&gt;vue-state-machine&lt;/code&gt; в пяти местах вместо реального опубликованного
имени &lt;code&gt;@macrulez/vue-state-machine&lt;/code&gt; — остаток от переноса пакета под
scope.&lt;/li&gt;
&lt;li&gt;Пример &lt;code&gt;CheckoutCtx&lt;/code&gt; в гайде по визардам был объявлен через
&lt;code&gt;interface&lt;/code&gt; — TypeScript не даёт &lt;code&gt;interface&lt;/code&gt; неявную индексную
сигнатуру, нужную &lt;code&gt;Ctx&lt;/code&gt; (&lt;code&gt;Record&amp;lt;string, unknown&amp;gt;&lt;/code&gt;), поэтому
&lt;code&gt;WizardStep&amp;lt;CheckoutCtx&amp;gt;&lt;/code&gt; фактически не проходил типопроверку в том
виде, в каком был написан. Заменено на &lt;code&gt;type&lt;/code&gt;-алиас, как и в остальной
части этого же документа.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Color Value Tools 1.2.2</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-24-color-value-tools-1-2-2</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-24-color-value-tools-1-2-2"/>
    <updated>2026-09-24T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Новые импорты по подпутям для групп функций: &lt;code&gt;color-value-tools/parse&lt;/code&gt;,
&lt;code&gt;/convert&lt;/code&gt;, &lt;code&gt;/manipulate&lt;/code&gt;, &lt;code&gt;/palette&lt;/code&gt;, &lt;code&gt;/a11y&lt;/code&gt; и &lt;code&gt;/cache&lt;/code&gt;. Они работают
и через &lt;code&gt;import&lt;/code&gt;, и через &lt;code&gt;require&lt;/code&gt;, и поставляются со своими
TypeScript-типами. Импорт из корня пакета работает как раньше.&lt;/li&gt;
&lt;li&gt;ESM-потребители теперь получают ESM-декларации типов — раньше ESM-сборка
использовала &lt;code&gt;.d.ts&lt;/code&gt; от CommonJS.&lt;/li&gt;
&lt;li&gt;Пакет помечен как &lt;code&gt;sideEffects: false&lt;/code&gt;, поэтому бандлеры надёжнее
удаляют неиспользуемый код.&lt;/li&gt;
&lt;li&gt;CLI &lt;code&gt;cvt&lt;/code&gt; теперь использует собственную сборку пакета, а не отдельную
копию библиотеки. Команды и вывод не изменились.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.2.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-24-vue-image-kit-1-2-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-24-vue-image-kit-1-2-0"/>
    <updated>2026-09-24T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Записи &lt;code&gt;sources&lt;/code&gt; теперь могут нести собственные &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; для
брейкпоинтов арт-дирекции, чья обрезка отличается по соотношению сторон
от корневого изображения — либо как &lt;code&gt;{ src, width, height }&lt;/code&gt;, либо через
объект &lt;code&gt;ImageMeta&lt;/code&gt;, переданный напрямую (например, из импорта &lt;code&gt;?vik&lt;/code&gt;).
Если задать брейкпоинту собственные размеры, &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; резервирует
плейсхолдер — и превью blurhash — под пропорции именно этого брейкпоинта,
а не всегда откатывается к корневому изображению, поэтому переключение
брейкпоинтов больше не вызывает скачок вёрстки после загрузки настоящего
фото. Записи без &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; продолжают работать в точности как
раньше.&lt;/li&gt;
&lt;li&gt;Ключ &lt;code&gt;sources&lt;/code&gt;, для которого нет подходящего брейкпоинта, теперь выводит
предупреждение в режиме разработки — с именем ключа и списком доступных
брейкпоинтов — вместо того чтобы молча ничего не делать.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.1.8</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-24-vue-image-kit-1-1-8</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-24-vue-image-kit-1-1-8"/>
    <updated>2026-09-24T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; больше не навязывает &lt;code&gt;display&lt;/code&gt;/размеры блока/&lt;code&gt;object-fit&lt;/code&gt;
инлайн-стилями там, где это не нужно — инлайн-стили всегда перебивают
класс, который применяет ваше приложение на том же элементе, независимо
от специфичности. Явно заданный проп &lt;code&gt;fit&lt;/code&gt; по-прежнему применяется
инлайном (гарантированно побеждает). Если проп не задан, дефолт
&lt;code&gt;object-fit: cover&lt;/code&gt; теперь приходит из обычного, переопределяемого
CSS-класса — применяется только когда блок изображения действительно
ограничен (&lt;code&gt;layout&lt;/code&gt; &lt;code&gt;&amp;quot;fill&amp;quot;&lt;/code&gt;/&lt;code&gt;&amp;quot;fixed&amp;quot;&lt;/code&gt;, либо заданы одновременно &lt;code&gt;width&lt;/code&gt;
и &lt;code&gt;height&lt;/code&gt;), а иначе не применяется вовсе, так как &lt;code&gt;object-fit&lt;/code&gt; без
ограниченного блока не имеет эффекта. То же самое касается базовых
стилей &lt;code&gt;display&lt;/code&gt;/размеров — &lt;code&gt;width: 100%; height: auto&lt;/code&gt; теперь
применяется только когда заданы одновременно &lt;code&gt;width&lt;/code&gt; и &lt;code&gt;height&lt;/code&gt;
(иначе не из чего сохранять пропорции), поэтому &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; без этих
пропов, размер которого управляется вашим собственным CSS через
&lt;code&gt;max-height&lt;/code&gt;/&lt;code&gt;max-width&lt;/code&gt;, сохраняет естественные пропорции вместо
растягивания на всю ширину контейнера.&lt;/li&gt;
&lt;li&gt;Исправлено: стили пакета (анимация shimmer-плейсхолдера, а теперь и
классы выше) были недоступны через &lt;code&gt;import '@macrulez/vue-image-kit/style.css'&lt;/code&gt; — файл не был объявлен в &lt;code&gt;exports&lt;/code&gt;
пакета, из-за чего &lt;code&gt;placeholderMode=&amp;quot;shimmer&amp;quot;&lt;/code&gt; нигде фактически не
работал. Модуль Nuxt теперь подключает стили автоматически.&lt;/li&gt;
&lt;li&gt;Исправлено: удаление обёртки в 1.1.7 приводило к предупреждению Vue о
рассинхронизации при гидратации на каждой SSR-странице — проверка,
которая решала, что рендерить, не могла отличить «сервер» от «самого
первого рендера на клиенте во время гидратации», из-за чего они никогда
фактически не совпадали. Теперь компонент безопасен для гидратации.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>InView 0.2.3</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-24-inview-0-2-3</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-24-inview-0-2-3"/>
    <updated>2026-09-24T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Исправлено: задержка стаггера у &lt;code&gt;createRevealController&lt;/code&gt; (&lt;code&gt;--reveal-delay&lt;/code&gt;
и инлайн-стиль &lt;code&gt;transition-delay&lt;/code&gt;, который она выставляет) раньше
оставалась на элементе навсегда после его появления — из-за этого любой
другой transition на том же элементе, например hover-эффект на ссылке с
классом &lt;code&gt;.reveal&lt;/code&gt;, молча наследовал ту же задержку. Теперь задержка
автоматически снимается сразу после завершения самой reveal-анимации
(а если она вообще не запускается — например, из-за
&lt;code&gt;prefers-reduced-motion&lt;/code&gt; или отсутствия подходящего &lt;code&gt;transition&lt;/code&gt; в CSS —
то по истечении короткого запасного таймера), поэтому последующие
transition на элементе больше не задеты. Настраивать ничего не нужно —
это просто новое поведение по умолчанию.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.1.7</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-23-vue-image-kit-1-1-7</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-23-vue-image-kit-1-1-7"/>
    <updated>2026-09-23T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; больше не рендерится внутри обёртывающего &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;. Раньше
реальный &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; (и, пока идёт загрузка, любой активный
blurhash-&lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt;/LQIP-ThumbHash-&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;/сплошной цвет или
shimmer-&lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;) лежали внутри постоянного позиционирующего &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; —
это мешало встраивать компонент в чужую вёрстку, которая ожидает владеть
элементом напрямую. Теперь каждый вид плейсхолдера рисуется CSS-фоном
(&lt;code&gt;background-color&lt;/code&gt;/&lt;code&gt;background-image&lt;/code&gt;) прямо на том же элементе, который
затем покажет настоящее фото — до начала загрузки это отдельный элемент,
который полностью заменяется (а не оборачивает) реальным &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;/&lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;.
&lt;code&gt;class&lt;/code&gt;/&lt;code&gt;style&lt;/code&gt;/&lt;code&gt;data-*&lt;/code&gt; и другие атрибуты теперь долетают до этого
единственного реального элемента. Плавный кроссфейд «блюр просвечивает
сквозь проявляющееся резкое фото» технически больше недостижим —
переключение мгновенное; новый проп &lt;code&gt;fadeIn&lt;/code&gt; (см. ниже) — другой, более
простой эффект, а не замена старого.&lt;/li&gt;
&lt;li&gt;Новый проп &lt;code&gt;fadeIn&lt;/code&gt; у &lt;code&gt;&amp;lt;VImage&amp;gt;&lt;/code&gt; (по умолчанию &lt;code&gt;false&lt;/code&gt;) — опциональное
плавное появление (&lt;code&gt;opacity&lt;/code&gt; 0→1, ~0.3с) при монтировании.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Color Value Tools 1.2.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-color-value-tools-1-2-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-color-value-tools-1-2-1"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;code&gt;isReadableOnBackground()&lt;/code&gt;: поле &lt;code&gt;wcagLevel&lt;/code&gt; теперь вычисляется по тому
же эффективному цвету фона, что и &lt;code&gt;minContrastRatio&lt;/code&gt;/&lt;code&gt;readable&lt;/code&gt;, для
фонов &lt;code&gt;'semi-transparent'&lt;/code&gt;/&lt;code&gt;'gradient'&lt;/code&gt; — раньше всегда использовался
&lt;code&gt;'#ffffff'&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Command Palette 0.2.9</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-command-palette-0-2-9</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-command-palette-0-2-9"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bindShortcuts&lt;/code&gt; теперь регистрирует горячие клавиши и для вложенных
&lt;code&gt;subCommand&lt;/code&gt;, а не только для команд верхнего уровня.&lt;/li&gt;
&lt;li&gt;Резервный обработчик горячих клавиш (&lt;code&gt;runFallback&lt;/code&gt;, срабатывающий без
смонтированного &lt;code&gt;&amp;lt;CommandPalette&amp;gt;&lt;/code&gt;) теперь корректно открывает
&lt;code&gt;page&lt;/code&gt;-команды без &lt;code&gt;subCommands&lt;/code&gt; и учитывает &lt;code&gt;confirm&lt;/code&gt;/частоту
использования, как основной &lt;code&gt;executeCommand&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Подсветка совпадений в &lt;code&gt;CommandItem&lt;/code&gt; переиспользует
диакритико-независимый скорер &lt;code&gt;FuzzySearch&lt;/code&gt; вместо отдельной, менее
точной реализации.&lt;/li&gt;
&lt;li&gt;Nuxt-модуль теперь регистрирует компоненты пакета через &lt;code&gt;addComponent&lt;/code&gt;
и автоимпортирует все composables/фабрики, а не только 3 из них.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;isLoading&lt;/code&gt; в &lt;code&gt;CommandPalette.vue&lt;/code&gt; заменён на счётчик активных
запросов — параллельные независимые поисковые пайплайны больше не
гасят индикатор загрузки друг друга раньше времени.&lt;/li&gt;
&lt;li&gt;Слияние асинхронных результатов поиска теперь заменяет уже слитый
синхронный результат более точным асинхронным при совпадении id, а не
оставляет «первый зарегистрированный».&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PaletteProvider&lt;/code&gt; (testing.ts) теперь также предоставляет
&lt;code&gt;PALETTE_REGISTRY_KEY&lt;/code&gt; — именованные инстансы
(&lt;code&gt;useCommandPalette('name')&lt;/code&gt;) корректно резолвятся под ним.&lt;/li&gt;
&lt;li&gt;Глобальный hotkey-тоггл (&lt;code&gt;installPalette&lt;/code&gt;) и &lt;code&gt;toggle()&lt;/code&gt;/&lt;code&gt;open()&lt;/code&gt;/
&lt;code&gt;close()&lt;/code&gt; из &lt;code&gt;useCommandPalette()&lt;/code&gt; приведены к единой логике
открытия/закрытия (включая очистку &lt;code&gt;history&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Опции Nuxt-модуля (&lt;code&gt;vCommandPalette&lt;/code&gt;), содержащие функции (&lt;code&gt;onOpen&lt;/code&gt;,
&lt;code&gt;onError&lt;/code&gt;, &lt;code&gt;search&lt;/code&gt;, &lt;code&gt;onSearch&lt;/code&gt; и т.д.), больше не сериализуются в
клиентский &lt;code&gt;runtimeConfig.public&lt;/code&gt; — через эту границу проходит только
сериализуемая часть.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>CSS Magic Gradient 1.3.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-css-magic-gradient-1-3-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-css-magic-gradient-1-3-1"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;В &lt;code&gt;css-magic-gradient/vue&lt;/code&gt; и &lt;code&gt;css-magic-gradient/react&lt;/code&gt; добавлены
реактивные хуки &lt;code&gt;useMonochromaticGradient&lt;/code&gt; и &lt;code&gt;useHueWheelGradient&lt;/code&gt; —
ранее эти генераторы были доступны только как обычные функции, без
реактивной обёртки, в отличие от остальных 8 генераторов пакета.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Error Boundary Kit 0.3.5</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-error-boundary-kit-0-3-5</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-error-boundary-kit-0-3-5"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;AsyncBoundary&amp;gt;&lt;/code&gt; теперь регистрируется Nuxt-модулем как глобальный
компонент, наравне с &lt;code&gt;&amp;lt;ErrorBoundary&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;createHttpReporter&lt;/code&gt; теперь возвращает функцию отписки от &lt;code&gt;pagehide&lt;/code&gt;,
чтобы слушатель можно было снять.&lt;/li&gt;
&lt;li&gt;Список &lt;code&gt;autoImports&lt;/code&gt; Nuxt-модуля дополнен — теперь покрывает все
composables/фабрики пакета, а не только 3 из них.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Feature Toggles 0.2.0</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-feature-toggles-0-2-0</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-feature-toggles-0-2-0"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;В тип &lt;code&gt;FlagSource&lt;/code&gt; добавлено значение &lt;code&gt;'live'&lt;/code&gt; для флагов, обновляемых
через SSE/WebSocket.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Feature&amp;gt;&lt;/code&gt; без &lt;code&gt;name&lt;/code&gt; и без &lt;code&gt;group&lt;/code&gt; теперь выводит предупреждение в
dev-режиме вместо тихого рендера fallback/ничего.&lt;/li&gt;
&lt;li&gt;Nuxt-модуль теперь принимает &lt;code&gt;loader&lt;/code&gt;/&lt;code&gt;rules&lt;/code&gt; в собственном конфиге и
автоимпортирует composables пакета.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Form Schema 0.2.8</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-form-schema-0-2-8</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-form-schema-0-2-8"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@macrulez/nuxt-vue-form-schema&lt;/code&gt; теперь либо опубликован в npm по-настоящему,
либо все упоминания об установке убраны из документации.&lt;/li&gt;
&lt;li&gt;Асинхронная функция &lt;code&gt;options()&lt;/code&gt; поля больше не запускается на каждое
изменение значения формы — только при изменении её собственных
&lt;code&gt;optionsDeps&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;isValid&lt;/code&gt; теперь учитывает ожидающий асинхронный валидатор, а не только
&lt;code&gt;submit()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ключ &lt;code&gt;persistKey&lt;/code&gt; по умолчанию больше не строится как простой список
имён полей через запятую — устранена коллизия хранилища между разными
формами с одинаково названными полями.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;remove&lt;/code&gt;/&lt;code&gt;move&lt;/code&gt;/&lt;code&gt;swap&lt;/code&gt; в &lt;code&gt;useFieldArray&lt;/code&gt; теперь корректно перенумеровывают
&lt;code&gt;form.errors&lt;/code&gt;/&lt;code&gt;form.touched&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Панель Vue DevTools подключается автоматически при установке плагина —
без отдельного вызова &lt;code&gt;installFormDevtools(app)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>i18n Kit 0.4.12</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-i18n-kit-0-4-12</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-i18n-kit-0-4-12"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Типы &lt;code&gt;I18nKitConfig&lt;/code&gt;, &lt;code&gt;LocaleConfig&lt;/code&gt; и &lt;code&gt;LocaleMeta&lt;/code&gt; теперь
экспортируются из &lt;code&gt;vue-i18n-kit/config&lt;/code&gt; — их можно использовать для
типизации собственного &lt;code&gt;i18n-kit.config.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Удалён неиспользуемый мёртвый код &lt;code&gt;src/cli/commands/init.ts&lt;/code&gt;
(&lt;code&gt;runInit&lt;/code&gt;) — не был подключён ни к CLI, ни к тестам, и использовал
устаревший синтаксис плюрализации, несовместимый с ICU-движком пакета.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Image Kit 1.1.6</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-image-kit-1-1-6</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-image-kit-1-1-6"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;code&gt;v-lazy-img&lt;/code&gt; теперь использует общий пул &lt;code&gt;IntersectionObserver&lt;/code&gt; вместо
создания отдельного наблюдателя на каждый элемент.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;layout&lt;/code&gt; без явного значения теперь получает тот же авто-расчёт &lt;code&gt;sizes&lt;/code&gt;,
что и &lt;code&gt;layout=&amp;quot;responsive&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Blurhash- и LQIP/thumbhash-плейсхолдеры больше не могут одновременно
монтироваться при передаче обоих пропов — восстановлен единый приоритет
плейсхолдеров.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>InView 0.2.2</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-inview-0-2-2</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-inview-0-2-2"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Nuxt-модуль теперь также регистрирует компонент &lt;code&gt;&amp;lt;InView&amp;gt;&lt;/code&gt; и пару
&lt;code&gt;setViewportDefaults&lt;/code&gt;/&lt;code&gt;viewportDefaults&lt;/code&gt;, а не только
composables/утилиты/директиву &lt;code&gt;v-reveal&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Network Dashboard 0.4.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-network-dashboard-0-4-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-vue-network-dashboard-0-4-1"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Исправлена собственная типопроверка пакета (&lt;code&gt;npm run type-check&lt;/code&gt;) —
расширена декларация модуля &lt;code&gt;*.vue&lt;/code&gt;, чтобы учитывать именованные
экспорты типов (например, &lt;code&gt;NetworkDebuggerProps&lt;/code&gt;) из
&lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt;-компонентов.&lt;/li&gt;
&lt;li&gt;Удалён/переработан мёртвый и расходящийся код composables
&lt;code&gt;useHotkey.ts&lt;/code&gt; и &lt;code&gt;useLogFilter.ts&lt;/code&gt;, дублировавший инлайн-логику
&lt;code&gt;NetworkDebugger.vue&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Устранена дормантная утечка состояния &lt;code&gt;localStorage&lt;/code&gt; между тестами —
добавлен сброс мока в тестах &lt;code&gt;persistToStorage&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Исправлены примеры импорта из подпутей в JSDoc-комментариях
(&lt;code&gt;devtools.ts&lt;/code&gt;, &lt;code&gt;adapters/sentry.ts&lt;/code&gt;, &lt;code&gt;adapters/opentelemetry.ts&lt;/code&gt;) —
все три символа доступны только из корня пакета.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>OS Detect 2.2.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-os-detect-2-2-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-os-detect-2-2-1"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;code&gt;detectIsiOS()&lt;/code&gt; (устаревший алиас) теперь выводит предупреждение об
устаревании один раз, а не при каждом вызове.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;useIsWindows11()&lt;/code&gt; (Vue и React) больше не вызывает setter/присваивание
ref после размонтирования компонента.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;detectIsWindows11()&lt;/code&gt; теперь кэшируется, как и остальные детекторы, с
поддержкой сброса через &lt;code&gt;resetDetectionCache()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Версия в &lt;code&gt;package-lock.json&lt;/code&gt; синхронизирована с &lt;code&gt;package.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Responsive Media 2.0.1</title>
    <id>https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-responsive-media-2-0-1</id>
    <link href="https://npm.vuecraft.ru/changelog/2026-09#2026-09-12-responsive-media-2-0-1"/>
    <updated>2026-09-12T00:00:00Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;code&gt;isAbove(key)&lt;/code&gt; теперь корректно возвращает &lt;code&gt;false&lt;/code&gt; для нераспознанного
ключа брейкпоинта — исправлено в core-, Vue- и React-реализациях.&lt;/li&gt;
&lt;li&gt;Две независимые реализации &lt;code&gt;isSSR()&lt;/code&gt; в пакете объединены в одну, более
строгую проверку (наличие &lt;code&gt;window&lt;/code&gt; и &lt;code&gt;window.matchMedia&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;useBreakpoints()&lt;/code&gt; (Vue) теперь учитывает &lt;code&gt;inject()&lt;/code&gt;/DI, как и
&lt;code&gt;useResponsive()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;useMediaQuery()&lt;/code&gt; (Vue) больше не может утечь слушатель &lt;code&gt;matchMedia&lt;/code&gt;
при вызове вне активного компонента — composable всегда возвращает
функцию отписки.&lt;/li&gt;
&lt;li&gt;React &lt;code&gt;useContainerState()&lt;/code&gt; пересоздаёт &lt;code&gt;ResizeObserver&lt;/code&gt;, если
&lt;code&gt;ref.current&lt;/code&gt; был &lt;code&gt;null&lt;/code&gt; при первом срабатывании эффекта (например,
элемент под условным рендером/порталом).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hydrate(initialState)&lt;/code&gt; больше не отбрасывает молча ключи, которых нет
в текущем состоянии — теперь выводится предупреждение.&lt;/li&gt;
&lt;li&gt;Добавлено базовое покрытие тестами для Vue- и React-адаптеров (ранее
тестировалось только фреймворк-независимое ядро).&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
</feed>
