@sakuzu/maplibre-gl-draw 1.0.0 → 2.0.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 (540) hide show
  1. package/CHANGELOG.md +1016 -2
  2. package/README.ja.md +39 -19
  3. package/README.md +41 -21
  4. package/dist/api/datasets.d.ts +258 -0
  5. package/dist/api/document.d.ts +66 -0
  6. package/dist/api/draw.d.ts +135 -0
  7. package/dist/api/draw.js +18 -0
  8. package/dist/api/drawing.d.ts +87 -0
  9. package/dist/api/errors.d.ts +35 -0
  10. package/dist/api/errors.js +35 -0
  11. package/dist/api/events.d.ts +306 -0
  12. package/dist/api/extension/context.d.ts +247 -0
  13. package/dist/api/extension/feature-type.d.ts +129 -0
  14. package/dist/api/extension/mode.d.ts +123 -0
  15. package/dist/api/extension/plugin.d.ts +51 -0
  16. package/dist/api/extension/plugin.js +3 -0
  17. package/dist/api/extension/provider.d.ts +119 -0
  18. package/dist/api/extension/provider.js +3 -0
  19. package/dist/api/extension/render.d.ts +176 -0
  20. package/dist/api/extension/render.js +3 -0
  21. package/dist/api/extension/store.d.ts +190 -0
  22. package/dist/api/extension/store.js +3 -0
  23. package/dist/api/extensions.d.ts +306 -0
  24. package/dist/api/extensions.js +3 -0
  25. package/dist/api/features.d.ts +188 -0
  26. package/dist/api/features.js +3 -0
  27. package/dist/api/groups.d.ts +111 -0
  28. package/dist/api/groups.js +3 -0
  29. package/dist/api/hidden.d.ts +45 -0
  30. package/dist/api/hidden.js +3 -0
  31. package/dist/api/impl/adapters.js +463 -0
  32. package/dist/api/impl/contexts.js +466 -0
  33. package/dist/api/impl/create-draw.js +124 -0
  34. package/dist/api/impl/datasets.js +404 -0
  35. package/dist/api/impl/destroy-guard.js +74 -0
  36. package/dist/api/impl/document.js +280 -0
  37. package/dist/api/impl/drawing.js +180 -0
  38. package/dist/api/impl/engine-context.d.ts +7 -0
  39. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  40. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  41. package/dist/api/impl/events.js +422 -0
  42. package/dist/api/impl/extension-host.js +361 -0
  43. package/dist/api/impl/extensions.js +229 -0
  44. package/dist/api/impl/features.js +445 -0
  45. package/dist/api/impl/geometry/apply.d.ts +32 -0
  46. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  47. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  48. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  49. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  50. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  51. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  52. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  53. package/dist/api/impl/geometry/types.js +3 -0
  54. package/dist/api/impl/groups.d.ts +3 -0
  55. package/dist/api/impl/groups.js +268 -0
  56. package/dist/api/impl/hidden.js +60 -0
  57. package/dist/api/impl/import-export/constants.d.ts +22 -0
  58. package/dist/api/impl/import-export/constants.js +24 -0
  59. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  60. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  61. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  62. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  63. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  64. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  66. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  68. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  69. package/dist/api/impl/import-export/image-import.js +73 -0
  70. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  71. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  72. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  73. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  74. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  75. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  76. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  77. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  78. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  79. package/dist/api/impl/import-export/style-validation.js +86 -0
  80. package/dist/api/impl/import-export/types.d.ts +52 -0
  81. package/dist/api/impl/import-export/types.js +3 -0
  82. package/dist/api/impl/input.js +180 -0
  83. package/dist/api/impl/layers.js +307 -0
  84. package/dist/api/impl/metadata.d.ts +1 -0
  85. package/dist/api/impl/metadata.js +22 -0
  86. package/dist/api/impl/options.d.ts +1 -0
  87. package/dist/api/impl/options.js +822 -0
  88. package/dist/api/impl/placement.d.ts +1 -0
  89. package/dist/api/impl/placement.js +138 -0
  90. package/dist/api/impl/render-context.d.ts +13 -0
  91. package/dist/api/impl/render-context.js +272 -0
  92. package/dist/api/impl/rows.d.ts +1 -0
  93. package/dist/api/impl/rows.js +46 -0
  94. package/dist/api/impl/selection.d.ts +1 -0
  95. package/dist/api/impl/selection.js +186 -0
  96. package/dist/api/impl/shared.d.ts +64 -0
  97. package/dist/api/impl/shared.js +178 -0
  98. package/dist/api/impl/validate-extension.d.ts +1 -0
  99. package/dist/api/impl/validate-extension.js +159 -0
  100. package/dist/api/layers.d.ts +130 -0
  101. package/dist/api/layers.js +3 -0
  102. package/dist/api/metadata.d.ts +18 -0
  103. package/dist/api/metadata.js +3 -0
  104. package/dist/api/model.d.ts +487 -0
  105. package/dist/api/model.js +47 -0
  106. package/dist/api/options.d.ts +466 -0
  107. package/dist/api/options.js +3 -0
  108. package/dist/api/selection.d.ts +94 -0
  109. package/dist/api/selection.js +3 -0
  110. package/dist/api/state.d.ts +155 -0
  111. package/dist/api/state.js +12 -0
  112. package/dist/{display → dataset}/chunk.d.ts +1 -1
  113. package/dist/{display → dataset}/chunk.js +4 -3
  114. package/dist/{display → dataset}/dataset.js +18 -21
  115. package/dist/dataset/interaction.d.ts +1 -0
  116. package/dist/{display → dataset}/interaction.js +18 -6
  117. package/dist/dataset/manager.d.ts +1 -0
  118. package/dist/dataset/provider.d.ts +1 -0
  119. package/dist/{display → dataset}/retained.d.ts +1 -1
  120. package/dist/{display → dataset}/retained.js +8 -7
  121. package/dist/dataset/source.d.ts +1 -0
  122. package/dist/{display → dataset}/source.js +17 -4
  123. package/dist/dataset/spatial.d.ts +1 -0
  124. package/dist/{display → dataset}/spatial.js +1 -1
  125. package/dist/dataset/style.d.ts +1 -0
  126. package/dist/{display → dataset}/style.js +1 -1
  127. package/dist/dataset/table-source.d.ts +1 -0
  128. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  129. package/dist/{display → dataset}/thinning.d.ts +0 -10
  130. package/dist/{display → dataset}/thinning.js +3 -2
  131. package/dist/dataset/triangulation.d.ts +1 -0
  132. package/dist/{display → dataset}/triangulation.js +0 -0
  133. package/dist/{display → dataset}/types.d.ts +82 -121
  134. package/dist/dataset/types.js +61 -0
  135. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  136. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  137. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  138. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  139. package/dist/dispatcher/hit-test/service.js +80 -16
  140. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  141. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  142. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  143. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  144. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  145. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  146. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  147. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  148. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  149. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  150. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  151. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  152. package/dist/dispatcher/input-router.js +152 -69
  153. package/dist/dispatcher/normalizer.js +6 -2
  154. package/dist/dispatcher/types.d.ts +6 -1
  155. package/dist/extension/feature-handler.d.ts +1 -182
  156. package/dist/extension/index.d.ts +4 -7
  157. package/dist/extension/renderers.d.ts +1 -208
  158. package/dist/geometry/angle.d.ts +0 -8
  159. package/dist/geometry/angle.js +0 -8
  160. package/dist/geometry/bbox.d.ts +4 -12
  161. package/dist/geometry/bbox.js +4 -12
  162. package/dist/geometry/boolean.d.ts +0 -51
  163. package/dist/geometry/boolean.js +0 -51
  164. package/dist/geometry/buffer.d.ts +0 -26
  165. package/dist/geometry/buffer.js +0 -26
  166. package/dist/geometry/circle.d.ts +0 -9
  167. package/dist/geometry/circle.js +0 -9
  168. package/dist/geometry/coords.d.ts +0 -16
  169. package/dist/geometry/coords.js +0 -16
  170. package/dist/geometry/distance.d.ts +0 -24
  171. package/dist/geometry/distance.js +0 -24
  172. package/dist/geometry/errors.d.ts +21 -36
  173. package/dist/geometry/errors.js +49 -29
  174. package/dist/geometry/geojson.d.ts +81 -0
  175. package/dist/geometry/geojson.js +164 -0
  176. package/dist/geometry/index.d.ts +38 -23
  177. package/dist/geometry/index.js +43 -31
  178. package/dist/geometry/measure.d.ts +0 -27
  179. package/dist/geometry/measure.js +0 -27
  180. package/dist/geometry/predicates.d.ts +0 -9
  181. package/dist/geometry/predicates.js +0 -9
  182. package/dist/geometry/public-bounds.d.ts +26 -0
  183. package/dist/geometry/public-bounds.js +30 -0
  184. package/dist/geometry/public-combine.d.ts +78 -0
  185. package/dist/geometry/public-combine.js +82 -0
  186. package/dist/geometry/public-create.d.ts +54 -0
  187. package/dist/geometry/public-create.js +70 -0
  188. package/dist/geometry/public-measure.d.ts +170 -0
  189. package/dist/geometry/public-measure.js +283 -0
  190. package/dist/geometry/public-predicates.d.ts +54 -0
  191. package/dist/geometry/public-predicates.js +144 -0
  192. package/dist/geometry/public-repair.d.ts +75 -0
  193. package/dist/geometry/public-repair.js +77 -0
  194. package/dist/geometry/simplify.d.ts +0 -7
  195. package/dist/geometry/simplify.js +0 -7
  196. package/dist/geometry/split.d.ts +0 -20
  197. package/dist/geometry/split.js +0 -20
  198. package/dist/geometry/units.d.ts +20 -12
  199. package/dist/geometry/units.js +20 -12
  200. package/dist/index.d.ts +52 -66
  201. package/dist/index.js +6 -18
  202. package/dist/messages.d.ts +7 -7
  203. package/dist/modes/draw/circle.js +83 -207
  204. package/dist/modes/draw/commit-layer.d.ts +5 -16
  205. package/dist/modes/draw/commit-layer.js +2 -13
  206. package/dist/modes/draw/freehand.js +108 -246
  207. package/dist/modes/draw/image.js +4 -2
  208. package/dist/modes/draw/index.d.ts +5 -5
  209. package/dist/modes/draw/index.js +5 -5
  210. package/dist/modes/draw/line.js +18 -354
  211. package/dist/modes/draw/point.js +29 -78
  212. package/dist/modes/draw/polygon.js +23 -368
  213. package/dist/modes/draw/trace-support.d.ts +43 -36
  214. package/dist/modes/draw/trace-support.js +95 -98
  215. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  216. package/dist/modes/draw/vertex-drawing.js +176 -0
  217. package/dist/modes/handler.d.ts +1 -285
  218. package/dist/modes/manager.d.ts +2 -2
  219. package/dist/modes/manager.js +3 -0
  220. package/dist/modes/select/box-selection.d.ts +3 -3
  221. package/dist/modes/select/box-selection.js +2 -1
  222. package/dist/modes/select/click-handler.d.ts +5 -5
  223. package/dist/modes/select/click-handler.js +22 -20
  224. package/dist/modes/select/cursor-handler.d.ts +2 -2
  225. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  226. package/dist/modes/select/drag/move.js +3 -3
  227. package/dist/modes/select/drag/operation.d.ts +3 -3
  228. package/dist/modes/select/drag/radius.js +5 -4
  229. package/dist/modes/select/drag/transform.d.ts +2 -2
  230. package/dist/modes/select/drag/transform.js +11 -5
  231. package/dist/modes/select/drag/vertex.d.ts +2 -2
  232. package/dist/modes/select/drag/vertex.js +13 -8
  233. package/dist/modes/select/drag-handler.js +44 -25
  234. package/dist/modes/select/mode.js +17 -17
  235. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  236. package/dist/modes/select/shortcut-handler.js +9 -7
  237. package/dist/operations/layer-operations.js +29 -168
  238. package/dist/operations/resize.d.ts +2 -2
  239. package/dist/operations/resize.js +5 -5
  240. package/dist/operations/rotate.js +5 -5
  241. package/dist/operations/selection-operations.d.ts +16 -1
  242. package/dist/operations/selection-operations.js +28 -13
  243. package/dist/operations/shared-vertex.js +4 -2
  244. package/dist/operations/trace-graph.d.ts +0 -18
  245. package/dist/operations/trace-graph.js +0 -18
  246. package/dist/operations/vertex.js +36 -35
  247. package/dist/shared/color.d.ts +1 -0
  248. package/dist/shared/color.js +245 -0
  249. package/dist/shared/config/constants.d.ts +1 -54
  250. package/dist/shared/config/constants.js +1 -58
  251. package/dist/shared/config/feature-style.d.ts +16 -13
  252. package/dist/shared/config/feature-style.js +9 -0
  253. package/dist/shared/config/rendering.d.ts +3 -3
  254. package/dist/shared/config/selection-highlight.d.ts +0 -15
  255. package/dist/shared/config/selection-highlight.js +4 -7
  256. package/dist/shared/config/selection.d.ts +2 -32
  257. package/dist/shared/config/selection.js +0 -18
  258. package/dist/shared/config/topology.d.ts +2 -2
  259. package/dist/shared/config/trace.d.ts +4 -4
  260. package/dist/shared/math/angle.d.ts +1 -1
  261. package/dist/shared/math/angle.js +1 -1
  262. package/dist/shared/math/circle.d.ts +1 -1
  263. package/dist/shared/math/circle.js +1 -1
  264. package/dist/shared/math/distance.d.ts +2 -1
  265. package/dist/shared/math/distance.js +3 -2
  266. package/dist/shared/math/index.d.ts +1 -1
  267. package/dist/shared/math/index.js +1 -1
  268. package/dist/shared/math/transform.d.ts +23 -0
  269. package/dist/shared/math/transform.js +47 -28
  270. package/dist/shared/properties.d.ts +18 -0
  271. package/dist/shared/properties.js +129 -0
  272. package/dist/shared/types/events.d.ts +15 -7
  273. package/dist/shared/types/model.d.ts +109 -159
  274. package/dist/shared/types/style.d.ts +1 -1
  275. package/dist/shared/utils/color.d.ts +2 -36
  276. package/dist/shared/utils/color.js +13 -70
  277. package/dist/shared/utils/coordinates.d.ts +30 -4
  278. package/dist/shared/utils/coordinates.js +56 -10
  279. package/dist/shared/utils/event-emitter.d.ts +1 -262
  280. package/dist/shared/utils/event-emitter.js +4 -3
  281. package/dist/shared/utils/feature-bbox.js +8 -7
  282. package/dist/shared/utils/feature-segments.js +5 -4
  283. package/dist/shared/utils/image.d.ts +0 -4
  284. package/dist/shared/utils/image.js +0 -6
  285. package/dist/shared/utils/name-generator.d.ts +14 -20
  286. package/dist/shared/utils/name-generator.js +20 -3
  287. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  288. package/dist/shared/utils/pixel-ratio.js +13 -4
  289. package/dist/shared/utils/property.d.ts +7 -50
  290. package/dist/shared/utils/property.js +22 -87
  291. package/dist/snapping/custom-targets.js +21 -4
  292. package/dist/snapping/indicator.js +20 -11
  293. package/dist/snapping/providers/display.d.ts +6 -1
  294. package/dist/snapping/providers/display.js +2 -1
  295. package/dist/snapping/providers/guide.d.ts +3 -43
  296. package/dist/snapping/providers/guide.js +1 -44
  297. package/dist/snapping/providers/intersection.js +1 -1
  298. package/dist/snapping/providers/store.js +3 -3
  299. package/dist/snapping/service.js +18 -7
  300. package/dist/snapping/types.d.ts +9 -35
  301. package/dist/store/draw-store.js +233 -142
  302. package/dist/store/local-visibility.d.ts +11 -6
  303. package/dist/store/local-visibility.js +38 -7
  304. package/dist/store/lock.d.ts +0 -6
  305. package/dist/store/lock.js +0 -6
  306. package/dist/store/memory/change-bus.d.ts +3 -3
  307. package/dist/store/memory/change-bus.js +12 -0
  308. package/dist/store/memory/file-store.d.ts +2 -2
  309. package/dist/store/memory/ui-state.d.ts +1 -51
  310. package/dist/store/memory/ui-state.js +122 -134
  311. package/dist/store/memory.d.ts +1 -8
  312. package/dist/store/memory.js +249 -45
  313. package/dist/store/ordering.d.ts +9 -0
  314. package/dist/store/ordering.js +17 -0
  315. package/dist/store/spatial/spatial-index.d.ts +1 -1
  316. package/dist/store/spatial/spatial-index.js +1 -1
  317. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  318. package/dist/store/spatial/store-spatial-index.js +9 -3
  319. package/dist/store/store.d.ts +66 -107
  320. package/dist/store/types.d.ts +1 -1
  321. package/dist/store/writable-layer.d.ts +1 -1
  322. package/dist/store/writable-layer.js +2 -2
  323. package/dist/table/builder.d.ts +83 -0
  324. package/dist/table/builder.js +381 -0
  325. package/dist/table/index.d.ts +37 -0
  326. package/dist/table/index.js +5 -0
  327. package/dist/table/packed-rtree.d.ts +1 -0
  328. package/dist/{display → table}/packed-rtree.js +1 -1
  329. package/dist/table/partition.d.ts +1 -0
  330. package/dist/{display → table}/partition.js +3 -3
  331. package/dist/table/prepare.d.ts +44 -0
  332. package/dist/table/prepare.js +136 -0
  333. package/dist/table/table.d.ts +1 -0
  334. package/dist/{display/columnar → table}/table.js +29 -25
  335. package/dist/{display/columnar → table}/types.d.ts +68 -72
  336. package/dist/table/types.js +3 -0
  337. package/dist/view/coordinator.js +4 -3
  338. package/dist/view/feature-companion.d.ts +13 -7
  339. package/dist/view/feature-companion.js +11 -3
  340. package/dist/view/globe-subdivision.js +3 -3
  341. package/dist/view/layer/attach.d.ts +1 -1
  342. package/dist/view/layer/attach.js +1 -1
  343. package/dist/view/layer/custom-layer.js +40 -11
  344. package/dist/view/layer/display-list.js +2 -1
  345. package/dist/view/layer/drape-planner.d.ts +2 -2
  346. package/dist/view/layer/frame-render.d.ts +3 -3
  347. package/dist/view/layer/frame-render.js +7 -2
  348. package/dist/view/layer/frame-state.d.ts +6 -6
  349. package/dist/view/layer/index.d.ts +2 -2
  350. package/dist/view/layer/index.js +1 -1
  351. package/dist/view/layer/render.d.ts +4 -4
  352. package/dist/view/layer/render.js +3 -8
  353. package/dist/view/layer/renderers.d.ts +2 -2
  354. package/dist/view/layer/renderers.js +1 -1
  355. package/dist/view/layer/slot-manager.d.ts +2 -2
  356. package/dist/view/layer/slot-manager.js +4 -4
  357. package/dist/view/layer/slots.d.ts +2 -2
  358. package/dist/view/layer/slots.js +1 -1
  359. package/dist/view/layer/store-retained-bbox.js +3 -2
  360. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  361. package/dist/view/layer/store-retained-classify.js +19 -7
  362. package/dist/view/layer/store-retained-collect.js +8 -7
  363. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  364. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  365. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  366. package/dist/view/layer/store-retained-immediate.js +3 -8
  367. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  368. package/dist/view/layer/store-retained.d.ts +2 -2
  369. package/dist/view/layer/store-retained.js +1 -1
  370. package/dist/view/renderers/batch-manager.js +8 -7
  371. package/dist/view/renderers/drawer.js +21 -15
  372. package/dist/view/renderers/image.js +13 -39
  373. package/dist/view/renderers/line/line-types.d.ts +3 -3
  374. package/dist/view/renderers/line/sdf-line.js +3 -1
  375. package/dist/view/renderers/point/billboard-depth.js +1 -1
  376. package/dist/view/renderers/point/point-instance.js +1 -1
  377. package/dist/view/renderers/point/point-shape.js +2 -2
  378. package/dist/view/renderers/point/point-style.js +48 -4
  379. package/dist/view/renderers/polygon/batch.js +1 -2
  380. package/dist/view/renderers/polygon/fill.js +3 -1
  381. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  382. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  383. package/dist/view/renderers/stroke.js +3 -1
  384. package/dist/view/shaders/helpers.d.ts +2 -42
  385. package/dist/view/shaders/helpers.js +0 -6
  386. package/dist/view/shaders/projection.d.ts +15 -7
  387. package/dist/view/shaders/projection.js +23 -6
  388. package/dist/view/shaders/quad.d.ts +16 -12
  389. package/dist/view/shaders/quad.js +34 -13
  390. package/dist/view/style-rule.d.ts +5 -42
  391. package/dist/view/style-rule.js +20 -44
  392. package/dist/view/terrain/binding.d.ts +1 -0
  393. package/dist/view/terrain/binding.js +29 -0
  394. package/dist/view/terrain/context.d.ts +3 -4
  395. package/dist/view/terrain/context.js +4 -5
  396. package/dist/view/terrain/drape/geometry.js +1 -1
  397. package/dist/view/terrain/drape/pass.d.ts +1 -1
  398. package/dist/view/terrain/drape/pass.js +8 -7
  399. package/dist/view/terrain/polygon.d.ts +9 -5
  400. package/dist/view/terrain/polygon.js +16 -2
  401. package/dist/view/terrain/state.d.ts +1 -1
  402. package/dist/view/terrain/state.js +1 -1
  403. package/dist/view/terrain/tessellation.d.ts +2 -2
  404. package/dist/view/terrain/tessellation.js +1 -1
  405. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  406. package/dist/view/ui/bounds.js +8 -12
  407. package/dist/view/ui/handle-test.js +2 -2
  408. package/dist/view/ui/handle-thinning.js +17 -17
  409. package/dist/view/ui/handles.js +21 -13
  410. package/dist/view/ui/helper.d.ts +1 -1
  411. package/dist/view/ui/helper.js +1 -1
  412. package/dist/view/ui/index.d.ts +1 -1
  413. package/dist/view/ui/selection-scope.js +4 -2
  414. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  415. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  416. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  417. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  418. package/dist/view/ui/selection-ui/index.js +1 -1
  419. package/dist/view/ui/selection-ui/renderer.js +15 -38
  420. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  421. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  422. package/dist/view/ui/selection-ui-drawer.js +63 -2
  423. package/dist/view/ui/tentative.js +1 -1
  424. package/dist/webgl/index.d.ts +65 -0
  425. package/dist/webgl/index.js +62 -0
  426. package/package.json +20 -9
  427. package/dist/api/api.d.ts +0 -1259
  428. package/dist/api/api.js +0 -86
  429. package/dist/api/context.d.ts +0 -173
  430. package/dist/api/display-api.js +0 -23
  431. package/dist/api/event-api.d.ts +0 -13
  432. package/dist/api/event-api.js +0 -17
  433. package/dist/api/extension-api.d.ts +0 -46
  434. package/dist/api/extension-api.js +0 -85
  435. package/dist/api/feature-api.d.ts +0 -11
  436. package/dist/api/feature-api.js +0 -101
  437. package/dist/api/geometry/apply.d.ts +0 -51
  438. package/dist/api/geometry/boolean.d.ts +0 -28
  439. package/dist/api/geometry/boolean.js +0 -65
  440. package/dist/api/geometry/types.d.ts +0 -31
  441. package/dist/api/geometry-operations.d.ts +0 -162
  442. package/dist/api/geometry-operations.js +0 -94
  443. package/dist/api/group-api.d.ts +0 -10
  444. package/dist/api/group-api.js +0 -78
  445. package/dist/api/import-export/constants.d.ts +0 -29
  446. package/dist/api/import-export/constants.js +0 -40
  447. package/dist/api/import-export/file-name.d.ts +0 -10
  448. package/dist/api/import-export/file-name.js +0 -20
  449. package/dist/api/import-export/geojson-export.d.ts +0 -19
  450. package/dist/api/import-export/image-import.d.ts +0 -12
  451. package/dist/api/import-export/image-import.js +0 -53
  452. package/dist/api/import-export/index.d.ts +0 -9
  453. package/dist/api/import-export/index.js +0 -107
  454. package/dist/api/import-export/native-format.d.ts +0 -15
  455. package/dist/api/import-export/style-validation.d.ts +0 -27
  456. package/dist/api/import-export/style-validation.js +0 -49
  457. package/dist/api/import-export/types.d.ts +0 -26
  458. package/dist/api/index.d.ts +0 -15
  459. package/dist/api/index.js +0 -3
  460. package/dist/api/input-api.d.ts +0 -158
  461. package/dist/api/input-api.js +0 -144
  462. package/dist/api/instance-api.d.ts +0 -38
  463. package/dist/api/instance-api.js +0 -136
  464. package/dist/api/layer-api.d.ts +0 -12
  465. package/dist/api/layer-api.js +0 -62
  466. package/dist/api/selection-api.d.ts +0 -7
  467. package/dist/api/selection-api.js +0 -78
  468. package/dist/api/snapping-api.d.ts +0 -125
  469. package/dist/api/snapping-api.js +0 -50
  470. package/dist/api/topology-api.d.ts +0 -30
  471. package/dist/api/topology-api.js +0 -16
  472. package/dist/api/tracing-api.d.ts +0 -31
  473. package/dist/api/tracing-api.js +0 -16
  474. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  475. package/dist/dispatcher/hit-test/index.js +0 -9
  476. package/dist/dispatcher/index.d.ts +0 -15
  477. package/dist/dispatcher/index.js +0 -3
  478. package/dist/display/columnar/index.d.ts +0 -12
  479. package/dist/display/columnar/index.js +0 -13
  480. package/dist/display/columnar/prepare.d.ts +0 -42
  481. package/dist/display/columnar/prepare.js +0 -116
  482. package/dist/display/index.d.ts +0 -13
  483. package/dist/display/types.js +0 -43
  484. package/dist/maplibre-gl-draw.d.ts +0 -47
  485. package/dist/modes/cursor.js +0 -72
  486. package/dist/modes/index.d.ts +0 -7
  487. package/dist/operations/index.d.ts +0 -9
  488. package/dist/operations/index.js +0 -3
  489. package/dist/plugins/index.d.ts +0 -10
  490. package/dist/plugins/mutation-hooks.d.ts +0 -28
  491. package/dist/plugins/mutation-hooks.js +0 -84
  492. package/dist/plugins/plugin-context.js +0 -367
  493. package/dist/plugins/plugin-manager.d.ts +0 -103
  494. package/dist/plugins/plugin-manager.js +0 -316
  495. package/dist/plugins/plugin.d.ts +0 -529
  496. package/dist/shared/config/index.d.ts +0 -17
  497. package/dist/shared/config/index.js +0 -8
  498. package/dist/shared/utils/index.d.ts +0 -15
  499. package/dist/shared/utils/index.js +0 -24
  500. package/dist/snapping/index.d.ts +0 -14
  501. package/dist/snapping/index.js +0 -4
  502. package/dist/store/change-merger.js +0 -102
  503. package/dist/store/event-bridge.js +0 -161
  504. package/dist/store/index.d.ts +0 -12
  505. package/dist/store/index.js +0 -4
  506. package/dist/view/index.d.ts +0 -47
  507. package/dist/view/index.js +0 -20
  508. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  509. /package/dist/api/{import-export/types.js → document.js} +0 -0
  510. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  511. /package/dist/{display/index.js → api/events.js} +0 -0
  512. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  513. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  514. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  515. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  516. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  517. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  518. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  519. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  520. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  521. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  522. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  523. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  524. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  525. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  526. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  527. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  528. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  529. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  532. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  533. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  534. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  535. /package/dist/{display → dataset}/chunk-set.js +0 -0
  536. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  537. /package/dist/{display → dataset}/manager.js +0 -0
  538. /package/dist/{display → dataset}/provider.js +0 -0
  539. /package/dist/{display → dataset}/selection.d.ts +0 -0
  540. /package/dist/{display → dataset}/selection.js +0 -0
@@ -3,90 +3,117 @@
3
3
  import { resolveVertexCoordinates } from '../../operations/shared-vertex.js';
4
4
  import { buildTraceGraph, findTracePath } from '../../operations/trace-graph.js';
5
5
  import { degreesPerPixel } from '../../snapping/geometry.js';
6
- import { isSnapVisible } from '../../snapping/providers/shared.js';
7
6
  import { DEFAULT_SNAP_OPTIONS } from '../../snapping/types.js';
7
+ import { isLocallyHidden } from '../../store/local-visibility.js';
8
8
  /**
9
9
  * The margin of the extent over which the material of the graph is collected
10
10
  * (as a ratio of the bbox of the two endpoints)
11
11
  */
12
12
  const TRACE_BBOX_MARGIN_RATIO = 0.2;
13
+ /** A feature of the document or a row, in the shape the graph is built from */
14
+ function graphFeature(id, geometry, type = geometry.type) {
15
+ return {
16
+ id,
17
+ type,
18
+ geometry,
19
+ layerId: '',
20
+ groupId: undefined,
21
+ properties: {},
22
+ locked: false,
23
+ visible: true,
24
+ style: {},
25
+ };
26
+ }
13
27
  /**
14
- * Whether tracing is enabled (if there is no configuration, it is regarded as enabled)
28
+ * The trace source over the context of a mode: the options of the instance, the features of
29
+ * the document by extent and the rows of the datasets to trace along
15
30
  */
16
- export function isTraceEnabled(context) {
17
- return context.trace?.enabled !== false;
31
+ export function traceSourceOf(ctx) {
32
+ const { draw, store } = ctx;
33
+ const shown = (feature) => {
34
+ if (!feature.visible)
35
+ return false;
36
+ if (!store.getLayer(feature.layerId)?.visible)
37
+ return false;
38
+ if (feature.groupId && store.getGroup(feature.groupId)?.visible === false)
39
+ return false;
40
+ return !isLocallyHidden(feature, store);
41
+ };
42
+ return {
43
+ isEnabled: () => draw.options.get().tracing?.enabled !== false,
44
+ tolerancePx: () => draw.options.get().snapping?.tolerancePx ?? DEFAULT_SNAP_OPTIONS.tolerancePx,
45
+ zoom: () => ctx.screen.zoom,
46
+ geometryOf(anchor) {
47
+ if (anchor.datasetId === undefined) {
48
+ return draw.features.get(anchor.featureId)?.geometry ?? null;
49
+ }
50
+ const dataset = draw.datasets.get(anchor.datasetId);
51
+ const index = dataset?.findRow(anchor.featureId);
52
+ if (!dataset || index === null || index === undefined)
53
+ return null;
54
+ return dataset.getRow(index)?.geometry ?? null;
55
+ },
56
+ features(bbox) {
57
+ const extent = [bbox.minX, bbox.minY, bbox.maxX, bbox.maxY];
58
+ const features = draw.features
59
+ .list({ bbox: extent })
60
+ .filter(shown)
61
+ .map((feature) => feature);
62
+ for (const { row } of ctx.listTraceRows(extent)) {
63
+ if (row.geometry)
64
+ features.push(graphFeature(String(row.id), row.geometry));
65
+ }
66
+ return features;
67
+ },
68
+ };
18
69
  }
19
70
  /**
20
- * Reads the snap target of the event that was just delivered as an endpoint of a trace
71
+ * Reads the snap target of an input as an endpoint of a trace
21
72
  *
22
- * Returns null for snaps that cannot be used for tracing (a guide, an intersection without
23
- * vertex references, an external candidate without a feature ID) and when nothing was snapped.
73
+ * Returns null for snaps that cannot be used for tracing (a guide, an intersection, an
74
+ * external candidate without a feature ID), when nothing was snapped, and when tracing is off.
24
75
  */
25
- export function readTraceAnchor(context, event) {
26
- if (!isTraceEnabled(context))
76
+ export function readTraceAnchor(source, event) {
77
+ if (!source.isEnabled())
27
78
  return null;
28
- const result = context.getSnapResult?.();
29
- const target = result?.target;
30
- if (!result || !target || target.featureId === undefined)
79
+ const target = event.snapped.target;
80
+ if (!target || target.featureId === undefined)
31
81
  return null;
32
- // For an event delivered without going through snapping (such as snap: false of a synthetic
33
- // input), the most recent result belongs to a different coordinate, so it is not used
34
- if (result.lngLat.lng !== event.lngLat.lng || result.lngLat.lat !== event.lngLat.lat) {
35
- return null;
36
- }
37
- const coordinate = [result.lngLat.lng, result.lngLat.lat];
38
- if (target.vertex) {
39
- return {
40
- featureId: target.featureId,
41
- datasetId: target.datasetId,
42
- endpoint: { coordinate, vertex: target.vertex },
43
- };
44
- }
45
- const segment = target.segment;
46
- if (segment?.startRef && segment.endRef) {
47
- return {
48
- featureId: target.featureId,
49
- datasetId: target.datasetId,
50
- endpoint: {
51
- coordinate,
52
- segment: { startRef: segment.startRef, endRef: segment.endRef },
53
- },
54
- };
82
+ const coordinate = [event.snapped.lngLat[0], event.snapped.lngLat[1]];
83
+ const anchor = (endpoint) => ({
84
+ featureId: target.featureId,
85
+ ...(target.datasetId !== undefined && { datasetId: target.datasetId }),
86
+ endpoint,
87
+ });
88
+ if (target.vertex)
89
+ return anchor({ coordinate, vertex: target.vertex });
90
+ if (target.kind === 'edge' && target.segment) {
91
+ const { start, end } = target.segment;
92
+ return anchor({
93
+ coordinate,
94
+ segment: { start: [start[0], start[1]], end: [end[0], end[1]] },
95
+ });
55
96
  }
56
97
  return null;
57
98
  }
58
99
  /**
59
- * Looks up the feature of the snap target
60
- *
61
- * Where it is resolved from depends on its origin. One from the Store is looked up with
62
- * store.getFeature, one from a dataset with getDatasetFeature.
100
+ * Turns the snap target into an endpoint of the graph (resolves a vertex reference into the
101
+ * coordinate the feature holds)
63
102
  */
64
- function anchorFeature(context, anchor) {
65
- if (anchor.datasetId === undefined) {
66
- return context.store.getFeature(anchor.featureId) ?? null;
67
- }
68
- return context.getDatasetFeature?.(anchor.datasetId, anchor.featureId) ?? null;
69
- }
70
- /**
71
- * Turns the snap target into an endpoint of the graph (resolves the vertex references into
72
- * actual coordinates)
73
- */
74
- function toGraphEndpoint(context, anchor) {
103
+ function toGraphEndpoint(source, anchor) {
75
104
  const { coordinate, vertex, segment } = anchor.endpoint;
76
- const feature = anchorFeature(context, anchor);
105
+ const geometry = source.geometryOf(anchor);
106
+ if (!geometry)
107
+ return null;
77
108
  if (vertex) {
78
- // For a snap to a vertex the snapped coordinate is the vertex itself, but if the feature
79
- // can be looked up, that one is taken as authoritative
80
- const resolved = feature ? resolveVertexCoordinates(feature, [vertex])[0] : undefined;
109
+ const resolved = resolveVertexCoordinates(graphFeature(anchor.featureId, geometry), [
110
+ vertex,
111
+ ])[0];
81
112
  return { coordinate, node: resolved ?? coordinate };
82
113
  }
83
- if (!segment || !feature)
84
- return null;
85
- const start = resolveVertexCoordinates(feature, [segment.startRef])[0];
86
- const end = resolveVertexCoordinates(feature, [segment.endRef])[0];
87
- if (!start || !end)
114
+ if (!segment)
88
115
  return null;
89
- return { coordinate, segment: { start, end } };
116
+ return { coordinate, segment };
90
117
  }
91
118
  /**
92
119
  * The extent over which the material of the graph is collected
@@ -94,13 +121,13 @@ function toGraphEndpoint(context, anchor) {
94
121
  * The bbox of the two endpoints is expanded by 20 percent of its size plus the snapping
95
122
  * tolerance.
96
123
  */
97
- function traceBounds(context, from, to) {
124
+ function traceBounds(source, from, to) {
98
125
  const minX = Math.min(from[0], to[0]);
99
126
  const maxX = Math.max(from[0], to[0]);
100
127
  const minY = Math.min(from[1], to[1]);
101
128
  const maxY = Math.max(from[1], to[1]);
102
- const tolerancePx = context.snapOptions?.tolerancePx ?? DEFAULT_SNAP_OPTIONS.tolerancePx;
103
- const perPixel = degreesPerPixel((minY + maxY) / 2, context.map.getZoom());
129
+ const tolerancePx = source.tolerancePx();
130
+ const perPixel = degreesPerPixel((minY + maxY) / 2, source.zoom());
104
131
  const marginX = (maxX - minX) * TRACE_BBOX_MARGIN_RATIO + perPixel.lng * tolerancePx;
105
132
  const marginY = (maxY - minY) * TRACE_BBOX_MARGIN_RATIO + perPixel.lat * tolerancePx;
106
133
  return {
@@ -110,35 +137,6 @@ function traceBounds(context, from, to) {
110
137
  maxY: maxY + marginY,
111
138
  };
112
139
  }
113
- /**
114
- * Collects the features that become the material of the graph
115
- *
116
- * The same scope as the targets of snapping, that is, the visible features of the Store and,
117
- * when snapping to data is enabled, the visible features of the datasets.
118
- */
119
- function collectTraceFeatures(context, bbox) {
120
- const lng = (bbox.minX + bbox.maxX) / 2;
121
- const lat = (bbox.minY + bbox.maxY) / 2;
122
- // findNear looks up with a square extent, so the larger of the two radii is used
123
- const radius = Math.max(bbox.maxX - lng, bbox.maxY - lat);
124
- const features = [];
125
- const seen = new Set();
126
- for (const id of context.spatialIndex.findNear([lng, lat], radius)) {
127
- if (seen.has(id))
128
- continue;
129
- seen.add(id);
130
- const feature = context.store.getFeature(id);
131
- if (!feature)
132
- continue;
133
- if (!isSnapVisible(feature, context.store))
134
- continue;
135
- features.push(feature);
136
- }
137
- const display = context.getDatasetTraceFeatures?.(bbox);
138
- if (display)
139
- features.push(...display);
140
- return features;
141
- }
142
140
  /**
143
141
  * Derives the path between the previous confirmed click and the current snap target
144
142
  *
@@ -148,14 +146,13 @@ function collectTraceFeatures(context, bbox) {
148
146
  * shared vertex. Returns null when the two ends are not connected or when an endpoint cannot
149
147
  * be resolved (the caller then treats it as a straight line).
150
148
  */
151
- export function computeTracePath(context, from, to) {
149
+ export function computeTracePath(source, from, to) {
152
150
  if (!from || !to)
153
151
  return null;
154
- const fromEndpoint = toGraphEndpoint(context, from);
155
- const toEndpoint = toGraphEndpoint(context, to);
152
+ const fromEndpoint = toGraphEndpoint(source, from);
153
+ const toEndpoint = toGraphEndpoint(source, to);
156
154
  if (!fromEndpoint || !toEndpoint)
157
155
  return null;
158
- const bbox = traceBounds(context, fromEndpoint.coordinate, toEndpoint.coordinate);
159
- const features = collectTraceFeatures(context, bbox);
160
- return findTracePath(buildTraceGraph(features, bbox), fromEndpoint, toEndpoint);
156
+ const bbox = traceBounds(source, fromEndpoint.coordinate, toEndpoint.coordinate);
157
+ return findTracePath(buildTraceGraph(source.features(bbox), bbox), fromEndpoint, toEndpoint);
161
158
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,176 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { computeTracePath, readTraceAnchor, traceSourceOf } from './trace-support.js';
4
+ /** How near the closing vertex a click finishes the shape, in pixels */
5
+ const VERTEX_CLICK_TOLERANCE = 10;
6
+ /**
7
+ * Creates the handler of a mode that draws a shape vertex by vertex
8
+ *
9
+ * @internal
10
+ */
11
+ export function createVertexDrawing(ctx, shape) {
12
+ const source = traceSourceOf(ctx);
13
+ let vertices = [];
14
+ /** The vertices undone, to redo */
15
+ let redo = [];
16
+ /** The last position of the pointer, to keep the dashed line on undo and redo */
17
+ let pointer = null;
18
+ /** Whether the pointer is on the closing vertex */
19
+ let nearClosing = false;
20
+ /** The snap target of the last placed vertex: where the next trace starts */
21
+ let traceAnchor = null;
22
+ /** The traced vertices up to the pointer, shown before they are placed */
23
+ let tracePreview = null;
24
+ const closable = () => vertices.length >= shape.minVertices && nearClosing;
25
+ /**
26
+ * Whether the input is on a placed vertex: within the click tolerance for the pointer, and at
27
+ * exactly its position for the input made from code, which is not a click of a hand
28
+ */
29
+ const onVertex = (event, index) => {
30
+ const vertex = vertices[index];
31
+ if (event.programmatic) {
32
+ return event.snapped.lngLat[0] === vertex[0] && event.snapped.lngLat[1] === vertex[1];
33
+ }
34
+ const [x, y] = ctx.screen.project(vertex);
35
+ return Math.hypot(event.point[0] - x, event.point[1] - y) <= VERTEX_CLICK_TOLERANCE;
36
+ };
37
+ const show = (withPointer) => {
38
+ if (vertices.length === 0) {
39
+ ctx.preview.clear();
40
+ return;
41
+ }
42
+ const tail = withPointer && pointer ? [...(tracePreview ?? []), pointer] : null;
43
+ const { feature, options } = shape.preview(vertices, tail, closable());
44
+ ctx.preview.set(feature, options);
45
+ };
46
+ const clearTrace = () => {
47
+ traceAnchor = null;
48
+ tracePreview = null;
49
+ };
50
+ const reset = () => {
51
+ vertices = [];
52
+ redo = [];
53
+ pointer = null;
54
+ nearClosing = false;
55
+ clearTrace();
56
+ ctx.preview.clear();
57
+ };
58
+ const finish = () => {
59
+ if (vertices.length < shape.minVertices)
60
+ return;
61
+ const input = shape.feature(vertices);
62
+ ctx.draw.transact(() => {
63
+ const feature = ctx.commitFeature(input);
64
+ if (feature)
65
+ ctx.draw.selection.set('feature', [feature.id]);
66
+ });
67
+ reset();
68
+ ctx.setMode('select');
69
+ };
70
+ const place = (event) => {
71
+ // The vertices of the boundary between the last placed vertex and this one come first
72
+ const anchor = readTraceAnchor(source, event);
73
+ const path = computeTracePath(source, traceAnchor, anchor);
74
+ if (path)
75
+ vertices.push(...path);
76
+ traceAnchor = anchor;
77
+ tracePreview = null;
78
+ vertices.push([event.snapped.lngLat[0], event.snapped.lngLat[1]]);
79
+ redo = [];
80
+ show(false);
81
+ };
82
+ const snapPreference = {
83
+ // The boundary the trace started along wins a tie between snapping candidates
84
+ get prefer() {
85
+ if (!traceAnchor || !source.isEnabled())
86
+ return null;
87
+ return {
88
+ featureId: traceAnchor.featureId,
89
+ ...(traceAnchor.datasetId !== undefined && { datasetId: traceAnchor.datasetId }),
90
+ };
91
+ },
92
+ };
93
+ return {
94
+ writes: true,
95
+ snapPreference,
96
+ onEnter() {
97
+ ctx.cursor.set('crosshair');
98
+ ctx.draw.transact(() => ctx.draw.selection.clear(), { source: 'silent' });
99
+ reset();
100
+ },
101
+ onExit() {
102
+ ctx.cursor.reset();
103
+ reset();
104
+ },
105
+ // What was being drawn is dropped when the state is reset from outside
106
+ onCancel: reset,
107
+ // A double click comes after its two clicks, which placed its position once (or finished
108
+ // the shape on the closing vertex); it finishes the shape and never zooms the map
109
+ onDoubleClick() {
110
+ finish();
111
+ return true;
112
+ },
113
+ onClick(event) {
114
+ // Read from the click itself: no pointer move has to come between two clicks
115
+ nearClosing = vertices.length > 0 && onVertex(event, shape.closingVertex(vertices));
116
+ if (closable())
117
+ finish();
118
+ // The second click of a double click lands on the vertex the first one placed
119
+ else if (vertices.length === 0 || !onVertex(event, vertices.length - 1))
120
+ place(event);
121
+ return true;
122
+ },
123
+ onPointerMove(event) {
124
+ pointer = [event.snapped.lngLat[0], event.snapped.lngLat[1]];
125
+ nearClosing = vertices.length > 0 && onVertex(event, shape.closingVertex(vertices));
126
+ tracePreview = computeTracePath(source, traceAnchor, readTraceAnchor(source, event));
127
+ ctx.cursor.set(closable() ? 'pointer' : 'crosshair');
128
+ if (vertices.length > 0)
129
+ show(true);
130
+ return false;
131
+ },
132
+ onKeyDown(event) {
133
+ switch (event.key) {
134
+ case 'Escape':
135
+ if (vertices.length > 0)
136
+ reset();
137
+ else
138
+ ctx.setMode('select');
139
+ return true;
140
+ case 'Enter':
141
+ finish();
142
+ return true;
143
+ case 'Backspace':
144
+ case 'Delete':
145
+ if (vertices.length > 0) {
146
+ vertices.pop();
147
+ // A vertex removed with the keyboard cannot be redone, and the trace starts over
148
+ redo = [];
149
+ clearTrace();
150
+ show(false);
151
+ }
152
+ return true;
153
+ default:
154
+ return false;
155
+ }
156
+ },
157
+ onUndoVertex() {
158
+ const removed = vertices.pop();
159
+ if (!removed)
160
+ return false;
161
+ redo.push(removed);
162
+ clearTrace();
163
+ show(true);
164
+ return true;
165
+ },
166
+ onRedoVertex() {
167
+ const restored = redo.pop();
168
+ if (!restored)
169
+ return false;
170
+ vertices.push(restored);
171
+ clearTrace();
172
+ show(true);
173
+ return true;
174
+ },
175
+ };
176
+ }