@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,285 +1 @@
1
- /**
2
- * ModeHandler
3
- *
4
- * Handler interface for the drawing modes.
5
- * Every mode implements this interface.
6
- */
7
- import type { Map as MapLibreMap } from 'maplibre-gl';
8
- import type { DragNormalizedEvent, KeyNormalizedEvent, MouseNormalizedEvent } from '../dispatcher/types.js';
9
- import type { Mode } from '../store/types.js';
10
- /**
11
- * An input whose coordinates go through snapping, as asked about by
12
- * {@link ModeHandler.isSnapEnabledFor}.
13
- *
14
- * Corresponds one to one with the inputs whose coordinates InputRouter passes through snapping
15
- * (click / mousemove / dragstart / dragmove / dragend).
16
- */
17
- export type SnapInputType = 'click' | 'mousemove' | 'dragstart' | 'dragmove' | 'dragend';
18
- /**
19
- * The services of the draw instance a mode works with, passed to
20
- * {@link ModeHandler.onStart}.
21
- *
22
- * Note: the redraw is triggered automatically by RenderCoordinator subscribing to Store changes,
23
- * so a mode does not need to call requestRepaint() explicitly.
24
- */
25
- export interface ModeContext {
26
- /** The map the draw instance is attached to */
27
- map: MapLibreMap;
28
- /** The Store of the document; a mode writes features through it */
29
- store: import('../store/store.js').Store;
30
- /**
31
- * The queries of the spatial index (it is derived from the Store, so a mode only reads it)
32
- */
33
- spatialIndex: import('../store/spatial/spatial-index.js').SpatialQuery;
34
- /** The hit test of the features of the Store alone */
35
- hitTestService: import('../dispatcher/hit-test/service.js').HitTestService;
36
- /**
37
- * Returns the foreground hit in the visual stacking order (unified z traversal)
38
- *
39
- * Traverses the features of the Store and the datasets in a single
40
- * stacking order. Selection, drag and cursor decisions use this one (`hitTestService.hitTest`
41
- * looks only at the Store, so it would grab a feature that is occluded by a dataset).
42
- */
43
- hitTestTopmost: import('../dispatcher/hit-test/topmost.js').HitTestTopmost;
44
- /**
45
- * Provider of the companion rendering and the companion hits (the ones of this draw instance)
46
- *
47
- * Used to return a consumed companion hit to the provider.
48
- */
49
- featureCompanions: import('../view/feature-companion.js').FeatureCompanionRegistry;
50
- /**
51
- * The selection scope of this draw instance (the extension points of the custom feature
52
- * types, the auxiliary handles and the thinned handle sets)
53
- *
54
- * The same object the CustomLayer draws the selection UI with, so hit testing and rendering
55
- * agree, and a second draw instance on the page never takes part.
56
- */
57
- selectionScope: import('../view/ui/selection-scope.js').SelectionScope;
58
- /** The emitter of the `draw.*` events of the draw instance */
59
- eventEmitter: import('../shared/utils/event-emitter.js').EventEmitter;
60
- /** The resolved colors and sizes of the selection UI */
61
- selectionStyle: import('../shared/config/selection.js').SelectionUIConfig;
62
- /**
63
- * Topology configuration (simultaneous movement of shared vertices, and so on)
64
- *
65
- * When omitted, it is treated as the default value (everything disabled).
66
- */
67
- topology?: import('../shared/config/topology.js').TopologyConfig;
68
- /**
69
- * Trace configuration (whether edge tracing is enabled or disabled)
70
- *
71
- * When omitted, it is treated as the default value (enabled). It is the same object that
72
- * draw.tracing rewrites, so a switch at runtime takes effect on the very next input.
73
- */
74
- trace?: import('../shared/config/trace.js').TraceConfig;
75
- /**
76
- * The resolved snapping options
77
- *
78
- * Read so that the simultaneous movement of shared vertices shares the "modifier key for
79
- * temporary disabling" with snapping. When snapping is not configured, it is omitted and
80
- * the default 'alt' is assumed.
81
- */
82
- snapOptions?: import('../snapping/types.js').ResolvedSnapOptions;
83
- /** Generates the default name of a new feature (such as "Polygon 3") */
84
- autoNameGenerator: import('../shared/utils/name-generator.js').AutoNameGenerator;
85
- /** The box selection strategies by feature type */
86
- boxSelectionRegistry: import('../dispatcher/hit-test/box-strategy.js').BoxSelectionStrategyRegistry;
87
- /** The plugin manager of the draw instance (omitted when none is set up) */
88
- pluginManager?: import('../plugins/plugin-manager.js').PluginManager;
89
- /** Requests a mode change, as `draw.setMode` does (the same refusals apply) */
90
- setMode: (mode: Mode) => void;
91
- /** Generates a new unique feature id */
92
- generateFeatureId: () => string;
93
- /**
94
- * Gets the ID of the writable layer, the layer that new features are written into
95
- *
96
- * The active layer when it exists, is not locked, is visible and is not locally hidden,
97
- * otherwise the first such layer, otherwise an empty string. A mode reads it when it
98
- * commits a feature; when it is an empty string the mode must not create the feature: it
99
- * discards the drawing (clears the tentative state) and returns to select.
100
- */
101
- getCurrentLayerId: () => string;
102
- /**
103
- * Whether the line widths of the features a drawing mode creates follow the zoom (the
104
- * `scaleWithZoom` option of the instance)
105
- *
106
- * When it is true, a mode writes the zoom of the commit into `properties.createdZoom`, and
107
- * the widths of the feature grow and shrink with the map from there. When it is false, it
108
- * writes no created zoom and the widths stay the same on the screen.
109
- */
110
- scaleWithZoom: boolean;
111
- /**
112
- * Gets the most recent snapping result (always null when snapping is not configured)
113
- *
114
- * This is the only read port through which a mode learns about snapping. InputRouter passes
115
- * the coordinates of click / mousemove through snapping before delivering them to the mode,
116
- * so at the time of onClick / onMouseMove the result readable here is the snapping result
117
- * corresponding to the event that was just delivered (tracing reads it).
118
- */
119
- getSnapResult?: () => import('../snapping/types.js').SnapResult | null;
120
- /**
121
- * Gets a feature of a dataset (omitted when it is not configured)
122
- *
123
- * This is the port through which a mode resolves to a feature a snap target that was snapped
124
- * to data (a dataset). It is a feature that is not in the Store, so it cannot
125
- * be looked up with store.getFeature (tracing reads it).
126
- */
127
- getDatasetFeature?: (datasetId: string, featureId: string) => import('../store/types.js').Feature | null;
128
- /**
129
- * Looks up, by extent, the features of the datasets usable for tracing
130
- *
131
- * This is the port for adding the features of data (a dataset) to the material
132
- * of the edge graph. It returns an empty array when snapping to data is disabled.
133
- */
134
- getDatasetTraceFeatures?: (bbox: import('../store/types.js').BoundingBox) => import('../store/types.js').Feature[];
135
- }
136
- /**
137
- * The implementation of an interaction mode: it receives the normalized input while it is the
138
- * current mode.
139
- *
140
- * Register a custom mode with `draw.registerMode(name, factory)` or `Plugin.modes`, and enter
141
- * it with `draw.setMode(name)`. The context is passed in `onStart()` and the implementation
142
- * keeps it in a field; it is not passed to the event handlers. Every handler is optional. The
143
- * coordinates of the pointer events have already gone through snapping (see
144
- * `isSnapEnabledFor`).
145
- *
146
- * @example
147
- * ```ts
148
- * import type { ModeContext, ModeHandler, MouseNormalizedEvent } from '@sakuzu/maplibre-gl-draw';
149
- *
150
- * // A mode that logs the clicked position and returns to select on Escape
151
- * class ProbeMode implements ModeHandler {
152
- * readonly modeName = 'probe';
153
- * private context: ModeContext | null = null;
154
- *
155
- * onStart(context: ModeContext): void {
156
- * this.context = context;
157
- * }
158
- * onClick(event: MouseNormalizedEvent): void {
159
- * console.log(event.lngLat.lng, event.lngLat.lat);
160
- * }
161
- * onKeyDown(event: { key: string }): void {
162
- * if (event.key === 'Escape') this.context?.setMode('select');
163
- * }
164
- * }
165
- *
166
- * draw.registerMode('probe', () => new ProbeMode());
167
- * draw.setMode('probe');
168
- * ```
169
- */
170
- export interface ModeHandler {
171
- /** The name the mode is registered under */
172
- readonly modeName: Mode;
173
- /**
174
- * Whether the mode writes new features into a layer
175
- *
176
- * A mode that declares true is entered only while a layer can be written (while
177
- * `ModeContext.getCurrentLayerId` returns a non-empty string); otherwise setMode is ignored
178
- * and the current mode is kept. The built-in drawing modes declare it, and a plugin mode
179
- * that creates features declares it to get the same gate. The declaration does not remove
180
- * the check at commit time: the layer can stop being writable while the mode is active.
181
- */
182
- readonly writesFeatures?: boolean;
183
- /** Called when the mode becomes the current mode; keep the context for later */
184
- onStart?(context: ModeContext): void;
185
- /** Called when another mode replaces it or the draw instance is destroyed */
186
- onStop?(): void;
187
- /** Called on a click */
188
- onClick?(event: MouseNormalizedEvent): void;
189
- /** Called on a double click */
190
- onDoubleClick?(event: MouseNormalizedEvent): void;
191
- /** Called on a mouse move */
192
- onMouseMove?(event: MouseNormalizedEvent): void;
193
- /**
194
- * Called on a mouse down
195
- * @returns returning true consumes the event (stops the propagation to MapLibre)
196
- */
197
- onMouseDown?(event: MouseNormalizedEvent): boolean | undefined;
198
- /** Called on a mouse up */
199
- onMouseUp?(event: MouseNormalizedEvent): void;
200
- /** Called when a drag starts */
201
- onDragStart?(event: DragNormalizedEvent): void;
202
- /** Called during a drag */
203
- onDragMove?(event: DragNormalizedEvent): void;
204
- /** Called when a drag ends */
205
- onDragEnd?(event: DragNormalizedEvent): void;
206
- /**
207
- * Called when a press ends without a release (a second finger touched the screen, or the
208
- * browser cancelled the touch)
209
- *
210
- * Nothing is decided: the mode abandons the press, restores what the press changed and
211
- * gives the pan back to MapLibre. It can arrive before onDragStart (a press that has not
212
- * become a drag yet). The coordinates are the last known position.
213
- */
214
- onDragCancel?(event: DragNormalizedEvent): void;
215
- /** Called on a key down (normalized) */
216
- onKeyDown?(event: KeyNormalizedEvent): void;
217
- /** Called on a key up (normalized) */
218
- onKeyUp?(event: KeyNormalizedEvent): void;
219
- /**
220
- * Called after an external state change
221
- *
222
- * Used to reset the internal state of the mode after an external state change
223
- * (a change applied from outside the mode) has been carried out.
224
- * Example: when the state is changed externally while drawing in the Circle mode,
225
- * the drawing state is reset.
226
- */
227
- onExternalStateChange?(): void;
228
- /**
229
- * Called after a selection change
230
- *
231
- * Used to update the internal state of the mode when the selection is changed from a plugin.
232
- */
233
- onSelectionChange?(): void;
234
- /**
235
- * Undoes a vertex while drawing
236
- *
237
- * Called when Cmd+Z/Ctrl+Z is pressed while drawing a LineString/Polygon.
238
- * @returns whether the undo was carried out
239
- */
240
- undoVertex?(): boolean;
241
- /**
242
- * Redoes a vertex that was undone
243
- *
244
- * Called when Cmd+Shift+Z/Ctrl+Y is pressed while drawing.
245
- * @returns whether the redo was carried out
246
- */
247
- redoVertex?(): boolean;
248
- /**
249
- * Returns the feature to prefer when snapping candidates are tied
250
- *
251
- * Read by InputRouter right before it passes the coordinates through snapping, and passed as
252
- * the preferFeature of SnapContext. A drawing mode returns the anchor of the trace (the
253
- * boundary it started tracing along), which prevents the snap target from jumping to another
254
- * feature whose coordinates overlap exactly.
255
- *
256
- * @returns the feature to prefer, or null if there is none
257
- */
258
- getSnapPreference?(): {
259
- featureId: string;
260
- datasetId?: string;
261
- } | null;
262
- /**
263
- * Returns, per input type, whether snapping is to be applied
264
- *
265
- * Read by InputRouter right before it passes the coordinates through snapping. An input type
266
- * for which false is returned does not go through SnapService and reaches the mode with its
267
- * raw coordinates. When this is omitted (and when true is returned), snapping is applied as
268
- * before.
269
- *
270
- * The tolerance (10 pixels by default) is a value premised on "once per click", so in a
271
- * drag-driven drawing that passes several hundred points in a single stroke (freehand), the
272
- * intermediate sample points are pulled one after another to nearby vertices and a line drawn
273
- * straight ends up bent. A port that can be switched off per input type is provided so that
274
- * only the inside of the stroke can be let through untouched (the start point and the end
275
- * point can remain snapped).
276
- *
277
- * @param inputType the type of the input for which snapping is about to be applied
278
- * @returns true if snapping is to be applied
279
- */
280
- isSnapEnabledFor?(inputType: SnapInputType): boolean;
281
- }
282
- /**
283
- * Creates a new {@link ModeHandler}; called every time the mode is entered.
284
- */
285
- export type ModeFactory = () => ModeHandler;
1
+ export {};
@@ -1,4 +1,4 @@
1
- import type { ModeHandler } from './handler.js';
1
+ import type { EngineModeHandler } from './handler.js';
2
2
  /**
3
3
  * Options of ModeManagerImpl
4
4
  */
@@ -11,5 +11,5 @@ export interface ModeManagerOptions {
11
11
  * `writesFeatures`). When it returns false the request is ignored and the current mode is
12
12
  * kept, like the interaction lock. When it is omitted, every registered mode can be entered.
13
13
  */
14
- canEnter?: (handler: ModeHandler) => boolean;
14
+ canEnter?: (handler: EngineModeHandler) => boolean;
15
15
  }
@@ -103,6 +103,9 @@ export class ModeManagerImpl {
103
103
  this.unregisterMode(mode);
104
104
  };
105
105
  }
106
+ hasMode(mode) {
107
+ return this.factories.has(mode);
108
+ }
106
109
  unregisterMode(mode) {
107
110
  if (!this.factories.has(mode))
108
111
  return;
@@ -1,12 +1,12 @@
1
1
  import type { BoxSelection, Coordinate, Feature } from '../../store/types.js';
2
- import type { ModeContext } from '../handler.js';
2
+ import type { EngineModeContext } from '../handler.js';
3
3
  /**
4
4
  * Detect the features inside the box
5
5
  *
6
6
  * First the candidates are obtained quickly through the SpatialIndex (rbush),
7
7
  * and then a precise inside-the-box test is performed.
8
8
  */
9
- export declare function queryFeaturesInBox(boxSelection: BoxSelection, context: ModeContext): string[];
9
+ export declare function queryFeaturesInBox(boxSelection: BoxSelection, context: EngineModeContext): string[];
10
10
  type Rect = {
11
11
  minX: number;
12
12
  minY: number;
@@ -37,7 +37,7 @@ export declare function isFeatureInBox(feature: Feature, rect: {
37
37
  minY: number;
38
38
  maxX: number;
39
39
  maxY: number;
40
- }, boxSelectionRegistry: ModeContext['boxSelectionRegistry']): boolean;
40
+ }, boxSelectionRegistry: EngineModeContext['boxSelectionRegistry']): boolean;
41
41
  /**
42
42
  * The fallback box selection test
43
43
  *
@@ -5,6 +5,7 @@
5
5
  *
6
6
  * Responsible for handling box selection in select mode
7
7
  */
8
+ import { coordinatesOf } from '../../shared/utils/coordinates.js';
8
9
  import { isLocallyHidden } from '../../store/local-visibility.js';
9
10
  /**
10
11
  * Detect the features inside the box
@@ -111,7 +112,7 @@ export function fallbackBoxSelection(feature, rect) {
111
112
  coord[1] >= rect.minY &&
112
113
  coord[1] <= rect.maxY);
113
114
  };
114
- const coords = feature.coordinates;
115
+ const coords = coordinatesOf(feature);
115
116
  // When the coordinates are a single point
116
117
  if (Array.isArray(coords) &&
117
118
  coords.length === 2 &&
@@ -8,25 +8,25 @@
8
8
  * (LineString / Polygon / the Multi types) -> vertex selection
9
9
  * 3. Unified z traversal (hitTestTopmost) -> if it is a Store feature, the selection is
10
10
  * updated / shift+click toggles / re-clicking an already selected feature is delegated to
11
- * pluginManager.handleFeatureClick.
11
+ * plugins.handleFeatureClick.
12
12
  * If a dataset is in the foreground, Store features are not grabbed and it
13
13
  * is treated as clearing the selection.
14
14
  * If a feature companion is in the foreground, the click is consumed and passed to the
15
15
  * provider (the selection is left unchanged)
16
16
  *
17
- * Double click: selects the feature and notifies pluginManager.handleFeatureDoubleClick
17
+ * Double click: selects the feature and notifies plugins.handleFeatureDoubleClick
18
18
  */
19
19
  import type { MouseNormalizedEvent } from '../../dispatcher/types.js';
20
20
  import type { SelectionUIConfig } from '../../shared/config/selection.js';
21
- import type { ModeContext } from '../handler.js';
21
+ import type { EngineModeContext } from '../handler.js';
22
22
  /**
23
23
  * The main logic of onClick
24
24
  */
25
- export declare function handleSelectClick(event: MouseNormalizedEvent, context: ModeContext, config: SelectionUIConfig): void;
25
+ export declare function handleSelectClick(event: MouseNormalizedEvent, context: EngineModeContext, config: SelectionUIConfig): void;
26
26
  /**
27
27
  * The main logic of onDoubleClick
28
28
  *
29
29
  * A double click on a feature is consumed (its default action is prevented, so MapLibre does
30
30
  * not zoom); a double click on the empty map is left to MapLibre.
31
31
  */
32
- export declare function handleSelectDoubleClick(event: MouseNormalizedEvent, context: ModeContext): void;
32
+ export declare function handleSelectDoubleClick(event: MouseNormalizedEvent, context: EngineModeContext): void;
@@ -30,7 +30,7 @@ export function handleSelectClick(event, context, config) {
30
30
  * not zoom); a double click on the empty map is left to MapLibre.
31
31
  */
32
32
  export function handleSelectDoubleClick(event, context) {
33
- if (context.pluginManager?.isPluginInteracting())
33
+ if (context.plugins?.isPluginInteracting())
34
34
  return;
35
35
  const { store } = context;
36
36
  const orderedFeatures = getDisplayFeatures(store);
@@ -39,13 +39,11 @@ export function handleSelectDoubleClick(event, context) {
39
39
  if (top?.kind !== 'store')
40
40
  return;
41
41
  event.originalEvent.preventDefault();
42
- const filtered = context.pluginManager?.filterSelectionCandidates([top.feature.id]) ?? [
43
- top.feature.id,
44
- ];
42
+ const filtered = context.plugins?.filterSelectionCandidates([top.feature.id]) ?? [top.feature.id];
45
43
  if (filtered.length > 0) {
46
44
  store.setSelection('feature', filtered);
47
45
  }
48
- context.pluginManager?.handleFeatureDoubleClick(top.feature.id);
46
+ context.plugins?.handleFeatureDoubleClick(top.feature.id, event);
49
47
  }
50
48
  /**
51
49
  * Click handling during a plugin interaction
@@ -53,7 +51,7 @@ export function handleSelectDoubleClick(event, context) {
53
51
  * @returns true when the click was consumed (= the caller skips the rest of the handling)
54
52
  */
55
53
  function handlePluginInteractionClick(event, context) {
56
- const pm = context.pluginManager;
54
+ const pm = context.plugins;
57
55
  if (!pm?.isPluginInteracting())
58
56
  return false;
59
57
  const container = pm.getPluginInteractionContainer();
@@ -91,20 +89,20 @@ function handleVertexClick(event, selectedIds, context, config) {
91
89
  if (!featureId)
92
90
  return false;
93
91
  const vertexRef = handleHit.vertexRef;
94
- const currentVertexSelection = store.getSelectedVertices();
92
+ const currentVertexSelection = store.getVertexSelection();
95
93
  if (event.modifiers.shift && currentVertexSelection?.featureId === featureId) {
96
94
  // Shift+click: add / remove a vertex of the same feature
97
- const refs = currentVertexSelection.vertexIndices;
95
+ const refs = currentVertexSelection.vertices;
98
96
  if (hasVertexRef(refs, vertexRef)) {
99
97
  const newRefs = refs.filter((r) => !isSameVertexRef(r, vertexRef));
100
- store.setSelectedVertices(newRefs.length === 0 ? null : { featureId, vertexIndices: newRefs });
98
+ store.setSelectedVertices(newRefs.length === 0 ? null : { featureId, vertices: newRefs });
101
99
  }
102
100
  else {
103
- store.setSelectedVertices({ featureId, vertexIndices: [...refs, vertexRef] });
101
+ store.setSelectedVertices({ featureId, vertices: [...refs, vertexRef] });
104
102
  }
105
103
  }
106
104
  else {
107
- store.setSelectedVertices({ featureId, vertexIndices: [vertexRef] });
105
+ store.setSelectedVertices({ featureId, vertices: [vertexRef] });
108
106
  }
109
107
  return true;
110
108
  }
@@ -114,17 +112,21 @@ function handleVertexClick(event, selectedIds, context, config) {
114
112
  function handleFeatureClick(event, selection, selectedIds, context) {
115
113
  const { store } = context;
116
114
  const orderedFeatures = getDisplayFeatures(store);
117
- const top = context.hitTestTopmost(event.point, { orderedFeatures });
118
- // A feature companion is in the foreground: the provider receives the click and core changes
119
- // the selection in no way at all (not even clearing it as an empty click would). Core does not
120
- // know what the companion is, so its job ends at consuming the click and reporting it.
115
+ let top = context.hitTestTopmost(event.point, { orderedFeatures });
116
+ // A feature companion is in the foreground: the provider receives the click. When it consumes
117
+ // it, core changes the selection in no way at all (not even clearing it as an empty click
118
+ // would); when it leaves it, the click is one on the feature that owns the companion
121
119
  if (top?.kind === 'companion') {
122
- notifyFeatureCompanionClick(context.featureCompanions, top.companion);
123
- return;
120
+ if (notifyFeatureCompanionClick(context.featureCompanions, top.companion, event))
121
+ return;
122
+ const owner = store.getFeature(top.companion.featureId);
123
+ if (!owner)
124
+ return;
125
+ top = { kind: 'store', feature: owner };
124
126
  }
125
127
  // When there is nothing, and when a dataset is in the foreground, Store
126
128
  // features are not grabbed. A dataset's click fires only when the intercepting side
127
- // (display/interaction) is interactive.
129
+ // (dataset/interaction) is interactive.
128
130
  if (top?.kind !== 'store') {
129
131
  if (!event.modifiers.shift) {
130
132
  store.setSelection(null, []);
@@ -134,7 +136,7 @@ function handleFeatureClick(event, selection, selectedIds, context) {
134
136
  const feature = top.feature;
135
137
  // Re-clicking an already selected feature -> delegate to the plugins
136
138
  if (!event.modifiers.shift && selectedIds.length === 1 && selectedIds.includes(feature.id)) {
137
- if (context.pluginManager?.handleFeatureClick(feature.id)) {
139
+ if (context.plugins?.handleFeatureClick(feature.id, event)) {
138
140
  return;
139
141
  }
140
142
  }
@@ -142,7 +144,7 @@ function handleFeatureClick(event, selection, selectedIds, context) {
142
144
  const candidateIds = event.modifiers.shift
143
145
  ? toggleSelection(selection, feature.id)
144
146
  : [feature.id];
145
- const filtered = context.pluginManager?.filterSelectionCandidates(candidateIds) ?? candidateIds;
147
+ const filtered = context.plugins?.filterSelectionCandidates(candidateIds) ?? candidateIds;
146
148
  if (filtered.length === 0) {
147
149
  store.setSelection(null, []);
148
150
  }
@@ -11,5 +11,5 @@
11
11
  */
12
12
  import type { MouseNormalizedEvent } from '../../dispatcher/types.js';
13
13
  import type { SelectionUIConfig } from '../../shared/config/selection.js';
14
- import type { ModeContext } from '../handler.js';
15
- export declare function updateCursorForSelection(event: MouseNormalizedEvent, context: ModeContext, config: SelectionUIConfig): void;
14
+ import type { EngineModeContext } from '../handler.js';
15
+ export declare function updateCursorForSelection(event: MouseNormalizedEvent, context: EngineModeContext, config: SelectionUIConfig): void;
@@ -128,7 +128,7 @@ export class IntermediateWrites {
128
128
  *
129
129
  * The last value of every feature that was touched (including features that followed along
130
130
  * through a shared vertex) is rewritten as a committed update (no options), gathered into a
131
- * single store.transact. Because it is notified as one StateChanges, a subscriber that records
131
+ * single store.transact. Because it is notified as one StoreChange, a subscriber that records
132
132
  * changes can treat this batch as a single step with its existing mechanism.
133
133
  *
134
134
  * The committed value is simply the last diff that was recorded. That way it does not depend
@@ -1,6 +1,6 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
- import { mapCoordinatesDeep } from '../../../shared/utils/coordinates.js';
3
+ import { coordinatesOf, geometryFromCoordinates, mapCoordinatesDeep, } from '../../../shared/utils/coordinates.js';
4
4
  import { dragStartLngLat } from './operation.js';
5
5
  /**
6
6
  * Translate coordinates
@@ -35,7 +35,7 @@ export class MoveDrag {
35
35
  const initialCoords = this.state.initialCoordinates.get(id);
36
36
  if (feature && initialCoords) {
37
37
  const newCoords = translateCoordinates(initialCoords, dx, dy);
38
- writes.write(store, id, { coordinates: newCoords });
38
+ writes.write(store, id, { geometry: geometryFromCoordinates(feature.type, newCoords) });
39
39
  }
40
40
  }
41
41
  }
@@ -48,7 +48,7 @@ export function startMoveDrag(event, featureIds, store) {
48
48
  for (const id of featureIds) {
49
49
  const feature = store.getFeature(id);
50
50
  if (feature) {
51
- initialCoordinates.set(id, JSON.parse(JSON.stringify(feature.coordinates)));
51
+ initialCoordinates.set(id, JSON.parse(JSON.stringify(coordinatesOf(feature))));
52
52
  }
53
53
  }
54
54
  return new MoveDrag({
@@ -8,14 +8,14 @@
8
8
  */
9
9
  import type { DragNormalizedEvent } from '../../../dispatcher/types.js';
10
10
  import type { Feature } from '../../../store/types.js';
11
- import type { ModeContext } from '../../handler.js';
11
+ import type { EngineModeContext } from '../../handler.js';
12
12
  /** The Store a drag writes to */
13
- export type DragStore = ModeContext['store'];
13
+ export type DragStore = EngineModeContext['store'];
14
14
  /**
15
15
  * The selection scope of the draw instance the drag belongs to (the resize and rotate
16
16
  * strategies of custom types, and the auxiliary handle providers). Null before a drag starts
17
17
  */
18
- export type DragScope = ModeContext['selectionScope'] | null;
18
+ export type DragScope = EngineModeContext['selectionScope'] | null;
19
19
  /**
20
20
  * The drag start position (the exact position before the 3-pixel movement)
21
21
  */
@@ -1,6 +1,8 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
- import { haversineDistanceMeters, initialBearingDegrees } from '../../../geometry/index.js';
3
+ import { haversineDistanceMeters, initialBearingDegrees } from '../../../geometry/distance.js';
4
+ import { drawProperties } from '../../../shared/properties.js';
5
+ import { coordinatesOf } from '../../../shared/utils/coordinates.js';
4
6
  /** @internal */
5
7
  export class RadiusDrag {
6
8
  constructor(state) {
@@ -31,8 +33,7 @@ export class RadiusDrag {
31
33
  const updates = {
32
34
  properties: {
33
35
  ...feature.properties,
34
- radiusMeters: newRadiusMeters,
35
- radiusHandleAngle: newAngle,
36
+ ...drawProperties({ radiusMeters: newRadiusMeters, radiusHandleAngle: newAngle }),
36
37
  },
37
38
  };
38
39
  writes.write(store, this.state.featureId, updates);
@@ -45,5 +46,5 @@ export function startRadiusDrag(featureId, store) {
45
46
  const feature = store.getFeature(featureId);
46
47
  if (feature?.type !== 'Circle')
47
48
  return null;
48
- return new RadiusDrag({ featureId, center: feature.coordinates });
49
+ return new RadiusDrag({ featureId, center: coordinatesOf(feature) });
49
50
  }
@@ -5,12 +5,12 @@ import type { DragNormalizedEvent } from '../../../dispatcher/types.js';
5
5
  import type { HandleType } from '../../../shared/config/constants.js';
6
6
  import type { Feature } from '../../../store/types.js';
7
7
  import type { BoundingBoxCoords } from '../../../view/ui/selection-ui/index.js';
8
- import type { ModeContext } from '../../handler.js';
8
+ import type { EngineModeContext } from '../../handler.js';
9
9
  import type { DragScope, DragStore } from './operation.js';
10
10
  /**
11
11
  * Start a resize drag from a bounding box handle
12
12
  */
13
- export declare function startResizeDrag(event: DragNormalizedEvent, handle: HandleType, bbox: BoundingBoxCoords, features: Feature[], map: ModeContext['map'], scope: DragScope): ResizeDrag;
13
+ export declare function startResizeDrag(event: DragNormalizedEvent, handle: HandleType, bbox: BoundingBoxCoords, features: Feature[], map: EngineModeContext['map'], scope: DragScope): ResizeDrag;
14
14
  /**
15
15
  * Start a rotate drag from the rotation handle, and set the DragState it draws from
16
16
  */
@@ -2,6 +2,8 @@
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  import { computeResize, startResize } from '../../../operations/resize.js';
4
4
  import { computeRotation, getRotationDelta, startRotation } from '../../../operations/rotate.js';
5
+ import { drawProperties } from '../../../shared/properties.js';
6
+ import { geometryFromCoordinates } from '../../../shared/utils/coordinates.js';
5
7
  import { computeBoundingBox } from '../../../view/ui/selection-ui/index.js';
6
8
  import { dragStartLngLat, selectedFeaturesOf } from './operation.js';
7
9
  // === Resize operation ===
@@ -33,19 +35,21 @@ export class ResizeDrag {
33
35
  const resizeResults = computeResize(this.state, event.lngLat, [feature], this.scope?.extensions);
34
36
  const result = resizeResults.get(feature.id);
35
37
  if (result) {
36
- const updates = { coordinates: result.coordinates };
38
+ const updates = {
39
+ geometry: geometryFromCoordinates(feature.type, result.coordinates),
40
+ };
37
41
  // Update the scale property when there is one (Text, Image, etc.)
38
42
  if (result.scale !== undefined) {
39
43
  updates.properties = {
40
44
  ...feature.properties,
41
- scale: result.scale,
45
+ ...drawProperties({ scale: result.scale }),
42
46
  };
43
47
  }
44
48
  // For a Circle, also update the radiusMeters property
45
49
  if (result.radiusMeters !== undefined && feature.type === 'Circle') {
46
50
  updates.properties = {
47
51
  ...feature.properties,
48
- radiusMeters: result.radiusMeters,
52
+ ...drawProperties({ radiusMeters: result.radiusMeters }),
49
53
  };
50
54
  }
51
55
  // For a custom resize, also update the width / height properties (Note, etc.)
@@ -95,12 +99,14 @@ export class RotateDrag {
95
99
  for (const [id, result] of rotateResults) {
96
100
  const feature = store.getFeature(id);
97
101
  if (feature) {
98
- const updates = { coordinates: result.coordinates };
102
+ const updates = {
103
+ geometry: geometryFromCoordinates(feature.type, result.coordinates),
104
+ };
99
105
  // Update the rotation property when there is one (Text, Image, Note, etc.)
100
106
  if (result.rotation !== undefined) {
101
107
  updates.properties = {
102
108
  ...feature.properties,
103
- rotation: result.rotation,
109
+ ...drawProperties({ rotation: result.rotation }),
104
110
  };
105
111
  }
106
112
  writes.write(store, id, updates);