@oh-just-another/state 0.57.0

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 (269) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE +21 -0
  3. package/README.md +60 -0
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/actions/actionClipboard.d.ts +6 -0
  6. package/dist/actions/actionClipboard.d.ts.map +1 -0
  7. package/dist/actions/actionClipboard.js +26 -0
  8. package/dist/actions/actionClipboard.js.map +1 -0
  9. package/dist/actions/actionGrouping.d.ts +5 -0
  10. package/dist/actions/actionGrouping.d.ts.map +1 -0
  11. package/dist/actions/actionGrouping.js +26 -0
  12. package/dist/actions/actionGrouping.js.map +1 -0
  13. package/dist/actions/actionHistory.d.ts +5 -0
  14. package/dist/actions/actionHistory.d.ts.map +1 -0
  15. package/dist/actions/actionHistory.js +25 -0
  16. package/dist/actions/actionHistory.js.map +1 -0
  17. package/dist/actions/actionKeyboard.d.ts +3 -0
  18. package/dist/actions/actionKeyboard.d.ts.map +1 -0
  19. package/dist/actions/actionKeyboard.js +130 -0
  20. package/dist/actions/actionKeyboard.js.map +1 -0
  21. package/dist/actions/actionLayout.d.ts +3 -0
  22. package/dist/actions/actionLayout.d.ts.map +1 -0
  23. package/dist/actions/actionLayout.js +65 -0
  24. package/dist/actions/actionLayout.js.map +1 -0
  25. package/dist/actions/actionMode.d.ts +13 -0
  26. package/dist/actions/actionMode.d.ts.map +1 -0
  27. package/dist/actions/actionMode.js +116 -0
  28. package/dist/actions/actionMode.js.map +1 -0
  29. package/dist/actions/actionSelection.d.ts +9 -0
  30. package/dist/actions/actionSelection.d.ts.map +1 -0
  31. package/dist/actions/actionSelection.js +57 -0
  32. package/dist/actions/actionSelection.js.map +1 -0
  33. package/dist/actions/actionView.d.ts +7 -0
  34. package/dist/actions/actionView.d.ts.map +1 -0
  35. package/dist/actions/actionView.js +14 -0
  36. package/dist/actions/actionView.js.map +1 -0
  37. package/dist/actions/actionZOrder.d.ts +7 -0
  38. package/dist/actions/actionZOrder.d.ts.map +1 -0
  39. package/dist/actions/actionZOrder.js +42 -0
  40. package/dist/actions/actionZOrder.js.map +1 -0
  41. package/dist/actions/actionZoom.d.ts +8 -0
  42. package/dist/actions/actionZoom.d.ts.map +1 -0
  43. package/dist/actions/actionZoom.js +61 -0
  44. package/dist/actions/actionZoom.js.map +1 -0
  45. package/dist/actions/index.d.ts +12 -0
  46. package/dist/actions/index.d.ts.map +1 -0
  47. package/dist/actions/index.js +11 -0
  48. package/dist/actions/index.js.map +1 -0
  49. package/dist/actions/registry.d.ts +68 -0
  50. package/dist/actions/registry.d.ts.map +1 -0
  51. package/dist/actions/registry.js +300 -0
  52. package/dist/actions/registry.js.map +1 -0
  53. package/dist/actions/types.d.ts +103 -0
  54. package/dist/actions/types.d.ts.map +1 -0
  55. package/dist/actions/types.js +10 -0
  56. package/dist/actions/types.js.map +1 -0
  57. package/dist/animation-tick.d.ts +28 -0
  58. package/dist/animation-tick.d.ts.map +1 -0
  59. package/dist/animation-tick.js +50 -0
  60. package/dist/animation-tick.js.map +1 -0
  61. package/dist/auto-compact.d.ts +27 -0
  62. package/dist/auto-compact.d.ts.map +1 -0
  63. package/dist/auto-compact.js +46 -0
  64. package/dist/auto-compact.js.map +1 -0
  65. package/dist/auto-layout-scheduler.d.ts +50 -0
  66. package/dist/auto-layout-scheduler.d.ts.map +1 -0
  67. package/dist/auto-layout-scheduler.js +94 -0
  68. package/dist/auto-layout-scheduler.js.map +1 -0
  69. package/dist/built-in-handlers.d.ts +24 -0
  70. package/dist/built-in-handlers.d.ts.map +1 -0
  71. package/dist/built-in-handlers.js +210 -0
  72. package/dist/built-in-handlers.js.map +1 -0
  73. package/dist/clipboard.d.ts +51 -0
  74. package/dist/clipboard.d.ts.map +1 -0
  75. package/dist/clipboard.js +105 -0
  76. package/dist/clipboard.js.map +1 -0
  77. package/dist/constants.d.ts +544 -0
  78. package/dist/constants.d.ts.map +1 -0
  79. package/dist/constants.js +537 -0
  80. package/dist/constants.js.map +1 -0
  81. package/dist/dom-events.d.ts +13 -0
  82. package/dist/dom-events.d.ts.map +1 -0
  83. package/dist/dom-events.js +70 -0
  84. package/dist/dom-events.js.map +1 -0
  85. package/dist/editor/anchor-points.d.ts +22 -0
  86. package/dist/editor/anchor-points.d.ts.map +1 -0
  87. package/dist/editor/anchor-points.js +28 -0
  88. package/dist/editor/anchor-points.js.map +1 -0
  89. package/dist/editor/applies/create.d.ts +60 -0
  90. package/dist/editor/applies/create.d.ts.map +1 -0
  91. package/dist/editor/applies/create.js +107 -0
  92. package/dist/editor/applies/create.js.map +1 -0
  93. package/dist/editor/applies/edge.d.ts +32 -0
  94. package/dist/editor/applies/edge.d.ts.map +1 -0
  95. package/dist/editor/applies/edge.js +44 -0
  96. package/dist/editor/applies/edge.js.map +1 -0
  97. package/dist/editor/applies/link-move.d.ts +53 -0
  98. package/dist/editor/applies/link-move.d.ts.map +1 -0
  99. package/dist/editor/applies/link-move.js +160 -0
  100. package/dist/editor/applies/link-move.js.map +1 -0
  101. package/dist/editor/applies/move.d.ts +38 -0
  102. package/dist/editor/applies/move.d.ts.map +1 -0
  103. package/dist/editor/applies/move.js +83 -0
  104. package/dist/editor/applies/move.js.map +1 -0
  105. package/dist/editor/applies/resize.d.ts +68 -0
  106. package/dist/editor/applies/resize.d.ts.map +1 -0
  107. package/dist/editor/applies/resize.js +199 -0
  108. package/dist/editor/applies/resize.js.map +1 -0
  109. package/dist/editor/applies/selection.d.ts +34 -0
  110. package/dist/editor/applies/selection.d.ts.map +1 -0
  111. package/dist/editor/applies/selection.js +65 -0
  112. package/dist/editor/applies/selection.js.map +1 -0
  113. package/dist/editor/applies/snap-grid.d.ts +45 -0
  114. package/dist/editor/applies/snap-grid.d.ts.map +1 -0
  115. package/dist/editor/applies/snap-grid.js +90 -0
  116. package/dist/editor/applies/snap-grid.js.map +1 -0
  117. package/dist/editor/container-ops.d.ts +74 -0
  118. package/dist/editor/container-ops.d.ts.map +1 -0
  119. package/dist/editor/container-ops.js +262 -0
  120. package/dist/editor/container-ops.js.map +1 -0
  121. package/dist/editor/event-fanout.d.ts +48 -0
  122. package/dist/editor/event-fanout.d.ts.map +1 -0
  123. package/dist/editor/event-fanout.js +53 -0
  124. package/dist/editor/event-fanout.js.map +1 -0
  125. package/dist/editor/gesture-tx.d.ts +77 -0
  126. package/dist/editor/gesture-tx.d.ts.map +1 -0
  127. package/dist/editor/gesture-tx.js +93 -0
  128. package/dist/editor/gesture-tx.js.map +1 -0
  129. package/dist/editor/hit-test.d.ts +178 -0
  130. package/dist/editor/hit-test.d.ts.map +1 -0
  131. package/dist/editor/hit-test.js +460 -0
  132. package/dist/editor/hit-test.js.map +1 -0
  133. package/dist/editor/long-press.d.ts +34 -0
  134. package/dist/editor/long-press.d.ts.map +1 -0
  135. package/dist/editor/long-press.js +58 -0
  136. package/dist/editor/long-press.js.map +1 -0
  137. package/dist/editor/pinch.d.ts +37 -0
  138. package/dist/editor/pinch.d.ts.map +1 -0
  139. package/dist/editor/pinch.js +90 -0
  140. package/dist/editor/pinch.js.map +1 -0
  141. package/dist/editor/pointer-binding.d.ts +18 -0
  142. package/dist/editor/pointer-binding.d.ts.map +1 -0
  143. package/dist/editor/pointer-binding.js +1087 -0
  144. package/dist/editor/pointer-binding.js.map +1 -0
  145. package/dist/editor/public/annotations.d.ts +54 -0
  146. package/dist/editor/public/annotations.d.ts.map +1 -0
  147. package/dist/editor/public/annotations.js +106 -0
  148. package/dist/editor/public/annotations.js.map +1 -0
  149. package/dist/editor/public/arrange-group.d.ts +81 -0
  150. package/dist/editor/public/arrange-group.d.ts.map +1 -0
  151. package/dist/editor/public/arrange-group.js +193 -0
  152. package/dist/editor/public/arrange-group.js.map +1 -0
  153. package/dist/editor/public/brush.d.ts +33 -0
  154. package/dist/editor/public/brush.d.ts.map +1 -0
  155. package/dist/editor/public/brush.js +54 -0
  156. package/dist/editor/public/brush.js.map +1 -0
  157. package/dist/editor/public/clipboard.d.ts +31 -0
  158. package/dist/editor/public/clipboard.d.ts.map +1 -0
  159. package/dist/editor/public/clipboard.js +35 -0
  160. package/dist/editor/public/clipboard.js.map +1 -0
  161. package/dist/editor/public/image-insert.d.ts +30 -0
  162. package/dist/editor/public/image-insert.d.ts.map +1 -0
  163. package/dist/editor/public/image-insert.js +57 -0
  164. package/dist/editor/public/image-insert.js.map +1 -0
  165. package/dist/editor/public/layers.d.ts +56 -0
  166. package/dist/editor/public/layers.d.ts.map +1 -0
  167. package/dist/editor/public/layers.js +104 -0
  168. package/dist/editor/public/layers.js.map +1 -0
  169. package/dist/editor/public/link.d.ts +25 -0
  170. package/dist/editor/public/link.d.ts.map +1 -0
  171. package/dist/editor/public/link.js +74 -0
  172. package/dist/editor/public/link.js.map +1 -0
  173. package/dist/editor/public/placement.d.ts +60 -0
  174. package/dist/editor/public/placement.d.ts.map +1 -0
  175. package/dist/editor/public/placement.js +111 -0
  176. package/dist/editor/public/placement.js.map +1 -0
  177. package/dist/editor/public/selection-ops.d.ts +78 -0
  178. package/dist/editor/public/selection-ops.d.ts.map +1 -0
  179. package/dist/editor/public/selection-ops.js +226 -0
  180. package/dist/editor/public/selection-ops.js.map +1 -0
  181. package/dist/editor/public/text-edit.d.ts +17 -0
  182. package/dist/editor/public/text-edit.d.ts.map +1 -0
  183. package/dist/editor/public/text-edit.js +28 -0
  184. package/dist/editor/public/text-edit.js.map +1 -0
  185. package/dist/editor/public/z-order.d.ts +47 -0
  186. package/dist/editor/public/z-order.d.ts.map +1 -0
  187. package/dist/editor/public/z-order.js +151 -0
  188. package/dist/editor/public/z-order.js.map +1 -0
  189. package/dist/editor/public/zoom-pan.d.ts +44 -0
  190. package/dist/editor/public/zoom-pan.d.ts.map +1 -0
  191. package/dist/editor/public/zoom-pan.js +116 -0
  192. package/dist/editor/public/zoom-pan.js.map +1 -0
  193. package/dist/editor/render-orchestrator.d.ts +11 -0
  194. package/dist/editor/render-orchestrator.d.ts.map +1 -0
  195. package/dist/editor/render-orchestrator.js +473 -0
  196. package/dist/editor/render-orchestrator.js.map +1 -0
  197. package/dist/editor/resize-helpers.d.ts +30 -0
  198. package/dist/editor/resize-helpers.d.ts.map +1 -0
  199. package/dist/editor/resize-helpers.js +121 -0
  200. package/dist/editor/resize-helpers.js.map +1 -0
  201. package/dist/editor/shape-filters.d.ts +11 -0
  202. package/dist/editor/shape-filters.d.ts.map +1 -0
  203. package/dist/editor/shape-filters.js +19 -0
  204. package/dist/editor/shape-filters.js.map +1 -0
  205. package/dist/editor/shape-traits.d.ts +16 -0
  206. package/dist/editor/shape-traits.d.ts.map +1 -0
  207. package/dist/editor/shape-traits.js +29 -0
  208. package/dist/editor/shape-traits.js.map +1 -0
  209. package/dist/editor/viewport-helpers.d.ts +24 -0
  210. package/dist/editor/viewport-helpers.d.ts.map +1 -0
  211. package/dist/editor/viewport-helpers.js +63 -0
  212. package/dist/editor/viewport-helpers.js.map +1 -0
  213. package/dist/editor-events.d.ts +33 -0
  214. package/dist/editor-events.d.ts.map +1 -0
  215. package/dist/editor-events.js +2 -0
  216. package/dist/editor-events.js.map +1 -0
  217. package/dist/editor.d.ts +1841 -0
  218. package/dist/editor.d.ts.map +1 -0
  219. package/dist/editor.js +4803 -0
  220. package/dist/editor.js.map +1 -0
  221. package/dist/file-drop.d.ts +99 -0
  222. package/dist/file-drop.d.ts.map +1 -0
  223. package/dist/file-drop.js +198 -0
  224. package/dist/file-drop.js.map +1 -0
  225. package/dist/frame-helpers.d.ts +30 -0
  226. package/dist/frame-helpers.d.ts.map +1 -0
  227. package/dist/frame-helpers.js +105 -0
  228. package/dist/frame-helpers.js.map +1 -0
  229. package/dist/group-helpers.d.ts +39 -0
  230. package/dist/group-helpers.d.ts.map +1 -0
  231. package/dist/group-helpers.js +116 -0
  232. package/dist/group-helpers.js.map +1 -0
  233. package/dist/handle.d.ts +73 -0
  234. package/dist/handle.d.ts.map +1 -0
  235. package/dist/handle.js +184 -0
  236. package/dist/handle.js.map +1 -0
  237. package/dist/index.d.ts +26 -0
  238. package/dist/index.d.ts.map +1 -0
  239. package/dist/index.js +16 -0
  240. package/dist/index.js.map +1 -0
  241. package/dist/interactive.d.ts +21 -0
  242. package/dist/interactive.d.ts.map +1 -0
  243. package/dist/interactive.js +11 -0
  244. package/dist/interactive.js.map +1 -0
  245. package/dist/link-selection.d.ts +21 -0
  246. package/dist/link-selection.d.ts.map +1 -0
  247. package/dist/link-selection.js +37 -0
  248. package/dist/link-selection.js.map +1 -0
  249. package/dist/machine.d.ts +322 -0
  250. package/dist/machine.d.ts.map +1 -0
  251. package/dist/machine.js +568 -0
  252. package/dist/machine.js.map +1 -0
  253. package/dist/modes.d.ts +24 -0
  254. package/dist/modes.d.ts.map +1 -0
  255. package/dist/modes.js +2 -0
  256. package/dist/modes.js.map +1 -0
  257. package/dist/overlay.d.ts +262 -0
  258. package/dist/overlay.d.ts.map +1 -0
  259. package/dist/overlay.js +673 -0
  260. package/dist/overlay.js.map +1 -0
  261. package/dist/platform.d.ts +70 -0
  262. package/dist/platform.d.ts.map +1 -0
  263. package/dist/platform.js +115 -0
  264. package/dist/platform.js.map +1 -0
  265. package/dist/selection.d.ts +18 -0
  266. package/dist/selection.d.ts.map +1 -0
  267. package/dist/selection.js +31 -0
  268. package/dist/selection.js.map +1 -0
  269. package/package.json +59 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zoom-pan.d.ts","sourceRoot":"","sources":["../../../src/editor/public/zoom-pan.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,SAAS,EACd,KAAK,KAAK,EACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAK3D;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,KAAK,EAAE,aAAa,IAAI,KAAG,KAAK,GAAG,IAGpE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,KAAK,EACZ,QAAQ,MAAM,EACd,aAAa,IAAI,KAChB,KAAK,GAAG,IASV,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,KAAG,KAAK,GAAG,IAQvD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,KAAK,EACZ,QAAQ,MAAM,EACd,SAAS,MAAM,KACd,KAAK,GAAG,IAiBV,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,EAAE,SAAS,MAAM,KAAG,KAAK,GAAG,IASxE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,KAAK,EACZ,OAAO,MAAM,EACb,QAAQ,MAAM,KACb,KAAK,GAAG,IAIV,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,GACzB,OAAO,KAAK,EACZ,OAAO;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,KAC1D,KAAK,GAAG,IAeV,CAAC"}
@@ -0,0 +1,116 @@
1
+ import { bounds as B } from "@oh-just-another/math";
2
+ import { getElementWorldBounds, panBy as viewportPanBy, resize as viewportResize, zoomAt as viewportZoomAt, } from "@oh-just-another/scene";
3
+ import { MAX_ZOOM, MIN_ZOOM } from "../../constants.js";
4
+ const clampZoom = (z) => Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, z));
5
+ /**
6
+ * Shift the camera by a screen-space delta. Returns the next scene, or
7
+ * `null` for a zero-delta no-op. Viewport state is editor-local —
8
+ * caller does not record this in history.
9
+ */
10
+ export const computePan = (scene, deltaScreen) => {
11
+ if (deltaScreen.x === 0 && deltaScreen.y === 0)
12
+ return null;
13
+ return { ...scene, viewport: viewportPanBy(scene.viewport, deltaScreen) };
14
+ };
15
+ /**
16
+ * Multiplicative zoom around a world-space anchor. The anchor stays
17
+ * under the same screen pixel. Result is clamped to `[MIN_ZOOM,
18
+ * MAX_ZOOM]`; a zero-effect call returns `null`.
19
+ */
20
+ export const computeZoomAt = (scene, factor, anchorWorld) => {
21
+ const currentZoom = scene.viewport.zoom;
22
+ const targetZoom = clampZoom(currentZoom * factor);
23
+ const effectiveFactor = targetZoom / currentZoom;
24
+ if (effectiveFactor === 1)
25
+ return null;
26
+ return {
27
+ ...scene,
28
+ viewport: viewportZoomAt(scene.viewport, effectiveFactor, anchorWorld),
29
+ };
30
+ };
31
+ /**
32
+ * Reset zoom to 1.0 around the viewport center — the world point
33
+ * currently under the screen center stays centered, only the scale
34
+ * changes. Returns `null` when already at zoom 1.
35
+ */
36
+ export const computeResetZoom = (scene) => {
37
+ const vp = scene.viewport;
38
+ if (vp.zoom === 1)
39
+ return null;
40
+ const centerWorld = {
41
+ x: vp.pan.x + vp.size.width / 2 / vp.zoom,
42
+ y: vp.pan.y + vp.size.height / 2 / vp.zoom,
43
+ };
44
+ return { ...scene, viewport: viewportZoomAt(vp, 1 / vp.zoom, centerWorld) };
45
+ };
46
+ /**
47
+ * Fit the camera to an arbitrary world `bounds` with `padding` screen
48
+ * px on each side. Returns `null` when the viewport or bounds are
49
+ * degenerate. Shared by zoom-to-fit (all content) and
50
+ * zoom-to-selection.
51
+ */
52
+ export const computeZoomToBounds = (scene, bounds, padding) => {
53
+ const vp = scene.viewport;
54
+ if (vp.size.width <= 0 || vp.size.height <= 0)
55
+ return null;
56
+ if (bounds.width <= 0 || bounds.height <= 0)
57
+ return null;
58
+ const availW = vp.size.width - padding * 2;
59
+ const availH = vp.size.height - padding * 2;
60
+ if (availW <= 0 || availH <= 0)
61
+ return null;
62
+ const zoom = clampZoom(Math.min(availW / bounds.width, availH / bounds.height));
63
+ const centerWorld = {
64
+ x: bounds.x + bounds.width / 2,
65
+ y: bounds.y + bounds.height / 2,
66
+ };
67
+ const pan = {
68
+ x: centerWorld.x - vp.size.width / 2 / zoom,
69
+ y: centerWorld.y - vp.size.height / 2 / zoom,
70
+ };
71
+ return { ...scene, viewport: { ...vp, zoom, pan } };
72
+ };
73
+ export const computeZoomToFit = (scene, padding) => {
74
+ if (scene.elements.size === 0)
75
+ return null;
76
+ let combined = null;
77
+ for (const s of scene.elements.values()) {
78
+ const b = getElementWorldBounds(s);
79
+ combined = combined ? B.union(combined, b) : b;
80
+ }
81
+ if (!combined)
82
+ return null;
83
+ return computeZoomToBounds(scene, combined, padding);
84
+ };
85
+ /**
86
+ * Update the camera's screen-pixel size. Returns `null` when size is
87
+ * unchanged.
88
+ */
89
+ export const computeViewportResize = (scene, width, height) => {
90
+ const vp = scene.viewport;
91
+ if (vp.size.width === width && vp.size.height === height)
92
+ return null;
93
+ return { ...scene, viewport: viewportResize(vp, width, height) };
94
+ };
95
+ /**
96
+ * Merge a partial grid update (`size` and/or `style`). Returns `null`
97
+ * when nothing actually changed. Grid settings are view preferences —
98
+ * caller doesn't touch history.
99
+ */
100
+ export const computeSetGrid = (scene, patch) => {
101
+ const vp = scene.viewport;
102
+ const nextSize = patch.size ?? vp.gridSize;
103
+ const nextStyle = patch.style ?? vp.gridStyle;
104
+ const nextSnap = patch.snap ?? vp.snapToGrid;
105
+ if (nextSize === vp.gridSize && nextStyle === vp.gridStyle && nextSnap === vp.snapToGrid) {
106
+ return null;
107
+ }
108
+ const nextViewport = {
109
+ ...vp,
110
+ ...(nextSize === undefined ? {} : { gridSize: nextSize }),
111
+ ...(nextStyle === undefined ? {} : { gridStyle: nextStyle }),
112
+ ...(nextSnap === undefined ? {} : { snapToGrid: nextSnap }),
113
+ };
114
+ return { ...scene, viewport: nextViewport };
115
+ };
116
+ //# sourceMappingURL=zoom-pan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zoom-pan.js","sourceRoot":"","sources":["../../../src/editor/public/zoom-pan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Editor } from "../editor.js";
2
+ /**
3
+ * Render orchestrator: background grid pass, tile-cache vs full renderScene
4
+ * path, and the overlay options builder (drawing / lasso preview, edge
5
+ * preview, hovered ports, group handles, container drop zone, brush stroke,
6
+ * edge endpoint drag, peer cursors, annotations). Typed against the full
7
+ * `Editor` class via a type-only import erased at runtime; the single call
8
+ * site is editor.ts's own private `render()` wrapper.
9
+ */
10
+ export declare const renderEditor: (editor: Editor) => void;
11
+ //# sourceMappingURL=render-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-orchestrator.d.ts","sourceRoot":"","sources":["../../src/editor/render-orchestrator.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAkB3C;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,IAwc7C,CAAC"}
@@ -0,0 +1,473 @@
1
+ import { getLink, getLinkPath, getLinkCurvePoints, getLinkWaypointMidpoints, getElement, getElementWorldBounds, getElementOutline, getWorldToScreen, getDropZonesWorld, strokeOutsideExtent, isImage, } from "@oh-just-another/scene";
2
+ import { DEFAULT_LOD, renderLinks, renderGrid, renderScene } from "@oh-just-another/renderer-core";
3
+ import { renderOverlay, paintElementSelectionHalo, } from "../overlay.js";
4
+ import { anchorOverlayPoints } from "./anchor-points.js";
5
+ import { hitZoneVisibility } from "./hit-test.js";
6
+ import { buildElementForCreate, buildEdgePreviewLink } from "./applies/create.js";
7
+ import { ANCHOR_DOT_ACTIVE_RADIUS, ANCHOR_DOT_RADIUS, ANCHOR_DOT_HOVER_GROW_RADIUS, ANCHOR_DOT_HOVER_MAX_RADIUS, DEFAULT_SNAP_THRESHOLD, GHOST_PREVIEW_OPACITY, ISOLATION_DIM_OPACITY, LARGE_SCENE_HIT_THRESHOLD, LINK_START_ANCHOR_OUTSET, LINK_ATTACH_ANCHOR_OUTSET, } from "../constants.js";
8
+ /**
9
+ * Stable throwaway id for the transient shape-draw preview element. Never
10
+ * enters the scene / history — it exists only for the duration of a single
11
+ * overlay paint, so any constant id is fine.
12
+ */
13
+ const DRAW_PREVIEW_ELEMENT_ID = "__draw-preview__";
14
+ /** Throwaway id for the live draw-edge connector preview link. */
15
+ const DRAW_PREVIEW_LINK_ID = "__draw-preview-link__";
16
+ /** Index-access helper: throws on out-of-range instead of returning `undefined`. */
17
+ const req = (v) => {
18
+ if (v === undefined)
19
+ throw new Error("packages/state: index out of range");
20
+ return v;
21
+ };
22
+ /**
23
+ * Render orchestrator: background grid pass, tile-cache vs full renderScene
24
+ * path, and the overlay options builder (drawing / lasso preview, edge
25
+ * preview, hovered ports, group handles, container drop zone, brush stroke,
26
+ * edge endpoint drag, peer cursors, annotations). Typed against the full
27
+ * `Editor` class via a type-only import erased at runtime; the single call
28
+ * site is editor.ts's own private `render()` wrapper.
29
+ */
30
+ export const renderEditor = (editor) => {
31
+ // Background layer (grid + selection halo), when the host gave us a
32
+ // dedicated target. The grid clears it each frame; the contour selection
33
+ // halo is then painted on top of the grid but UNDER the shapes (main
34
+ // layer), so it peeks out from behind each selected element. Its own clean
35
+ // Canvas2D layer avoids dirty-rect flicker and paint-state bleed into the
36
+ // shape pass. Without a background layer the grid lives on mainTarget
37
+ // before shapes are drawn, so renderScene's clear takes care of it.
38
+ if (editor.backgroundTarget) {
39
+ // Grid pass also clears the background layer each frame. When the grid is
40
+ // toggled off, still clear it so no stale grid lingers under the halos.
41
+ if (editor.gridVisible)
42
+ renderGrid(editor._scene, editor.backgroundTarget);
43
+ else
44
+ editor.backgroundTarget.clear();
45
+ const halos = [];
46
+ for (const id of editor._selection) {
47
+ const shape = getElement(editor._scene, id);
48
+ if (!shape)
49
+ continue;
50
+ const style = shape.style ?? {};
51
+ halos.push({
52
+ loops: getElementOutline(editor._scene, shape),
53
+ outsetWorld: strokeOutsideExtent(style),
54
+ });
55
+ }
56
+ if (halos.length > 0) {
57
+ paintElementSelectionHalo(editor.backgroundTarget, getWorldToScreen(editor._scene.viewport), halos, editor._scene.viewport.zoom || 1);
58
+ }
59
+ }
60
+ // World-space viewport rect — used by `renderScene` to skip off-screen
61
+ // shapes. Computed by mapping the screen viewport corners through the
62
+ // inverse projection. Slightly inflated so geometry near the edge
63
+ // does not flicker during pan.
64
+ const viewportWorld = editor.computeViewportWorld();
65
+ const dirtyWorld = editor.computeDirtyWorld();
66
+ const dimElements = editor._enteredGroup
67
+ ? editor.computeDimElements(editor._enteredGroup)
68
+ : undefined;
69
+ const hideElements = editor.computeHiddenElements();
70
+ if (editor.tileComposeFn && viewportWorld) {
71
+ // Tile-cache path: clear main once, then composite cached tiles. Dim /
72
+ // hide sets aren't honoured by the tile cache (would require a separate
73
+ // pass); this opt-in path is intended for very-large static scenes where
74
+ // neither typically applies.
75
+ editor.mainTarget.clear();
76
+ editor.tileComposeFn(editor._scene, editor.mainTarget, {
77
+ viewport: viewportWorld,
78
+ changedElements: editor.tileDirtyElements,
79
+ zoomBucket: editor._scene.viewport.zoom > 0
80
+ ? 2 ** Math.round(Math.log2(editor._scene.viewport.zoom))
81
+ : 1,
82
+ });
83
+ editor.tileDirtyElements = new Map();
84
+ renderLinks(editor._scene, editor.mainTarget, { viewportWorld });
85
+ }
86
+ else {
87
+ // For very large scenes share the same SpatialGrid the hit-test path
88
+ // already maintains — `renderScene` uses it to skip the per-shape AABB
89
+ // cull on shapes outside the viewport.
90
+ const sharedIndex = editor._scene.elements.size >= LARGE_SCENE_HIT_THRESHOLD ? editor.ensureSpatialIndex() : null;
91
+ renderScene(editor._scene, editor.mainTarget, {
92
+ ...(viewportWorld ? { viewport: viewportWorld } : {}),
93
+ ...(dirtyWorld ? { dirtyWorld } : {}),
94
+ boundsCache: editor.boundsCache,
95
+ lod: DEFAULT_LOD,
96
+ ...(dimElements ? { dimElements, dimOpacity: ISOLATION_DIM_OPACITY } : {}),
97
+ ...(hideElements ? { hideElements } : {}),
98
+ ...(sharedIndex ? { spatialIndex: sharedIndex } : {}),
99
+ });
100
+ renderLinks(editor._scene, editor.mainTarget, {
101
+ ...(viewportWorld ? { viewportWorld } : {}),
102
+ ...(dirtyWorld ? { dirtyWorld } : {}),
103
+ });
104
+ }
105
+ editor.lastRenderedScene = editor._scene;
106
+ editor.lastRenderedEnteredGroup = editor._enteredGroup;
107
+ const overlayOpts = {};
108
+ // Throwaway scene holding the click-create ghost connector — rendered
109
+ // through the real link renderer (faded) AFTER the overlay, so the ghost
110
+ // connector matches the link that will be created (routing / arrowhead /
111
+ // style), not a dashed preview line. Set in the start-dot hover branch.
112
+ let ghostScene = null;
113
+ // The lasso (select-mode rubber-band) keeps the plain dashed rect. A shape
114
+ // draw (draw-rect / draw-ellipse) shows a preview of the would-be element
115
+ // rendered through its real renderer — the user sees the actual shape +
116
+ // default style they'll get on release, not just a dashed box. Both
117
+ // gestures can't run at once, so one slot is set.
118
+ if (editor.lassoPreview) {
119
+ overlayOpts.drawingPreview = editor.lassoPreview;
120
+ }
121
+ else if (editor.drawingPreview) {
122
+ const kind = editor.mode === "draw-rect" ? "rect" : editor.mode === "draw-ellipse" ? "ellipse" : null;
123
+ if (kind) {
124
+ overlayOpts.drawingPreviewElement = buildElementForCreate(editor._scene, kind, editor.drawingPreview, DRAW_PREVIEW_ELEMENT_ID, editor._activeLayerId, () => "");
125
+ }
126
+ else {
127
+ overlayOpts.drawingPreview = editor.drawingPreview;
128
+ }
129
+ }
130
+ // Draw-edge connector preview: render the would-be link through the real
131
+ // link renderer (solid, default arrowheads, full colour) so the dragged
132
+ // preview looks exactly like the link that'll be created — same default
133
+ // object as commit (`buildLinkForCreate`), not a faded/dashed stand-in.
134
+ let edgePreviewScene = null;
135
+ if (editor.edgePreview) {
136
+ const previewLink = buildEdgePreviewLink(editor._scene, editor.edgePreview, DRAW_PREVIEW_LINK_ID, editor._activeLayerId);
137
+ edgePreviewScene = {
138
+ ...editor._scene,
139
+ links: new Map([[DRAW_PREVIEW_LINK_ID, previewLink]]),
140
+ };
141
+ }
142
+ // Connection anchors. Two roles: link-start (on selection) and link-attach
143
+ // (on hover/proximity). During a drag started FROM a start-anchor (select
144
+ // mode, no tool switch) BOTH are shown: the source keeps its start dots
145
+ // while the target shows its attach dots under the cursor.
146
+ if (editor.mode !== "brush" && editor.mode !== "hand") {
147
+ const zoom = editor._scene.viewport.zoom || 1;
148
+ // Build one overlay port-set for a shape. The free outline-attach point
149
+ // (`outlinePoint`, link-attach only) is appended un-offset — it is the
150
+ // real landing point. `activeAnchorName` highlights the snap target if it
151
+ // is one of the named dots.
152
+ const buildPortSet = (shapeId, role, activeAnchorName, outlinePoint) => {
153
+ const shape = getElement(editor._scene, shapeId);
154
+ if (!shape)
155
+ return null;
156
+ const outsetPx = role === "link-start" ? LINK_START_ANCHOR_OUTSET : LINK_ATTACH_ANCHOR_OUTSET;
157
+ const { names, worldPoints: anchorPts } = anchorOverlayPoints(shape, outsetPx / zoom);
158
+ const worldPoints = [...anchorPts];
159
+ const namedActive = activeAnchorName !== null ? names.indexOf(activeAnchorName) : -1;
160
+ if (role === "link-attach" && outlinePoint)
161
+ worldPoints.push(outlinePoint);
162
+ const activeIndex = namedActive >= 0
163
+ ? namedActive
164
+ : role === "link-attach" && outlinePoint
165
+ ? worldPoints.length - 1
166
+ : -1;
167
+ return {
168
+ worldPoints,
169
+ ...(activeIndex >= 0 ? { activeIndex } : {}),
170
+ role,
171
+ };
172
+ };
173
+ const portSets = [];
174
+ if (editor.linkDragFromAnchor) {
175
+ // Drag from a start-anchor: keep the source's start dots visible…
176
+ const startSet = buildPortSet(editor.linkDragFromAnchor.fromElement, "link-start", null);
177
+ if (startSet)
178
+ portSets.push(startSet);
179
+ // …and show the target's attach dots under the cursor.
180
+ if (editor.hoveredLinkTarget) {
181
+ const t = editor.hoveredLinkTarget;
182
+ const attachSet = buildPortSet(t.elementId, "link-attach", t.activeAnchor, t.outlinePoint);
183
+ if (attachSet)
184
+ portSets.push(attachSet);
185
+ }
186
+ }
187
+ else if (editor.hoveredLinkTarget) {
188
+ // Proximity snap while a link is drawn with the draw-edge tool.
189
+ const t = editor.hoveredLinkTarget;
190
+ const attachSet = buildPortSet(t.elementId, "link-attach", t.activeAnchor, t.outlinePoint);
191
+ if (attachSet)
192
+ portSets.push(attachSet);
193
+ }
194
+ else if (!editor.panGesture &&
195
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- `pinch` is unset during the constructor's first render; type says non-null but runtime can be undefined
196
+ !editor.pinch?.isActive() &&
197
+ !editor.gestureTx && // hide only during a real drag (tx opens on first move-patch), not on a bare press
198
+ !editor.edgePreview && // don't show start-anchors if we are already drawing a link
199
+ !editor.linkEndpointDrag // or dragging an existing endpoint
200
+ ) {
201
+ // At rest — show link-start anchors for the single selected element, and
202
+ // only while the cursor is over it or within reach of its dots: dots sit
203
+ // just OUTSIDE the edges, so the hover zone is the element bounds
204
+ // expanded by the outset + dot grab radius. Keeps them visible as the
205
+ // cursor travels out to a dot. Dots are NOT shown on unselected
206
+ // elements — select first, then connect. The dot nearest the cursor
207
+ // grows (`ANCHOR_DOT_HOVER_GROW_RADIUS`).
208
+ const cursor = editor.hoverCursorWorld;
209
+ if (editor._selection.size === 1 && cursor) {
210
+ const id = req([...editor._selection][0]);
211
+ const shape = getElement(editor._scene, id);
212
+ if (shape) {
213
+ const b = getElementWorldBounds(shape);
214
+ const pad = (LINK_START_ANCHOR_OUTSET + ANCHOR_DOT_ACTIVE_RADIUS + editor.anchorStartHitSlop) /
215
+ zoom;
216
+ const near = cursor.x >= b.x - pad &&
217
+ cursor.x <= b.x + b.width + pad &&
218
+ cursor.y >= b.y - pad &&
219
+ cursor.y <= b.y + b.height + pad;
220
+ if (near) {
221
+ const set = buildPortSet(id, "link-start", null);
222
+ if (set) {
223
+ const r = ANCHOR_DOT_HOVER_GROW_RADIUS / zoom;
224
+ let bestI = -1;
225
+ let bestD2 = r * r;
226
+ set.worldPoints.forEach((p, i) => {
227
+ const dx = p.x - cursor.x;
228
+ const dy = p.y - cursor.y;
229
+ const d2 = dx * dx + dy * dy;
230
+ if (d2 <= bestD2) {
231
+ bestD2 = d2;
232
+ bestI = i;
233
+ }
234
+ });
235
+ if (bestI >= 0) {
236
+ // Smooth proximity grow: scale the nearest dot from its resting
237
+ // radius up to the max as the cursor closes in (t = 1 at the
238
+ // dot, 0 at the edge of the grow radius).
239
+ const t = r > 0 ? Math.max(0, 1 - Math.sqrt(bestD2) / r) : 0;
240
+ const activeRadius = ANCHOR_DOT_RADIUS + (ANCHOR_DOT_HOVER_MAX_RADIUS - ANCHOR_DOT_RADIUS) * t;
241
+ portSets.push({ ...set, activeIndex: bestI, activeRadius });
242
+ }
243
+ else {
244
+ portSets.push(set);
245
+ }
246
+ }
247
+ // Hovering ON a dot (within the click radius) → ghost preview of
248
+ // what a click would create (copy element + connector).
249
+ const { names, worldPoints } = anchorOverlayPoints(shape, LINK_START_ANCHOR_OUTSET / zoom);
250
+ const clickR2 = (editor.anchorClickRadius / zoom) ** 2;
251
+ let hoveredName = null;
252
+ for (let i = 0; i < worldPoints.length; i++) {
253
+ const p = req(worldPoints[i]);
254
+ if ((p.x - cursor.x) ** 2 + (p.y - cursor.y) ** 2 <= clickR2) {
255
+ hoveredName = req(names[i]);
256
+ break;
257
+ }
258
+ }
259
+ if (hoveredName) {
260
+ const preview = editor.previewClickCreate(id, hoveredName);
261
+ if (preview) {
262
+ overlayOpts.ghostElement = preview.bounds;
263
+ overlayOpts.ghostElementShape = preview.element;
264
+ ghostScene = preview.ghostScene;
265
+ }
266
+ }
267
+ }
268
+ }
269
+ }
270
+ }
271
+ if (portSets.length === 1)
272
+ overlayOpts.ports = req(portSets[0]);
273
+ else if (portSets.length > 1)
274
+ overlayOpts.ports = portSets;
275
+ // Float-attach feedback: when the endpoint will attach to the whole
276
+ // element (not a specific dot), highlight that element so the user knows
277
+ // it'll float vs fix to a point.
278
+ const hov = editor.hoveredLinkTarget;
279
+ if (hov?.mode === "element") {
280
+ const tshape = getElement(editor._scene, hov.elementId);
281
+ if (tshape)
282
+ overlayOpts.linkAttachHighlight = getElementWorldBounds(tshape);
283
+ }
284
+ }
285
+ // Group-handle overlay: a multi-object selection (elements + links) OR a
286
+ // single group-typed shape. A lone link keeps its endpoint handles, not a
287
+ // resize box. Aspect-locked groups flag the overlay for corner-only handles.
288
+ if (editor._selection.size + editor._selectedLinks.size > 1 ||
289
+ editor.selectionIsAspectLocked()) {
290
+ const combined = editor.combinedSelectionBounds();
291
+ if (combined)
292
+ overlayOpts.groupBounds = combined;
293
+ if (editor.selectionIsAspectLocked())
294
+ overlayOpts.groupAspectLocked = true;
295
+ }
296
+ if (editor.containerHover) {
297
+ overlayOpts.containerDropZone = editor.containerHover.dropZone;
298
+ }
299
+ if (editor.brushStroke) {
300
+ overlayOpts.brushPreview = {
301
+ origin: editor.brushStroke.origin,
302
+ points: editor.brushStroke.points,
303
+ fill: "#222",
304
+ };
305
+ }
306
+ // Persistent halo around EVERY selected link (multi-select). Curve-aware
307
+ // so the halo follows the drawn path, matching the hover highlight.
308
+ if (editor._selectedLinks.size > 0) {
309
+ const halos = [];
310
+ for (const id of editor._selectedLinks) {
311
+ const edge = getLink(editor._scene, id);
312
+ if (!edge)
313
+ continue;
314
+ const hpath = getLinkCurvePoints(editor._scene, edge);
315
+ if (hpath && hpath.length >= 2) {
316
+ halos.push({ path: hpath, width: edge.style.strokeWidth ?? 1 });
317
+ }
318
+ }
319
+ if (halos.length > 0)
320
+ overlayOpts.selectedLinkPaths = halos;
321
+ }
322
+ // Endpoint / bend handles only for the SOLE selected link (no elements);
323
+ // a multi/mixed selection hides them to stay uncluttered.
324
+ const soleSelectedLink = editor.selectedLink;
325
+ if (soleSelectedLink) {
326
+ const edge = getLink(editor._scene, soleSelectedLink);
327
+ if (edge) {
328
+ const path = getLinkPath(editor._scene, edge);
329
+ if (path && path.length >= 2) {
330
+ // During an endpoint-rebind drag the dragged end is re-pointed live in
331
+ // the scene (the whole link follows the cursor), so `path` already
332
+ // reflects the cursor position — handles ride along with it.
333
+ const from = req(path[0]);
334
+ const to = req(path[path.length - 1]);
335
+ // Bend-point handles: existing waypoints (solid) + segment-midpoint
336
+ // "add" handles along the logical [from, ...waypoints, to] chain.
337
+ // Midpoints are hidden during an active waypoint drag to declutter.
338
+ // ELBOW (orthogonal) links don't expose free bend handles — their
339
+ // points are router output, not user-placed (segment-drag editing is
340
+ // a separate mechanic). Only straight / bezier show free waypoints.
341
+ const isElbow = (edge.routing ?? "straight") === "orthogonal";
342
+ if (isElbow) {
343
+ // Segment handles on interior segments of the routed chain
344
+ // (k in 1..len-3; the two terminal segments touch from/to and
345
+ // can't be slid). Hidden during an active segment / endpoint drag.
346
+ const midpoints = [];
347
+ if (!editor.linkSegmentDrag && !editor.linkEndpointDrag) {
348
+ // Straight elbow → one handle on its single segment (grab to
349
+ // bend). Routed elbow → handles on interior segments.
350
+ const segs = path.length === 2
351
+ ? [0]
352
+ : Array.from({ length: Math.max(0, path.length - 3) }, (_, i) => i + 1);
353
+ for (const k of segs) {
354
+ const a = req(path[k]);
355
+ const b = req(path[k + 1]);
356
+ midpoints.push({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 });
357
+ }
358
+ }
359
+ overlayOpts.edgeSelection = { from, to, midpoints };
360
+ }
361
+ else {
362
+ const waypoints = [...(edge.waypoints ?? [])];
363
+ // "Add waypoint" handles sit at the VISUAL middle of each span — on
364
+ // the drawn arc for bezier (t=0.5 of the span's cubic), on the chord
365
+ // for straight. The raw chord midpoint would put bezier handles off
366
+ // the curve.
367
+ const midpoints = editor.linkWaypointDrag
368
+ ? []
369
+ : (getLinkWaypointMidpoints(editor._scene, edge) ?? []);
370
+ overlayOpts.edgeSelection = { from, to, waypoints, midpoints };
371
+ }
372
+ }
373
+ }
374
+ }
375
+ if (editor._peerCursors.length > 0)
376
+ overlayOpts.peerCursors = editor._peerCursors;
377
+ if (editor._peerSelections.length > 0)
378
+ overlayOpts.peerSelections = editor._peerSelections;
379
+ if (editor._scene.annotations.size > 0) {
380
+ overlayOpts.annotations = [...editor._scene.annotations.values()];
381
+ overlayOpts.selectedAnnotation = editor._selectedAnnotation;
382
+ }
383
+ // "Play" badge on paused animated (GIF) shapes — auto-stopped or held under
384
+ // prefers-reduced-motion. Signals a click resumes them.
385
+ const gifBadges = [];
386
+ for (const shape of editor._scene.elements.values()) {
387
+ if (isImage(shape) && shape.animationKind && editor.isPlaybackPaused(shape.id)) {
388
+ gifBadges.push(getElementWorldBounds(shape));
389
+ }
390
+ }
391
+ if (gifBadges.length > 0)
392
+ overlayOpts.gifBadges = gifBadges;
393
+ // In-canvas text editing: caret + selection highlight for the shape
394
+ // under edit (null when not editing).
395
+ const editingText = editor.editingTextOverlay();
396
+ if (editingText)
397
+ overlayOpts.editingText = editingText;
398
+ if (editor.debugHitZones) {
399
+ overlayOpts.debugHitZones = true;
400
+ // One decision point for which hit-zone categories are actionable now
401
+ // (see `hitZoneVisibility`): while a link endpoint is being placed only
402
+ // the link-attach drop-zones are live; at rest the resize / body / handle
403
+ // / start-dot zones are. The overlay paints only the visible ones.
404
+ const linkDragActive = editor.linkDragFromAnchor !== null ||
405
+ editor.edgePreview !== null ||
406
+ editor.linkEndpointDrag !== null;
407
+ // An element move is in flight: position snapshot taken (groupMoveOrigin)
408
+ // AND a real drag transaction opened (gestureTx opens only past the drag
409
+ // threshold, so a bare press doesn't count). Resize uses groupResizeOrigin
410
+ // instead, so this stays move-only.
411
+ const elementDragActive = editor.groupMoveOrigin !== null && editor.gestureTx !== null;
412
+ const visibility = hitZoneVisibility({ linkDragActive, elementDragActive });
413
+ overlayOpts.debugHitZoneVisibility = visibility;
414
+ if (visibility.attachDropZones) {
415
+ // Link-attach drop-zones (anchor catchments + edge bands + floating body)
416
+ // the snap engine resolves against, for every element except the drag
417
+ // source — shows where a drop lands ON a point vs ON an edge vs the body.
418
+ const srcId = editor.linkDragFromAnchor?.fromElement;
419
+ const anchors = [];
420
+ const outlineLoops = [];
421
+ for (const shape of editor._scene.elements.values()) {
422
+ if (shape.id === srcId)
423
+ continue;
424
+ anchors.push(...anchorOverlayPoints(shape, 0).worldPoints);
425
+ for (const loop of getElementOutline(editor._scene, shape))
426
+ outlineLoops.push(loop);
427
+ }
428
+ overlayOpts.debugAttachZones = {
429
+ anchors,
430
+ outlineLoops,
431
+ thresholdWorld: DEFAULT_SNAP_THRESHOLD,
432
+ };
433
+ }
434
+ if (visibility.containerDropZones) {
435
+ // Element drop-zones for ALL frames + containers at once. Frames use
436
+ // centroid-in-body (full world bounds); containers use
437
+ // cursor-in-drop-zone (resolved zone). The dragged elements themselves
438
+ // are skipped — you can't drop into self.
439
+ const dragged = editor.groupMoveOrigin;
440
+ const frames = [];
441
+ const containers = [];
442
+ for (const shape of editor._scene.elements.values()) {
443
+ if (dragged?.has(shape.id))
444
+ continue;
445
+ if (shape.type === "frame") {
446
+ frames.push(getElementWorldBounds(shape));
447
+ continue;
448
+ }
449
+ // All drop-zones (every lane of a multi-lane container), not just the
450
+ // single attach zone — so a swim-lane shows a region per lane.
451
+ containers.push(...getDropZonesWorld(shape));
452
+ }
453
+ overlayOpts.debugContainerZones = { frames, containers };
454
+ }
455
+ }
456
+ renderOverlay(editor._scene, editor._selection, editor.overlayTarget, overlayOpts);
457
+ // Ghost connector (click-create hover) — drawn through the REAL link
458
+ // renderer onto the overlay, faded, AFTER the overlay chrome so it sits on
459
+ // top of the ghost element (matches scene z-order: links over shapes). Uses
460
+ // the would-be link's actual routing / arrowhead / style, not a dashed line.
461
+ if (ghostScene) {
462
+ editor.overlayTarget.save();
463
+ editor.overlayTarget.setOpacity(GHOST_PREVIEW_OPACITY);
464
+ renderLinks(ghostScene, editor.overlayTarget, {});
465
+ editor.overlayTarget.restore();
466
+ }
467
+ // Live draw-edge connector preview — real link renderer, FULL opacity (the
468
+ // preview must look identical to the committed link, not faded/dashed).
469
+ if (edgePreviewScene) {
470
+ renderLinks(edgePreviewScene, editor.overlayTarget, {});
471
+ }
472
+ };
473
+ //# sourceMappingURL=render-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-orchestrator.js","sourceRoot":"","sources":["../../src/editor/render-orchestrator.ts"],"names":[],"mappings":"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"}