@logicflow/core 2.2.0-alpha.7 → 2.2.1

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 (137) hide show
  1. package/package.json +6 -1
  2. package/.turbo/turbo-build$colon$dev.log +0 -10
  3. package/.turbo/turbo-build.log +0 -33
  4. package/CHANGELOG.md +0 -1901
  5. package/__tests__/algorithm/egde.test.ts +0 -131
  6. package/__tests__/algorithm/index.test.ts +0 -74
  7. package/__tests__/algorithm/outline.test.ts +0 -43
  8. package/__tests__/bugs/1545-spec.test.ts +0 -42
  9. package/__tests__/event/event.test.ts +0 -22
  10. package/__tests__/history/history.test.ts +0 -28
  11. package/__tests__/logicflow.test.ts +0 -575
  12. package/__tests__/model/graphmodel.test.ts +0 -87
  13. package/__tests__/util/compatible.test.ts +0 -48
  14. package/__tests__/util/edge.test.ts +0 -224
  15. package/__tests__/util/geometry.test.ts +0 -14
  16. package/__tests__/util/graph.test.ts +0 -16
  17. package/__tests__/util/matrix.test.ts +0 -41
  18. package/__tests__/util/node.test.ts +0 -68
  19. package/__tests__/util/sampling.test.ts +0 -12
  20. package/__tests__/util/vector.test.ts +0 -50
  21. package/__tests__/util/zIndex.test.ts +0 -10
  22. package/src/LogicFlow.tsx +0 -2017
  23. package/src/algorithm/edge.ts +0 -67
  24. package/src/algorithm/index.ts +0 -70
  25. package/src/algorithm/outline.ts +0 -77
  26. package/src/algorithm/rotate.ts +0 -55
  27. package/src/common/drag.ts +0 -219
  28. package/src/common/history.ts +0 -108
  29. package/src/common/index.ts +0 -6
  30. package/src/common/keyboard.ts +0 -108
  31. package/src/common/matrix.ts +0 -122
  32. package/src/common/vector.ts +0 -93
  33. package/src/constant/index.ts +0 -179
  34. package/src/constant/theme.ts +0 -708
  35. package/src/event/event.md +0 -66
  36. package/src/event/eventArgs.ts +0 -643
  37. package/src/event/eventEmitter.ts +0 -156
  38. package/src/history/index.ts +0 -119
  39. package/src/index.less +0 -1
  40. package/src/index.ts +0 -26
  41. package/src/keyboard/index.ts +0 -112
  42. package/src/keyboard/shortcut.ts +0 -200
  43. package/src/model/BaseModel.ts +0 -250
  44. package/src/model/EditConfigModel.ts +0 -334
  45. package/src/model/GraphModel.ts +0 -1824
  46. package/src/model/NestedTransformModel.ts +0 -121
  47. package/src/model/SnaplineModel.ts +0 -256
  48. package/src/model/TransformModel.ts +0 -258
  49. package/src/model/edge/BaseEdgeModel.ts +0 -785
  50. package/src/model/edge/BezierEdgeModel.ts +0 -197
  51. package/src/model/edge/LineEdgeModel.ts +0 -36
  52. package/src/model/edge/PolylineEdgeModel.ts +0 -817
  53. package/src/model/edge/index.ts +0 -4
  54. package/src/model/index.ts +0 -9
  55. package/src/model/node/BaseNodeModel.ts +0 -959
  56. package/src/model/node/CircleNodeModel.ts +0 -91
  57. package/src/model/node/DiamondNodeModel.ts +0 -132
  58. package/src/model/node/EllipseNodeModel.ts +0 -98
  59. package/src/model/node/HtmlNodeModel.ts +0 -64
  60. package/src/model/node/PolygonNodeModel.ts +0 -152
  61. package/src/model/node/RectNodeModel.ts +0 -69
  62. package/src/model/node/TextNodeModel.ts +0 -54
  63. package/src/model/node/index.ts +0 -8
  64. package/src/options.ts +0 -150
  65. package/src/style/index.less +0 -262
  66. package/src/style/raw.ts +0 -221
  67. package/src/tool/MultipleSelectTool.tsx +0 -140
  68. package/src/tool/TextEditTool.tsx +0 -193
  69. package/src/tool/index.ts +0 -101
  70. package/src/typings.d.ts +0 -5
  71. package/src/util/animation.ts +0 -29
  72. package/src/util/browser.ts +0 -4
  73. package/src/util/compatible.ts +0 -15
  74. package/src/util/drag.ts +0 -219
  75. package/src/util/edge.ts +0 -1094
  76. package/src/util/geometry.ts +0 -154
  77. package/src/util/graph.ts +0 -46
  78. package/src/util/index.ts +0 -17
  79. package/src/util/matrix.ts +0 -129
  80. package/src/util/mobx.ts +0 -23
  81. package/src/util/node.ts +0 -543
  82. package/src/util/raf.ts +0 -28
  83. package/src/util/resize.ts +0 -606
  84. package/src/util/sampling.ts +0 -85
  85. package/src/util/theme.ts +0 -84
  86. package/src/util/uuid.ts +0 -26
  87. package/src/util/vector.ts +0 -93
  88. package/src/util/zIndex.ts +0 -6
  89. package/src/view/Anchor.tsx +0 -462
  90. package/src/view/Control.tsx +0 -510
  91. package/src/view/Graph.tsx +0 -141
  92. package/src/view/Rotate.tsx +0 -113
  93. package/src/view/behavior/dnd.ts +0 -162
  94. package/src/view/behavior/index.ts +0 -2
  95. package/src/view/behavior/snapline.ts +0 -16
  96. package/src/view/edge/AdjustPoint.tsx +0 -425
  97. package/src/view/edge/Arrow.tsx +0 -54
  98. package/src/view/edge/BaseEdge.tsx +0 -660
  99. package/src/view/edge/BezierEdge.tsx +0 -101
  100. package/src/view/edge/LineEdge.tsx +0 -81
  101. package/src/view/edge/PolylineEdge.tsx +0 -311
  102. package/src/view/edge/index.ts +0 -6
  103. package/src/view/index.ts +0 -8
  104. package/src/view/node/BaseNode.tsx +0 -585
  105. package/src/view/node/CircleNode.tsx +0 -21
  106. package/src/view/node/DiamondNode.tsx +0 -24
  107. package/src/view/node/EllipseNode.tsx +0 -22
  108. package/src/view/node/HtmlNode.tsx +0 -112
  109. package/src/view/node/PolygonNode.tsx +0 -28
  110. package/src/view/node/RectNode.tsx +0 -30
  111. package/src/view/node/TextNode.tsx +0 -39
  112. package/src/view/node/index.ts +0 -8
  113. package/src/view/overlay/BackgroundOverlay.tsx +0 -34
  114. package/src/view/overlay/BezierAdjustOverlay.tsx +0 -150
  115. package/src/view/overlay/CanvasOverlay.tsx +0 -290
  116. package/src/view/overlay/Grid.tsx +0 -319
  117. package/src/view/overlay/ModificationOverlay.tsx +0 -31
  118. package/src/view/overlay/OutlineOverlay.tsx +0 -158
  119. package/src/view/overlay/SnaplineOverlay.tsx +0 -44
  120. package/src/view/overlay/ToolOverlay.tsx +0 -65
  121. package/src/view/overlay/getTransformHoc.tsx +0 -50
  122. package/src/view/overlay/gridConfig.ts +0 -103
  123. package/src/view/overlay/index.ts +0 -8
  124. package/src/view/shape/Circle.tsx +0 -41
  125. package/src/view/shape/Ellipse.tsx +0 -42
  126. package/src/view/shape/Line.tsx +0 -39
  127. package/src/view/shape/Path.tsx +0 -22
  128. package/src/view/shape/Polygon.tsx +0 -54
  129. package/src/view/shape/Polyline.tsx +0 -31
  130. package/src/view/shape/Rect.tsx +0 -44
  131. package/src/view/shape/Text.tsx +0 -168
  132. package/src/view/shape/index.ts +0 -8
  133. package/src/view/text/BaseText.tsx +0 -134
  134. package/src/view/text/LineText.tsx +0 -168
  135. package/src/view/text/index.ts +0 -2
  136. package/stats.html +0 -4842
  137. package/tsconfig.json +0 -18
@@ -1,425 +0,0 @@
1
- import { createElement as h, Component } from 'preact/compat'
2
- import LogicFlow from '../../LogicFlow'
3
- import { GraphModel, BaseNodeModel, BaseEdgeModel, Model } from '../../model'
4
- import {
5
- IDragParams,
6
- StepDrag,
7
- formatAnchorConnectValidateData,
8
- targetNodeInfo,
9
- NodeContaint,
10
- } from '../../util'
11
- import { ElementState, EventType, ModelType } from '../../constant'
12
- import Point = LogicFlow.Point
13
- import NodeData = LogicFlow.NodeData
14
- import AnchorConfig = Model.AnchorConfig
15
-
16
- interface IProps {
17
- x: number
18
- y: number
19
- type: AdjustType
20
- id?: string
21
- getAdjustPointShape: (
22
- x: number,
23
- y: number,
24
- model: BaseEdgeModel,
25
- ) => h.JSX.Element | null
26
- graphModel: GraphModel
27
- edgeModel: BaseEdgeModel
28
- }
29
-
30
- interface IState {
31
- dragging: boolean
32
- endX: number
33
- endY: number
34
- }
35
-
36
- interface OldEdge {
37
- startPoint: Point
38
- endPoint: Point
39
- pointsList: Point[]
40
- }
41
-
42
- export enum AdjustType {
43
- SOURCE = 'SOURCE',
44
- TARGET = 'TARGET',
45
- }
46
-
47
- export class AdjustPoint extends Component<IProps, IState> {
48
- stepDragData: any
49
- stepDrag: StepDrag
50
- oldEdge?: OldEdge
51
- preTargetNode: any
52
- targetRuleResults: Map<any, any>
53
- sourceRuleResults: Map<any, any>
54
-
55
- constructor(props: IProps) {
56
- super()
57
- this.state = {
58
- dragging: false,
59
- endX: 0,
60
- endY: 0,
61
- }
62
- this.targetRuleResults = new Map()
63
- this.sourceRuleResults = new Map()
64
- const { type, edgeModel, graphModel } = props
65
- const { eventCenter } = graphModel
66
- this.stepDragData = {
67
- type,
68
- edgeData: edgeModel.getData(),
69
- }
70
- this.stepDrag = new StepDrag({
71
- onDragStart: this.onDragStart,
72
- onDragging: this.onDragging,
73
- onDragEnd: this.onDragEnd,
74
- eventType: 'ADJUST_POINT',
75
- isStopPropagation: false,
76
- eventCenter,
77
- data: this.stepDragData,
78
- })
79
- }
80
-
81
- handleMouseDown = (ev: PointerEvent) => {
82
- if (this.stepDrag) {
83
- this.stepDrag.handleMouseDown(ev)
84
- }
85
- }
86
- onDragStart = () => {
87
- const { x, y, edgeModel } = this.props
88
- const { startPoint, endPoint, pointsList } = edgeModel
89
- // 记录下原始路径信息,在调整中,如果放弃调整,进行路径还原
90
- this.oldEdge = {
91
- startPoint,
92
- endPoint,
93
- pointsList,
94
- }
95
- this.setState({
96
- endX: x,
97
- endY: y,
98
- dragging: true,
99
- })
100
- // 拖拽AdjustPoint时不修改edgeModel.isHitable,避免偶尔会出现边不能点击问题(https://github.com/didi/LogicFlow/issues/974)
101
- // edgeModel.isHitable = false;
102
- }
103
- onDragging = ({ deltaX, deltaY }: IDragParams) => {
104
- const { endX, endY } = this.state
105
- const { graphModel, type } = this.props
106
- const { transformModel, editConfigModel } = graphModel
107
- const [x, y] = transformModel.moveCanvasPointByHtml(
108
- [endX, endY],
109
- deltaX,
110
- deltaY,
111
- )
112
- this.setState({
113
- endX: x,
114
- endY: y,
115
- dragging: true,
116
- })
117
- // 调整过程中实时更新路径
118
- const { edgeModel } = this.props
119
- const info = targetNodeInfo(
120
- {
121
- x: endX,
122
- y: endY,
123
- },
124
- graphModel,
125
- )
126
- // 如果一定的坐标能够找到目标节点,预结算当前节点与目标节点的路径进行展示
127
- if (info && info.node && this.isAllowAdjust(info).pass) {
128
- const { startPoint, endPoint, sourceNode, targetNode } = edgeModel
129
- const params =
130
- type === AdjustType.SOURCE
131
- ? {
132
- startPoint: {
133
- x: info.anchor.x,
134
- y: info.anchor.y,
135
- },
136
- endPoint: {
137
- x: endPoint.x,
138
- y: endPoint.y,
139
- },
140
- sourceNode: info.node,
141
- targetNode,
142
- }
143
- : {
144
- startPoint: {
145
- x: startPoint.x,
146
- y: startPoint.y,
147
- },
148
- endPoint: {
149
- x: info.anchor.x,
150
- y: info.anchor.y,
151
- },
152
- sourceNode,
153
- targetNode: info.node,
154
- }
155
- edgeModel.updateAfterAdjustStartAndEnd(params)
156
- } else {
157
- // 如果没有找到目标节点,更新起终点为当前坐标
158
- type === AdjustType.SOURCE
159
- ? edgeModel.updateStartPoint({ x, y })
160
- : edgeModel.updateEndPoint({ x, y })
161
- }
162
- if (edgeModel.text.value && editConfigModel.adjustEdge) {
163
- edgeModel.setText(
164
- Object.assign({}, edgeModel.text, edgeModel.textPosition),
165
- )
166
- }
167
- }
168
- onDragEnd = ({ event }: Partial<IDragParams>) => {
169
- try {
170
- // 将状态置为非拖拽状态
171
- this.setState({
172
- dragging: false,
173
- })
174
- const { graphModel, edgeModel, type } = this.props
175
- // 拖拽AdjustPoint时不修改edgeModel.isHitable,避免偶尔会出现边不能点击问题(https://github.com/didi/LogicFlow/issues/974)
176
- // edgeModel.isHitable = true;
177
- const { endX, endY, dragging } = this.state
178
- const info = targetNodeInfo(
179
- {
180
- x: endX,
181
- y: endY,
182
- },
183
- graphModel,
184
- )
185
- // 没有dragging就结束边
186
- if (!dragging) return
187
- // 如果找到目标节点,删除老边,创建新边
188
- let needRecoveryEdge = false
189
- let createEdgeInfo: LogicFlow.EdgeConfig
190
- if (info && info.node) {
191
- const { pass, msg, newTargetNode } = this.isAllowAdjust(info)
192
- if (pass) {
193
- const {
194
- text,
195
- sourceAnchorId = '',
196
- targetAnchorId = '',
197
- ...rest
198
- } = edgeModel.getData()
199
- createEdgeInfo = {
200
- sourceAnchorId,
201
- targetAnchorId,
202
- ...rest,
203
- text: text?.value || '',
204
- }
205
- // 根据调整点是边的起点或重点,计算创建边需要的参数
206
- if (type === AdjustType.SOURCE) {
207
- const sourceNode = graphModel.getNodeModelById(info.node.id)
208
- const targetNode = graphModel.getNodeModelById(
209
- edgeModel.targetNodeId,
210
- )
211
- const edgeInfo = graphModel.edgeGenerator?.(
212
- sourceNode?.getData() as NodeData,
213
- targetNode?.getData() as NodeData,
214
- createEdgeInfo,
215
- )
216
- createEdgeInfo = {
217
- ...edgeInfo,
218
- sourceNodeId: info.node.id,
219
- sourceAnchorId: info.anchor.id,
220
- startPoint: {
221
- x: info.anchor.x,
222
- y: info.anchor.y,
223
- },
224
- targetNodeId: edgeModel.targetNodeId,
225
- endPoint: { ...edgeModel.endPoint },
226
- }
227
- // 找到的是原有的源节点上的原锚点时,还原边
228
- if (
229
- edgeModel.sourceNodeId === info.node.id &&
230
- edgeModel.sourceAnchorId === info.anchor.id
231
- ) {
232
- needRecoveryEdge = true
233
- }
234
- } else if (type === AdjustType.TARGET) {
235
- const sourceNode = graphModel.getNodeModelById(
236
- edgeModel.sourceNodeId,
237
- )
238
- const targetNode = graphModel.getNodeModelById(info.node.id)
239
- const edgeInfo = graphModel.edgeGenerator?.(
240
- sourceNode?.getData() as NodeData,
241
- targetNode?.getData() as NodeData,
242
- createEdgeInfo,
243
- )
244
- createEdgeInfo = {
245
- ...edgeInfo,
246
- sourceNodeId: edgeModel.sourceNodeId,
247
- startPoint: { ...edgeModel.startPoint },
248
- targetNodeId: info.node.id,
249
- targetAnchorId: info.anchor.id,
250
- endPoint: {
251
- x: info.anchor.x,
252
- y: info.anchor.y,
253
- },
254
- }
255
- // 找到的是原有的目标节点上的原锚点时,还原边
256
- if (
257
- edgeModel.targetNodeId === info.node.id &&
258
- edgeModel.targetAnchorId === info.anchor.id
259
- ) {
260
- needRecoveryEdge = true
261
- }
262
- }
263
- } else {
264
- // 如果没有通过校验,还原边并抛出CONNECTION_NOT_ALLOWED事件
265
- needRecoveryEdge = true
266
- const nodeData = newTargetNode.getData()
267
- graphModel.eventCenter.emit(EventType.CONNECTION_NOT_ALLOWED, {
268
- data: nodeData,
269
- msg,
270
- })
271
- }
272
- } else {
273
- // 如果没有找到目标节点,还原边
274
- needRecoveryEdge = true
275
- }
276
- if (!needRecoveryEdge) {
277
- // 为了保证id不变必须要先删除老边,再创建新边,创建新边是会判断是否有重复的id
278
- // 删除老边
279
- const oldEdgeData = edgeModel.getData()
280
- graphModel.deleteEdgeById(edgeModel.id)
281
- // 创建新边
282
- const edge = graphModel.addEdge({ ...createEdgeInfo! })
283
- // 向外抛出事件
284
- graphModel.eventCenter.emit(EventType.EDGE_EXCHANGE_NODE, {
285
- data: {
286
- newEdge: edge.getData(),
287
- oldEdge: oldEdgeData,
288
- },
289
- })
290
- } else {
291
- // 如果没有找到目标节点或者没有通过校验,还原边
292
- this.recoveryEdge()
293
- }
294
- this.preTargetNode?.setElementState(ElementState.DEFAULT)
295
- } finally {
296
- const { graphModel } = this.props
297
- graphModel.eventCenter.emit(EventType.ADJUST_POINT_DRAGEND, {
298
- e: event,
299
- data: this.stepDragData,
300
- })
301
- }
302
- }
303
- // 还原边
304
- recoveryEdge = () => {
305
- const { edgeModel } = this.props
306
- const { startPoint, endPoint, pointsList } = this.oldEdge!
307
- edgeModel.updateStartPoint(startPoint)
308
- edgeModel.updateEndPoint(endPoint)
309
- // 折线和曲线还需要更新其pointsList
310
- if (edgeModel.modelType !== ModelType.LINE_EDGE) {
311
- edgeModel.pointsList = pointsList ?? []
312
- edgeModel.initPoints()
313
- }
314
- }
315
- // 调整点的样式默认从主题中读取, 可以复写此方法进行更加个性化的自定义
316
- // 目前仅支持圆形图标进行标识,可以从圆形的r和颜色上进行调整
317
- getAdjustPointStyle = () => {
318
- const {
319
- graphModel: { theme },
320
- } = this.props
321
- const { edgeAdjust } = theme
322
-
323
- return edgeAdjust
324
- }
325
-
326
- isAllowAdjust(info: NodeContaint): {
327
- pass: boolean
328
- msg?: string
329
- newTargetNode: BaseNodeModel
330
- } {
331
- const {
332
- edgeModel: { id, sourceNode, targetNode, sourceAnchorId, targetAnchorId },
333
- type,
334
- } = this.props
335
- // const newTargetNode = info.node;
336
- let newSourceNode: BaseNodeModel
337
- let newTargetNode: BaseNodeModel
338
- let newSourceAnchor: AnchorConfig
339
- let newTargetAnchor: AnchorConfig
340
-
341
- // 如果调整的是连线起点
342
- if (type === AdjustType.SOURCE) {
343
- newSourceNode = info.node
344
- newTargetNode = targetNode
345
- newSourceAnchor = info.anchor
346
- newTargetAnchor = targetNode.getAnchorInfo(targetAnchorId)!
347
- } else {
348
- newSourceNode = sourceNode
349
- newTargetNode = info.node
350
- newTargetAnchor = info.anchor
351
- newSourceAnchor = sourceNode.getAnchorInfo(sourceAnchorId)!
352
- }
353
- // 如果前一个接触的节点和此时接触的节点不相等,则将前一个节点状态重新设置为默认状态。
354
- if (this.preTargetNode && this.preTargetNode !== info.node) {
355
- this.preTargetNode.setElementState(ElementState.DEFAULT)
356
- }
357
- this.preTargetNode = info.node
358
- // #500 不允许锚点自己连自己, 在锚点一开始连接的时候, 不触发自己连接自己的校验。
359
- if (newTargetAnchor.id === newSourceAnchor.id) {
360
- return {
361
- pass: false,
362
- msg: '',
363
- newTargetNode,
364
- }
365
- }
366
- const targetInfoId = `${newSourceNode.id}_${newTargetNode.id}_${newSourceAnchor.id}_${newTargetAnchor.id}`
367
- // 查看鼠标是否进入过target,若有检验结果,表示进入过, 就不重复计算了。
368
- if (!this.targetRuleResults.has(targetInfoId)) {
369
- const sourceRuleResult = newSourceNode.isAllowConnectedAsSource(
370
- newTargetNode,
371
- newSourceAnchor,
372
- newTargetAnchor,
373
- id,
374
- )
375
- const targetRuleResult = newTargetNode.isAllowConnectedAsTarget(
376
- newSourceNode,
377
- newSourceAnchor,
378
- newTargetAnchor,
379
- id,
380
- )
381
- this.sourceRuleResults.set(
382
- targetInfoId,
383
- formatAnchorConnectValidateData(sourceRuleResult),
384
- )
385
- this.targetRuleResults.set(
386
- targetInfoId,
387
- formatAnchorConnectValidateData(targetRuleResult),
388
- )
389
- }
390
- const { isAllPass: isSourcePass, msg: sourceMsg } =
391
- this.sourceRuleResults.get(targetInfoId)
392
- const { isAllPass: isTargetPass, msg: targetMsg } =
393
- this.targetRuleResults.get(targetInfoId)
394
- // 实时提示出即将连接的节点是否允许连接
395
- const state =
396
- isSourcePass && isTargetPass
397
- ? ElementState.ALLOW_CONNECT
398
- : ElementState.NOT_ALLOW_CONNECT
399
- if (type === AdjustType.SOURCE) {
400
- newSourceNode.setElementState(state)
401
- } else {
402
- newTargetNode.setElementState(state)
403
- }
404
- return {
405
- pass: isSourcePass && isTargetPass,
406
- msg: targetMsg || sourceMsg,
407
- newTargetNode,
408
- }
409
- }
410
-
411
- render() {
412
- const { x, y, getAdjustPointShape, edgeModel } = this.props
413
- const { dragging } = this.state
414
- return (
415
- <g
416
- pointerEvents={dragging ? 'none' : ''}
417
- onPointerDown={this.handleMouseDown}
418
- >
419
- {!dragging ? getAdjustPointShape(x, y, edgeModel) : ''}
420
- </g>
421
- )
422
- }
423
- }
424
-
425
- export default AdjustPoint
@@ -1,54 +0,0 @@
1
- import { Component } from 'preact/compat'
2
- import { Path } from '../shape'
3
- import LogicFlow from '../../LogicFlow'
4
- import { getVerticalPointOfLine } from '../../algorithm'
5
- import ArrowInfo = LogicFlow.ArrowInfo
6
-
7
- export type ArrowStyle = {
8
- stroke?: string
9
- fill?: string
10
- strokeWidth?: number
11
- offset: number
12
- refX?: number
13
- refY?: number
14
- verticalLength: number
15
- }
16
-
17
- type ArrowAttributesType = {
18
- d: string
19
- } & ArrowStyle
20
-
21
- type IProps = {
22
- arrowInfo: ArrowInfo
23
- style: ArrowStyle
24
- }
25
-
26
- export class Arrow extends Component<IProps> {
27
- getArrowAttributes(): ArrowAttributesType {
28
- const { arrowInfo, style } = this.props
29
- const { start, end } = arrowInfo
30
- const config = {
31
- start,
32
- end,
33
- offset: style.offset,
34
- verticalLength: style.verticalLength,
35
- type: 'end',
36
- }
37
- const { leftX, leftY, rightX, rightY } = getVerticalPointOfLine(config)
38
- return {
39
- d: `M${leftX} ${leftY} L${end.x} ${end.y} L${rightX} ${rightY} z`,
40
- ...style,
41
- }
42
- }
43
-
44
- getShape() {
45
- const { d, strokeWidth, stroke, fill } = this.getArrowAttributes()
46
- return <Path d={d} fill={fill} strokeWidth={strokeWidth} stroke={stroke} />
47
- }
48
-
49
- render() {
50
- return <g className="lf-arrow">{this.getShape()}</g>
51
- }
52
- }
53
-
54
- export default Arrow