aldehyde 0.2.480 → 0.2.481

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 (582) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +2 -2
  3. package/lib/controls/2dEditor/2dEditor/index.less +5 -5
  4. package/lib/controls/2dEditor/2dView/index.less +8 -8
  5. package/lib/controls/2dEditor/components/component.less +83 -83
  6. package/lib/controls/action/index.css +8 -8
  7. package/lib/controls/action/index.d.ts.map +1 -1
  8. package/lib/controls/chemstruc/graph.d.ts.map +1 -1
  9. package/lib/controls/chemstruc/index.css +28 -28
  10. package/lib/controls/collapse-card/index.css +8 -8
  11. package/lib/controls/collapse-card/index.d.ts.map +1 -1
  12. package/lib/controls/cquery/cquick-button.d.ts.map +1 -1
  13. package/lib/controls/entity-select/entity-select.d.ts.map +1 -1
  14. package/lib/controls/entity-select/index.css +7 -7
  15. package/lib/controls/entity-select/lab-tree-select.d.ts.map +1 -1
  16. package/lib/controls/entity-select/popover-entity-select.d.ts.map +1 -1
  17. package/lib/controls/file-view/index.less +9 -9
  18. package/lib/controls/html-editor/index.less +67 -67
  19. package/lib/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.css +147 -147
  20. package/lib/controls/password-setter/index.css +2 -2
  21. package/lib/controls/password-setter/index.d.ts.map +1 -1
  22. package/lib/controls/qr-code/index.less +28 -28
  23. package/lib/controls/relation-existion/index.css +3 -3
  24. package/lib/controls/relation-existion/index.d.ts.map +1 -1
  25. package/lib/controls/rfield/index.css +4 -4
  26. package/lib/controls/rfield/index.d.ts.map +1 -1
  27. package/lib/controls/select/index.d.ts.map +1 -1
  28. package/lib/controls/signature/index.d.ts.map +1 -1
  29. package/lib/controls/text/ellipsis-text.d.ts.map +1 -1
  30. package/lib/controls/text/index.less +7 -7
  31. package/lib/controls/upload/index.d.ts.map +1 -1
  32. package/lib/controls/upload/mult-file-upload.d.ts.map +1 -1
  33. package/lib/custom-page/dtmpl-custom-edit-modal-page.d.ts.map +1 -1
  34. package/lib/detail/button/bottom-submit-button-bar.d.ts.map +1 -1
  35. package/lib/detail/button/cquery-button-bar.d.ts.map +1 -1
  36. package/lib/detail/button/fix-right-submit-button-bar.d.ts.map +1 -1
  37. package/lib/detail/button/index.css +42 -42
  38. package/lib/detail/dtmpl.css +67 -67
  39. package/lib/detail/edit/fields-edit-card.d.ts.map +1 -1
  40. package/lib/detail/edit/modal-row-edit.d.ts.map +1 -1
  41. package/lib/detail/edit/popover-edit-card.d.ts.map +1 -1
  42. package/lib/detail/rightbar/index.css +34 -34
  43. package/lib/detail/rightbar/index.d.ts.map +1 -1
  44. package/lib/detail/view/act-dtmpl-view.d.ts.map +1 -1
  45. package/lib/detail/view/field-view-group.d.ts.map +1 -1
  46. package/lib/detail/view/modal-dtmpl-view.d.ts.map +1 -1
  47. package/lib/detail/view/snapshot-timeline.d.ts.map +1 -1
  48. package/lib/detail/view/tab-act-dtmpl-view.d.ts.map +1 -1
  49. package/lib/draw-canvas-edit/components/render/components/index.d.ts +3 -0
  50. package/lib/draw-canvas-edit/components/render/components/index.d.ts.map +1 -0
  51. package/lib/draw-canvas-edit/components/render/components/index.js +3 -0
  52. package/lib/draw-canvas-edit/components/render/components/index.js.map +1 -0
  53. package/lib/draw-canvas-edit/components/render/components/workstation-component.d.ts +31 -0
  54. package/lib/draw-canvas-edit/components/render/components/workstation-component.d.ts.map +1 -0
  55. package/lib/draw-canvas-edit/components/render/components/workstation-component.js +105 -0
  56. package/lib/draw-canvas-edit/components/render/components/workstation-component.js.map +1 -0
  57. package/lib/draw-canvas-edit/components/render/tools/component-factory.d.ts +2 -0
  58. package/lib/draw-canvas-edit/components/render/tools/component-factory.d.ts.map +1 -1
  59. package/lib/draw-canvas-edit/components/render/tools/component-factory.js +10 -42
  60. package/lib/draw-canvas-edit/components/render/tools/component-factory.js.map +1 -1
  61. package/lib/draw-canvas-edit/components/render/types.d.ts +3 -0
  62. package/lib/draw-canvas-edit/components/render/types.d.ts.map +1 -1
  63. package/lib/draw-canvas-edit/components/render/types.js.map +1 -1
  64. package/lib/draw-canvas-edit/index.less +48 -48
  65. package/lib/draw-canvas-view/index.less +59 -59
  66. package/lib/draw-canvas-view/view.d.ts.map +1 -1
  67. package/lib/draw-canvas-view/view.js +19 -6
  68. package/lib/draw-canvas-view/view.js.map +1 -1
  69. package/lib/export/export-frame.css +2 -2
  70. package/lib/export/export-frame.d.ts.map +1 -1
  71. package/lib/export/select-code-export-frame.d.ts.map +1 -1
  72. package/lib/form/dtmpl-form.css +3 -3
  73. package/lib/form/dtmpl-form.d.ts.map +1 -1
  74. package/lib/form/dtmpl-form.js +1 -1
  75. package/lib/form/dtmpl-form.js.map +1 -1
  76. package/lib/form/field-group-form.d.ts.map +1 -1
  77. package/lib/form/form-Item-group.d.ts.map +1 -1
  78. package/lib/form/index.css +12 -12
  79. package/lib/import/excel-import.d.ts.map +1 -1
  80. package/lib/import/index.css +53 -53
  81. package/lib/import/template.css +50 -50
  82. package/lib/layout/common.css +64 -64
  83. package/lib/layout/coverstyle.css +51 -51
  84. package/lib/layout/footer/index.css +5 -5
  85. package/lib/layout/header/index.css +122 -122
  86. package/lib/layout/menu/block.css +7 -7
  87. package/lib/layout/menu/block.d.ts.map +1 -1
  88. package/lib/layout/menu/l2menu-quick-bar.d.ts.map +1 -1
  89. package/lib/layout/menu/menu-2layers.d.ts.map +1 -1
  90. package/lib/layout/menu/message-bar.less +73 -73
  91. package/lib/layout/menu/reset-password.d.ts.map +1 -1
  92. package/lib/layout/menu/user-bar.d.ts.map +1 -1
  93. package/lib/layout/menu/userinfo-bar.d.ts.map +1 -1
  94. package/lib/layout/sidebar/index.css +57 -57
  95. package/lib/layout2/css/header.css +41 -41
  96. package/lib/layout2/css/sider.less +17 -17
  97. package/lib/layout2/css/tabs-layout.less +18 -18
  98. package/lib/layout3/css/header.less +195 -195
  99. package/lib/layout3/css/main.less +161 -161
  100. package/lib/layout3/css/sider.less +32 -32
  101. package/lib/layout3/css/tabs-layout.less +38 -38
  102. package/lib/layout4/css/header.less +196 -196
  103. package/lib/layout4/css/main.less +154 -154
  104. package/lib/layout4/css/sider.less +37 -37
  105. package/lib/layout4/css/tabs-layout.less +42 -42
  106. package/lib/layout5/css/header.less +35 -35
  107. package/lib/layout5/css/sider.less +18 -18
  108. package/lib/list/calendar/index.less +20 -20
  109. package/lib/list/card-list/index.less +154 -154
  110. package/lib/list/gantt/index.less +8 -8
  111. package/lib/list/vertical-list/index.less +208 -208
  112. package/lib/login/index.css +19 -19
  113. package/lib/login/login.d.ts.map +1 -1
  114. package/lib/login/vertify/index.css +143 -143
  115. package/lib/login3/index.less +136 -136
  116. package/lib/lowcode-components/act-table/index.less +26 -26
  117. package/lib/lowcode-components/base-button/index.less +7 -7
  118. package/lib/lowcode-components/base-map/index.js +6 -6
  119. package/lib/lowcode-components/base-radio/index.less +23 -23
  120. package/lib/lowcode-components/base-tabs/index.less +14 -14
  121. package/lib/lowcode-components/border/border10/index.less +26 -26
  122. package/lib/lowcode-components/border/border11/index.js +46 -46
  123. package/lib/lowcode-components/border/border11/index.less +17 -17
  124. package/lib/lowcode-components/border/border12/index.js +13 -13
  125. package/lib/lowcode-components/border/border12/index.less +13 -13
  126. package/lib/lowcode-components/border/border13/index.js +5 -5
  127. package/lib/lowcode-components/border/border13/index.less +13 -13
  128. package/lib/lowcode-components/border/border2/index.less +17 -17
  129. package/lib/lowcode-components/border/border3/index.less +25 -25
  130. package/lib/lowcode-components/border/border4/index.js +2 -2
  131. package/lib/lowcode-components/border/border4/index.less +72 -72
  132. package/lib/lowcode-components/border/border5/index.js +2 -2
  133. package/lib/lowcode-components/border/border5/index.less +35 -35
  134. package/lib/lowcode-components/border/border6/index.less +17 -17
  135. package/lib/lowcode-components/border/border7/index.less +26 -26
  136. package/lib/lowcode-components/border/border8/index.less +13 -13
  137. package/lib/lowcode-components/border/border9/index.js +14 -14
  138. package/lib/lowcode-components/border/border9/index.less +13 -13
  139. package/lib/lowcode-components/decoration/decoration1/index.less +7 -7
  140. package/lib/lowcode-components/decoration/decoration10/index.js +3 -3
  141. package/lib/lowcode-components/decoration/decoration10/index.less +5 -5
  142. package/lib/lowcode-components/decoration/decoration11/index.less +5 -5
  143. package/lib/lowcode-components/decoration/decoration2/index.less +6 -6
  144. package/lib/lowcode-components/decoration/decoration3/index.less +7 -7
  145. package/lib/lowcode-components/decoration/decoration4/index.less +29 -29
  146. package/lib/lowcode-components/decoration/decoration5/index.less +3 -3
  147. package/lib/lowcode-components/decoration/decoration6/index.less +7 -7
  148. package/lib/lowcode-components/decoration/decoration7/index.less +4 -4
  149. package/lib/lowcode-components/decoration/decoration8/index.less +14 -14
  150. package/lib/lowcode-components/decoration/decoration9/index.less +4 -4
  151. package/lib/lowcode-components/effectScatter-map/index.js +6 -6
  152. package/lib/lowcode-components/effectScatter-map-3d/index.js +6 -6
  153. package/lib/lowcode-components/lowcode-view/index.less +19 -19
  154. package/lib/lowcode-components/search-form/index.less +25 -25
  155. package/lib/module/dtmpl-edit-card.d.ts.map +1 -1
  156. package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
  157. package/lib/module/index.less +4 -4
  158. package/lib/module/ltmpl-modal.d.ts.map +1 -1
  159. package/lib/module/ltmpl-table.d.ts.map +1 -1
  160. package/lib/routable/index.less +25 -25
  161. package/lib/table/act-table.d.ts.map +1 -1
  162. package/lib/table/column/index.less +63 -63
  163. package/lib/table/index.css +211 -211
  164. package/lib/table/modal-select-table.d.ts.map +1 -1
  165. package/lib/table/pagination.css +14 -14
  166. package/lib/table/pagination.d.ts.map +1 -1
  167. package/lib/table/relation-table.d.ts.map +1 -1
  168. package/lib/table/select-table.d.ts.map +1 -1
  169. package/lib/table/select-table.js +14 -2
  170. package/lib/table/select-table.js.map +1 -1
  171. package/lib/table/selected-rows-card.d.ts.map +1 -1
  172. package/lib/table/stat/restat.d.ts.map +1 -1
  173. package/lib/tree/act-tree.d.ts.map +1 -1
  174. package/lib/tree/block-menu-auth-tree.d.ts.map +1 -1
  175. package/lib/tree/index.css +22 -22
  176. package/lib/tree/tmpl-tree.d.ts.map +1 -1
  177. package/lib/welcome/components/menu-card.less +96 -96
  178. package/lib/welcome/components/page-card.less +49 -49
  179. package/lib/welcome/components/quick-entrance.less +120 -120
  180. package/lib/welcome/components/user-menus.less +192 -192
  181. package/lib/welcome/components/workbench.less +118 -118
  182. package/lib/welcome/index.css +13 -13
  183. package/package.json +223 -223
  184. package/src/aldehyde/controls/2dEditor/2dEditor/index.less +5 -5
  185. package/src/aldehyde/controls/2dEditor/2dEditor/index.tsx +270 -270
  186. package/src/aldehyde/controls/2dEditor/2dView/index.less +8 -8
  187. package/src/aldehyde/controls/2dEditor/2dView/index.tsx +110 -110
  188. package/src/aldehyde/controls/2dEditor/components/card.tsx +256 -256
  189. package/src/aldehyde/controls/2dEditor/components/component.less +83 -83
  190. package/src/aldehyde/controls/2dEditor/components/data.d.ts +32 -32
  191. package/src/aldehyde/controls/2dEditor/components/hotspot.tsx +80 -80
  192. package/src/aldehyde/controls/2dEditor/components/html-box.tsx +101 -101
  193. package/src/aldehyde/controls/2dEditor/components/image.tsx +99 -99
  194. package/src/aldehyde/controls/2dEditor/components/line.tsx +73 -73
  195. package/src/aldehyde/controls/action/index.css +8 -8
  196. package/src/aldehyde/controls/action/index.tsx +406 -406
  197. package/src/aldehyde/controls/action/utils.tsx +306 -306
  198. package/src/aldehyde/controls/auto-complete/index.tsx +82 -82
  199. package/src/aldehyde/controls/cascader/index.tsx +112 -112
  200. package/src/aldehyde/controls/chemstruc/graph.tsx +185 -185
  201. package/src/aldehyde/controls/chemstruc/index.css +28 -28
  202. package/src/aldehyde/controls/code-editor/sql-code-editor.tsx +73 -73
  203. package/src/aldehyde/controls/collapse-card/index.css +8 -8
  204. package/src/aldehyde/controls/collapse-card/index.tsx +109 -109
  205. package/src/aldehyde/controls/color-picker/index.tsx +21 -21
  206. package/src/aldehyde/controls/counting-tag/index.tsx +53 -53
  207. package/src/aldehyde/controls/cquery/cquick-button.tsx +145 -145
  208. package/src/aldehyde/controls/date-picker/index.tsx +199 -199
  209. package/src/aldehyde/controls/direct-file-view/drawer-file-view.tsx +54 -54
  210. package/src/aldehyde/controls/direct-file-view/index.tsx +145 -145
  211. package/src/aldehyde/controls/direct-upload/index.tsx +139 -139
  212. package/src/aldehyde/controls/entity-select/entity-select.tsx +791 -791
  213. package/src/aldehyde/controls/entity-select/index.css +7 -7
  214. package/src/aldehyde/controls/entity-select/lab-tree-select.tsx +154 -154
  215. package/src/aldehyde/controls/entity-select/popover-entity-select.tsx +205 -205
  216. package/src/aldehyde/controls/entry-control.tsx +418 -418
  217. package/src/aldehyde/controls/enum-badge/index.tsx +42 -42
  218. package/src/aldehyde/controls/enum-tag/index.tsx +45 -45
  219. package/src/aldehyde/controls/field-history/index.tsx +81 -81
  220. package/src/aldehyde/controls/file-export/select-code-export.tsx +40 -40
  221. package/src/aldehyde/controls/file-view/drawer-file-view.tsx +117 -117
  222. package/src/aldehyde/controls/file-view/index.less +9 -9
  223. package/src/aldehyde/controls/file-view/index.tsx +148 -148
  224. package/src/aldehyde/controls/file-view/multi-file-view.tsx +39 -39
  225. package/src/aldehyde/controls/file-view/newin-file-view.tsx +40 -40
  226. package/src/aldehyde/controls/html-editor/draft.tsx +136 -136
  227. package/src/aldehyde/controls/html-editor/index.less +67 -67
  228. package/src/aldehyde/controls/icon-selector/app-icon-selector.tsx +68 -68
  229. package/src/aldehyde/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.css +147 -147
  230. package/src/aldehyde/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.json +240 -240
  231. package/src/aldehyde/controls/icon-selector/pc-icon-selector.tsx +68 -68
  232. package/src/aldehyde/controls/input-number/index.tsx +148 -148
  233. package/src/aldehyde/controls/input-range/index.tsx +59 -59
  234. package/src/aldehyde/controls/password-setter/index.css +2 -2
  235. package/src/aldehyde/controls/password-setter/index.js +88 -88
  236. package/src/aldehyde/controls/progress/index.tsx +74 -74
  237. package/src/aldehyde/controls/qr-code/index.less +28 -28
  238. package/src/aldehyde/controls/qr-code/index.tsx +40 -40
  239. package/src/aldehyde/controls/relation-existion/index.css +3 -3
  240. package/src/aldehyde/controls/relation-existion/index.tsx +144 -144
  241. package/src/aldehyde/controls/rfield/index.css +4 -4
  242. package/src/aldehyde/controls/rfield/index.tsx +225 -225
  243. package/src/aldehyde/controls/select/index.tsx +216 -216
  244. package/src/aldehyde/controls/signature/index.tsx +226 -226
  245. package/src/aldehyde/controls/single-checkbox/index.tsx +18 -18
  246. package/src/aldehyde/controls/steps/index.tsx +59 -59
  247. package/src/aldehyde/controls/text/ellipsis-text.tsx +98 -98
  248. package/src/aldehyde/controls/text/index.less +7 -7
  249. package/src/aldehyde/controls/tree-select/navigation-tree.tsx +122 -122
  250. package/src/aldehyde/controls/tree-select/tree-entity-select.tsx +121 -121
  251. package/src/aldehyde/controls/upload/index.tsx +128 -128
  252. package/src/aldehyde/controls/upload/mult-file-upload.tsx +240 -240
  253. package/src/aldehyde/controls/view-control.tsx +289 -289
  254. package/src/aldehyde/custom-page/custom-detail-modal-page.tsx +69 -69
  255. package/src/aldehyde/custom-page/custom-page-router.tsx +64 -64
  256. package/src/aldehyde/custom-page/def-custom-page.tsx +17 -17
  257. package/src/aldehyde/custom-page/dtmpl-custom-edit-modal-page.tsx +88 -88
  258. package/src/aldehyde/detail/button/bottom-submit-button-bar.tsx +91 -91
  259. package/src/aldehyde/detail/button/cquery-button-bar.tsx +144 -144
  260. package/src/aldehyde/detail/button/edit-button.tsx +61 -61
  261. package/src/aldehyde/detail/button/fix-right-submit-button-bar.tsx +186 -186
  262. package/src/aldehyde/detail/button/index.css +42 -42
  263. package/src/aldehyde/detail/button/inline-edit-button.tsx +40 -40
  264. package/src/aldehyde/detail/button/submit-button-bar.tsx +57 -57
  265. package/src/aldehyde/detail/button/view-button.tsx +64 -64
  266. package/src/aldehyde/detail/dtmpl.css +67 -67
  267. package/src/aldehyde/detail/edit/dtmpl-edit.tsx +279 -279
  268. package/src/aldehyde/detail/edit/fields-edit-card.tsx +145 -145
  269. package/src/aldehyde/detail/edit/modal-row-edit.tsx +95 -95
  270. package/src/aldehyde/detail/edit/popover-edit-card.tsx +167 -167
  271. package/src/aldehyde/detail/edit/popover-editor.tsx +70 -70
  272. package/src/aldehyde/detail/edit/post-result/index.tsx +86 -86
  273. package/src/aldehyde/detail/rightbar/index.css +34 -34
  274. package/src/aldehyde/detail/rightbar/index.tsx +92 -92
  275. package/src/aldehyde/detail/tooltipbar/index.tsx +32 -32
  276. package/src/aldehyde/detail/view/act-dtmpl-view.tsx +288 -288
  277. package/src/aldehyde/detail/view/dtmpl-view.tsx +314 -314
  278. package/src/aldehyde/detail/view/field-view-group.tsx +88 -88
  279. package/src/aldehyde/detail/view/modal-dtmpl-view.tsx +73 -73
  280. package/src/aldehyde/detail/view/snapshot-timeline.tsx +231 -231
  281. package/src/aldehyde/detail/view/tab-act-dtmpl-view.tsx +304 -304
  282. package/src/aldehyde/detail/view/view-compare-panel.tsx +57 -57
  283. package/src/aldehyde/draw-canvas-edit/components/render/components/index.ts +3 -0
  284. package/src/aldehyde/draw-canvas-edit/components/render/components/workstation-component.tsx +104 -0
  285. package/src/aldehyde/draw-canvas-edit/components/render/draws/bg-draw.ts +176 -176
  286. package/src/aldehyde/draw-canvas-edit/components/render/draws/contextmenu-draw.ts +329 -329
  287. package/src/aldehyde/draw-canvas-edit/components/render/graphs/bezier.ts +542 -542
  288. package/src/aldehyde/draw-canvas-edit/components/render/handlers/drag-outside-handlers.ts +72 -72
  289. package/src/aldehyde/draw-canvas-edit/components/render/handlers/selection-handlers.ts +396 -396
  290. package/src/aldehyde/draw-canvas-edit/components/render/index.ts +808 -808
  291. package/src/aldehyde/draw-canvas-edit/components/render/tools/attract-tool.ts +457 -457
  292. package/src/aldehyde/draw-canvas-edit/components/render/tools/component-factory.ts +270 -302
  293. package/src/aldehyde/draw-canvas-edit/components/render/tools/copy-tool.ts +244 -244
  294. package/src/aldehyde/draw-canvas-edit/components/render/tools/import-export-tool.ts +576 -576
  295. package/src/aldehyde/draw-canvas-edit/components/render/tools/index.ts +10 -10
  296. package/src/aldehyde/draw-canvas-edit/components/render/tools/position-tool.ts +191 -191
  297. package/src/aldehyde/draw-canvas-edit/components/render/tools/selection-tool.ts +140 -140
  298. package/src/aldehyde/draw-canvas-edit/components/render/types.ts +294 -291
  299. package/src/aldehyde/draw-canvas-edit/components/setting-form/index.tsx +291 -291
  300. package/src/aldehyde/draw-canvas-edit/constant.ts +5 -5
  301. package/src/aldehyde/draw-canvas-edit/index.less +48 -48
  302. package/src/aldehyde/draw-canvas-edit/index.tsx +201 -201
  303. package/src/aldehyde/draw-canvas-view/index.less +59 -59
  304. package/src/aldehyde/draw-canvas-view/index.tsx +49 -49
  305. package/src/aldehyde/draw-canvas-view/view.tsx +17 -5
  306. package/src/aldehyde/export/export-frame.css +2 -2
  307. package/src/aldehyde/export/export-frame.tsx +301 -301
  308. package/src/aldehyde/export/select-code-export-frame.tsx +212 -212
  309. package/src/aldehyde/form/criteria-form.tsx +604 -604
  310. package/src/aldehyde/form/dtmpl-form.css +3 -3
  311. package/src/aldehyde/form/dtmpl-form.tsx +552 -552
  312. package/src/aldehyde/form/field-group-form.tsx +102 -102
  313. package/src/aldehyde/form/fields-form.tsx +45 -45
  314. package/src/aldehyde/form/form-Item-group.tsx +245 -245
  315. package/src/aldehyde/form/index.css +12 -12
  316. package/src/aldehyde/hooks/use-match-route/index.tsx +62 -62
  317. package/src/aldehyde/hooks/use-tabs/index.tsx +139 -139
  318. package/src/aldehyde/hooks/useVarCssColor.ts +6 -6
  319. package/src/aldehyde/icon/aliIcon.tsx +9 -9
  320. package/src/aldehyde/icon/index.tsx +28 -28
  321. package/src/aldehyde/import/excel-import.tsx +450 -450
  322. package/src/aldehyde/import/index.css +53 -53
  323. package/src/aldehyde/import/template.css +50 -50
  324. package/src/aldehyde/index.tsx +220 -220
  325. package/src/aldehyde/layout/MainPage.tsx +334 -334
  326. package/src/aldehyde/layout/common.css +64 -64
  327. package/src/aldehyde/layout/coverstyle.css +51 -51
  328. package/src/aldehyde/layout/footer/index.css +5 -5
  329. package/src/aldehyde/layout/footer/index.js +17 -17
  330. package/src/aldehyde/layout/header/index.css +122 -122
  331. package/src/aldehyde/layout/header/index.tsx +152 -152
  332. package/src/aldehyde/layout/menu/block.css +7 -7
  333. package/src/aldehyde/layout/menu/block.tsx +174 -174
  334. package/src/aldehyde/layout/menu/l2menu-message-bar.tsx +160 -160
  335. package/src/aldehyde/layout/menu/l2menu-quick-bar.tsx +175 -175
  336. package/src/aldehyde/layout/menu/menu-2layers.tsx +117 -117
  337. package/src/aldehyde/layout/menu/menu-render.tsx +168 -168
  338. package/src/aldehyde/layout/menu/message-bar.less +73 -73
  339. package/src/aldehyde/layout/menu/reset-password.tsx +255 -255
  340. package/src/aldehyde/layout/menu/user-bar.tsx +259 -259
  341. package/src/aldehyde/layout/menu/userinfo-bar.tsx +69 -69
  342. package/src/aldehyde/layout/sidebar/index.css +57 -57
  343. package/src/aldehyde/layout/sidebar/index.tsx +84 -84
  344. package/src/aldehyde/layout2/components/icon-font.tsx +7 -7
  345. package/src/aldehyde/layout2/components/screenfull-button.tsx +21 -21
  346. package/src/aldehyde/layout2/components/search-menu.tsx +85 -85
  347. package/src/aldehyde/layout2/components/system-messages.tsx +75 -75
  348. package/src/aldehyde/layout2/components/theme-button.tsx +65 -65
  349. package/src/aldehyde/layout2/components/user-button.tsx +258 -258
  350. package/src/aldehyde/layout2/components/user-notification.tsx +74 -74
  351. package/src/aldehyde/layout2/css/header.css +41 -41
  352. package/src/aldehyde/layout2/css/sider.less +17 -17
  353. package/src/aldehyde/layout2/css/tabs-layout.less +18 -18
  354. package/src/aldehyde/layout2/header.tsx +278 -278
  355. package/src/aldehyde/layout2/layout-context.tsx +95 -95
  356. package/src/aldehyde/layout2/main.tsx +30 -30
  357. package/src/aldehyde/layout2/page.tsx +315 -315
  358. package/src/aldehyde/layout2/sider.tsx +230 -230
  359. package/src/aldehyde/layout2/tabs/tabs-context.tsx +37 -37
  360. package/src/aldehyde/layout2/tabs/tabs-layout.tsx +146 -146
  361. package/src/aldehyde/layout2/type/layout-type.ts +15 -15
  362. package/src/aldehyde/layout2/util/menu-util.tsx +125 -125
  363. package/src/aldehyde/layout3/components/tabs-layout.tsx +110 -110
  364. package/src/aldehyde/layout3/components/time.tsx +25 -25
  365. package/src/aldehyde/layout3/css/header.less +195 -195
  366. package/src/aldehyde/layout3/css/main.less +161 -161
  367. package/src/aldehyde/layout3/css/sider.less +32 -32
  368. package/src/aldehyde/layout3/css/tabs-layout.less +38 -38
  369. package/src/aldehyde/layout3/header.tsx +187 -187
  370. package/src/aldehyde/layout3/main.tsx +29 -29
  371. package/src/aldehyde/layout3/page.tsx +110 -110
  372. package/src/aldehyde/layout3/sider.tsx +198 -198
  373. package/src/aldehyde/layout4/components/tabs-layout.tsx +110 -110
  374. package/src/aldehyde/layout4/css/header.less +196 -196
  375. package/src/aldehyde/layout4/css/main.less +154 -154
  376. package/src/aldehyde/layout4/css/sider.less +37 -37
  377. package/src/aldehyde/layout4/css/tabs-layout.less +42 -42
  378. package/src/aldehyde/layout4/header.tsx +190 -190
  379. package/src/aldehyde/layout4/main.tsx +29 -29
  380. package/src/aldehyde/layout4/page.tsx +125 -125
  381. package/src/aldehyde/layout4/sider.tsx +201 -201
  382. package/src/aldehyde/layout5/css/header.less +35 -35
  383. package/src/aldehyde/layout5/css/sider.less +18 -18
  384. package/src/aldehyde/layout5/header.tsx +204 -204
  385. package/src/aldehyde/layout5/page.tsx +107 -107
  386. package/src/aldehyde/layout5/sider.tsx +235 -235
  387. package/src/aldehyde/list/calendar/index.less +20 -20
  388. package/src/aldehyde/list/calendar/index.tsx +157 -157
  389. package/src/aldehyde/list/card-list/card-list-item.tsx +111 -111
  390. package/src/aldehyde/list/card-list/index.less +154 -154
  391. package/src/aldehyde/list/card-list/index.tsx +83 -83
  392. package/src/aldehyde/list/gantt/index.less +8 -8
  393. package/src/aldehyde/list/gantt/index.tsx +508 -508
  394. package/src/aldehyde/list/vertical-list/index.less +208 -208
  395. package/src/aldehyde/list/vertical-list/index.tsx +55 -55
  396. package/src/aldehyde/list/vertical-list/item.tsx +136 -136
  397. package/src/aldehyde/locale/LocaleButton.tsx +48 -48
  398. package/src/aldehyde/locale/LocaleProvider.tsx +265 -265
  399. package/src/aldehyde/locale/langMp.ts +45 -45
  400. package/src/aldehyde/locale/translate.ts +80 -80
  401. package/src/aldehyde/locale/useLocale.ts +72 -72
  402. package/src/aldehyde/login/context-setter.tsx +130 -130
  403. package/src/aldehyde/login/index.css +19 -19
  404. package/src/aldehyde/login/login.tsx +255 -255
  405. package/src/aldehyde/login/router-login.tsx +107 -107
  406. package/src/aldehyde/login/vertify/index.css +143 -143
  407. package/src/aldehyde/login/vertify/index.tsx +360 -360
  408. package/src/aldehyde/login/vertify/tool.ts +13 -13
  409. package/src/aldehyde/login2/login-page.tsx +92 -92
  410. package/src/aldehyde/login2/login.tsx +226 -226
  411. package/src/aldehyde/login3/index.less +136 -136
  412. package/src/aldehyde/login3/login-page.tsx +71 -71
  413. package/src/aldehyde/lowcode-components/act-table/index.less +26 -26
  414. package/src/aldehyde/lowcode-components/act-table/index.tsx +139 -139
  415. package/src/aldehyde/lowcode-components/assets/lowcode-constant.tsx +12 -12
  416. package/src/aldehyde/lowcode-components/bar-chart/index.tsx +268 -268
  417. package/src/aldehyde/lowcode-components/base-button/index.less +7 -7
  418. package/src/aldehyde/lowcode-components/base-button/index.tsx +197 -197
  419. package/src/aldehyde/lowcode-components/base-image/index.tsx +220 -220
  420. package/src/aldehyde/lowcode-components/base-map/index.tsx +292 -292
  421. package/src/aldehyde/lowcode-components/base-radio/index.less +23 -23
  422. package/src/aldehyde/lowcode-components/base-radio/index.tsx +157 -157
  423. package/src/aldehyde/lowcode-components/base-table/index.tsx +268 -268
  424. package/src/aldehyde/lowcode-components/base-tabs/index.less +14 -14
  425. package/src/aldehyde/lowcode-components/base-tabs/index.tsx +183 -183
  426. package/src/aldehyde/lowcode-components/base-text/index.tsx +58 -58
  427. package/src/aldehyde/lowcode-components/border/border1/index.tsx +70 -70
  428. package/src/aldehyde/lowcode-components/border/border10/index.less +26 -26
  429. package/src/aldehyde/lowcode-components/border/border10/index.tsx +45 -45
  430. package/src/aldehyde/lowcode-components/border/border11/index.less +17 -17
  431. package/src/aldehyde/lowcode-components/border/border11/index.tsx +232 -232
  432. package/src/aldehyde/lowcode-components/border/border12/index.less +13 -13
  433. package/src/aldehyde/lowcode-components/border/border12/index.tsx +115 -115
  434. package/src/aldehyde/lowcode-components/border/border13/index.less +13 -13
  435. package/src/aldehyde/lowcode-components/border/border13/index.tsx +69 -69
  436. package/src/aldehyde/lowcode-components/border/border2/index.less +17 -17
  437. package/src/aldehyde/lowcode-components/border/border2/index.tsx +51 -51
  438. package/src/aldehyde/lowcode-components/border/border3/index.less +25 -25
  439. package/src/aldehyde/lowcode-components/border/border3/index.tsx +61 -61
  440. package/src/aldehyde/lowcode-components/border/border4/index.less +72 -72
  441. package/src/aldehyde/lowcode-components/border/border4/index.tsx +79 -79
  442. package/src/aldehyde/lowcode-components/border/border5/index.less +35 -35
  443. package/src/aldehyde/lowcode-components/border/border5/index.tsx +75 -75
  444. package/src/aldehyde/lowcode-components/border/border6/index.less +17 -17
  445. package/src/aldehyde/lowcode-components/border/border6/index.tsx +60 -60
  446. package/src/aldehyde/lowcode-components/border/border7/index.less +26 -26
  447. package/src/aldehyde/lowcode-components/border/border7/index.tsx +75 -75
  448. package/src/aldehyde/lowcode-components/border/border8/index.less +13 -13
  449. package/src/aldehyde/lowcode-components/border/border8/index.tsx +84 -84
  450. package/src/aldehyde/lowcode-components/border/border9/index.less +13 -13
  451. package/src/aldehyde/lowcode-components/border/border9/index.tsx +154 -154
  452. package/src/aldehyde/lowcode-components/capsule-bar-chart/index.tsx +290 -290
  453. package/src/aldehyde/lowcode-components/carousel/index.tsx +218 -218
  454. package/src/aldehyde/lowcode-components/circular-progress-chart/index.tsx +263 -263
  455. package/src/aldehyde/lowcode-components/column-3d-chart/index.tsx +438 -438
  456. package/src/aldehyde/lowcode-components/column-chart/index.tsx +293 -293
  457. package/src/aldehyde/lowcode-components/data-number/index.tsx +219 -219
  458. package/src/aldehyde/lowcode-components/data.d.ts +18 -18
  459. package/src/aldehyde/lowcode-components/decoration/decoration1/index.less +7 -7
  460. package/src/aldehyde/lowcode-components/decoration/decoration1/index.tsx +153 -153
  461. package/src/aldehyde/lowcode-components/decoration/decoration10/index.less +5 -5
  462. package/src/aldehyde/lowcode-components/decoration/decoration10/index.tsx +89 -89
  463. package/src/aldehyde/lowcode-components/decoration/decoration11/index.less +5 -5
  464. package/src/aldehyde/lowcode-components/decoration/decoration11/index.tsx +133 -133
  465. package/src/aldehyde/lowcode-components/decoration/decoration2/index.less +6 -6
  466. package/src/aldehyde/lowcode-components/decoration/decoration2/index.tsx +61 -61
  467. package/src/aldehyde/lowcode-components/decoration/decoration3/index.less +7 -7
  468. package/src/aldehyde/lowcode-components/decoration/decoration3/index.tsx +87 -87
  469. package/src/aldehyde/lowcode-components/decoration/decoration4/index.less +29 -29
  470. package/src/aldehyde/lowcode-components/decoration/decoration4/index.tsx +53 -53
  471. package/src/aldehyde/lowcode-components/decoration/decoration5/index.less +3 -3
  472. package/src/aldehyde/lowcode-components/decoration/decoration5/index.tsx +116 -116
  473. package/src/aldehyde/lowcode-components/decoration/decoration6/index.less +7 -7
  474. package/src/aldehyde/lowcode-components/decoration/decoration6/index.tsx +121 -121
  475. package/src/aldehyde/lowcode-components/decoration/decoration7/index.less +4 -4
  476. package/src/aldehyde/lowcode-components/decoration/decoration7/index.tsx +70 -70
  477. package/src/aldehyde/lowcode-components/decoration/decoration8/index.less +14 -14
  478. package/src/aldehyde/lowcode-components/decoration/decoration8/index.tsx +122 -122
  479. package/src/aldehyde/lowcode-components/decoration/decoration9/index.less +4 -4
  480. package/src/aldehyde/lowcode-components/decoration/decoration9/index.tsx +196 -196
  481. package/src/aldehyde/lowcode-components/effectScatter-map/index.tsx +315 -315
  482. package/src/aldehyde/lowcode-components/effectScatter-map-3d/index.tsx +419 -419
  483. package/src/aldehyde/lowcode-components/gauge-chart/index.tsx +254 -254
  484. package/src/aldehyde/lowcode-components/index.ts +130 -130
  485. package/src/aldehyde/lowcode-components/line-bar-chart/index.tsx +300 -300
  486. package/src/aldehyde/lowcode-components/line-chart/index.tsx +290 -290
  487. package/src/aldehyde/lowcode-components/liquid-chart/index.tsx +250 -250
  488. package/src/aldehyde/lowcode-components/lowcode-view/component/assets.ts +478 -478
  489. package/src/aldehyde/lowcode-components/lowcode-view/component/component-controller.ts +153 -153
  490. package/src/aldehyde/lowcode-components/lowcode-view/component/component-definition.ts +23 -23
  491. package/src/aldehyde/lowcode-components/lowcode-view/component/loading.tsx +20 -20
  492. package/src/aldehyde/lowcode-components/lowcode-view/component/util.ts +27 -27
  493. package/src/aldehyde/lowcode-components/lowcode-view/index.less +19 -19
  494. package/src/aldehyde/lowcode-components/lowcode-view/index.tsx +277 -277
  495. package/src/aldehyde/lowcode-components/lowcode-view/interface.ts +189 -189
  496. package/src/aldehyde/lowcode-components/pie-chart/index.tsx +349 -349
  497. package/src/aldehyde/lowcode-components/progress-chart/index.tsx +295 -295
  498. package/src/aldehyde/lowcode-components/radar-chart/index.tsx +322 -322
  499. package/src/aldehyde/lowcode-components/search-form/index.less +25 -25
  500. package/src/aldehyde/lowcode-components/search-form/index.tsx +121 -121
  501. package/src/aldehyde/lowcode-components/stroke-animation/index.tsx +219 -219
  502. package/src/aldehyde/module/block-menu-tree-drawer.tsx +118 -118
  503. package/src/aldehyde/module/criteria-page.tsx1 +175 -175
  504. package/src/aldehyde/module/draggable-modal.tsx +66 -66
  505. package/src/aldehyde/module/dtmpl-edit-card.tsx +437 -437
  506. package/src/aldehyde/module/dtmpl-edit-drawer.tsx +23 -23
  507. package/src/aldehyde/module/dtmpl-edit-modal.tsx +25 -25
  508. package/src/aldehyde/module/dtmpl-edit-page.tsx +558 -558
  509. package/src/aldehyde/module/dtmpl-editor.tsx +165 -165
  510. package/src/aldehyde/module/dtmpl-view-card.tsx +64 -64
  511. package/src/aldehyde/module/dtmpl-view-drawer.tsx +71 -71
  512. package/src/aldehyde/module/dtmpl-view-modal.tsx +56 -56
  513. package/src/aldehyde/module/embed-dtmpl-edit-page.tsx +137 -137
  514. package/src/aldehyde/module/index.less +4 -4
  515. package/src/aldehyde/module/ltmpl-drawer.tsx +60 -60
  516. package/src/aldehyde/module/ltmpl-modal.tsx +63 -63
  517. package/src/aldehyde/module/ltmpl-table.tsx +378 -378
  518. package/src/aldehyde/module/ttmpl-tree.tsx +47 -47
  519. package/src/aldehyde/routable/dtmpl-route.tsx +173 -173
  520. package/src/aldehyde/routable/import-route.tsx +35 -35
  521. package/src/aldehyde/routable/index.less +25 -25
  522. package/src/aldehyde/routable/ltmpl-route.tsx +539 -539
  523. package/src/aldehyde/routable/splitview-ltmpl-route.tsx +377 -377
  524. package/src/aldehyde/routable/ttmpl-route.tsx +93 -93
  525. package/src/aldehyde/routable/withroute.tsx +36 -36
  526. package/src/aldehyde/sso-Login/index.tsx +73 -73
  527. package/src/aldehyde/sso-Login/service/index.js +16 -16
  528. package/src/aldehyde/sso-Login/service/login.js +75 -75
  529. package/src/aldehyde/table/act-table.tsx +1831 -1831
  530. package/src/aldehyde/table/column/column-builder.tsx +864 -864
  531. package/src/aldehyde/table/column/column-selector.tsx +130 -130
  532. package/src/aldehyde/table/column/index.less +63 -63
  533. package/src/aldehyde/table/column/summary-builder.tsx +712 -712
  534. package/src/aldehyde/table/column/theme-color-getter.tsx +25 -25
  535. package/src/aldehyde/table/control-table-x-axis-wrapper.tsx +80 -80
  536. package/src/aldehyde/table/index.css +211 -211
  537. package/src/aldehyde/table/l2-act-table.tsx +91 -91
  538. package/src/aldehyde/table/modal-select-table.tsx +308 -308
  539. package/src/aldehyde/table/page-config-button.tsx +203 -203
  540. package/src/aldehyde/table/pagination.css +14 -14
  541. package/src/aldehyde/table/pagination.tsx +81 -81
  542. package/src/aldehyde/table/query-table.tsx +658 -658
  543. package/src/aldehyde/table/relation-table.tsx +1093 -1093
  544. package/src/aldehyde/table/report-table.tsx +125 -125
  545. package/src/aldehyde/table/resizable-table.tsx +97 -97
  546. package/src/aldehyde/table/select-table.tsx +559 -548
  547. package/src/aldehyde/table/selected-rows-card.tsx +78 -78
  548. package/src/aldehyde/table/stat/restat.tsx +122 -122
  549. package/src/aldehyde/table/table-util.tsx +25 -25
  550. package/src/aldehyde/tmpl/control-type-supportor.tsx +154 -154
  551. package/src/aldehyde/tmpl/hc-data-source.tsx +566 -566
  552. package/src/aldehyde/tmpl/hcservice-v3.tsx +1590 -1590
  553. package/src/aldehyde/tmpl/interface.tsx +919 -919
  554. package/src/aldehyde/tmpl/model-struc-v3.tsx +111 -111
  555. package/src/aldehyde/tmpl/superagent.js +146 -146
  556. package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +585 -585
  557. package/src/aldehyde/tmpl/web-socket.ts +366 -366
  558. package/src/aldehyde/tree/act-tree.tsx +217 -217
  559. package/src/aldehyde/tree/block-menu-auth-tree.tsx +189 -189
  560. package/src/aldehyde/tree/index.css +22 -22
  561. package/src/aldehyde/tree/navigation-tree.tsx +39 -39
  562. package/src/aldehyde/tree/tmpl-tree.tsx +751 -751
  563. package/src/aldehyde/tree/tree-node.tsx +73 -73
  564. package/src/aldehyde/tree/tree-utils.tsx +317 -317
  565. package/src/aldehyde/units/EncryptUtils.js +37 -37
  566. package/src/aldehyde/units/image.d.ts +7 -7
  567. package/src/aldehyde/units/index.tsx +1367 -1367
  568. package/src/aldehyde/units/storage.js +2 -2
  569. package/src/aldehyde/utils/dsu.ts +27 -27
  570. package/src/aldehyde/welcome/HCWelcome.js +404 -404
  571. package/src/aldehyde/welcome/HCWelcome1.js +259 -259
  572. package/src/aldehyde/welcome/components/menu-card.less +96 -96
  573. package/src/aldehyde/welcome/components/menu-card.tsx +70 -70
  574. package/src/aldehyde/welcome/components/page-card.less +49 -49
  575. package/src/aldehyde/welcome/components/page-card.tsx +97 -97
  576. package/src/aldehyde/welcome/components/quick-entrance.less +120 -120
  577. package/src/aldehyde/welcome/components/quick-entrance.tsx +80 -80
  578. package/src/aldehyde/welcome/components/user-menus.less +192 -192
  579. package/src/aldehyde/welcome/components/user-menus.tsx +279 -279
  580. package/src/aldehyde/welcome/components/workbench.less +118 -118
  581. package/src/aldehyde/welcome/components/workbench.tsx +146 -146
  582. package/src/aldehyde/welcome/index.css +13 -13
@@ -1,458 +1,458 @@
1
- import Konva from 'konva';
2
- import { Render } from '../index';
3
- import { SortItem } from '../types';
4
-
5
- interface AlignRect {
6
- x: number;
7
- y: number;
8
- width: number;
9
- height: number;
10
- }
11
-
12
- type SortItemPair = [SortItem, SortItem];
13
-
14
- export class AttractTool {
15
-
16
- private render: Render;
17
- constructor(render: Render) {
18
- this.render = render;
19
- }
20
- // 对齐线
21
- alignLines: Konva.Line[] = [];
22
-
23
- // 对齐线清除
24
- alignLinesClear() {
25
- for (const line of this.alignLines) {
26
- line.destroy();
27
- }
28
- this.alignLines = [];
29
- }
30
-
31
- // 从选中节点 getClientRect 计算真实边界框,绕过 back rect 的 padding
32
- private getSelectingNodesRect(nodes: Konva.Node[]): AlignRect | null {
33
- if (nodes.length === 0) return null;
34
- let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
35
- for (const node of nodes) {
36
- const r = node.getClientRect();
37
- if (r.x < minX) minX = r.x;
38
- if (r.y < minY) minY = r.y;
39
- if (r.x + r.width > maxX) maxX = r.x + r.width;
40
- if (r.y + r.height > maxY) maxY = r.y + r.height;
41
- }
42
- return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
43
- }
44
-
45
- getSortItems(rect: AlignRect, targetPadding?: number) {
46
- const stageState = this.render.getStageState();
47
- const padding = targetPadding ?? this.render.transformer.padding();
48
- // 横向所有需要判断对齐的 x 坐标
49
- const sortX: Array<SortItem> = [];
50
- // 纵向向所有需要判断对齐的 y 坐标
51
- const sortY: Array<SortItem> = [];
52
- // 选择目标所有的对齐 x(使用实际节点边缘而非 back rect,补偿 padding)
53
- sortX.push(
54
- { value: this.render.toStageValue(rect.x - stageState.x + padding) },
55
- { value: this.render.toStageValue(rect.x - stageState.x + rect.width / 2) },
56
- { value: this.render.toStageValue(rect.x - stageState.x + rect.width - padding) }
57
- );
58
- // 选择目标所有的对齐 y(使用实际节点边缘而非 back rect,补偿 padding)
59
- sortY.push(
60
- { value: this.render.toStageValue(rect.y - stageState.y + padding) },
61
- { value: this.render.toStageValue(rect.y - stageState.y + rect.height / 2) },
62
- { value: this.render.toStageValue(rect.y - stageState.y + rect.height - padding) }
63
- );
64
- // 拖动目标
65
- const targetIds = this.render.selectionTool.selectingNodes.map((o) => o._id);
66
- // 除拖动目标的其他
67
- const otherNodes = this.render.layer.find('.asset').filter((node) => !targetIds.includes(node._id));
68
- // 其他节点所有的 x / y 坐标
69
- for (const node of otherNodes) {
70
- const nodeRect = node.getClientRect();
71
- sortX.push(
72
- { id: node._id, value: this.render.toStageValue(nodeRect.x - stageState.x) },
73
- { id: node._id, value: this.render.toStageValue(nodeRect.x - stageState.x + nodeRect.width / 2) },
74
- { id: node._id, value: this.render.toStageValue(nodeRect.x - stageState.x + nodeRect.width) }
75
- );
76
- sortY.push(
77
- { id: node._id, value: this.render.toStageValue(nodeRect.y - stageState.y) },
78
- { id: node._id, value: this.render.toStageValue(nodeRect.y - stageState.y + nodeRect.height / 2) },
79
- { id: node._id, value: this.render.toStageValue(nodeRect.y - stageState.y + nodeRect.height) }
80
- );
81
- }
82
- sortX.sort((a, b) => a.value - b.value);
83
- sortY.sort((a, b) => a.value - b.value);
84
- return { sortX, sortY };
85
- }
86
-
87
- attractPoint = (pos: Konva.Vector2d) => {
88
- this.alignLinesClear(); // 对齐线清除
89
- const stageState = this.render.getStageState();
90
- const showGrid = this.render.showGrid; // 是否显示网格,不显示网格则不网格吸附
91
- let newPosX = pos.x;
92
- let newPosY = pos.y;
93
- let isAttract = false;
94
- let pairX: SortItemPair | null = null;
95
- let pairY: SortItemPair | null = null;
96
- // 对齐线 磁吸逻辑
97
- if (!this.render.config.readonly && this.render.config.attractNode) {
98
- const sortX = [{ value: this.render.toStageValue(newPosX - stageState.x) }] as SortItem[],
99
- sortY = [{ value: this.render.toStageValue(newPosY - stageState.y) }] as SortItem[];
100
- // x 最短距离
101
- let XMin = Infinity;
102
- // x 最短距离的【对】(多个)
103
- let pairXMin: Array<SortItemPair> = [];
104
- // y 最短距离
105
- let YMin = Infinity;
106
- // y 最短距离的【对】(多个)
107
- let pairYMin: Array<SortItemPair> = [];
108
- // 一对对比较距离,记录最短距离的【对】
109
- // 必须是 选择目标 与 其他节点 成【对】
110
- // 可能有多个这样的【对】
111
- for (let i = 0; i < sortX.length - 1; i++) {
112
- // 相邻两个点,必须为 目标节点 + 非目标节点
113
- if ((sortX[i].id === void 0 && sortX[i + 1].id !== void 0) || (sortX[i].id !== void 0 && sortX[i + 1].id === void 0)) {
114
- // 相邻两个点的 x 距离
115
- const offset = Math.abs(sortX[i].value - sortX[i + 1].value);
116
- if (offset < XMin) {
117
- // 更新 x 最短距离 记录
118
- XMin = offset;
119
- // 更新 x 最短距离的【对】 记录
120
- pairXMin = [[sortX[i], sortX[i + 1]]];
121
- } else if (offset === XMin) {
122
- // 存在多个 x 最短距离
123
- pairXMin.push([sortX[i], sortX[i + 1]]);
124
- }
125
- }
126
- }
127
- for (let i = 0; i < sortY.length - 1; i++) {
128
- // 相邻两个点,必须为 目标节点 + 非目标节点
129
- if ((sortY[i].id === void 0 && sortY[i + 1].id !== void 0) || (sortY[i].id !== void 0 && sortY[i + 1].id === void 0)) {
130
- // 相邻两个点的 y 距离
131
- const offset = Math.abs(sortY[i].value - sortY[i + 1].value);
132
- if (offset < YMin) {
133
- // 更新 y 最短距离 记录
134
- YMin = offset;
135
- // 更新 y 最短距离的【对】 记录
136
- pairYMin = [[sortY[i], sortY[i + 1]]];
137
- } else if (offset === YMin) {
138
- // 存在多个 y 最短距离
139
- pairYMin.push([sortY[i], sortY[i + 1]]);
140
- }
141
- }
142
- }
143
- // 取第一【对】,用于判断距离是否在阈值内
144
- if (pairXMin[0]) {
145
- if (Math.abs(pairXMin[0][0].value - pairXMin[0][1].value) < this.render.bgSize / 2) {
146
- pairX = pairXMin[0];
147
- }
148
- }
149
- if (pairYMin[0]) {
150
- if (Math.abs(pairYMin[0][0].value - pairYMin[0][1].value) < this.render.bgSize / 2) {
151
- pairY = pairYMin[0];
152
- }
153
- }
154
- // 优先对齐节点
155
- // 存在 1或多个 x 最短距离 满足阈值
156
- if (pairX?.length === 2) {
157
- for (const pair of pairXMin) {
158
- // 【对】里的那个非目标节点
159
- const other = pair.find((o) => o.id !== void 0);
160
- if (other) { // x 对齐线
161
- const line = new Konva.Line({
162
- points: [[other.value, this.render.toStageValue(-stageState.y)], [other.value, this.render.toStageValue(this.render.stage.height() - stageState.y)]].flat(),
163
- stroke: 'blue',
164
- strokeWidth: this.render.toStageValue(1),
165
- dash: [4, 4],
166
- listening: false
167
- });
168
- this.alignLines.push(line);
169
- this.render.layerCover.add(line);
170
- }
171
- }
172
- // 磁贴第一个【对】
173
- const target = pairX.find((o) => o.id === void 0);
174
- const other = pairX.find((o) => o.id !== void 0);
175
- if (target && other) {
176
- // 磁铁坐标值
177
- newPosX = newPosX - this.render.toBoardValue(target.value - other.value);
178
- isAttract = true;
179
- }
180
- }
181
- // 存在 1或多个 y 最短距离 满足阈值
182
- if (pairY?.length === 2) {
183
- for (const pair of pairYMin) {
184
- // 【对】里的那个非目标节点
185
- const other = pair.find((o) => o.id !== void 0);
186
- if (other) {
187
- // y 对齐线
188
- const line = new Konva.Line({
189
- points: [[this.render.toStageValue(-stageState.x), other.value], [this.render.toStageValue(this.render.stage.width() - stageState.x), other.value]].flat(),
190
- stroke: 'blue',
191
- strokeWidth: this.render.toStageValue(1),
192
- dash: [4, 4],
193
- listening: false
194
- });
195
- this.alignLines.push(line);
196
- this.render.layerCover.add(line);
197
- }
198
- }
199
- // 磁贴第一个【对】
200
- const target = pairY.find((o) => o.id === void 0);
201
- const other = pairY.find((o) => o.id !== void 0);
202
- if (target && other) {
203
- // 磁铁坐标值
204
- newPosY = newPosY - this.render.toBoardValue(target.value - other.value);
205
- isAttract = true;
206
- }
207
- }
208
- }
209
- if (!this.render.config.readonly && this.render.config.attractBg && showGrid) {
210
- // 没有 x 对齐节点
211
- if (pairX === null) {
212
- const logicLeftX = this.render.toStageValue(newPosX - stageState.x); // x坐标
213
- const logicNumLeftX = Math.round(logicLeftX / this.render.bgSize); // x单元格个数
214
- const logicClosestLeftX = logicNumLeftX * this.render.bgSize; // x磁贴目标坐标
215
- const logicDiffLeftX = Math.abs(logicLeftX - logicClosestLeftX); // x磁贴偏移量
216
- const logicRightX = this.render.toStageValue(newPosX - stageState.x); // x坐标
217
- const logicNumRightX = Math.round(logicRightX / this.render.bgSize); // x单元格个数
218
- const logicClosestRightX = logicNumRightX * this.render.bgSize; // x磁贴目标坐标
219
- const logicDiffRightX = Math.abs(logicRightX - logicClosestRightX); // x磁贴偏移量
220
- // stage 逻辑边界磁贴
221
- const logicStageRightX = stageState.width;
222
- const logicDiffStageRightX = Math.abs(logicRightX - logicStageRightX);
223
- // 距离近优先
224
- for (const diff of [{ type: 'leftX', value: logicDiffLeftX }, { type: 'rightX', value: logicDiffRightX }, { type: 'stageRightX', value: logicDiffStageRightX }].sort((a, b) => a.value - b.value)) {
225
- if (diff.value < 5) {
226
- if (diff.type === 'stageRightX') {
227
- newPosX = this.render.toBoardValue(logicStageRightX) + stageState.x;
228
- } else if (diff.type === 'leftX') {
229
- newPosX = this.render.toBoardValue(logicClosestLeftX) + stageState.x;
230
- } else if (diff.type === 'rightX') {
231
- newPosX = this.render.toBoardValue(logicClosestRightX) + stageState.x;
232
- }
233
- isAttract = true;
234
- break;
235
- }
236
- }
237
- }
238
- // 没有 y 对齐节点
239
- if (pairY === null) {
240
- const logicTopY = this.render.toStageValue(newPosY - stageState.y); // y坐标
241
- const logicNumTopY = Math.round(logicTopY / this.render.bgSize); // y单元格个数
242
- const logicClosestTopY = logicNumTopY * this.render.bgSize; // y磁贴目标坐标
243
- const logicDiffTopY = Math.abs(logicTopY - logicClosestTopY); // y磁贴偏移量
244
- const logicBottomY = this.render.toStageValue(newPosY - stageState.y); // y坐标
245
- const logicNumBottomY = Math.round(logicBottomY / this.render.bgSize); // y单元格个数
246
- const logicClosestBottomY = logicNumBottomY * this.render.bgSize; // y磁贴目标坐标
247
- const logicDiffBottomY = Math.abs(logicBottomY - logicClosestBottomY); // y磁贴偏移量
248
- // stage 逻辑边界磁贴
249
- const logicStageBottomY = stageState.height;
250
- const logicDiffStageBottomY = Math.abs(logicBottomY - logicStageBottomY);
251
- // 距离近优先
252
- for (const diff of [{ type: 'topY', value: logicDiffTopY }, { type: 'bottomY', value: logicDiffBottomY }, { type: 'stageBottomY', value: logicDiffStageBottomY }].sort((a, b) => a.value - b.value)) {
253
- if (diff.value < 5) {
254
- if (diff.type === 'stageBottomY') {
255
- newPosY = this.render.toBoardValue(logicStageBottomY) + stageState.y;
256
- } else if (diff.type === 'topY') {
257
- newPosY = this.render.toBoardValue(logicClosestTopY) + stageState.y;
258
- } else if (diff.type === 'bottomY') {
259
- newPosY = this.render.toBoardValue(logicClosestBottomY) + stageState.y;
260
- }
261
- isAttract = true;
262
- break;
263
- }
264
- }
265
- }
266
- }
267
- return { pos: { x: newPosX, y: newPosY }, isAttract };
268
- }
269
- // 磁吸逻辑
270
- attractTransformer = (rect: AlignRect) => {
271
- // 对齐线清除
272
- this.alignLinesClear();
273
- const stageState = this.render.getStageState();
274
- const width = this.render.transformer.width();
275
- const height = this.render.transformer.height();
276
- const showGrid = this.render.showGrid; // 是否显示网格,不显示网格则不网格吸附
277
- let newPosX = rect.x;
278
- let newPosY = rect.y;
279
- let isAttract = false;
280
- let pairX: SortItemPair | null = null;
281
- let pairY: SortItemPair | null = null;
282
- // 对齐线 磁吸逻辑
283
- if (!this.render.config.readonly && this.render.config.attractNode) {
284
- // 从选中节点的真实 getClientRect 计算边界框,避免 back rect 的 padding 补偿引入亚像素偏差
285
- const selectingNodes = this.render.selectionTool.selectingNodes;
286
- const nodeRect = this.getSelectingNodesRect(selectingNodes) ?? rect;
287
- const { sortX, sortY } = this.getSortItems(nodeRect, 0);
288
- // x 最短距离
289
- let XMin = Infinity;
290
- // x 最短距离的【对】(多个)
291
- let pairXMin: Array<SortItemPair> = [];
292
- // y 最短距离
293
- let YMin = Infinity;
294
- // y 最短距离的【对】(多个)
295
- let pairYMin: Array<SortItemPair> = [];
296
- // 一对对比较距离,记录最短距离的【对】
297
- // 必须是 选择目标 与 其他节点 成【对】
298
- // 可能有多个这样的【对】
299
- for (let i = 0; i < sortX.length - 1; i++) {
300
- // 相邻两个点,必须为 目标节点 + 非目标节点
301
- if ((sortX[i].id === void 0 && sortX[i + 1].id !== void 0) || (sortX[i].id !== void 0 && sortX[i + 1].id === void 0)) {
302
- // 相邻两个点的 x 距离
303
- const offset = Math.abs(sortX[i].value - sortX[i + 1].value)
304
- if (offset < XMin) {
305
- // 更新 x 最短距离 记录
306
- XMin = offset;
307
- // 更新 x 最短距离的【对】 记录
308
- pairXMin = [[sortX[i], sortX[i + 1]]];
309
- } else if (offset === XMin) {
310
- // 存在多个 x 最短距离
311
- pairXMin.push([sortX[i], sortX[i + 1]]);
312
- }
313
- }
314
- }
315
- for (let i = 0; i < sortY.length - 1; i++) {
316
- // 相邻两个点,必须为 目标节点 + 非目标节点
317
- if ((sortY[i].id === void 0 && sortY[i + 1].id !== void 0) || (sortY[i].id !== void 0 && sortY[i + 1].id === void 0)) {
318
- // 相邻两个点的 y 距离
319
- const offset = Math.abs(sortY[i].value - sortY[i + 1].value);
320
- if (offset < YMin) {
321
- // 更新 y 最短距离 记录
322
- YMin = offset;
323
- // 更新 y 最短距离的【对】 记录
324
- pairYMin = [[sortY[i], sortY[i + 1]]];
325
- } else if (offset === YMin) {
326
- // 存在多个 y 最短距离
327
- pairYMin.push([sortY[i], sortY[i + 1]]);
328
- }
329
- }
330
- }
331
- // 取第一【对】,用于判断距离是否在阈值内
332
- if (pairXMin[0]) {
333
- if (Math.abs(pairXMin[0][0].value - pairXMin[0][1].value) < this.render.bgSize / 2) {
334
- pairX = pairXMin[0];
335
- }
336
- }
337
- if (pairYMin[0]) {
338
- if (Math.abs(pairYMin[0][0].value - pairYMin[0][1].value) < this.render.bgSize / 2) {
339
- pairY = pairYMin[0];
340
- }
341
- }
342
- // 优先对齐节点
343
- // 存在 1或多个 x 最短距离 满足阈值
344
- if (pairX?.length === 2) {
345
- for (const pair of pairXMin) {
346
- // 【对】里的那个非目标节点
347
- const other = pair.find((o) => o.id !== void 0);
348
- if (other) {
349
- // x 对齐线
350
- const line = new Konva.Line({
351
- points: [[other.value, this.render.toStageValue(-stageState.y)], [other.value, this.render.toStageValue(this.render.stage.height() - stageState.y)]].flat(),
352
- stroke: 'blue',
353
- strokeWidth: this.render.toStageValue(1),
354
- dash: [4, 4],
355
- listening: false
356
- });
357
- this.alignLines.push(line);
358
- this.render.layerCover.add(line);
359
- }
360
- }
361
- // 磁贴第一个【对】
362
- const target = pairX.find((o) => o.id === void 0);
363
- const other = pairX.find((o) => o.id !== void 0);
364
- if (target && other) {
365
- // 磁贴坐标值
366
- newPosX = newPosX - this.render.toBoardValue(target.value - other.value);
367
- isAttract = true;
368
- }
369
- }
370
- // 存在 1或多个 y 最短距离 满足阈值
371
- if (pairY?.length === 2) {
372
- for (const pair of pairYMin) {
373
- // 【对】里的那个非目标节点
374
- const other = pair.find((o) => o.id !== void 0);
375
- if (other) {
376
- // y 对齐线
377
- const line = new Konva.Line({
378
- points: [[this.render.toStageValue(-stageState.x), other.value], [this.render.toStageValue(this.render.stage.width() - stageState.x), other.value]].flat(),
379
- stroke: 'blue',
380
- strokeWidth: this.render.toStageValue(1),
381
- dash: [4, 4],
382
- listening: false
383
- });
384
- this.alignLines.push(line);
385
- this.render.layerCover.add(line);
386
- }
387
- }
388
- // 磁贴第一个【对】
389
- const target = pairY.find((o) => o.id === void 0);
390
- const other = pairY.find((o) => o.id !== void 0);
391
- if (target && other) {
392
- // 磁贴坐标值
393
- newPosY = newPosY - this.render.toBoardValue(target.value - other.value);
394
- isAttract = true;
395
- }
396
- }
397
- }
398
- if (!this.render.config.readonly && this.render.config.attractBg && showGrid) { // 显示网格则执行网格磁吸
399
- // 没有 x 对齐节点
400
- if (pairX === null) {
401
- const logicLeftX = this.render.toStageValue(newPosX - stageState.x); // x坐标
402
- const logicNumLeftX = Math.round(logicLeftX / this.render.bgSize); // x单元格个数
403
- const logicClosestLeftX = logicNumLeftX * this.render.bgSize; // x磁贴目标坐标
404
- const logicDiffLeftX = Math.abs(logicLeftX - logicClosestLeftX); // x磁贴偏移量
405
- const logicRightX = this.render.toStageValue(newPosX + width - stageState.x); // x坐标
406
- const logicNumRightX = Math.round(logicRightX / this.render.bgSize); // x单元格个数
407
- const logicClosestRightX = logicNumRightX * this.render.bgSize; // x磁贴目标坐标
408
- const logicDiffRightX = Math.abs(logicRightX - logicClosestRightX); // x磁贴偏移量
409
- // stage 逻辑边界磁贴
410
- const logicStageRightX = stageState.width;
411
- const logicDiffStageRightX = Math.abs(logicRightX - logicStageRightX);
412
- // 距离近优先
413
- for (const diff of [{ type: 'leftX', value: logicDiffLeftX }, { type: 'rightX', value: logicDiffRightX }, { type: 'stageRightX', value: logicDiffStageRightX }].sort((a, b) => a.value - b.value)) {
414
- if (diff.value < 5) {
415
- if (diff.type === 'stageRightX') {
416
- newPosX = this.render.toBoardValue(logicStageRightX) + stageState.x - width;
417
- } else if (diff.type === 'leftX') {
418
- newPosX = this.render.toBoardValue(logicClosestLeftX) + stageState.x;
419
- } else if (diff.type === 'rightX') {
420
- newPosX = this.render.toBoardValue(logicClosestRightX) + stageState.x - width;
421
- }
422
- isAttract = true;
423
- break;
424
- }
425
- }
426
- }
427
- // 没有 y 对齐节点
428
- if (pairY === null) {
429
- const logicTopY = this.render.toStageValue(newPosY - stageState.y); // y坐标
430
- const logicNumTopY = Math.round(logicTopY / this.render.bgSize); // y单元格个数
431
- const logicClosestTopY = logicNumTopY * this.render.bgSize; // y磁贴目标坐标
432
- const logicDiffTopY = Math.abs(logicTopY - logicClosestTopY); // y磁贴偏移量
433
- const logicBottomY = this.render.toStageValue(newPosY + height - stageState.y); // y坐标
434
- const logicNumBottomY = Math.round(logicBottomY / this.render.bgSize); // y单元格个数
435
- const logicClosestBottomY = logicNumBottomY * this.render.bgSize; // y磁贴目标坐标
436
- const logicDiffBottomY = Math.abs(logicBottomY - logicClosestBottomY); // y磁贴偏移量
437
- // stage 逻辑边界磁贴
438
- const logicStageBottomY = stageState.height;
439
- const logicDiffStageBottomY = Math.abs(logicBottomY - logicStageBottomY);
440
- // 距离近优先
441
- for (const diff of [{ type: 'topY', value: logicDiffTopY }, { type: 'bottomY', value: logicDiffBottomY }, { type: 'stageBottomY', value: logicDiffStageBottomY }].sort((a, b) => a.value - b.value)) {
442
- if (diff.value < 5) {
443
- if (diff.type === 'stageBottomY') {
444
- newPosY = this.render.toBoardValue(logicStageBottomY) + stageState.y - height;
445
- } else if (diff.type === 'topY') {
446
- newPosY = this.render.toBoardValue(logicClosestTopY) + stageState.y;
447
- } else if (diff.type === 'bottomY') {
448
- newPosY = this.render.toBoardValue(logicClosestBottomY) + stageState.y - height;
449
- }
450
- isAttract = true;
451
- break;
452
- }
453
- }
454
- }
455
- }
456
- return { pos: { x: newPosX, y: newPosY }, isAttract };
457
- }
1
+ import Konva from 'konva';
2
+ import { Render } from '../index';
3
+ import { SortItem } from '../types';
4
+
5
+ interface AlignRect {
6
+ x: number;
7
+ y: number;
8
+ width: number;
9
+ height: number;
10
+ }
11
+
12
+ type SortItemPair = [SortItem, SortItem];
13
+
14
+ export class AttractTool {
15
+
16
+ private render: Render;
17
+ constructor(render: Render) {
18
+ this.render = render;
19
+ }
20
+ // 对齐线
21
+ alignLines: Konva.Line[] = [];
22
+
23
+ // 对齐线清除
24
+ alignLinesClear() {
25
+ for (const line of this.alignLines) {
26
+ line.destroy();
27
+ }
28
+ this.alignLines = [];
29
+ }
30
+
31
+ // 从选中节点 getClientRect 计算真实边界框,绕过 back rect 的 padding
32
+ private getSelectingNodesRect(nodes: Konva.Node[]): AlignRect | null {
33
+ if (nodes.length === 0) return null;
34
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
35
+ for (const node of nodes) {
36
+ const r = node.getClientRect();
37
+ if (r.x < minX) minX = r.x;
38
+ if (r.y < minY) minY = r.y;
39
+ if (r.x + r.width > maxX) maxX = r.x + r.width;
40
+ if (r.y + r.height > maxY) maxY = r.y + r.height;
41
+ }
42
+ return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
43
+ }
44
+
45
+ getSortItems(rect: AlignRect, targetPadding?: number) {
46
+ const stageState = this.render.getStageState();
47
+ const padding = targetPadding ?? this.render.transformer.padding();
48
+ // 横向所有需要判断对齐的 x 坐标
49
+ const sortX: Array<SortItem> = [];
50
+ // 纵向向所有需要判断对齐的 y 坐标
51
+ const sortY: Array<SortItem> = [];
52
+ // 选择目标所有的对齐 x(使用实际节点边缘而非 back rect,补偿 padding)
53
+ sortX.push(
54
+ { value: this.render.toStageValue(rect.x - stageState.x + padding) },
55
+ { value: this.render.toStageValue(rect.x - stageState.x + rect.width / 2) },
56
+ { value: this.render.toStageValue(rect.x - stageState.x + rect.width - padding) }
57
+ );
58
+ // 选择目标所有的对齐 y(使用实际节点边缘而非 back rect,补偿 padding)
59
+ sortY.push(
60
+ { value: this.render.toStageValue(rect.y - stageState.y + padding) },
61
+ { value: this.render.toStageValue(rect.y - stageState.y + rect.height / 2) },
62
+ { value: this.render.toStageValue(rect.y - stageState.y + rect.height - padding) }
63
+ );
64
+ // 拖动目标
65
+ const targetIds = this.render.selectionTool.selectingNodes.map((o) => o._id);
66
+ // 除拖动目标的其他
67
+ const otherNodes = this.render.layer.find('.asset').filter((node) => !targetIds.includes(node._id));
68
+ // 其他节点所有的 x / y 坐标
69
+ for (const node of otherNodes) {
70
+ const nodeRect = node.getClientRect();
71
+ sortX.push(
72
+ { id: node._id, value: this.render.toStageValue(nodeRect.x - stageState.x) },
73
+ { id: node._id, value: this.render.toStageValue(nodeRect.x - stageState.x + nodeRect.width / 2) },
74
+ { id: node._id, value: this.render.toStageValue(nodeRect.x - stageState.x + nodeRect.width) }
75
+ );
76
+ sortY.push(
77
+ { id: node._id, value: this.render.toStageValue(nodeRect.y - stageState.y) },
78
+ { id: node._id, value: this.render.toStageValue(nodeRect.y - stageState.y + nodeRect.height / 2) },
79
+ { id: node._id, value: this.render.toStageValue(nodeRect.y - stageState.y + nodeRect.height) }
80
+ );
81
+ }
82
+ sortX.sort((a, b) => a.value - b.value);
83
+ sortY.sort((a, b) => a.value - b.value);
84
+ return { sortX, sortY };
85
+ }
86
+
87
+ attractPoint = (pos: Konva.Vector2d) => {
88
+ this.alignLinesClear(); // 对齐线清除
89
+ const stageState = this.render.getStageState();
90
+ const showGrid = this.render.showGrid; // 是否显示网格,不显示网格则不网格吸附
91
+ let newPosX = pos.x;
92
+ let newPosY = pos.y;
93
+ let isAttract = false;
94
+ let pairX: SortItemPair | null = null;
95
+ let pairY: SortItemPair | null = null;
96
+ // 对齐线 磁吸逻辑
97
+ if (!this.render.config.readonly && this.render.config.attractNode) {
98
+ const sortX = [{ value: this.render.toStageValue(newPosX - stageState.x) }] as SortItem[],
99
+ sortY = [{ value: this.render.toStageValue(newPosY - stageState.y) }] as SortItem[];
100
+ // x 最短距离
101
+ let XMin = Infinity;
102
+ // x 最短距离的【对】(多个)
103
+ let pairXMin: Array<SortItemPair> = [];
104
+ // y 最短距离
105
+ let YMin = Infinity;
106
+ // y 最短距离的【对】(多个)
107
+ let pairYMin: Array<SortItemPair> = [];
108
+ // 一对对比较距离,记录最短距离的【对】
109
+ // 必须是 选择目标 与 其他节点 成【对】
110
+ // 可能有多个这样的【对】
111
+ for (let i = 0; i < sortX.length - 1; i++) {
112
+ // 相邻两个点,必须为 目标节点 + 非目标节点
113
+ if ((sortX[i].id === void 0 && sortX[i + 1].id !== void 0) || (sortX[i].id !== void 0 && sortX[i + 1].id === void 0)) {
114
+ // 相邻两个点的 x 距离
115
+ const offset = Math.abs(sortX[i].value - sortX[i + 1].value);
116
+ if (offset < XMin) {
117
+ // 更新 x 最短距离 记录
118
+ XMin = offset;
119
+ // 更新 x 最短距离的【对】 记录
120
+ pairXMin = [[sortX[i], sortX[i + 1]]];
121
+ } else if (offset === XMin) {
122
+ // 存在多个 x 最短距离
123
+ pairXMin.push([sortX[i], sortX[i + 1]]);
124
+ }
125
+ }
126
+ }
127
+ for (let i = 0; i < sortY.length - 1; i++) {
128
+ // 相邻两个点,必须为 目标节点 + 非目标节点
129
+ if ((sortY[i].id === void 0 && sortY[i + 1].id !== void 0) || (sortY[i].id !== void 0 && sortY[i + 1].id === void 0)) {
130
+ // 相邻两个点的 y 距离
131
+ const offset = Math.abs(sortY[i].value - sortY[i + 1].value);
132
+ if (offset < YMin) {
133
+ // 更新 y 最短距离 记录
134
+ YMin = offset;
135
+ // 更新 y 最短距离的【对】 记录
136
+ pairYMin = [[sortY[i], sortY[i + 1]]];
137
+ } else if (offset === YMin) {
138
+ // 存在多个 y 最短距离
139
+ pairYMin.push([sortY[i], sortY[i + 1]]);
140
+ }
141
+ }
142
+ }
143
+ // 取第一【对】,用于判断距离是否在阈值内
144
+ if (pairXMin[0]) {
145
+ if (Math.abs(pairXMin[0][0].value - pairXMin[0][1].value) < this.render.bgSize / 2) {
146
+ pairX = pairXMin[0];
147
+ }
148
+ }
149
+ if (pairYMin[0]) {
150
+ if (Math.abs(pairYMin[0][0].value - pairYMin[0][1].value) < this.render.bgSize / 2) {
151
+ pairY = pairYMin[0];
152
+ }
153
+ }
154
+ // 优先对齐节点
155
+ // 存在 1或多个 x 最短距离 满足阈值
156
+ if (pairX?.length === 2) {
157
+ for (const pair of pairXMin) {
158
+ // 【对】里的那个非目标节点
159
+ const other = pair.find((o) => o.id !== void 0);
160
+ if (other) { // x 对齐线
161
+ const line = new Konva.Line({
162
+ points: [[other.value, this.render.toStageValue(-stageState.y)], [other.value, this.render.toStageValue(this.render.stage.height() - stageState.y)]].flat(),
163
+ stroke: 'blue',
164
+ strokeWidth: this.render.toStageValue(1),
165
+ dash: [4, 4],
166
+ listening: false
167
+ });
168
+ this.alignLines.push(line);
169
+ this.render.layerCover.add(line);
170
+ }
171
+ }
172
+ // 磁贴第一个【对】
173
+ const target = pairX.find((o) => o.id === void 0);
174
+ const other = pairX.find((o) => o.id !== void 0);
175
+ if (target && other) {
176
+ // 磁铁坐标值
177
+ newPosX = newPosX - this.render.toBoardValue(target.value - other.value);
178
+ isAttract = true;
179
+ }
180
+ }
181
+ // 存在 1或多个 y 最短距离 满足阈值
182
+ if (pairY?.length === 2) {
183
+ for (const pair of pairYMin) {
184
+ // 【对】里的那个非目标节点
185
+ const other = pair.find((o) => o.id !== void 0);
186
+ if (other) {
187
+ // y 对齐线
188
+ const line = new Konva.Line({
189
+ points: [[this.render.toStageValue(-stageState.x), other.value], [this.render.toStageValue(this.render.stage.width() - stageState.x), other.value]].flat(),
190
+ stroke: 'blue',
191
+ strokeWidth: this.render.toStageValue(1),
192
+ dash: [4, 4],
193
+ listening: false
194
+ });
195
+ this.alignLines.push(line);
196
+ this.render.layerCover.add(line);
197
+ }
198
+ }
199
+ // 磁贴第一个【对】
200
+ const target = pairY.find((o) => o.id === void 0);
201
+ const other = pairY.find((o) => o.id !== void 0);
202
+ if (target && other) {
203
+ // 磁铁坐标值
204
+ newPosY = newPosY - this.render.toBoardValue(target.value - other.value);
205
+ isAttract = true;
206
+ }
207
+ }
208
+ }
209
+ if (!this.render.config.readonly && this.render.config.attractBg && showGrid) {
210
+ // 没有 x 对齐节点
211
+ if (pairX === null) {
212
+ const logicLeftX = this.render.toStageValue(newPosX - stageState.x); // x坐标
213
+ const logicNumLeftX = Math.round(logicLeftX / this.render.bgSize); // x单元格个数
214
+ const logicClosestLeftX = logicNumLeftX * this.render.bgSize; // x磁贴目标坐标
215
+ const logicDiffLeftX = Math.abs(logicLeftX - logicClosestLeftX); // x磁贴偏移量
216
+ const logicRightX = this.render.toStageValue(newPosX - stageState.x); // x坐标
217
+ const logicNumRightX = Math.round(logicRightX / this.render.bgSize); // x单元格个数
218
+ const logicClosestRightX = logicNumRightX * this.render.bgSize; // x磁贴目标坐标
219
+ const logicDiffRightX = Math.abs(logicRightX - logicClosestRightX); // x磁贴偏移量
220
+ // stage 逻辑边界磁贴
221
+ const logicStageRightX = stageState.width;
222
+ const logicDiffStageRightX = Math.abs(logicRightX - logicStageRightX);
223
+ // 距离近优先
224
+ for (const diff of [{ type: 'leftX', value: logicDiffLeftX }, { type: 'rightX', value: logicDiffRightX }, { type: 'stageRightX', value: logicDiffStageRightX }].sort((a, b) => a.value - b.value)) {
225
+ if (diff.value < 5) {
226
+ if (diff.type === 'stageRightX') {
227
+ newPosX = this.render.toBoardValue(logicStageRightX) + stageState.x;
228
+ } else if (diff.type === 'leftX') {
229
+ newPosX = this.render.toBoardValue(logicClosestLeftX) + stageState.x;
230
+ } else if (diff.type === 'rightX') {
231
+ newPosX = this.render.toBoardValue(logicClosestRightX) + stageState.x;
232
+ }
233
+ isAttract = true;
234
+ break;
235
+ }
236
+ }
237
+ }
238
+ // 没有 y 对齐节点
239
+ if (pairY === null) {
240
+ const logicTopY = this.render.toStageValue(newPosY - stageState.y); // y坐标
241
+ const logicNumTopY = Math.round(logicTopY / this.render.bgSize); // y单元格个数
242
+ const logicClosestTopY = logicNumTopY * this.render.bgSize; // y磁贴目标坐标
243
+ const logicDiffTopY = Math.abs(logicTopY - logicClosestTopY); // y磁贴偏移量
244
+ const logicBottomY = this.render.toStageValue(newPosY - stageState.y); // y坐标
245
+ const logicNumBottomY = Math.round(logicBottomY / this.render.bgSize); // y单元格个数
246
+ const logicClosestBottomY = logicNumBottomY * this.render.bgSize; // y磁贴目标坐标
247
+ const logicDiffBottomY = Math.abs(logicBottomY - logicClosestBottomY); // y磁贴偏移量
248
+ // stage 逻辑边界磁贴
249
+ const logicStageBottomY = stageState.height;
250
+ const logicDiffStageBottomY = Math.abs(logicBottomY - logicStageBottomY);
251
+ // 距离近优先
252
+ for (const diff of [{ type: 'topY', value: logicDiffTopY }, { type: 'bottomY', value: logicDiffBottomY }, { type: 'stageBottomY', value: logicDiffStageBottomY }].sort((a, b) => a.value - b.value)) {
253
+ if (diff.value < 5) {
254
+ if (diff.type === 'stageBottomY') {
255
+ newPosY = this.render.toBoardValue(logicStageBottomY) + stageState.y;
256
+ } else if (diff.type === 'topY') {
257
+ newPosY = this.render.toBoardValue(logicClosestTopY) + stageState.y;
258
+ } else if (diff.type === 'bottomY') {
259
+ newPosY = this.render.toBoardValue(logicClosestBottomY) + stageState.y;
260
+ }
261
+ isAttract = true;
262
+ break;
263
+ }
264
+ }
265
+ }
266
+ }
267
+ return { pos: { x: newPosX, y: newPosY }, isAttract };
268
+ }
269
+ // 磁吸逻辑
270
+ attractTransformer = (rect: AlignRect) => {
271
+ // 对齐线清除
272
+ this.alignLinesClear();
273
+ const stageState = this.render.getStageState();
274
+ const width = this.render.transformer.width();
275
+ const height = this.render.transformer.height();
276
+ const showGrid = this.render.showGrid; // 是否显示网格,不显示网格则不网格吸附
277
+ let newPosX = rect.x;
278
+ let newPosY = rect.y;
279
+ let isAttract = false;
280
+ let pairX: SortItemPair | null = null;
281
+ let pairY: SortItemPair | null = null;
282
+ // 对齐线 磁吸逻辑
283
+ if (!this.render.config.readonly && this.render.config.attractNode) {
284
+ // 从选中节点的真实 getClientRect 计算边界框,避免 back rect 的 padding 补偿引入亚像素偏差
285
+ const selectingNodes = this.render.selectionTool.selectingNodes;
286
+ const nodeRect = this.getSelectingNodesRect(selectingNodes) ?? rect;
287
+ const { sortX, sortY } = this.getSortItems(nodeRect, 0);
288
+ // x 最短距离
289
+ let XMin = Infinity;
290
+ // x 最短距离的【对】(多个)
291
+ let pairXMin: Array<SortItemPair> = [];
292
+ // y 最短距离
293
+ let YMin = Infinity;
294
+ // y 最短距离的【对】(多个)
295
+ let pairYMin: Array<SortItemPair> = [];
296
+ // 一对对比较距离,记录最短距离的【对】
297
+ // 必须是 选择目标 与 其他节点 成【对】
298
+ // 可能有多个这样的【对】
299
+ for (let i = 0; i < sortX.length - 1; i++) {
300
+ // 相邻两个点,必须为 目标节点 + 非目标节点
301
+ if ((sortX[i].id === void 0 && sortX[i + 1].id !== void 0) || (sortX[i].id !== void 0 && sortX[i + 1].id === void 0)) {
302
+ // 相邻两个点的 x 距离
303
+ const offset = Math.abs(sortX[i].value - sortX[i + 1].value)
304
+ if (offset < XMin) {
305
+ // 更新 x 最短距离 记录
306
+ XMin = offset;
307
+ // 更新 x 最短距离的【对】 记录
308
+ pairXMin = [[sortX[i], sortX[i + 1]]];
309
+ } else if (offset === XMin) {
310
+ // 存在多个 x 最短距离
311
+ pairXMin.push([sortX[i], sortX[i + 1]]);
312
+ }
313
+ }
314
+ }
315
+ for (let i = 0; i < sortY.length - 1; i++) {
316
+ // 相邻两个点,必须为 目标节点 + 非目标节点
317
+ if ((sortY[i].id === void 0 && sortY[i + 1].id !== void 0) || (sortY[i].id !== void 0 && sortY[i + 1].id === void 0)) {
318
+ // 相邻两个点的 y 距离
319
+ const offset = Math.abs(sortY[i].value - sortY[i + 1].value);
320
+ if (offset < YMin) {
321
+ // 更新 y 最短距离 记录
322
+ YMin = offset;
323
+ // 更新 y 最短距离的【对】 记录
324
+ pairYMin = [[sortY[i], sortY[i + 1]]];
325
+ } else if (offset === YMin) {
326
+ // 存在多个 y 最短距离
327
+ pairYMin.push([sortY[i], sortY[i + 1]]);
328
+ }
329
+ }
330
+ }
331
+ // 取第一【对】,用于判断距离是否在阈值内
332
+ if (pairXMin[0]) {
333
+ if (Math.abs(pairXMin[0][0].value - pairXMin[0][1].value) < this.render.bgSize / 2) {
334
+ pairX = pairXMin[0];
335
+ }
336
+ }
337
+ if (pairYMin[0]) {
338
+ if (Math.abs(pairYMin[0][0].value - pairYMin[0][1].value) < this.render.bgSize / 2) {
339
+ pairY = pairYMin[0];
340
+ }
341
+ }
342
+ // 优先对齐节点
343
+ // 存在 1或多个 x 最短距离 满足阈值
344
+ if (pairX?.length === 2) {
345
+ for (const pair of pairXMin) {
346
+ // 【对】里的那个非目标节点
347
+ const other = pair.find((o) => o.id !== void 0);
348
+ if (other) {
349
+ // x 对齐线
350
+ const line = new Konva.Line({
351
+ points: [[other.value, this.render.toStageValue(-stageState.y)], [other.value, this.render.toStageValue(this.render.stage.height() - stageState.y)]].flat(),
352
+ stroke: 'blue',
353
+ strokeWidth: this.render.toStageValue(1),
354
+ dash: [4, 4],
355
+ listening: false
356
+ });
357
+ this.alignLines.push(line);
358
+ this.render.layerCover.add(line);
359
+ }
360
+ }
361
+ // 磁贴第一个【对】
362
+ const target = pairX.find((o) => o.id === void 0);
363
+ const other = pairX.find((o) => o.id !== void 0);
364
+ if (target && other) {
365
+ // 磁贴坐标值
366
+ newPosX = newPosX - this.render.toBoardValue(target.value - other.value);
367
+ isAttract = true;
368
+ }
369
+ }
370
+ // 存在 1或多个 y 最短距离 满足阈值
371
+ if (pairY?.length === 2) {
372
+ for (const pair of pairYMin) {
373
+ // 【对】里的那个非目标节点
374
+ const other = pair.find((o) => o.id !== void 0);
375
+ if (other) {
376
+ // y 对齐线
377
+ const line = new Konva.Line({
378
+ points: [[this.render.toStageValue(-stageState.x), other.value], [this.render.toStageValue(this.render.stage.width() - stageState.x), other.value]].flat(),
379
+ stroke: 'blue',
380
+ strokeWidth: this.render.toStageValue(1),
381
+ dash: [4, 4],
382
+ listening: false
383
+ });
384
+ this.alignLines.push(line);
385
+ this.render.layerCover.add(line);
386
+ }
387
+ }
388
+ // 磁贴第一个【对】
389
+ const target = pairY.find((o) => o.id === void 0);
390
+ const other = pairY.find((o) => o.id !== void 0);
391
+ if (target && other) {
392
+ // 磁贴坐标值
393
+ newPosY = newPosY - this.render.toBoardValue(target.value - other.value);
394
+ isAttract = true;
395
+ }
396
+ }
397
+ }
398
+ if (!this.render.config.readonly && this.render.config.attractBg && showGrid) { // 显示网格则执行网格磁吸
399
+ // 没有 x 对齐节点
400
+ if (pairX === null) {
401
+ const logicLeftX = this.render.toStageValue(newPosX - stageState.x); // x坐标
402
+ const logicNumLeftX = Math.round(logicLeftX / this.render.bgSize); // x单元格个数
403
+ const logicClosestLeftX = logicNumLeftX * this.render.bgSize; // x磁贴目标坐标
404
+ const logicDiffLeftX = Math.abs(logicLeftX - logicClosestLeftX); // x磁贴偏移量
405
+ const logicRightX = this.render.toStageValue(newPosX + width - stageState.x); // x坐标
406
+ const logicNumRightX = Math.round(logicRightX / this.render.bgSize); // x单元格个数
407
+ const logicClosestRightX = logicNumRightX * this.render.bgSize; // x磁贴目标坐标
408
+ const logicDiffRightX = Math.abs(logicRightX - logicClosestRightX); // x磁贴偏移量
409
+ // stage 逻辑边界磁贴
410
+ const logicStageRightX = stageState.width;
411
+ const logicDiffStageRightX = Math.abs(logicRightX - logicStageRightX);
412
+ // 距离近优先
413
+ for (const diff of [{ type: 'leftX', value: logicDiffLeftX }, { type: 'rightX', value: logicDiffRightX }, { type: 'stageRightX', value: logicDiffStageRightX }].sort((a, b) => a.value - b.value)) {
414
+ if (diff.value < 5) {
415
+ if (diff.type === 'stageRightX') {
416
+ newPosX = this.render.toBoardValue(logicStageRightX) + stageState.x - width;
417
+ } else if (diff.type === 'leftX') {
418
+ newPosX = this.render.toBoardValue(logicClosestLeftX) + stageState.x;
419
+ } else if (diff.type === 'rightX') {
420
+ newPosX = this.render.toBoardValue(logicClosestRightX) + stageState.x - width;
421
+ }
422
+ isAttract = true;
423
+ break;
424
+ }
425
+ }
426
+ }
427
+ // 没有 y 对齐节点
428
+ if (pairY === null) {
429
+ const logicTopY = this.render.toStageValue(newPosY - stageState.y); // y坐标
430
+ const logicNumTopY = Math.round(logicTopY / this.render.bgSize); // y单元格个数
431
+ const logicClosestTopY = logicNumTopY * this.render.bgSize; // y磁贴目标坐标
432
+ const logicDiffTopY = Math.abs(logicTopY - logicClosestTopY); // y磁贴偏移量
433
+ const logicBottomY = this.render.toStageValue(newPosY + height - stageState.y); // y坐标
434
+ const logicNumBottomY = Math.round(logicBottomY / this.render.bgSize); // y单元格个数
435
+ const logicClosestBottomY = logicNumBottomY * this.render.bgSize; // y磁贴目标坐标
436
+ const logicDiffBottomY = Math.abs(logicBottomY - logicClosestBottomY); // y磁贴偏移量
437
+ // stage 逻辑边界磁贴
438
+ const logicStageBottomY = stageState.height;
439
+ const logicDiffStageBottomY = Math.abs(logicBottomY - logicStageBottomY);
440
+ // 距离近优先
441
+ for (const diff of [{ type: 'topY', value: logicDiffTopY }, { type: 'bottomY', value: logicDiffBottomY }, { type: 'stageBottomY', value: logicDiffStageBottomY }].sort((a, b) => a.value - b.value)) {
442
+ if (diff.value < 5) {
443
+ if (diff.type === 'stageBottomY') {
444
+ newPosY = this.render.toBoardValue(logicStageBottomY) + stageState.y - height;
445
+ } else if (diff.type === 'topY') {
446
+ newPosY = this.render.toBoardValue(logicClosestTopY) + stageState.y;
447
+ } else if (diff.type === 'bottomY') {
448
+ newPosY = this.render.toBoardValue(logicClosestBottomY) + stageState.y - height;
449
+ }
450
+ isAttract = true;
451
+ break;
452
+ }
453
+ }
454
+ }
455
+ }
456
+ return { pos: { x: newPosX, y: newPosY }, isAttract };
457
+ }
458
458
  }