@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
@@ -0,0 +1,422 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * The events of the draw instance: the emitter of `DrawEvents`, fed by the notifications of
5
+ * the Store and by the signals of the engine
6
+ *
7
+ * One transaction of the Store is one notification. From it come first the events of each
8
+ * resource (features, layers, groups, metadata, selection, vertex selection, mode, hidden,
9
+ * read-only, interaction lock, the shape being drawn), in that order, and last one
10
+ * `document.changed` with the whole
11
+ * change when the transaction changed the document. The engine announces the rest
12
+ * on its internal emitter (snapping, clicks, images, the stacking order, failed loads,
13
+ * drags), and each is passed on under its name here.
14
+ */
15
+ import { DRAW_PROPERTY_KEYS } from '../../shared/properties.js';
16
+ import { geometryFromCoordinates } from '../../shared/utils/coordinates.js';
17
+ import { DrawError } from '../errors.js';
18
+ import { toDatasetRow } from './rows.js';
19
+ /**
20
+ * Creates the emitter of `DrawEvents`
21
+ *
22
+ * @internal
23
+ */
24
+ export function createEventHub() {
25
+ const listeners = new Map();
26
+ const add = (event, listener, once) => {
27
+ if (typeof listener !== 'function') {
28
+ throw new DrawError('invalid-input', 'The listener must be a function');
29
+ }
30
+ const entry = { listener, once };
31
+ const list = listeners.get(event) ?? [];
32
+ list.push(entry);
33
+ listeners.set(event, list);
34
+ return () => remove(event, (candidate) => candidate === entry);
35
+ };
36
+ const remove = (event, match) => {
37
+ const list = listeners.get(event);
38
+ if (!list)
39
+ return;
40
+ const index = list.findIndex(match);
41
+ if (index >= 0)
42
+ list.splice(index, 1);
43
+ if (list.length === 0)
44
+ listeners.delete(event);
45
+ };
46
+ return {
47
+ on: (event, listener) => add(event, listener, false),
48
+ once: (event, listener) => add(event, listener, true),
49
+ off(event, listener) {
50
+ remove(event, (entry) => entry.listener === listener);
51
+ },
52
+ emit(event, payload) {
53
+ const list = listeners.get(event);
54
+ if (!list)
55
+ return;
56
+ // A snapshot: listeners added or removed during the emit take effect from the next one
57
+ for (const entry of [...list]) {
58
+ if (entry.once)
59
+ remove(event, (candidate) => candidate === entry);
60
+ try {
61
+ entry.listener(payload);
62
+ }
63
+ catch (error) {
64
+ console.error(`Error in the listener of "${String(event)}":`, error);
65
+ }
66
+ }
67
+ },
68
+ clear() {
69
+ listeners.clear();
70
+ },
71
+ };
72
+ }
73
+ // ============================================================================
74
+ // The notifications of the Store
75
+ // ============================================================================
76
+ /**
77
+ * Passes the notifications of the Store on as events
78
+ *
79
+ * @returns The function that stops
80
+ * @internal
81
+ */
82
+ export function connectStoreEvents(hub, store) {
83
+ let vertexSelection = store.getVertexSelection();
84
+ let hidden = Object.freeze([...store.listHidden()]);
85
+ let readOnly = store.isReadOnly();
86
+ let locked = store.isInteractionLocked();
87
+ return store.subscribe((changes) => {
88
+ emitResourceEvents(hub, store, changes);
89
+ const nextVertexSelection = store.getVertexSelection();
90
+ if (!sameVertexSelection(vertexSelection, nextVertexSelection)) {
91
+ const previous = vertexSelection;
92
+ vertexSelection = nextVertexSelection;
93
+ hub.emit('vertexSelection.changed', { selection: nextVertexSelection, previous });
94
+ }
95
+ // The state of this client that the notifications do not describe is compared with the
96
+ // state the previous notification left
97
+ const nextHidden = store.listHidden();
98
+ if (!sameIds(hidden, nextHidden)) {
99
+ hidden = Object.freeze([...nextHidden]);
100
+ hub.emit('hidden.changed', { ids: hidden });
101
+ }
102
+ const nextReadOnly = store.isReadOnly();
103
+ if (nextReadOnly !== readOnly) {
104
+ readOnly = nextReadOnly;
105
+ hub.emit('readOnly.changed', { readOnly });
106
+ }
107
+ const nextLocked = store.isInteractionLocked();
108
+ if (nextLocked !== locked) {
109
+ locked = nextLocked;
110
+ hub.emit('interactionLock.changed', { locked });
111
+ }
112
+ // The shape being drawn, once per notification that set or cleared it
113
+ const tentative = changes.tentative;
114
+ if (tentative && (tentative.state !== null || tentative.previous !== null)) {
115
+ hub.emit('preview.changed', toPreviewPayload(tentative.state));
116
+ }
117
+ const change = toDocumentChange(changes);
118
+ if (change)
119
+ hub.emit('document.changed', change);
120
+ });
121
+ }
122
+ /**
123
+ * The payload of `preview.changed`: the shape being drawn, with the options `preview.set` was
124
+ * given (each left out when it was not given, both when the shape is cleared)
125
+ *
126
+ * @internal
127
+ */
128
+ export function toPreviewPayload(state) {
129
+ const payload = { feature: toPreviewFeature(state) };
130
+ if (state?.confirmedCount !== undefined)
131
+ payload.confirmedVertices = state.confirmedCount;
132
+ if (state?.highlightedVertexIndex !== undefined) {
133
+ payload.highlightVertex = state.highlightedVertexIndex;
134
+ }
135
+ return payload;
136
+ }
137
+ /**
138
+ * The shape being drawn in the shape of the API: its type, geometry and layer, the ID it will
139
+ * be created with, and the radius of a circle
140
+ *
141
+ * @internal
142
+ */
143
+ export function toPreviewFeature(state) {
144
+ if (!state)
145
+ return null;
146
+ const coordinates = structuredClone(state.coordinates);
147
+ const feature = {
148
+ type: state.type,
149
+ geometry: geometryFromCoordinates(state.type, coordinates),
150
+ layerId: state.layerId,
151
+ };
152
+ if (state.pendingFeatureId !== undefined)
153
+ feature.id = state.pendingFeatureId;
154
+ const properties = {};
155
+ if (state.radiusMeters !== undefined) {
156
+ properties[DRAW_PROPERTY_KEYS.radiusMeters] = state.radiusMeters;
157
+ }
158
+ if (state.radiusHandleAngle !== undefined) {
159
+ properties[DRAW_PROPERTY_KEYS.radiusHandleAngle] = state.radiusHandleAngle;
160
+ }
161
+ if (Object.keys(properties).length > 0) {
162
+ feature.properties = properties;
163
+ }
164
+ return feature;
165
+ }
166
+ /** Whether a list of IDs holds the same IDs as a set */
167
+ function sameIds(list, set) {
168
+ return list.length === set.size && list.every((id) => set.has(id));
169
+ }
170
+ /** The events of each resource of one notification */
171
+ function emitResourceEvents(hub, store, changes) {
172
+ const source = changes.source ?? 'local';
173
+ const { features, layers, groups } = changes;
174
+ for (const feature of features?.created ?? []) {
175
+ hub.emit('feature.created', { feature: feature, source });
176
+ }
177
+ for (const update of features?.updated ?? []) {
178
+ hub.emit('feature.updated', {
179
+ feature: update.feature,
180
+ previous: update.previous,
181
+ source,
182
+ intermediate: update.isIntermediate === true,
183
+ });
184
+ const move = describeMove(store, changes, update.previous, update.feature);
185
+ if (move)
186
+ hub.emit('feature.moved', { feature: update.feature, ...move, source });
187
+ }
188
+ for (const feature of features?.deleted ?? []) {
189
+ hub.emit('feature.deleted', { feature: feature, source });
190
+ }
191
+ for (const layer of layers?.created ?? [])
192
+ hub.emit('layer.created', { layer, source });
193
+ const updatedLayers = new Set();
194
+ for (const { id, layer, previous } of layers?.updated ?? []) {
195
+ updatedLayers.add(id);
196
+ hub.emit('layer.updated', { layer, previous, source });
197
+ }
198
+ // A reorder within a layer changes its items
199
+ if (changes.layerReorder && !updatedLayers.has(changes.layerReorder.layerId)) {
200
+ const layer = store.getLayer(changes.layerReorder.layerId);
201
+ if (layer) {
202
+ hub.emit('layer.updated', {
203
+ layer,
204
+ previous: { ...layer, items: [...changes.layerReorder.previous] },
205
+ source,
206
+ });
207
+ }
208
+ }
209
+ for (const layer of layers?.deleted ?? [])
210
+ hub.emit('layer.deleted', { layer, source });
211
+ if (layers?.orderChanged) {
212
+ hub.emit('layer.reordered', {
213
+ order: [...layers.orderChanged.order],
214
+ previous: [...layers.orderChanged.previous],
215
+ source,
216
+ });
217
+ }
218
+ for (const group of groups?.created ?? [])
219
+ hub.emit('group.created', { group, source });
220
+ const updatedGroups = new Set();
221
+ for (const { id, group, previous } of groups?.updated ?? []) {
222
+ updatedGroups.add(id);
223
+ hub.emit('group.updated', { group, previous, source });
224
+ }
225
+ // A reorder within a group changes its features
226
+ if (changes.groupReorder && !updatedGroups.has(changes.groupReorder.groupId)) {
227
+ const group = store.getGroup(changes.groupReorder.groupId);
228
+ if (group) {
229
+ hub.emit('group.updated', {
230
+ group,
231
+ previous: { ...group, featureIds: [...changes.groupReorder.previous] },
232
+ source,
233
+ });
234
+ }
235
+ }
236
+ for (const group of groups?.deleted ?? [])
237
+ hub.emit('group.deleted', { group, source });
238
+ if (changes.metadata) {
239
+ hub.emit('metadata.updated', {
240
+ metadata: changes.metadata.metadata,
241
+ previous: changes.metadata.previous,
242
+ source,
243
+ });
244
+ }
245
+ if (changes.selection) {
246
+ hub.emit('selection.changed', {
247
+ selection: { type: changes.selection.type, ids: [...changes.selection.ids] },
248
+ previous: { type: changes.selection.previousType, ids: [...changes.selection.previousIds] },
249
+ });
250
+ }
251
+ if (changes.mode) {
252
+ hub.emit('mode.changed', { mode: changes.mode.mode, previous: changes.mode.previous });
253
+ }
254
+ }
255
+ /**
256
+ * Where a feature moved from and to, when an update changed its layer or its group; null
257
+ * otherwise
258
+ */
259
+ function describeMove(store, changes, previous, feature) {
260
+ if (previous.layerId === feature.layerId && previous.groupId === feature.groupId)
261
+ return null;
262
+ const previousLayer = changes.layers?.updated?.find((u) => u.id === previous.layerId)?.previous;
263
+ const previousGroup = previous.groupId
264
+ ? changes.groups?.updated?.find((u) => u.id === previous.groupId)?.previous
265
+ : undefined;
266
+ const from = previous.groupId
267
+ ? withIndex({ groupId: previous.groupId }, previousGroup?.featureIds, previous.id)
268
+ : withIndex({ layerId: previous.layerId }, previousLayer?.items, previous.id);
269
+ let to;
270
+ if (feature.groupId) {
271
+ to = withIndex({ groupId: feature.groupId }, store.getGroup(feature.groupId)?.featureIds, feature.id);
272
+ }
273
+ else if (previous.groupId && previous.layerId === feature.layerId) {
274
+ // Out of its group, in the same layer
275
+ to = withIndex({ groupId: null }, store.getLayer(feature.layerId)?.items, feature.id);
276
+ }
277
+ else {
278
+ to = withIndex({ layerId: feature.layerId }, store.getLayer(feature.layerId)?.items, feature.id);
279
+ }
280
+ return { from, to };
281
+ }
282
+ /** A target with the position of the ID in the list, when the list holds it */
283
+ function withIndex(target, list, id) {
284
+ const index = list?.indexOf(id) ?? -1;
285
+ return index >= 0 ? { ...target, index } : target;
286
+ }
287
+ /** Whether two vertex selections hold the same vertices of the same feature */
288
+ function sameVertexSelection(a, b) {
289
+ if (a === b)
290
+ return true;
291
+ if (!a || !b || a.featureId !== b.featureId || a.vertices.length !== b.vertices.length) {
292
+ return false;
293
+ }
294
+ return a.vertices.every((vertex, i) => {
295
+ const other = b.vertices[i];
296
+ return ((vertex.part ?? 0) === (other.part ?? 0) &&
297
+ vertex.ring === other.ring &&
298
+ vertex.index === other.index);
299
+ });
300
+ }
301
+ /** The categories of a notification that belong to the document */
302
+ const DOCUMENT_KEYS = [
303
+ 'features',
304
+ 'layers',
305
+ 'groups',
306
+ 'layerReorder',
307
+ 'groupReorder',
308
+ 'metadata',
309
+ 'files',
310
+ ];
311
+ /** The categories of the state of this client that `document.changed` carries along */
312
+ const CLIENT_KEYS = ['selection', 'editing', 'mode'];
313
+ /**
314
+ * The change a notification carries, without the state that only the drawing reads (the
315
+ * geometry being drawn, the drag); null when the notification changed nothing of the document
316
+ *
317
+ * @internal
318
+ */
319
+ export function toDocumentChange(changes) {
320
+ const reset = changes.reset === true;
321
+ if (!reset && !DOCUMENT_KEYS.some((key) => changes[key] !== undefined))
322
+ return null;
323
+ const change = {};
324
+ // A replacement of the whole document is a change of the document, even with no category
325
+ if (reset)
326
+ change.reset = true;
327
+ for (const key of [...DOCUMENT_KEYS, ...CLIENT_KEYS]) {
328
+ if (changes[key] === undefined)
329
+ continue;
330
+ change[key] = changes[key];
331
+ }
332
+ change.source = changes.source ?? 'local';
333
+ return change;
334
+ }
335
+ // ============================================================================
336
+ // The signals of the engine
337
+ // ============================================================================
338
+ /**
339
+ * Passes the signals the engine announces on its internal emitter on as events
340
+ *
341
+ * @returns The function that stops
342
+ * @internal
343
+ */
344
+ export function connectEngineEvents(hub, emitter, engine = { hitAt: () => null }) {
345
+ const stops = [];
346
+ const listen = (event, listener) => {
347
+ emitter.on(event, listener);
348
+ stops.push(() => emitter.off(event, listener));
349
+ };
350
+ listen('snap.change', (result) => {
351
+ hub.emit('snap.changed', { result: result.target ? toSnapResult(result) : null });
352
+ });
353
+ listen('map.click', ({ lngLat, point }) => {
354
+ hub.emit('map.clicked', {
355
+ lngLat: [lngLat[0], lngLat[1]],
356
+ point: [point.x, point.y],
357
+ hit: engine.hitAt(point),
358
+ });
359
+ });
360
+ listen('dataset.click', (payload) => {
361
+ if (payload.datasetId === null || payload.feature === null || payload.row === null)
362
+ return;
363
+ hub.emit('dataset.clicked', {
364
+ datasetId: payload.datasetId,
365
+ rowIndex: payload.row,
366
+ row: toDatasetRow(payload.feature),
367
+ lngLat: [payload.lngLat[0], payload.lngLat[1]],
368
+ point: payload.point ? [payload.point.x, payload.point.y] : [Number.NaN, Number.NaN],
369
+ });
370
+ });
371
+ listen('image.request', ({ coordinate, zoom, layerId }) => {
372
+ hub.emit('image.requested', { lngLat: [coordinate[0], coordinate[1]], zoom, layerId });
373
+ });
374
+ listen('layerStack.change', ({ slots }) => {
375
+ hub.emit('layerStack.changed', {
376
+ entries: slots.map(({ layerId, from, to }) => ({ layerId, from, to })),
377
+ });
378
+ });
379
+ listen('load.error', ({ source, featureId, error }) => {
380
+ hub.emit('error', { error: toDrawError(error), source, featureId });
381
+ });
382
+ listen('drag.started', ({ kind, featureIds }) => {
383
+ hub.emit('drag.started', { kind, featureIds: [...featureIds] });
384
+ });
385
+ listen('drag.ended', ({ kind, featureIds, cancelled }) => {
386
+ hub.emit('drag.ended', { kind, featureIds: [...featureIds], cancelled });
387
+ });
388
+ return () => {
389
+ for (const stop of stops.splice(0))
390
+ stop();
391
+ };
392
+ }
393
+ /** The snapping result of the engine in the shape of the API */
394
+ function toSnapResult(result) {
395
+ const snap = { lngLat: [result.lngLat.lng, result.lngLat.lat] };
396
+ const target = result.target;
397
+ if (!target)
398
+ return snap;
399
+ snap.target = { kind: target.kind };
400
+ if (target.featureId !== undefined)
401
+ snap.target.featureId = target.featureId;
402
+ if (target.datasetId !== undefined)
403
+ snap.target.datasetId = target.datasetId;
404
+ if (target.description !== undefined)
405
+ snap.target.description = target.description;
406
+ if (target.vertex !== undefined)
407
+ snap.target.vertex = { ...target.vertex };
408
+ if (target.segment !== undefined) {
409
+ snap.target.segment = {
410
+ start: [...target.segment.start],
411
+ end: [...target.segment.end],
412
+ };
413
+ }
414
+ return snap;
415
+ }
416
+ /** A failure of a load as a DrawError, with what was thrown as its cause */
417
+ function toDrawError(error) {
418
+ if (error instanceof DrawError)
419
+ return error;
420
+ const message = error instanceof Error ? error.message : String(error);
421
+ return new DrawError('unsupported-format', message, { cause: error });
422
+ }