@sulesky/next-core 1.0.3

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 (488) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +1 -0
  3. package/dist/designable.core.umd.production.js +1 -0
  4. package/dist/designable.core.umd.production.min.js +7994 -0
  5. package/esm/drivers/DragDropDriver.d.ts +14 -0
  6. package/esm/drivers/DragDropDriver.js +157 -0
  7. package/esm/drivers/KeyboardDriver.d.ts +7 -0
  8. package/esm/drivers/KeyboardDriver.js +90 -0
  9. package/esm/drivers/MouseClickDriver.d.ts +8 -0
  10. package/esm/drivers/MouseClickDriver.js +95 -0
  11. package/esm/drivers/MouseMoveDriver.d.ts +8 -0
  12. package/esm/drivers/MouseMoveDriver.js +75 -0
  13. package/esm/drivers/ViewportResizeDriver.d.ts +10 -0
  14. package/esm/drivers/ViewportResizeDriver.js +94 -0
  15. package/esm/drivers/ViewportScrollDriver.d.ts +8 -0
  16. package/esm/drivers/ViewportScrollDriver.js +74 -0
  17. package/esm/drivers/index.d.ts +6 -0
  18. package/esm/drivers/index.js +6 -0
  19. package/esm/effects/index.d.ts +11 -0
  20. package/esm/effects/index.js +11 -0
  21. package/esm/effects/useAutoScrollEffect.d.ts +2 -0
  22. package/esm/effects/useAutoScrollEffect.js +65 -0
  23. package/esm/effects/useContentEditableEffect.d.ts +2 -0
  24. package/esm/effects/useContentEditableEffect.js +167 -0
  25. package/esm/effects/useCursorEffect.d.ts +2 -0
  26. package/esm/effects/useCursorEffect.js +55 -0
  27. package/esm/effects/useDragDropEffect.d.ts +2 -0
  28. package/esm/effects/useDragDropEffect.js +168 -0
  29. package/esm/effects/useFreeSelectionEffect.d.ts +2 -0
  30. package/esm/effects/useFreeSelectionEffect.js +59 -0
  31. package/esm/effects/useKeyboardEffect.d.ts +2 -0
  32. package/esm/effects/useKeyboardEffect.js +17 -0
  33. package/esm/effects/useResizeEffect.d.ts +2 -0
  34. package/esm/effects/useResizeEffect.js +80 -0
  35. package/esm/effects/useSelectionEffect.d.ts +2 -0
  36. package/esm/effects/useSelectionEffect.js +68 -0
  37. package/esm/effects/useTranslateEffect.d.ts +2 -0
  38. package/esm/effects/useTranslateEffect.js +58 -0
  39. package/esm/effects/useViewportEffect.d.ts +2 -0
  40. package/esm/effects/useViewportEffect.js +31 -0
  41. package/esm/effects/useWorkspaceEffect.d.ts +2 -0
  42. package/esm/effects/useWorkspaceEffect.js +29 -0
  43. package/esm/events/cursor/AbstractCursorEvent.d.ts +21 -0
  44. package/esm/events/cursor/AbstractCursorEvent.js +40 -0
  45. package/esm/events/cursor/DragMoveEvent.d.ts +5 -0
  46. package/esm/events/cursor/DragMoveEvent.js +51 -0
  47. package/esm/events/cursor/DragStartEvent.d.ts +5 -0
  48. package/esm/events/cursor/DragStartEvent.js +51 -0
  49. package/esm/events/cursor/DragStopEvent.d.ts +5 -0
  50. package/esm/events/cursor/DragStopEvent.js +51 -0
  51. package/esm/events/cursor/MouseClickEvent.d.ts +8 -0
  52. package/esm/events/cursor/MouseClickEvent.js +61 -0
  53. package/esm/events/cursor/MouseMoveEvent.d.ts +5 -0
  54. package/esm/events/cursor/MouseMoveEvent.js +51 -0
  55. package/esm/events/cursor/index.d.ts +5 -0
  56. package/esm/events/cursor/index.js +5 -0
  57. package/esm/events/history/AbstractHistoryEvent.d.ts +6 -0
  58. package/esm/events/history/AbstractHistoryEvent.js +7 -0
  59. package/esm/events/history/HistoryGotoEvent.d.ts +5 -0
  60. package/esm/events/history/HistoryGotoEvent.js +51 -0
  61. package/esm/events/history/HistoryPushEvent.d.ts +5 -0
  62. package/esm/events/history/HistoryPushEvent.js +51 -0
  63. package/esm/events/history/HistoryRedoEvent.d.ts +5 -0
  64. package/esm/events/history/HistoryRedoEvent.js +51 -0
  65. package/esm/events/history/HistoryUndoEvent.d.ts +5 -0
  66. package/esm/events/history/HistoryUndoEvent.js +51 -0
  67. package/esm/events/history/index.d.ts +4 -0
  68. package/esm/events/history/index.js +4 -0
  69. package/esm/events/index.d.ts +6 -0
  70. package/esm/events/index.js +6 -0
  71. package/esm/events/keyboard/AbstractKeyboardEvent.d.ts +15 -0
  72. package/esm/events/keyboard/AbstractKeyboardEvent.js +61 -0
  73. package/esm/events/keyboard/KeyDownEvent.d.ts +5 -0
  74. package/esm/events/keyboard/KeyDownEvent.js +51 -0
  75. package/esm/events/keyboard/KeyUpEvent.d.ts +5 -0
  76. package/esm/events/keyboard/KeyUpEvent.js +51 -0
  77. package/esm/events/keyboard/index.d.ts +2 -0
  78. package/esm/events/keyboard/index.js +2 -0
  79. package/esm/events/mutation/AbstractMutationNodeEvent.d.ts +13 -0
  80. package/esm/events/mutation/AbstractMutationNodeEvent.js +7 -0
  81. package/esm/events/mutation/AppendNodeEvent.d.ts +5 -0
  82. package/esm/events/mutation/AppendNodeEvent.js +51 -0
  83. package/esm/events/mutation/CloneNodeEvent.d.ts +5 -0
  84. package/esm/events/mutation/CloneNodeEvent.js +51 -0
  85. package/esm/events/mutation/DragNodeEvent.d.ts +5 -0
  86. package/esm/events/mutation/DragNodeEvent.js +51 -0
  87. package/esm/events/mutation/DropNodeEvent.d.ts +5 -0
  88. package/esm/events/mutation/DropNodeEvent.js +51 -0
  89. package/esm/events/mutation/FromNodeEvent.d.ts +13 -0
  90. package/esm/events/mutation/FromNodeEvent.js +8 -0
  91. package/esm/events/mutation/HoverNodeEvent.d.ts +5 -0
  92. package/esm/events/mutation/HoverNodeEvent.js +51 -0
  93. package/esm/events/mutation/InsertAfterEvent.d.ts +5 -0
  94. package/esm/events/mutation/InsertAfterEvent.js +51 -0
  95. package/esm/events/mutation/InsertBeforeEvent.d.ts +5 -0
  96. package/esm/events/mutation/InsertBeforeEvent.js +51 -0
  97. package/esm/events/mutation/InsertChildrenEvent.d.ts +5 -0
  98. package/esm/events/mutation/InsertChildrenEvent.js +51 -0
  99. package/esm/events/mutation/PrependNodeEvent.d.ts +5 -0
  100. package/esm/events/mutation/PrependNodeEvent.js +51 -0
  101. package/esm/events/mutation/RemoveNodeEvent.d.ts +5 -0
  102. package/esm/events/mutation/RemoveNodeEvent.js +51 -0
  103. package/esm/events/mutation/SelectNodeEvent.d.ts +5 -0
  104. package/esm/events/mutation/SelectNodeEvent.js +51 -0
  105. package/esm/events/mutation/UnSelectNodeEvent.d.ts +5 -0
  106. package/esm/events/mutation/UnSelectNodeEvent.js +51 -0
  107. package/esm/events/mutation/UpdateChildrenEvent.d.ts +5 -0
  108. package/esm/events/mutation/UpdateChildrenEvent.js +51 -0
  109. package/esm/events/mutation/UpdateNodePropsEvent.d.ts +5 -0
  110. package/esm/events/mutation/UpdateNodePropsEvent.js +51 -0
  111. package/esm/events/mutation/UserSelectNodeEvent.d.ts +5 -0
  112. package/esm/events/mutation/UserSelectNodeEvent.js +51 -0
  113. package/esm/events/mutation/WrapNodeEvent.d.ts +5 -0
  114. package/esm/events/mutation/WrapNodeEvent.js +51 -0
  115. package/esm/events/mutation/index.d.ts +16 -0
  116. package/esm/events/mutation/index.js +16 -0
  117. package/esm/events/viewport/AbstractViewportEvent.d.ts +16 -0
  118. package/esm/events/viewport/AbstractViewportEvent.js +17 -0
  119. package/esm/events/viewport/ViewportResizeEvent.d.ts +5 -0
  120. package/esm/events/viewport/ViewportResizeEvent.js +51 -0
  121. package/esm/events/viewport/ViewportScrollEvent.d.ts +5 -0
  122. package/esm/events/viewport/ViewportScrollEvent.js +51 -0
  123. package/esm/events/viewport/index.d.ts +2 -0
  124. package/esm/events/viewport/index.js +2 -0
  125. package/esm/events/workbench/AbstractWorkspaceEvent.d.ts +7 -0
  126. package/esm/events/workbench/AbstractWorkspaceEvent.js +7 -0
  127. package/esm/events/workbench/AddWorkspaceEvent.d.ts +5 -0
  128. package/esm/events/workbench/AddWorkspaceEvent.js +51 -0
  129. package/esm/events/workbench/RemoveWorkspaceEvent.d.ts +5 -0
  130. package/esm/events/workbench/RemoveWorkspaceEvent.js +51 -0
  131. package/esm/events/workbench/SwitchWorkspaceEvent.d.ts +5 -0
  132. package/esm/events/workbench/SwitchWorkspaceEvent.js +51 -0
  133. package/esm/events/workbench/index.d.ts +3 -0
  134. package/esm/events/workbench/index.js +3 -0
  135. package/esm/exports.d.ts +5 -0
  136. package/esm/exports.js +5 -0
  137. package/esm/externals.d.ts +12 -0
  138. package/esm/externals.js +113 -0
  139. package/esm/index.d.ts +1 -0
  140. package/esm/index.js +24 -0
  141. package/esm/internals.d.ts +3 -0
  142. package/esm/internals.js +34 -0
  143. package/esm/models/Cursor.d.ts +60 -0
  144. package/esm/models/Cursor.js +151 -0
  145. package/esm/models/Engine.d.ts +29 -0
  146. package/esm/models/Engine.js +112 -0
  147. package/esm/models/History.d.ts +34 -0
  148. package/esm/models/History.js +110 -0
  149. package/esm/models/Hover.d.ts +14 -0
  150. package/esm/models/Hover.js +38 -0
  151. package/esm/models/Keyboard.d.ts +29 -0
  152. package/esm/models/Keyboard.js +126 -0
  153. package/esm/models/MoveHelper.d.ts +66 -0
  154. package/esm/models/MoveHelper.js +363 -0
  155. package/esm/models/Operation.d.ts +29 -0
  156. package/esm/models/Operation.js +75 -0
  157. package/esm/models/Screen.d.ts +31 -0
  158. package/esm/models/Screen.js +73 -0
  159. package/esm/models/Selection.d.ts +29 -0
  160. package/esm/models/Selection.js +192 -0
  161. package/esm/models/Shortcut.d.ts +20 -0
  162. package/esm/models/Shortcut.js +69 -0
  163. package/esm/models/SnapLine.d.ts +27 -0
  164. package/esm/models/SnapLine.js +141 -0
  165. package/esm/models/SpaceBlock.d.ts +40 -0
  166. package/esm/models/SpaceBlock.js +171 -0
  167. package/esm/models/TransformHelper.d.ts +80 -0
  168. package/esm/models/TransformHelper.js +601 -0
  169. package/esm/models/TreeNode.d.ts +115 -0
  170. package/esm/models/TreeNode.js +933 -0
  171. package/esm/models/Viewport.d.ts +90 -0
  172. package/esm/models/Viewport.js +474 -0
  173. package/esm/models/Workbench.d.ts +23 -0
  174. package/esm/models/Workbench.js +98 -0
  175. package/esm/models/Workspace.d.ts +41 -0
  176. package/esm/models/Workspace.js +95 -0
  177. package/esm/models/index.d.ts +13 -0
  178. package/esm/models/index.js +13 -0
  179. package/esm/presets.d.ts +4 -0
  180. package/esm/presets.js +38 -0
  181. package/esm/registry.d.ts +16 -0
  182. package/esm/registry.js +123 -0
  183. package/esm/shortcuts/CursorSwitch.d.ts +2 -0
  184. package/esm/shortcuts/CursorSwitch.js +10 -0
  185. package/esm/shortcuts/MultiSelection.d.ts +5 -0
  186. package/esm/shortcuts/MultiSelection.js +27 -0
  187. package/esm/shortcuts/NodeMutation.d.ts +7 -0
  188. package/esm/shortcuts/NodeMutation.js +40 -0
  189. package/esm/shortcuts/QuickSelection.d.ts +3 -0
  190. package/esm/shortcuts/QuickSelection.js +85 -0
  191. package/esm/shortcuts/UndoRedo.d.ts +3 -0
  192. package/esm/shortcuts/UndoRedo.js +27 -0
  193. package/esm/shortcuts/index.d.ts +5 -0
  194. package/esm/shortcuts/index.js +5 -0
  195. package/esm/types.d.ts +131 -0
  196. package/esm/types.js +1 -0
  197. package/lib/drivers/DragDropDriver.d.ts +14 -0
  198. package/lib/drivers/DragDropDriver.js +160 -0
  199. package/lib/drivers/KeyboardDriver.d.ts +7 -0
  200. package/lib/drivers/KeyboardDriver.js +93 -0
  201. package/lib/drivers/MouseClickDriver.d.ts +8 -0
  202. package/lib/drivers/MouseClickDriver.js +98 -0
  203. package/lib/drivers/MouseMoveDriver.d.ts +8 -0
  204. package/lib/drivers/MouseMoveDriver.js +78 -0
  205. package/lib/drivers/ViewportResizeDriver.d.ts +10 -0
  206. package/lib/drivers/ViewportResizeDriver.js +97 -0
  207. package/lib/drivers/ViewportScrollDriver.d.ts +8 -0
  208. package/lib/drivers/ViewportScrollDriver.js +77 -0
  209. package/lib/drivers/index.d.ts +6 -0
  210. package/lib/drivers/index.js +22 -0
  211. package/lib/effects/index.d.ts +11 -0
  212. package/lib/effects/index.js +27 -0
  213. package/lib/effects/useAutoScrollEffect.d.ts +2 -0
  214. package/lib/effects/useAutoScrollEffect.js +69 -0
  215. package/lib/effects/useContentEditableEffect.d.ts +2 -0
  216. package/lib/effects/useContentEditableEffect.js +171 -0
  217. package/lib/effects/useCursorEffect.d.ts +2 -0
  218. package/lib/effects/useCursorEffect.js +59 -0
  219. package/lib/effects/useDragDropEffect.d.ts +2 -0
  220. package/lib/effects/useDragDropEffect.js +172 -0
  221. package/lib/effects/useFreeSelectionEffect.d.ts +2 -0
  222. package/lib/effects/useFreeSelectionEffect.js +63 -0
  223. package/lib/effects/useKeyboardEffect.d.ts +2 -0
  224. package/lib/effects/useKeyboardEffect.js +21 -0
  225. package/lib/effects/useResizeEffect.d.ts +2 -0
  226. package/lib/effects/useResizeEffect.js +84 -0
  227. package/lib/effects/useSelectionEffect.d.ts +2 -0
  228. package/lib/effects/useSelectionEffect.js +72 -0
  229. package/lib/effects/useTranslateEffect.d.ts +2 -0
  230. package/lib/effects/useTranslateEffect.js +62 -0
  231. package/lib/effects/useViewportEffect.d.ts +2 -0
  232. package/lib/effects/useViewportEffect.js +35 -0
  233. package/lib/effects/useWorkspaceEffect.d.ts +2 -0
  234. package/lib/effects/useWorkspaceEffect.js +33 -0
  235. package/lib/events/cursor/AbstractCursorEvent.d.ts +21 -0
  236. package/lib/events/cursor/AbstractCursorEvent.js +43 -0
  237. package/lib/events/cursor/DragMoveEvent.d.ts +5 -0
  238. package/lib/events/cursor/DragMoveEvent.js +54 -0
  239. package/lib/events/cursor/DragStartEvent.d.ts +5 -0
  240. package/lib/events/cursor/DragStartEvent.js +54 -0
  241. package/lib/events/cursor/DragStopEvent.d.ts +5 -0
  242. package/lib/events/cursor/DragStopEvent.js +54 -0
  243. package/lib/events/cursor/MouseClickEvent.d.ts +8 -0
  244. package/lib/events/cursor/MouseClickEvent.js +64 -0
  245. package/lib/events/cursor/MouseMoveEvent.d.ts +5 -0
  246. package/lib/events/cursor/MouseMoveEvent.js +54 -0
  247. package/lib/events/cursor/index.d.ts +5 -0
  248. package/lib/events/cursor/index.js +21 -0
  249. package/lib/events/history/AbstractHistoryEvent.d.ts +6 -0
  250. package/lib/events/history/AbstractHistoryEvent.js +10 -0
  251. package/lib/events/history/HistoryGotoEvent.d.ts +5 -0
  252. package/lib/events/history/HistoryGotoEvent.js +54 -0
  253. package/lib/events/history/HistoryPushEvent.d.ts +5 -0
  254. package/lib/events/history/HistoryPushEvent.js +54 -0
  255. package/lib/events/history/HistoryRedoEvent.d.ts +5 -0
  256. package/lib/events/history/HistoryRedoEvent.js +54 -0
  257. package/lib/events/history/HistoryUndoEvent.d.ts +5 -0
  258. package/lib/events/history/HistoryUndoEvent.js +54 -0
  259. package/lib/events/history/index.d.ts +4 -0
  260. package/lib/events/history/index.js +20 -0
  261. package/lib/events/index.d.ts +6 -0
  262. package/lib/events/index.js +22 -0
  263. package/lib/events/keyboard/AbstractKeyboardEvent.d.ts +15 -0
  264. package/lib/events/keyboard/AbstractKeyboardEvent.js +64 -0
  265. package/lib/events/keyboard/KeyDownEvent.d.ts +5 -0
  266. package/lib/events/keyboard/KeyDownEvent.js +54 -0
  267. package/lib/events/keyboard/KeyUpEvent.d.ts +5 -0
  268. package/lib/events/keyboard/KeyUpEvent.js +54 -0
  269. package/lib/events/keyboard/index.d.ts +2 -0
  270. package/lib/events/keyboard/index.js +18 -0
  271. package/lib/events/mutation/AbstractMutationNodeEvent.d.ts +13 -0
  272. package/lib/events/mutation/AbstractMutationNodeEvent.js +10 -0
  273. package/lib/events/mutation/AppendNodeEvent.d.ts +5 -0
  274. package/lib/events/mutation/AppendNodeEvent.js +54 -0
  275. package/lib/events/mutation/CloneNodeEvent.d.ts +5 -0
  276. package/lib/events/mutation/CloneNodeEvent.js +54 -0
  277. package/lib/events/mutation/DragNodeEvent.d.ts +5 -0
  278. package/lib/events/mutation/DragNodeEvent.js +54 -0
  279. package/lib/events/mutation/DropNodeEvent.d.ts +5 -0
  280. package/lib/events/mutation/DropNodeEvent.js +54 -0
  281. package/lib/events/mutation/FromNodeEvent.d.ts +13 -0
  282. package/lib/events/mutation/FromNodeEvent.js +11 -0
  283. package/lib/events/mutation/HoverNodeEvent.d.ts +5 -0
  284. package/lib/events/mutation/HoverNodeEvent.js +54 -0
  285. package/lib/events/mutation/InsertAfterEvent.d.ts +5 -0
  286. package/lib/events/mutation/InsertAfterEvent.js +54 -0
  287. package/lib/events/mutation/InsertBeforeEvent.d.ts +5 -0
  288. package/lib/events/mutation/InsertBeforeEvent.js +54 -0
  289. package/lib/events/mutation/InsertChildrenEvent.d.ts +5 -0
  290. package/lib/events/mutation/InsertChildrenEvent.js +54 -0
  291. package/lib/events/mutation/PrependNodeEvent.d.ts +5 -0
  292. package/lib/events/mutation/PrependNodeEvent.js +54 -0
  293. package/lib/events/mutation/RemoveNodeEvent.d.ts +5 -0
  294. package/lib/events/mutation/RemoveNodeEvent.js +54 -0
  295. package/lib/events/mutation/SelectNodeEvent.d.ts +5 -0
  296. package/lib/events/mutation/SelectNodeEvent.js +54 -0
  297. package/lib/events/mutation/UnSelectNodeEvent.d.ts +5 -0
  298. package/lib/events/mutation/UnSelectNodeEvent.js +54 -0
  299. package/lib/events/mutation/UpdateChildrenEvent.d.ts +5 -0
  300. package/lib/events/mutation/UpdateChildrenEvent.js +54 -0
  301. package/lib/events/mutation/UpdateNodePropsEvent.d.ts +5 -0
  302. package/lib/events/mutation/UpdateNodePropsEvent.js +54 -0
  303. package/lib/events/mutation/UserSelectNodeEvent.d.ts +5 -0
  304. package/lib/events/mutation/UserSelectNodeEvent.js +54 -0
  305. package/lib/events/mutation/WrapNodeEvent.d.ts +5 -0
  306. package/lib/events/mutation/WrapNodeEvent.js +54 -0
  307. package/lib/events/mutation/index.d.ts +16 -0
  308. package/lib/events/mutation/index.js +32 -0
  309. package/lib/events/viewport/AbstractViewportEvent.d.ts +16 -0
  310. package/lib/events/viewport/AbstractViewportEvent.js +20 -0
  311. package/lib/events/viewport/ViewportResizeEvent.d.ts +5 -0
  312. package/lib/events/viewport/ViewportResizeEvent.js +54 -0
  313. package/lib/events/viewport/ViewportScrollEvent.d.ts +5 -0
  314. package/lib/events/viewport/ViewportScrollEvent.js +54 -0
  315. package/lib/events/viewport/index.d.ts +2 -0
  316. package/lib/events/viewport/index.js +18 -0
  317. package/lib/events/workbench/AbstractWorkspaceEvent.d.ts +7 -0
  318. package/lib/events/workbench/AbstractWorkspaceEvent.js +10 -0
  319. package/lib/events/workbench/AddWorkspaceEvent.d.ts +5 -0
  320. package/lib/events/workbench/AddWorkspaceEvent.js +54 -0
  321. package/lib/events/workbench/RemoveWorkspaceEvent.d.ts +5 -0
  322. package/lib/events/workbench/RemoveWorkspaceEvent.js +54 -0
  323. package/lib/events/workbench/SwitchWorkspaceEvent.d.ts +5 -0
  324. package/lib/events/workbench/SwitchWorkspaceEvent.js +54 -0
  325. package/lib/events/workbench/index.d.ts +3 -0
  326. package/lib/events/workbench/index.js +19 -0
  327. package/lib/exports.d.ts +5 -0
  328. package/lib/exports.js +21 -0
  329. package/lib/externals.d.ts +12 -0
  330. package/lib/externals.js +126 -0
  331. package/lib/index.d.ts +1 -0
  332. package/lib/index.js +62 -0
  333. package/lib/internals.d.ts +3 -0
  334. package/lib/internals.js +40 -0
  335. package/lib/models/Cursor.d.ts +60 -0
  336. package/lib/models/Cursor.js +154 -0
  337. package/lib/models/Engine.d.ts +29 -0
  338. package/lib/models/Engine.js +115 -0
  339. package/lib/models/History.d.ts +34 -0
  340. package/lib/models/History.js +113 -0
  341. package/lib/models/Hover.d.ts +14 -0
  342. package/lib/models/Hover.js +41 -0
  343. package/lib/models/Keyboard.d.ts +29 -0
  344. package/lib/models/Keyboard.js +129 -0
  345. package/lib/models/MoveHelper.d.ts +66 -0
  346. package/lib/models/MoveHelper.js +366 -0
  347. package/lib/models/Operation.d.ts +29 -0
  348. package/lib/models/Operation.js +78 -0
  349. package/lib/models/Screen.d.ts +31 -0
  350. package/lib/models/Screen.js +76 -0
  351. package/lib/models/Selection.d.ts +29 -0
  352. package/lib/models/Selection.js +195 -0
  353. package/lib/models/Shortcut.d.ts +20 -0
  354. package/lib/models/Shortcut.js +72 -0
  355. package/lib/models/SnapLine.d.ts +27 -0
  356. package/lib/models/SnapLine.js +144 -0
  357. package/lib/models/SpaceBlock.d.ts +40 -0
  358. package/lib/models/SpaceBlock.js +174 -0
  359. package/lib/models/TransformHelper.d.ts +80 -0
  360. package/lib/models/TransformHelper.js +604 -0
  361. package/lib/models/TreeNode.d.ts +115 -0
  362. package/lib/models/TreeNode.js +936 -0
  363. package/lib/models/Viewport.d.ts +90 -0
  364. package/lib/models/Viewport.js +477 -0
  365. package/lib/models/Workbench.d.ts +23 -0
  366. package/lib/models/Workbench.js +101 -0
  367. package/lib/models/Workspace.d.ts +41 -0
  368. package/lib/models/Workspace.js +98 -0
  369. package/lib/models/index.d.ts +13 -0
  370. package/lib/models/index.js +29 -0
  371. package/lib/presets.d.ts +4 -0
  372. package/lib/presets.js +41 -0
  373. package/lib/registry.d.ts +16 -0
  374. package/lib/registry.js +126 -0
  375. package/lib/shortcuts/CursorSwitch.d.ts +2 -0
  376. package/lib/shortcuts/CursorSwitch.js +13 -0
  377. package/lib/shortcuts/MultiSelection.d.ts +5 -0
  378. package/lib/shortcuts/MultiSelection.js +30 -0
  379. package/lib/shortcuts/NodeMutation.d.ts +7 -0
  380. package/lib/shortcuts/NodeMutation.js +43 -0
  381. package/lib/shortcuts/QuickSelection.d.ts +3 -0
  382. package/lib/shortcuts/QuickSelection.js +88 -0
  383. package/lib/shortcuts/UndoRedo.d.ts +3 -0
  384. package/lib/shortcuts/UndoRedo.js +30 -0
  385. package/lib/shortcuts/index.d.ts +5 -0
  386. package/lib/shortcuts/index.js +21 -0
  387. package/lib/types.d.ts +131 -0
  388. package/lib/types.js +2 -0
  389. package/package.json +43 -0
  390. package/rollup.config.mjs +3 -0
  391. package/src/drivers/DragDropDriver.ts +143 -0
  392. package/src/drivers/KeyboardDriver.ts +49 -0
  393. package/src/drivers/MouseClickDriver.ts +61 -0
  394. package/src/drivers/MouseMoveDriver.ts +34 -0
  395. package/src/drivers/ViewportResizeDriver.ts +52 -0
  396. package/src/drivers/ViewportScrollDriver.ts +34 -0
  397. package/src/drivers/index.ts +6 -0
  398. package/src/effects/index.ts +11 -0
  399. package/src/effects/useAutoScrollEffect.ts +82 -0
  400. package/src/effects/useContentEditableEffect.ts +207 -0
  401. package/src/effects/useCursorEffect.ts +62 -0
  402. package/src/effects/useDragDropEffect.ts +185 -0
  403. package/src/effects/useFreeSelectionEffect.ts +66 -0
  404. package/src/effects/useKeyboardEffect.ts +20 -0
  405. package/src/effects/useResizeEffect.ts +92 -0
  406. package/src/effects/useSelectionEffect.ts +68 -0
  407. package/src/effects/useTranslateEffect.ts +59 -0
  408. package/src/effects/useViewportEffect.ts +29 -0
  409. package/src/effects/useWorkspaceEffect.ts +35 -0
  410. package/src/events/cursor/AbstractCursorEvent.ts +62 -0
  411. package/src/events/cursor/DragMoveEvent.ts +6 -0
  412. package/src/events/cursor/DragStartEvent.ts +9 -0
  413. package/src/events/cursor/DragStopEvent.ts +6 -0
  414. package/src/events/cursor/MouseClickEvent.ts +16 -0
  415. package/src/events/cursor/MouseMoveEvent.ts +9 -0
  416. package/src/events/cursor/index.ts +5 -0
  417. package/src/events/history/AbstractHistoryEvent.ts +9 -0
  418. package/src/events/history/HistoryGotoEvent.ts +9 -0
  419. package/src/events/history/HistoryPushEvent.ts +9 -0
  420. package/src/events/history/HistoryRedoEvent.ts +9 -0
  421. package/src/events/history/HistoryUndoEvent.ts +9 -0
  422. package/src/events/history/index.ts +4 -0
  423. package/src/events/index.ts +6 -0
  424. package/src/events/keyboard/AbstractKeyboardEvent.ts +48 -0
  425. package/src/events/keyboard/KeyDownEvent.ts +9 -0
  426. package/src/events/keyboard/KeyUpEvent.ts +6 -0
  427. package/src/events/keyboard/index.ts +2 -0
  428. package/src/events/mutation/AbstractMutationNodeEvent.ts +21 -0
  429. package/src/events/mutation/AppendNodeEvent.ts +9 -0
  430. package/src/events/mutation/CloneNodeEvent.ts +9 -0
  431. package/src/events/mutation/DragNodeEvent.ts +9 -0
  432. package/src/events/mutation/DropNodeEvent.ts +9 -0
  433. package/src/events/mutation/FromNodeEvent.ts +19 -0
  434. package/src/events/mutation/HoverNodeEvent.ts +9 -0
  435. package/src/events/mutation/InsertAfterEvent.ts +9 -0
  436. package/src/events/mutation/InsertBeforeEvent.ts +9 -0
  437. package/src/events/mutation/InsertChildrenEvent.ts +9 -0
  438. package/src/events/mutation/PrependNodeEvent.ts +9 -0
  439. package/src/events/mutation/RemoveNodeEvent.ts +9 -0
  440. package/src/events/mutation/SelectNodeEvent.ts +9 -0
  441. package/src/events/mutation/UnSelectNodeEvent.ts +9 -0
  442. package/src/events/mutation/UpdateChildrenEvent.ts +9 -0
  443. package/src/events/mutation/UpdateNodePropsEvent.ts +9 -0
  444. package/src/events/mutation/UserSelectNodeEvent.ts +9 -0
  445. package/src/events/mutation/WrapNodeEvent.ts +9 -0
  446. package/src/events/mutation/index.ts +16 -0
  447. package/src/events/viewport/AbstractViewportEvent.ts +30 -0
  448. package/src/events/viewport/ViewportResizeEvent.ts +9 -0
  449. package/src/events/viewport/ViewportScrollEvent.ts +9 -0
  450. package/src/events/viewport/index.ts +2 -0
  451. package/src/events/workbench/AbstractWorkspaceEvent.ts +10 -0
  452. package/src/events/workbench/AddWorkspaceEvent.ts +8 -0
  453. package/src/events/workbench/RemoveWorkspaceEvent.ts +9 -0
  454. package/src/events/workbench/SwitchWorkspaceEvent.ts +9 -0
  455. package/src/events/workbench/index.ts +3 -0
  456. package/src/exports.ts +5 -0
  457. package/src/externals.ts +87 -0
  458. package/src/index.ts +15 -0
  459. package/src/internals.ts +37 -0
  460. package/src/models/Cursor.ts +198 -0
  461. package/src/models/Engine.ts +108 -0
  462. package/src/models/History.ts +125 -0
  463. package/src/models/Hover.ts +49 -0
  464. package/src/models/Keyboard.ts +126 -0
  465. package/src/models/MoveHelper.ts +383 -0
  466. package/src/models/Operation.ts +91 -0
  467. package/src/models/Screen.ts +83 -0
  468. package/src/models/Selection.ts +177 -0
  469. package/src/models/Shortcut.ts +81 -0
  470. package/src/models/SnapLine.ts +129 -0
  471. package/src/models/SpaceBlock.ts +199 -0
  472. package/src/models/TransformHelper.ts +648 -0
  473. package/src/models/TreeNode.ts +894 -0
  474. package/src/models/Viewport.ts +516 -0
  475. package/src/models/Workbench.ts +120 -0
  476. package/src/models/Workspace.ts +142 -0
  477. package/src/models/index.ts +13 -0
  478. package/src/presets.ts +73 -0
  479. package/src/registry.ts +147 -0
  480. package/src/shortcuts/CursorSwitch.ts +11 -0
  481. package/src/shortcuts/MultiSelection.ts +31 -0
  482. package/src/shortcuts/NodeMutation.ts +49 -0
  483. package/src/shortcuts/QuickSelection.ts +81 -0
  484. package/src/shortcuts/UndoRedo.ts +29 -0
  485. package/src/shortcuts/index.ts +5 -0
  486. package/src/types.ts +185 -0
  487. package/tsconfig.build.json +10 -0
  488. package/tsconfig.json +5 -0
@@ -0,0 +1,894 @@
1
+ import { action, define, observable, toJS } from '@formily/reactive'
2
+ import { uid, isFn, each } from '@sulesky/next-shared'
3
+ import { Operation } from './Operation'
4
+ import {
5
+ InsertBeforeEvent,
6
+ InsertAfterEvent,
7
+ InsertChildrenEvent,
8
+ PrependNodeEvent,
9
+ AppendNodeEvent,
10
+ WrapNodeEvent,
11
+ UpdateChildrenEvent,
12
+ RemoveNodeEvent,
13
+ UpdateNodePropsEvent,
14
+ CloneNodeEvent,
15
+ FromNodeEvent,
16
+ } from '../events'
17
+ import {
18
+ IDesignerControllerProps,
19
+ IDesignerProps,
20
+ IDesignerLocales,
21
+ } from '../types'
22
+ import { GlobalRegistry } from '../registry'
23
+ import { mergeLocales } from '../internals'
24
+
25
+ export interface ITreeNode {
26
+ componentName?: string
27
+ sourceName?: string
28
+ operation?: Operation
29
+ hidden?: boolean
30
+ isSourceNode?: boolean
31
+ id?: string
32
+ props?: Record<string | number | symbol, any>
33
+ children?: ITreeNode[]
34
+ }
35
+
36
+ export interface INodeFinder {
37
+ (node: TreeNode): boolean
38
+ }
39
+
40
+ const TreeNodes = new Map<string, TreeNode>()
41
+
42
+ const CommonDesignerPropsMap = new Map<string, IDesignerControllerProps>()
43
+
44
+ const removeNode = (node: TreeNode) => {
45
+ if (node.parent) {
46
+ node.parent.children = node.parent.children.filter(
47
+ (child) => child !== node,
48
+ )
49
+ }
50
+ }
51
+
52
+ const resetNodesParent = (nodes: TreeNode[], parent: TreeNode) => {
53
+ const resetDepth = (node: TreeNode) => {
54
+ node.depth = node.parent ? node.parent.depth + 1 : 0
55
+ node.children.forEach(resetDepth)
56
+ }
57
+
58
+ const shallowReset = (node: TreeNode) => {
59
+ node.parent = parent
60
+ node.root = parent.root
61
+ resetDepth(node)
62
+ }
63
+
64
+ const deepReset = (node: TreeNode) => {
65
+ shallowReset(node)
66
+ resetNodesParent(node.children, node)
67
+ }
68
+
69
+ return nodes.map((node) => {
70
+ if (node === parent) return node
71
+ if (!parent.isSourceNode) {
72
+ if (node.isSourceNode) {
73
+ node = node.clone(parent)
74
+ resetDepth(node)
75
+ } else if (!node.isRoot && node.isInOperation) {
76
+ node.operation?.selection.remove(node)
77
+ removeNode(node)
78
+ shallowReset(node)
79
+ } else {
80
+ deepReset(node)
81
+ }
82
+ } else {
83
+ deepReset(node)
84
+ }
85
+ if (!TreeNodes.has(node.id)) {
86
+ TreeNodes.set(node.id, node)
87
+ CommonDesignerPropsMap.set(node.componentName, node.designerProps)
88
+ }
89
+ return node
90
+ })
91
+ }
92
+
93
+ const resetParent = (node: TreeNode, parent: TreeNode) => {
94
+ return resetNodesParent([node], parent)[0]
95
+ }
96
+
97
+ const resolveDesignerProps = (
98
+ node: TreeNode,
99
+ props: IDesignerControllerProps,
100
+ ) => {
101
+ if (isFn(props)) return props(node)
102
+ return props
103
+ }
104
+
105
+ export class TreeNode {
106
+ parent: TreeNode
107
+
108
+ root: TreeNode
109
+
110
+ rootOperation: Operation
111
+
112
+ id: string
113
+
114
+ depth = 0
115
+
116
+ hidden = false
117
+
118
+ componentName = 'NO_NAME_COMPONENT'
119
+
120
+ sourceName = ''
121
+
122
+ props: ITreeNode['props'] = {}
123
+
124
+ children: TreeNode[] = []
125
+
126
+ isSelfSourceNode: boolean
127
+
128
+ constructor(node?: ITreeNode, parent?: TreeNode) {
129
+ if (node instanceof TreeNode) {
130
+ return node
131
+ }
132
+ this.id = node.id || uid()
133
+ if (parent) {
134
+ this.parent = parent
135
+ this.depth = parent.depth + 1
136
+ this.root = parent.root
137
+ TreeNodes.set(this.id, this)
138
+ } else {
139
+ this.root = this
140
+ this.rootOperation = node.operation
141
+ this.isSelfSourceNode = node.isSourceNode || false
142
+ TreeNodes.set(this.id, this)
143
+ }
144
+ if (node) {
145
+ this.from(node)
146
+ }
147
+ this.makeObservable()
148
+ }
149
+
150
+ makeObservable() {
151
+ define(this, {
152
+ componentName: observable.ref,
153
+ props: observable,
154
+ hidden: observable.ref,
155
+ children: observable.shallow,
156
+ designerProps: observable.computed,
157
+ designerLocales: observable.computed,
158
+ wrap: action,
159
+ prepend: action,
160
+ append: action,
161
+ insertAfter: action,
162
+ insertBefore: action,
163
+ remove: action,
164
+ setProps: action,
165
+ setChildren: action,
166
+ setComponentName: action,
167
+ })
168
+ }
169
+
170
+ get designerProps(): IDesignerProps {
171
+ const behaviors = GlobalRegistry.getDesignerBehaviors(this)
172
+ const designerProps: IDesignerProps = behaviors.reduce((buf, pattern) => {
173
+ if (!pattern.designerProps) return buf
174
+ Object.assign(buf, resolveDesignerProps(this, pattern.designerProps))
175
+ return buf
176
+ }, {})
177
+ return designerProps
178
+ }
179
+
180
+ get designerLocales(): IDesignerLocales {
181
+ const behaviors = GlobalRegistry.getDesignerBehaviors(this)
182
+ const designerLocales: IDesignerLocales = behaviors.reduce(
183
+ (buf, pattern) => {
184
+ if (!pattern.designerLocales) return buf
185
+ mergeLocales(buf, pattern.designerLocales)
186
+ return buf
187
+ },
188
+ {},
189
+ )
190
+ return designerLocales
191
+ }
192
+
193
+ get previous() {
194
+ if (this.parent === this || !this.parent) return
195
+ return this.parent.children[this.index - 1]
196
+ }
197
+
198
+ get next() {
199
+ if (this.parent === this || !this.parent) return
200
+ return this.parent.children[this.index + 1]
201
+ }
202
+
203
+ get siblings() {
204
+ if (this.parent) {
205
+ return this.parent.children.filter((node) => node !== this)
206
+ }
207
+ return []
208
+ }
209
+
210
+ get index() {
211
+ if (this.parent === this || !this.parent) return 0
212
+ return this.parent.children.indexOf(this)
213
+ }
214
+
215
+ get descendants(): TreeNode[] {
216
+ return this.children.reduce((buf, node) => {
217
+ return buf.concat(node).concat(node.descendants)
218
+ }, [])
219
+ }
220
+
221
+ get isRoot() {
222
+ return this === this.root
223
+ }
224
+
225
+ get isInOperation() {
226
+ return !!this.operation
227
+ }
228
+
229
+ get lastChild() {
230
+ return this.children[this.children.length - 1]
231
+ }
232
+
233
+ get firstChild() {
234
+ return this.children[0]
235
+ }
236
+
237
+ get isSourceNode() {
238
+ return this.root.isSelfSourceNode
239
+ }
240
+
241
+ get operation() {
242
+ return this.root?.rootOperation
243
+ }
244
+
245
+ get viewport() {
246
+ return this.operation?.workspace?.viewport
247
+ }
248
+
249
+ get outline() {
250
+ return this.operation?.workspace?.outline
251
+ }
252
+
253
+ get moveLayout() {
254
+ return this.viewport?.getValidNodeLayout(this)
255
+ }
256
+
257
+ getElement(area: 'viewport' | 'outline' = 'viewport') {
258
+ return this[area]?.findElementById(this.id)
259
+ }
260
+
261
+ getValidElement(area: 'viewport' | 'outline' = 'viewport') {
262
+ return this[area]?.getValidNodeElement(this)
263
+ }
264
+
265
+ getElementRect(area: 'viewport' | 'outline' = 'viewport') {
266
+ return this[area]?.getElementRect(this.getElement(area))
267
+ }
268
+
269
+ getValidElementRect(area: 'viewport' | 'outline' = 'viewport') {
270
+ return this[area]?.getValidNodeRect(this)
271
+ }
272
+
273
+ getElementOffsetRect(area: 'viewport' | 'outline' = 'viewport') {
274
+ return this[area]?.getElementOffsetRect(this.getElement(area))
275
+ }
276
+
277
+ getValidElementOffsetRect(area: 'viewport' | 'outline' = 'viewport') {
278
+ return this[area]?.getValidNodeOffsetRect(this)
279
+ }
280
+
281
+ getPrevious(step = 1) {
282
+ return this.parent.children[this.index - step]
283
+ }
284
+
285
+ getAfter(step = 1) {
286
+ return this.parent.children[this.index + step]
287
+ }
288
+
289
+ getSibling(index = 0) {
290
+ return this.parent.children[index]
291
+ }
292
+
293
+ getParents(node?: TreeNode): TreeNode[] {
294
+ const _node = node || this
295
+ return _node?.parent
296
+ ? [_node.parent].concat(this.getParents(_node.parent))
297
+ : []
298
+ }
299
+
300
+ getParentByDepth(depth = 0) {
301
+ let parent = this.parent
302
+ if (parent?.depth === depth) {
303
+ return parent
304
+ } else {
305
+ return parent?.getParentByDepth(depth)
306
+ }
307
+ }
308
+
309
+ getMessage(token: string) {
310
+ return GlobalRegistry.getDesignerMessage(token, this.designerLocales)
311
+ }
312
+
313
+ isMyAncestor(node: TreeNode) {
314
+ if (node === this || this.parent === node) return false
315
+ return node.contains(this)
316
+ }
317
+
318
+ isMyParent(node: TreeNode) {
319
+ return this.parent === node
320
+ }
321
+
322
+ isMyParents(node: TreeNode) {
323
+ if (node === this) return false
324
+ return this.isMyParent(node) || this.isMyAncestor(node)
325
+ }
326
+
327
+ isMyChild(node: TreeNode) {
328
+ return node.isMyParent(this)
329
+ }
330
+
331
+ isMyChildren(node: TreeNode) {
332
+ return node.isMyParents(this)
333
+ }
334
+
335
+ takeSnapshot(type?: string) {
336
+ this.operation?.snapshot(type)
337
+ }
338
+
339
+ triggerMutation<T>(event: any, callback?: () => T, defaults?: T): T {
340
+ if (this.operation) {
341
+ const result = this.operation.dispatch(event, callback)
342
+ this.takeSnapshot(event?.type)
343
+ return (result ?? defaults) as T
344
+ } else if (isFn(callback)) {
345
+ return callback()
346
+ }
347
+ return defaults as T
348
+ }
349
+
350
+ find(finder: INodeFinder): TreeNode {
351
+ if (finder(this)) {
352
+ return this
353
+ } else {
354
+ let result = undefined
355
+ this.eachChildren((node) => {
356
+ if (finder(node)) {
357
+ result = node
358
+ return false
359
+ }
360
+ })
361
+ return result
362
+ }
363
+ }
364
+
365
+ findAll(finder: INodeFinder): TreeNode[] {
366
+ const results = []
367
+ if (finder(this)) {
368
+ results.push(this)
369
+ }
370
+ this.eachChildren((node) => {
371
+ if (finder(node)) {
372
+ results.push(node)
373
+ }
374
+ })
375
+ return results
376
+ }
377
+
378
+ distanceTo(node: TreeNode) {
379
+ if (this.root !== node.root) {
380
+ return Infinity
381
+ }
382
+ if (this.parent !== node.parent) {
383
+ return Infinity
384
+ }
385
+ return Math.abs(this.index - node.index)
386
+ }
387
+
388
+ crossSiblings(node: TreeNode): TreeNode[] {
389
+ if (this.parent !== node.parent) return []
390
+ const minIndex = Math.min(this.index, node.index)
391
+ const maxIndex = Math.max(this.index, node.index)
392
+ const results = []
393
+ for (let i = minIndex + 1; i < maxIndex; i++) {
394
+ results.push(this.parent.children[i])
395
+ }
396
+ return results
397
+ }
398
+
399
+ allowSibling(nodes: TreeNode[]) {
400
+ if (this.designerProps?.allowSiblings?.(this, nodes) === false) return false
401
+ return this.parent?.allowAppend(nodes)
402
+ }
403
+
404
+ allowDrop(parent: TreeNode) {
405
+ if (!isFn(this.designerProps.allowDrop)) return true
406
+ return this.designerProps.allowDrop(parent)
407
+ }
408
+
409
+ allowAppend(nodes: TreeNode[]) {
410
+ if (!this.designerProps?.droppable) return false
411
+ if (this.designerProps?.allowAppend?.(this, nodes) === false) return false
412
+ if (nodes.some((node) => !node.allowDrop(this))) return false
413
+ if (this.root === this) return true
414
+ return true
415
+ }
416
+
417
+ allowClone() {
418
+ if (this === this.root) return false
419
+ return this.designerProps.cloneable ?? true
420
+ }
421
+
422
+ allowDrag() {
423
+ if (this === this.root && !this.isSourceNode) return false
424
+ return this.designerProps.draggable ?? true
425
+ }
426
+
427
+ allowResize(): false | Array<'x' | 'y'> {
428
+ if (this === this.root && !this.isSourceNode) return false
429
+ const { resizable } = this.designerProps
430
+ if (!resizable) return false
431
+ if (resizable.width && resizable.height) return ['x', 'y']
432
+ if (resizable.width) return ['x']
433
+ return ['y']
434
+ }
435
+
436
+ allowRotate() {}
437
+
438
+ allowRound() {}
439
+
440
+ allowScale() {}
441
+
442
+ allowTranslate(): boolean {
443
+ if (this === this.root && !this.isSourceNode) return false
444
+ const { translatable } = this.designerProps
445
+ if (translatable?.x && translatable?.y) return true
446
+ return false
447
+ }
448
+
449
+ allowDelete() {
450
+ if (this === this.root) return false
451
+ return this.designerProps.deletable ?? true
452
+ }
453
+
454
+ findById(id: string) {
455
+ if (!id) return
456
+ if (this.id === id) return this
457
+ if (this.children?.length > 0) {
458
+ return TreeNodes.get(id)
459
+ }
460
+ }
461
+
462
+ contains(...nodes: TreeNode[]) {
463
+ return nodes.every((node) => {
464
+ if (
465
+ node === this ||
466
+ node?.parent === this ||
467
+ node?.getParentByDepth(this.depth) === this
468
+ ) {
469
+ return true
470
+ }
471
+ return false
472
+ })
473
+ }
474
+
475
+ eachTree(callback?: (node: TreeNode) => void | boolean) {
476
+ if (isFn(callback)) {
477
+ callback(this.root)
478
+ this.root?.eachChildren(callback)
479
+ }
480
+ }
481
+
482
+ eachChildren(callback?: (node: TreeNode) => void | boolean) {
483
+ if (isFn(callback)) {
484
+ for (let i = 0; i < this.children.length; i++) {
485
+ const node = this.children[i]
486
+ if (callback(node) === false) return
487
+ node.eachChildren(callback)
488
+ }
489
+ }
490
+ }
491
+
492
+ resetNodesParent(nodes: TreeNode[], parent: TreeNode) {
493
+ return resetNodesParent(
494
+ nodes.filter((node) => node !== this),
495
+ parent,
496
+ )
497
+ }
498
+
499
+ setProps(props?: any) {
500
+ return this.triggerMutation(
501
+ new UpdateNodePropsEvent({
502
+ target: this,
503
+ source: null,
504
+ }),
505
+ () => {
506
+ Object.assign(this.props, props)
507
+ },
508
+ )
509
+ }
510
+
511
+ setComponentName(componentName: string) {
512
+ this.componentName = componentName
513
+ }
514
+
515
+ prepend(...nodes: TreeNode[]) {
516
+ if (nodes.some((node) => node.contains(this))) return []
517
+ const originSourceParents = nodes.map((node) => node.parent)
518
+ const newNodes = this.resetNodesParent(nodes, this)
519
+ if (!newNodes.length) return []
520
+ return this.triggerMutation(
521
+ new PrependNodeEvent({
522
+ originSourceParents,
523
+ target: this,
524
+ source: newNodes,
525
+ }),
526
+ () => {
527
+ this.children = newNodes.concat(this.children)
528
+ return newNodes
529
+ },
530
+ [],
531
+ )
532
+ }
533
+
534
+ append(...nodes: TreeNode[]) {
535
+ if (nodes.some((node) => node.contains(this))) return []
536
+ const originSourceParents = nodes.map((node) => node.parent)
537
+ const newNodes = this.resetNodesParent(nodes, this)
538
+ if (!newNodes.length) return []
539
+ return this.triggerMutation(
540
+ new AppendNodeEvent({
541
+ originSourceParents,
542
+ target: this,
543
+ source: newNodes,
544
+ }),
545
+ () => {
546
+ this.children = this.children.concat(newNodes)
547
+ return newNodes
548
+ },
549
+ [],
550
+ )
551
+ }
552
+
553
+ wrap(wrapper: TreeNode) {
554
+ if (wrapper === this) return
555
+ const parent = this.parent
556
+ return this.triggerMutation(
557
+ new WrapNodeEvent({
558
+ target: this,
559
+ source: wrapper,
560
+ }),
561
+ () => {
562
+ resetParent(this, wrapper)
563
+ resetParent(wrapper, parent)
564
+ return wrapper
565
+ },
566
+ )
567
+ }
568
+
569
+ insertAfter(...nodes: TreeNode[]) {
570
+ const parent = this.parent
571
+ if (nodes.some((node) => node.contains(this))) return []
572
+ if (parent?.children?.length) {
573
+ const originSourceParents = nodes.map((node) => node.parent)
574
+ const newNodes = this.resetNodesParent(nodes, parent)
575
+ if (!newNodes.length) return []
576
+
577
+ return this.triggerMutation(
578
+ new InsertAfterEvent({
579
+ originSourceParents,
580
+ target: this,
581
+ source: newNodes,
582
+ }),
583
+ () => {
584
+ parent.children = parent.children.reduce((buf, node) => {
585
+ if (node === this) {
586
+ return buf.concat([node]).concat(newNodes)
587
+ } else {
588
+ return buf.concat([node])
589
+ }
590
+ }, [])
591
+ return newNodes
592
+ },
593
+ [],
594
+ )
595
+ }
596
+ return []
597
+ }
598
+
599
+ insertBefore(...nodes: TreeNode[]) {
600
+ const parent = this.parent
601
+ if (nodes.some((node) => node.contains(this))) return []
602
+ if (parent?.children?.length) {
603
+ const originSourceParents = nodes.map((node) => node.parent)
604
+ const newNodes = this.resetNodesParent(nodes, parent)
605
+ if (!newNodes.length) return []
606
+ return this.triggerMutation(
607
+ new InsertBeforeEvent({
608
+ originSourceParents,
609
+ target: this,
610
+ source: newNodes,
611
+ }),
612
+ () => {
613
+ parent.children = parent.children.reduce((buf, node) => {
614
+ if (node === this) {
615
+ return buf.concat(newNodes).concat([node])
616
+ } else {
617
+ return buf.concat([node])
618
+ }
619
+ }, [])
620
+ return newNodes
621
+ },
622
+ [],
623
+ )
624
+ }
625
+ return []
626
+ }
627
+
628
+ insertChildren(start: number, ...nodes: TreeNode[]) {
629
+ if (nodes.some((node) => node.contains(this))) return []
630
+ if (this.children?.length) {
631
+ const originSourceParents = nodes.map((node) => node.parent)
632
+ const newNodes = this.resetNodesParent(nodes, this)
633
+ if (!newNodes.length) return []
634
+ return this.triggerMutation(
635
+ new InsertChildrenEvent({
636
+ originSourceParents,
637
+ target: this,
638
+ source: newNodes,
639
+ }),
640
+ () => {
641
+ this.children = this.children.reduce((buf, node, index) => {
642
+ if (index === start) {
643
+ return buf.concat(newNodes).concat([node])
644
+ }
645
+ return buf.concat([node])
646
+ }, [])
647
+ return newNodes
648
+ },
649
+ [],
650
+ )
651
+ }
652
+ return []
653
+ }
654
+
655
+ setChildren(...nodes: TreeNode[]) {
656
+ const originSourceParents = nodes.map((node) => node.parent)
657
+ const newNodes = this.resetNodesParent(nodes, this)
658
+ return this.triggerMutation(
659
+ new UpdateChildrenEvent({
660
+ originSourceParents,
661
+ target: this,
662
+ source: newNodes,
663
+ }),
664
+ () => {
665
+ this.children = newNodes
666
+ return newNodes
667
+ },
668
+ [],
669
+ )
670
+ }
671
+
672
+ /**
673
+ * @deprecated
674
+ * please use `setChildren`
675
+ */
676
+ setNodeChildren(...nodes: TreeNode[]) {
677
+ return this.setChildren(...nodes)
678
+ }
679
+
680
+ remove() {
681
+ return this.triggerMutation(
682
+ new RemoveNodeEvent({
683
+ target: this,
684
+ source: null,
685
+ }),
686
+ () => {
687
+ removeNode(this)
688
+ TreeNodes.delete(this.id)
689
+ },
690
+ )
691
+ }
692
+
693
+ clone(parent?: TreeNode) {
694
+ const newNode = new TreeNode(
695
+ {
696
+ id: uid(),
697
+ componentName: this.componentName,
698
+ sourceName: this.sourceName,
699
+ props: toJS(this.props),
700
+ children: [],
701
+ },
702
+ parent ? parent : this.parent,
703
+ )
704
+ newNode.children = resetNodesParent(
705
+ this.children.map((child) => {
706
+ return child.clone(newNode)
707
+ }),
708
+ newNode,
709
+ )
710
+ return this.triggerMutation(
711
+ new CloneNodeEvent({
712
+ target: this,
713
+ source: newNode,
714
+ }),
715
+ () => newNode,
716
+ )
717
+ }
718
+
719
+ from(node?: ITreeNode) {
720
+ if (!node) return
721
+ return this.triggerMutation(
722
+ new FromNodeEvent({
723
+ target: this,
724
+ source: node,
725
+ }),
726
+ () => {
727
+ if (node.id && node.id !== this.id) {
728
+ TreeNodes.delete(this.id)
729
+ TreeNodes.set(node.id, this)
730
+ this.id = node.id
731
+ }
732
+ if (node.componentName) {
733
+ this.componentName = node.componentName
734
+ }
735
+ this.props = node.props ?? {}
736
+ if (node.hidden) {
737
+ this.hidden = node.hidden
738
+ }
739
+ if (node.children) {
740
+ this.children =
741
+ node.children?.map?.((node) => {
742
+ return new TreeNode(node, this)
743
+ }) || []
744
+ }
745
+ },
746
+ )
747
+ }
748
+
749
+ serialize(): ITreeNode {
750
+ return {
751
+ id: this.id,
752
+ componentName: this.componentName,
753
+ sourceName: this.sourceName,
754
+ props: toJS(this.props),
755
+ hidden: this.hidden,
756
+ children: this.children.map((treeNode) => {
757
+ return treeNode.serialize()
758
+ }),
759
+ }
760
+ }
761
+
762
+ static create(node: ITreeNode, parent?: TreeNode) {
763
+ return new TreeNode(node, parent)
764
+ }
765
+
766
+ static findById(id: string) {
767
+ return TreeNodes.get(id)
768
+ }
769
+
770
+ static remove(nodes: TreeNode[] = []) {
771
+ for (let i = nodes.length - 1; i >= 0; i--) {
772
+ const node = nodes[i]
773
+ if (node.allowDelete()) {
774
+ const previous = node.previous
775
+ const next = node.next
776
+ node.remove()
777
+ node.operation?.selection.select(
778
+ previous ? previous : next ? next : node.parent,
779
+ )
780
+ node.operation?.hover.clear()
781
+ }
782
+ }
783
+ }
784
+
785
+ static sort(nodes: TreeNode[] = []) {
786
+ return nodes.sort((before, after) => {
787
+ if (before.depth !== after.depth) return 0
788
+ return before.index - after.index >= 0 ? 1 : -1
789
+ })
790
+ }
791
+
792
+ static clone(nodes: TreeNode[] = []) {
793
+ const groups: { [parentId: string]: TreeNode[] } = {}
794
+ const lastGroupNode: { [parentId: string]: TreeNode } = {}
795
+ const filterNestedNode = TreeNode.sort(nodes).filter((node) => {
796
+ return !nodes.some((parent) => {
797
+ return node.isMyParents(parent)
798
+ })
799
+ })
800
+ each(filterNestedNode, (node) => {
801
+ if (node === node.root) return
802
+ if (!node.allowClone()) return
803
+ if (!node?.operation) return
804
+ groups[node?.parent?.id] = groups[node?.parent?.id] || []
805
+ groups[node?.parent?.id].push(node)
806
+ if (lastGroupNode[node?.parent?.id]) {
807
+ if (node.index > lastGroupNode[node?.parent?.id].index) {
808
+ lastGroupNode[node?.parent?.id] = node
809
+ }
810
+ } else {
811
+ lastGroupNode[node?.parent?.id] = node
812
+ }
813
+ })
814
+ const parents = new Map<TreeNode, TreeNode[]>()
815
+ each(groups, (nodes, parentId) => {
816
+ const lastNode = lastGroupNode[parentId]
817
+ let insertPoint = lastNode
818
+ each(nodes, (node) => {
819
+ const cloned = node.clone()
820
+ if (!cloned) return
821
+ if (
822
+ node.operation?.selection.has(node) &&
823
+ insertPoint.parent.allowAppend([cloned])
824
+ ) {
825
+ insertPoint.insertAfter(cloned)
826
+ insertPoint = insertPoint.next
827
+ } else if (node.operation.selection.length === 1) {
828
+ const targetNode = node.operation?.tree.findById(
829
+ node.operation.selection.first,
830
+ )
831
+ let cloneNodes = parents.get(targetNode)
832
+ if (!cloneNodes) {
833
+ cloneNodes = []
834
+ parents.set(targetNode, cloneNodes)
835
+ }
836
+ if (targetNode && targetNode.allowAppend([cloned])) {
837
+ cloneNodes.push(cloned)
838
+ }
839
+ }
840
+ })
841
+ })
842
+ parents.forEach((nodes, target) => {
843
+ if (!nodes.length) return
844
+ target.append(...nodes)
845
+ })
846
+ }
847
+
848
+ static filterResizable(nodes: TreeNode[] = []) {
849
+ return nodes.filter((node) => node.allowResize())
850
+ }
851
+
852
+ static filterRotatable(nodes: TreeNode[] = []) {
853
+ return nodes.filter((node) => node.allowRotate())
854
+ }
855
+
856
+ static filterScalable(nodes: TreeNode[] = []) {
857
+ return nodes.filter((node) => node.allowScale())
858
+ }
859
+
860
+ static filterRoundable(nodes: TreeNode[] = []) {
861
+ return nodes.filter((node) => node.allowRound())
862
+ }
863
+
864
+ static filterTranslatable(nodes: TreeNode[] = []) {
865
+ return nodes.filter((node) => node.allowTranslate())
866
+ }
867
+
868
+ static filterDraggable(nodes: TreeNode[] = []) {
869
+ return nodes.reduce((buf, node) => {
870
+ if (!node.allowDrag()) return buf
871
+ if (isFn(node?.designerProps?.getDragNodes)) {
872
+ const transformed = node.designerProps.getDragNodes(node)
873
+ return transformed ? buf.concat(transformed) : buf
874
+ }
875
+ if (node.componentName === '$$ResourceNode$$')
876
+ return buf.concat(node.children)
877
+ return buf.concat([node])
878
+ }, [])
879
+ }
880
+
881
+ static filterDroppable(nodes: TreeNode[] = [], parent: TreeNode) {
882
+ return nodes.reduce((buf, node) => {
883
+ if (!node.allowDrop(parent)) return buf
884
+ if (isFn(node.designerProps?.getDropNodes)) {
885
+ const cloned = node.isSourceNode ? node.clone(node.parent) : node
886
+ const transformed = node.designerProps.getDropNodes(cloned, parent)
887
+ return transformed ? buf.concat(transformed) : buf
888
+ }
889
+ if (node.componentName === '$$ResourceNode$$')
890
+ return buf.concat(node.children)
891
+ return buf.concat([node])
892
+ }, [])
893
+ }
894
+ }