Подписи соединений
У соединения может быть любое число подписей в любом месте линии. Подпись с text рисует сама библиотека, а подпись без него — просто позиция для содержимого, которое вы рендерите сами.
linker.setConnections([
{
id: 'a-b',
from: { blockId: 'a' },
to: { blockId: 'b' },
labels: [
{ id: 'method', position: 'start', text: 'POST' },
{ id: 'name', position: 0.5, text: 'идёт вдоль линии', rotate: true, offset: -14 },
{ id: 'custom', position: 'end' }, // без text: только позиция для вашего содержимого
],
},
])Подпись, которую рисует библиотека, — это SVG-«таблетка»: скруглённый прямоугольник по размеру текста с текстом сверху. Без labels слот Vue #connection-label работает как раньше: одна подпись посередине линии.
Описание подписи
ConnectionLabel
id
string
Уникален в пределах соединения.
position
'start' | 'middle' | 'end' | number
Где на линии. 'start' и 'end' стоят на небольшом расстоянии (24px, не больше половины линии) от своего конца, чтобы не закрывать маркер. 'middle' — посередине. Число — доля длины линии, 0..1.
offset
number · по умолчанию: 0
Расстояние от линии, в px, вдоль её нормали. Положительное значение — справа по ходу линии, то есть под линией, идущей слева направо.
text
string · по умолчанию: — (не задано, подпись вы рендерите сами)
Текст подписи, которую рисует библиотека.
className
string · по умолчанию: — (не задано)
CSS-класс, который добавляется к <g> подписи, нарисованной библиотекой.
rotate
boolean · по умолчанию: false
Поворачивает подпись вдоль линии. Она всегда остаётся «вверх головой» — никогда не переворачивается.
Позиции на линии
Точка ищется по длине вдоль настоящего пути: по кривой для bezier, по маршруту для smoothstep (меряется до углов, до скругления). Рассчитанная позиция каждой подписи приходит в ConnectionLayout.labels события layout, по одному LabelLayout на подпись:
id— id подписи.point— где её центрировать, с уже применённымoffset.angle— направление хода линии в этой точке, в градусах.rotation— угол, на который повернуть подпись: «прямая» версияangleприrotate, иначе0.text,className— копируются из подписи.
Библиотека не защищает подписи от наложения друг на друга: подписи, расположенные рядом, вы разносите сами.
Оформление подписи, нарисованной библиотекой
Вид всех подписей, которые рисует библиотека, задаётся в группе labels конфигурации: background, border, color, fontSize, paddingX, paddingY и opacity, и каждое поле доступно также в состояниях highlight, hover, selected и focus соединения подписи. Цвета по умолчанию берутся из токенов темы labelBackground, labelBorder и labelText (--vl-label-bg, --vl-label-border, --vl-label-color).
Для остального дайте подписи className и оформите части: .vl-label-bg для «таблетки» и .vl-label-text для текста. Все подписи экземпляра лежат в одной группе, которая всегда рисуется последней, поэтому линия никогда не закрывает подпись.
Подписи в Vue
#connection-label вызывается по одному разу на каждую подпись без text с { connection, label, point, angle, rotation, from, to }; подписи с text рисует движок. Для соединения без labels слот вызывается один раз, посередине, как раньше. См. Компонент VisualLinker.
<VisualLinker :connections="connections">
<template #connection-label="{ label }">
<span class="badge">{{ label?.id }}</span>
</template>
</VisualLinker>