Graduation
/
ui
/node_modules
/@xyflow
/svelte
/dist
/lib
/components
/EdgeWrapper
/EdgeWrapper.svelte
<svelte:options immutable /> | |
<script>import { createEventDispatcher, setContext } from 'svelte'; | |
import cc from 'classcat'; | |
import { getMarkerId } from '@xyflow/system'; | |
import { useStore } from '../../store'; | |
import { BezierEdgeInternal } from '../edges'; | |
import { useHandleEdgeSelect } from '../../hooks/useHandleEdgeSelect'; | |
export let id; | |
export let type = 'default'; | |
export let source = ''; | |
export let target = ''; | |
export let data = {}; | |
export let style = undefined; | |
export let zIndex = undefined; | |
export let animated = false; | |
export let selected = false; | |
export let selectable = undefined; | |
export let deletable = undefined; | |
export let hidden = false; | |
export let label = undefined; | |
export let labelStyle = undefined; | |
export let markerStart = undefined; | |
export let markerEnd = undefined; | |
export let sourceHandle = undefined; | |
export let targetHandle = undefined; | |
export let sourceX; | |
export let sourceY; | |
export let targetX; | |
export let targetY; | |
export let sourcePosition; | |
export let targetPosition; | |
export let ariaLabel = undefined; | |
export let interactionWidth = undefined; | |
// @ todo: support edge updates | |
let className = ''; | |
export { className as class }; | |
setContext('svelteflow__edge_id', id); | |
const { edgeLookup, edgeTypes, flowId, elementsSelectable } = useStore(); | |
const dispatch = createEventDispatcher(); | |
$: edgeType = type || 'default'; | |
$: edgeComponent = $edgeTypes[edgeType] || BezierEdgeInternal; | |
$: markerStartUrl = markerStart ? `url('#${getMarkerId(markerStart, $flowId)}')` : undefined; | |
$: markerEndUrl = markerEnd ? `url('#${getMarkerId(markerEnd, $flowId)}')` : undefined; | |
$: isSelectable = selectable ?? $elementsSelectable; | |
const handleEdgeSelect = useHandleEdgeSelect(); | |
function onClick(event) { | |
const edge = $edgeLookup.get(id); | |
if (edge) { | |
handleEdgeSelect(id); | |
dispatch('edgeclick', { event, edge }); | |
} | |
} | |
function onMouseEvent(event, type) { | |
const edge = $edgeLookup.get(id); | |
if (edge) { | |
dispatch(type, { event, edge }); | |
} | |
} | |
</script> | |
<!-- svelte-ignore a11y-click-events-have-key-events --> | |
<!-- svelte-ignore a11y-no-noninteractive-element-interactions --> | |
{#if !hidden} | |
<svg style:z-index={zIndex}> | |
<g | |
class={cc(['svelte-flow__edge', className])} | |
class:animated | |
class:selected | |
class:selectable={isSelectable} | |
data-id={id} | |
on:click={onClick} | |
on:contextmenu={(e) => { | |
onMouseEvent(e, 'edgecontextmenu'); | |
}} | |
on:mouseenter={(e) => { | |
onMouseEvent(e, 'edgemouseenter'); | |
}} | |
on:mouseleave={(e) => { | |
onMouseEvent(e, 'edgemouseleave'); | |
}} | |
aria-label={ariaLabel === null | |
? undefined | |
: ariaLabel | |
? ariaLabel | |
: `Edge from ${source} to ${target}`} | |
role="img" | |
> | |
<svelte:component | |
this={edgeComponent} | |
{id} | |
{source} | |
{target} | |
{sourceX} | |
{sourceY} | |
{targetX} | |
{targetY} | |
{sourcePosition} | |
{targetPosition} | |
{animated} | |
{selected} | |
{label} | |
{labelStyle} | |
{data} | |
{style} | |
{interactionWidth} | |
selectable={isSelectable} | |
deletable={deletable ?? true} | |
type={edgeType} | |
sourceHandleId={sourceHandle} | |
targetHandleId={targetHandle} | |
markerStart={markerStartUrl} | |
markerEnd={markerEndUrl} | |
/> | |
</g> | |
</svg> | |
{/if} | |