@oh-just-another/state 0.58.0 → 0.60.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 (272) hide show
  1. package/CHANGELOG.md +158 -0
  2. package/README.md +78 -27
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/actions/actionArrange.d.ts +13 -0
  5. package/dist/actions/actionArrange.d.ts.map +1 -0
  6. package/dist/actions/actionArrange.js +130 -0
  7. package/dist/actions/actionArrange.js.map +1 -0
  8. package/dist/actions/actionClipboard.d.ts +2 -0
  9. package/dist/actions/actionClipboard.d.ts.map +1 -1
  10. package/dist/actions/actionClipboard.js +32 -1
  11. package/dist/actions/actionClipboard.js.map +1 -1
  12. package/dist/actions/actionKeyboard.d.ts.map +1 -1
  13. package/dist/actions/actionKeyboard.js +77 -9
  14. package/dist/actions/actionKeyboard.js.map +1 -1
  15. package/dist/actions/actionMode.d.ts +4 -0
  16. package/dist/actions/actionMode.d.ts.map +1 -1
  17. package/dist/actions/actionMode.js +54 -0
  18. package/dist/actions/actionMode.js.map +1 -1
  19. package/dist/actions/actionSelection.d.ts.map +1 -1
  20. package/dist/actions/actionSelection.js +1 -0
  21. package/dist/actions/actionSelection.js.map +1 -1
  22. package/dist/actions/actionText.d.ts +5 -0
  23. package/dist/actions/actionText.d.ts.map +1 -0
  24. package/dist/actions/actionText.js +37 -0
  25. package/dist/actions/actionText.js.map +1 -0
  26. package/dist/actions/actionView.d.ts +6 -0
  27. package/dist/actions/actionView.d.ts.map +1 -1
  28. package/dist/actions/actionView.js +20 -2
  29. package/dist/actions/actionView.js.map +1 -1
  30. package/dist/actions/actionZoom.d.ts.map +1 -1
  31. package/dist/actions/actionZoom.js +5 -0
  32. package/dist/actions/actionZoom.js.map +1 -1
  33. package/dist/actions/index.d.ts +6 -4
  34. package/dist/actions/index.d.ts.map +1 -1
  35. package/dist/actions/index.js +6 -4
  36. package/dist/actions/index.js.map +1 -1
  37. package/dist/actions/registry.d.ts.map +1 -1
  38. package/dist/actions/registry.js +17 -0
  39. package/dist/actions/registry.js.map +1 -1
  40. package/dist/actions/types.d.ts +10 -1
  41. package/dist/actions/types.d.ts.map +1 -1
  42. package/dist/actions/types.js.map +1 -1
  43. package/dist/auto-layout-scheduler.d.ts +1 -3
  44. package/dist/auto-layout-scheduler.d.ts.map +1 -1
  45. package/dist/auto-layout-scheduler.js +1 -2
  46. package/dist/auto-layout-scheduler.js.map +1 -1
  47. package/dist/built-in-handlers.d.ts.map +1 -1
  48. package/dist/built-in-handlers.js +14 -1
  49. package/dist/built-in-handlers.js.map +1 -1
  50. package/dist/clipboard.d.ts +0 -14
  51. package/dist/clipboard.d.ts.map +1 -1
  52. package/dist/clipboard.js +1 -1
  53. package/dist/clipboard.js.map +1 -1
  54. package/dist/constants.d.ts +208 -41
  55. package/dist/constants.d.ts.map +1 -1
  56. package/dist/constants.js +210 -25
  57. package/dist/constants.js.map +1 -1
  58. package/dist/dom-events.d.ts +8 -2
  59. package/dist/dom-events.d.ts.map +1 -1
  60. package/dist/dom-events.js +12 -0
  61. package/dist/dom-events.js.map +1 -1
  62. package/dist/editor/animation-scene.d.ts +36 -0
  63. package/dist/editor/animation-scene.d.ts.map +1 -0
  64. package/dist/editor/animation-scene.js +194 -0
  65. package/dist/editor/animation-scene.js.map +1 -0
  66. package/dist/editor/animation.d.ts +43 -0
  67. package/dist/editor/animation.d.ts.map +1 -0
  68. package/dist/editor/animation.js +80 -0
  69. package/dist/editor/animation.js.map +1 -0
  70. package/dist/editor/applies/arrange.d.ts +46 -0
  71. package/dist/editor/applies/arrange.d.ts.map +1 -0
  72. package/dist/editor/applies/arrange.js +162 -0
  73. package/dist/editor/applies/arrange.js.map +1 -0
  74. package/dist/editor/applies/create.d.ts +0 -6
  75. package/dist/editor/applies/create.d.ts.map +1 -1
  76. package/dist/editor/applies/create.js +1 -1
  77. package/dist/editor/applies/create.js.map +1 -1
  78. package/dist/editor/applies/edge.d.ts +8 -1
  79. package/dist/editor/applies/edge.d.ts.map +1 -1
  80. package/dist/editor/applies/edge.js +31 -1
  81. package/dist/editor/applies/edge.js.map +1 -1
  82. package/dist/editor/applies/link-move.d.ts +0 -8
  83. package/dist/editor/applies/link-move.d.ts.map +1 -1
  84. package/dist/editor/applies/link-move.js +1 -1
  85. package/dist/editor/applies/link-move.js.map +1 -1
  86. package/dist/editor/applies/move.d.ts +6 -0
  87. package/dist/editor/applies/move.d.ts.map +1 -1
  88. package/dist/editor/applies/move.js +6 -0
  89. package/dist/editor/applies/move.js.map +1 -1
  90. package/dist/editor/applies/resize.d.ts +26 -5
  91. package/dist/editor/applies/resize.d.ts.map +1 -1
  92. package/dist/editor/applies/resize.js +91 -13
  93. package/dist/editor/applies/resize.js.map +1 -1
  94. package/dist/editor/caret-blink.d.ts +18 -0
  95. package/dist/editor/caret-blink.d.ts.map +1 -0
  96. package/dist/editor/caret-blink.js +42 -0
  97. package/dist/editor/caret-blink.js.map +1 -0
  98. package/dist/editor/container-ops.d.ts.map +1 -1
  99. package/dist/editor/container-ops.js +2 -2
  100. package/dist/editor/container-ops.js.map +1 -1
  101. package/dist/editor/dirty-rect.d.ts +23 -0
  102. package/dist/editor/dirty-rect.d.ts.map +1 -0
  103. package/dist/editor/dirty-rect.js +115 -0
  104. package/dist/editor/dirty-rect.js.map +1 -0
  105. package/dist/editor/gif-playback.d.ts +45 -0
  106. package/dist/editor/gif-playback.d.ts.map +1 -0
  107. package/dist/editor/gif-playback.js +125 -0
  108. package/dist/editor/gif-playback.js.map +1 -0
  109. package/dist/editor/hit-test.d.ts +3 -3
  110. package/dist/editor/hit-test.d.ts.map +1 -1
  111. package/dist/editor/hit-test.js +40 -15
  112. package/dist/editor/hit-test.js.map +1 -1
  113. package/dist/editor/interaction-state.d.ts +184 -0
  114. package/dist/editor/interaction-state.d.ts.map +1 -0
  115. package/dist/editor/interaction-state.js +139 -0
  116. package/dist/editor/interaction-state.js.map +1 -0
  117. package/dist/editor/link-handle-drag.d.ts +152 -0
  118. package/dist/editor/link-handle-drag.d.ts.map +1 -0
  119. package/dist/editor/link-handle-drag.js +300 -0
  120. package/dist/editor/link-handle-drag.js.map +1 -0
  121. package/dist/editor/long-press.d.ts.map +1 -1
  122. package/dist/editor/long-press.js +2 -2
  123. package/dist/editor/long-press.js.map +1 -1
  124. package/dist/editor/pinch.d.ts.map +1 -1
  125. package/dist/editor/pinch.js +6 -6
  126. package/dist/editor/pinch.js.map +1 -1
  127. package/dist/editor/pointer-binding.d.ts +9 -11
  128. package/dist/editor/pointer-binding.d.ts.map +1 -1
  129. package/dist/editor/pointer-binding.js +1191 -890
  130. package/dist/editor/pointer-binding.js.map +1 -1
  131. package/dist/editor/public/arrange-group.d.ts +3 -9
  132. package/dist/editor/public/arrange-group.d.ts.map +1 -1
  133. package/dist/editor/public/arrange-group.js +4 -6
  134. package/dist/editor/public/arrange-group.js.map +1 -1
  135. package/dist/editor/public/brush.d.ts +31 -12
  136. package/dist/editor/public/brush.d.ts.map +1 -1
  137. package/dist/editor/public/brush.js +66 -17
  138. package/dist/editor/public/brush.js.map +1 -1
  139. package/dist/editor/public/clipboard.d.ts +2 -4
  140. package/dist/editor/public/clipboard.d.ts.map +1 -1
  141. package/dist/editor/public/clipboard.js +2 -4
  142. package/dist/editor/public/clipboard.js.map +1 -1
  143. package/dist/editor/public/cursor.d.ts +29 -0
  144. package/dist/editor/public/cursor.d.ts.map +1 -0
  145. package/dist/editor/public/cursor.js +146 -0
  146. package/dist/editor/public/cursor.js.map +1 -0
  147. package/dist/editor/public/eraser.d.ts +55 -0
  148. package/dist/editor/public/eraser.d.ts.map +1 -0
  149. package/dist/editor/public/eraser.js +65 -0
  150. package/dist/editor/public/eraser.js.map +1 -0
  151. package/dist/editor/public/frame-name.d.ts +20 -0
  152. package/dist/editor/public/frame-name.d.ts.map +1 -0
  153. package/dist/editor/public/frame-name.js +54 -0
  154. package/dist/editor/public/frame-name.js.map +1 -0
  155. package/dist/editor/public/image-insert.d.ts +1 -1
  156. package/dist/editor/public/image-insert.d.ts.map +1 -1
  157. package/dist/editor/public/laser.d.ts +38 -0
  158. package/dist/editor/public/laser.d.ts.map +1 -0
  159. package/dist/editor/public/laser.js +42 -0
  160. package/dist/editor/public/laser.js.map +1 -0
  161. package/dist/editor/public/layers.d.ts.map +1 -1
  162. package/dist/editor/public/layers.js +2 -2
  163. package/dist/editor/public/layers.js.map +1 -1
  164. package/dist/editor/public/link.d.ts +11 -2
  165. package/dist/editor/public/link.d.ts.map +1 -1
  166. package/dist/editor/public/link.js +70 -2
  167. package/dist/editor/public/link.js.map +1 -1
  168. package/dist/editor/public/placement.d.ts +60 -2
  169. package/dist/editor/public/placement.d.ts.map +1 -1
  170. package/dist/editor/public/placement.js +193 -2
  171. package/dist/editor/public/placement.js.map +1 -1
  172. package/dist/editor/public/selection-ops.d.ts +35 -1
  173. package/dist/editor/public/selection-ops.d.ts.map +1 -1
  174. package/dist/editor/public/selection-ops.js +97 -2
  175. package/dist/editor/public/selection-ops.js.map +1 -1
  176. package/dist/editor/public/stroke-eraser-coverage.d.ts +37 -0
  177. package/dist/editor/public/stroke-eraser-coverage.d.ts.map +1 -0
  178. package/dist/editor/public/stroke-eraser-coverage.js +168 -0
  179. package/dist/editor/public/stroke-eraser-coverage.js.map +1 -0
  180. package/dist/editor/public/stroke-eraser.d.ts +50 -0
  181. package/dist/editor/public/stroke-eraser.d.ts.map +1 -0
  182. package/dist/editor/public/stroke-eraser.js +176 -0
  183. package/dist/editor/public/stroke-eraser.js.map +1 -0
  184. package/dist/editor/public/stroke-smoothing.d.ts +21 -0
  185. package/dist/editor/public/stroke-smoothing.d.ts.map +1 -0
  186. package/dist/editor/public/stroke-smoothing.js +37 -0
  187. package/dist/editor/public/stroke-smoothing.js.map +1 -0
  188. package/dist/editor/public/text-edit.d.ts +1 -10
  189. package/dist/editor/public/text-edit.d.ts.map +1 -1
  190. package/dist/editor/public/text-edit.js +2 -16
  191. package/dist/editor/public/text-edit.js.map +1 -1
  192. package/dist/editor/public/tool-ops.d.ts +130 -0
  193. package/dist/editor/public/tool-ops.d.ts.map +1 -0
  194. package/dist/editor/public/tool-ops.js +392 -0
  195. package/dist/editor/public/tool-ops.js.map +1 -0
  196. package/dist/editor/public/z-order.d.ts +1 -12
  197. package/dist/editor/public/z-order.d.ts.map +1 -1
  198. package/dist/editor/public/z-order.js +5 -5
  199. package/dist/editor/public/z-order.js.map +1 -1
  200. package/dist/editor/public/zoom-pan.d.ts +15 -4
  201. package/dist/editor/public/zoom-pan.d.ts.map +1 -1
  202. package/dist/editor/public/zoom-pan.js +39 -7
  203. package/dist/editor/public/zoom-pan.js.map +1 -1
  204. package/dist/editor/render-orchestrator.d.ts +177 -5
  205. package/dist/editor/render-orchestrator.d.ts.map +1 -1
  206. package/dist/editor/render-orchestrator.js +519 -358
  207. package/dist/editor/render-orchestrator.js.map +1 -1
  208. package/dist/editor/resize-helpers.d.ts +21 -5
  209. package/dist/editor/resize-helpers.d.ts.map +1 -1
  210. package/dist/editor/resize-helpers.js +59 -19
  211. package/dist/editor/resize-helpers.js.map +1 -1
  212. package/dist/editor/text-edit.d.ts +136 -0
  213. package/dist/editor/text-edit.d.ts.map +1 -0
  214. package/dist/editor/text-edit.js +328 -0
  215. package/dist/editor/text-edit.js.map +1 -0
  216. package/dist/editor/viewport-helpers.d.ts.map +1 -1
  217. package/dist/editor/viewport-helpers.js +3 -3
  218. package/dist/editor/viewport-helpers.js.map +1 -1
  219. package/dist/editor-events.d.ts +1 -1
  220. package/dist/editor-events.d.ts.map +1 -1
  221. package/dist/editor.d.ts +603 -346
  222. package/dist/editor.d.ts.map +1 -1
  223. package/dist/editor.js +1843 -1630
  224. package/dist/editor.js.map +1 -1
  225. package/dist/file-drop.d.ts.map +1 -1
  226. package/dist/file-drop.js +1 -2
  227. package/dist/file-drop.js.map +1 -1
  228. package/dist/frame-helpers.d.ts.map +1 -1
  229. package/dist/frame-helpers.js +5 -5
  230. package/dist/frame-helpers.js.map +1 -1
  231. package/dist/group-helpers.d.ts.map +1 -1
  232. package/dist/group-helpers.js +4 -4
  233. package/dist/group-helpers.js.map +1 -1
  234. package/dist/handle.d.ts +59 -6
  235. package/dist/handle.d.ts.map +1 -1
  236. package/dist/handle.js +99 -7
  237. package/dist/handle.js.map +1 -1
  238. package/dist/hotkeys-binding.d.ts +26 -0
  239. package/dist/hotkeys-binding.d.ts.map +1 -0
  240. package/dist/hotkeys-binding.js +35 -0
  241. package/dist/hotkeys-binding.js.map +1 -0
  242. package/dist/index.d.ts +9 -3
  243. package/dist/index.d.ts.map +1 -1
  244. package/dist/index.js +10 -3
  245. package/dist/index.js.map +1 -1
  246. package/dist/link-selection.d.ts +3 -5
  247. package/dist/link-selection.d.ts.map +1 -1
  248. package/dist/link-selection.js +3 -12
  249. package/dist/link-selection.js.map +1 -1
  250. package/dist/machine.d.ts +27 -1
  251. package/dist/machine.d.ts.map +1 -1
  252. package/dist/machine.js +38 -0
  253. package/dist/machine.js.map +1 -1
  254. package/dist/modes.d.ts +15 -1
  255. package/dist/modes.d.ts.map +1 -1
  256. package/dist/modes.js.map +1 -1
  257. package/dist/overlay.d.ts +92 -6
  258. package/dist/overlay.d.ts.map +1 -1
  259. package/dist/overlay.js +582 -125
  260. package/dist/overlay.js.map +1 -1
  261. package/dist/search.d.ts +37 -0
  262. package/dist/search.d.ts.map +1 -0
  263. package/dist/search.js +45 -0
  264. package/dist/search.js.map +1 -0
  265. package/dist/selection.d.ts.map +1 -1
  266. package/dist/selection.js +2 -10
  267. package/dist/selection.js.map +1 -1
  268. package/dist/util.d.ts +8 -0
  269. package/dist/util.d.ts.map +1 -0
  270. package/dist/util.js +17 -0
  271. package/dist/util.js.map +1 -0
  272. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"selection-ops.js","sourceRoot":"","sources":["../../../src/editor/public/selection-ops.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,GAKd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,KAAY,EACZ,OAA+B,EAC/B,KAAW,EACX,aAAuC,EAC8C,EAAE;IACvF,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC;YAAE,SAAS;QAC3C,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACtC,GAAG,EAAE;YACL,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE;SACrE,CAAC,CAAC,CAAC;QACJ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtB,KAAK,EAAE,CAAC;IACV,CAAC;IACD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,KAAY,EACZ,SAA8B,EAC9B,aAAkC,EAC2B,EAAE;IAC/D,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,iEAAiE;IACjE,yEAAyE;IACzE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAE;QAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QAChD,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACzC,IACE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;gBAC1D,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC,EACtD,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,aAAa;QAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,KAAY,EACZ,SAA8B,EAC9B,UAAwB,EAKjB,EAAE;IACT,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,WAAW,CACvB,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAC5F,CAAC;QACF,MAAM,KAAK,GAAG;YACZ,GAAG,KAAK;YACR,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE;YAChE,KAAK;SACK,CAAC;QACb,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAY,EACZ,GAAwB,EACxB,OAA4B,EACA,EAAE;IAC9B,IAAI,IAAI,GAAwB,SAAS,CAAC,KAAK,CAAC;IAChD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QACtC,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,KAAY,EACZ,OAA4B,EACA,EAAE;IAC9B,IAAI,IAAI,GAAwB,SAAS,CAAC,KAAK,CAAC;IAChD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM;YAAE,SAAS;QACvD,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAY,EAAe,EAAE;IACjE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM;YAAE,SAAS;QACvD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAAY,EACZ,GAAwB,EACxB,OAA2B,EAC8B,EAAE;IAC3D,MAAM,SAAS,GAAgB,EAAE,CAAC;IAClC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACxF,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9B,OAAO;QACL,KAAK,EAAE,CAAC;QACR,KAAK,EACH,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE;KAC7F,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,KAAY,EACZ,GAAwB,EACxB,OAAiG,EACxC,EAAE;IAC3D,MAAM,SAAS,GAAgB,EAAE,CAAC;IAClC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,KAAK,MAAM;YAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9B,OAAO;QACL,KAAK,EAAE,CAAC;QACR,KAAK,EACH,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE;KAC7F,CAAC;AACJ,CAAC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAW,EAAE,KAAa,EAAU,EAAE;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;SAC9C,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;SAC7C,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC;IAC1D,OAAO,SAAS,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AACnD,CAAC,CAAC;AAEF,0DAA0D;AAC1D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAyB,EAAuB,EAAE;IACpF,IAAI,IAAI,GAAwB,SAAS,CAAC,KAAK,CAAC;IAChD,KAAK,MAAM,EAAE,IAAI,GAAG;QAAE,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
1
+ {"version":3,"file":"selection-ops.js","sourceRoot":"","sources":["../../../src/editor/public/selection-ops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { BrushElement, BrushPoint } from "@oh-just-another/scene";
2
+ import type { Vec2 } from "@oh-just-another/types";
3
+ /**
4
+ * A covered (erased) span along a brush polyline, in ARC-LENGTH units:
5
+ * `[start, end]` with `start <= end`, both in `[0, total]`. Working in arc length
6
+ * (not vertex index) is what makes the stroke-eraser resolution-independent — a
7
+ * big disc grazing a sparsely-sampled stroke still removes the span it covers.
8
+ */
9
+ export type Interval = readonly [number, number];
10
+ /** Arc-length parametrisation of a brush polyline (lengths in world units). */
11
+ export interface BrushArc {
12
+ readonly pts: readonly BrushPoint[];
13
+ readonly position: Vec2;
14
+ /** `cum[i]` = arc length from point 0 to point i; `cum[n-1]` = `total`. */
15
+ readonly cum: readonly number[];
16
+ readonly total: number;
17
+ }
18
+ /** Precompute the arc-length parametrisation of `brush` (O(points)). */
19
+ export declare const brushArc: (brush: BrushElement) => BrushArc;
20
+ /** Local (position-relative) brush point at arc length `L`, clamped to `[0,total]`. */
21
+ export declare const localPointAtArc: (arc: BrushArc, L: number) => BrushPoint;
22
+ /**
23
+ * Arc-length spans of `arc` covered by the eraser SEGMENT `a → b` at `radius` —
24
+ * i.e. where the brush polyline lies within `radius` of the swept disc. Samples
25
+ * each brush segment whose bounding box (grown by `radius`) meets the eraser
26
+ * segment's, at {@link ERASE_COVERAGE_SAMPLE_FRACTION} × radius spacing, and pins
27
+ * each span's endpoints to the ring by bisection. Returns merged intervals (may
28
+ * be empty). A single-point brush yields `[[0,0]]` when the point is within reach.
29
+ */
30
+ export declare const coveredArcAgainstSegment: (arc: BrushArc, a: Vec2, b: Vec2, radius: number) => Interval[];
31
+ /** Merge overlapping / touching intervals into a sorted, disjoint set. */
32
+ export declare const mergeIntervals: (intervals: readonly Interval[]) => Interval[];
33
+ /** Total covered arc length across `intervals` (assumed disjoint). */
34
+ export declare const coveredLength: (intervals: readonly Interval[]) => number;
35
+ /** The KEPT arc spans: `[0, total]` minus the covered `intervals`. */
36
+ export declare const complementIntervals: (covered: readonly Interval[], total: number) => Interval[];
37
+ //# sourceMappingURL=stroke-eraser-coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stroke-eraser-coverage.d.ts","sourceRoot":"","sources":["../../../src/editor/public/stroke-eraser-coverage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAOnD;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAIjD,+EAA+E;AAC/E,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,SAAS,UAAU,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wEAAwE;AACxE,eAAO,MAAM,QAAQ,GAAI,OAAO,YAAY,KAAG,QAY9C,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,eAAe,GAAI,KAAK,QAAQ,EAAE,GAAG,MAAM,KAAG,UAuB1D,CAAC;AAgCF;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,GACnC,KAAK,QAAQ,EACb,GAAG,IAAI,EACP,GAAG,IAAI,EACP,QAAQ,MAAM,KACb,QAAQ,EAsDV,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,cAAc,GAAI,WAAW,SAAS,QAAQ,EAAE,KAAG,QAAQ,EAavE,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,aAAa,GAAI,WAAW,SAAS,QAAQ,EAAE,KAAG,MACV,CAAC;AAEtD,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,GAAI,SAAS,SAAS,QAAQ,EAAE,EAAE,OAAO,MAAM,KAAG,QAAQ,EAUzF,CAAC"}
@@ -0,0 +1,168 @@
1
+ import { hitTest } from "@oh-just-another/math";
2
+ import { req } from "../../util.js";
3
+ import { ERASE_COVERAGE_SAMPLE_FRACTION, ERASE_COVERAGE_MIN_SAMPLE_STEP, ERASE_BOUNDARY_BISECT_ITERS, } from "../../constants.js";
4
+ const EPS = 1e-6;
5
+ /** Precompute the arc-length parametrisation of `brush` (O(points)). */
6
+ export const brushArc = (brush) => {
7
+ const pts = brush.points;
8
+ const n = pts.length;
9
+ const cum = new Array(Math.max(1, n)).fill(0);
10
+ let acc = 0;
11
+ for (let i = 1; i < n; i++) {
12
+ const a = req(pts[i - 1]);
13
+ const b = req(pts[i]);
14
+ acc += Math.hypot(b.x - a.x, b.y - a.y);
15
+ cum[i] = acc;
16
+ }
17
+ return { pts, position: brush.position, cum, total: acc };
18
+ };
19
+ /** Local (position-relative) brush point at arc length `L`, clamped to `[0,total]`. */
20
+ export const localPointAtArc = (arc, L) => {
21
+ const { pts, cum, total } = arc;
22
+ const n = pts.length;
23
+ if (n === 0)
24
+ return { x: 0, y: 0, width: 0 };
25
+ if (n === 1 || L <= 0)
26
+ return { ...req(pts[0]) };
27
+ if (L >= total)
28
+ return { ...req(pts[n - 1]) };
29
+ // Binary-search the segment [lo, lo+1] whose arc span contains L.
30
+ let lo = 0;
31
+ let hi = n - 1;
32
+ while (hi - lo > 1) {
33
+ const mid = (lo + hi) >> 1;
34
+ if (req(cum[mid]) <= L)
35
+ lo = mid;
36
+ else
37
+ hi = mid;
38
+ }
39
+ const a = req(pts[lo]);
40
+ const b = req(pts[lo + 1]);
41
+ const segLen = req(cum[lo + 1]) - req(cum[lo]);
42
+ const t = segLen > 0 ? (L - req(cum[lo])) / segLen : 0;
43
+ return {
44
+ x: a.x + (b.x - a.x) * t,
45
+ y: a.y + (b.y - a.y) * t,
46
+ width: a.width + (b.width - a.width) * t,
47
+ };
48
+ };
49
+ const worldDistSqAtArc = (arc, L, a, b) => {
50
+ const p = localPointAtArc(arc, L);
51
+ return hitTest.distanceToSegmentSq({ x: arc.position.x + p.x, y: arc.position.y + p.y }, a, b);
52
+ };
53
+ /**
54
+ * Refine a covered-span endpoint by bisecting between an UNCOVERED arc position
55
+ * (`loL`) and a COVERED one (`hiL`) until it lands on the eraser ring (distance =
56
+ * radius). Returns the covered-side estimate, so the surviving fragment stops
57
+ * exactly at the ring rather than at the nearest sample. See
58
+ * {@link ERASE_BOUNDARY_BISECT_ITERS}.
59
+ */
60
+ const bisectBoundary = (arc, loL, hiL, a, b, radiusSq) => {
61
+ let lo = loL;
62
+ let hi = hiL;
63
+ for (let i = 0; i < ERASE_BOUNDARY_BISECT_ITERS; i++) {
64
+ const mid = (lo + hi) / 2;
65
+ if (worldDistSqAtArc(arc, mid, a, b) <= radiusSq)
66
+ hi = mid;
67
+ else
68
+ lo = mid;
69
+ }
70
+ return hi;
71
+ };
72
+ /**
73
+ * Arc-length spans of `arc` covered by the eraser SEGMENT `a → b` at `radius` —
74
+ * i.e. where the brush polyline lies within `radius` of the swept disc. Samples
75
+ * each brush segment whose bounding box (grown by `radius`) meets the eraser
76
+ * segment's, at {@link ERASE_COVERAGE_SAMPLE_FRACTION} × radius spacing, and pins
77
+ * each span's endpoints to the ring by bisection. Returns merged intervals (may
78
+ * be empty). A single-point brush yields `[[0,0]]` when the point is within reach.
79
+ */
80
+ export const coveredArcAgainstSegment = (arc, a, b, radius) => {
81
+ const { pts, cum, total } = arc;
82
+ const n = pts.length;
83
+ if (n === 0)
84
+ return [];
85
+ const radiusSq = radius * radius;
86
+ if (total === 0) {
87
+ const p = req(pts[0]);
88
+ const d = hitTest.distanceToSegmentSq({ x: arc.position.x + p.x, y: arc.position.y + p.y }, a, b);
89
+ return d <= radiusSq ? [[0, 0]] : [];
90
+ }
91
+ const exMinX = Math.min(a.x, b.x) - radius;
92
+ const exMaxX = Math.max(a.x, b.x) + radius;
93
+ const exMinY = Math.min(a.y, b.y) - radius;
94
+ const exMaxY = Math.max(a.y, b.y) + radius;
95
+ const px = arc.position.x;
96
+ const py = arc.position.y;
97
+ const step = Math.max(ERASE_COVERAGE_MIN_SAMPLE_STEP, radius * ERASE_COVERAGE_SAMPLE_FRACTION);
98
+ const raw = [];
99
+ for (let i = 0; i < n - 1; i++) {
100
+ const p0 = req(pts[i]);
101
+ const p1 = req(pts[i + 1]);
102
+ // Reject segments whose (radius-grown) bbox misses the eraser segment's.
103
+ if (Math.max(p0.x, p1.x) + px < exMinX ||
104
+ Math.min(p0.x, p1.x) + px > exMaxX ||
105
+ Math.max(p0.y, p1.y) + py < exMinY ||
106
+ Math.min(p0.y, p1.y) + py > exMaxY) {
107
+ continue;
108
+ }
109
+ const segStart = req(cum[i]);
110
+ const segLen = req(cum[i + 1]) - segStart;
111
+ if (segLen <= 0)
112
+ continue;
113
+ const steps = Math.max(1, Math.ceil(segLen / step));
114
+ let runStart = -1;
115
+ let prevL = segStart;
116
+ for (let k = 0; k <= steps; k++) {
117
+ const L = k === steps ? segStart + segLen : segStart + (segLen * k) / steps;
118
+ const cov = worldDistSqAtArc(arc, L, a, b) <= radiusSq;
119
+ if (cov && runStart < 0) {
120
+ runStart = k === 0 ? L : bisectBoundary(arc, prevL, L, a, b, radiusSq);
121
+ }
122
+ else if (!cov && runStart >= 0) {
123
+ raw.push([runStart, bisectBoundary(arc, L, prevL, a, b, radiusSq)]);
124
+ runStart = -1;
125
+ }
126
+ prevL = L;
127
+ }
128
+ if (runStart >= 0)
129
+ raw.push([runStart, segStart + segLen]);
130
+ }
131
+ return mergeIntervals(raw);
132
+ };
133
+ /** Merge overlapping / touching intervals into a sorted, disjoint set. */
134
+ export const mergeIntervals = (intervals) => {
135
+ if (intervals.length <= 1)
136
+ return intervals.map((iv) => [iv[0], iv[1]]);
137
+ const sorted = [...intervals].sort((p, q) => p[0] - q[0]);
138
+ const out = [];
139
+ for (const [s, e] of sorted) {
140
+ const last = out[out.length - 1];
141
+ if (last && s <= last[1] + EPS) {
142
+ if (e > last[1])
143
+ last[1] = e;
144
+ }
145
+ else {
146
+ out.push([s, e]);
147
+ }
148
+ }
149
+ return out;
150
+ };
151
+ /** Total covered arc length across `intervals` (assumed disjoint). */
152
+ export const coveredLength = (intervals) => intervals.reduce((sum, [s, e]) => sum + (e - s), 0);
153
+ /** The KEPT arc spans: `[0, total]` minus the covered `intervals`. */
154
+ export const complementIntervals = (covered, total) => {
155
+ const merged = mergeIntervals(covered);
156
+ const kept = [];
157
+ let cursor = 0;
158
+ for (const [s, e] of merged) {
159
+ if (s > cursor + EPS)
160
+ kept.push([cursor, s]);
161
+ if (e > cursor)
162
+ cursor = e;
163
+ }
164
+ if (total > cursor + EPS)
165
+ kept.push([cursor, total]);
166
+ return kept;
167
+ };
168
+ //# sourceMappingURL=stroke-eraser-coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stroke-eraser-coverage.js","sourceRoot":"","sources":["../../../src/editor/public/stroke-eraser-coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type BrushElement, type Scene, type Patch } from "@oh-just-another/scene";
2
+ import { type ElementId, type Vec2 } from "@oh-just-another/types";
3
+ import { type Interval } from "./stroke-eraser-coverage.js";
4
+ /**
5
+ * Grow a brush's accumulated covered spans by the eraser segment `a → b` (world)
6
+ * at `radius` and return the merged result. INCREMENTAL: the live gesture calls
7
+ * this once per pointer move with only the new segment, so a drag costs
8
+ * O(points) per move instead of re-scanning the whole path each frame. `radius`
9
+ * is the visible cursor ring in world units. Pure — returns a new interval list.
10
+ */
11
+ export declare const markErasedIntervals: (brush: BrushElement, existing: readonly Interval[], a: Vec2, b: Vec2, radius: number) => Interval[];
12
+ /**
13
+ * STROKE-ERASER core (pure). Cut a single brush against an eraser path: the arc
14
+ * spans of the brush polyline within `radius` of the path are removed and the
15
+ * survivors split into fragment {@link BrushElement}s (endpoints on the ring).
16
+ * When nothing is covered, `erasedAny` is `false` and `fragments` is `[brush]`
17
+ * unchanged so the caller can skip the swap. One-shot (scans the whole path) —
18
+ * the live gesture uses the incremental {@link markErasedIntervals} instead.
19
+ */
20
+ export declare const computeEraseBrushStroke: (brush: BrushElement, eraserPathWorld: readonly Vec2[], radius: number, makeId: () => ElementId) => {
21
+ fragments: BrushElement[];
22
+ erasedAny: boolean;
23
+ };
24
+ /**
25
+ * Commit the accumulated stroke-erase: `erased` maps each touched brush id to the
26
+ * covered arc-length spans built incrementally by {@link markErasedIntervals}.
27
+ * Each such brush is replaced with its fragments (remove original + add fragments)
28
+ * and any link bound to it is detached (drop the binding — don't re-bind to a
29
+ * fragment). Returns the next scene + patches for ONE history batch, or `null`
30
+ * when nothing is cut.
31
+ */
32
+ export declare const computeEraseFromMasks: (scene: Scene, erased: ReadonlyMap<ElementId, readonly Interval[]>, makeId: () => ElementId) => {
33
+ readonly scene: Scene;
34
+ readonly patches: Patch[];
35
+ readonly removedIds: ElementId[];
36
+ readonly addedIds: ElementId[];
37
+ } | null;
38
+ /**
39
+ * Live-preview counterpart of {@link computeEraseFromMasks}: the cut fragments for
40
+ * every brush with covered spans so far, WITHOUT mutating the scene or consuming
41
+ * real ids. `fragments` are drawn on the overlay and `hidden` (the touched
42
+ * originals) suppressed in the main pass, so the user sees the cut before
43
+ * releasing. Fragment ids are deterministic per frame (never enter history).
44
+ * `null` when nothing is cut yet.
45
+ */
46
+ export declare const computeStrokeErasePreviewFromMasks: (scene: Scene, erased: ReadonlyMap<ElementId, readonly Interval[]>) => {
47
+ fragments: BrushElement[];
48
+ hidden: Set<ElementId>;
49
+ } | null;
50
+ //# sourceMappingURL=stroke-eraser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stroke-eraser.d.ts","sourceRoot":"","sources":["../../../src/editor/public/stroke-eraser.ts"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,YAAY,EAEjB,KAAK,KAAK,EACV,KAAK,KAAK,EACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,IAAI,EACV,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAML,KAAK,QAAQ,EACd,MAAM,6BAA6B,CAAC;AA+DrC;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,YAAY,EACnB,UAAU,SAAS,QAAQ,EAAE,EAC7B,GAAG,IAAI,EACP,GAAG,IAAI,EACP,QAAQ,MAAM,KACb,QAAQ,EAIV,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GAClC,OAAO,YAAY,EACnB,iBAAiB,SAAS,IAAI,EAAE,EAChC,QAAQ,MAAM,EACd,QAAQ,MAAM,SAAS,KACtB;IAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAajD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,KAAK,EACZ,QAAQ,WAAW,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC,EACnD,QAAQ,MAAM,SAAS,KACtB;IACD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;CAChC,GAAG,IAkCH,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,kCAAkC,GAC7C,OAAO,KAAK,EACZ,QAAQ,WAAW,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC,KAClD;IAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;CAAE,GAAG,IAgB1D,CAAC"}
@@ -0,0 +1,176 @@
1
+ import { req } from "../../util.js";
2
+ import { addElement, removeElement, removeLink, orderBetween, isBrush, endpointElementId, } from "@oh-just-another/scene";
3
+ import { elementId as castElementId, } from "@oh-just-another/types";
4
+ import { ERASE_FRAGMENT_MIN_ARC } from "../../constants.js";
5
+ import { brushArc, coveredArcAgainstSegment, complementIntervals, mergeIntervals, localPointAtArc, } from "./stroke-eraser-coverage.js";
6
+ const EPS = 1e-6;
7
+ /**
8
+ * Rebuild a brush's surviving pieces from the COVERED arc-length spans the eraser
9
+ * removed. The kept spans (complement of `covered`) each become a fresh fragment
10
+ * {@link BrushElement}: the span endpoints — already pinned to the eraser ring by
11
+ * {@link coveredArcAgainstSegment}'s bisection — are the fragment's first/last
12
+ * points, with the original vertices strictly inside the span in between. Points
13
+ * are re-localised to the fragment's first world position, per-point widths kept,
14
+ * fractional `order`s around the original's slot, never `closed`.
15
+ *
16
+ * Cutting by ARC LENGTH (not vertex index) is what makes the eraser remove the
17
+ * geometry it visibly covers regardless of how densely the stroke was sampled — a
18
+ * big disc grazing a sparse line no longer slips between two far-apart vertices. A
19
+ * kept span shorter than {@link ERASE_FRAGMENT_MIN_ARC} is dropped (litter).
20
+ */
21
+ const buildFragmentsFromCoverage = (brush, covered, makeId) => {
22
+ const arc = brushArc(brush);
23
+ if (arc.total === 0)
24
+ return []; // a single-point brush leaves nothing once cut
25
+ const kept = complementIntervals(covered, arc.total);
26
+ const fragments = [];
27
+ let prevOrder = brush.order;
28
+ let idx = 0;
29
+ for (const [L0, L1] of kept) {
30
+ if (L1 - L0 < ERASE_FRAGMENT_MIN_ARC)
31
+ continue; // drop stray nubs
32
+ const runPts = [localPointAtArc(arc, L0)];
33
+ for (let i = 0; i < arc.pts.length; i++) {
34
+ const c = req(arc.cum[i]);
35
+ if (c > L0 + EPS && c < L1 - EPS)
36
+ runPts.push({ ...req(arc.pts[i]) });
37
+ }
38
+ runPts.push(localPointAtArc(arc, L1));
39
+ if (runPts.length < 2)
40
+ continue;
41
+ const anchor = req(runPts[0]);
42
+ const worldFirst = { x: brush.position.x + anchor.x, y: brush.position.y + anchor.y };
43
+ const localPoints = runPts.map((p) => ({
44
+ x: p.x - anchor.x,
45
+ y: p.y - anchor.y,
46
+ width: p.width,
47
+ }));
48
+ const order = idx === 0 ? brush.order : orderBetween(prevOrder, null);
49
+ prevOrder = order;
50
+ idx++;
51
+ fragments.push({
52
+ id: makeId(),
53
+ layerId: brush.layerId,
54
+ type: "brush",
55
+ position: worldFirst,
56
+ rotation: 0,
57
+ scale: { x: 1, y: 1 },
58
+ order,
59
+ style: brush.style,
60
+ points: localPoints,
61
+ });
62
+ }
63
+ return fragments;
64
+ };
65
+ /**
66
+ * Grow a brush's accumulated covered spans by the eraser segment `a → b` (world)
67
+ * at `radius` and return the merged result. INCREMENTAL: the live gesture calls
68
+ * this once per pointer move with only the new segment, so a drag costs
69
+ * O(points) per move instead of re-scanning the whole path each frame. `radius`
70
+ * is the visible cursor ring in world units. Pure — returns a new interval list.
71
+ */
72
+ export const markErasedIntervals = (brush, existing, a, b, radius) => {
73
+ const add = coveredArcAgainstSegment(brushArc(brush), a, b, radius);
74
+ if (add.length === 0)
75
+ return existing.length > 0 ? mergeIntervals(existing) : [];
76
+ return mergeIntervals([...existing, ...add]);
77
+ };
78
+ /**
79
+ * STROKE-ERASER core (pure). Cut a single brush against an eraser path: the arc
80
+ * spans of the brush polyline within `radius` of the path are removed and the
81
+ * survivors split into fragment {@link BrushElement}s (endpoints on the ring).
82
+ * When nothing is covered, `erasedAny` is `false` and `fragments` is `[brush]`
83
+ * unchanged so the caller can skip the swap. One-shot (scans the whole path) —
84
+ * the live gesture uses the incremental {@link markErasedIntervals} instead.
85
+ */
86
+ export const computeEraseBrushStroke = (brush, eraserPathWorld, radius, makeId) => {
87
+ if (eraserPathWorld.length === 0)
88
+ return { fragments: [brush], erasedAny: false };
89
+ const arc = brushArc(brush);
90
+ let covered = [];
91
+ const segs = Math.max(1, eraserPathWorld.length - 1);
92
+ for (let i = 0; i < segs; i++) {
93
+ const a = req(eraserPathWorld[i]);
94
+ const b = req(eraserPathWorld[Math.min(i + 1, eraserPathWorld.length - 1)]);
95
+ const add = coveredArcAgainstSegment(arc, a, b, radius);
96
+ if (add.length > 0)
97
+ covered = mergeIntervals([...covered, ...add]);
98
+ }
99
+ if (covered.length === 0)
100
+ return { fragments: [brush], erasedAny: false };
101
+ return { fragments: buildFragmentsFromCoverage(brush, covered, makeId), erasedAny: true };
102
+ };
103
+ /**
104
+ * Commit the accumulated stroke-erase: `erased` maps each touched brush id to the
105
+ * covered arc-length spans built incrementally by {@link markErasedIntervals}.
106
+ * Each such brush is replaced with its fragments (remove original + add fragments)
107
+ * and any link bound to it is detached (drop the binding — don't re-bind to a
108
+ * fragment). Returns the next scene + patches for ONE history batch, or `null`
109
+ * when nothing is cut.
110
+ */
111
+ export const computeEraseFromMasks = (scene, erased, makeId) => {
112
+ let s = scene;
113
+ const patches = [];
114
+ const removedIds = [];
115
+ const addedIds = [];
116
+ const droppedLinks = new Set();
117
+ for (const [brushId, covered] of erased) {
118
+ if (covered.length === 0)
119
+ continue;
120
+ const el = scene.elements.get(brushId);
121
+ if (el === undefined || !isBrush(el))
122
+ continue;
123
+ const fragments = buildFragmentsFromCoverage(el, covered, makeId);
124
+ // Detach links bound to this brush before removing it.
125
+ for (const edge of [...s.links.values()]) {
126
+ if (droppedLinks.has(edge.id))
127
+ continue;
128
+ if (endpointElementId(edge.from) === el.id || endpointElementId(edge.to) === el.id) {
129
+ const r = removeLink(s, edge.id);
130
+ s = r.scene;
131
+ patches.push(r.patch);
132
+ droppedLinks.add(edge.id);
133
+ }
134
+ }
135
+ const removed = removeElement(s, el.id);
136
+ s = removed.scene;
137
+ patches.push(removed.patch);
138
+ removedIds.push(el.id);
139
+ for (const frag of fragments) {
140
+ const added = addElement(s, frag);
141
+ s = added.scene;
142
+ patches.push(added.patch);
143
+ addedIds.push(frag.id);
144
+ }
145
+ }
146
+ if (patches.length === 0)
147
+ return null;
148
+ return { scene: s, patches, removedIds, addedIds };
149
+ };
150
+ /**
151
+ * Live-preview counterpart of {@link computeEraseFromMasks}: the cut fragments for
152
+ * every brush with covered spans so far, WITHOUT mutating the scene or consuming
153
+ * real ids. `fragments` are drawn on the overlay and `hidden` (the touched
154
+ * originals) suppressed in the main pass, so the user sees the cut before
155
+ * releasing. Fragment ids are deterministic per frame (never enter history).
156
+ * `null` when nothing is cut yet.
157
+ */
158
+ export const computeStrokeErasePreviewFromMasks = (scene, erased) => {
159
+ const fragments = [];
160
+ const hidden = new Set();
161
+ for (const [brushId, covered] of erased) {
162
+ if (covered.length === 0)
163
+ continue;
164
+ const el = scene.elements.get(brushId);
165
+ if (el === undefined || !isBrush(el))
166
+ continue;
167
+ let n = 0;
168
+ const parts = buildFragmentsFromCoverage(el, covered, () => castElementId(`stroke-erase-preview-${el.id}-${n++}`));
169
+ hidden.add(el.id);
170
+ fragments.push(...parts);
171
+ }
172
+ if (hidden.size === 0)
173
+ return null;
174
+ return { fragments, hidden };
175
+ };
176
+ //# sourceMappingURL=stroke-eraser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stroke-eraser.js","sourceRoot":"","sources":["../../../src/editor/public/stroke-eraser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,YAAY,EACZ,OAAO,EACP,iBAAiB,GAKlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,SAAS,IAAI,aAAa,GAI3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,QAAQ,EACR,wBAAwB,EACxB,mBAAmB,EACnB,cAAc,EACd,eAAe,GAEhB,MAAM,6BAA6B,CAAC;AAErC,MAAM,GAAG,GAAG,IAAI,CAAC;AAEjB;;;;;;;;;;;;;GAaG;AACH,MAAM,0BAA0B,GAAG,CACjC,KAAmB,EACnB,OAA4B,EAC5B,MAAuB,EACP,EAAE;IAClB,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC,CAAC,+CAA+C;IAC/E,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;IAC5B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5B,IAAI,EAAE,GAAG,EAAE,GAAG,sBAAsB;YAAE,SAAS,CAAC,kBAAkB;QAClE,MAAM,MAAM,GAAiB,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAChC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,WAAW,GAAiB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnD,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;YACjB,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;YACjB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC,CAAC;QACJ,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACtE,SAAS,GAAG,KAAK,CAAC;QAClB,GAAG,EAAE,CAAC;QACN,SAAS,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,MAAM,EAAE;YACZ,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YACrB,KAAK;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAmB,EACnB,QAA6B,EAC7B,CAAO,EACP,CAAO,EACP,MAAc,EACF,EAAE;IACd,MAAM,GAAG,GAAG,wBAAwB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACpE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,OAAO,cAAc,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,KAAmB,EACnB,eAAgC,EAChC,MAAc,EACd,MAAuB,EAC4B,EAAE;IACrD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAClF,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,OAAO,GAAe,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,wBAAwB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,GAAG,cAAc,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC1E,OAAO,EAAE,SAAS,EAAE,0BAA0B,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC5F,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,KAAY,EACZ,MAAmD,EACnD,MAAuB,EAMhB,EAAE;IACT,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAAE,SAAS;QAC/C,MAAM,SAAS,GAAG,0BAA0B,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAClE,uDAAuD;QACvD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACzC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,SAAS;YACxC,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnF,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACtB,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AACrD,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAChD,KAAY,EACZ,MAAmD,EACW,EAAE;IAChE,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAa,CAAC;IACpC,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAAE,SAAS;QAC/C,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,MAAM,KAAK,GAAG,0BAA0B,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CACzD,aAAa,CAAC,wBAAwB,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CACtD,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type Vec2 } from "@oh-just-another/types";
2
+ /** Any point that carries at least a world position. */
3
+ export interface SmoothablePoint {
4
+ readonly x: number;
5
+ readonly y: number;
6
+ }
7
+ /**
8
+ * Resample a sparse polyline into a smooth, dense point list by fitting a
9
+ * Catmull-Rom spline through the captured points (reusing `catmullRomBeziers`
10
+ * from `@oh-just-another/scene` — one spline implementation for the whole repo)
11
+ * and sampling `perSegment` sub-points per span.
12
+ *
13
+ * Freehand input (laser trail, brush stroke) is captured sparsely — one point
14
+ * per pointer-move — so the raw polyline is angular. The `blend` callback
15
+ * rebuilds each resampled point from its span endpoints and the interpolation
16
+ * parameter `u`, so per-point payload beyond position (timestamp for the laser,
17
+ * width for the brush) is carried across smoothly. Fewer than three points
18
+ * can't form a curve, so they pass through unchanged.
19
+ */
20
+ export declare const smoothStrokePoints: <P extends SmoothablePoint>(points: readonly P[], perSegment: number, blend: (a: P, b: P, pos: Vec2, u: number) => P) => P[];
21
+ //# sourceMappingURL=stroke-smoothing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stroke-smoothing.d.ts","sourceRoot":"","sources":["../../../src/editor/public/stroke-smoothing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAIxD,wDAAwD;AACxD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,eAAe,EAC1D,QAAQ,SAAS,CAAC,EAAE,EACpB,YAAY,MAAM,EAClB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,KAC7C,CAAC,EAkBH,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { req } from "@oh-just-another/types";
2
+ import { bezier } from "@oh-just-another/math";
3
+ import { catmullRomBeziers } from "@oh-just-another/scene";
4
+ /**
5
+ * Resample a sparse polyline into a smooth, dense point list by fitting a
6
+ * Catmull-Rom spline through the captured points (reusing `catmullRomBeziers`
7
+ * from `@oh-just-another/scene` — one spline implementation for the whole repo)
8
+ * and sampling `perSegment` sub-points per span.
9
+ *
10
+ * Freehand input (laser trail, brush stroke) is captured sparsely — one point
11
+ * per pointer-move — so the raw polyline is angular. The `blend` callback
12
+ * rebuilds each resampled point from its span endpoints and the interpolation
13
+ * parameter `u`, so per-point payload beyond position (timestamp for the laser,
14
+ * width for the brush) is carried across smoothly. Fewer than three points
15
+ * can't form a curve, so they pass through unchanged.
16
+ */
17
+ export const smoothStrokePoints = (points, perSegment, blend) => {
18
+ if (points.length < 3)
19
+ return points;
20
+ const segments = catmullRomBeziers(points.map((p) => ({ x: p.x, y: p.y })));
21
+ const first = req(points[0]);
22
+ const out = [first];
23
+ let prev = { x: first.x, y: first.y };
24
+ for (let i = 0; i < segments.length; i++) {
25
+ const seg = req(segments[i]);
26
+ const a = req(points[i]);
27
+ const b = req(points[i + 1]);
28
+ for (let j = 1; j <= perSegment; j++) {
29
+ const u = j / perSegment;
30
+ const p = bezier.cubicAt(prev, seg.c1, seg.c2, seg.to, u);
31
+ out.push(blend(a, b, p, u));
32
+ }
33
+ prev = seg.to;
34
+ }
35
+ return out;
36
+ };
37
+ //# sourceMappingURL=stroke-smoothing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stroke-smoothing.js","sourceRoot":"","sources":["../../../src/editor/public/stroke-smoothing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAa,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAQ3D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,MAAoB,EACpB,UAAkB,EAClB,KAA8C,EACzC,EAAE;IACP,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAa,CAAC;IAC5C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAQ,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,IAAI,GAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;YACzB,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
@@ -1,17 +1,8 @@
1
- import { type Scene, type Patch } from "@oh-just-another/scene";
1
+ import { type Scene } from "@oh-just-another/scene";
2
2
  import type { LayerId, ElementId } from "@oh-just-another/types";
3
3
  /**
4
4
  * Precondition check for `beginTextEdit`. Returns `true` when the
5
5
  * shape exists, is a text shape, and lives on an unlocked layer.
6
6
  */
7
7
  export declare const canBeginTextEdit: (scene: Scene, id: ElementId, isLayerLocked: (id: LayerId) => boolean) => boolean;
8
- /**
9
- * Compute the patch for replacing a text shape's body. Returns `null`
10
- * when the shape disappeared or the text didn't actually change (the
11
- * caller still clears `_editingTextElement` and notifies on null).
12
- */
13
- export declare const computeCommitTextEdit: (scene: Scene, id: ElementId, next: string) => {
14
- readonly scene: Scene;
15
- readonly patch: Patch;
16
- } | null;
17
8
  //# sourceMappingURL=text-edit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-edit.d.ts","sourceRoot":"","sources":["../../../src/editor/public/text-edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,KAAK,EACZ,IAAI,SAAS,EACb,eAAe,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,KACtC,OAKF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,KAAK,EACZ,IAAI,SAAS,EACb,MAAM,MAAM,KACX;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAAG,IAMrD,CAAC"}
1
+ {"version":3,"file":"text-edit.d.ts","sourceRoot":"","sources":["../../../src/editor/public/text-edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,KAAK,EACZ,IAAI,SAAS,EACb,eAAe,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,KACtC,OAKF,CAAC"}