@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
@@ -1,28 +1,25 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
- import { createDrawAPI } from './api/api.js';
4
- import { createContext } from './api/context.js';
5
- import { createImportExportAPI } from './api/import-export/index.js';
6
- import { toleranceDegrees } from './dispatcher/hit-test/local-frame.js';
7
- import { createTopmostHitTester } from './dispatcher/hit-test/topmost.js';
8
- import { createInputRouter } from './dispatcher/input-router.js';
9
- import { createInputNormalizer } from './dispatcher/normalizer.js';
10
- import { createDisplayInteractions } from './display/interaction.js';
11
- import { createDatasetManager } from './display/manager.js';
12
- import { effectiveZoomForCamera } from './display/thinning.js';
13
- import { TriangulationScheduler } from './display/triangulation.js';
14
- import { DrawCircleMode, DrawFreehandMode, DrawImageMode, DrawLineMode, DrawPointMode, DrawPolygonMode, } from './modes/draw/index.js';
15
- import { SelectMode } from './modes/select/mode.js';
16
- import { createPluginContext } from './plugins/plugin-context.js';
17
- import { createPluginManager } from './plugins/plugin-manager.js';
18
- import { SnapIndicatorRenderer } from './snapping/indicator.js';
19
- import { createDisplaySnapProviders } from './snapping/providers/display.js';
20
- import { EventBridgeImpl } from './store/event-bridge.js';
21
- import { createRenderCoordinator } from './view/coordinator.js';
22
- import { createFeatureCompanionRegistry } from './view/feature-companion.js';
23
- import { attachSlotLayers } from './view/layer/attach.js';
24
- import { createCustomLayer } from './view/layer/index.js';
25
- import { DEFAULT_VIEWPORT_EXPANSION_FACTOR, getExpandedViewportBounds } from './view/viewport.js';
3
+ import { createDisplayInteractions } from '../../dataset/interaction.js';
4
+ import { createDatasetManager } from '../../dataset/manager.js';
5
+ import { effectiveZoomForCamera } from '../../dataset/thinning.js';
6
+ import { TriangulationScheduler } from '../../dataset/triangulation.js';
7
+ import { toleranceDegrees } from '../../dispatcher/hit-test/local-frame.js';
8
+ import { createTopmostHitTester } from '../../dispatcher/hit-test/topmost.js';
9
+ import { createInputRouter } from '../../dispatcher/input-router.js';
10
+ import { createInputNormalizer } from '../../dispatcher/normalizer.js';
11
+ import { DrawImageMode, drawCircleMode, drawFreehandMode, drawLineMode, drawPointMode, drawPolygonMode, } from '../../modes/draw/index.js';
12
+ import { SelectMode } from '../../modes/select/mode.js';
13
+ import { SnapIndicatorRenderer } from '../../snapping/indicator.js';
14
+ import { createDisplaySnapProviders } from '../../snapping/providers/display.js';
15
+ import { createRenderCoordinator } from '../../view/coordinator.js';
16
+ import { createFeatureCompanionRegistry } from '../../view/feature-companion.js';
17
+ import { attachSlotLayers } from '../../view/layer/attach.js';
18
+ import { createCustomLayer } from '../../view/layer/index.js';
19
+ import { DEFAULT_VIEWPORT_EXPANSION_FACTOR, getExpandedViewportBounds, } from '../../view/viewport.js';
20
+ import { createContext } from './engine-context.js';
21
+ import { connectEngineEvents, connectStoreEvents, createEventHub } from './events.js';
22
+ import { createExtensionHost } from './extension-host.js';
26
23
  /**
27
24
  * The releases of one draw instance, run in the reverse order of the acquisitions
28
25
  *
@@ -60,37 +57,11 @@ function createTeardown() {
60
57
  };
61
58
  }
62
59
  /**
63
- * Creates a draw instance on a MapLibre map: the drawing and editing tools, their rendering and
64
- * their input handling.
60
+ * Builds the engine of a draw instance on a map
65
61
  *
66
- * It can be called before, while or after the map loads. The render layers are added as soon
67
- * as the style accepts layers, and added again after `setStyle`. Unless
68
- * `initDefaultLayer: false` is given, the document starts with one empty layer. The instance
69
- * turns off the map's box zoom (Shift + drag selects features instead) and gives it back on
70
- * {@link MapLibreGLDraw.destroy}. Several instances can share a page, each on its own map.
71
- *
72
- * @param map the MapLibre map to draw on
73
- * @param options the options; every one can be omitted (see {@link Options})
74
- * @returns the draw instance
75
- *
76
- * @example
77
- * ```typescript
78
- * import { createMapLibreGLDraw } from '@sakuzu/maplibre-gl-draw';
79
- * import * as maplibregl from 'maplibre-gl';
80
- *
81
- * const map = new maplibregl.Map({
82
- * container: 'map',
83
- * style: 'https://demotiles.maplibre.org/style.json',
84
- * center: [139.767, 35.681],
85
- * zoom: 12,
86
- * });
87
- * const draw = createMapLibreGLDraw(map, { defaultMode: 'select' });
88
- *
89
- * draw.setMode('draw_polygon');
90
- * draw.on('draw.feature.create', ({ feature }) => console.log('Created', feature.id));
91
- * ```
62
+ * @internal
92
63
  */
93
- export function createMapLibreGLDraw(map, options = {}) {
64
+ export function createEngine(map, options = {}, build = {}) {
94
65
  // 1. Create the context
95
66
  const context = createContext(map, options);
96
67
  const { store, modeManager, eventEmitter, spatialIndex, hitTestService, featureStyle, selectionStyle, renderingConfig, topology, trace, snapService, pixelRatioSource, } = context;
@@ -101,8 +72,8 @@ export function createMapLibreGLDraw(map, options = {}) {
101
72
  context.selectionScope.clear();
102
73
  context.snapTargets.clear();
103
74
  });
104
- // 2. Create the EventBridge
105
- const eventBridge = new EventBridgeImpl(store, eventEmitter);
75
+ const triangulationScheduler = new TriangulationScheduler();
76
+ triangulationScheduler.setSlicing(renderingConfig.timeSlicing !== false);
106
77
  // 2.5 Create the manager of the datasets.
107
78
  // Culls with the same expanded viewport as the rendering loop, and calls the
108
79
  // provider on a change of the displayed range (moveend). It never touches the
@@ -133,12 +104,12 @@ export function createMapLibreGLDraw(map, options = {}) {
133
104
  // Rendering that draws complete frames (printing, thumbnails) turns off time
134
105
  // slicing and triangulates on the spot: setting the threshold to infinity
135
106
  // puts every polygon on the synchronous path
136
- triangulationScheduler: renderingConfig.timeSlicing === false
137
- ? new TriangulationScheduler({ vertexThreshold: Number.POSITIVE_INFINITY })
138
- : new TriangulationScheduler(),
139
- timeSlicing: renderingConfig.timeSlicing,
140
- // Announce the datasets that come and go and their reordering (draw.dataset.add,
141
- // draw.dataset.remove and draw.dataset.reorder)
107
+ triangulationScheduler,
108
+ // Read when a dataset is added, so a change at runtime applies to the datasets added after
109
+ get timeSlicing() {
110
+ return renderingConfig.timeSlicing;
111
+ },
112
+ // Announce the datasets that come and go and their reordering
142
113
  onDatasetAdd: (datasetId) => eventEmitter.emit('dataset.add', { datasetId }),
143
114
  onDatasetRemove: (datasetId) => eventEmitter.emit('dataset.remove', { datasetId }),
144
115
  onDatasetsReorder: (order) => eventEmitter.emit('dataset.reorder', { order }),
@@ -158,7 +129,7 @@ export function createMapLibreGLDraw(map, options = {}) {
158
129
  // own Store.
159
130
  const featureCompanions = createFeatureCompanionRegistry();
160
131
  const unproject = (p) => map.unproject([p.x, p.y]);
161
- const hitTestTopmost = createTopmostHitTester({
132
+ const topmostDeps = {
162
133
  store,
163
134
  hitTestService,
164
135
  unproject,
@@ -173,9 +144,13 @@ export function createMapLibreGLDraw(map, options = {}) {
173
144
  return { x: projected.x, y: projected.y };
174
145
  },
175
146
  getZoom: () => map.getZoom(),
176
- clickTolerancePx: context.options.clickTolerance,
147
+ // Read at each hit, so a change of the option applies at once
148
+ get clickTolerancePx() {
149
+ return context.options.clickTolerance;
150
+ },
177
151
  companions: featureCompanions,
178
- });
152
+ };
153
+ const hitTestTopmost = createTopmostHitTester(topmostDeps);
179
154
  // 2.7 Snapping to data (datasets).
180
155
  // Adds the vertices, edges and intersections of the displayed datasets as
181
156
  // snapping candidates. The data itself is only read, and whether it is
@@ -207,16 +182,15 @@ export function createMapLibreGLDraw(map, options = {}) {
207
182
  // this instance (the modes hit test against the same scope)
208
183
  selectionScope: context.selectionScope,
209
184
  // The separators of the stacking order (external entries) and the frames.
210
- // Additions and removals of separators are announced by an event
211
- // (draw.renderslots.change)
185
+ // Additions and removals of separators are announced (layerStack.changed)
212
186
  isExternalEntry: context.isExternalEntry,
213
- onSlotsChange: (slots) => eventEmitter.emit('renderslots.change', { slots }),
214
- // The failure to load the image of an Image feature (draw.load.error)
187
+ onSlotsChange: (slots) => eventEmitter.emit('layerStack.change', { slots }),
188
+ // The failure to load the image of an Image feature (an error event)
215
189
  onImageError: (featureId, error) => eventEmitter.emit('load.error', { source: 'image', featureId, error }),
216
190
  });
217
191
  // 3.5 Add the snapping indicator as a built-in overlay
218
192
  // (it comes in front of the selection UI because order: 'overlay')
219
- customLayer.addOverlayRenderer(new SnapIndicatorRenderer({ snapService }));
193
+ customLayer.addOverlay(new SnapIndicatorRenderer({ snapService, look: context.snapIndicator }));
220
194
  // Repaint when the snapping result changes (the Store does not change, so
221
195
  // the RenderCoordinator does not run)
222
196
  const repaintOnSnapChange = () => map.triggerRepaint();
@@ -227,23 +201,39 @@ export function createMapLibreGLDraw(map, options = {}) {
227
201
  const renderCoordinator = createRenderCoordinator({ map, store });
228
202
  // 5. Set up the ModeManager
229
203
  modeManager.registerMode('select', () => new SelectMode());
230
- modeManager.registerMode('draw_point', () => new DrawPointMode());
231
- modeManager.registerMode('draw_line', () => new DrawLineMode());
232
- modeManager.registerMode('draw_polygon', () => new DrawPolygonMode());
233
204
  modeManager.registerMode('draw_image', () => new DrawImageMode());
234
- modeManager.registerMode('draw_circle', () => new DrawCircleMode());
235
- modeManager.registerMode('draw_freehand', () => new DrawFreehandMode());
236
- // 6. Create the PluginManager.
237
- // The PluginContext is initialized lazily after the PluginManager is created
238
- let pluginContext = null;
239
- const pluginManager = createPluginManager(() => {
240
- if (!pluginContext) {
241
- throw new Error('PluginContext not initialized');
242
- }
243
- return pluginContext;
244
- }, modeManager);
245
- // 7. Create the import/export API
246
- const importExportAPI = createImportExportAPI(context);
205
+ // 6.5 Create the host of the extensions of the extension contract, and add the built-in
206
+ // modes written to that contract through it
207
+ const extensions = createExtensionHost({
208
+ map,
209
+ context,
210
+ customLayer,
211
+ modeManager,
212
+ featureCompanions,
213
+ hitTestTopmost,
214
+ hitTestTopmostWith: (tolerancePx) => createTopmostHitTester({
215
+ ...topmostDeps,
216
+ toleranceLngLat: (point) => toleranceDegrees(unproject, point, tolerancePx),
217
+ clickTolerancePx: tolerancePx,
218
+ }),
219
+ listTraceRows: (bbox) => snapService.isDatasetsEnabled()
220
+ ? displaySnap.queryRows(bbox).map(({ datasetId, feature }) => ({
221
+ datasetId,
222
+ rowIndex: datasets.get(datasetId)?.findRow(feature.id) ?? -1,
223
+ feature,
224
+ }))
225
+ : [],
226
+ });
227
+ extensions.collections.modes.addMany([
228
+ { name: 'draw_point', factory: drawPointMode },
229
+ { name: 'draw_line', factory: drawLineMode },
230
+ { name: 'draw_polygon', factory: drawPolygonMode },
231
+ { name: 'draw_circle', factory: drawCircleMode },
232
+ { name: 'draw_freehand', factory: drawFreehandMode },
233
+ ]);
234
+ // The position of the click being handled, for what a click causes
235
+ let clickPosition = null;
236
+ // 7. The context of the modes of the engine (select and image)
247
237
  const modeContext = {
248
238
  map,
249
239
  store,
@@ -258,69 +248,20 @@ export function createMapLibreGLDraw(map, options = {}) {
258
248
  trace,
259
249
  autoNameGenerator: context.autoNameGenerator,
260
250
  boxSelectionRegistry: context.boxSelectionRegistry,
261
- pluginManager,
251
+ plugins: extensions.interactions,
262
252
  generateFeatureId: context.generateFeatureId,
263
253
  getCurrentLayerId: context.getWritableLayerId,
264
- scaleWithZoom: context.options.scaleWithZoom,
254
+ // Read when a feature is committed, so a change of the option applies at once
255
+ get scaleWithZoom() {
256
+ return context.options.scaleWithZoom;
257
+ },
265
258
  setMode: (mode) => modeManager.setMode(mode),
259
+ getClickPosition: () => clickPosition,
266
260
  // The key that temporarily disables shared vertices is shared with the
267
261
  // disableKey of the snapping
268
262
  snapOptions: context.snapOptions,
269
- // The only opening through which a mode learns about snapping (the
270
- // SnapService itself is not passed)
271
- getSnapResult: () => snapService?.getResult() ?? null,
272
- // The opening that resolves a snap target on data into a feature (read by
273
- // the tracing)
274
- getDatasetFeature: (datasetId, featureId) => displaySnap.getFeature(datasetId, featureId),
275
- // The features of the data put on the edge graph of the tracing (empty
276
- // when snapping to data is disabled)
277
- getDatasetTraceFeatures: (bbox) => snapService.isDatasetsEnabled() ? displaySnap.queryFeatures(bbox) : [],
278
263
  };
279
264
  modeManager.setContext(modeContext);
280
- // 7. Initialize the PluginContext.
281
- // Helper function that looks up which layer an item belongs to
282
- const findLayerForItem = (itemId) => {
283
- for (const layer of store.getAllLayers()) {
284
- if (layer.order.includes(itemId)) {
285
- return layer.id;
286
- }
287
- }
288
- return undefined;
289
- };
290
- // Helper function that looks up which group a feature belongs to
291
- const findGroupForFeature = (featureId) => {
292
- for (const group of store.getAllGroups()) {
293
- if (group.featureIds.includes(featureId)) {
294
- return group.id;
295
- }
296
- }
297
- return undefined;
298
- };
299
- // Initialize the PluginContext.
300
- // The implementations of all PluginContext methods are gathered in
301
- // createPluginContext.
302
- // The draw instance is referenced lazily (through the closure, to cope
303
- // with the circular initialization).
304
- let drawApi = null;
305
- pluginContext = createPluginContext({
306
- store,
307
- eventEmitter,
308
- autoNameGenerator: context.autoNameGenerator,
309
- spatialIndex,
310
- getActiveLayerId: context.getActiveLayerId,
311
- findLayerForItem,
312
- findGroupForFeature,
313
- getModeManager: () => modeManager,
314
- // The anchors and the selection extents of this instance (never another instance's)
315
- terrain: customLayer.getTerrainContext(),
316
- selectionExtensions: context.selectionScope.extensions,
317
- getDraw: () => {
318
- if (!drawApi) {
319
- throw new Error('MapLibreGLDraw not initialized');
320
- }
321
- return drawApi;
322
- },
323
- });
324
265
  // 7. Create the InputNormalizer and the InputRouter.
325
266
  // The hit testing of the datasets comes in as an
326
267
  // interception of the InputRouter.
@@ -343,23 +284,36 @@ export function createMapLibreGLDraw(map, options = {}) {
343
284
  modeManager,
344
285
  context: modeContext,
345
286
  map,
346
- pluginManager,
347
287
  displayInteractions,
348
288
  // Emit a click in select mode as a public event (draw.map.click)
349
289
  notifyMapClick: (payload) => eventEmitter.emit('map.click', payload),
290
+ trackClick: (lngLat) => {
291
+ clickPosition = lngLat;
292
+ },
350
293
  snapService,
294
+ extensionInput: extensions.input,
295
+ });
296
+ // 8. Set up
297
+ // The events of the instance follow the Store and the signals of the engine
298
+ const events = createEventHub();
299
+ const stopStoreEvents = connectStoreEvents(events, store);
300
+ const stopEngineEvents = connectEngineEvents(events, eventEmitter, {
301
+ hitAt: (point) => extensions.hitAt(point),
302
+ });
303
+ teardown.add(() => {
304
+ stopStoreEvents();
305
+ stopEngineEvents();
306
+ events.clear();
351
307
  });
352
- // 7. Set up
353
- eventBridge.start();
354
308
  renderCoordinator.start();
355
- // Keep the render slots on the map. The slots are added as soon as the style
356
- // accepts layers, whenever the draw instance is created (before, during or
357
- // after the map loads), and they are restored after a style change. The
358
- // native layers of the separators are placed between the slots by the host,
359
- // which receives 'draw.renderslots.change'
309
+ // Keep the frames of the stacking order on the map. They are added as soon as the style
310
+ // accepts layers, whenever the draw instance is created (before, during or after the map
311
+ // loads), and they are restored after a style change. The native layers of the separators
312
+ // are placed between the frames by the host, which receives layerStack.changed
360
313
  teardown.add(attachSlotLayers(map, () => customLayer.getSlotLayers()));
361
314
  inputNormalizer.attach();
362
315
  inputRouter.start();
316
+ extensions.start();
363
317
  modeManager.start();
364
318
  // Disable the boxZoom of MapLibre (because Shift + drag is used for box
365
319
  // selection), and give it back in the state it was found in: the host or another draw
@@ -373,35 +327,49 @@ export function createMapLibreGLDraw(map, options = {}) {
373
327
  else
374
328
  map.boxZoom.disable();
375
329
  });
376
- // Set the default mode
377
- modeManager.setMode(context.options.defaultMode);
378
- // 9. Create the public API
379
- drawApi = createDrawAPI(context, { inputNormalizer, inputRouter }, eventBridge, customLayer, importExportAPI, { modeManager, renderCoordinator }, { pluginManager, spatialIndex, datasets, featureCompanions });
380
- // The public API releases what it created itself (the input, the modes, the rendering, the
381
- // plugins and the layers on the map) first, then the rest goes in the reverse order
382
- teardown.add(drawApi.destroy);
383
- drawApi.destroy = () => teardown.run();
384
- ignoreRegistrationsAfterDestroy(drawApi, () => teardown.done);
385
- return drawApi;
386
- }
387
- /**
388
- * Makes the registrations of a destroyed instance do nothing
389
- *
390
- * Every other call on a destroyed instance works on its inert Store and reaches neither the
391
- * map nor a timer, but a registration would install something (a plugin, a mode, a renderer,
392
- * a provider) that nothing is left to release. They are ignored instead and return a cancel
393
- * function that does nothing.
394
- */
395
- function ignoreRegistrationsAfterDestroy(draw, isDestroyed) {
396
- const noop = () => { };
397
- const guard = (fn, whenDestroyed) => {
398
- return (...args) => (isDestroyed() ? whenDestroyed : fn(...args));
330
+ // Set the default mode (unless the caller attaches the public object of the modes first)
331
+ const enterDefaultMode = () => {
332
+ if (!teardown.done)
333
+ modeManager.setMode(context.options.defaultMode);
334
+ };
335
+ if (!build.deferDefaultMode)
336
+ enterDefaultMode();
337
+ // 9. The release of what was set up above: the input, the modes, the rendering and the
338
+ // layers on the map, then the rest in the reverse order
339
+ teardown.add(() => {
340
+ inputRouter.stop();
341
+ inputNormalizer.detach();
342
+ modeManager.stop();
343
+ renderCoordinator.stop();
344
+ context.autoNameGenerator.dispose();
345
+ // There can be several frames, so remove all of them
346
+ for (const layer of customLayer.getSlotLayers()) {
347
+ if (map.getLayer(layer.id))
348
+ map.removeLayer(layer.id);
349
+ }
350
+ // After the plugins are removed (their onRemove can still read the index)
351
+ spatialIndex.destroy();
352
+ });
353
+ // The extensions go first, while everything they use is there
354
+ teardown.add(() => extensions.destroy());
355
+ return {
356
+ map,
357
+ context,
358
+ customLayer,
359
+ modeManager,
360
+ datasets,
361
+ inputRouter,
362
+ extensions,
363
+ events,
364
+ runtime: {
365
+ setDragThreshold: (px) => inputNormalizer.setDragThreshold(px),
366
+ setTimeSlicing(enabled) {
367
+ renderingConfig.timeSlicing = enabled;
368
+ triangulationScheduler.setSlicing(enabled);
369
+ },
370
+ },
371
+ isDestroyed: () => teardown.done,
372
+ enterDefaultMode,
373
+ destroy: () => teardown.run(),
399
374
  };
400
- draw.addPlugin = guard(draw.addPlugin, noop);
401
- draw.registerMode = guard(draw.registerMode, noop);
402
- draw.registerFeatureHandler = guard(draw.registerFeatureHandler, noop);
403
- draw.addOverlayRenderer = guard(draw.addOverlayRenderer, noop);
404
- draw.registerAuxiliaryHandleProvider = guard(draw.registerAuxiliaryHandleProvider, noop);
405
- draw.registerFeatureCompanionProvider = guard(draw.registerFeatureCompanionProvider, noop);
406
- draw.snapping.register = guard(draw.snapping.register, noop);
407
375
  }