Visual Linker
Рисует умные, автоматически прокладываемые SVG-линии между DOM-блоками, которые уже находятся под вашим контролем — для vanilla JS, Vue 3 и Nuxt. Позиционирование блоков остаётся за вами, пакет только измеряет их и рисует соединения.
Возможности
- Автоматический выбор стороны подключения — каждое соединение само решает, с какой стороны блока входить/выходить, на основе положения второго конца;
FixedSide[]сужает этот выбор до подмножества сторон, а ограниченный наклон угла может подтягивать угол входа/выхода в сторону реального направления на цель - Три типа кривых —
bezier(настраиваемые кривизна, минимальный/максимальный вылет, наклон угла),smoothstep(ортогональная трассировка со скруглёнными углами и групповыми точками ветвления для соединений, делящих один порт) иstraight - Перетаскивание блоков — перетаскивание указателем с опциональной ручкой захвата, привязкой к px-сетке и границами, ограниченными контейнером, элементом или отступом внутрь; каждое связанное соединение отслеживает перетаскиваемый блок в реальном времени
- Типизированный API событий —
block:dragstart/drag/dragend,block:mouseenter/mouseleave,connection:click/mouseenter/mouseleave/selectionchange/delete-request, и событиеlayoutна каждый рендер с посчитанной геометрией всех соединений и портов - Стилизация каждого соединения по отдельности — цвет, толщина, пунктир, маркеры начала/конца (четыре встроенные формы или произвольный SVG, по желанию — со стрелкой направления, пристыкованной к фигуре), и отдельный стиль при наведении — всё переопределяемо для конкретного соединения поверх настроек по умолчанию на уровне инстанса
- Аккуратные диаграммы — линии
smoothstepможно прокладывать в обход других блоков (lines.routing.avoidObstacles), и они перепрыгивают через линии, которые пересекают (lines.jumps); соединения, делящие сторону порта, могут получать каждое свой виртуальный порт (ports.spread) - Подписи, поток и выделение — любое число подписей в любом месте линии (нарисованных библиотекой или вашим содержимым), анимированный штриховой или точечный поток, показывающий направление, и выделяемые соединения, доступные с клавиатуры и скринридерам, которые просят приложение удалить, а не удаляют себя сами
- Прокручиваемые контейнеры — порт, уехавший из обрезающего предка, прижимает свою линию к видимому краю (или скрывает её), а не висит над посторонним содержимым
- Одна структурированная конфигурация — единый
VisualLinkerConfig(theme,lines,markers,ports,labels,blocks,interaction) для движка, компонента Vue и модуля Nuxt;styleсоединения имеет ту же форму, что и группаlines, а всю конфигурацию можно менять во время работы - Визуальные состояния —
highlight,hover,selectedиfocusдля линий, маркеров, портов и подписей, у каждого свои поля: маркер может превратиться из точки в ромб при наведении, а линия — быть приглушённой в покое и набирать полную силу под курсором;hoverиhighlightвключаются по запросу (interaction.hover,interaction.highlight) - Темы — токены цветов, записываемые в CSS-переменные, с
lightTheme,darkThemeиdefineTheme()для своих; одна тема для всех диаграмм приложения Vue или проекта Nuxt переключается одним присваиванием - Реакция на resize и scroll — каждое соединение пересчитывает себя при изменении размера блока или контейнера, а также при прокрутке страницы — без ручной подписки на события
- Компонент, composable и модуль Nuxt —
<VisualLinker>вокруг вашей собственной разметки (блоки помечаются черезv-vl-block/data-vl-blockна любой глубине или где угодно на странице соscope="page"), низкоуровневый composableuseVisualLinker(), и модуль Nuxt с автоимпортами, зарегистрированными директивами и дефолтами уровня конфига для рендеринга кривых/портов - Рецепты — полные проверенные примеры для чистого JavaScript, Vue и Nuxt: ER-диаграмма, редактор потоков, сопоставление полей между списками с прокруткой, редактируемая диаграмма с сохранённой раскладкой, переключение тем и карта сервисов в реальном времени; начните со страницы Схема базы данных (ER-диаграмма)
Управление созданием соединений мышью и режим авто-раскладки пока в планах — полный список вех смотрите в docs/TECH_SPEC.md самого пакета. Всё перечисленное выше уже реализовано и протестировано.