aldehyde 0.2.480 → 0.2.482

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 (662) 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/direct-file-view/index.d.ts.map +1 -1
  14. package/lib/controls/direct-file-view/index.js +4 -4
  15. package/lib/controls/direct-file-view/index.js.map +1 -1
  16. package/lib/controls/direct-upload/index.d.ts.map +1 -1
  17. package/lib/controls/direct-upload/index.js +3 -3
  18. package/lib/controls/direct-upload/index.js.map +1 -1
  19. package/lib/controls/entity-select/entity-select.d.ts.map +1 -1
  20. package/lib/controls/entity-select/index.css +7 -7
  21. package/lib/controls/entity-select/lab-tree-select.d.ts.map +1 -1
  22. package/lib/controls/entity-select/popover-entity-select.d.ts.map +1 -1
  23. package/lib/controls/entry-control.d.ts +2 -1
  24. package/lib/controls/entry-control.d.ts.map +1 -1
  25. package/lib/controls/entry-control.js +10 -0
  26. package/lib/controls/entry-control.js.map +1 -1
  27. package/lib/controls/file-view/index.less +9 -9
  28. package/lib/controls/html-editor/index.less +67 -67
  29. package/lib/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.css +147 -147
  30. package/lib/controls/password-setter/index.css +2 -2
  31. package/lib/controls/password-setter/index.d.ts.map +1 -1
  32. package/lib/controls/qr-code/index.less +28 -28
  33. package/lib/controls/relation-existion/index.css +3 -3
  34. package/lib/controls/relation-existion/index.d.ts.map +1 -1
  35. package/lib/controls/rfield/index.css +4 -4
  36. package/lib/controls/rfield/index.d.ts.map +1 -1
  37. package/lib/controls/select/index.d.ts +8 -2
  38. package/lib/controls/select/index.d.ts.map +1 -1
  39. package/lib/controls/select/index.js +35 -13
  40. package/lib/controls/select/index.js.map +1 -1
  41. package/lib/controls/signature/index.d.ts.map +1 -1
  42. package/lib/controls/text/ellipsis-text.d.ts.map +1 -1
  43. package/lib/controls/text/index.less +7 -7
  44. package/lib/controls/upload/index.d.ts.map +1 -1
  45. package/lib/controls/upload/mult-file-upload.d.ts.map +1 -1
  46. package/lib/controls/upload-read-excel/index.d.ts +10 -0
  47. package/lib/controls/upload-read-excel/index.d.ts.map +1 -0
  48. package/lib/controls/upload-read-excel/index.js +30 -0
  49. package/lib/controls/upload-read-excel/index.js.map +1 -0
  50. package/lib/custom-page/dtmpl-custom-edit-modal-page.d.ts.map +1 -1
  51. package/lib/detail/button/bottom-submit-button-bar.d.ts.map +1 -1
  52. package/lib/detail/button/cquery-button-bar.d.ts.map +1 -1
  53. package/lib/detail/button/fix-right-submit-button-bar.d.ts.map +1 -1
  54. package/lib/detail/button/index.css +42 -42
  55. package/lib/detail/dtmpl.css +72 -67
  56. package/lib/detail/edit/fields-edit-card.d.ts.map +1 -1
  57. package/lib/detail/edit/modal-row-edit.d.ts.map +1 -1
  58. package/lib/detail/edit/popover-edit-card.d.ts.map +1 -1
  59. package/lib/detail/rightbar/index.css +34 -34
  60. package/lib/detail/rightbar/index.d.ts.map +1 -1
  61. package/lib/detail/view/act-dtmpl-view.d.ts.map +1 -1
  62. package/lib/detail/view/dtmpl-view.d.ts.map +1 -1
  63. package/lib/detail/view/dtmpl-view.js +12 -2
  64. package/lib/detail/view/dtmpl-view.js.map +1 -1
  65. package/lib/detail/view/field-view-group.d.ts.map +1 -1
  66. package/lib/detail/view/modal-dtmpl-view.d.ts.map +1 -1
  67. package/lib/detail/view/snapshot-timeline.d.ts.map +1 -1
  68. package/lib/detail/view/tab-act-dtmpl-view.d.ts.map +1 -1
  69. package/lib/draw-canvas-edit/components/asset-bar/index.less +2 -2
  70. package/lib/draw-canvas-edit/components/main-header/index.d.ts.map +1 -1
  71. package/lib/draw-canvas-edit/components/main-header/index.js +32 -2
  72. package/lib/draw-canvas-edit/components/main-header/index.js.map +1 -1
  73. package/lib/draw-canvas-edit/components/render/components/index.d.ts +3 -0
  74. package/lib/draw-canvas-edit/components/render/components/index.d.ts.map +1 -0
  75. package/lib/draw-canvas-edit/components/render/components/index.js +3 -0
  76. package/lib/draw-canvas-edit/components/render/components/index.js.map +1 -0
  77. package/lib/draw-canvas-edit/components/render/components/index.less +61 -0
  78. package/lib/draw-canvas-edit/components/render/components/workstation-component.d.ts +38 -0
  79. package/lib/draw-canvas-edit/components/render/components/workstation-component.d.ts.map +1 -0
  80. package/lib/draw-canvas-edit/components/render/components/workstation-component.js +212 -0
  81. package/lib/draw-canvas-edit/components/render/components/workstation-component.js.map +1 -0
  82. package/lib/draw-canvas-edit/components/render/handlers/selection-handlers.d.ts.map +1 -1
  83. package/lib/draw-canvas-edit/components/render/handlers/selection-handlers.js +19 -5
  84. package/lib/draw-canvas-edit/components/render/handlers/selection-handlers.js.map +1 -1
  85. package/lib/draw-canvas-edit/components/render/index.d.ts.map +1 -1
  86. package/lib/draw-canvas-edit/components/render/index.js +15 -4
  87. package/lib/draw-canvas-edit/components/render/index.js.map +1 -1
  88. package/lib/draw-canvas-edit/components/render/tools/asset-tool.d.ts +2 -0
  89. package/lib/draw-canvas-edit/components/render/tools/asset-tool.d.ts.map +1 -1
  90. package/lib/draw-canvas-edit/components/render/tools/asset-tool.js +22 -11
  91. package/lib/draw-canvas-edit/components/render/tools/asset-tool.js.map +1 -1
  92. package/lib/draw-canvas-edit/components/render/tools/component-factory.d.ts +2 -0
  93. package/lib/draw-canvas-edit/components/render/tools/component-factory.d.ts.map +1 -1
  94. package/lib/draw-canvas-edit/components/render/tools/component-factory.js +10 -42
  95. package/lib/draw-canvas-edit/components/render/tools/component-factory.js.map +1 -1
  96. package/lib/draw-canvas-edit/components/render/tools/import-export-tool.d.ts +1 -0
  97. package/lib/draw-canvas-edit/components/render/tools/import-export-tool.d.ts.map +1 -1
  98. package/lib/draw-canvas-edit/components/render/tools/import-export-tool.js +35 -22
  99. package/lib/draw-canvas-edit/components/render/tools/import-export-tool.js.map +1 -1
  100. package/lib/draw-canvas-edit/components/render/types.d.ts +6 -0
  101. package/lib/draw-canvas-edit/components/render/types.d.ts.map +1 -1
  102. package/lib/draw-canvas-edit/components/render/types.js.map +1 -1
  103. package/lib/draw-canvas-edit/components/setting-form/index.d.ts.map +1 -1
  104. package/lib/draw-canvas-edit/components/setting-form/index.js +10 -0
  105. package/lib/draw-canvas-edit/components/setting-form/index.js.map +1 -1
  106. package/lib/draw-canvas-edit/index.d.ts.map +1 -1
  107. package/lib/draw-canvas-edit/index.js +5 -2
  108. package/lib/draw-canvas-edit/index.js.map +1 -1
  109. package/lib/draw-canvas-edit/index.less +48 -48
  110. package/lib/draw-canvas-view/index.less +66 -59
  111. package/lib/draw-canvas-view/view.d.ts.map +1 -1
  112. package/lib/draw-canvas-view/view.js +19 -11
  113. package/lib/draw-canvas-view/view.js.map +1 -1
  114. package/lib/export/export-frame.css +2 -2
  115. package/lib/export/export-frame.d.ts.map +1 -1
  116. package/lib/export/select-code-export-frame.d.ts.map +1 -1
  117. package/lib/form/dtmpl-form.css +3 -3
  118. package/lib/form/dtmpl-form.d.ts.map +1 -1
  119. package/lib/form/dtmpl-form.js +12 -3
  120. package/lib/form/dtmpl-form.js.map +1 -1
  121. package/lib/form/field-group-form.d.ts.map +1 -1
  122. package/lib/form/field-group-form.js +1 -1
  123. package/lib/form/field-group-form.js.map +1 -1
  124. package/lib/form/form-Item-group.d.ts +2 -1
  125. package/lib/form/form-Item-group.d.ts.map +1 -1
  126. package/lib/form/form-Item-group.js +2 -2
  127. package/lib/form/form-Item-group.js.map +1 -1
  128. package/lib/form/index.css +12 -12
  129. package/lib/import/excel-import.d.ts.map +1 -1
  130. package/lib/import/index.css +53 -53
  131. package/lib/import/template.css +50 -50
  132. package/lib/layout/common.css +64 -64
  133. package/lib/layout/coverstyle.css +51 -51
  134. package/lib/layout/footer/index.css +5 -5
  135. package/lib/layout/header/index.css +122 -122
  136. package/lib/layout/menu/block.css +7 -7
  137. package/lib/layout/menu/block.d.ts.map +1 -1
  138. package/lib/layout/menu/l2menu-quick-bar.d.ts.map +1 -1
  139. package/lib/layout/menu/menu-2layers.d.ts.map +1 -1
  140. package/lib/layout/menu/message-bar.less +73 -73
  141. package/lib/layout/menu/reset-password.d.ts.map +1 -1
  142. package/lib/layout/menu/user-bar.d.ts.map +1 -1
  143. package/lib/layout/menu/userinfo-bar.d.ts.map +1 -1
  144. package/lib/layout/sidebar/index.css +57 -57
  145. package/lib/layout2/css/header.css +41 -41
  146. package/lib/layout2/css/sider.less +17 -17
  147. package/lib/layout2/css/tabs-layout.less +18 -18
  148. package/lib/layout3/css/header.less +195 -195
  149. package/lib/layout3/css/main.less +161 -161
  150. package/lib/layout3/css/sider.less +32 -32
  151. package/lib/layout3/css/tabs-layout.less +38 -38
  152. package/lib/layout4/css/header.less +196 -196
  153. package/lib/layout4/css/main.less +154 -154
  154. package/lib/layout4/css/sider.less +37 -37
  155. package/lib/layout4/css/tabs-layout.less +42 -42
  156. package/lib/layout5/css/header.less +35 -35
  157. package/lib/layout5/css/sider.less +18 -18
  158. package/lib/list/calendar/index.less +20 -20
  159. package/lib/list/card-list/card-list-item.d.ts.map +1 -1
  160. package/lib/list/card-list/card-list-item.js +3 -2
  161. package/lib/list/card-list/card-list-item.js.map +1 -1
  162. package/lib/list/card-list/index.less +154 -154
  163. package/lib/list/gantt/index.less +8 -8
  164. package/lib/list/vertical-list/index.less +208 -208
  165. package/lib/login/index.css +19 -19
  166. package/lib/login/login.d.ts.map +1 -1
  167. package/lib/login/vertify/index.css +143 -143
  168. package/lib/login3/index.less +136 -136
  169. package/lib/lowcode-components/act-table/index.less +26 -26
  170. package/lib/lowcode-components/base-button/index.less +7 -7
  171. package/lib/lowcode-components/base-map/index.js +6 -6
  172. package/lib/lowcode-components/base-radio/index.less +23 -23
  173. package/lib/lowcode-components/base-tabs/index.less +14 -14
  174. package/lib/lowcode-components/border/border10/index.less +26 -26
  175. package/lib/lowcode-components/border/border11/index.js +46 -46
  176. package/lib/lowcode-components/border/border11/index.less +17 -17
  177. package/lib/lowcode-components/border/border12/index.js +13 -13
  178. package/lib/lowcode-components/border/border12/index.less +13 -13
  179. package/lib/lowcode-components/border/border13/index.js +5 -5
  180. package/lib/lowcode-components/border/border13/index.less +13 -13
  181. package/lib/lowcode-components/border/border2/index.less +17 -17
  182. package/lib/lowcode-components/border/border3/index.less +25 -25
  183. package/lib/lowcode-components/border/border4/index.js +2 -2
  184. package/lib/lowcode-components/border/border4/index.less +72 -72
  185. package/lib/lowcode-components/border/border5/index.js +2 -2
  186. package/lib/lowcode-components/border/border5/index.less +35 -35
  187. package/lib/lowcode-components/border/border6/index.less +17 -17
  188. package/lib/lowcode-components/border/border7/index.less +26 -26
  189. package/lib/lowcode-components/border/border8/index.less +13 -13
  190. package/lib/lowcode-components/border/border9/index.js +14 -14
  191. package/lib/lowcode-components/border/border9/index.less +13 -13
  192. package/lib/lowcode-components/carousel/index.js +3 -3
  193. package/lib/lowcode-components/carousel/index.js.map +1 -1
  194. package/lib/lowcode-components/decoration/decoration1/index.less +7 -7
  195. package/lib/lowcode-components/decoration/decoration10/index.js +3 -3
  196. package/lib/lowcode-components/decoration/decoration10/index.less +5 -5
  197. package/lib/lowcode-components/decoration/decoration11/index.less +5 -5
  198. package/lib/lowcode-components/decoration/decoration2/index.less +6 -6
  199. package/lib/lowcode-components/decoration/decoration3/index.less +7 -7
  200. package/lib/lowcode-components/decoration/decoration4/index.less +29 -29
  201. package/lib/lowcode-components/decoration/decoration5/index.less +3 -3
  202. package/lib/lowcode-components/decoration/decoration6/index.less +7 -7
  203. package/lib/lowcode-components/decoration/decoration7/index.less +4 -4
  204. package/lib/lowcode-components/decoration/decoration8/index.less +14 -14
  205. package/lib/lowcode-components/decoration/decoration9/index.less +4 -4
  206. package/lib/lowcode-components/effectScatter-map/index.js +6 -6
  207. package/lib/lowcode-components/effectScatter-map-3d/index.js +6 -6
  208. package/lib/lowcode-components/lowcode-view/index.less +19 -19
  209. package/lib/lowcode-components/search-form/index.less +25 -25
  210. package/lib/module/dtmpl-edit-card.d.ts.map +1 -1
  211. package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
  212. package/lib/module/index.less +4 -4
  213. package/lib/module/ltmpl-modal.d.ts.map +1 -1
  214. package/lib/module/ltmpl-table.d.ts +1 -0
  215. package/lib/module/ltmpl-table.d.ts.map +1 -1
  216. package/lib/module/ltmpl-table.js +2 -2
  217. package/lib/module/ltmpl-table.js.map +1 -1
  218. package/lib/routable/index.less +25 -25
  219. package/lib/table/act-table.d.ts.map +1 -1
  220. package/lib/table/act-table.js +21 -20
  221. package/lib/table/act-table.js.map +1 -1
  222. package/lib/table/column/column-builder.d.ts.map +1 -1
  223. package/lib/table/column/column-builder.js +16 -15
  224. package/lib/table/column/column-builder.js.map +1 -1
  225. package/lib/table/column/index.less +85 -63
  226. package/lib/table/index.css +211 -211
  227. package/lib/table/modal-select-table.d.ts.map +1 -1
  228. package/lib/table/pagination.css +14 -14
  229. package/lib/table/pagination.d.ts.map +1 -1
  230. package/lib/table/query-table.js +2 -1
  231. package/lib/table/query-table.js.map +1 -1
  232. package/lib/table/relation-table.d.ts +1 -1
  233. package/lib/table/relation-table.d.ts.map +1 -1
  234. package/lib/table/relation-table.js +5 -24
  235. package/lib/table/relation-table.js.map +1 -1
  236. package/lib/table/select-table.d.ts.map +1 -1
  237. package/lib/table/select-table.js +14 -2
  238. package/lib/table/select-table.js.map +1 -1
  239. package/lib/table/selected-rows-card.d.ts.map +1 -1
  240. package/lib/table/stat/restat.d.ts.map +1 -1
  241. package/lib/tmpl/hc-data-source.d.ts +1 -0
  242. package/lib/tmpl/hc-data-source.d.ts.map +1 -1
  243. package/lib/tmpl/hc-data-source.js +9 -0
  244. package/lib/tmpl/hc-data-source.js.map +1 -1
  245. package/lib/tmpl/interface.d.ts +5 -0
  246. package/lib/tmpl/interface.d.ts.map +1 -1
  247. package/lib/tmpl/interface.js.map +1 -1
  248. package/lib/tree/act-tree.d.ts.map +1 -1
  249. package/lib/tree/block-menu-auth-tree.d.ts.map +1 -1
  250. package/lib/tree/index.css +22 -22
  251. package/lib/tree/tmpl-tree.d.ts.map +1 -1
  252. package/lib/welcome/components/menu-card.less +96 -96
  253. package/lib/welcome/components/page-card.less +49 -49
  254. package/lib/welcome/components/quick-entrance.less +120 -120
  255. package/lib/welcome/components/user-menus.less +192 -192
  256. package/lib/welcome/components/workbench.less +118 -118
  257. package/lib/welcome/index.css +13 -13
  258. package/package.json +224 -223
  259. package/src/aldehyde/controls/2dEditor/2dEditor/index.less +5 -5
  260. package/src/aldehyde/controls/2dEditor/2dEditor/index.tsx +270 -270
  261. package/src/aldehyde/controls/2dEditor/2dView/index.less +8 -8
  262. package/src/aldehyde/controls/2dEditor/2dView/index.tsx +110 -110
  263. package/src/aldehyde/controls/2dEditor/components/card.tsx +256 -256
  264. package/src/aldehyde/controls/2dEditor/components/component.less +83 -83
  265. package/src/aldehyde/controls/2dEditor/components/data.d.ts +32 -32
  266. package/src/aldehyde/controls/2dEditor/components/hotspot.tsx +80 -80
  267. package/src/aldehyde/controls/2dEditor/components/html-box.tsx +101 -101
  268. package/src/aldehyde/controls/2dEditor/components/image.tsx +99 -99
  269. package/src/aldehyde/controls/2dEditor/components/line.tsx +73 -73
  270. package/src/aldehyde/controls/action/index.css +8 -8
  271. package/src/aldehyde/controls/action/index.tsx +406 -406
  272. package/src/aldehyde/controls/action/utils.tsx +306 -306
  273. package/src/aldehyde/controls/auto-complete/index.tsx +82 -82
  274. package/src/aldehyde/controls/cascader/index.tsx +112 -112
  275. package/src/aldehyde/controls/chemstruc/graph.tsx +185 -185
  276. package/src/aldehyde/controls/chemstruc/index.css +28 -28
  277. package/src/aldehyde/controls/code-editor/sql-code-editor.tsx +73 -73
  278. package/src/aldehyde/controls/collapse-card/index.css +8 -8
  279. package/src/aldehyde/controls/collapse-card/index.tsx +109 -109
  280. package/src/aldehyde/controls/color-picker/index.tsx +21 -21
  281. package/src/aldehyde/controls/counting-tag/index.tsx +53 -53
  282. package/src/aldehyde/controls/cquery/cquick-button.tsx +145 -145
  283. package/src/aldehyde/controls/date-picker/index.tsx +199 -199
  284. package/src/aldehyde/controls/direct-file-view/drawer-file-view.tsx +54 -54
  285. package/src/aldehyde/controls/direct-file-view/index.tsx +146 -145
  286. package/src/aldehyde/controls/direct-upload/index.tsx +140 -139
  287. package/src/aldehyde/controls/entity-select/entity-select.tsx +791 -791
  288. package/src/aldehyde/controls/entity-select/index.css +7 -7
  289. package/src/aldehyde/controls/entity-select/lab-tree-select.tsx +154 -154
  290. package/src/aldehyde/controls/entity-select/popover-entity-select.tsx +205 -205
  291. package/src/aldehyde/controls/entry-control.tsx +428 -418
  292. package/src/aldehyde/controls/enum-badge/index.tsx +42 -42
  293. package/src/aldehyde/controls/enum-tag/index.tsx +45 -45
  294. package/src/aldehyde/controls/field-history/index.tsx +81 -81
  295. package/src/aldehyde/controls/file-export/select-code-export.tsx +40 -40
  296. package/src/aldehyde/controls/file-view/drawer-file-view.tsx +117 -117
  297. package/src/aldehyde/controls/file-view/index.less +9 -9
  298. package/src/aldehyde/controls/file-view/index.tsx +148 -148
  299. package/src/aldehyde/controls/file-view/multi-file-view.tsx +39 -39
  300. package/src/aldehyde/controls/file-view/newin-file-view.tsx +40 -40
  301. package/src/aldehyde/controls/html-editor/draft.tsx +136 -136
  302. package/src/aldehyde/controls/html-editor/index.less +67 -67
  303. package/src/aldehyde/controls/icon-selector/app-icon-selector.tsx +68 -68
  304. package/src/aldehyde/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.css +147 -147
  305. package/src/aldehyde/controls/icon-selector/icon/aldehyde-menu-icon/iconfont.json +240 -240
  306. package/src/aldehyde/controls/icon-selector/pc-icon-selector.tsx +68 -68
  307. package/src/aldehyde/controls/input-number/index.tsx +148 -148
  308. package/src/aldehyde/controls/input-range/index.tsx +59 -59
  309. package/src/aldehyde/controls/password-setter/index.css +2 -2
  310. package/src/aldehyde/controls/password-setter/index.js +88 -88
  311. package/src/aldehyde/controls/progress/index.tsx +74 -74
  312. package/src/aldehyde/controls/qr-code/index.less +28 -28
  313. package/src/aldehyde/controls/qr-code/index.tsx +40 -40
  314. package/src/aldehyde/controls/relation-existion/index.css +3 -3
  315. package/src/aldehyde/controls/relation-existion/index.tsx +144 -144
  316. package/src/aldehyde/controls/rfield/index.css +4 -4
  317. package/src/aldehyde/controls/rfield/index.tsx +225 -225
  318. package/src/aldehyde/controls/select/index.tsx +227 -216
  319. package/src/aldehyde/controls/signature/index.tsx +226 -226
  320. package/src/aldehyde/controls/single-checkbox/index.tsx +18 -18
  321. package/src/aldehyde/controls/steps/index.tsx +59 -59
  322. package/src/aldehyde/controls/text/ellipsis-text.tsx +98 -98
  323. package/src/aldehyde/controls/text/index.less +7 -7
  324. package/src/aldehyde/controls/tree-select/navigation-tree.tsx +122 -122
  325. package/src/aldehyde/controls/tree-select/tree-entity-select.tsx +121 -121
  326. package/src/aldehyde/controls/upload/index.tsx +128 -128
  327. package/src/aldehyde/controls/upload/mult-file-upload.tsx +240 -240
  328. package/src/aldehyde/controls/upload-read-excel/index.tsx +44 -0
  329. package/src/aldehyde/controls/view-control.tsx +289 -289
  330. package/src/aldehyde/custom-page/custom-detail-modal-page.tsx +69 -69
  331. package/src/aldehyde/custom-page/custom-page-router.tsx +64 -64
  332. package/src/aldehyde/custom-page/def-custom-page.tsx +17 -17
  333. package/src/aldehyde/custom-page/dtmpl-custom-edit-modal-page.tsx +88 -88
  334. package/src/aldehyde/detail/button/bottom-submit-button-bar.tsx +91 -91
  335. package/src/aldehyde/detail/button/cquery-button-bar.tsx +144 -144
  336. package/src/aldehyde/detail/button/edit-button.tsx +61 -61
  337. package/src/aldehyde/detail/button/fix-right-submit-button-bar.tsx +186 -186
  338. package/src/aldehyde/detail/button/index.css +42 -42
  339. package/src/aldehyde/detail/button/inline-edit-button.tsx +40 -40
  340. package/src/aldehyde/detail/button/submit-button-bar.tsx +57 -57
  341. package/src/aldehyde/detail/button/view-button.tsx +64 -64
  342. package/src/aldehyde/detail/dtmpl.css +72 -67
  343. package/src/aldehyde/detail/edit/dtmpl-edit.tsx +279 -279
  344. package/src/aldehyde/detail/edit/fields-edit-card.tsx +145 -145
  345. package/src/aldehyde/detail/edit/modal-row-edit.tsx +95 -95
  346. package/src/aldehyde/detail/edit/popover-edit-card.tsx +167 -167
  347. package/src/aldehyde/detail/edit/popover-editor.tsx +70 -70
  348. package/src/aldehyde/detail/edit/post-result/index.tsx +86 -86
  349. package/src/aldehyde/detail/rightbar/index.css +34 -34
  350. package/src/aldehyde/detail/rightbar/index.tsx +92 -92
  351. package/src/aldehyde/detail/tooltipbar/index.tsx +32 -32
  352. package/src/aldehyde/detail/view/act-dtmpl-view.tsx +288 -288
  353. package/src/aldehyde/detail/view/dtmpl-view.tsx +334 -314
  354. package/src/aldehyde/detail/view/field-view-group.tsx +88 -88
  355. package/src/aldehyde/detail/view/modal-dtmpl-view.tsx +73 -73
  356. package/src/aldehyde/detail/view/snapshot-timeline.tsx +231 -231
  357. package/src/aldehyde/detail/view/tab-act-dtmpl-view.tsx +304 -304
  358. package/src/aldehyde/detail/view/view-compare-panel.tsx +57 -57
  359. package/src/aldehyde/draw-canvas-edit/components/asset-bar/index.less +2 -2
  360. package/src/aldehyde/draw-canvas-edit/components/main-header/index.tsx +33 -2
  361. package/src/aldehyde/draw-canvas-edit/components/render/components/index.less +61 -0
  362. package/src/aldehyde/draw-canvas-edit/components/render/components/index.ts +3 -0
  363. package/src/aldehyde/draw-canvas-edit/components/render/components/workstation-component.tsx +220 -0
  364. package/src/aldehyde/draw-canvas-edit/components/render/draws/bg-draw.ts +176 -176
  365. package/src/aldehyde/draw-canvas-edit/components/render/draws/contextmenu-draw.ts +329 -329
  366. package/src/aldehyde/draw-canvas-edit/components/render/graphs/bezier.ts +542 -542
  367. package/src/aldehyde/draw-canvas-edit/components/render/handlers/drag-outside-handlers.ts +72 -72
  368. package/src/aldehyde/draw-canvas-edit/components/render/handlers/selection-handlers.ts +408 -396
  369. package/src/aldehyde/draw-canvas-edit/components/render/index.ts +821 -808
  370. package/src/aldehyde/draw-canvas-edit/components/render/tools/asset-tool.ts +21 -7
  371. package/src/aldehyde/draw-canvas-edit/components/render/tools/attract-tool.ts +457 -457
  372. package/src/aldehyde/draw-canvas-edit/components/render/tools/component-factory.ts +270 -302
  373. package/src/aldehyde/draw-canvas-edit/components/render/tools/copy-tool.ts +244 -244
  374. package/src/aldehyde/draw-canvas-edit/components/render/tools/import-export-tool.ts +588 -576
  375. package/src/aldehyde/draw-canvas-edit/components/render/tools/index.ts +10 -10
  376. package/src/aldehyde/draw-canvas-edit/components/render/tools/position-tool.ts +191 -191
  377. package/src/aldehyde/draw-canvas-edit/components/render/tools/selection-tool.ts +140 -140
  378. package/src/aldehyde/draw-canvas-edit/components/render/types.ts +297 -291
  379. package/src/aldehyde/draw-canvas-edit/components/setting-form/index.tsx +303 -291
  380. package/src/aldehyde/draw-canvas-edit/constant.ts +5 -5
  381. package/src/aldehyde/draw-canvas-edit/index.less +48 -48
  382. package/src/aldehyde/draw-canvas-edit/index.tsx +204 -201
  383. package/src/aldehyde/draw-canvas-view/index.less +66 -59
  384. package/src/aldehyde/draw-canvas-view/index.tsx +49 -49
  385. package/src/aldehyde/draw-canvas-view/view.tsx +20 -11
  386. package/src/aldehyde/export/export-frame.css +2 -2
  387. package/src/aldehyde/export/export-frame.tsx +301 -301
  388. package/src/aldehyde/export/select-code-export-frame.tsx +212 -212
  389. package/src/aldehyde/form/criteria-form.tsx +604 -604
  390. package/src/aldehyde/form/dtmpl-form.css +3 -3
  391. package/src/aldehyde/form/dtmpl-form.tsx +571 -552
  392. package/src/aldehyde/form/field-group-form.tsx +103 -102
  393. package/src/aldehyde/form/fields-form.tsx +45 -45
  394. package/src/aldehyde/form/form-Item-group.tsx +246 -245
  395. package/src/aldehyde/form/index.css +12 -12
  396. package/src/aldehyde/hooks/use-match-route/index.tsx +62 -62
  397. package/src/aldehyde/hooks/use-tabs/index.tsx +139 -139
  398. package/src/aldehyde/hooks/useVarCssColor.ts +6 -6
  399. package/src/aldehyde/icon/aliIcon.tsx +9 -9
  400. package/src/aldehyde/icon/index.tsx +28 -28
  401. package/src/aldehyde/import/excel-import.tsx +450 -450
  402. package/src/aldehyde/import/index.css +53 -53
  403. package/src/aldehyde/import/template.css +50 -50
  404. package/src/aldehyde/index.tsx +220 -220
  405. package/src/aldehyde/layout/MainPage.tsx +334 -334
  406. package/src/aldehyde/layout/common.css +64 -64
  407. package/src/aldehyde/layout/coverstyle.css +51 -51
  408. package/src/aldehyde/layout/footer/index.css +5 -5
  409. package/src/aldehyde/layout/footer/index.js +17 -17
  410. package/src/aldehyde/layout/header/index.css +122 -122
  411. package/src/aldehyde/layout/header/index.tsx +152 -152
  412. package/src/aldehyde/layout/menu/block.css +7 -7
  413. package/src/aldehyde/layout/menu/block.tsx +174 -174
  414. package/src/aldehyde/layout/menu/l2menu-message-bar.tsx +160 -160
  415. package/src/aldehyde/layout/menu/l2menu-quick-bar.tsx +175 -175
  416. package/src/aldehyde/layout/menu/menu-2layers.tsx +117 -117
  417. package/src/aldehyde/layout/menu/menu-render.tsx +168 -168
  418. package/src/aldehyde/layout/menu/message-bar.less +73 -73
  419. package/src/aldehyde/layout/menu/reset-password.tsx +255 -255
  420. package/src/aldehyde/layout/menu/user-bar.tsx +259 -259
  421. package/src/aldehyde/layout/menu/userinfo-bar.tsx +69 -69
  422. package/src/aldehyde/layout/sidebar/index.css +57 -57
  423. package/src/aldehyde/layout/sidebar/index.tsx +84 -84
  424. package/src/aldehyde/layout2/components/icon-font.tsx +7 -7
  425. package/src/aldehyde/layout2/components/screenfull-button.tsx +21 -21
  426. package/src/aldehyde/layout2/components/search-menu.tsx +85 -85
  427. package/src/aldehyde/layout2/components/system-messages.tsx +75 -75
  428. package/src/aldehyde/layout2/components/theme-button.tsx +65 -65
  429. package/src/aldehyde/layout2/components/user-button.tsx +258 -258
  430. package/src/aldehyde/layout2/components/user-notification.tsx +74 -74
  431. package/src/aldehyde/layout2/css/header.css +41 -41
  432. package/src/aldehyde/layout2/css/sider.less +17 -17
  433. package/src/aldehyde/layout2/css/tabs-layout.less +18 -18
  434. package/src/aldehyde/layout2/header.tsx +278 -278
  435. package/src/aldehyde/layout2/layout-context.tsx +95 -95
  436. package/src/aldehyde/layout2/main.tsx +30 -30
  437. package/src/aldehyde/layout2/page.tsx +315 -315
  438. package/src/aldehyde/layout2/sider.tsx +230 -230
  439. package/src/aldehyde/layout2/tabs/tabs-context.tsx +37 -37
  440. package/src/aldehyde/layout2/tabs/tabs-layout.tsx +146 -146
  441. package/src/aldehyde/layout2/type/layout-type.ts +15 -15
  442. package/src/aldehyde/layout2/util/menu-util.tsx +125 -125
  443. package/src/aldehyde/layout3/components/tabs-layout.tsx +110 -110
  444. package/src/aldehyde/layout3/components/time.tsx +25 -25
  445. package/src/aldehyde/layout3/css/header.less +195 -195
  446. package/src/aldehyde/layout3/css/main.less +161 -161
  447. package/src/aldehyde/layout3/css/sider.less +32 -32
  448. package/src/aldehyde/layout3/css/tabs-layout.less +38 -38
  449. package/src/aldehyde/layout3/header.tsx +187 -187
  450. package/src/aldehyde/layout3/main.tsx +29 -29
  451. package/src/aldehyde/layout3/page.tsx +110 -110
  452. package/src/aldehyde/layout3/sider.tsx +198 -198
  453. package/src/aldehyde/layout4/components/tabs-layout.tsx +110 -110
  454. package/src/aldehyde/layout4/css/header.less +196 -196
  455. package/src/aldehyde/layout4/css/main.less +154 -154
  456. package/src/aldehyde/layout4/css/sider.less +37 -37
  457. package/src/aldehyde/layout4/css/tabs-layout.less +42 -42
  458. package/src/aldehyde/layout4/header.tsx +190 -190
  459. package/src/aldehyde/layout4/main.tsx +29 -29
  460. package/src/aldehyde/layout4/page.tsx +125 -125
  461. package/src/aldehyde/layout4/sider.tsx +201 -201
  462. package/src/aldehyde/layout5/css/header.less +35 -35
  463. package/src/aldehyde/layout5/css/sider.less +18 -18
  464. package/src/aldehyde/layout5/header.tsx +204 -204
  465. package/src/aldehyde/layout5/page.tsx +107 -107
  466. package/src/aldehyde/layout5/sider.tsx +235 -235
  467. package/src/aldehyde/list/calendar/index.less +20 -20
  468. package/src/aldehyde/list/calendar/index.tsx +157 -157
  469. package/src/aldehyde/list/card-list/card-list-item.tsx +112 -111
  470. package/src/aldehyde/list/card-list/index.less +154 -154
  471. package/src/aldehyde/list/card-list/index.tsx +83 -83
  472. package/src/aldehyde/list/gantt/index.less +8 -8
  473. package/src/aldehyde/list/gantt/index.tsx +508 -508
  474. package/src/aldehyde/list/vertical-list/index.less +208 -208
  475. package/src/aldehyde/list/vertical-list/index.tsx +55 -55
  476. package/src/aldehyde/list/vertical-list/item.tsx +136 -136
  477. package/src/aldehyde/locale/LocaleButton.tsx +48 -48
  478. package/src/aldehyde/locale/LocaleProvider.tsx +265 -265
  479. package/src/aldehyde/locale/langMp.ts +45 -45
  480. package/src/aldehyde/locale/translate.ts +80 -80
  481. package/src/aldehyde/locale/useLocale.ts +72 -72
  482. package/src/aldehyde/login/context-setter.tsx +130 -130
  483. package/src/aldehyde/login/index.css +19 -19
  484. package/src/aldehyde/login/login.tsx +255 -255
  485. package/src/aldehyde/login/router-login.tsx +107 -107
  486. package/src/aldehyde/login/vertify/index.css +143 -143
  487. package/src/aldehyde/login/vertify/index.tsx +360 -360
  488. package/src/aldehyde/login/vertify/tool.ts +13 -13
  489. package/src/aldehyde/login2/login-page.tsx +92 -92
  490. package/src/aldehyde/login2/login.tsx +226 -226
  491. package/src/aldehyde/login3/index.less +136 -136
  492. package/src/aldehyde/login3/login-page.tsx +71 -71
  493. package/src/aldehyde/lowcode-components/act-table/index.less +26 -26
  494. package/src/aldehyde/lowcode-components/act-table/index.tsx +139 -139
  495. package/src/aldehyde/lowcode-components/assets/lowcode-constant.tsx +12 -12
  496. package/src/aldehyde/lowcode-components/bar-chart/index.tsx +268 -268
  497. package/src/aldehyde/lowcode-components/base-button/index.less +7 -7
  498. package/src/aldehyde/lowcode-components/base-button/index.tsx +197 -197
  499. package/src/aldehyde/lowcode-components/base-image/index.tsx +220 -220
  500. package/src/aldehyde/lowcode-components/base-map/index.tsx +292 -292
  501. package/src/aldehyde/lowcode-components/base-radio/index.less +23 -23
  502. package/src/aldehyde/lowcode-components/base-radio/index.tsx +157 -157
  503. package/src/aldehyde/lowcode-components/base-table/index.tsx +268 -268
  504. package/src/aldehyde/lowcode-components/base-tabs/index.less +14 -14
  505. package/src/aldehyde/lowcode-components/base-tabs/index.tsx +183 -183
  506. package/src/aldehyde/lowcode-components/base-text/index.tsx +58 -58
  507. package/src/aldehyde/lowcode-components/border/border1/index.tsx +70 -70
  508. package/src/aldehyde/lowcode-components/border/border10/index.less +26 -26
  509. package/src/aldehyde/lowcode-components/border/border10/index.tsx +45 -45
  510. package/src/aldehyde/lowcode-components/border/border11/index.less +17 -17
  511. package/src/aldehyde/lowcode-components/border/border11/index.tsx +232 -232
  512. package/src/aldehyde/lowcode-components/border/border12/index.less +13 -13
  513. package/src/aldehyde/lowcode-components/border/border12/index.tsx +115 -115
  514. package/src/aldehyde/lowcode-components/border/border13/index.less +13 -13
  515. package/src/aldehyde/lowcode-components/border/border13/index.tsx +69 -69
  516. package/src/aldehyde/lowcode-components/border/border2/index.less +17 -17
  517. package/src/aldehyde/lowcode-components/border/border2/index.tsx +51 -51
  518. package/src/aldehyde/lowcode-components/border/border3/index.less +25 -25
  519. package/src/aldehyde/lowcode-components/border/border3/index.tsx +61 -61
  520. package/src/aldehyde/lowcode-components/border/border4/index.less +72 -72
  521. package/src/aldehyde/lowcode-components/border/border4/index.tsx +79 -79
  522. package/src/aldehyde/lowcode-components/border/border5/index.less +35 -35
  523. package/src/aldehyde/lowcode-components/border/border5/index.tsx +75 -75
  524. package/src/aldehyde/lowcode-components/border/border6/index.less +17 -17
  525. package/src/aldehyde/lowcode-components/border/border6/index.tsx +60 -60
  526. package/src/aldehyde/lowcode-components/border/border7/index.less +26 -26
  527. package/src/aldehyde/lowcode-components/border/border7/index.tsx +75 -75
  528. package/src/aldehyde/lowcode-components/border/border8/index.less +13 -13
  529. package/src/aldehyde/lowcode-components/border/border8/index.tsx +84 -84
  530. package/src/aldehyde/lowcode-components/border/border9/index.less +13 -13
  531. package/src/aldehyde/lowcode-components/border/border9/index.tsx +154 -154
  532. package/src/aldehyde/lowcode-components/capsule-bar-chart/index.tsx +290 -290
  533. package/src/aldehyde/lowcode-components/carousel/index.tsx +218 -218
  534. package/src/aldehyde/lowcode-components/circular-progress-chart/index.tsx +263 -263
  535. package/src/aldehyde/lowcode-components/column-3d-chart/index.tsx +438 -438
  536. package/src/aldehyde/lowcode-components/column-chart/index.tsx +293 -293
  537. package/src/aldehyde/lowcode-components/data-number/index.tsx +219 -219
  538. package/src/aldehyde/lowcode-components/data.d.ts +19 -18
  539. package/src/aldehyde/lowcode-components/decoration/decoration1/index.less +7 -7
  540. package/src/aldehyde/lowcode-components/decoration/decoration1/index.tsx +153 -153
  541. package/src/aldehyde/lowcode-components/decoration/decoration10/index.less +5 -5
  542. package/src/aldehyde/lowcode-components/decoration/decoration10/index.tsx +89 -89
  543. package/src/aldehyde/lowcode-components/decoration/decoration11/index.less +5 -5
  544. package/src/aldehyde/lowcode-components/decoration/decoration11/index.tsx +133 -133
  545. package/src/aldehyde/lowcode-components/decoration/decoration2/index.less +6 -6
  546. package/src/aldehyde/lowcode-components/decoration/decoration2/index.tsx +61 -61
  547. package/src/aldehyde/lowcode-components/decoration/decoration3/index.less +7 -7
  548. package/src/aldehyde/lowcode-components/decoration/decoration3/index.tsx +87 -87
  549. package/src/aldehyde/lowcode-components/decoration/decoration4/index.less +29 -29
  550. package/src/aldehyde/lowcode-components/decoration/decoration4/index.tsx +53 -53
  551. package/src/aldehyde/lowcode-components/decoration/decoration5/index.less +3 -3
  552. package/src/aldehyde/lowcode-components/decoration/decoration5/index.tsx +116 -116
  553. package/src/aldehyde/lowcode-components/decoration/decoration6/index.less +7 -7
  554. package/src/aldehyde/lowcode-components/decoration/decoration6/index.tsx +121 -121
  555. package/src/aldehyde/lowcode-components/decoration/decoration7/index.less +4 -4
  556. package/src/aldehyde/lowcode-components/decoration/decoration7/index.tsx +70 -70
  557. package/src/aldehyde/lowcode-components/decoration/decoration8/index.less +14 -14
  558. package/src/aldehyde/lowcode-components/decoration/decoration8/index.tsx +122 -122
  559. package/src/aldehyde/lowcode-components/decoration/decoration9/index.less +4 -4
  560. package/src/aldehyde/lowcode-components/decoration/decoration9/index.tsx +196 -196
  561. package/src/aldehyde/lowcode-components/effectScatter-map/index.tsx +315 -315
  562. package/src/aldehyde/lowcode-components/effectScatter-map-3d/index.tsx +419 -419
  563. package/src/aldehyde/lowcode-components/gauge-chart/index.tsx +254 -254
  564. package/src/aldehyde/lowcode-components/index.ts +130 -130
  565. package/src/aldehyde/lowcode-components/line-bar-chart/index.tsx +300 -300
  566. package/src/aldehyde/lowcode-components/line-chart/index.tsx +290 -290
  567. package/src/aldehyde/lowcode-components/liquid-chart/index.tsx +250 -250
  568. package/src/aldehyde/lowcode-components/lowcode-view/component/assets.ts +478 -478
  569. package/src/aldehyde/lowcode-components/lowcode-view/component/component-controller.ts +153 -153
  570. package/src/aldehyde/lowcode-components/lowcode-view/component/component-definition.ts +23 -23
  571. package/src/aldehyde/lowcode-components/lowcode-view/component/loading.tsx +20 -20
  572. package/src/aldehyde/lowcode-components/lowcode-view/component/util.ts +27 -27
  573. package/src/aldehyde/lowcode-components/lowcode-view/index.less +19 -19
  574. package/src/aldehyde/lowcode-components/lowcode-view/index.tsx +277 -277
  575. package/src/aldehyde/lowcode-components/lowcode-view/interface.ts +189 -189
  576. package/src/aldehyde/lowcode-components/pie-chart/index.tsx +349 -349
  577. package/src/aldehyde/lowcode-components/progress-chart/index.tsx +295 -295
  578. package/src/aldehyde/lowcode-components/radar-chart/index.tsx +322 -322
  579. package/src/aldehyde/lowcode-components/search-form/index.less +25 -25
  580. package/src/aldehyde/lowcode-components/search-form/index.tsx +121 -121
  581. package/src/aldehyde/lowcode-components/stroke-animation/index.tsx +219 -219
  582. package/src/aldehyde/module/block-menu-tree-drawer.tsx +118 -118
  583. package/src/aldehyde/module/criteria-page.tsx1 +175 -175
  584. package/src/aldehyde/module/draggable-modal.tsx +66 -66
  585. package/src/aldehyde/module/dtmpl-edit-card.tsx +437 -437
  586. package/src/aldehyde/module/dtmpl-edit-drawer.tsx +23 -23
  587. package/src/aldehyde/module/dtmpl-edit-modal.tsx +25 -25
  588. package/src/aldehyde/module/dtmpl-edit-page.tsx +558 -558
  589. package/src/aldehyde/module/dtmpl-editor.tsx +165 -165
  590. package/src/aldehyde/module/dtmpl-view-card.tsx +64 -64
  591. package/src/aldehyde/module/dtmpl-view-drawer.tsx +71 -71
  592. package/src/aldehyde/module/dtmpl-view-modal.tsx +56 -56
  593. package/src/aldehyde/module/embed-dtmpl-edit-page.tsx +137 -137
  594. package/src/aldehyde/module/index.less +4 -4
  595. package/src/aldehyde/module/ltmpl-drawer.tsx +60 -60
  596. package/src/aldehyde/module/ltmpl-modal.tsx +63 -63
  597. package/src/aldehyde/module/ltmpl-table.tsx +379 -378
  598. package/src/aldehyde/module/ttmpl-tree.tsx +47 -47
  599. package/src/aldehyde/routable/dtmpl-route.tsx +173 -173
  600. package/src/aldehyde/routable/import-route.tsx +35 -35
  601. package/src/aldehyde/routable/index.less +25 -25
  602. package/src/aldehyde/routable/ltmpl-route.tsx +539 -539
  603. package/src/aldehyde/routable/splitview-ltmpl-route.tsx +377 -377
  604. package/src/aldehyde/routable/ttmpl-route.tsx +93 -93
  605. package/src/aldehyde/routable/withroute.tsx +36 -36
  606. package/src/aldehyde/sso-Login/index.tsx +73 -73
  607. package/src/aldehyde/sso-Login/service/index.js +16 -16
  608. package/src/aldehyde/sso-Login/service/login.js +75 -75
  609. package/src/aldehyde/table/act-table.tsx +1830 -1831
  610. package/src/aldehyde/table/column/column-builder.tsx +865 -864
  611. package/src/aldehyde/table/column/column-selector.tsx +130 -130
  612. package/src/aldehyde/table/column/index.less +85 -63
  613. package/src/aldehyde/table/column/summary-builder.tsx +712 -712
  614. package/src/aldehyde/table/column/theme-color-getter.tsx +25 -25
  615. package/src/aldehyde/table/control-table-x-axis-wrapper.tsx +80 -80
  616. package/src/aldehyde/table/index.css +211 -211
  617. package/src/aldehyde/table/l2-act-table.tsx +91 -91
  618. package/src/aldehyde/table/modal-select-table.tsx +308 -308
  619. package/src/aldehyde/table/page-config-button.tsx +203 -203
  620. package/src/aldehyde/table/pagination.css +14 -14
  621. package/src/aldehyde/table/pagination.tsx +81 -81
  622. package/src/aldehyde/table/query-table.tsx +658 -658
  623. package/src/aldehyde/table/relation-table.tsx +1078 -1093
  624. package/src/aldehyde/table/report-table.tsx +125 -125
  625. package/src/aldehyde/table/resizable-table.tsx +97 -97
  626. package/src/aldehyde/table/select-table.tsx +559 -548
  627. package/src/aldehyde/table/selected-rows-card.tsx +78 -78
  628. package/src/aldehyde/table/stat/restat.tsx +122 -122
  629. package/src/aldehyde/table/table-util.tsx +25 -25
  630. package/src/aldehyde/tmpl/control-type-supportor.tsx +154 -154
  631. package/src/aldehyde/tmpl/hc-data-source.tsx +574 -566
  632. package/src/aldehyde/tmpl/hcservice-v3.tsx +1590 -1590
  633. package/src/aldehyde/tmpl/interface.tsx +924 -919
  634. package/src/aldehyde/tmpl/model-struc-v3.tsx +111 -111
  635. package/src/aldehyde/tmpl/superagent.js +146 -146
  636. package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +585 -585
  637. package/src/aldehyde/tmpl/web-socket.ts +366 -366
  638. package/src/aldehyde/tree/act-tree.tsx +217 -217
  639. package/src/aldehyde/tree/block-menu-auth-tree.tsx +189 -189
  640. package/src/aldehyde/tree/index.css +22 -22
  641. package/src/aldehyde/tree/navigation-tree.tsx +39 -39
  642. package/src/aldehyde/tree/tmpl-tree.tsx +751 -751
  643. package/src/aldehyde/tree/tree-node.tsx +73 -73
  644. package/src/aldehyde/tree/tree-utils.tsx +317 -317
  645. package/src/aldehyde/units/EncryptUtils.js +37 -37
  646. package/src/aldehyde/units/image.d.ts +7 -7
  647. package/src/aldehyde/units/index.tsx +1367 -1367
  648. package/src/aldehyde/units/storage.js +2 -2
  649. package/src/aldehyde/utils/dsu.ts +27 -27
  650. package/src/aldehyde/welcome/HCWelcome.js +404 -404
  651. package/src/aldehyde/welcome/HCWelcome1.js +259 -259
  652. package/src/aldehyde/welcome/components/menu-card.less +96 -96
  653. package/src/aldehyde/welcome/components/menu-card.tsx +70 -70
  654. package/src/aldehyde/welcome/components/page-card.less +49 -49
  655. package/src/aldehyde/welcome/components/page-card.tsx +97 -97
  656. package/src/aldehyde/welcome/components/quick-entrance.less +120 -120
  657. package/src/aldehyde/welcome/components/quick-entrance.tsx +80 -80
  658. package/src/aldehyde/welcome/components/user-menus.less +192 -192
  659. package/src/aldehyde/welcome/components/user-menus.tsx +279 -279
  660. package/src/aldehyde/welcome/components/workbench.less +118 -118
  661. package/src/aldehyde/welcome/components/workbench.tsx +146 -146
  662. 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
  }