Стилизация соединений
Всё, что определяет внешний вид одного соединения, лежит в его style (ConnectionStyle). style имеет ту же форму, что и группа lines конфигурации, плюс поле markers для концов. Поле, которое не задано, берётся из группы lines конфигурации, затем из темы, затем из встроенного значения.
linker.setConnections([
{
id: 'a-b',
from: { blockId: 'a' },
to: { blockId: 'b' },
style: {
color: '#6366f1',
width: 2,
hover: { width: 3 },
markers: { end: { shape: 'arrow', size: 8 } },
},
},
])Стилизация соединения
ConnectionStyle
curve
'bezier' | 'straight' | 'smoothstep' · по умолчанию: берётся из lines.curve ('bezier')
Что делает каждый тип кривой, смотрите на странице Соединения.
color
string · по умолчанию: берётся из lines.color, затем из line темы ('#2e8b57')
width
number · по умолчанию: берётся из lines.width (1.5)
dashed
boolean · по умолчанию: берётся из lines.dashed (false)
opacity
number, от 0 до 1 · по умолчанию: берётся из lines.opacity (1)
Прозрачность линии. Маркеры без собственной прозрачности бледнеют вместе с ней.
highlight, hover, selected, focus
{ color?; width?; dashed?; opacity? } · по умолчанию: берётся из той же корзины lines
Поля, которые меняются, пока соединение находится в этом состоянии; каждое возвращается к значению ниже, если не задано. Что означают четыре состояния и как они складываются, смотрите на странице Визуальные состояния. hover и highlight действуют, только пока включены interaction.hover и interaction.highlight.
bezier
{ curvature?; minReach?; maxReach?; angleBlend?; angleMaxOffset? } · по умолчанию: берётся из lines.bezier
Форма кривой bezier — curvature (0.5), minReach (24), maxReach (160), angleBlend (0.55) и angleMaxOffset (30, в градусах). Каждое поле описано в Структуре конфигурации. Только для curve: 'bezier'.
smoothstep
{ cornerRadius?; maxTrunkReach? } · по умолчанию: берётся из lines.smoothstep
Форма линии smoothstep — cornerRadius (8) скругляет изгибы и точку ветвления, где соединения с общим портом отделяются от ствола, а maxTrunkReach (48) ограничивает, насколько далеко идёт такой ствол. Если у соседей разные maxTrunkReach, группа использует наименьшее значение. Только для curve: 'smoothstep'.
routing
{ avoidObstacles?; padding? } · по умолчанию: берётся из lines.routing
Прокладывает это соединение smoothstep в обход других блоков; avoidObstacles: false исключает его из настройки, сделанной для всех линий. См. Маршрутизация и пересечения.
jumps
boolean | { radius?: number } · по умолчанию: берётся из lines.jumps
Заставляет это соединение smoothstep перепрыгивать через линии, которые оно пересекает; false исключает его. См. Маршрутизация и пересечения.
animated
boolean | ConnectionFlow · по умолчанию: берётся из lines.animated (выключено)
Пускает вдоль линии узор из штрихов или точек, от from к to. true берёт значения по умолчанию, объект настраивает их (speed, direction, shape, dash, gap, color, width), false отключает настройку, сделанную для всех линий. См. Анимированный поток.
markers
{ start?: MarkerInput; end?: MarkerInput } · по умолчанию: берётся из markers.start и markers.end конфигурации, иначе встроенная точка порта
Маркеры на двух концах линии. MarkerInput — это false, название формы (сокращение для { shape }) или конфигурация маркера. false убирает даже встроенную точку порта на этом конце, оставляя голую точку, — для случая, когда единственным, что там рисуется, должен быть слот Vue #marker или ничего. Конфигурация маркера, заданная здесь, сливается по полям с маркером того же конца из конфигурации. 'arrow' на конце показывает направление соединения. Поля описаны ниже в разделе про формы маркеров.
Пример — все поля сразу:
linker.setConnections([
{
id: 'a-b', // собственный id этого соединения
from: { blockId: 'a' }, // начинается на границе блока "a"
to: { blockId: 'b' }, // заканчивается на границе блока "b"
style: {
curve: 'smoothstep', // ортогональная трассировка вместо дефолтного bezier
color: '#6366f1', // индиго вместо зелёного по умолчанию
width: 2, // чуть толще дефолтных 1.5px
dashed: false, // сплошная линия
opacity: 0.8, // в покое чуть приглушена
bezier: { curvature: 0.6, minReach: 24, maxReach: 160, angleBlend: 0.55, angleMaxOffset: 30 }, // здесь не действует, curve равен 'smoothstep'
smoothstep: { cornerRadius: 12, maxTrunkReach: 60 }, // более круглые изгибы, чуть длиннее общий ствол
routing: { avoidObstacles: true, padding: 12 }, // обходить другие блоки
jumps: { radius: 6 }, // перепрыгивать через линии, которые это соединение пересекает
animated: { shape: 'dashes', speed: 60, direction: 'forward' }, // узор бежит от a к b
highlight: { width: 2.5 }, // наведённый блок слегка подсвечивает эту линию
hover: { color: '#312e81', width: 3, opacity: 1 }, // под курсором темнее, толще и полностью непрозрачна
selected: { color: '#1f6feb' }, // нужен interaction.selectable
focus: { width: 4 }, // клавиатурный фокус
markers: {
start: false, // ни точки, ни маркера на этом конце
end: { shape: 'arrow', size: 8, hover: { size: 11 } }, // более крупная стрелка, которая при наведении растёт ещё сильнее
},
},
},
])Формы маркеров
MarkerConfig
Полная форма маркера: используется для markers.start и markers.end здесь и в группе markers конфигурации. Голое имя формы (например, 'arrow') — это сокращение для { shape: 'arrow' }.
shape
'circle' | 'square' | 'diamond' | 'arrow' · по умолчанию: 'circle'
Игнорируется, если задан svg.
size
number · по умолчанию: размер для этой формы из markers.sizes (6)
Размер маркера как множитель текущей толщины линии соединения — так он масштабируется вместе с более толстой или подсвеченной линией.
color
string · по умолчанию: берётся из цвета линии соединения на данный момент
Цвет заливки для встроенной формы. Игнорируется для 'arrow' (заливки нет — см. strokeColor).
strokeColor
string · по умолчанию: — (без обводки)
Цвет обводки для встроенных форм 'circle'/'square'/'diamond'. Не влияет на 'arrow', который уже использует color как единственный штрих.
strokeWidth
number · по умолчанию: 1
Толщина обводки в собственных единицах viewBox маркера. Игнорируется, если strokeColor не задан.
opacity
number, от 0 до 1 · по умолчанию: берётся из opacity соединения
className
string · по умолчанию: — (не задано)
CSS-класс, который добавляется к корневому SVG-элементу маркера, для полной стилизации через внешний CSS.
svg
string · по умолчанию: — (не задано)
Сырая внутренняя SVG-разметка для полностью своего маркера (переопределяет shape), рисуется во viewBox 0 0 20 20 с центром в конечной точке соединения.
Вставляется как есть — передавайте только разметку, которой доверяете, никогда не пропускайте через это непроверенный пользовательский ввод.
orient
'auto' | 'fixed' · по умолчанию: зависит от shape ('auto' для встроенной 'arrow', иначе 'fixed')
'auto' поворачивает маркер вслед за направлением линии; 'fixed' оставляет его прямым. Всегда 'auto', когда задан arrow.
arrow
boolean | MarkerArrowConfig · по умолчанию: — (без стрелки)
Дополнительно рисует на линии прямо перед фигурой стрелку, кончик которой упирается ровно во внешний край фигуры (вместе с обводкой) — точка порта и стрелка направления в одном маркере вместо двух перекрывающихся. true использует значения по умолчанию ниже. Игнорируется, если shape сам равен 'arrow'.
MarkerArrowConfig
color
string · по умолчанию: берётся из цвета линии соединения (а не из заливки фигуры)
gap
number · по умолчанию: 0
Дополнительный зазор между кончиком стрелки и краем фигуры в 20-единичном viewBox маркера. Для собственного svg-маркера, край которого измерить нельзя, это расстояние от самой конечной точки.
highlight, hover, selected, focus
Partial<MarkerConfig> · по умолчанию: — (не задано, маркер выглядит одинаково во всех состояниях)
Поля, которые меняются, пока соединение маркера находится в этом состоянии. Маркер может сменить shape, size, цвета или целый собственный svg. См. Визуальные состояния.
Пример — фигура, которая меняется при наведении и выделении:
markers: {
end: {
shape: 'circle',
size: 6,
hover: { shape: 'diamond', size: 10, strokeColor: '#ffffff', strokeWidth: 1 }, // под курсором — ромб с обводкой
selected: { svg: '<path d="M4,4 L16,10 L4,16 L8,10 Z" fill="#1f6feb" />' }, // после выделения — собственная фигура
},
}Пример — фигура со стрелкой:
markers: {
end: {
shape: 'circle', // точка остаётся на конечной точке
color: '#ffffff', // белая заливка
strokeColor: '#6366f1', // индиго-обводка — кончик стрелки упирается в её внешний край
strokeWidth: 2,
arrow: { color: '#e0526c', gap: 1 }, // свой цвет, 1 единица viewBox воздуха перед обводкой
},
}Пример — все поля сразу:
markers: {
end: {
shape: 'diamond', // одна из 'circle' | 'square' | 'diamond' | 'arrow' — игнорируется, если задан svg
size: 8, // крупнее дефолтных 6× толщины линии
color: '#f59e0b', // янтарная заливка вместо цвета линии
strokeColor: '#78350f', // тёмно-янтарная обводка вокруг фигуры
strokeWidth: 1.5, // толщина обводки в собственных единицах viewBox маркера
opacity: 0.9, // чуть прозрачнее
className: 'vl-marker--priority', // зацепка для дополнительного CSS, который вы контролируете снаружи
orient: 'fixed', // остаётся прямым вместо поворота вслед за направлением линии
},
}Если вместо shape задать svg: '<path d="..." />', эта разметка рисуется напрямую и полностью переопределяет shape и встроенные формы — полезно для маркера, который не покрывает ни одна встроенная форма (своя иконка, логотип компании).