@flowgram-vue/free-lines-plugin 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/LICENSE +22 -0
  2. package/dist/index.cjs +1026 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.css +120 -0
  5. package/dist/index.css.map +1 -0
  6. package/dist/index.d.ts +269 -0
  7. package/dist/index.js +1013 -0
  8. package/dist/index.js.map +1 -0
  9. package/package.json +63 -0
  10. package/src/__tests__/__snapshots__/bezier-controls.spec.ts.snap +20 -0
  11. package/src/__tests__/bezier-controls.spec.ts +25 -0
  12. package/src/components/index.ts +8 -0
  13. package/src/components/workflow-line-render/arrow.ts +60 -0
  14. package/src/components/workflow-line-render/index.css +22 -0
  15. package/src/components/workflow-line-render/index.ts +6 -0
  16. package/src/components/workflow-line-render/line-svg.ts +131 -0
  17. package/src/components/workflow-port-render/cross-hair.ts +16 -0
  18. package/src/components/workflow-port-render/index.css +121 -0
  19. package/src/components/workflow-port-render/index.ts +183 -0
  20. package/src/constants/lines.ts +9 -0
  21. package/src/constants/points.ts +12 -0
  22. package/src/contributions/bezier/bezier-controls.ts +105 -0
  23. package/src/contributions/bezier/index.ts +121 -0
  24. package/src/contributions/fold/fold-line.ts +293 -0
  25. package/src/contributions/fold/index.ts +97 -0
  26. package/src/contributions/index.ts +8 -0
  27. package/src/contributions/straight/index.ts +89 -0
  28. package/src/contributions/straight/point-on-line.ts +37 -0
  29. package/src/contributions/utils.ts +37 -0
  30. package/src/create-free-lines-plugin.ts +44 -0
  31. package/src/css.d.ts +6 -0
  32. package/src/env.d.ts +10 -0
  33. package/src/index.ts +12 -0
  34. package/src/layer/index.ts +8 -0
  35. package/src/layer/workflow-lines-layer.ts +201 -0
  36. package/src/type.ts +40 -0
  37. package/src/types/arrow-renderer.ts +32 -0
  38. package/src/wrap-layer-render.ts +38 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants/points.ts","../src/components/workflow-port-render/cross-hair.ts","../src/components/workflow-port-render/index.ts","../src/constants/lines.ts","../src/wrap-layer-render.ts","../src/contributions/utils.ts","../src/components/workflow-line-render/arrow.ts","../src/components/workflow-line-render/line-svg.ts","../src/layer/workflow-lines-layer.ts","../src/contributions/bezier/bezier-controls.ts","../src/contributions/bezier/index.ts","../src/contributions/fold/fold-line.ts","../src/contributions/fold/index.ts","../src/contributions/straight/point-on-line.ts","../src/contributions/straight/index.ts","../src/create-free-lines-plugin.ts"],"names":["defineComponent","h","toRelative","clsx","WorkflowLineRenderData","Teleport","WorkflowHoverService","FoldLine","Point","xDir","yDir","Rectangle","LineType","WorkflowLinesManager"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n// 连接点半径\n\nexport const STROKE_WIDTH_SLECTED = 3;\n\nexport const STROKE_WIDTH = 2;\n\nexport const PORT_BG_CLASS_NAME = 'workflow-port-bg';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { defineComponent, h } from 'vue';\n\nexport const CrossHair = defineComponent({\n name: 'CrossHair',\n setup() {\n return () =>\n h('div', { class: 'symbol' }, [h('div', { class: 'cross-hair' })]);\n },\n});\n\nexport default CrossHair;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n defineComponent,\n h,\n onBeforeUnmount,\n shallowRef,\n Teleport,\n watch,\n type CSSProperties,\n type PropType,\n} from 'vue';\nimport classNames from 'clsx';\nimport {\n WorkflowHoverService,\n type WorkflowPortEntity,\n usePlaygroundReadonlyState,\n WorkflowLinesManager,\n} from '@flowgram-vue/free-layout-core';\nimport { MouseTouchEvent, useService } from '@flowgram-vue/core';\nimport type { Disposable } from '@flowgram-vue/utils';\n\nimport { PORT_BG_CLASS_NAME } from '../../constants/points';\nimport CrossHair from './cross-hair';\nimport './index.css';\n\nexport interface WorkflowPortRenderProps {\n entity: WorkflowPortEntity;\n className?: string;\n style?: CSSProperties;\n onClick?: (e: MouseEvent, port: WorkflowPortEntity) => void;\n /** 激活状态颜色 (linked/hovered) */\n primaryColor?: string;\n /** 默认状态颜色 */\n secondaryColor?: string;\n /** 错误状态颜色 */\n errorColor?: string;\n /** 背景颜色 */\n backgroundColor?: string;\n}\n\nexport const WorkflowPortRender = defineComponent({\n name: 'WorkflowPortRender',\n props: {\n entity: { type: Object as PropType<WorkflowPortEntity>, required: true },\n className: { type: String, default: '' },\n style: { type: Object as PropType<CSSProperties> },\n onClick: {\n type: Function as PropType<(e: MouseEvent, port: WorkflowPortEntity) => void>,\n },\n primaryColor: { type: String },\n secondaryColor: { type: String },\n errorColor: { type: String },\n backgroundColor: { type: String },\n },\n setup(props) {\n const hoverService = useService<WorkflowHoverService>(WorkflowHoverService);\n const linesManager = useService<WorkflowLinesManager>(WorkflowLinesManager);\n const targetElement = shallowRef(props.entity.targetElement);\n const posX = shallowRef(props.entity.relativePosition.x);\n const posY = shallowRef(props.entity.relativePosition.y);\n const hovered = shallowRef(false);\n const linked = shallowRef(Boolean(props.entity?.lines?.length));\n const hasError = shallowRef(props.entity.hasError);\n const readonly = usePlaygroundReadonlyState();\n\n let disposers: Disposable[] = [];\n\n const bindEntity = (): void => {\n disposers.forEach((dispose) => dispose.dispose());\n disposers = [];\n const { entity } = props;\n entity.validate();\n hasError.value = entity.hasError;\n disposers.push(\n entity.onEntityChange(() => {\n if (entity.targetElement) {\n if (entity.targetElement !== targetElement.value) {\n targetElement.value = entity.targetElement;\n }\n return;\n }\n const newPos = entity.relativePosition;\n posX.value = Math.round(newPos.x);\n posY.value = Math.round(newPos.y);\n }),\n hoverService.onHoveredChange(() => {\n hovered.value = hoverService.isHovered(entity.id);\n }),\n entity.onErrorChanged(() => {\n hasError.value = entity.hasError;\n }),\n linesManager.onAvailableLinesChange(() => {\n setTimeout(() => {\n if (linesManager.disposed || entity.disposed) return;\n linked.value = Boolean(entity.lines.length);\n }, 0);\n })\n );\n };\n\n watch(\n () => [props.entity, targetElement.value],\n () => bindEntity(),\n { immediate: true }\n );\n\n onBeforeUnmount(() => {\n disposers.forEach((dispose) => dispose.dispose());\n });\n\n return () => {\n const { entity, onClick } = props;\n const { disabled } = entity;\n const className = classNames('workflow-port-render', props.className || '', {\n hovered: !readonly.value && hovered.value && !disabled,\n linked: linked.value,\n });\n\n const colorStyles: Record<string, string> = {};\n if (props.primaryColor) {\n colorStyles['--g-workflow-port-color-primary'] = props.primaryColor;\n }\n if (props.secondaryColor) {\n colorStyles['--g-workflow-port-color-secondary'] = props.secondaryColor;\n }\n if (props.errorColor) {\n colorStyles['--g-workflow-port-color-error'] = props.errorColor;\n }\n if (props.backgroundColor) {\n colorStyles['--g-workflow-port-color-background'] = props.backgroundColor;\n }\n\n const combinedStyle = targetElement.value\n ? { ...props.style, ...colorStyles }\n : { ...props.style, ...colorStyles, left: `${posX.value}px`, top: `${posY.value}px` };\n\n const content = h(\n 'div',\n {\n class: className,\n style: combinedStyle,\n onClick: (e: MouseEvent) => onClick?.(e, entity),\n onTouchstart: (e: TouchEvent) => {\n if (!onClick) {\n return;\n }\n MouseTouchEvent.onTouched(e, (mouseEvent) => {\n onClick(mouseEvent as unknown as MouseEvent, entity);\n });\n },\n 'data-port-entity-id': entity.id,\n 'data-port-entity-type': entity.portType,\n 'data-testid': 'sdk.workflow.canvas.node.port',\n },\n [\n h('div', { class: classNames('bg-circle', 'workflow-bg-circle') }),\n h(\n 'div',\n {\n class: classNames({\n bg: true,\n [PORT_BG_CLASS_NAME]: true,\n 'workflow-point-bg': true,\n hasError: hasError.value,\n }),\n },\n [h(CrossHair)]\n ),\n h('div', { class: 'focus-circle' }),\n ]\n );\n\n if (targetElement.value) {\n return h(Teleport, { to: targetElement.value }, [content]);\n }\n return content;\n };\n },\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n// 箭头宽度\nexport const LINE_OFFSET = 6;\n\nexport const LINE_PADDING = 12;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { defineComponent, h, provide, type VNodeChild } from 'vue';\nimport {\n Playground,\n PlaygroundVueContainerKey,\n PlaygroundVueRefKey,\n type PlaygroundContainerFactory,\n} from '@flowgram-vue/core';\n\nexport const LayerVueProvide = defineComponent({\n name: 'LayerVueProvide',\n props: {\n factory: {\n type: Object,\n required: true,\n },\n },\n setup(props) {\n const factory = props.factory as PlaygroundContainerFactory;\n provide(PlaygroundVueContainerKey, factory as any);\n try {\n provide(PlaygroundVueRefKey, factory.get(Playground));\n } catch {\n // 测试容器可能重复 bind PlaygroundConfig,此时仅 provide container\n }\n },\n render() {\n return this.$slots.default?.();\n },\n});\n\nexport function wrapLayerRender(factory: PlaygroundContainerFactory, children: VNodeChild) {\n return h(LayerVueProvide, { factory }, () => children);\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IPoint, Rectangle } from '@flowgram-vue/utils';\nimport { LinePointLocation } from '@flowgram-vue/free-layout-core';\n\nimport { LINE_PADDING } from '../constants/lines';\n\nexport function toRelative(p: IPoint, bbox: Rectangle): IPoint {\n return {\n x: p.x - bbox.x + LINE_PADDING,\n y: p.y - bbox.y + LINE_PADDING,\n };\n}\n\nexport function getShrinkOffset(location: LinePointLocation, shrink: number): IPoint {\n switch (location) {\n case 'left':\n return { x: -shrink, y: 0 };\n case 'right':\n return { x: shrink, y: 0 };\n case 'bottom':\n return { x: 0, y: shrink };\n case 'top':\n return { x: 0, y: -shrink };\n }\n}\n\nexport function posWithShrink(pos: IPoint, location: LinePointLocation, shrink: number): IPoint {\n const offset = getShrinkOffset(location, shrink);\n return {\n x: pos.x + offset.x,\n y: pos.y + offset.y,\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { defineComponent, h, type PropType } from 'vue';\n\nimport { IPoint } from '@flowgram-vue/utils';\nimport { LinePointLocation } from '@flowgram-vue/free-layout-core';\n\nimport { type ArrowRendererProps } from '../../types/arrow-renderer';\nimport { LINE_OFFSET } from '../../constants/lines';\n\nfunction getArrowPath(pos: IPoint, location: LinePointLocation): string {\n switch (location) {\n case 'left':\n return `M ${pos.x - LINE_OFFSET},${pos.y - LINE_OFFSET} L ${pos.x},${pos.y} L ${\n pos.x - LINE_OFFSET\n },${pos.y + LINE_OFFSET}`;\n case 'right':\n return `M ${pos.x + LINE_OFFSET},${pos.y + LINE_OFFSET} L ${pos.x},${pos.y} L ${\n pos.x + LINE_OFFSET\n },${pos.y - LINE_OFFSET}`;\n case 'bottom':\n return `M ${pos.x - LINE_OFFSET},${pos.y + LINE_OFFSET} L ${pos.x},${pos.y} L ${\n pos.x + LINE_OFFSET\n },${pos.y + LINE_OFFSET}`;\n case 'top':\n return `M ${pos.x - LINE_OFFSET},${pos.y - LINE_OFFSET} L ${pos.x},${pos.y} L ${\n pos.x + LINE_OFFSET\n },${pos.y - LINE_OFFSET}`;\n }\n}\n\nexport const ArrowRenderer = defineComponent({\n name: 'ArrowRenderer',\n props: {\n id: { type: String, required: true },\n pos: { type: Object as PropType<IPoint>, required: true },\n location: { type: String as PropType<LinePointLocation>, required: true },\n strokeWidth: { type: Number, required: true },\n hide: { type: Boolean, default: false },\n line: { type: Object as PropType<ArrowRendererProps['line']>, required: true },\n },\n setup(props) {\n return () => {\n if (props.hide) {\n return null;\n }\n const arrowPath = getArrowPath(props.pos, props.location);\n return h('path', {\n d: arrowPath,\n 'stroke-linecap': 'round',\n stroke: `url(#${props.id})`,\n fill: 'none',\n 'stroke-width': props.strokeWidth,\n });\n };\n },\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { defineComponent, h, type Component, type PropType } from 'vue';\nimport clsx from 'clsx';\nimport { type IPoint } from '@flowgram-vue/utils';\nimport { FlowRendererKey } from '@flowgram-vue/renderer';\nimport { WorkflowLineRenderData } from '@flowgram-vue/free-layout-core';\n\nimport { type ArrowRendererComponent } from '../../types/arrow-renderer';\nimport { LineRenderProps } from '../../type';\nimport { posWithShrink } from '../../contributions/utils';\nimport { STROKE_WIDTH_SLECTED, STROKE_WIDTH } from '../../constants/points';\nimport { ArrowRenderer } from './arrow';\nimport './index.css';\n\nconst PADDING = 12;\n\nexport const LineSVG = defineComponent({\n name: 'LineSVG',\n props: {\n color: { type: String },\n selected: { type: Boolean, default: false },\n hovered: { type: Boolean, default: false },\n line: { type: Object as PropType<LineRenderProps['line']>, required: true },\n lineType: { type: [String, Number] as PropType<LineRenderProps['lineType']> },\n version: { type: String, required: true },\n strokePrefix: { type: String },\n rendererRegistry: {\n type: Object as PropType<LineRenderProps['rendererRegistry']>,\n },\n },\n setup(props, { slots }) {\n return () => {\n const { line, color, selected, strokePrefix, rendererRegistry } = props;\n const { position, reverse, hideArrow, vertical } = line;\n\n const renderData = line.getData(WorkflowLineRenderData);\n const { bounds, path: bezierPath } = renderData;\n\n const toRelative = (p: IPoint): IPoint => ({\n x: p.x - bounds.x + PADDING,\n y: p.y - bounds.y + PADDING,\n });\n\n const fromPos = toRelative(position.from);\n const toPos = toRelative(position.to);\n\n const arrowToPos: IPoint = posWithShrink(toPos, position.to.location, line.uiState.shrink);\n const arrowFromPos: IPoint = posWithShrink(\n fromPos,\n position.from.location,\n line.uiState.shrink\n );\n\n const strokeWidth = selected\n ? line.uiState.strokeWidthSelected ?? STROKE_WIDTH_SLECTED\n : line.uiState.strokeWidth ?? STROKE_WIDTH;\n\n const strokeID = strokePrefix ? `${strokePrefix}-${line.id}` : line.id;\n\n const CustomArrowRenderer = rendererRegistry?.tryToGetRendererComponent(\n FlowRendererKey.ARROW_RENDERER\n )?.renderer as ArrowRendererComponent | undefined;\n const ArrowComponent = (CustomArrowRenderer || ArrowRenderer) as Component;\n\n const pathNode = h('path', {\n d: bezierPath,\n fill: 'none',\n stroke: `url(#${strokeID})`,\n 'stroke-width': strokeWidth,\n class: line.processing || line.flowing ? 'dashed-line flowing-line' : '',\n });\n\n return h(\n 'div',\n {\n class: clsx('gedit-flow-activity-edge', line.className),\n style: {\n ...line.uiState.style,\n left: `${bounds.x - PADDING}px`,\n top: `${bounds.y - PADDING}px`,\n position: 'absolute',\n },\n },\n [\n slots.default?.(),\n h(\n 'svg',\n {\n width: bounds.width + PADDING * 2,\n height: bounds.height + PADDING * 2,\n },\n [\n h('defs', null, [\n h(\n 'linearGradient',\n {\n x1: vertical ? '100%' : '0%',\n y1: vertical ? '0%' : '100%',\n x2: '100%',\n y2: '100%',\n id: strokeID,\n gradientUnits: 'userSpaceOnUse',\n },\n [\n h('stop', { 'stop-color': color, offset: '0%' }),\n h('stop', { 'stop-color': color, offset: '100%' }),\n ]\n ),\n ]),\n h('g', null, [\n pathNode,\n h(ArrowComponent, {\n id: strokeID,\n pos: reverse ? arrowFromPos : arrowToPos,\n strokeWidth,\n location: reverse ? position.from.location : position.to.location,\n hide: hideArrow,\n line,\n }),\n ]),\n ]\n ),\n ]\n );\n };\n },\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Fragment, h, Teleport, type Component, type VNode } from 'vue';\n\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram-vue/utils';\nimport { FlowRendererRegistry } from '@flowgram-vue/renderer';\nimport { StackingContextManager } from '@flowgram-vue/free-stack-plugin';\nimport {\n nanoid,\n WorkflowDocument,\n WorkflowHoverService,\n WorkflowLineEntity,\n WorkflowLineRenderData,\n WorkflowNodeEntity,\n WorkflowPortEntity,\n WorkflowSelectService,\n} from '@flowgram-vue/free-layout-core';\nimport {\n Layer,\n observeEntities,\n observeEntityDatas,\n PlaygroundContainerFactory,\n TransformData,\n} from '@flowgram-vue/core';\n\nimport { wrapLayerRender } from '../wrap-layer-render';\nimport { LineRenderProps, LinesLayerOptions } from '../type';\nimport { WorkflowLineRender } from '../components';\n\n@injectable()\nexport class WorkflowLinesLayer extends Layer<LinesLayerOptions> {\n static type = 'WorkflowLinesLayer';\n\n @inject(WorkflowHoverService) hoverService: WorkflowHoverService;\n\n @inject(WorkflowSelectService) selectService: WorkflowSelectService;\n\n @inject(StackingContextManager) stackContext: StackingContextManager;\n\n @inject(FlowRendererRegistry) rendererRegistry: FlowRendererRegistry;\n\n @inject(PlaygroundContainerFactory) playgroundContainer: PlaygroundContainerFactory;\n\n @observeEntities(WorkflowLineEntity) readonly lines: WorkflowLineEntity[];\n\n @observeEntities(WorkflowPortEntity) readonly ports: WorkflowPortEntity[];\n\n @observeEntityDatas(WorkflowNodeEntity, TransformData)\n readonly trans: TransformData[];\n\n @inject(WorkflowDocument) protected workflowDocument: WorkflowDocument;\n\n private layerID = nanoid();\n\n private mountedLines: Map<\n string,\n {\n line: WorkflowLineEntity;\n portal: VNode;\n version: string;\n }\n > = new Map();\n\n private _version = 0;\n\n private rafId?: number;\n\n /**\n * 节点线条\n */\n public node = domUtils.createDivWithClass('gedit-playground-layer gedit-flow-lines-layer');\n\n public onZoom(scale: number): void {\n this.node.style.transform = `scale(${scale})`;\n }\n\n public onReady() {\n this.pipelineNode.appendChild(this.node);\n this.toDispose.pushAll([\n this.selectService.onSelectionChanged(() => this.render()),\n this.hoverService.onHoveredChange(() => this.render()),\n this.workflowDocument.linesManager.onForceUpdate(() => {\n this.mountedLines.clear();\n this.bumpVersion();\n this.render();\n }),\n ]);\n }\n\n public dispose() {\n if (this.rafId != null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n this.mountedLines.clear();\n }\n\n public render(): VNode {\n this.scheduleLineRenderUpdate();\n const lines = this.lines.map((line) => this.renderLine(line));\n return wrapLayerRender(this.playgroundContainer, h(Fragment, null, lines));\n }\n\n private scheduleLineRenderUpdate(): void {\n if (this.rafId != null) {\n cancelAnimationFrame(this.rafId);\n }\n this.rafId = requestAnimationFrame(() => {\n this.rafId = undefined;\n let needsUpdate = false;\n this.lines.forEach((line) => {\n const renderData = line.getData(WorkflowLineRenderData);\n const oldVersion = renderData.renderVersion;\n renderData.update();\n if (renderData.renderVersion !== oldVersion) {\n needsUpdate = true;\n }\n });\n if (needsUpdate) {\n this.render();\n }\n });\n }\n\n // 用来绕过 memo\n private bumpVersion() {\n this._version = this._version + 1;\n if (this._version === Number.MAX_SAFE_INTEGER) {\n this._version = 0;\n }\n }\n\n private lineProps(line: WorkflowLineEntity): LineRenderProps {\n const { lineType } = this.workflowDocument.linesManager;\n const selected = this.selectService.isSelected(line.id);\n const hovered = this.hoverService.isHovered(line.id);\n const version = this.lineVersion(line);\n\n const oldProps: LineRenderProps = {\n key: line.id,\n color: line.color,\n selected,\n hovered,\n line,\n lineType,\n version,\n strokePrefix: this.layerID,\n rendererRegistry: this.rendererRegistry,\n };\n return this.options.customLineProps ? this.options.customLineProps(line, oldProps) : oldProps;\n }\n\n private lineVersion(line: WorkflowLineEntity): string {\n const renderData = line.getData(WorkflowLineRenderData);\n const { renderVersion } = renderData;\n const selected = this.selectService.isSelected(line.id);\n const hovered = this.hoverService.isHovered(line.id);\n const { version: lineVersion, color } = line;\n\n const version = `v:${this._version},lv:${lineVersion},rv:${renderVersion},c:${color},s:${\n selected ? 'T' : 'F'\n },h:${hovered ? 'T' : 'F'}`;\n\n return version;\n }\n\n private lineComponent(props: LineRenderProps): VNode {\n const RenderInsideLine = this.options.renderInsideLine;\n const RenderLine = (this.options.renderLine ?? WorkflowLineRender) as Component;\n const inside = RenderInsideLine ? h(RenderInsideLine, props) : null;\n return h(RenderLine, props, () => inside);\n }\n\n private renderLine(line: WorkflowLineEntity): VNode {\n const lineProps = this.lineProps(line);\n const cache = this.mountedLines.get(line.id);\n const isCached = cache !== undefined;\n const { portal: cachedPortal, version: cachedVersion } = cache ?? {};\n if (isCached && cachedVersion === lineProps.version) {\n return cachedPortal!;\n }\n if (!isCached) {\n this.renderElement.appendChild(line.node);\n line.onDispose(() => {\n this.mountedLines.delete(line.id);\n line.node.remove();\n });\n }\n const portal = h(Teleport, { to: line.node, key: line.id }, [this.lineComponent(lineProps)]);\n this.mountedLines.set(line.id, { line, portal, version: lineProps.version });\n return portal;\n }\n\n private get renderElement(): HTMLElement {\n return this.stackContext.node;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type IPoint } from '@flowgram-vue/utils';\nimport { LinePoint, LinePointLocation } from '@flowgram-vue/free-layout-core';\n\n/**\n * Fork from: https://github.com/xyflow/xyflow/blob/main/packages/system/src/utils/edges/bezier-edge.ts\n * MIT License\n * Copyright (c) 2019-2024 webkid GmbH\n */\nexport function getBezierEdgeCenter(\n fromPos: IPoint,\n toPos: IPoint,\n fromControl: IPoint,\n toControl: IPoint\n): IPoint {\n /*\n * cubic bezier t=0.5 mid point, not the actual mid point, but easy to calculate\n * https://stackoverflow.com/questions/67516101/how-to-find-distance-mid-point-of-bezier-curve\n */\n const x = fromPos.x * 0.125 + fromControl.x * 0.375 + toControl.x * 0.375 + toPos.x * 0.125;\n const y = fromPos.y * 0.125 + fromControl.y * 0.375 + toControl.y * 0.375 + toPos.y * 0.125;\n return {\n x,\n y,\n };\n}\n\nfunction getControlOffset(distance: number, curvature: number): number {\n if (distance >= 0) {\n return 0.5 * distance;\n }\n\n return curvature * 25 * Math.sqrt(-distance);\n}\n\nfunction getControlWithCurvature({\n location,\n x1,\n y1,\n x2,\n y2,\n curvature,\n}: {\n location: LinePointLocation;\n curvature: number;\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}): IPoint {\n switch (location) {\n case 'left':\n return {\n x: x1 - getControlOffset(x1 - x2, curvature),\n y: y1,\n };\n case 'right':\n return {\n x: x1 + getControlOffset(x2 - x1, curvature),\n y: y1,\n };\n case 'top':\n return {\n x: x1,\n y: y1 - getControlOffset(y1 - y2, curvature),\n };\n case 'bottom':\n return {\n x: x1,\n y: y1 + getControlOffset(y2 - y1, curvature),\n };\n }\n}\n\nexport function getBezierControlPoints(\n fromPos: LinePoint,\n toPos: LinePoint,\n curvature = 0.25\n): { controls: [IPoint, IPoint]; center: IPoint } {\n const fromControl = getControlWithCurvature({\n location: fromPos.location,\n x1: fromPos.x,\n y1: fromPos.y,\n x2: toPos.x,\n y2: toPos.y,\n curvature,\n });\n const toControl = getControlWithCurvature({\n location: toPos.location,\n x1: toPos.x,\n y1: toPos.y,\n x2: fromPos.x,\n y2: fromPos.y,\n curvature,\n });\n const center = getBezierEdgeCenter(fromPos, toPos, fromControl, toControl);\n return {\n controls: [fromControl, toControl],\n center,\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Bezier } from 'bezier-js';\nimport { IPoint, Point, Rectangle } from '@flowgram-vue/utils';\nimport {\n WorkflowLineEntity,\n WorkflowLineRenderContribution,\n LinePoint,\n LineCenterPoint,\n} from '@flowgram-vue/free-layout-core';\nimport { LineType } from '@flowgram-vue/free-layout-core';\n\nimport { posWithShrink, toRelative } from '../utils';\nimport { getBezierControlPoints } from './bezier-controls';\n\nexport interface BezierData {\n fromPos: IPoint;\n toPos: IPoint;\n bbox: Rectangle; // 外围矩形\n controls: IPoint[]; // 控制点\n bezier: Bezier;\n path: string;\n center: LineCenterPoint;\n}\n\nexport class WorkflowBezierLineContribution implements WorkflowLineRenderContribution {\n public static type = LineType.BEZIER;\n\n public entity: WorkflowLineEntity;\n\n constructor(entity: WorkflowLineEntity) {\n this.entity = entity;\n }\n\n private data?: BezierData;\n\n public get path(): string {\n return this.data?.path ?? '';\n }\n\n public calcDistance(pos: IPoint): number {\n if (!this.data) {\n return Number.MAX_SAFE_INTEGER;\n }\n return Point.getDistance(pos, this.data.bezier.project(pos));\n }\n\n public get bounds(): Rectangle {\n if (!this.data) {\n return Rectangle.EMPTY;\n }\n return this.data.bbox;\n }\n\n get center() {\n return this.data?.center;\n }\n\n public update(params: { fromPos: LinePoint; toPos: LinePoint }): void {\n this.data = this.calcBezier(params.fromPos, params.toPos);\n }\n\n private calcBezier(fromPos: LinePoint, toPos: LinePoint): BezierData {\n const { controls, center } = getBezierControlPoints(\n fromPos,\n toPos,\n this.entity.uiState.curvature\n );\n const bezier = new Bezier([fromPos, ...controls, toPos]);\n const bbox = bezier.bbox();\n const bboxBounds = new Rectangle(\n bbox.x.min,\n bbox.y.min,\n bbox.x.max - bbox.x.min,\n bbox.y.max - bbox.y.min\n );\n const centerPoint = toRelative(center, bboxBounds);\n\n const path = this.getPath({ bbox: bboxBounds, fromPos, toPos, controls });\n\n this.data = {\n fromPos,\n toPos,\n bezier,\n bbox: bboxBounds,\n controls,\n path,\n center: {\n ...center,\n labelX: centerPoint.x,\n labelY: centerPoint.y,\n },\n };\n return this.data;\n }\n\n private getPath(params: {\n bbox: Rectangle;\n fromPos: LinePoint;\n toPos: LinePoint;\n controls: [IPoint, IPoint];\n }): string {\n const { bbox } = params;\n // 相对位置转换函数\n const fromPos = toRelative(params.fromPos, bbox);\n const toPos = toRelative(params.toPos, bbox);\n\n const controls = params.controls.map((c) => toRelative(c, bbox));\n const shrink = this.entity.uiState.shrink;\n\n const renderFromPos: IPoint = posWithShrink(fromPos, params.fromPos.location, shrink);\n\n const renderToPos: IPoint = posWithShrink(toPos, params.toPos.location, shrink);\n\n const controlPoints = controls.map((s) => `${s.x} ${s.y}`).join(',');\n return `M${renderFromPos.x} ${renderFromPos.y} C ${controlPoints}, ${renderToPos.x} ${renderToPos.y}`;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type IPoint, Point, Rectangle } from '@flowgram-vue/utils';\nimport { LinePoint } from '@flowgram-vue/free-layout-core';\n\n/**\n * 计算点到线段的距离\n * @param point 待测试点\n * @param segStart 线段起点\n * @param segEnd 线段终点\n */\nconst getPointToSegmentDistance = (point: IPoint, segStart: IPoint, segEnd: IPoint): number => {\n const { x: px, y: py } = point;\n const { x: x1, y: y1 } = segStart;\n const { x: x2, y: y2 } = segEnd;\n\n const A = px - x1;\n const B = py - y1;\n const C = x2 - x1;\n const D = y2 - y1;\n\n const dot = A * C + B * D;\n const lenSq = C * C + D * D;\n\n // 参数方程中的t参数\n const param = lenSq === 0 ? -1 : dot / lenSq;\n\n let xx: number;\n let yy: number;\n\n if (param < 0) {\n xx = x1;\n yy = y1;\n } else if (param > 1) {\n xx = x2;\n yy = y2;\n } else {\n xx = x1 + param * C;\n yy = y1 + param * D;\n }\n\n const dx = px - xx;\n const dy = py - yy;\n\n return Math.sqrt(dx * dx + dy * dy);\n};\n\n/**\n * Fork from: https://github.com/xyflow/xyflow/blob/main/packages/system/src/utils/edges/smoothstep-edge.ts\n * MIT License\n * Copyright (c) 2019-2024 webkid GmbH\n */\nexport namespace FoldLine {\n const EDGE_RADIUS = 5;\n const OFFSET = 20;\n\n function getEdgeCenter({ source, target }: { source: IPoint; target: IPoint }): [number, number] {\n const xOffset = Math.abs(target.x - source.x) / 2;\n const centerX = target.x < source.x ? target.x + xOffset : target.x - xOffset;\n\n const yOffset = Math.abs(target.y - source.y) / 2;\n const centerY = target.y < source.y ? target.y + yOffset : target.y - yOffset;\n\n return [centerX, centerY];\n }\n\n const getDirection = ({ source, target }: { source: LinePoint; target: LinePoint }): IPoint => {\n if (source.location === 'left' || source.location === 'right') {\n return source.x < target.x ? { x: 1, y: 0 } : { x: -1, y: 0 };\n }\n return source.y < target.y ? { x: 0, y: 1 } : { x: 0, y: -1 };\n };\n\n const handleDirections = {\n left: { x: -1, y: 0 },\n right: { x: 1, y: 0 },\n top: { x: 0, y: -1 },\n bottom: { x: 0, y: 1 },\n };\n // eslint-disable-next-line complexity\n export function getPoints({ source, target }: { source: LinePoint; target: LinePoint }): {\n points: IPoint[];\n center: IPoint;\n } {\n const sourceDir = handleDirections[source.location];\n const targetDir = handleDirections[target.location];\n const sourceGapped: LinePoint = {\n x: source.x + sourceDir.x * OFFSET,\n y: source.y + sourceDir.y * OFFSET,\n location: source.location,\n };\n const targetGapped: LinePoint = {\n x: target.x + targetDir.x * OFFSET,\n y: target.y + targetDir.y * OFFSET,\n location: target.location,\n };\n const dir = getDirection({\n source: sourceGapped,\n target: targetGapped,\n });\n const dirAccessor = dir.x !== 0 ? 'x' : 'y';\n const currDir = dir[dirAccessor];\n\n let points: IPoint[] = [];\n let centerX, centerY;\n\n const [defaultCenterX, defaultCenterY] = getEdgeCenter({\n source,\n target,\n });\n\n // 计算向量乘积\n if (sourceDir[dirAccessor] * targetDir[dirAccessor] === -1) {\n centerX = defaultCenterX;\n centerY = defaultCenterY;\n\n const verticalSplit: IPoint[] = [\n { x: centerX, y: sourceGapped.y },\n { x: centerX, y: targetGapped.y },\n ];\n\n const horizontalSplit: IPoint[] = [\n { x: sourceGapped.x, y: centerY },\n { x: targetGapped.x, y: centerY },\n ];\n\n if (sourceDir[dirAccessor] === currDir) {\n points = dirAccessor === 'x' ? verticalSplit : horizontalSplit;\n } else {\n points = dirAccessor === 'x' ? horizontalSplit : verticalSplit;\n }\n } else {\n // sourceTarget means we take x from source and y from target, targetSource is the opposite\n const sourceTarget: IPoint[] = [{ x: sourceGapped.x, y: targetGapped.y }];\n const targetSource: IPoint[] = [{ x: targetGapped.x, y: sourceGapped.y }];\n // this handles edges with same handle positions\n if (dirAccessor === 'x') {\n points = sourceDir.x === currDir ? targetSource : sourceTarget;\n } else {\n points = sourceDir.y === currDir ? sourceTarget : targetSource;\n }\n\n // these are conditions for handling mixed handle positions like Right -> Bottom for example\n const dirAccessorOpposite = dirAccessor === 'x' ? 'y' : 'x';\n const isSameDir = sourceDir[dirAccessor] === targetDir[dirAccessorOpposite];\n const sourceGtTargetOppo =\n sourceGapped[dirAccessorOpposite] > targetGapped[dirAccessorOpposite];\n const sourceLtTargetOppo =\n sourceGapped[dirAccessorOpposite] < targetGapped[dirAccessorOpposite];\n const flipSourceTarget =\n (sourceDir[dirAccessor] === 1 &&\n ((!isSameDir && sourceGtTargetOppo) || (isSameDir && sourceLtTargetOppo))) ||\n (sourceDir[dirAccessor] !== 1 &&\n ((!isSameDir && sourceLtTargetOppo) || (isSameDir && sourceGtTargetOppo)));\n\n if (flipSourceTarget) {\n points = dirAccessor === 'x' ? sourceTarget : targetSource;\n }\n\n const sourceGapPoint = { x: sourceGapped.x, y: sourceGapped.y };\n const targetGapPoint = { x: targetGapped.x, y: targetGapped.y };\n const maxXDistance = Math.max(\n Math.abs(sourceGapPoint.x - points[0].x),\n Math.abs(targetGapPoint.x - points[0].x)\n );\n const maxYDistance = Math.max(\n Math.abs(sourceGapPoint.y - points[0].y),\n Math.abs(targetGapPoint.y - points[0].y)\n );\n\n if (maxXDistance >= maxYDistance) {\n centerX = (sourceGapPoint.x + targetGapPoint.x) / 2;\n centerY = points[0].y;\n } else {\n centerX = points[0].x;\n centerY = (sourceGapPoint.y + targetGapPoint.y) / 2;\n }\n }\n\n const pathPoints = [\n source,\n { x: sourceGapped.x, y: sourceGapped.y },\n ...points,\n { x: targetGapped.x, y: targetGapped.y },\n target,\n ];\n\n return {\n points: pathPoints,\n center: {\n x: centerX,\n y: centerY,\n },\n };\n }\n\n function getBend(a: IPoint, b: IPoint, c: IPoint): string {\n const bendSize = Math.min(\n Point.getDistance(a, b) / 2,\n Point.getDistance(b, c) / 2,\n EDGE_RADIUS\n );\n const { x, y } = b;\n\n // no bend\n if ((a.x === x && x === c.x) || (a.y === y && y === c.y)) {\n return `L${x} ${y}`;\n }\n\n // first segment is horizontal\n if (a.y === y) {\n const xDir = a.x < c.x ? -1 : 1;\n const yDir = a.y < c.y ? 1 : -1;\n return `L ${x + bendSize * xDir},${y}Q ${x},${y} ${x},${y + bendSize * yDir}`;\n }\n\n const xDir = a.x < c.x ? 1 : -1;\n const yDir = a.y < c.y ? -1 : 1;\n return `L ${x},${y + bendSize * yDir}Q ${x},${y} ${x + bendSize * xDir},${y}`;\n }\n\n /**\n * 实现 reactFlow 原本的折叠线交互\n */\n export function getSmoothStepPath(points: IPoint[]): string {\n const path = points.reduce<string>((res, p, i) => {\n let segment = '';\n\n if (i > 0 && i < points.length - 1) {\n segment = getBend(points[i - 1], p, points[i + 1]);\n } else {\n segment = `${i === 0 ? 'M' : 'L'}${p.x} ${p.y}`;\n }\n\n res += segment;\n\n return res;\n }, '');\n\n return path;\n }\n export function getBounds(points: IPoint[]): Rectangle {\n const xList = points.map((p) => p.x);\n const yList = points.map((p) => p.y);\n const left = Math.min(...xList);\n const right = Math.max(...xList);\n const top = Math.min(...yList);\n const bottom = Math.max(...yList);\n return Rectangle.createRectangleWithTwoPoints(\n {\n x: left,\n y: top,\n },\n {\n x: right,\n y: bottom,\n }\n );\n }\n /**\n * 计算点到折线的最短距离\n * @param points 折线的所有端点\n * @param pos 待测试点\n * @returns 最短距离\n */\n export const getFoldLineToPointDistance = (points: IPoint[], pos: IPoint): number => {\n // 特殊情况处理\n if (points.length === 0) {\n return Infinity;\n }\n\n if (points.length === 1) {\n return Point.getDistance(points[0]!, pos);\n }\n\n // 构建线段数组\n const lines: [IPoint, IPoint][] = [];\n for (let i = 0; i < points.length - 1; i++) {\n lines.push([points[i]!, points[i + 1]!]);\n }\n\n // 计算点到每个线段的最短距离\n const distances = lines.map((line) => {\n const [p1, p2] = line;\n return getPointToSegmentDistance(pos, p1, p2);\n });\n\n return Math.min(...distances);\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IPoint, Rectangle } from '@flowgram-vue/utils';\nimport {\n WorkflowLineEntity,\n WorkflowLineRenderContribution,\n LinePoint,\n LineCenterPoint,\n} from '@flowgram-vue/free-layout-core';\nimport { LineType } from '@flowgram-vue/free-layout-core';\n\nimport { posWithShrink, toRelative } from '../utils';\nimport { FoldLine } from './fold-line';\n\nexport interface FoldData {\n points: IPoint[];\n path: string;\n bbox: Rectangle;\n center: LineCenterPoint;\n}\n\nexport class WorkflowFoldLineContribution implements WorkflowLineRenderContribution {\n public static type = LineType.LINE_CHART;\n\n public entity: WorkflowLineEntity;\n\n constructor(entity: WorkflowLineEntity) {\n this.entity = entity;\n }\n\n private data?: FoldData;\n\n public get path(): string {\n return this.data?.path ?? '';\n }\n\n public calcDistance(pos: IPoint): number {\n if (!this.data) {\n return Number.MAX_SAFE_INTEGER;\n }\n return FoldLine.getFoldLineToPointDistance(this.data.points, pos);\n }\n\n public get bounds(): Rectangle {\n if (!this.data) {\n return new Rectangle();\n }\n return this.data.bbox;\n }\n\n get center() {\n return this.data?.center;\n }\n\n public update(params: { fromPos: LinePoint; toPos: LinePoint }): void {\n const { fromPos, toPos } = params;\n const shrink = this.entity.uiState.shrink;\n\n // 根据方向预先计算源点和目标点的偏移\n const source = posWithShrink(fromPos, fromPos.location, shrink);\n const target = posWithShrink(toPos, toPos.location, shrink);\n\n const { points, center } = FoldLine.getPoints({\n source: {\n ...source,\n location: fromPos.location,\n },\n target: {\n ...target,\n location: toPos.location,\n },\n });\n\n const bbox = FoldLine.getBounds(points);\n\n // 调整所有点到 SVG 视口坐标系\n const adjustedPoints = points.map((p) => toRelative(p, bbox));\n\n const path = FoldLine.getSmoothStepPath(adjustedPoints);\n\n const relativeCenter = toRelative(center, bbox);\n this.data = {\n points,\n path,\n bbox,\n center: {\n x: center.x,\n y: center.y,\n labelX: relativeCenter.x,\n labelY: relativeCenter.y,\n },\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IPoint, Rectangle } from '@flowgram-vue/utils';\n\nexport interface StraightData {\n points: IPoint[];\n path: string;\n bbox: Rectangle;\n}\n\n/**\n * 计算点到直线的投影点\n */\nexport function projectPointOnLine(point: IPoint, lineStart: IPoint, lineEnd: IPoint): IPoint {\n const dx = lineEnd.x - lineStart.x;\n const dy = lineEnd.y - lineStart.y;\n\n // 如果是垂直线\n if (dx === 0) {\n return { x: lineStart.x, y: point.y };\n }\n // 如果是水平线\n if (dy === 0) {\n return { x: point.x, y: lineStart.y };\n }\n\n const t = ((point.x - lineStart.x) * dx + (point.y - lineStart.y) * dy) / (dx * dx + dy * dy);\n const clampedT = Math.max(0, Math.min(1, t));\n\n return {\n x: lineStart.x + clampedT * dx,\n y: lineStart.y + clampedT * dy,\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { IPoint, Point, Rectangle } from '@flowgram-vue/utils';\nimport {\n WorkflowLineEntity,\n WorkflowLineRenderContribution,\n LinePoint,\n LineCenterPoint,\n getLineCenter,\n LineType,\n} from '@flowgram-vue/free-layout-core';\n\nimport { LINE_PADDING } from '../../constants/lines';\nimport { projectPointOnLine } from './point-on-line';\nimport { posWithShrink } from '../utils';\n\nexport interface StraightData {\n points: IPoint[];\n path: string;\n bbox: Rectangle;\n center: LineCenterPoint;\n}\n\nexport class WorkflowStraightLineContribution implements WorkflowLineRenderContribution {\n public static type = LineType.STRAIGHT;\n\n public entity: WorkflowLineEntity;\n\n constructor(entity: WorkflowLineEntity) {\n this.entity = entity;\n }\n\n private data?: StraightData;\n\n public get path(): string {\n return this.data?.path ?? '';\n }\n\n public calcDistance(pos: IPoint): number {\n if (!this.data) {\n return Number.MAX_SAFE_INTEGER;\n }\n const [start, end] = this.data.points;\n return Point.getDistance(pos, projectPointOnLine(pos, start, end));\n }\n\n public get bounds(): Rectangle {\n if (!this.data) {\n return new Rectangle();\n }\n return this.data.bbox;\n }\n\n get center() {\n return this.data?.center;\n }\n\n public update(params: { fromPos: LinePoint; toPos: LinePoint }): void {\n const { fromPos, toPos } = params;\n const shrink = this.entity.uiState.shrink;\n\n // 根据方向预先计算源点和目标点的偏移\n const source = posWithShrink(fromPos, fromPos.location, shrink);\n const target = posWithShrink(toPos, toPos.location, shrink);\n\n const points = [source, target];\n\n const bbox = Rectangle.createRectangleWithTwoPoints(points[0], points[1]);\n\n // 调整所有点到 SVG 视口坐标系\n const adjustedPoints = points.map((p) => ({\n x: p.x - bbox.x + LINE_PADDING,\n y: p.y - bbox.y + LINE_PADDING,\n }));\n\n // 生成直线路径\n const path = `M ${adjustedPoints[0].x} ${adjustedPoints[0].y} L ${adjustedPoints[1].x} ${adjustedPoints[1].y}`;\n\n this.data = {\n points,\n path,\n bbox,\n center: getLineCenter(fromPos, toPos, bbox, LINE_PADDING),\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { WorkflowLinesManager } from '@flowgram-vue/free-layout-core';\nimport { definePluginCreator, PluginContext } from '@flowgram-vue/core';\n\nimport { FreeLinesPluginOptions } from './type';\nimport { WorkflowLinesLayer } from './layer';\nimport {\n WorkflowBezierLineContribution,\n WorkflowFoldLineContribution,\n WorkflowStraightLineContribution,\n} from './contributions';\n\nexport const createFreeLinesPlugin = definePluginCreator({\n singleton: true,\n onInit: (ctx: PluginContext, opts: FreeLinesPluginOptions) => {\n ctx.playground.registerLayer(WorkflowLinesLayer, {\n ...opts,\n });\n if (opts.defaultLineUIState) {\n ctx.container.get(WorkflowLinesManager).setDefaultUIState(opts.defaultLineUIState);\n }\n },\n onReady: (ctx: PluginContext, opts: FreeLinesPluginOptions) => {\n const linesManager = ctx.container.get(WorkflowLinesManager);\n linesManager\n .registerContribution(WorkflowBezierLineContribution)\n .registerContribution(WorkflowFoldLineContribution)\n .registerContribution(WorkflowStraightLineContribution);\n\n if (opts.contributions) {\n opts.contributions.forEach((contribution) => {\n linesManager.registerContribution(contribution);\n });\n }\n\n if (opts.defaultLineType) {\n linesManager.switchLineType(opts.defaultLineType);\n }\n },\n});\n"]}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@flowgram-vue/free-lines-plugin",
3
+ "version": "0.2.0",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "homepage": "https://flowgram.ai/",
7
+ "repository": "https://github.com/Crayon-hua/flowgram-vue",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs"
13
+ }
14
+ },
15
+ "main": "./dist/index.cjs",
16
+ "module": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "files": [
19
+ "src",
20
+ "dist"
21
+ ],
22
+ "dependencies": {
23
+ "bezier-js": "^6.1.4",
24
+ "clsx": "^1.1.1",
25
+ "inversify": "^6.0.1",
26
+ "reflect-metadata": "~0.2.2",
27
+ "@flowgram-vue/free-layout-core": "0.2.0",
28
+ "@flowgram-vue/free-stack-plugin": "0.2.0",
29
+ "@flowgram-vue/core": "0.2.0",
30
+ "@flowgram-vue/utils": "0.2.0",
31
+ "@flowgram-vue/renderer": "0.2.0"
32
+ },
33
+ "peerDependencies": {
34
+ "vue": "^3.3.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/bezier-js": "4.1.3",
38
+ "@types/lodash-es": "^4.17.12",
39
+ "@types/node": "^20",
40
+ "@vitest/coverage-v8": "^3.2.4",
41
+ "eslint": "^9.0.0",
42
+ "jsdom": "^26.1.0",
43
+ "typescript": "^5.8.3",
44
+ "vitest": "^3.2.4",
45
+ "vue": "^3.5.18",
46
+ "@flowgram-vue/build-config": "0.2.0",
47
+ "@flowgram-vue/eslint-config": "0.2.0",
48
+ "@flowgram-vue/ts-config": "0.2.0"
49
+ },
50
+ "publishConfig": {
51
+ "access": "public",
52
+ "registry": "https://registry.npmjs.org/"
53
+ },
54
+ "scripts": {
55
+ "build": "flowgram-build",
56
+ "test": "vitest run",
57
+ "test:cov": "vitest run --coverage",
58
+ "lint": "eslint .",
59
+ "ts-check": "tsc --noEmit",
60
+ "build:fast": "flowgram-build --fast",
61
+ "build:watch": "flowgram-build --watch"
62
+ }
63
+ }
@@ -0,0 +1,20 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`bezier-controls > getBezierControlPoints 1`] = `
4
+ {
5
+ "center": {
6
+ "x": 275,
7
+ "y": 69.25,
8
+ },
9
+ "controls": [
10
+ {
11
+ "x": 325,
12
+ "y": 69.25,
13
+ },
14
+ {
15
+ "x": 225,
16
+ "y": 69.25,
17
+ },
18
+ ],
19
+ }
20
+ `;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ import { describe, it, expect } from 'vitest';
7
+ import { LinePoint } from '@flowgram-vue/free-layout-core';
8
+
9
+ import { getBezierControlPoints } from '../contributions/bezier/bezier-controls';
10
+
11
+ describe('bezier-controls', () => {
12
+ it('getBezierControlPoints', () => {
13
+ const fromPos: LinePoint = {
14
+ x: 325,
15
+ y: 41.5,
16
+ location: 'bottom',
17
+ };
18
+ const toPos: LinePoint = {
19
+ x: 225,
20
+ y: 97,
21
+ location: 'top',
22
+ };
23
+ expect(getBezierControlPoints(fromPos, toPos)).toMatchSnapshot();
24
+ });
25
+ });
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ export { WorkflowPortRender } from './workflow-port-render';
7
+ export type { WorkflowPortRenderProps } from './workflow-port-render';
8
+ export { WorkflowLineRender } from './workflow-line-render';
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ import { defineComponent, h, type PropType } from 'vue';
7
+
8
+ import { IPoint } from '@flowgram-vue/utils';
9
+ import { LinePointLocation } from '@flowgram-vue/free-layout-core';
10
+
11
+ import { type ArrowRendererProps } from '../../types/arrow-renderer';
12
+ import { LINE_OFFSET } from '../../constants/lines';
13
+
14
+ function getArrowPath(pos: IPoint, location: LinePointLocation): string {
15
+ switch (location) {
16
+ case 'left':
17
+ return `M ${pos.x - LINE_OFFSET},${pos.y - LINE_OFFSET} L ${pos.x},${pos.y} L ${
18
+ pos.x - LINE_OFFSET
19
+ },${pos.y + LINE_OFFSET}`;
20
+ case 'right':
21
+ return `M ${pos.x + LINE_OFFSET},${pos.y + LINE_OFFSET} L ${pos.x},${pos.y} L ${
22
+ pos.x + LINE_OFFSET
23
+ },${pos.y - LINE_OFFSET}`;
24
+ case 'bottom':
25
+ return `M ${pos.x - LINE_OFFSET},${pos.y + LINE_OFFSET} L ${pos.x},${pos.y} L ${
26
+ pos.x + LINE_OFFSET
27
+ },${pos.y + LINE_OFFSET}`;
28
+ case 'top':
29
+ return `M ${pos.x - LINE_OFFSET},${pos.y - LINE_OFFSET} L ${pos.x},${pos.y} L ${
30
+ pos.x + LINE_OFFSET
31
+ },${pos.y - LINE_OFFSET}`;
32
+ }
33
+ }
34
+
35
+ export const ArrowRenderer = defineComponent({
36
+ name: 'ArrowRenderer',
37
+ props: {
38
+ id: { type: String, required: true },
39
+ pos: { type: Object as PropType<IPoint>, required: true },
40
+ location: { type: String as PropType<LinePointLocation>, required: true },
41
+ strokeWidth: { type: Number, required: true },
42
+ hide: { type: Boolean, default: false },
43
+ line: { type: Object as PropType<ArrowRendererProps['line']>, required: true },
44
+ },
45
+ setup(props) {
46
+ return () => {
47
+ if (props.hide) {
48
+ return null;
49
+ }
50
+ const arrowPath = getArrowPath(props.pos, props.location);
51
+ return h('path', {
52
+ d: arrowPath,
53
+ 'stroke-linecap': 'round',
54
+ stroke: `url(#${props.id})`,
55
+ fill: 'none',
56
+ 'stroke-width': props.strokeWidth,
57
+ });
58
+ };
59
+ },
60
+ });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ .gedit-flow-activity-edge {
7
+ position: absolute;
8
+ }
9
+
10
+ @keyframes flowingDash {
11
+ to {
12
+ stroke-dashoffset: -13;
13
+ }
14
+ }
15
+
16
+ .gedit-flow-activity-edge .dashed-line {
17
+ stroke-dasharray: 8, 5;
18
+ }
19
+
20
+ .gedit-flow-activity-edge .flowing-line {
21
+ animation: flowingDash 0.5s linear infinite;
22
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ export { LineSVG as WorkflowLineRender } from './line-svg';
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ import { defineComponent, h, type Component, type PropType } from 'vue';
7
+ import clsx from 'clsx';
8
+ import { type IPoint } from '@flowgram-vue/utils';
9
+ import { FlowRendererKey } from '@flowgram-vue/renderer';
10
+ import { WorkflowLineRenderData } from '@flowgram-vue/free-layout-core';
11
+
12
+ import { type ArrowRendererComponent } from '../../types/arrow-renderer';
13
+ import { LineRenderProps } from '../../type';
14
+ import { posWithShrink } from '../../contributions/utils';
15
+ import { STROKE_WIDTH_SLECTED, STROKE_WIDTH } from '../../constants/points';
16
+ import { ArrowRenderer } from './arrow';
17
+ import './index.css';
18
+
19
+ const PADDING = 12;
20
+
21
+ export const LineSVG = defineComponent({
22
+ name: 'LineSVG',
23
+ props: {
24
+ color: { type: String },
25
+ selected: { type: Boolean, default: false },
26
+ hovered: { type: Boolean, default: false },
27
+ line: { type: Object as PropType<LineRenderProps['line']>, required: true },
28
+ lineType: { type: [String, Number] as PropType<LineRenderProps['lineType']> },
29
+ version: { type: String, required: true },
30
+ strokePrefix: { type: String },
31
+ rendererRegistry: {
32
+ type: Object as PropType<LineRenderProps['rendererRegistry']>,
33
+ },
34
+ },
35
+ setup(props, { slots }) {
36
+ return () => {
37
+ const { line, color, selected, strokePrefix, rendererRegistry } = props;
38
+ const { position, reverse, hideArrow, vertical } = line;
39
+
40
+ const renderData = line.getData(WorkflowLineRenderData);
41
+ const { bounds, path: bezierPath } = renderData;
42
+
43
+ const toRelative = (p: IPoint): IPoint => ({
44
+ x: p.x - bounds.x + PADDING,
45
+ y: p.y - bounds.y + PADDING,
46
+ });
47
+
48
+ const fromPos = toRelative(position.from);
49
+ const toPos = toRelative(position.to);
50
+
51
+ const arrowToPos: IPoint = posWithShrink(toPos, position.to.location, line.uiState.shrink);
52
+ const arrowFromPos: IPoint = posWithShrink(
53
+ fromPos,
54
+ position.from.location,
55
+ line.uiState.shrink
56
+ );
57
+
58
+ const strokeWidth = selected
59
+ ? line.uiState.strokeWidthSelected ?? STROKE_WIDTH_SLECTED
60
+ : line.uiState.strokeWidth ?? STROKE_WIDTH;
61
+
62
+ const strokeID = strokePrefix ? `${strokePrefix}-${line.id}` : line.id;
63
+
64
+ const CustomArrowRenderer = rendererRegistry?.tryToGetRendererComponent(
65
+ FlowRendererKey.ARROW_RENDERER
66
+ )?.renderer as ArrowRendererComponent | undefined;
67
+ const ArrowComponent = (CustomArrowRenderer || ArrowRenderer) as Component;
68
+
69
+ const pathNode = h('path', {
70
+ d: bezierPath,
71
+ fill: 'none',
72
+ stroke: `url(#${strokeID})`,
73
+ 'stroke-width': strokeWidth,
74
+ class: line.processing || line.flowing ? 'dashed-line flowing-line' : '',
75
+ });
76
+
77
+ return h(
78
+ 'div',
79
+ {
80
+ class: clsx('gedit-flow-activity-edge', line.className),
81
+ style: {
82
+ ...line.uiState.style,
83
+ left: `${bounds.x - PADDING}px`,
84
+ top: `${bounds.y - PADDING}px`,
85
+ position: 'absolute',
86
+ },
87
+ },
88
+ [
89
+ slots.default?.(),
90
+ h(
91
+ 'svg',
92
+ {
93
+ width: bounds.width + PADDING * 2,
94
+ height: bounds.height + PADDING * 2,
95
+ },
96
+ [
97
+ h('defs', null, [
98
+ h(
99
+ 'linearGradient',
100
+ {
101
+ x1: vertical ? '100%' : '0%',
102
+ y1: vertical ? '0%' : '100%',
103
+ x2: '100%',
104
+ y2: '100%',
105
+ id: strokeID,
106
+ gradientUnits: 'userSpaceOnUse',
107
+ },
108
+ [
109
+ h('stop', { 'stop-color': color, offset: '0%' }),
110
+ h('stop', { 'stop-color': color, offset: '100%' }),
111
+ ]
112
+ ),
113
+ ]),
114
+ h('g', null, [
115
+ pathNode,
116
+ h(ArrowComponent, {
117
+ id: strokeID,
118
+ pos: reverse ? arrowFromPos : arrowToPos,
119
+ strokeWidth,
120
+ location: reverse ? position.from.location : position.to.location,
121
+ hide: hideArrow,
122
+ line,
123
+ }),
124
+ ]),
125
+ ]
126
+ ),
127
+ ]
128
+ );
129
+ };
130
+ },
131
+ });
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+
6
+ import { defineComponent, h } from 'vue';
7
+
8
+ export const CrossHair = defineComponent({
9
+ name: 'CrossHair',
10
+ setup() {
11
+ return () =>
12
+ h('div', { class: 'symbol' }, [h('div', { class: 'cross-hair' })]);
13
+ },
14
+ });
15
+
16
+ export default CrossHair;