@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,207 @@
1
+ import { Path } from '@formily/path'
2
+ import { requestIdle, globalThisPolyfill } from '@sulesky/next-shared'
3
+ import { Engine, TreeNode } from '../models'
4
+ import { MouseDoubleClickEvent, MouseClickEvent } from '../events'
5
+
6
+ type GlobalState = {
7
+ activeElements: Map<HTMLInputElement, TreeNode>
8
+ requestTimer: any
9
+ isComposition: boolean
10
+ queue: (() => void)[]
11
+ }
12
+
13
+ function getAllRanges(sel: Selection) {
14
+ const ranges = []
15
+ for (let i = 0; i < sel.rangeCount; i++) {
16
+ const range = sel.getRangeAt(i)
17
+ ranges[i] = {
18
+ collapsed: range.collapsed,
19
+ startOffset: range.startOffset,
20
+ endOffset: range.endOffset,
21
+ }
22
+ }
23
+ return ranges
24
+ }
25
+
26
+ function setEndOfContenteditable(contentEditableElement: Element) {
27
+ const range = document.createRange()
28
+ range.selectNodeContents(contentEditableElement)
29
+ range.collapse(false)
30
+ const selection = globalThisPolyfill.getSelection()
31
+ selection.removeAllRanges()
32
+ selection.addRange(range)
33
+ }
34
+
35
+ function createCaretCache(el: Element) {
36
+ const currentSelection = globalThisPolyfill.getSelection()
37
+ if (currentSelection.containsNode(el)) return
38
+ const ranges = getAllRanges(currentSelection)
39
+ return (offset = 0) => {
40
+ const sel = globalThisPolyfill.getSelection()
41
+ const firstNode = el.childNodes[0]
42
+ if (!firstNode) return
43
+ sel.removeAllRanges()
44
+ ranges.forEach((item) => {
45
+ const range = document.createRange()
46
+ range.collapse(item.collapsed)
47
+ range.setStart(firstNode, item.startOffset + offset)
48
+ range.setEnd(firstNode, item.endOffset + offset)
49
+ sel.addRange(range)
50
+ })
51
+ }
52
+ }
53
+
54
+ export const useContentEditableEffect = (engine: Engine) => {
55
+ const globalState: GlobalState = {
56
+ activeElements: new Map(),
57
+ queue: [],
58
+ requestTimer: null,
59
+ isComposition: false,
60
+ }
61
+
62
+ function onKeyDownHandler(event: KeyboardEvent) {
63
+ if (event.key === 'Enter') {
64
+ event.stopPropagation()
65
+ event.preventDefault()
66
+ }
67
+ }
68
+
69
+ function onInputHandler(event: InputEvent) {
70
+ const node = globalState.activeElements.get(this)
71
+ event.stopPropagation()
72
+ event.preventDefault()
73
+ if (node) {
74
+ const target = event.target as Element
75
+ const handler = () => {
76
+ globalState.queue.length = 0
77
+ if (globalState.isComposition) return
78
+ const restore = createCaretCache(target)
79
+ Path.setIn(
80
+ node.props,
81
+ this.getAttribute(engine.props.contentEditableAttrName),
82
+ target?.textContent
83
+ )
84
+ requestIdle(() => {
85
+ node.takeSnapshot('update:node:props')
86
+ restore()
87
+ })
88
+ }
89
+ globalState.queue.push(handler)
90
+ clearTimeout(globalState.requestTimer)
91
+ globalState.requestTimer = setTimeout(handler, 600)
92
+ }
93
+ }
94
+
95
+ function onSelectionChangeHandler() {
96
+ clearTimeout(globalState.requestTimer)
97
+ globalState.requestTimer = setTimeout(
98
+ globalState.queue[globalState.queue.length - 1],
99
+ 600
100
+ )
101
+ }
102
+
103
+ function onCompositionHandler(event: CompositionEvent) {
104
+ if (event.type === 'compositionend') {
105
+ globalState.isComposition = false
106
+ onInputHandler(event as any)
107
+ } else {
108
+ clearTimeout(globalState.requestTimer)
109
+ globalState.isComposition = true
110
+ }
111
+ }
112
+
113
+ function onPastHandler(event: ClipboardEvent) {
114
+ event.preventDefault()
115
+ const node = globalState.activeElements.get(this)
116
+ const text = event.clipboardData.getData('text')
117
+ const selObj = globalThisPolyfill.getSelection()
118
+ const target = event.target as Element
119
+ const selRange = selObj.getRangeAt(0)
120
+ const restore = createCaretCache(target)
121
+ selRange.deleteContents()
122
+ selRange.insertNode(document.createTextNode(text))
123
+ Path.setIn(
124
+ node.props,
125
+ this.getAttribute(engine.props.contentEditableAttrName),
126
+ target.textContent
127
+ )
128
+ restore(text.length)
129
+ }
130
+
131
+ function findTargetNodeId(element: Element) {
132
+ if (!element) return
133
+ const nodeId = element.getAttribute(
134
+ engine.props.contentEditableNodeIdAttrName
135
+ )
136
+ if (nodeId) return nodeId
137
+ const parent = element.closest(`*[${engine.props.nodeIdAttrName}]`)
138
+ if (parent) return parent.getAttribute(engine.props.nodeIdAttrName)
139
+ }
140
+
141
+ engine.subscribeTo(MouseClickEvent, (event) => {
142
+ const target = event.data.target as Element
143
+ const editableElement = target?.closest?.(
144
+ `*[${engine.props.contentEditableAttrName}]`
145
+ )
146
+ if (
147
+ editableElement &&
148
+ editableElement.getAttribute('contenteditable') === 'true'
149
+ )
150
+ return
151
+ globalState.activeElements.forEach((node, element) => {
152
+ globalState.activeElements.delete(element)
153
+ element.removeAttribute('contenteditable')
154
+ element.removeAttribute('spellcheck')
155
+ element.removeEventListener('input', onInputHandler)
156
+ element.removeEventListener('compositionstart', onCompositionHandler)
157
+ element.removeEventListener('compositionupdate', onCompositionHandler)
158
+ element.removeEventListener('compositionend', onCompositionHandler)
159
+ element.removeEventListener('past', onPastHandler)
160
+ document.removeEventListener('selectionchange', onSelectionChangeHandler)
161
+ })
162
+ })
163
+
164
+ engine.subscribeTo(MouseDoubleClickEvent, (event) => {
165
+ const target = event.data.target as Element
166
+ const editableElement = target?.closest?.(
167
+ `*[${engine.props.contentEditableAttrName}]`
168
+ ) as HTMLInputElement
169
+ const workspace = engine.workbench.activeWorkspace
170
+ const tree = workspace.operation.tree
171
+ if (editableElement) {
172
+ const editable = editableElement.getAttribute('contenteditable')
173
+ if (editable === 'false' || !editable) {
174
+ const nodeId = findTargetNodeId(editableElement)
175
+ if (nodeId) {
176
+ const targetNode = tree.findById(nodeId)
177
+ if (targetNode) {
178
+ globalState.activeElements.set(editableElement, targetNode)
179
+ editableElement.setAttribute('spellcheck', 'false')
180
+ editableElement.setAttribute('contenteditable', 'true')
181
+ editableElement.focus()
182
+ editableElement.addEventListener('input', onInputHandler)
183
+ editableElement.addEventListener(
184
+ 'compositionstart',
185
+ onCompositionHandler
186
+ )
187
+ editableElement.addEventListener(
188
+ 'compositionupdate',
189
+ onCompositionHandler
190
+ )
191
+ editableElement.addEventListener(
192
+ 'compositionend',
193
+ onCompositionHandler
194
+ )
195
+ editableElement.addEventListener('keydown', onKeyDownHandler)
196
+ editableElement.addEventListener('paste', onPastHandler)
197
+ document.addEventListener(
198
+ 'selectionchange',
199
+ onSelectionChangeHandler
200
+ )
201
+ setEndOfContenteditable(editableElement)
202
+ }
203
+ }
204
+ }
205
+ }
206
+ })
207
+ }
@@ -0,0 +1,62 @@
1
+ import { Engine, CursorStatus } from '../models'
2
+ import {
3
+ MouseMoveEvent,
4
+ DragStartEvent,
5
+ DragMoveEvent,
6
+ DragStopEvent,
7
+ } from '../events'
8
+ import { requestIdle } from '@sulesky/next-shared'
9
+
10
+ export const useCursorEffect = (engine: Engine) => {
11
+ engine.subscribeTo(MouseMoveEvent, (event) => {
12
+ engine.cursor.setStatus(
13
+ engine.cursor.status === CursorStatus.Dragging ||
14
+ engine.cursor.status === CursorStatus.DragStart
15
+ ? engine.cursor.status
16
+ : CursorStatus.Normal
17
+ )
18
+ if (engine.cursor.status === CursorStatus.Dragging) return
19
+ engine.cursor.setPosition(event.data)
20
+ })
21
+ engine.subscribeTo(DragStartEvent, (event) => {
22
+ engine.cursor.setStatus(CursorStatus.DragStart)
23
+ engine.cursor.setDragStartPosition(event.data)
24
+ })
25
+ engine.subscribeTo(DragMoveEvent, (event) => {
26
+ engine.cursor.setStatus(CursorStatus.Dragging)
27
+ engine.cursor.setPosition(event.data)
28
+ })
29
+ engine.subscribeTo(DragStopEvent, (event) => {
30
+ engine.cursor.setStatus(CursorStatus.DragStop)
31
+ engine.cursor.setDragEndPosition(event.data)
32
+ engine.cursor.setDragStartPosition(null)
33
+ requestIdle(() => {
34
+ engine.cursor.setStatus(CursorStatus.Normal)
35
+ })
36
+ })
37
+ engine.subscribeTo(MouseMoveEvent, (event) => {
38
+ const currentWorkspace = event?.context?.workspace
39
+ if (!currentWorkspace) return
40
+ const operation = currentWorkspace.operation
41
+ if (engine.cursor.status !== CursorStatus.Normal) {
42
+ operation.hover.clear()
43
+ return
44
+ }
45
+ const target = event.data.target as HTMLElement
46
+ const el = target?.closest?.(`
47
+ *[${engine.props.nodeIdAttrName}],
48
+ *[${engine.props.outlineNodeIdAttrName}]
49
+ `)
50
+ if (!el?.getAttribute) {
51
+ return
52
+ }
53
+ const nodeId = el.getAttribute(engine.props.nodeIdAttrName)
54
+ const outlineNodeId = el.getAttribute(engine.props.outlineNodeIdAttrName)
55
+ const node = operation.tree.findById(nodeId || outlineNodeId)
56
+ if (node) {
57
+ operation.hover.setHover(node)
58
+ } else {
59
+ operation.hover.clear()
60
+ }
61
+ })
62
+ }
@@ -0,0 +1,185 @@
1
+ import {
2
+ Engine,
3
+ ClosestPosition,
4
+ CursorType,
5
+ CursorDragType,
6
+ TreeNode,
7
+ } from '../models'
8
+ import {
9
+ DragStartEvent,
10
+ DragMoveEvent,
11
+ DragStopEvent,
12
+ ViewportScrollEvent,
13
+ } from '../events'
14
+ import { Point } from '@sulesky/next-shared'
15
+
16
+ export const useDragDropEffect = (engine: Engine) => {
17
+ engine.subscribeTo(DragStartEvent, (event) => {
18
+ if (engine.cursor.type !== CursorType.Normal) return
19
+ const target = event.data.target as HTMLElement
20
+ const el = target?.closest(`
21
+ *[${engine.props.nodeIdAttrName}],
22
+ *[${engine.props.sourceIdAttrName}],
23
+ *[${engine.props.outlineNodeIdAttrName}]
24
+ `)
25
+ const handler = target?.closest(
26
+ `*[${engine.props.nodeDragHandlerAttrName}]`
27
+ )
28
+ const helper = handler?.closest(
29
+ `*[${engine.props.nodeSelectionIdAttrName}]`
30
+ )
31
+ if (!el?.getAttribute && !handler) return
32
+ const sourceId = el?.getAttribute(engine.props.sourceIdAttrName)
33
+ const outlineId = el?.getAttribute(engine.props.outlineNodeIdAttrName)
34
+ const handlerId = helper?.getAttribute(engine.props.nodeSelectionIdAttrName)
35
+ const nodeId = el?.getAttribute(engine.props.nodeIdAttrName)
36
+ engine.workbench.eachWorkspace((currentWorkspace) => {
37
+ const operation = currentWorkspace.operation
38
+ const moveHelper = operation.moveHelper
39
+ if (nodeId || outlineId || handlerId) {
40
+ const node = engine.findNodeById(outlineId || nodeId || handlerId)
41
+ if (node) {
42
+ if (!node.allowDrag()) return
43
+ if (node === node.root) return
44
+ const validSelected = engine
45
+ .getAllSelectedNodes()
46
+ .filter((node) => node.allowDrag())
47
+ if (validSelected.some((selectNode) => selectNode === node)) {
48
+ moveHelper.dragStart({ dragNodes: TreeNode.sort(validSelected) })
49
+ } else {
50
+ moveHelper.dragStart({ dragNodes: [node] })
51
+ }
52
+ }
53
+ } else if (sourceId) {
54
+ const sourceNode = engine.findNodeById(sourceId)
55
+ if (sourceNode) {
56
+ moveHelper.dragStart({ dragNodes: [sourceNode] })
57
+ }
58
+ }
59
+ })
60
+ engine.cursor.setStyle('move')
61
+ })
62
+
63
+ engine.subscribeTo(DragMoveEvent, (event) => {
64
+ if (engine.cursor.type !== CursorType.Normal) return
65
+ if (engine.cursor.dragType !== CursorDragType.Move) return
66
+ const target = event.data.target as HTMLElement
67
+ const el = target?.closest(`
68
+ *[${engine.props.nodeIdAttrName}],
69
+ *[${engine.props.outlineNodeIdAttrName}]
70
+ `)
71
+ const point = new Point(event.data.topClientX, event.data.topClientY)
72
+ const nodeId = el?.getAttribute(engine.props.nodeIdAttrName)
73
+ const outlineId = el?.getAttribute(engine.props.outlineNodeIdAttrName)
74
+ engine.workbench.eachWorkspace((currentWorkspace) => {
75
+ const operation = currentWorkspace.operation
76
+ const moveHelper = operation.moveHelper
77
+ const dragNodes = moveHelper.dragNodes
78
+ const tree = operation.tree
79
+ if (!dragNodes.length) return
80
+ const touchNode = tree.findById(outlineId || nodeId)
81
+ moveHelper.dragMove({
82
+ point,
83
+ touchNode,
84
+ })
85
+ })
86
+ })
87
+
88
+ engine.subscribeTo(ViewportScrollEvent, (event) => {
89
+ if (engine.cursor.type !== CursorType.Normal) return
90
+ if (engine.cursor.dragType !== CursorDragType.Move) return
91
+ const point = new Point(
92
+ engine.cursor.position.topClientX,
93
+ engine.cursor.position.topClientY
94
+ )
95
+ const currentWorkspace =
96
+ event?.context?.workspace ?? engine.workbench.activeWorkspace
97
+ if (!currentWorkspace) return
98
+ const operation = currentWorkspace.operation
99
+ const moveHelper = operation.moveHelper
100
+ if (!moveHelper.dragNodes.length) return
101
+ const tree = operation.tree
102
+ const viewport = currentWorkspace.viewport
103
+ const outline = currentWorkspace.outline
104
+ const viewportTarget = viewport.elementFromPoint(point)
105
+ const outlineTarget = outline.elementFromPoint(point)
106
+ const viewportNodeElement = viewportTarget?.closest(`
107
+ *[${engine.props.nodeIdAttrName}],
108
+ *[${engine.props.outlineNodeIdAttrName}]
109
+ `)
110
+ const outlineNodeElement = outlineTarget?.closest(`
111
+ *[${engine.props.nodeIdAttrName}],
112
+ *[${engine.props.outlineNodeIdAttrName}]
113
+ `)
114
+ const nodeId = viewportNodeElement?.getAttribute(
115
+ engine.props.nodeIdAttrName
116
+ )
117
+ const outlineNodeId = outlineNodeElement?.getAttribute(
118
+ engine.props.outlineNodeIdAttrName
119
+ )
120
+ const touchNode = tree.findById(outlineNodeId || nodeId)
121
+ moveHelper.dragMove({ point, touchNode })
122
+ })
123
+
124
+ engine.subscribeTo(DragStopEvent, () => {
125
+ if (engine.cursor.type !== CursorType.Normal) return
126
+ if (engine.cursor.dragType !== CursorDragType.Move) return
127
+ engine.workbench.eachWorkspace((currentWorkspace) => {
128
+ const operation = currentWorkspace.operation
129
+ const moveHelper = operation.moveHelper
130
+ const dragNodes = moveHelper.dragNodes
131
+ const closestNode = moveHelper.closestNode
132
+ const closestDirection = moveHelper.closestDirection
133
+ const selection = operation.selection
134
+ if (!dragNodes.length) return
135
+ if (dragNodes.length && closestNode && closestDirection) {
136
+ if (
137
+ closestDirection === ClosestPosition.After ||
138
+ closestDirection === ClosestPosition.Under
139
+ ) {
140
+ if (closestNode.allowSibling(dragNodes)) {
141
+ selection.batchSafeSelect(
142
+ closestNode.insertAfter(
143
+ ...TreeNode.filterDroppable(dragNodes, closestNode.parent)
144
+ )
145
+ )
146
+ }
147
+ } else if (
148
+ closestDirection === ClosestPosition.Before ||
149
+ closestDirection === ClosestPosition.Upper
150
+ ) {
151
+ if (closestNode.allowSibling(dragNodes)) {
152
+ selection.batchSafeSelect(
153
+ closestNode.insertBefore(
154
+ ...TreeNode.filterDroppable(dragNodes, closestNode.parent)
155
+ )
156
+ )
157
+ }
158
+ } else if (
159
+ closestDirection === ClosestPosition.Inner ||
160
+ closestDirection === ClosestPosition.InnerAfter
161
+ ) {
162
+ if (closestNode.allowAppend(dragNodes)) {
163
+ selection.batchSafeSelect(
164
+ closestNode.append(
165
+ ...TreeNode.filterDroppable(dragNodes, closestNode)
166
+ )
167
+ )
168
+ moveHelper.dragDrop({ dropNode: closestNode })
169
+ }
170
+ } else if (closestDirection === ClosestPosition.InnerBefore) {
171
+ if (closestNode.allowAppend(dragNodes)) {
172
+ selection.batchSafeSelect(
173
+ closestNode.prepend(
174
+ ...TreeNode.filterDroppable(dragNodes, closestNode)
175
+ )
176
+ )
177
+ moveHelper.dragDrop({ dropNode: closestNode })
178
+ }
179
+ }
180
+ }
181
+ moveHelper.dragEnd()
182
+ })
183
+ engine.cursor.setStyle('')
184
+ })
185
+ }
@@ -0,0 +1,66 @@
1
+ import { DragStopEvent } from '../events'
2
+ import { Engine, CursorType, TreeNode, CursorDragType } from '../models'
3
+ import {
4
+ calcRectByStartEndPoint,
5
+ isCrossRectInRect,
6
+ isRectInRect,
7
+ Point,
8
+ Rect,
9
+ } from '@sulesky/next-shared'
10
+
11
+ export const useFreeSelectionEffect = (engine: Engine) => {
12
+ engine.subscribeTo(DragStopEvent, (event) => {
13
+ if (engine.cursor.dragType !== CursorDragType.Move) {
14
+ return
15
+ }
16
+ engine.workbench.eachWorkspace((workspace) => {
17
+ const viewport = workspace.viewport
18
+ const dragEndPoint = new Point(
19
+ event.data.topClientX,
20
+ event.data.topClientY,
21
+ )
22
+ const dragStartOffsetPoint = viewport.getOffsetPoint(
23
+ new Point(
24
+ engine.cursor.dragStartPosition.topClientX,
25
+ engine.cursor.dragStartPosition.topClientY,
26
+ ),
27
+ )
28
+ const dragEndOffsetPoint = viewport.getOffsetPoint(
29
+ new Point(
30
+ engine.cursor.position.topClientX,
31
+ engine.cursor.position.topClientY,
32
+ ),
33
+ )
34
+ if (!viewport.isPointInViewport(dragEndPoint, false)) return
35
+ const tree = workspace.operation.tree
36
+ const selectionRect = calcRectByStartEndPoint(
37
+ dragStartOffsetPoint,
38
+ dragEndOffsetPoint,
39
+ viewport.dragScrollXDelta,
40
+ viewport.dragScrollYDelta,
41
+ )
42
+ const selected: [TreeNode, Rect][] = []
43
+ tree.eachChildren((node) => {
44
+ const nodeRect = viewport.getValidNodeOffsetRect(node)
45
+ if (nodeRect && isCrossRectInRect(selectionRect, nodeRect)) {
46
+ selected.push([node, nodeRect])
47
+ }
48
+ })
49
+ const selectedNodes: TreeNode[] = selected.reduce(
50
+ (buf, [node, nodeRect]) => {
51
+ if (isRectInRect(nodeRect, selectionRect)) {
52
+ if (selected.some(([selectNode]) => selectNode.isMyParents(node))) {
53
+ return buf
54
+ }
55
+ }
56
+ return buf.concat(node)
57
+ },
58
+ [],
59
+ )
60
+ workspace.operation.selection.batchSafeSelect(selectedNodes)
61
+ })
62
+ if (engine.cursor.type === CursorType.Selection) {
63
+ engine.cursor.setType(CursorType.Normal)
64
+ }
65
+ })
66
+ }
@@ -0,0 +1,20 @@
1
+ import { Engine } from '../models'
2
+ import { KeyDownEvent, KeyUpEvent } from '../events'
3
+
4
+ export const useKeyboardEffect = (engine: Engine) => {
5
+ engine.subscribeTo(KeyDownEvent, (event) => {
6
+ const keyboard = engine.keyboard
7
+ if (!keyboard) return
8
+ const workspace =
9
+ engine.workbench.activeWorkspace || engine.workbench.currentWorkspace
10
+ keyboard.handleKeyboard(event, workspace.getEventContext())
11
+ })
12
+
13
+ engine.subscribeTo(KeyUpEvent, (event) => {
14
+ const keyboard = engine.keyboard
15
+ if (!keyboard) return
16
+ const workspace =
17
+ engine.workbench.activeWorkspace || engine.workbench.currentWorkspace
18
+ keyboard.handleKeyboard(event, workspace.getEventContext())
19
+ })
20
+ }
@@ -0,0 +1,92 @@
1
+ import { Engine, CursorDragType } from '../models'
2
+ import { DragStartEvent, DragMoveEvent, DragStopEvent } from '../events'
3
+
4
+ export const useResizeEffect = (engine: Engine) => {
5
+ const findStartNodeHandler = (target: HTMLElement) => {
6
+ const handler = target?.closest(
7
+ `*[${engine.props.nodeResizeHandlerAttrName}]`
8
+ )
9
+ if (handler) {
10
+ const direction = handler.getAttribute(
11
+ engine.props.nodeResizeHandlerAttrName
12
+ )
13
+ if (direction) {
14
+ const element = handler.closest(
15
+ `*[${engine.props.nodeSelectionIdAttrName}]`
16
+ )
17
+ if (element) {
18
+ const nodeId = element.getAttribute(
19
+ engine.props.nodeSelectionIdAttrName
20
+ )
21
+ if (nodeId) {
22
+ const node = engine.findNodeById(nodeId)
23
+ if (node) {
24
+ return { direction, node, element }
25
+ }
26
+ }
27
+ }
28
+ }
29
+ }
30
+ return
31
+ }
32
+
33
+ engine.subscribeTo(DragStartEvent, (event) => {
34
+ const target = event.data.target as HTMLElement
35
+ const currentWorkspace =
36
+ event.context?.workspace ?? engine.workbench.activeWorkspace
37
+ if (!currentWorkspace) return
38
+ const handler = findStartNodeHandler(target)
39
+ const helper = currentWorkspace.operation.transformHelper
40
+ if (handler) {
41
+ const selectionElement = handler.element.closest(
42
+ `*[${engine.props.nodeSelectionIdAttrName}]`
43
+ ) as HTMLElement
44
+ if (selectionElement) {
45
+ const nodeId = selectionElement.getAttribute(
46
+ engine.props.nodeSelectionIdAttrName
47
+ )
48
+ if (nodeId) {
49
+ const node = engine.findNodeById(nodeId)
50
+ if (node) {
51
+ helper.dragStart({
52
+ dragNodes: [node],
53
+ type: 'resize',
54
+ direction: handler.direction,
55
+ })
56
+ }
57
+ }
58
+ }
59
+ }
60
+ })
61
+
62
+ engine.subscribeTo(DragMoveEvent, (event) => {
63
+ if (engine.cursor.dragType !== CursorDragType.Resize) return
64
+ const currentWorkspace =
65
+ event.context?.workspace ?? engine.workbench.activeWorkspace
66
+ const helper = currentWorkspace?.operation.transformHelper
67
+ const dragNodes = helper.dragNodes
68
+ if (!dragNodes.length) return
69
+ helper.dragMove()
70
+ dragNodes.forEach((node) => {
71
+ const element = node.getElement()
72
+ helper.resize(node, (rect) => {
73
+ element.style.width = rect.width + 'px'
74
+ element.style.height = rect.height + 'px'
75
+ element.style.position = 'absolute'
76
+ element.style.left = '0px'
77
+ element.style.top = '0px'
78
+ element.style.transform = `translate3d(${rect.x}px,${rect.y}px,0)`
79
+ })
80
+ })
81
+ })
82
+
83
+ engine.subscribeTo(DragStopEvent, (event) => {
84
+ if (engine.cursor.dragType !== CursorDragType.Resize) return
85
+ const currentWorkspace =
86
+ event.context?.workspace ?? engine.workbench.activeWorkspace
87
+ const helper = currentWorkspace?.operation.transformHelper
88
+ if (helper) {
89
+ helper.dragEnd()
90
+ }
91
+ })
92
+ }
@@ -0,0 +1,68 @@
1
+ import { Engine, CursorStatus } from '../models'
2
+ import { MouseClickEvent } from '../events'
3
+ import { KeyCode, Point } from '@sulesky/next-shared'
4
+
5
+ export const useSelectionEffect = (engine: Engine) => {
6
+ engine.subscribeTo(MouseClickEvent, (event) => {
7
+ if (engine.cursor.status !== CursorStatus.Normal) return
8
+ const target: HTMLElement = event.data.target as any
9
+ const el = target?.closest?.(`
10
+ *[${engine.props.nodeIdAttrName}],
11
+ *[${engine.props.outlineNodeIdAttrName}]
12
+ `)
13
+ const isHelpers = target?.closest?.(
14
+ `*[${engine.props.nodeSelectionIdAttrName}]`
15
+ )
16
+ const currentWorkspace =
17
+ event.context?.workspace ?? engine.workbench.activeWorkspace
18
+ if (!currentWorkspace) return
19
+ if (!el?.getAttribute) {
20
+ const point = new Point(event.data.topClientX, event.data.topClientY)
21
+ const operation = currentWorkspace.operation
22
+ const viewport = currentWorkspace.viewport
23
+ const outline = currentWorkspace.outline
24
+ const isInViewport = viewport.isPointInViewport(point, false)
25
+ const isInOutline = outline.isPointInViewport(point, false)
26
+ if (isHelpers) return
27
+ if (isInViewport || isInOutline) {
28
+ const selection = operation.selection
29
+ const tree = operation.tree
30
+ selection.select(tree)
31
+ }
32
+ return
33
+ }
34
+ const nodeId = el.getAttribute(engine.props.nodeIdAttrName)
35
+ const structNodeId = el.getAttribute(engine.props.outlineNodeIdAttrName)
36
+ const operation = currentWorkspace.operation
37
+ const selection = operation.selection
38
+ const tree = operation.tree
39
+ const node = tree.findById(nodeId || structNodeId)
40
+ if (node) {
41
+ engine.keyboard.requestClean()
42
+ if (
43
+ engine.keyboard.isKeyDown(KeyCode.Meta) ||
44
+ engine.keyboard.isKeyDown(KeyCode.Control)
45
+ ) {
46
+ if (selection.has(node)) {
47
+ if (selection.selected.length > 1) {
48
+ selection.remove(node)
49
+ }
50
+ } else {
51
+ selection.add(node)
52
+ }
53
+ } else if (engine.keyboard.isKeyDown(KeyCode.Shift)) {
54
+ if (selection.has(node)) {
55
+ if (selection.selected.length > 1) {
56
+ selection.remove(node)
57
+ }
58
+ } else {
59
+ selection.crossAddTo(node)
60
+ }
61
+ } else {
62
+ selection.select(node)
63
+ }
64
+ } else {
65
+ selection.select(tree)
66
+ }
67
+ })
68
+ }