@sakuzu/maplibre-gl-draw 1.0.0 → 2.1.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 (541) hide show
  1. package/CHANGELOG.md +1109 -2
  2. package/README.ja.md +83 -50
  3. package/README.md +89 -53
  4. package/THIRD_PARTY_NOTICES.md +29 -0
  5. package/dist/api/datasets.d.ts +263 -0
  6. package/dist/api/document.d.ts +66 -0
  7. package/dist/api/draw.d.ts +137 -0
  8. package/dist/api/draw.js +20 -0
  9. package/dist/api/drawing.d.ts +87 -0
  10. package/dist/api/errors.d.ts +35 -0
  11. package/dist/api/errors.js +35 -0
  12. package/dist/api/events.d.ts +316 -0
  13. package/dist/api/extension/context.d.ts +247 -0
  14. package/dist/api/extension/feature-type.d.ts +129 -0
  15. package/dist/api/extension/mode.d.ts +123 -0
  16. package/dist/api/extension/plugin.d.ts +51 -0
  17. package/dist/api/extension/plugin.js +3 -0
  18. package/dist/api/extension/provider.d.ts +119 -0
  19. package/dist/api/extension/provider.js +3 -0
  20. package/dist/api/extension/render.d.ts +176 -0
  21. package/dist/api/extension/render.js +3 -0
  22. package/dist/api/extension/store.d.ts +190 -0
  23. package/dist/api/extension/store.js +3 -0
  24. package/dist/api/extensions.d.ts +306 -0
  25. package/dist/api/extensions.js +3 -0
  26. package/dist/api/features.d.ts +188 -0
  27. package/dist/api/features.js +3 -0
  28. package/dist/api/groups.d.ts +111 -0
  29. package/dist/api/groups.js +3 -0
  30. package/dist/api/hidden.d.ts +45 -0
  31. package/dist/api/hidden.js +3 -0
  32. package/dist/api/impl/adapters.js +463 -0
  33. package/dist/api/impl/contexts.js +466 -0
  34. package/dist/api/impl/create-draw.js +124 -0
  35. package/dist/api/impl/datasets.js +405 -0
  36. package/dist/api/impl/destroy-guard.js +74 -0
  37. package/dist/api/impl/document.js +280 -0
  38. package/dist/api/impl/drawing.js +180 -0
  39. package/dist/api/impl/engine-context.d.ts +7 -0
  40. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  41. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  42. package/dist/api/impl/events.js +423 -0
  43. package/dist/api/impl/extension-host.js +364 -0
  44. package/dist/api/impl/extensions.js +229 -0
  45. package/dist/api/impl/features.js +445 -0
  46. package/dist/api/impl/geometry/apply.d.ts +32 -0
  47. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  48. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  49. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  50. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  51. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  52. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  53. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  54. package/dist/api/impl/geometry/types.js +3 -0
  55. package/dist/api/impl/groups.d.ts +3 -0
  56. package/dist/api/impl/groups.js +268 -0
  57. package/dist/api/impl/hidden.js +60 -0
  58. package/dist/api/impl/import-export/constants.d.ts +22 -0
  59. package/dist/api/impl/import-export/constants.js +24 -0
  60. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  61. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  62. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  63. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  64. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  66. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  68. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  69. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  70. package/dist/api/impl/import-export/image-import.js +73 -0
  71. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  72. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  73. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  74. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  75. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  76. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  77. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  78. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  79. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  80. package/dist/api/impl/import-export/style-validation.js +86 -0
  81. package/dist/api/impl/import-export/types.d.ts +52 -0
  82. package/dist/api/impl/import-export/types.js +3 -0
  83. package/dist/api/impl/input.js +180 -0
  84. package/dist/api/impl/layers.js +307 -0
  85. package/dist/api/impl/metadata.d.ts +1 -0
  86. package/dist/api/impl/metadata.js +22 -0
  87. package/dist/api/impl/options.d.ts +1 -0
  88. package/dist/api/impl/options.js +851 -0
  89. package/dist/api/impl/placement.d.ts +1 -0
  90. package/dist/api/impl/placement.js +138 -0
  91. package/dist/api/impl/render-context.d.ts +13 -0
  92. package/dist/api/impl/render-context.js +272 -0
  93. package/dist/api/impl/rows.d.ts +1 -0
  94. package/dist/api/impl/rows.js +46 -0
  95. package/dist/api/impl/selection.d.ts +1 -0
  96. package/dist/api/impl/selection.js +186 -0
  97. package/dist/api/impl/shared.d.ts +64 -0
  98. package/dist/api/impl/shared.js +178 -0
  99. package/dist/api/impl/validate-extension.d.ts +1 -0
  100. package/dist/api/impl/validate-extension.js +159 -0
  101. package/dist/api/layers.d.ts +130 -0
  102. package/dist/api/layers.js +3 -0
  103. package/dist/api/metadata.d.ts +18 -0
  104. package/dist/api/metadata.js +3 -0
  105. package/dist/api/model.d.ts +487 -0
  106. package/dist/api/model.js +47 -0
  107. package/dist/api/options.d.ts +466 -0
  108. package/dist/api/options.js +3 -0
  109. package/dist/api/selection.d.ts +94 -0
  110. package/dist/api/selection.js +3 -0
  111. package/dist/api/state.d.ts +155 -0
  112. package/dist/api/state.js +12 -0
  113. package/dist/{display → dataset}/chunk.d.ts +1 -1
  114. package/dist/{display → dataset}/chunk.js +4 -3
  115. package/dist/{display → dataset}/dataset.js +21 -21
  116. package/dist/dataset/interaction.d.ts +1 -0
  117. package/dist/{display → dataset}/interaction.js +18 -6
  118. package/dist/dataset/manager.d.ts +1 -0
  119. package/dist/dataset/provider.d.ts +1 -0
  120. package/dist/{display → dataset}/retained.d.ts +1 -1
  121. package/dist/{display → dataset}/retained.js +8 -7
  122. package/dist/dataset/source.d.ts +1 -0
  123. package/dist/{display → dataset}/source.js +17 -4
  124. package/dist/dataset/spatial.d.ts +1 -0
  125. package/dist/{display → dataset}/spatial.js +1 -1
  126. package/dist/dataset/style.d.ts +1 -0
  127. package/dist/{display → dataset}/style.js +1 -1
  128. package/dist/dataset/table-source.d.ts +1 -0
  129. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  130. package/dist/{display → dataset}/thinning.d.ts +0 -10
  131. package/dist/{display → dataset}/thinning.js +3 -2
  132. package/dist/dataset/triangulation.d.ts +1 -0
  133. package/dist/{display → dataset}/triangulation.js +0 -0
  134. package/dist/{display → dataset}/types.d.ts +84 -121
  135. package/dist/dataset/types.js +61 -0
  136. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  137. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  138. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  139. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  140. package/dist/dispatcher/hit-test/service.js +80 -16
  141. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  142. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  143. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  144. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  145. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  146. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  147. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  148. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  149. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  150. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  151. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  152. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  153. package/dist/dispatcher/input-router.js +154 -70
  154. package/dist/dispatcher/normalizer.js +25 -4
  155. package/dist/dispatcher/types.d.ts +6 -1
  156. package/dist/extension/feature-handler.d.ts +1 -182
  157. package/dist/extension/index.d.ts +4 -7
  158. package/dist/extension/renderers.d.ts +1 -208
  159. package/dist/geometry/angle.d.ts +0 -8
  160. package/dist/geometry/angle.js +0 -8
  161. package/dist/geometry/bbox.d.ts +4 -12
  162. package/dist/geometry/bbox.js +4 -12
  163. package/dist/geometry/boolean.d.ts +0 -51
  164. package/dist/geometry/boolean.js +0 -51
  165. package/dist/geometry/buffer.d.ts +0 -26
  166. package/dist/geometry/buffer.js +0 -26
  167. package/dist/geometry/circle.d.ts +0 -9
  168. package/dist/geometry/circle.js +0 -9
  169. package/dist/geometry/coords.d.ts +0 -16
  170. package/dist/geometry/coords.js +0 -16
  171. package/dist/geometry/distance.d.ts +0 -24
  172. package/dist/geometry/distance.js +0 -24
  173. package/dist/geometry/errors.d.ts +21 -36
  174. package/dist/geometry/errors.js +49 -29
  175. package/dist/geometry/geojson.d.ts +85 -0
  176. package/dist/geometry/geojson.js +173 -0
  177. package/dist/geometry/index.d.ts +38 -23
  178. package/dist/geometry/index.js +43 -31
  179. package/dist/geometry/measure.d.ts +0 -27
  180. package/dist/geometry/measure.js +0 -27
  181. package/dist/geometry/predicates.d.ts +0 -9
  182. package/dist/geometry/predicates.js +0 -9
  183. package/dist/geometry/public-bounds.d.ts +26 -0
  184. package/dist/geometry/public-bounds.js +30 -0
  185. package/dist/geometry/public-combine.d.ts +78 -0
  186. package/dist/geometry/public-combine.js +82 -0
  187. package/dist/geometry/public-create.d.ts +54 -0
  188. package/dist/geometry/public-create.js +70 -0
  189. package/dist/geometry/public-measure.d.ts +170 -0
  190. package/dist/geometry/public-measure.js +283 -0
  191. package/dist/geometry/public-predicates.d.ts +54 -0
  192. package/dist/geometry/public-predicates.js +144 -0
  193. package/dist/geometry/public-repair.d.ts +75 -0
  194. package/dist/geometry/public-repair.js +77 -0
  195. package/dist/geometry/simplify.d.ts +0 -7
  196. package/dist/geometry/simplify.js +0 -7
  197. package/dist/geometry/split.d.ts +0 -20
  198. package/dist/geometry/split.js +0 -20
  199. package/dist/geometry/units.d.ts +20 -12
  200. package/dist/geometry/units.js +20 -12
  201. package/dist/index.d.ts +66 -66
  202. package/dist/index.js +6 -18
  203. package/dist/messages.d.ts +7 -7
  204. package/dist/modes/draw/circle.js +83 -207
  205. package/dist/modes/draw/commit-layer.d.ts +5 -16
  206. package/dist/modes/draw/commit-layer.js +2 -13
  207. package/dist/modes/draw/freehand.js +108 -246
  208. package/dist/modes/draw/image.js +4 -2
  209. package/dist/modes/draw/index.d.ts +5 -5
  210. package/dist/modes/draw/index.js +5 -5
  211. package/dist/modes/draw/line.js +18 -354
  212. package/dist/modes/draw/point.js +29 -78
  213. package/dist/modes/draw/polygon.js +23 -368
  214. package/dist/modes/draw/trace-support.d.ts +43 -36
  215. package/dist/modes/draw/trace-support.js +95 -98
  216. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  217. package/dist/modes/draw/vertex-drawing.js +176 -0
  218. package/dist/modes/handler.d.ts +1 -285
  219. package/dist/modes/manager.d.ts +2 -2
  220. package/dist/modes/manager.js +3 -0
  221. package/dist/modes/select/box-selection.d.ts +3 -3
  222. package/dist/modes/select/box-selection.js +2 -1
  223. package/dist/modes/select/click-handler.d.ts +5 -5
  224. package/dist/modes/select/click-handler.js +22 -20
  225. package/dist/modes/select/cursor-handler.d.ts +2 -2
  226. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  227. package/dist/modes/select/drag/move.js +3 -3
  228. package/dist/modes/select/drag/operation.d.ts +3 -3
  229. package/dist/modes/select/drag/radius.js +5 -4
  230. package/dist/modes/select/drag/transform.d.ts +2 -2
  231. package/dist/modes/select/drag/transform.js +11 -5
  232. package/dist/modes/select/drag/vertex.d.ts +2 -2
  233. package/dist/modes/select/drag/vertex.js +13 -8
  234. package/dist/modes/select/drag-handler.js +44 -25
  235. package/dist/modes/select/mode.js +17 -17
  236. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  237. package/dist/modes/select/shortcut-handler.js +9 -7
  238. package/dist/operations/layer-operations.js +29 -168
  239. package/dist/operations/resize.d.ts +2 -2
  240. package/dist/operations/resize.js +5 -5
  241. package/dist/operations/rotate.js +5 -5
  242. package/dist/operations/selection-operations.d.ts +16 -1
  243. package/dist/operations/selection-operations.js +28 -13
  244. package/dist/operations/shared-vertex.js +4 -2
  245. package/dist/operations/trace-graph.d.ts +0 -18
  246. package/dist/operations/trace-graph.js +0 -18
  247. package/dist/operations/vertex.js +36 -35
  248. package/dist/shared/color.d.ts +1 -0
  249. package/dist/shared/color.js +245 -0
  250. package/dist/shared/config/constants.d.ts +1 -54
  251. package/dist/shared/config/constants.js +1 -58
  252. package/dist/shared/config/feature-style.d.ts +16 -13
  253. package/dist/shared/config/feature-style.js +9 -0
  254. package/dist/shared/config/rendering.d.ts +3 -3
  255. package/dist/shared/config/selection-highlight.d.ts +0 -15
  256. package/dist/shared/config/selection-highlight.js +4 -7
  257. package/dist/shared/config/selection.d.ts +2 -32
  258. package/dist/shared/config/selection.js +0 -18
  259. package/dist/shared/config/topology.d.ts +2 -2
  260. package/dist/shared/config/trace.d.ts +4 -4
  261. package/dist/shared/math/angle.d.ts +1 -1
  262. package/dist/shared/math/angle.js +1 -1
  263. package/dist/shared/math/circle.d.ts +1 -1
  264. package/dist/shared/math/circle.js +1 -1
  265. package/dist/shared/math/distance.d.ts +2 -1
  266. package/dist/shared/math/distance.js +3 -2
  267. package/dist/shared/math/index.d.ts +1 -1
  268. package/dist/shared/math/index.js +1 -1
  269. package/dist/shared/math/transform.d.ts +23 -0
  270. package/dist/shared/math/transform.js +47 -28
  271. package/dist/shared/properties.d.ts +18 -0
  272. package/dist/shared/properties.js +129 -0
  273. package/dist/shared/types/events.d.ts +15 -7
  274. package/dist/shared/types/model.d.ts +109 -159
  275. package/dist/shared/types/style.d.ts +1 -1
  276. package/dist/shared/utils/color.d.ts +2 -36
  277. package/dist/shared/utils/color.js +13 -70
  278. package/dist/shared/utils/coordinates.d.ts +30 -4
  279. package/dist/shared/utils/coordinates.js +56 -10
  280. package/dist/shared/utils/event-emitter.d.ts +1 -262
  281. package/dist/shared/utils/event-emitter.js +4 -3
  282. package/dist/shared/utils/feature-bbox.js +8 -7
  283. package/dist/shared/utils/feature-segments.js +5 -4
  284. package/dist/shared/utils/image.d.ts +0 -4
  285. package/dist/shared/utils/image.js +0 -6
  286. package/dist/shared/utils/name-generator.d.ts +14 -20
  287. package/dist/shared/utils/name-generator.js +20 -3
  288. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  289. package/dist/shared/utils/pixel-ratio.js +13 -4
  290. package/dist/shared/utils/property.d.ts +7 -50
  291. package/dist/shared/utils/property.js +22 -87
  292. package/dist/snapping/custom-targets.js +21 -4
  293. package/dist/snapping/indicator.js +20 -11
  294. package/dist/snapping/providers/display.d.ts +6 -1
  295. package/dist/snapping/providers/display.js +2 -1
  296. package/dist/snapping/providers/guide.d.ts +3 -43
  297. package/dist/snapping/providers/guide.js +1 -44
  298. package/dist/snapping/providers/intersection.js +1 -1
  299. package/dist/snapping/providers/store.js +3 -3
  300. package/dist/snapping/service.js +18 -7
  301. package/dist/snapping/types.d.ts +9 -35
  302. package/dist/store/draw-store.js +233 -142
  303. package/dist/store/local-visibility.d.ts +11 -6
  304. package/dist/store/local-visibility.js +38 -7
  305. package/dist/store/lock.d.ts +0 -6
  306. package/dist/store/lock.js +0 -6
  307. package/dist/store/memory/change-bus.d.ts +3 -3
  308. package/dist/store/memory/change-bus.js +12 -0
  309. package/dist/store/memory/file-store.d.ts +2 -2
  310. package/dist/store/memory/ui-state.d.ts +1 -51
  311. package/dist/store/memory/ui-state.js +122 -134
  312. package/dist/store/memory.d.ts +1 -8
  313. package/dist/store/memory.js +249 -45
  314. package/dist/store/ordering.d.ts +9 -0
  315. package/dist/store/ordering.js +17 -0
  316. package/dist/store/spatial/spatial-index.d.ts +1 -1
  317. package/dist/store/spatial/spatial-index.js +1 -1
  318. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  319. package/dist/store/spatial/store-spatial-index.js +9 -3
  320. package/dist/store/store.d.ts +66 -107
  321. package/dist/store/types.d.ts +1 -1
  322. package/dist/store/writable-layer.d.ts +1 -1
  323. package/dist/store/writable-layer.js +2 -2
  324. package/dist/table/builder.d.ts +83 -0
  325. package/dist/table/builder.js +381 -0
  326. package/dist/table/index.d.ts +37 -0
  327. package/dist/table/index.js +5 -0
  328. package/dist/table/packed-rtree.d.ts +1 -0
  329. package/dist/{display → table}/packed-rtree.js +1 -1
  330. package/dist/table/partition.d.ts +1 -0
  331. package/dist/{display → table}/partition.js +3 -3
  332. package/dist/table/prepare.d.ts +44 -0
  333. package/dist/table/prepare.js +136 -0
  334. package/dist/table/table.d.ts +1 -0
  335. package/dist/{display/columnar → table}/table.js +29 -25
  336. package/dist/{display/columnar → table}/types.d.ts +68 -72
  337. package/dist/table/types.js +3 -0
  338. package/dist/view/coordinator.js +4 -3
  339. package/dist/view/feature-companion.d.ts +13 -7
  340. package/dist/view/feature-companion.js +11 -3
  341. package/dist/view/globe-subdivision.js +3 -3
  342. package/dist/view/layer/attach.d.ts +12 -6
  343. package/dist/view/layer/attach.js +86 -10
  344. package/dist/view/layer/custom-layer.js +40 -11
  345. package/dist/view/layer/display-list.js +2 -1
  346. package/dist/view/layer/drape-planner.d.ts +2 -2
  347. package/dist/view/layer/frame-render.d.ts +3 -3
  348. package/dist/view/layer/frame-render.js +7 -2
  349. package/dist/view/layer/frame-state.d.ts +6 -6
  350. package/dist/view/layer/index.d.ts +2 -2
  351. package/dist/view/layer/index.js +1 -1
  352. package/dist/view/layer/render.d.ts +4 -4
  353. package/dist/view/layer/render.js +3 -8
  354. package/dist/view/layer/renderers.d.ts +2 -2
  355. package/dist/view/layer/renderers.js +1 -1
  356. package/dist/view/layer/slot-manager.d.ts +2 -2
  357. package/dist/view/layer/slot-manager.js +4 -4
  358. package/dist/view/layer/slots.d.ts +2 -2
  359. package/dist/view/layer/slots.js +1 -1
  360. package/dist/view/layer/store-retained-bbox.js +3 -2
  361. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  362. package/dist/view/layer/store-retained-classify.js +19 -7
  363. package/dist/view/layer/store-retained-collect.js +8 -7
  364. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  365. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  366. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  367. package/dist/view/layer/store-retained-immediate.js +3 -8
  368. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  369. package/dist/view/layer/store-retained.d.ts +2 -2
  370. package/dist/view/layer/store-retained.js +1 -1
  371. package/dist/view/renderers/batch-manager.js +8 -7
  372. package/dist/view/renderers/drawer.js +21 -15
  373. package/dist/view/renderers/image.js +13 -39
  374. package/dist/view/renderers/line/line-types.d.ts +3 -3
  375. package/dist/view/renderers/line/sdf-line.js +3 -1
  376. package/dist/view/renderers/point/billboard-depth.js +1 -1
  377. package/dist/view/renderers/point/point-instance.js +1 -1
  378. package/dist/view/renderers/point/point-shape.js +2 -2
  379. package/dist/view/renderers/point/point-style.js +48 -4
  380. package/dist/view/renderers/polygon/batch.js +1 -2
  381. package/dist/view/renderers/polygon/fill.js +3 -1
  382. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  383. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  384. package/dist/view/renderers/stroke.js +3 -1
  385. package/dist/view/shaders/helpers.d.ts +2 -42
  386. package/dist/view/shaders/helpers.js +0 -6
  387. package/dist/view/shaders/projection.d.ts +15 -7
  388. package/dist/view/shaders/projection.js +23 -6
  389. package/dist/view/shaders/quad.d.ts +16 -12
  390. package/dist/view/shaders/quad.js +34 -13
  391. package/dist/view/style-rule.d.ts +5 -42
  392. package/dist/view/style-rule.js +20 -44
  393. package/dist/view/terrain/binding.d.ts +1 -0
  394. package/dist/view/terrain/binding.js +29 -0
  395. package/dist/view/terrain/context.d.ts +3 -4
  396. package/dist/view/terrain/context.js +4 -5
  397. package/dist/view/terrain/drape/geometry.js +1 -1
  398. package/dist/view/terrain/drape/pass.d.ts +1 -1
  399. package/dist/view/terrain/drape/pass.js +8 -7
  400. package/dist/view/terrain/polygon.d.ts +9 -5
  401. package/dist/view/terrain/polygon.js +16 -2
  402. package/dist/view/terrain/state.d.ts +1 -1
  403. package/dist/view/terrain/state.js +1 -1
  404. package/dist/view/terrain/tessellation.d.ts +2 -2
  405. package/dist/view/terrain/tessellation.js +1 -1
  406. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  407. package/dist/view/ui/bounds.js +8 -12
  408. package/dist/view/ui/handle-test.js +2 -2
  409. package/dist/view/ui/handle-thinning.js +17 -17
  410. package/dist/view/ui/handles.js +21 -13
  411. package/dist/view/ui/helper.d.ts +1 -1
  412. package/dist/view/ui/helper.js +1 -1
  413. package/dist/view/ui/index.d.ts +1 -1
  414. package/dist/view/ui/selection-scope.js +4 -2
  415. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  416. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  417. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  418. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  419. package/dist/view/ui/selection-ui/index.js +1 -1
  420. package/dist/view/ui/selection-ui/renderer.js +15 -38
  421. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  422. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  423. package/dist/view/ui/selection-ui-drawer.js +63 -2
  424. package/dist/view/ui/tentative.js +1 -1
  425. package/dist/webgl/index.d.ts +65 -0
  426. package/dist/webgl/index.js +62 -0
  427. package/package.json +38 -15
  428. package/dist/api/api.d.ts +0 -1259
  429. package/dist/api/api.js +0 -86
  430. package/dist/api/context.d.ts +0 -173
  431. package/dist/api/display-api.js +0 -23
  432. package/dist/api/event-api.d.ts +0 -13
  433. package/dist/api/event-api.js +0 -17
  434. package/dist/api/extension-api.d.ts +0 -46
  435. package/dist/api/extension-api.js +0 -85
  436. package/dist/api/feature-api.d.ts +0 -11
  437. package/dist/api/feature-api.js +0 -101
  438. package/dist/api/geometry/apply.d.ts +0 -51
  439. package/dist/api/geometry/boolean.d.ts +0 -28
  440. package/dist/api/geometry/boolean.js +0 -65
  441. package/dist/api/geometry/types.d.ts +0 -31
  442. package/dist/api/geometry-operations.d.ts +0 -162
  443. package/dist/api/geometry-operations.js +0 -94
  444. package/dist/api/group-api.d.ts +0 -10
  445. package/dist/api/group-api.js +0 -78
  446. package/dist/api/import-export/constants.d.ts +0 -29
  447. package/dist/api/import-export/constants.js +0 -40
  448. package/dist/api/import-export/file-name.d.ts +0 -10
  449. package/dist/api/import-export/file-name.js +0 -20
  450. package/dist/api/import-export/geojson-export.d.ts +0 -19
  451. package/dist/api/import-export/image-import.d.ts +0 -12
  452. package/dist/api/import-export/image-import.js +0 -53
  453. package/dist/api/import-export/index.d.ts +0 -9
  454. package/dist/api/import-export/index.js +0 -107
  455. package/dist/api/import-export/native-format.d.ts +0 -15
  456. package/dist/api/import-export/style-validation.d.ts +0 -27
  457. package/dist/api/import-export/style-validation.js +0 -49
  458. package/dist/api/import-export/types.d.ts +0 -26
  459. package/dist/api/index.d.ts +0 -15
  460. package/dist/api/index.js +0 -3
  461. package/dist/api/input-api.d.ts +0 -158
  462. package/dist/api/input-api.js +0 -144
  463. package/dist/api/instance-api.d.ts +0 -38
  464. package/dist/api/instance-api.js +0 -136
  465. package/dist/api/layer-api.d.ts +0 -12
  466. package/dist/api/layer-api.js +0 -62
  467. package/dist/api/selection-api.d.ts +0 -7
  468. package/dist/api/selection-api.js +0 -78
  469. package/dist/api/snapping-api.d.ts +0 -125
  470. package/dist/api/snapping-api.js +0 -50
  471. package/dist/api/topology-api.d.ts +0 -30
  472. package/dist/api/topology-api.js +0 -16
  473. package/dist/api/tracing-api.d.ts +0 -31
  474. package/dist/api/tracing-api.js +0 -16
  475. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  476. package/dist/dispatcher/hit-test/index.js +0 -9
  477. package/dist/dispatcher/index.d.ts +0 -15
  478. package/dist/dispatcher/index.js +0 -3
  479. package/dist/display/columnar/index.d.ts +0 -12
  480. package/dist/display/columnar/index.js +0 -13
  481. package/dist/display/columnar/prepare.d.ts +0 -42
  482. package/dist/display/columnar/prepare.js +0 -116
  483. package/dist/display/index.d.ts +0 -13
  484. package/dist/display/types.js +0 -43
  485. package/dist/maplibre-gl-draw.d.ts +0 -47
  486. package/dist/modes/cursor.js +0 -72
  487. package/dist/modes/index.d.ts +0 -7
  488. package/dist/operations/index.d.ts +0 -9
  489. package/dist/operations/index.js +0 -3
  490. package/dist/plugins/index.d.ts +0 -10
  491. package/dist/plugins/mutation-hooks.d.ts +0 -28
  492. package/dist/plugins/mutation-hooks.js +0 -84
  493. package/dist/plugins/plugin-context.js +0 -367
  494. package/dist/plugins/plugin-manager.d.ts +0 -103
  495. package/dist/plugins/plugin-manager.js +0 -316
  496. package/dist/plugins/plugin.d.ts +0 -529
  497. package/dist/shared/config/index.d.ts +0 -17
  498. package/dist/shared/config/index.js +0 -8
  499. package/dist/shared/utils/index.d.ts +0 -15
  500. package/dist/shared/utils/index.js +0 -24
  501. package/dist/snapping/index.d.ts +0 -14
  502. package/dist/snapping/index.js +0 -4
  503. package/dist/store/change-merger.js +0 -102
  504. package/dist/store/event-bridge.js +0 -161
  505. package/dist/store/index.d.ts +0 -12
  506. package/dist/store/index.js +0 -4
  507. package/dist/view/index.d.ts +0 -47
  508. package/dist/view/index.js +0 -20
  509. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  510. /package/dist/api/{import-export/types.js → document.js} +0 -0
  511. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  512. /package/dist/{display/index.js → api/events.js} +0 -0
  513. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  514. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  515. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  516. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  517. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  518. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  519. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  520. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  521. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  522. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  523. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  524. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  525. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  526. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  527. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  528. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  529. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  532. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  533. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  534. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  535. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  536. /package/dist/{display → dataset}/chunk-set.js +0 -0
  537. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  538. /package/dist/{display → dataset}/manager.js +0 -0
  539. /package/dist/{display → dataset}/provider.js +0 -0
  540. /package/dist/{display → dataset}/selection.d.ts +0 -0
  541. /package/dist/{display → dataset}/selection.js +0 -0
@@ -0,0 +1,423 @@
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. `options.changed` comes from
14
+ * `draw.options`, which emits it on the same hub.
15
+ */
16
+ import { DRAW_PROPERTY_KEYS } from '../../shared/properties.js';
17
+ import { geometryFromCoordinates } from '../../shared/utils/coordinates.js';
18
+ import { DrawError } from '../errors.js';
19
+ import { toDatasetRow } from './rows.js';
20
+ /**
21
+ * Creates the emitter of `DrawEvents`
22
+ *
23
+ * @internal
24
+ */
25
+ export function createEventHub() {
26
+ const listeners = new Map();
27
+ const add = (event, listener, once) => {
28
+ if (typeof listener !== 'function') {
29
+ throw new DrawError('invalid-input', 'The listener must be a function');
30
+ }
31
+ const entry = { listener, once };
32
+ const list = listeners.get(event) ?? [];
33
+ list.push(entry);
34
+ listeners.set(event, list);
35
+ return () => remove(event, (candidate) => candidate === entry);
36
+ };
37
+ const remove = (event, match) => {
38
+ const list = listeners.get(event);
39
+ if (!list)
40
+ return;
41
+ const index = list.findIndex(match);
42
+ if (index >= 0)
43
+ list.splice(index, 1);
44
+ if (list.length === 0)
45
+ listeners.delete(event);
46
+ };
47
+ return {
48
+ on: (event, listener) => add(event, listener, false),
49
+ once: (event, listener) => add(event, listener, true),
50
+ off(event, listener) {
51
+ remove(event, (entry) => entry.listener === listener);
52
+ },
53
+ emit(event, payload) {
54
+ const list = listeners.get(event);
55
+ if (!list)
56
+ return;
57
+ // A snapshot: listeners added or removed during the emit take effect from the next one
58
+ for (const entry of [...list]) {
59
+ if (entry.once)
60
+ remove(event, (candidate) => candidate === entry);
61
+ try {
62
+ entry.listener(payload);
63
+ }
64
+ catch (error) {
65
+ console.error(`Error in the listener of "${String(event)}":`, error);
66
+ }
67
+ }
68
+ },
69
+ clear() {
70
+ listeners.clear();
71
+ },
72
+ };
73
+ }
74
+ // ============================================================================
75
+ // The notifications of the Store
76
+ // ============================================================================
77
+ /**
78
+ * Passes the notifications of the Store on as events
79
+ *
80
+ * @returns The function that stops
81
+ * @internal
82
+ */
83
+ export function connectStoreEvents(hub, store) {
84
+ let vertexSelection = store.getVertexSelection();
85
+ let hidden = Object.freeze([...store.listHidden()]);
86
+ let readOnly = store.isReadOnly();
87
+ let locked = store.isInteractionLocked();
88
+ return store.subscribe((changes) => {
89
+ emitResourceEvents(hub, store, changes);
90
+ const nextVertexSelection = store.getVertexSelection();
91
+ if (!sameVertexSelection(vertexSelection, nextVertexSelection)) {
92
+ const previous = vertexSelection;
93
+ vertexSelection = nextVertexSelection;
94
+ hub.emit('vertexSelection.changed', { selection: nextVertexSelection, previous });
95
+ }
96
+ // The state of this client that the notifications do not describe is compared with the
97
+ // state the previous notification left
98
+ const nextHidden = store.listHidden();
99
+ if (!sameIds(hidden, nextHidden)) {
100
+ hidden = Object.freeze([...nextHidden]);
101
+ hub.emit('hidden.changed', { ids: hidden });
102
+ }
103
+ const nextReadOnly = store.isReadOnly();
104
+ if (nextReadOnly !== readOnly) {
105
+ readOnly = nextReadOnly;
106
+ hub.emit('readOnly.changed', { readOnly });
107
+ }
108
+ const nextLocked = store.isInteractionLocked();
109
+ if (nextLocked !== locked) {
110
+ locked = nextLocked;
111
+ hub.emit('interactionLock.changed', { locked });
112
+ }
113
+ // The shape being drawn, once per notification that set or cleared it
114
+ const tentative = changes.tentative;
115
+ if (tentative && (tentative.state !== null || tentative.previous !== null)) {
116
+ hub.emit('preview.changed', toPreviewPayload(tentative.state));
117
+ }
118
+ const change = toDocumentChange(changes);
119
+ if (change)
120
+ hub.emit('document.changed', change);
121
+ });
122
+ }
123
+ /**
124
+ * The payload of `preview.changed`: the shape being drawn, with the options `preview.set` was
125
+ * given (each left out when it was not given, both when the shape is cleared)
126
+ *
127
+ * @internal
128
+ */
129
+ export function toPreviewPayload(state) {
130
+ const payload = { feature: toPreviewFeature(state) };
131
+ if (state?.confirmedCount !== undefined)
132
+ payload.confirmedVertices = state.confirmedCount;
133
+ if (state?.highlightedVertexIndex !== undefined) {
134
+ payload.highlightVertex = state.highlightedVertexIndex;
135
+ }
136
+ return payload;
137
+ }
138
+ /**
139
+ * The shape being drawn in the shape of the API: its type, geometry and layer, the ID it will
140
+ * be created with, and the radius of a circle
141
+ *
142
+ * @internal
143
+ */
144
+ export function toPreviewFeature(state) {
145
+ if (!state)
146
+ return null;
147
+ const coordinates = structuredClone(state.coordinates);
148
+ const feature = {
149
+ type: state.type,
150
+ geometry: geometryFromCoordinates(state.type, coordinates),
151
+ layerId: state.layerId,
152
+ };
153
+ if (state.pendingFeatureId !== undefined)
154
+ feature.id = state.pendingFeatureId;
155
+ const properties = {};
156
+ if (state.radiusMeters !== undefined) {
157
+ properties[DRAW_PROPERTY_KEYS.radiusMeters] = state.radiusMeters;
158
+ }
159
+ if (state.radiusHandleAngle !== undefined) {
160
+ properties[DRAW_PROPERTY_KEYS.radiusHandleAngle] = state.radiusHandleAngle;
161
+ }
162
+ if (Object.keys(properties).length > 0) {
163
+ feature.properties = properties;
164
+ }
165
+ return feature;
166
+ }
167
+ /** Whether a list of IDs holds the same IDs as a set */
168
+ function sameIds(list, set) {
169
+ return list.length === set.size && list.every((id) => set.has(id));
170
+ }
171
+ /** The events of each resource of one notification */
172
+ function emitResourceEvents(hub, store, changes) {
173
+ const source = changes.source ?? 'local';
174
+ const { features, layers, groups } = changes;
175
+ for (const feature of features?.created ?? []) {
176
+ hub.emit('feature.created', { feature: feature, source });
177
+ }
178
+ for (const update of features?.updated ?? []) {
179
+ hub.emit('feature.updated', {
180
+ feature: update.feature,
181
+ previous: update.previous,
182
+ source,
183
+ intermediate: update.isIntermediate === true,
184
+ });
185
+ const move = describeMove(store, changes, update.previous, update.feature);
186
+ if (move)
187
+ hub.emit('feature.moved', { feature: update.feature, ...move, source });
188
+ }
189
+ for (const feature of features?.deleted ?? []) {
190
+ hub.emit('feature.deleted', { feature: feature, source });
191
+ }
192
+ for (const layer of layers?.created ?? [])
193
+ hub.emit('layer.created', { layer, source });
194
+ const updatedLayers = new Set();
195
+ for (const { id, layer, previous } of layers?.updated ?? []) {
196
+ updatedLayers.add(id);
197
+ hub.emit('layer.updated', { layer, previous, source });
198
+ }
199
+ // A reorder within a layer changes its items
200
+ if (changes.layerReorder && !updatedLayers.has(changes.layerReorder.layerId)) {
201
+ const layer = store.getLayer(changes.layerReorder.layerId);
202
+ if (layer) {
203
+ hub.emit('layer.updated', {
204
+ layer,
205
+ previous: { ...layer, items: [...changes.layerReorder.previous] },
206
+ source,
207
+ });
208
+ }
209
+ }
210
+ for (const layer of layers?.deleted ?? [])
211
+ hub.emit('layer.deleted', { layer, source });
212
+ if (layers?.orderChanged) {
213
+ hub.emit('layer.reordered', {
214
+ order: [...layers.orderChanged.order],
215
+ previous: [...layers.orderChanged.previous],
216
+ source,
217
+ });
218
+ }
219
+ for (const group of groups?.created ?? [])
220
+ hub.emit('group.created', { group, source });
221
+ const updatedGroups = new Set();
222
+ for (const { id, group, previous } of groups?.updated ?? []) {
223
+ updatedGroups.add(id);
224
+ hub.emit('group.updated', { group, previous, source });
225
+ }
226
+ // A reorder within a group changes its features
227
+ if (changes.groupReorder && !updatedGroups.has(changes.groupReorder.groupId)) {
228
+ const group = store.getGroup(changes.groupReorder.groupId);
229
+ if (group) {
230
+ hub.emit('group.updated', {
231
+ group,
232
+ previous: { ...group, featureIds: [...changes.groupReorder.previous] },
233
+ source,
234
+ });
235
+ }
236
+ }
237
+ for (const group of groups?.deleted ?? [])
238
+ hub.emit('group.deleted', { group, source });
239
+ if (changes.metadata) {
240
+ hub.emit('metadata.updated', {
241
+ metadata: changes.metadata.metadata,
242
+ previous: changes.metadata.previous,
243
+ source,
244
+ });
245
+ }
246
+ if (changes.selection) {
247
+ hub.emit('selection.changed', {
248
+ selection: { type: changes.selection.type, ids: [...changes.selection.ids] },
249
+ previous: { type: changes.selection.previousType, ids: [...changes.selection.previousIds] },
250
+ });
251
+ }
252
+ if (changes.mode) {
253
+ hub.emit('mode.changed', { mode: changes.mode.mode, previous: changes.mode.previous });
254
+ }
255
+ }
256
+ /**
257
+ * Where a feature moved from and to, when an update changed its layer or its group; null
258
+ * otherwise
259
+ */
260
+ function describeMove(store, changes, previous, feature) {
261
+ if (previous.layerId === feature.layerId && previous.groupId === feature.groupId)
262
+ return null;
263
+ const previousLayer = changes.layers?.updated?.find((u) => u.id === previous.layerId)?.previous;
264
+ const previousGroup = previous.groupId
265
+ ? changes.groups?.updated?.find((u) => u.id === previous.groupId)?.previous
266
+ : undefined;
267
+ const from = previous.groupId
268
+ ? withIndex({ groupId: previous.groupId }, previousGroup?.featureIds, previous.id)
269
+ : withIndex({ layerId: previous.layerId }, previousLayer?.items, previous.id);
270
+ let to;
271
+ if (feature.groupId) {
272
+ to = withIndex({ groupId: feature.groupId }, store.getGroup(feature.groupId)?.featureIds, feature.id);
273
+ }
274
+ else if (previous.groupId && previous.layerId === feature.layerId) {
275
+ // Out of its group, in the same layer
276
+ to = withIndex({ groupId: null }, store.getLayer(feature.layerId)?.items, feature.id);
277
+ }
278
+ else {
279
+ to = withIndex({ layerId: feature.layerId }, store.getLayer(feature.layerId)?.items, feature.id);
280
+ }
281
+ return { from, to };
282
+ }
283
+ /** A target with the position of the ID in the list, when the list holds it */
284
+ function withIndex(target, list, id) {
285
+ const index = list?.indexOf(id) ?? -1;
286
+ return index >= 0 ? { ...target, index } : target;
287
+ }
288
+ /** Whether two vertex selections hold the same vertices of the same feature */
289
+ function sameVertexSelection(a, b) {
290
+ if (a === b)
291
+ return true;
292
+ if (!a || !b || a.featureId !== b.featureId || a.vertices.length !== b.vertices.length) {
293
+ return false;
294
+ }
295
+ return a.vertices.every((vertex, i) => {
296
+ const other = b.vertices[i];
297
+ return ((vertex.part ?? 0) === (other.part ?? 0) &&
298
+ vertex.ring === other.ring &&
299
+ vertex.index === other.index);
300
+ });
301
+ }
302
+ /** The categories of a notification that belong to the document */
303
+ const DOCUMENT_KEYS = [
304
+ 'features',
305
+ 'layers',
306
+ 'groups',
307
+ 'layerReorder',
308
+ 'groupReorder',
309
+ 'metadata',
310
+ 'files',
311
+ ];
312
+ /** The categories of the state of this client that `document.changed` carries along */
313
+ const CLIENT_KEYS = ['selection', 'editing', 'mode'];
314
+ /**
315
+ * The change a notification carries, without the state that only the drawing reads (the
316
+ * geometry being drawn, the drag); null when the notification changed nothing of the document
317
+ *
318
+ * @internal
319
+ */
320
+ export function toDocumentChange(changes) {
321
+ const reset = changes.reset === true;
322
+ if (!reset && !DOCUMENT_KEYS.some((key) => changes[key] !== undefined))
323
+ return null;
324
+ const change = {};
325
+ // A replacement of the whole document is a change of the document, even with no category
326
+ if (reset)
327
+ change.reset = true;
328
+ for (const key of [...DOCUMENT_KEYS, ...CLIENT_KEYS]) {
329
+ if (changes[key] === undefined)
330
+ continue;
331
+ change[key] = changes[key];
332
+ }
333
+ change.source = changes.source ?? 'local';
334
+ return change;
335
+ }
336
+ // ============================================================================
337
+ // The signals of the engine
338
+ // ============================================================================
339
+ /**
340
+ * Passes the signals the engine announces on its internal emitter on as events
341
+ *
342
+ * @returns The function that stops
343
+ * @internal
344
+ */
345
+ export function connectEngineEvents(hub, emitter, engine = { hitAt: () => null }) {
346
+ const stops = [];
347
+ const listen = (event, listener) => {
348
+ emitter.on(event, listener);
349
+ stops.push(() => emitter.off(event, listener));
350
+ };
351
+ listen('snap.change', (result) => {
352
+ hub.emit('snap.changed', { result: result.target ? toSnapResult(result) : null });
353
+ });
354
+ listen('map.click', ({ lngLat, point }) => {
355
+ hub.emit('map.clicked', {
356
+ lngLat: [lngLat[0], lngLat[1]],
357
+ point: [point.x, point.y],
358
+ hit: engine.hitAt(point),
359
+ });
360
+ });
361
+ listen('dataset.click', (payload) => {
362
+ if (payload.datasetId === null || payload.feature === null || payload.row === null)
363
+ return;
364
+ hub.emit('dataset.clicked', {
365
+ datasetId: payload.datasetId,
366
+ rowIndex: payload.row,
367
+ row: toDatasetRow(payload.feature),
368
+ lngLat: [payload.lngLat[0], payload.lngLat[1]],
369
+ point: payload.point ? [payload.point.x, payload.point.y] : [Number.NaN, Number.NaN],
370
+ });
371
+ });
372
+ listen('image.request', ({ coordinate, zoom, layerId }) => {
373
+ hub.emit('image.requested', { lngLat: [coordinate[0], coordinate[1]], zoom, layerId });
374
+ });
375
+ listen('layerStack.change', ({ slots }) => {
376
+ hub.emit('layerStack.changed', {
377
+ entries: slots.map(({ layerId, from, to }) => ({ layerId, from, to })),
378
+ });
379
+ });
380
+ listen('load.error', ({ source, featureId, error }) => {
381
+ hub.emit('error', { error: toDrawError(error), source, featureId });
382
+ });
383
+ listen('drag.started', ({ kind, featureIds }) => {
384
+ hub.emit('drag.started', { kind, featureIds: [...featureIds] });
385
+ });
386
+ listen('drag.ended', ({ kind, featureIds, cancelled }) => {
387
+ hub.emit('drag.ended', { kind, featureIds: [...featureIds], cancelled });
388
+ });
389
+ return () => {
390
+ for (const stop of stops.splice(0))
391
+ stop();
392
+ };
393
+ }
394
+ /** The snapping result of the engine in the shape of the API */
395
+ function toSnapResult(result) {
396
+ const snap = { lngLat: [result.lngLat.lng, result.lngLat.lat] };
397
+ const target = result.target;
398
+ if (!target)
399
+ return snap;
400
+ snap.target = { kind: target.kind };
401
+ if (target.featureId !== undefined)
402
+ snap.target.featureId = target.featureId;
403
+ if (target.datasetId !== undefined)
404
+ snap.target.datasetId = target.datasetId;
405
+ if (target.description !== undefined)
406
+ snap.target.description = target.description;
407
+ if (target.vertex !== undefined)
408
+ snap.target.vertex = { ...target.vertex };
409
+ if (target.segment !== undefined) {
410
+ snap.target.segment = {
411
+ start: [...target.segment.start],
412
+ end: [...target.segment.end],
413
+ };
414
+ }
415
+ return snap;
416
+ }
417
+ /** A failure of a load as a DrawError, with what was thrown as its cause */
418
+ function toDrawError(error) {
419
+ if (error instanceof DrawError)
420
+ return error;
421
+ const message = error instanceof Error ? error.message : String(error);
422
+ return new DrawError('unsupported-format', message, { cause: error });
423
+ }