@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
@@ -16,6 +16,7 @@
16
16
  * When it does not hold, the caller drops to the previous vertex displacement path (a
17
17
  * two-stage arrangement). The condition for dropping is decided here by `canDrape`.
18
18
  */
19
+ import { coordinatesOf } from '../../../shared/utils/coordinates.js';
19
20
  import { getCreatedZoom } from '../../../shared/utils/property.js';
20
21
  import { getDisplayFeatures, isLocallyHidden } from '../../../store/local-visibility.js';
21
22
  import { layerDrawFactors } from '../../renderers/draw-factors.js';
@@ -229,7 +230,7 @@ function collectStoreFeature(context, feature, layer, source, bakedOpacity) {
229
230
  *
230
231
  * So that the retained batch side does not draw the same features that were put on, the caller
231
232
  * tells the dataset "the polygons and lines are drawn by the drape"
232
- * (`drapedDatasets`). The test here and `collectFeature` in `display/retained.ts` form a
233
+ * (`drapedDatasets`). The test here and `collectFeature` in `dataset/retained.ts` form a
233
234
  * pair, so the condition must never be changed on only one side.
234
235
  */
235
236
  function collectDataset(context, dataset, source) {
@@ -252,7 +253,7 @@ function collectDataset(context, dataset, source) {
252
253
  if (rings.length === 0)
253
254
  continue;
254
255
  const width = widthOf(feature, strokeStyle.width, context.pixelRatio);
255
- pushElement(context, feature.coordinates, 0, rings, {
256
+ pushElement(context, coordinatesOf(feature), 0, rings, {
256
257
  fill: fillColor,
257
258
  stroke: [
258
259
  strokeStyle.color[0],
@@ -281,7 +282,7 @@ function collectDataset(context, dataset, source) {
281
282
  if (paths.length === 0)
282
283
  continue;
283
284
  const width = widthOf(feature, strokeStyle.width, context.pixelRatio);
284
- pushElement(context, feature.coordinates, 1, paths, {
285
+ pushElement(context, coordinatesOf(feature), 1, paths, {
285
286
  fill: [0, 0, 0, 0],
286
287
  stroke: [
287
288
  strokeStyle.color[0],
@@ -313,14 +314,14 @@ function widthOf(feature, width, pixelRatio) {
313
314
  /** The rings of a polygon (with the closing point dropped) */
314
315
  function polygonRings(feature) {
315
316
  return feature.type === 'Polygon'
316
- ? openRings(feature.coordinates)
317
- : feature.coordinates.flatMap((part) => openRings(part));
317
+ ? openRings(coordinatesOf(feature))
318
+ : coordinatesOf(feature).flatMap((part) => openRings(part));
318
319
  }
319
320
  /** The paths of a line */
320
321
  function linePaths(feature) {
321
322
  const paths = feature.type === 'LineString' || feature.type === 'Freehand'
322
- ? [feature.coordinates]
323
- : feature.coordinates;
323
+ ? [coordinatesOf(feature)]
324
+ : coordinatesOf(feature);
324
325
  return paths.filter((path) => path.length >= 2);
325
326
  }
326
327
  /** Pushes an element */
@@ -2,19 +2,23 @@
2
2
  * The injection point for terrain subdivision of polygons
3
3
  *
4
4
  * Called from the polygon renderers (polygon/sdf-polygon.ts and polygon/batch.ts). When the
5
- * terrain is disabled, `getTerrainTessellationStep(context)` returns null and the caller does
5
+ * terrain is disabled, `terrainStepOf(context)` returns null and the caller does
6
6
  * nothing. Rendering without terrain therefore does not change by a single byte.
7
7
  */
8
+ import type { TerrainAnchors } from '../../api/extension/context.js';
9
+ import type { RenderContext } from '../../api/extension/render.js';
8
10
  import type { Coordinate } from '../../store/types.js';
9
11
  import type { TerrainContext } from './context.js';
10
12
  import { type MercatorRect, type TessellationStep } from './tessellation.js';
11
13
  /**
12
- * Returns the subdivision step of the terrain mesh for the current frame.
14
+ * Returns the subdivision step of the terrain mesh for the current frame, to cut a shape so
15
+ * that it follows the terrain (pass it to `densifyPath`).
13
16
  *
14
- * @param context The terrain state of the draw instance
15
- * @returns The step, or `null` when the terrain is disabled
17
+ * @param terrain - The render context of the draw call, or its `terrain`
18
+ * @returns The step, or `null` when the terrain is disabled (or the object was not handed out
19
+ * by the engine)
16
20
  */
17
- export declare function getTerrainTessellationStep(context: TerrainContext): TessellationStep | null;
21
+ export declare function terrainTessellationStep(terrain: RenderContext | TerrainAnchors): TessellationStep | null;
18
22
  /**
19
23
  * Decides the effective step for a single feature
20
24
  *
@@ -1,16 +1,30 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { terrainStateOf } from './binding.js';
3
4
  import { TERRAIN_MAX_BATCH_SUBDIVISION_CELLS, TERRAIN_MAX_COARSEN_STEPS, TERRAIN_MAX_SUBDIVISION_POINTS, TERRAIN_MAX_TILED_SUBDIVISION_POINTS, } from './metrics.js';
4
5
  import { getTerrainRenderState } from './state.js';
5
6
  import { cellsInRegion, densifyRings, mercatorX, mercatorY, rectsIntersect, subdivideTriangles, } from './tessellation.js';
6
7
  import { tilingSignature } from './tiling.js';
7
8
  /**
8
- * Returns the subdivision step of the terrain mesh for the current frame.
9
+ * Returns the subdivision step of the terrain mesh for the current frame, to cut a shape so
10
+ * that it follows the terrain (pass it to `densifyPath`).
11
+ *
12
+ * @param terrain - The render context of the draw call, or its `terrain`
13
+ * @returns The step, or `null` when the terrain is disabled (or the object was not handed out
14
+ * by the engine)
15
+ */
16
+ export function terrainTessellationStep(terrain) {
17
+ const state = terrainStateOf(terrain);
18
+ return state ? terrainStepOf(state) : null;
19
+ }
20
+ /**
21
+ * {@link terrainTessellationStep} over the terrain state of an instance
9
22
  *
10
23
  * @param context The terrain state of the draw instance
11
24
  * @returns The step, or `null` when the terrain is disabled
25
+ * @internal
12
26
  */
13
- export function getTerrainTessellationStep(context) {
27
+ export function terrainStepOf(context) {
14
28
  const terrain = getTerrainRenderState(context);
15
29
  if (!terrain.active || !(terrain.stepGrid > 0))
16
30
  return null;
@@ -6,7 +6,7 @@
6
6
  * (`context.ts`; how a shared global broke with several instances is written there). Every
7
7
  * accessor takes that context explicitly: the renderers of a CustomLayer receive their
8
8
  * instance's context at construction, and extension renderers receive it in the draw context
9
- * (`CustomRendererDrawContext.terrain`). Nothing here reads "the instance drawn last".
9
+ * (`FrameDrawContext.terrain`). Nothing here reads "the instance drawn last".
10
10
  *
11
11
  * When the terrain is disabled, `INACTIVE_TERRAIN_STATE` is held and the shader's
12
12
  * `u_terrain_on` becomes 0. The vertex computation when it is 0 is exactly identical to
@@ -8,7 +8,7 @@
8
8
  * (`context.ts`; how a shared global broke with several instances is written there). Every
9
9
  * accessor takes that context explicitly: the renderers of a CustomLayer receive their
10
10
  * instance's context at construction, and extension renderers receive it in the draw context
11
- * (`CustomRendererDrawContext.terrain`). Nothing here reads "the instance drawn last".
11
+ * (`FrameDrawContext.terrain`). Nothing here reads "the instance drawn last".
12
12
  *
13
13
  * When the terrain is disabled, `INACTIVE_TERRAIN_STATE` is held and the shader's
14
14
  * `u_terrain_on` becomes 0. The vertex computation when it is 0 is exactly identical to
@@ -47,7 +47,7 @@ export interface MercatorRect {
47
47
  }
48
48
  /**
49
49
  * How finely a line or a fill is subdivided to follow the terrain mesh, as
50
- * {@link getTerrainTessellationStep} returns it.
50
+ * {@link terrainTessellationStep} returns it.
51
51
  */
52
52
  export interface TessellationStep {
53
53
  /**
@@ -193,7 +193,7 @@ export declare function latFromMercatorY(y: number): number;
193
193
  * on the original line).
194
194
  *
195
195
  * @param path The vertices `[lng, lat]` in degrees
196
- * @param step The step from {@link getTerrainTessellationStep}
196
+ * @param step The step from {@link terrainTessellationStep}
197
197
  * @returns The densified vertices. The input itself for fewer than 2 positions or a step of
198
198
  * 0; insertion stops when `step.maxPoints` is reached
199
199
  */
@@ -91,7 +91,7 @@ export function latFromMercatorY(y) {
91
91
  * on the original line).
92
92
  *
93
93
  * @param path The vertices `[lng, lat]` in degrees
94
- * @param step The step from {@link getTerrainTessellationStep}
94
+ * @param step The step from {@link terrainTessellationStep}
95
95
  * @returns The densified vertices. The input itself for fewer than 2 positions or a step of
96
96
  * 0; insertion stops when `step.maxPoints` is reached
97
97
  */
@@ -2,10 +2,10 @@
2
2
  * Extension point for the auxiliary handles
3
3
  *
4
4
  * A general-purpose hook for showing and grabbing handles on the selected feature that are
5
- * "neither a vertex nor a resize handle". All core holds is the hit testing and the drag
6
- * delegation; drawing the handles is the responsibility of the registering side (the plugin
7
- * of an extension implementation). core knows nothing at all about the meaning of a handle
8
- * (it only carries the position and the identifier).
5
+ * "neither a vertex nor a resize handle". Core draws them with the look of the vertex handles
6
+ * (the selection UI), hit tests them at the same size and delegates their drags. core knows
7
+ * nothing at all about the meaning of a handle (it only carries the position and the
8
+ * identifier).
9
9
  *
10
10
  * There are two ways to emit handles: those bound to the selected feature (getHandles) and
11
11
  * those that can always be emitted regardless of the selection (getGlobalHandles). The
@@ -72,31 +72,8 @@ export interface AuxiliaryHandleHit {
72
72
  * A source of handles on the selected feature that are neither vertices nor resize handles,
73
73
  * and the receiver of their drags.
74
74
  *
75
- * Register one with `draw.registerAuxiliaryHandleProvider(provider)`. The library hit tests
76
- * the handles and delegates their drags; drawing them is the provider's job (with an overlay
77
- * renderer, for example).
78
- *
79
- * @example
80
- * ```ts
81
- * import type { AuxiliaryHandleProvider } from '@sakuzu/maplibre-gl-draw';
82
- *
83
- * // A handle 20 px above the first vertex of the selected line, which logs its drag
84
- * const labelHandle: AuxiliaryHandleProvider = {
85
- * id: 'label-handle',
86
- * getHandles(feature, ctx) {
87
- * if (feature.type !== 'LineString') return [];
88
- * const first = (feature.coordinates as [number, number][])[0];
89
- * const p = ctx.project(first);
90
- * const { lng, lat } = ctx.unproject({ x: p.x, y: p.y - 20 });
91
- * return [{ id: 'label', position: [lng, lat], cursor: 'move' }];
92
- * },
93
- * onHandleDragStart: () => true,
94
- * onHandleDragMove: (event) => console.log(event.lngLat),
95
- * onHandleDragEnd: () => {},
96
- * };
97
- *
98
- * const unregister = draw.registerAuxiliaryHandleProvider(labelHandle);
99
- * ```
75
+ * A `HandleProvider` of `draw.extensions.handleProviders` is installed as one. The engine draws
76
+ * the handles with the look of the vertex handles, hit tests them and delegates their drags.
100
77
  */
101
78
  export interface AuxiliaryHandleProvider {
102
79
  /** Identifier unique within the registry (re-registering with the same id overwrites) */
@@ -1,7 +1,7 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  import { applyMarginToBoundingBox } from '../../shared/math/index.js';
4
- import { computeBoundingBox, hasZeroArea, resolvePointFrameExtentWith, } from './selection-ui/index.js';
4
+ import { computeBoundingBox, hasZeroArea, resolvePointFrameCornersWith, } from './selection-ui/index.js';
5
5
  /**
6
6
  * Compute the bounding box with a margin of a feature in geographic coordinates
7
7
  *
@@ -82,7 +82,8 @@ export function computeCombinedGeoBoundingBox(features, transform, config, exten
82
82
  /**
83
83
  * Compute the bounding box with a margin of a single-coordinate feature in geographic coordinates
84
84
  *
85
- * The extent of the frame of a point (registrable per type; 12px square when unregistered)
85
+ * The extent of the frame of a point (registrable per type; the marker of a built-in point, or
86
+ * a 12px square when unregistered)
86
87
  * plus the margin is computed in screen coordinates and converted into geographic ones.
87
88
  * The coordinate received is the center of the bbox (since features other than Point can
88
89
  * also be zero-area, e.g. a MultiPoint with a single point; coordinates must not be
@@ -90,17 +91,12 @@ export function computeCombinedGeoBoundingBox(features, transform, config, exten
90
91
  */
91
92
  function computeSingleCoordGeoBoundingBox(feature, coord, transform, margin, extensions) {
92
93
  const center = transform.project(coord);
93
- // The half width and half height of the frame of the point + the margin
94
- const extent = extensions
95
- ? extensions.resolvePointFrameExtent(feature)
96
- : resolvePointFrameExtentWith(undefined, feature);
97
- const halfWidth = extent.halfWidth + margin;
98
- const halfHeight = extent.halfHeight + margin;
94
+ // The corners of the frame of the point (its outline, or its extent) + the margin
95
+ const corners = extensions
96
+ ? extensions.resolvePointFrameCorners(feature, center, margin)
97
+ : resolvePointFrameCornersWith(undefined, undefined, feature, center, margin);
99
98
  // Convert the 4 corners in screen coordinates into geographic coordinates
100
- const topLeft = transform.unproject({ x: center.x - halfWidth, y: center.y - halfHeight });
101
- const topRight = transform.unproject({ x: center.x + halfWidth, y: center.y - halfHeight });
102
- const bottomRight = transform.unproject({ x: center.x + halfWidth, y: center.y + halfHeight });
103
- const bottomLeft = transform.unproject({ x: center.x - halfWidth, y: center.y + halfHeight });
99
+ const [topLeft, topRight, bottomRight, bottomLeft] = corners.map((corner) => transform.unproject(corner));
104
100
  return {
105
101
  topLeft: [topLeft.lng, topLeft.lat],
106
102
  topRight: [topRight.lng, topRight.lat],
@@ -216,8 +216,8 @@ function hitTestCircleRadiusHandle(feature, config, params) {
216
216
  *
217
217
  * Enumerating the handles is left to the callback (the aggregation of the providers), while
218
218
  * the test is done with the same screen-px rectangle as the existing handles. To keep the
219
- * grab feel uniform, the test size is the same as for the vertex handles (rendering is the
220
- * provider's responsibility, so core knows only the positions).
219
+ * grab feel uniform, the test size is the same as for the vertex handles, which is also the
220
+ * size the selection UI draws them at.
221
221
  */
222
222
  function hitTestAuxiliaryHandles(feature, config, zoom, params, getAuxiliaryHandles) {
223
223
  const context = {
@@ -14,7 +14,7 @@
14
14
  */
15
15
  import { HANDLE_THINNING_THRESHOLD, MIDPOINT_MIN_EDGE_PX, MIN_HANDLE_SPACING_PX, THINNING_REFRESH_DEBOUNCE_MS, } from '../../shared/config/selection.js';
16
16
  import { mercatorMidpoint } from '../../shared/math/globe-subdivision.js';
17
- import { supportsVertexEditing } from '../../shared/utils/coordinates.js';
17
+ import { coordinatesOf, supportsVertexEditing } from '../../shared/utils/coordinates.js';
18
18
  import { isSameVertexRef } from '../../shared/utils/vertex-ref.js';
19
19
  /**
20
20
  * Decomposes a feature into scan units
@@ -26,15 +26,15 @@ import { isSameVertexRef } from '../../shared/utils/vertex-ref.js';
26
26
  function collectHandleRuns(feature) {
27
27
  const runs = [];
28
28
  if (feature.type === 'LineString') {
29
- pushLineRun(runs, feature.coordinates);
29
+ pushLineRun(runs, coordinatesOf(feature));
30
30
  }
31
31
  else if (feature.type === 'Polygon') {
32
- pushPolygonRuns(runs, feature.coordinates);
32
+ pushPolygonRuns(runs, coordinatesOf(feature));
33
33
  }
34
34
  else if (feature.type === 'MultiPoint') {
35
35
  // Splitting a MultiPoint per part would adopt every point and defeat the thinning, so
36
36
  // all parts are scanned as a single sequence
37
- const points = feature.coordinates;
37
+ const points = coordinatesOf(feature);
38
38
  runs.push({
39
39
  coords: points,
40
40
  vertexCount: points.length,
@@ -44,13 +44,13 @@ function collectHandleRuns(feature) {
44
44
  });
45
45
  }
46
46
  else if (feature.type === 'MultiLineString') {
47
- const parts = feature.coordinates;
47
+ const parts = coordinatesOf(feature);
48
48
  for (let part = 0; part < parts.length; part++) {
49
49
  pushLineRun(runs, parts[part], part);
50
50
  }
51
51
  }
52
52
  else if (feature.type === 'MultiPolygon') {
53
- const parts = feature.coordinates;
53
+ const parts = coordinatesOf(feature);
54
54
  for (let part = 0; part < parts.length; part++) {
55
55
  pushPolygonRuns(runs, parts[part], part);
56
56
  }
@@ -112,25 +112,25 @@ export function countPotentialHandles(feature) {
112
112
  if (feature.type === 'Point')
113
113
  return 1;
114
114
  if (feature.type === 'LineString') {
115
- return countLineHandles(feature.coordinates.length);
115
+ return countLineHandles(coordinatesOf(feature).length);
116
116
  }
117
117
  if (feature.type === 'Polygon') {
118
- return countPolygonHandles(feature.coordinates);
118
+ return countPolygonHandles(coordinatesOf(feature));
119
119
  }
120
120
  if (feature.type === 'MultiPoint') {
121
121
  // Each coordinate is the vertex handle of one part. There are no edges
122
- return feature.coordinates.length;
122
+ return coordinatesOf(feature).length;
123
123
  }
124
124
  if (feature.type === 'MultiLineString') {
125
125
  let total = 0;
126
- for (const part of feature.coordinates) {
126
+ for (const part of coordinatesOf(feature)) {
127
127
  total += countLineHandles(part.length);
128
128
  }
129
129
  return total;
130
130
  }
131
131
  if (feature.type === 'MultiPolygon') {
132
132
  let total = 0;
133
- for (const part of feature.coordinates) {
133
+ for (const part of coordinatesOf(feature)) {
134
134
  total += countPolygonHandles(part);
135
135
  }
136
136
  return total;
@@ -254,23 +254,23 @@ export function includeRequiredVertexRefs(set, required) {
254
254
  function getRefCoords(feature, ref) {
255
255
  const part = ref.part ?? 0;
256
256
  if (feature.type === 'Point') {
257
- return [feature.coordinates];
257
+ return [coordinatesOf(feature)];
258
258
  }
259
259
  if (feature.type === 'LineString') {
260
- return feature.coordinates;
260
+ return coordinatesOf(feature);
261
261
  }
262
262
  if (feature.type === 'Polygon') {
263
- return feature.coordinates[ref.ring] ?? null;
263
+ return coordinatesOf(feature)[ref.ring] ?? null;
264
264
  }
265
265
  if (feature.type === 'MultiPoint') {
266
- const point = feature.coordinates[part];
266
+ const point = coordinatesOf(feature)[part];
267
267
  return point ? [point] : null;
268
268
  }
269
269
  if (feature.type === 'MultiLineString') {
270
- return feature.coordinates[part] ?? null;
270
+ return coordinatesOf(feature)[part] ?? null;
271
271
  }
272
272
  if (feature.type === 'MultiPolygon') {
273
- return feature.coordinates[part]?.[ref.ring] ?? null;
273
+ return coordinatesOf(feature)[part]?.[ref.ring] ?? null;
274
274
  }
275
275
  return null;
276
276
  }
@@ -1,8 +1,9 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
- import { destinationPoint } from '../../geometry/index.js';
3
+ import { destinationPoint } from '../../geometry/distance.js';
4
4
  import { mercatorMidpoint } from '../../shared/math/globe-subdivision.js';
5
5
  import { applyMarginToBoundingBox, clampLatitude } from '../../shared/math/index.js';
6
+ import { coordinatesOf } from '../../shared/utils/coordinates.js';
6
7
  import { getCircleRadius, getRadiusHandleAngle } from '../../shared/utils/property.js';
7
8
  import { hasVertexRef, isSameVertexRef } from '../../shared/utils/vertex-ref.js';
8
9
  import { includeRequiredVertexRefs, resolveMidpointCoordinate, resolveVertexCoordinate, } from './handle-thinning.js';
@@ -164,18 +165,18 @@ export function computeVertexHandles(feature, visibleSet) {
164
165
  const handles = [];
165
166
  if (feature.type === 'Point') {
166
167
  // A Point is a single vertex
167
- const coord = feature.coordinates;
168
+ const coord = coordinatesOf(feature);
168
169
  handles.push({ type: 'vertex', position: coord, vertexRef: { ring: 0, index: 0 } });
169
170
  }
170
171
  else if (feature.type === 'LineString') {
171
- collectLineVertexHandles(feature.coordinates, handles);
172
+ collectLineVertexHandles(coordinatesOf(feature), handles);
172
173
  }
173
174
  else if (feature.type === 'Polygon') {
174
- collectPolygonVertexHandles(feature.coordinates, handles);
175
+ collectPolygonVertexHandles(coordinatesOf(feature), handles);
175
176
  }
176
177
  else if (feature.type === 'MultiPoint') {
177
178
  // Each coordinate is one part. ring / index are always 0
178
- const points = feature.coordinates;
179
+ const points = coordinatesOf(feature);
179
180
  for (let part = 0; part < points.length; part++) {
180
181
  handles.push({
181
182
  type: 'vertex',
@@ -185,13 +186,13 @@ export function computeVertexHandles(feature, visibleSet) {
185
186
  }
186
187
  }
187
188
  else if (feature.type === 'MultiLineString') {
188
- const parts = feature.coordinates;
189
+ const parts = coordinatesOf(feature);
189
190
  for (let part = 0; part < parts.length; part++) {
190
191
  collectLineVertexHandles(parts[part], handles, part);
191
192
  }
192
193
  }
193
194
  else if (feature.type === 'MultiPolygon') {
194
- const parts = feature.coordinates;
195
+ const parts = coordinatesOf(feature);
195
196
  for (let part = 0; part < parts.length; part++) {
196
197
  collectPolygonVertexHandles(parts[part], handles, part);
197
198
  }
@@ -208,7 +209,7 @@ export function computeCircleRadiusHandle(feature) {
208
209
  if (feature.type !== 'Circle') {
209
210
  return null;
210
211
  }
211
- const center = feature.coordinates;
212
+ const center = coordinatesOf(feature);
212
213
  const radiusMeters = getCircleRadius(feature);
213
214
  const radiusHandleAngle = getRadiusHandleAngle(feature);
214
215
  if (!radiusMeters || radiusMeters <= 0) {
@@ -227,7 +228,7 @@ export function computeCircleCenterHandle(feature) {
227
228
  if (feature.type !== 'Circle') {
228
229
  return null;
229
230
  }
230
- const center = feature.coordinates;
231
+ const center = coordinatesOf(feature);
231
232
  return {
232
233
  type: 'center',
233
234
  position: center,
@@ -283,19 +284,19 @@ export function computeMidpointHandles(feature, visibleSet) {
283
284
  }
284
285
  const handles = [];
285
286
  if (feature.type === 'LineString') {
286
- collectLineMidpointHandles(feature.coordinates, handles);
287
+ collectLineMidpointHandles(coordinatesOf(feature), handles);
287
288
  }
288
289
  else if (feature.type === 'Polygon') {
289
- collectPolygonMidpointHandles(feature.coordinates, handles);
290
+ collectPolygonMidpointHandles(coordinatesOf(feature), handles);
290
291
  }
291
292
  else if (feature.type === 'MultiLineString') {
292
- const parts = feature.coordinates;
293
+ const parts = coordinatesOf(feature);
293
294
  for (let part = 0; part < parts.length; part++) {
294
295
  collectLineMidpointHandles(parts[part], handles, part);
295
296
  }
296
297
  }
297
298
  else if (feature.type === 'MultiPolygon') {
298
- const parts = feature.coordinates;
299
+ const parts = coordinatesOf(feature);
299
300
  for (let part = 0; part < parts.length; part++) {
300
301
  collectPolygonMidpointHandles(parts[part], handles, part);
301
302
  }
@@ -528,6 +529,13 @@ export class SelectionHandlesRenderer {
528
529
  const handles = computeVertexHandles(feature).filter((h) => hasVertexRef(followedVertices, h.vertexRef));
529
530
  this.drawHandlesWithStyle(handles, this.config.vertexHandle.followed, zoom);
530
531
  }
532
+ /**
533
+ * Draws the auxiliary handles of the extensions with the look of the vertex handles, the
534
+ * size their hit test uses
535
+ */
536
+ drawAuxiliaryHandles(positions, zoom) {
537
+ this.drawHandlesWithStyle(positions.map((position) => ({ position })), this.config.vertexHandle.point, zoom);
538
+ }
531
539
  /**
532
540
  * Draws a group of handles with a single style
533
541
  *
@@ -16,4 +16,4 @@ import type { Store } from '../../store/store.js';
16
16
  * @param store The Store to read the selection from
17
17
  * @returns The feature ids. An empty array when nothing is selected
18
18
  */
19
- export declare function getSelectedFeatureIds(store: Store): string[];
19
+ export declare function getSelectedFeatureIds(store: Store): readonly string[];
@@ -32,7 +32,7 @@ function featureIdsInLayer(store, layerId) {
32
32
  if (!layer)
33
33
  return [];
34
34
  const ids = [];
35
- for (const itemId of layer.order) {
35
+ for (const itemId of layer.items) {
36
36
  if (store.getFeature(itemId)) {
37
37
  ids.push(itemId);
38
38
  }
@@ -9,7 +9,7 @@ export { getCursorForHandle, hitTestGlobalAuxiliaryHandles, hitTestHandles, } fr
9
9
  export type { HandleInfo } from './handles.js';
10
10
  export { computeMidpointHandles, computeResizeHandles, computeRotateHandle, computeVertexHandles, SelectionHandlesRenderer, } from './handles.js';
11
11
  export { computeSelectionBoundingBox, getSelectedFeatureIds, getSelectedFeatures, } from './helper.js';
12
- export type { AdditionalHandleInfo, AdditionalResizeHandlesCalculator, BoundingBoxCoords, CustomBoundingBoxCalculator, CustomResizeCalculator, PointFrameExtent, PointFrameExtentProvider, ResizeStrategy, SelectionExtensionRegistry, } from './selection-ui/index.js';
12
+ export type { AdditionalHandleInfo, AdditionalResizeHandlesCalculator, BoundingBoxCoords, CustomBoundingBoxCalculator, PointFrameExtent, PointFrameExtentProvider, ResizeStrategy, SelectionExtensionRegistry, TypeResizeCalculator, } from './selection-ui/index.js';
13
13
  export { computeBoundingBox, computeCombinedBoundingBox, createSelectionExtensionRegistry, DEFAULT_POINT_FRAME_SIZE, rotateBoundingBox, SelectionUIRenderer, } from './selection-ui/index.js';
14
14
  export type { TentativeRendererDeps } from './tentative.js';
15
15
  export { TentativeRenderer } from './tentative.js';
@@ -15,10 +15,12 @@ import { createSelectionExtensionRegistry, } from './selection-ui/extension-regi
15
15
  /**
16
16
  * Creates the selection scope of one draw instance
17
17
  *
18
+ * @param options.defaultPointFrameExtent - The extent of the frame of a point whose type
19
+ * registers none (see createSelectionExtensionRegistry)
18
20
  * @internal
19
21
  */
20
- export function createSelectionScope() {
21
- const extensions = createSelectionExtensionRegistry();
22
+ export function createSelectionScope(options = {}) {
23
+ const extensions = createSelectionExtensionRegistry(options.defaultPointFrameExtent);
22
24
  const auxiliaryHandles = createAuxiliaryHandleRegistry();
23
25
  const thinning = new HandleThinningCache();
24
26
  return {
@@ -13,6 +13,7 @@
13
13
  import { circleBoundingBox } from '../../../geometry/circle.js';
14
14
  import { pixelsToDegreesLat, pixelsToDegreesLng } from '../../../shared/math/index.js';
15
15
  import { fromPlane, toPlane } from '../../../shared/math/mercator-plane.js';
16
+ import { coordinatesOf } from '../../../shared/utils/coordinates.js';
16
17
  import { getCircleRadius, getCreatedZoom, getImageProperties, } from '../../../shared/utils/property.js';
17
18
  import { getBoundingBox } from '../../../store/spatial/index.js';
18
19
  /**
@@ -45,7 +46,7 @@ export function computeBoundingBox(feature, extensions) {
45
46
  return customCalculator(feature, extensions.getTileSize());
46
47
  }
47
48
  if (feature.type === 'Point') {
48
- const coord = feature.coordinates;
49
+ const coord = coordinatesOf(feature);
49
50
  return {
50
51
  topLeft: coord,
51
52
  topRight: coord,
@@ -80,7 +81,7 @@ export function computeBoundingBox(feature, extensions) {
80
81
  * The frame of a Circle: the extent of the geodesic circle as it is drawn, around its center
81
82
  */
82
83
  function computeCircleBoundingBox(feature) {
83
- const center = feature.coordinates;
84
+ const center = coordinatesOf(feature);
84
85
  const radiusMeters = getCircleRadius(feature);
85
86
  const extent = radiusMeters && radiusMeters > 0 ? circleBoundingBox(center, radiusMeters) : null;
86
87
  if (!extent) {
@@ -108,13 +109,12 @@ function computeCircleBoundingBox(feature) {
108
109
  * (the same method as computeQuadVertices in quad-shader.ts).
109
110
  */
110
111
  function computeOrientedBoundingBox(feature) {
111
- const coord = feature.coordinates;
112
+ const coord = coordinatesOf(feature);
112
113
  const [lng, lat] = coord;
113
114
  const tileSize = 512;
114
115
  const props = getImageProperties(feature);
115
- const style = feature.style;
116
- const imageWidth = style?.width || props.imageWidth || 100;
117
- const imageHeight = style?.height || props.imageHeight || 100;
116
+ const imageWidth = props.imageWidth || 100;
117
+ const imageHeight = props.imageHeight || 100;
118
118
  const scale = props.scale ?? 1;
119
119
  // getImageProperties().createdZoom returns 0 when it is missing, so ?? does not work.
120
120
  // getCreatedZoom(number|undefined) is used so that 14 is the default when it is missing.