@sakuzu/maplibre-gl-draw 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/CHANGELOG.md +1016 -2
  2. package/README.ja.md +39 -19
  3. package/README.md +41 -21
  4. package/dist/api/datasets.d.ts +258 -0
  5. package/dist/api/document.d.ts +66 -0
  6. package/dist/api/draw.d.ts +135 -0
  7. package/dist/api/draw.js +18 -0
  8. package/dist/api/drawing.d.ts +87 -0
  9. package/dist/api/errors.d.ts +35 -0
  10. package/dist/api/errors.js +35 -0
  11. package/dist/api/events.d.ts +306 -0
  12. package/dist/api/extension/context.d.ts +247 -0
  13. package/dist/api/extension/feature-type.d.ts +129 -0
  14. package/dist/api/extension/mode.d.ts +123 -0
  15. package/dist/api/extension/plugin.d.ts +51 -0
  16. package/dist/api/extension/plugin.js +3 -0
  17. package/dist/api/extension/provider.d.ts +119 -0
  18. package/dist/api/extension/provider.js +3 -0
  19. package/dist/api/extension/render.d.ts +176 -0
  20. package/dist/api/extension/render.js +3 -0
  21. package/dist/api/extension/store.d.ts +190 -0
  22. package/dist/api/extension/store.js +3 -0
  23. package/dist/api/extensions.d.ts +306 -0
  24. package/dist/api/extensions.js +3 -0
  25. package/dist/api/features.d.ts +188 -0
  26. package/dist/api/features.js +3 -0
  27. package/dist/api/groups.d.ts +111 -0
  28. package/dist/api/groups.js +3 -0
  29. package/dist/api/hidden.d.ts +45 -0
  30. package/dist/api/hidden.js +3 -0
  31. package/dist/api/impl/adapters.js +463 -0
  32. package/dist/api/impl/contexts.js +466 -0
  33. package/dist/api/impl/create-draw.js +124 -0
  34. package/dist/api/impl/datasets.js +404 -0
  35. package/dist/api/impl/destroy-guard.js +74 -0
  36. package/dist/api/impl/document.js +280 -0
  37. package/dist/api/impl/drawing.js +180 -0
  38. package/dist/api/impl/engine-context.d.ts +7 -0
  39. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  40. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  41. package/dist/api/impl/events.js +422 -0
  42. package/dist/api/impl/extension-host.js +361 -0
  43. package/dist/api/impl/extensions.js +229 -0
  44. package/dist/api/impl/features.js +445 -0
  45. package/dist/api/impl/geometry/apply.d.ts +32 -0
  46. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  47. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  48. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  49. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  50. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  51. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  52. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  53. package/dist/api/impl/geometry/types.js +3 -0
  54. package/dist/api/impl/groups.d.ts +3 -0
  55. package/dist/api/impl/groups.js +268 -0
  56. package/dist/api/impl/hidden.js +60 -0
  57. package/dist/api/impl/import-export/constants.d.ts +22 -0
  58. package/dist/api/impl/import-export/constants.js +24 -0
  59. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  60. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  61. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  62. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  63. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  64. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  66. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  68. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  69. package/dist/api/impl/import-export/image-import.js +73 -0
  70. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  71. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  72. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  73. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  74. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  75. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  76. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  77. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  78. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  79. package/dist/api/impl/import-export/style-validation.js +86 -0
  80. package/dist/api/impl/import-export/types.d.ts +52 -0
  81. package/dist/api/impl/import-export/types.js +3 -0
  82. package/dist/api/impl/input.js +180 -0
  83. package/dist/api/impl/layers.js +307 -0
  84. package/dist/api/impl/metadata.d.ts +1 -0
  85. package/dist/api/impl/metadata.js +22 -0
  86. package/dist/api/impl/options.d.ts +1 -0
  87. package/dist/api/impl/options.js +822 -0
  88. package/dist/api/impl/placement.d.ts +1 -0
  89. package/dist/api/impl/placement.js +138 -0
  90. package/dist/api/impl/render-context.d.ts +13 -0
  91. package/dist/api/impl/render-context.js +272 -0
  92. package/dist/api/impl/rows.d.ts +1 -0
  93. package/dist/api/impl/rows.js +46 -0
  94. package/dist/api/impl/selection.d.ts +1 -0
  95. package/dist/api/impl/selection.js +186 -0
  96. package/dist/api/impl/shared.d.ts +64 -0
  97. package/dist/api/impl/shared.js +178 -0
  98. package/dist/api/impl/validate-extension.d.ts +1 -0
  99. package/dist/api/impl/validate-extension.js +159 -0
  100. package/dist/api/layers.d.ts +130 -0
  101. package/dist/api/layers.js +3 -0
  102. package/dist/api/metadata.d.ts +18 -0
  103. package/dist/api/metadata.js +3 -0
  104. package/dist/api/model.d.ts +487 -0
  105. package/dist/api/model.js +47 -0
  106. package/dist/api/options.d.ts +466 -0
  107. package/dist/api/options.js +3 -0
  108. package/dist/api/selection.d.ts +94 -0
  109. package/dist/api/selection.js +3 -0
  110. package/dist/api/state.d.ts +155 -0
  111. package/dist/api/state.js +12 -0
  112. package/dist/{display → dataset}/chunk.d.ts +1 -1
  113. package/dist/{display → dataset}/chunk.js +4 -3
  114. package/dist/{display → dataset}/dataset.js +18 -21
  115. package/dist/dataset/interaction.d.ts +1 -0
  116. package/dist/{display → dataset}/interaction.js +18 -6
  117. package/dist/dataset/manager.d.ts +1 -0
  118. package/dist/dataset/provider.d.ts +1 -0
  119. package/dist/{display → dataset}/retained.d.ts +1 -1
  120. package/dist/{display → dataset}/retained.js +8 -7
  121. package/dist/dataset/source.d.ts +1 -0
  122. package/dist/{display → dataset}/source.js +17 -4
  123. package/dist/dataset/spatial.d.ts +1 -0
  124. package/dist/{display → dataset}/spatial.js +1 -1
  125. package/dist/dataset/style.d.ts +1 -0
  126. package/dist/{display → dataset}/style.js +1 -1
  127. package/dist/dataset/table-source.d.ts +1 -0
  128. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  129. package/dist/{display → dataset}/thinning.d.ts +0 -10
  130. package/dist/{display → dataset}/thinning.js +3 -2
  131. package/dist/dataset/triangulation.d.ts +1 -0
  132. package/dist/{display → dataset}/triangulation.js +0 -0
  133. package/dist/{display → dataset}/types.d.ts +82 -121
  134. package/dist/dataset/types.js +61 -0
  135. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  136. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  137. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  138. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  139. package/dist/dispatcher/hit-test/service.js +80 -16
  140. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  141. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  142. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  143. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  144. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  145. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  146. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  147. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  148. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  149. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  150. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  151. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  152. package/dist/dispatcher/input-router.js +152 -69
  153. package/dist/dispatcher/normalizer.js +6 -2
  154. package/dist/dispatcher/types.d.ts +6 -1
  155. package/dist/extension/feature-handler.d.ts +1 -182
  156. package/dist/extension/index.d.ts +4 -7
  157. package/dist/extension/renderers.d.ts +1 -208
  158. package/dist/geometry/angle.d.ts +0 -8
  159. package/dist/geometry/angle.js +0 -8
  160. package/dist/geometry/bbox.d.ts +4 -12
  161. package/dist/geometry/bbox.js +4 -12
  162. package/dist/geometry/boolean.d.ts +0 -51
  163. package/dist/geometry/boolean.js +0 -51
  164. package/dist/geometry/buffer.d.ts +0 -26
  165. package/dist/geometry/buffer.js +0 -26
  166. package/dist/geometry/circle.d.ts +0 -9
  167. package/dist/geometry/circle.js +0 -9
  168. package/dist/geometry/coords.d.ts +0 -16
  169. package/dist/geometry/coords.js +0 -16
  170. package/dist/geometry/distance.d.ts +0 -24
  171. package/dist/geometry/distance.js +0 -24
  172. package/dist/geometry/errors.d.ts +21 -36
  173. package/dist/geometry/errors.js +49 -29
  174. package/dist/geometry/geojson.d.ts +81 -0
  175. package/dist/geometry/geojson.js +164 -0
  176. package/dist/geometry/index.d.ts +38 -23
  177. package/dist/geometry/index.js +43 -31
  178. package/dist/geometry/measure.d.ts +0 -27
  179. package/dist/geometry/measure.js +0 -27
  180. package/dist/geometry/predicates.d.ts +0 -9
  181. package/dist/geometry/predicates.js +0 -9
  182. package/dist/geometry/public-bounds.d.ts +26 -0
  183. package/dist/geometry/public-bounds.js +30 -0
  184. package/dist/geometry/public-combine.d.ts +78 -0
  185. package/dist/geometry/public-combine.js +82 -0
  186. package/dist/geometry/public-create.d.ts +54 -0
  187. package/dist/geometry/public-create.js +70 -0
  188. package/dist/geometry/public-measure.d.ts +170 -0
  189. package/dist/geometry/public-measure.js +283 -0
  190. package/dist/geometry/public-predicates.d.ts +54 -0
  191. package/dist/geometry/public-predicates.js +144 -0
  192. package/dist/geometry/public-repair.d.ts +75 -0
  193. package/dist/geometry/public-repair.js +77 -0
  194. package/dist/geometry/simplify.d.ts +0 -7
  195. package/dist/geometry/simplify.js +0 -7
  196. package/dist/geometry/split.d.ts +0 -20
  197. package/dist/geometry/split.js +0 -20
  198. package/dist/geometry/units.d.ts +20 -12
  199. package/dist/geometry/units.js +20 -12
  200. package/dist/index.d.ts +52 -66
  201. package/dist/index.js +6 -18
  202. package/dist/messages.d.ts +7 -7
  203. package/dist/modes/draw/circle.js +83 -207
  204. package/dist/modes/draw/commit-layer.d.ts +5 -16
  205. package/dist/modes/draw/commit-layer.js +2 -13
  206. package/dist/modes/draw/freehand.js +108 -246
  207. package/dist/modes/draw/image.js +4 -2
  208. package/dist/modes/draw/index.d.ts +5 -5
  209. package/dist/modes/draw/index.js +5 -5
  210. package/dist/modes/draw/line.js +18 -354
  211. package/dist/modes/draw/point.js +29 -78
  212. package/dist/modes/draw/polygon.js +23 -368
  213. package/dist/modes/draw/trace-support.d.ts +43 -36
  214. package/dist/modes/draw/trace-support.js +95 -98
  215. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  216. package/dist/modes/draw/vertex-drawing.js +176 -0
  217. package/dist/modes/handler.d.ts +1 -285
  218. package/dist/modes/manager.d.ts +2 -2
  219. package/dist/modes/manager.js +3 -0
  220. package/dist/modes/select/box-selection.d.ts +3 -3
  221. package/dist/modes/select/box-selection.js +2 -1
  222. package/dist/modes/select/click-handler.d.ts +5 -5
  223. package/dist/modes/select/click-handler.js +22 -20
  224. package/dist/modes/select/cursor-handler.d.ts +2 -2
  225. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  226. package/dist/modes/select/drag/move.js +3 -3
  227. package/dist/modes/select/drag/operation.d.ts +3 -3
  228. package/dist/modes/select/drag/radius.js +5 -4
  229. package/dist/modes/select/drag/transform.d.ts +2 -2
  230. package/dist/modes/select/drag/transform.js +11 -5
  231. package/dist/modes/select/drag/vertex.d.ts +2 -2
  232. package/dist/modes/select/drag/vertex.js +13 -8
  233. package/dist/modes/select/drag-handler.js +44 -25
  234. package/dist/modes/select/mode.js +17 -17
  235. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  236. package/dist/modes/select/shortcut-handler.js +9 -7
  237. package/dist/operations/layer-operations.js +29 -168
  238. package/dist/operations/resize.d.ts +2 -2
  239. package/dist/operations/resize.js +5 -5
  240. package/dist/operations/rotate.js +5 -5
  241. package/dist/operations/selection-operations.d.ts +16 -1
  242. package/dist/operations/selection-operations.js +28 -13
  243. package/dist/operations/shared-vertex.js +4 -2
  244. package/dist/operations/trace-graph.d.ts +0 -18
  245. package/dist/operations/trace-graph.js +0 -18
  246. package/dist/operations/vertex.js +36 -35
  247. package/dist/shared/color.d.ts +1 -0
  248. package/dist/shared/color.js +245 -0
  249. package/dist/shared/config/constants.d.ts +1 -54
  250. package/dist/shared/config/constants.js +1 -58
  251. package/dist/shared/config/feature-style.d.ts +16 -13
  252. package/dist/shared/config/feature-style.js +9 -0
  253. package/dist/shared/config/rendering.d.ts +3 -3
  254. package/dist/shared/config/selection-highlight.d.ts +0 -15
  255. package/dist/shared/config/selection-highlight.js +4 -7
  256. package/dist/shared/config/selection.d.ts +2 -32
  257. package/dist/shared/config/selection.js +0 -18
  258. package/dist/shared/config/topology.d.ts +2 -2
  259. package/dist/shared/config/trace.d.ts +4 -4
  260. package/dist/shared/math/angle.d.ts +1 -1
  261. package/dist/shared/math/angle.js +1 -1
  262. package/dist/shared/math/circle.d.ts +1 -1
  263. package/dist/shared/math/circle.js +1 -1
  264. package/dist/shared/math/distance.d.ts +2 -1
  265. package/dist/shared/math/distance.js +3 -2
  266. package/dist/shared/math/index.d.ts +1 -1
  267. package/dist/shared/math/index.js +1 -1
  268. package/dist/shared/math/transform.d.ts +23 -0
  269. package/dist/shared/math/transform.js +47 -28
  270. package/dist/shared/properties.d.ts +18 -0
  271. package/dist/shared/properties.js +129 -0
  272. package/dist/shared/types/events.d.ts +15 -7
  273. package/dist/shared/types/model.d.ts +109 -159
  274. package/dist/shared/types/style.d.ts +1 -1
  275. package/dist/shared/utils/color.d.ts +2 -36
  276. package/dist/shared/utils/color.js +13 -70
  277. package/dist/shared/utils/coordinates.d.ts +30 -4
  278. package/dist/shared/utils/coordinates.js +56 -10
  279. package/dist/shared/utils/event-emitter.d.ts +1 -262
  280. package/dist/shared/utils/event-emitter.js +4 -3
  281. package/dist/shared/utils/feature-bbox.js +8 -7
  282. package/dist/shared/utils/feature-segments.js +5 -4
  283. package/dist/shared/utils/image.d.ts +0 -4
  284. package/dist/shared/utils/image.js +0 -6
  285. package/dist/shared/utils/name-generator.d.ts +14 -20
  286. package/dist/shared/utils/name-generator.js +20 -3
  287. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  288. package/dist/shared/utils/pixel-ratio.js +13 -4
  289. package/dist/shared/utils/property.d.ts +7 -50
  290. package/dist/shared/utils/property.js +22 -87
  291. package/dist/snapping/custom-targets.js +21 -4
  292. package/dist/snapping/indicator.js +20 -11
  293. package/dist/snapping/providers/display.d.ts +6 -1
  294. package/dist/snapping/providers/display.js +2 -1
  295. package/dist/snapping/providers/guide.d.ts +3 -43
  296. package/dist/snapping/providers/guide.js +1 -44
  297. package/dist/snapping/providers/intersection.js +1 -1
  298. package/dist/snapping/providers/store.js +3 -3
  299. package/dist/snapping/service.js +18 -7
  300. package/dist/snapping/types.d.ts +9 -35
  301. package/dist/store/draw-store.js +233 -142
  302. package/dist/store/local-visibility.d.ts +11 -6
  303. package/dist/store/local-visibility.js +38 -7
  304. package/dist/store/lock.d.ts +0 -6
  305. package/dist/store/lock.js +0 -6
  306. package/dist/store/memory/change-bus.d.ts +3 -3
  307. package/dist/store/memory/change-bus.js +12 -0
  308. package/dist/store/memory/file-store.d.ts +2 -2
  309. package/dist/store/memory/ui-state.d.ts +1 -51
  310. package/dist/store/memory/ui-state.js +122 -134
  311. package/dist/store/memory.d.ts +1 -8
  312. package/dist/store/memory.js +249 -45
  313. package/dist/store/ordering.d.ts +9 -0
  314. package/dist/store/ordering.js +17 -0
  315. package/dist/store/spatial/spatial-index.d.ts +1 -1
  316. package/dist/store/spatial/spatial-index.js +1 -1
  317. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  318. package/dist/store/spatial/store-spatial-index.js +9 -3
  319. package/dist/store/store.d.ts +66 -107
  320. package/dist/store/types.d.ts +1 -1
  321. package/dist/store/writable-layer.d.ts +1 -1
  322. package/dist/store/writable-layer.js +2 -2
  323. package/dist/table/builder.d.ts +83 -0
  324. package/dist/table/builder.js +381 -0
  325. package/dist/table/index.d.ts +37 -0
  326. package/dist/table/index.js +5 -0
  327. package/dist/table/packed-rtree.d.ts +1 -0
  328. package/dist/{display → table}/packed-rtree.js +1 -1
  329. package/dist/table/partition.d.ts +1 -0
  330. package/dist/{display → table}/partition.js +3 -3
  331. package/dist/table/prepare.d.ts +44 -0
  332. package/dist/table/prepare.js +136 -0
  333. package/dist/table/table.d.ts +1 -0
  334. package/dist/{display/columnar → table}/table.js +29 -25
  335. package/dist/{display/columnar → table}/types.d.ts +68 -72
  336. package/dist/table/types.js +3 -0
  337. package/dist/view/coordinator.js +4 -3
  338. package/dist/view/feature-companion.d.ts +13 -7
  339. package/dist/view/feature-companion.js +11 -3
  340. package/dist/view/globe-subdivision.js +3 -3
  341. package/dist/view/layer/attach.d.ts +1 -1
  342. package/dist/view/layer/attach.js +1 -1
  343. package/dist/view/layer/custom-layer.js +40 -11
  344. package/dist/view/layer/display-list.js +2 -1
  345. package/dist/view/layer/drape-planner.d.ts +2 -2
  346. package/dist/view/layer/frame-render.d.ts +3 -3
  347. package/dist/view/layer/frame-render.js +7 -2
  348. package/dist/view/layer/frame-state.d.ts +6 -6
  349. package/dist/view/layer/index.d.ts +2 -2
  350. package/dist/view/layer/index.js +1 -1
  351. package/dist/view/layer/render.d.ts +4 -4
  352. package/dist/view/layer/render.js +3 -8
  353. package/dist/view/layer/renderers.d.ts +2 -2
  354. package/dist/view/layer/renderers.js +1 -1
  355. package/dist/view/layer/slot-manager.d.ts +2 -2
  356. package/dist/view/layer/slot-manager.js +4 -4
  357. package/dist/view/layer/slots.d.ts +2 -2
  358. package/dist/view/layer/slots.js +1 -1
  359. package/dist/view/layer/store-retained-bbox.js +3 -2
  360. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  361. package/dist/view/layer/store-retained-classify.js +19 -7
  362. package/dist/view/layer/store-retained-collect.js +8 -7
  363. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  364. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  365. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  366. package/dist/view/layer/store-retained-immediate.js +3 -8
  367. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  368. package/dist/view/layer/store-retained.d.ts +2 -2
  369. package/dist/view/layer/store-retained.js +1 -1
  370. package/dist/view/renderers/batch-manager.js +8 -7
  371. package/dist/view/renderers/drawer.js +21 -15
  372. package/dist/view/renderers/image.js +13 -39
  373. package/dist/view/renderers/line/line-types.d.ts +3 -3
  374. package/dist/view/renderers/line/sdf-line.js +3 -1
  375. package/dist/view/renderers/point/billboard-depth.js +1 -1
  376. package/dist/view/renderers/point/point-instance.js +1 -1
  377. package/dist/view/renderers/point/point-shape.js +2 -2
  378. package/dist/view/renderers/point/point-style.js +48 -4
  379. package/dist/view/renderers/polygon/batch.js +1 -2
  380. package/dist/view/renderers/polygon/fill.js +3 -1
  381. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  382. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  383. package/dist/view/renderers/stroke.js +3 -1
  384. package/dist/view/shaders/helpers.d.ts +2 -42
  385. package/dist/view/shaders/helpers.js +0 -6
  386. package/dist/view/shaders/projection.d.ts +15 -7
  387. package/dist/view/shaders/projection.js +23 -6
  388. package/dist/view/shaders/quad.d.ts +16 -12
  389. package/dist/view/shaders/quad.js +34 -13
  390. package/dist/view/style-rule.d.ts +5 -42
  391. package/dist/view/style-rule.js +20 -44
  392. package/dist/view/terrain/binding.d.ts +1 -0
  393. package/dist/view/terrain/binding.js +29 -0
  394. package/dist/view/terrain/context.d.ts +3 -4
  395. package/dist/view/terrain/context.js +4 -5
  396. package/dist/view/terrain/drape/geometry.js +1 -1
  397. package/dist/view/terrain/drape/pass.d.ts +1 -1
  398. package/dist/view/terrain/drape/pass.js +8 -7
  399. package/dist/view/terrain/polygon.d.ts +9 -5
  400. package/dist/view/terrain/polygon.js +16 -2
  401. package/dist/view/terrain/state.d.ts +1 -1
  402. package/dist/view/terrain/state.js +1 -1
  403. package/dist/view/terrain/tessellation.d.ts +2 -2
  404. package/dist/view/terrain/tessellation.js +1 -1
  405. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  406. package/dist/view/ui/bounds.js +8 -12
  407. package/dist/view/ui/handle-test.js +2 -2
  408. package/dist/view/ui/handle-thinning.js +17 -17
  409. package/dist/view/ui/handles.js +21 -13
  410. package/dist/view/ui/helper.d.ts +1 -1
  411. package/dist/view/ui/helper.js +1 -1
  412. package/dist/view/ui/index.d.ts +1 -1
  413. package/dist/view/ui/selection-scope.js +4 -2
  414. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  415. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  416. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  417. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  418. package/dist/view/ui/selection-ui/index.js +1 -1
  419. package/dist/view/ui/selection-ui/renderer.js +15 -38
  420. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  421. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  422. package/dist/view/ui/selection-ui-drawer.js +63 -2
  423. package/dist/view/ui/tentative.js +1 -1
  424. package/dist/webgl/index.d.ts +65 -0
  425. package/dist/webgl/index.js +62 -0
  426. package/package.json +20 -9
  427. package/dist/api/api.d.ts +0 -1259
  428. package/dist/api/api.js +0 -86
  429. package/dist/api/context.d.ts +0 -173
  430. package/dist/api/display-api.js +0 -23
  431. package/dist/api/event-api.d.ts +0 -13
  432. package/dist/api/event-api.js +0 -17
  433. package/dist/api/extension-api.d.ts +0 -46
  434. package/dist/api/extension-api.js +0 -85
  435. package/dist/api/feature-api.d.ts +0 -11
  436. package/dist/api/feature-api.js +0 -101
  437. package/dist/api/geometry/apply.d.ts +0 -51
  438. package/dist/api/geometry/boolean.d.ts +0 -28
  439. package/dist/api/geometry/boolean.js +0 -65
  440. package/dist/api/geometry/types.d.ts +0 -31
  441. package/dist/api/geometry-operations.d.ts +0 -162
  442. package/dist/api/geometry-operations.js +0 -94
  443. package/dist/api/group-api.d.ts +0 -10
  444. package/dist/api/group-api.js +0 -78
  445. package/dist/api/import-export/constants.d.ts +0 -29
  446. package/dist/api/import-export/constants.js +0 -40
  447. package/dist/api/import-export/file-name.d.ts +0 -10
  448. package/dist/api/import-export/file-name.js +0 -20
  449. package/dist/api/import-export/geojson-export.d.ts +0 -19
  450. package/dist/api/import-export/image-import.d.ts +0 -12
  451. package/dist/api/import-export/image-import.js +0 -53
  452. package/dist/api/import-export/index.d.ts +0 -9
  453. package/dist/api/import-export/index.js +0 -107
  454. package/dist/api/import-export/native-format.d.ts +0 -15
  455. package/dist/api/import-export/style-validation.d.ts +0 -27
  456. package/dist/api/import-export/style-validation.js +0 -49
  457. package/dist/api/import-export/types.d.ts +0 -26
  458. package/dist/api/index.d.ts +0 -15
  459. package/dist/api/index.js +0 -3
  460. package/dist/api/input-api.d.ts +0 -158
  461. package/dist/api/input-api.js +0 -144
  462. package/dist/api/instance-api.d.ts +0 -38
  463. package/dist/api/instance-api.js +0 -136
  464. package/dist/api/layer-api.d.ts +0 -12
  465. package/dist/api/layer-api.js +0 -62
  466. package/dist/api/selection-api.d.ts +0 -7
  467. package/dist/api/selection-api.js +0 -78
  468. package/dist/api/snapping-api.d.ts +0 -125
  469. package/dist/api/snapping-api.js +0 -50
  470. package/dist/api/topology-api.d.ts +0 -30
  471. package/dist/api/topology-api.js +0 -16
  472. package/dist/api/tracing-api.d.ts +0 -31
  473. package/dist/api/tracing-api.js +0 -16
  474. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  475. package/dist/dispatcher/hit-test/index.js +0 -9
  476. package/dist/dispatcher/index.d.ts +0 -15
  477. package/dist/dispatcher/index.js +0 -3
  478. package/dist/display/columnar/index.d.ts +0 -12
  479. package/dist/display/columnar/index.js +0 -13
  480. package/dist/display/columnar/prepare.d.ts +0 -42
  481. package/dist/display/columnar/prepare.js +0 -116
  482. package/dist/display/index.d.ts +0 -13
  483. package/dist/display/types.js +0 -43
  484. package/dist/maplibre-gl-draw.d.ts +0 -47
  485. package/dist/modes/cursor.js +0 -72
  486. package/dist/modes/index.d.ts +0 -7
  487. package/dist/operations/index.d.ts +0 -9
  488. package/dist/operations/index.js +0 -3
  489. package/dist/plugins/index.d.ts +0 -10
  490. package/dist/plugins/mutation-hooks.d.ts +0 -28
  491. package/dist/plugins/mutation-hooks.js +0 -84
  492. package/dist/plugins/plugin-context.js +0 -367
  493. package/dist/plugins/plugin-manager.d.ts +0 -103
  494. package/dist/plugins/plugin-manager.js +0 -316
  495. package/dist/plugins/plugin.d.ts +0 -529
  496. package/dist/shared/config/index.d.ts +0 -17
  497. package/dist/shared/config/index.js +0 -8
  498. package/dist/shared/utils/index.d.ts +0 -15
  499. package/dist/shared/utils/index.js +0 -24
  500. package/dist/snapping/index.d.ts +0 -14
  501. package/dist/snapping/index.js +0 -4
  502. package/dist/store/change-merger.js +0 -102
  503. package/dist/store/event-bridge.js +0 -161
  504. package/dist/store/index.d.ts +0 -12
  505. package/dist/store/index.js +0 -4
  506. package/dist/view/index.d.ts +0 -47
  507. package/dist/view/index.js +0 -20
  508. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  509. /package/dist/api/{import-export/types.js → document.js} +0 -0
  510. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  511. /package/dist/{display/index.js → api/events.js} +0 -0
  512. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  513. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  514. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  515. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  516. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  517. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  518. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  519. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  520. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  521. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  522. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  523. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  524. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  525. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  526. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  527. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  528. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  529. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  532. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  533. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  534. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  535. /package/dist/{display → dataset}/chunk-set.js +0 -0
  536. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  537. /package/dist/{display → dataset}/manager.js +0 -0
  538. /package/dist/{display → dataset}/provider.js +0 -0
  539. /package/dist/{display → dataset}/selection.d.ts +0 -0
  540. /package/dist/{display → dataset}/selection.js +0 -0
@@ -0,0 +1,463 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { toleranceDegrees } from '../../dispatcher/hit-test/local-frame.js';
4
+ import { LineHitTestStrategy, MultiLineStringHitTestStrategy, MultiPointHitTestStrategy, MultiPolygonHitTestStrategy, PointHitTestStrategy, PolygonHitTestStrategy, } from '../../dispatcher/hit-test/strategies/index.js';
5
+ import { getBoundingBox } from '../../store/spatial/index.js';
6
+ import { computeBoundingBox } from '../../view/ui/selection-ui/index.js';
7
+ import { toPosition, toScreenPoint } from './contexts.js';
8
+ import { toPointerEvent } from './input.js';
9
+ import { adaptFeatureRenderer, createCompanionDrawer } from './render-context.js';
10
+ // ============================================================================
11
+ // Screen and map
12
+ // ============================================================================
13
+ /** The pixels per degree of longitude around a point, measured on the screen */
14
+ function degreesPerPixel(map, point) {
15
+ return toleranceDegrees((p) => map.unproject([p.x, p.y]), point, 1) || 1;
16
+ }
17
+ /** What a hit test of the contract receives, for a position and a tolerance in degrees */
18
+ function hitContextAt(deps, coordinate, toleranceLngLat) {
19
+ const at = deps.map.project([coordinate[0], coordinate[1]]);
20
+ const degPerPx = degreesPerPixel(deps.map, at);
21
+ return {
22
+ ctx: {
23
+ point: toScreenPoint(at),
24
+ lngLat: [coordinate[0], coordinate[1]],
25
+ tolerancePx: toleranceLngLat / degPerPx,
26
+ screen: deps.screen,
27
+ },
28
+ degPerPx,
29
+ };
30
+ }
31
+ // ============================================================================
32
+ // Custom feature types
33
+ // ============================================================================
34
+ /** The hit testing of the engine for each kind of GeoJSON geometry */
35
+ function geometryStrategy(kind) {
36
+ switch (kind) {
37
+ case 'Point':
38
+ return new PointHitTestStrategy();
39
+ case 'LineString':
40
+ return new LineHitTestStrategy();
41
+ case 'Polygon':
42
+ return new PolygonHitTestStrategy();
43
+ case 'MultiPoint':
44
+ return new MultiPointHitTestStrategy();
45
+ case 'MultiLineString':
46
+ return new MultiLineStringHitTestStrategy();
47
+ case 'MultiPolygon':
48
+ return new MultiPolygonHitTestStrategy();
49
+ default:
50
+ return null;
51
+ }
52
+ }
53
+ /** The hit testing of a custom type, in the terms of the engine (degrees) */
54
+ function hitTestStrategyOf(definition, deps) {
55
+ const { type } = definition;
56
+ const own = definition.hitTest?.bind(definition);
57
+ if (!own) {
58
+ const byGeometry = geometryStrategy(definition.geometry);
59
+ return {
60
+ geometryType: type,
61
+ test: (feature, coordinate, tolerance) => byGeometry?.test(feature, coordinate, tolerance) ?? false,
62
+ distance: (feature, coordinate) => byGeometry?.distance(feature, coordinate) ?? Number.POSITIVE_INFINITY,
63
+ ...(byGeometry?.testDistance && {
64
+ testDistance: (feature, coordinate, tolerance) => byGeometry.testDistance?.(feature, coordinate, tolerance) ?? null,
65
+ }),
66
+ };
67
+ }
68
+ const testDistance = (feature, coordinate, toleranceLngLat) => {
69
+ const { ctx, degPerPx } = hitContextAt(deps, coordinate, toleranceLngLat);
70
+ const hit = own(feature, ctx);
71
+ return hit ? Math.max(0, hit.distancePx) * degPerPx : null;
72
+ };
73
+ return {
74
+ geometryType: type,
75
+ test: (feature, coordinate, tolerance) => testDistance(feature, coordinate, tolerance) !== null,
76
+ distance: (feature, coordinate) => testDistance(feature, coordinate, Number.MAX_SAFE_INTEGER) ?? Number.POSITIVE_INFINITY,
77
+ testDistance,
78
+ };
79
+ }
80
+ /**
81
+ * A strategy of an override that takes only some features of its type: the others are tested
82
+ * by the built-in strategy of the type
83
+ */
84
+ function narrowStrategy(own, builtIn, applies) {
85
+ /** Tests and measures in one pass with a strategy, as the service does */
86
+ const testDistanceWith = (strategy, feature, coordinate, tolerance) => {
87
+ if (!strategy)
88
+ return null;
89
+ if (strategy.testDistance)
90
+ return strategy.testDistance(feature, coordinate, tolerance);
91
+ return strategy.test(feature, coordinate, tolerance)
92
+ ? strategy.distance(feature, coordinate)
93
+ : null;
94
+ };
95
+ return {
96
+ geometryType: own.geometryType,
97
+ test: (feature, coordinate, tolerance) => applies(feature)
98
+ ? own.test(feature, coordinate, tolerance)
99
+ : (builtIn?.test(feature, coordinate, tolerance) ?? false),
100
+ distance: (feature, coordinate) => applies(feature)
101
+ ? own.distance(feature, coordinate)
102
+ : (builtIn?.distance(feature, coordinate) ?? Number.POSITIVE_INFINITY),
103
+ testDistance: (feature, coordinate, tolerance) => testDistanceWith(applies(feature) ? own : builtIn, feature, coordinate, tolerance),
104
+ // The features the built-in type keeps reach as far as it draws them (a point marker)
105
+ reachPx: (feature) => (applies(feature) ? own.reachPx?.(feature) : builtIn?.reachPx?.(feature)) ?? 0,
106
+ };
107
+ }
108
+ /** The box selection of a custom type, in the terms of the engine */
109
+ function boxSelectionOf(definition, deps) {
110
+ const own = definition.boxSelect?.bind(definition);
111
+ if (!own) {
112
+ const byGeometry = deps.boxSelectionRegistry.get(definition.geometry);
113
+ return byGeometry
114
+ ? {
115
+ featureType: definition.type,
116
+ intersects: (feature, rect) => byGeometry.intersects(feature, rect),
117
+ }
118
+ : null;
119
+ }
120
+ return {
121
+ featureType: definition.type,
122
+ intersects(feature, rect) {
123
+ const corners = [
124
+ deps.map.project([rect.minX, rect.minY]),
125
+ deps.map.project([rect.maxX, rect.maxY]),
126
+ ];
127
+ const min = [
128
+ Math.min(corners[0].x, corners[1].x),
129
+ Math.min(corners[0].y, corners[1].y),
130
+ ];
131
+ const max = [
132
+ Math.max(corners[0].x, corners[1].x),
133
+ Math.max(corners[0].y, corners[1].y),
134
+ ];
135
+ const center = [(rect.minX + rect.maxX) / 2, (rect.minY + rect.maxY) / 2];
136
+ const { ctx } = hitContextAt(deps, center, 0);
137
+ return own(feature, { min, max }, { ...ctx, tolerancePx: 0 });
138
+ },
139
+ };
140
+ }
141
+ /** Whether a value is a point on the screen with finite coordinates */
142
+ function isScreenPoint(value) {
143
+ return (Array.isArray(value) &&
144
+ value.length >= 2 &&
145
+ Number.isFinite(value[0]) &&
146
+ Number.isFinite(value[1]));
147
+ }
148
+ /** A selection box with no area at one coordinate */
149
+ function degenerateBox(c) {
150
+ return { topLeft: c, topRight: c, bottomRight: c, bottomLeft: c, center: c };
151
+ }
152
+ /** A handle of the contract as a handle of the engine */
153
+ function toEngineHandle(handle) {
154
+ return {
155
+ id: handle.id,
156
+ position: [handle.position[0], handle.position[1]],
157
+ ...(handle.cursor !== undefined && { cursor: handle.cursor }),
158
+ };
159
+ }
160
+ /**
161
+ * Installs a custom feature type into the engine
162
+ *
163
+ * @param overriding - The definition overrides the built-in type of its name: the built-in
164
+ * hit test and box selection stay when it has none of its own, and only the built-in
165
+ * `Point` keeps the frame of a point
166
+ * @returns The function that uninstalls it
167
+ * @internal
168
+ */
169
+ export function installFeatureType(definition, deps, overriding = false) {
170
+ const { type } = definition;
171
+ const cancels = [];
172
+ const add = (cancel) => {
173
+ if (cancel)
174
+ cancels.push(cancel);
175
+ };
176
+ const uninstall = () => {
177
+ for (let i = cancels.length - 1; i >= 0; i--)
178
+ cancels[i]();
179
+ };
180
+ // An override can take only some features of the type; the others keep the built-in type
181
+ const appliesTo = overriding ? definition.appliesTo?.bind(definition) : undefined;
182
+ const applies = (feature) => appliesTo?.(feature) !== false;
183
+ try {
184
+ const renderer = adaptFeatureRenderer(type, definition.renderer, deps);
185
+ add(deps.customLayer.registerFeatureRenderer(type, appliesTo ? { ...renderer, appliesTo: applies } : renderer));
186
+ if (!overriding || definition.hitTest) {
187
+ const own = hitTestStrategyOf(definition, deps);
188
+ const builtIn = appliesTo ? deps.hitTestService.getStrategy?.(type) : undefined;
189
+ add(deps.hitTestService.registerStrategy?.(appliesTo ? narrowStrategy(own, builtIn, applies) : own));
190
+ }
191
+ const box = !overriding || definition.boxSelect ? boxSelectionOf(definition, deps) : null;
192
+ if (box) {
193
+ const builtIn = appliesTo ? deps.boxSelectionRegistry.get(type) : undefined;
194
+ add(deps.boxSelectionRegistry.register(appliesTo
195
+ ? {
196
+ featureType: box.featureType,
197
+ intersects: (feature, rect) => applies(feature)
198
+ ? box.intersects(feature, rect)
199
+ : (builtIn?.intersects(feature, rect) ?? false),
200
+ }
201
+ : box));
202
+ }
203
+ const bounds = definition.bounds?.bind(definition);
204
+ const outline = definition.outline?.bind(definition);
205
+ /** The four corners of the outline of a feature, or null when it gives none */
206
+ const cornersOf = (feature) => {
207
+ if (!applies(feature))
208
+ return null;
209
+ const corners = outline?.(feature, deps.screen);
210
+ return Array.isArray(corners) && corners.length === 4 && corners.every(isScreenPoint)
211
+ ? corners
212
+ : null;
213
+ };
214
+ // A circle and an image have a frame with area; a point and a custom point type do not
215
+ const pointFrame = overriding ? type === 'Point' : definition.geometry === 'Point';
216
+ if (pointFrame) {
217
+ if (bounds) {
218
+ // A point keeps its point frame; the extent gives its size
219
+ add(deps.selectionExtensions.registerPointFrameExtent(type, (feature) => {
220
+ if (!applies(feature))
221
+ return null;
222
+ const box = bounds(feature, deps.screen);
223
+ if (!box)
224
+ return null;
225
+ const center = deps.screen.project(feature.geometry.coordinates);
226
+ return {
227
+ halfWidth: Math.max(center[0] - box.min[0], box.max[0] - center[0]),
228
+ halfHeight: Math.max(center[1] - box.min[1], box.max[1] - center[1]),
229
+ };
230
+ }));
231
+ }
232
+ if (outline) {
233
+ // The frame of a point follows the outline, and the point keeps no resize handles
234
+ add(deps.selectionExtensions.registerPointFrameOutline(type, (feature) => cornersOf(feature)?.map(([x, y]) => ({ x, y })) ?? null));
235
+ }
236
+ }
237
+ else if (bounds || outline) {
238
+ const at = (x, y) => {
239
+ const p = deps.screen.unproject([x, y]);
240
+ return [p[0], p[1]];
241
+ };
242
+ add(deps.selectionExtensions.registerBoundingBox(type, (feature) => {
243
+ if (!applies(feature))
244
+ return computeBoundingBox(feature) ?? degenerateBox(at(0, 0));
245
+ const corners = cornersOf(feature);
246
+ if (corners) {
247
+ // The frame and its handles follow the outline, turned as the shape is
248
+ const [topLeft, topRight, bottomRight, bottomLeft] = corners.map(([x, y]) => at(x, y));
249
+ const middle = at(corners.reduce((sum, corner) => sum + corner[0], 0) / 4, corners.reduce((sum, corner) => sum + corner[1], 0) / 4);
250
+ return { topLeft, topRight, bottomRight, bottomLeft, center: middle };
251
+ }
252
+ if (!bounds)
253
+ return computeBoundingBox(feature) ?? degenerateBox(at(0, 0));
254
+ const box = bounds(feature, deps.screen);
255
+ if (!box)
256
+ return degenerateBox(at(0, 0));
257
+ return {
258
+ topLeft: at(box.min[0], box.min[1]),
259
+ topRight: at(box.max[0], box.min[1]),
260
+ bottomRight: at(box.max[0], box.max[1]),
261
+ bottomLeft: at(box.min[0], box.max[1]),
262
+ center: at((box.min[0] + box.max[0]) / 2, (box.min[1] + box.max[1]) / 2),
263
+ };
264
+ }));
265
+ }
266
+ const handles = definition.handles?.bind(definition);
267
+ if (handles) {
268
+ const onHandleDrag = definition.onHandleDrag?.bind(definition);
269
+ const onHandleDragStart = definition.onHandleDragStart?.bind(definition);
270
+ const onHandleDragEnd = definition.onHandleDragEnd?.bind(definition);
271
+ add(deps.auxiliaryHandles.register(adaptHandleProvider({
272
+ name: `\u0000type:${type}`,
273
+ handles: (feature, screen) => feature.type === type && applies(feature)
274
+ ? handles(feature, screen)
275
+ : [],
276
+ onDrag: (feature, handle, event) => feature && onHandleDrag ? onHandleDrag(feature, handle, event) : null,
277
+ ...(onHandleDragStart && {
278
+ onDragStart: (feature, handle, event) => feature !== null && onHandleDragStart(feature, handle, event) !== false,
279
+ }),
280
+ ...(onHandleDragEnd && {
281
+ onDragEnd: (feature, handle, event) => onHandleDragEnd(feature, handle, event),
282
+ }),
283
+ }, deps)));
284
+ }
285
+ const snapCandidates = definition.snapCandidates?.bind(definition);
286
+ if (snapCandidates) {
287
+ add(deps.snapTargets.register(type, (feature, ctx) => snapCandidates(feature, toSnapContext(ctx, deps.screen)).map((candidate) => toEngineCandidate(candidate, feature.id)), appliesTo && applies));
288
+ }
289
+ const bbox = definition.bbox?.bind(definition);
290
+ if (bbox) {
291
+ // The spatial index measures the features of the type by the extent it gives
292
+ add(deps.spatialIndex.setCustomBoundingBoxCalculator(type, (feature, tileSize) => {
293
+ if (!applies(feature))
294
+ return getBoundingBox(feature, tileSize);
295
+ const extent = bbox(feature);
296
+ if (Array.isArray(extent) &&
297
+ extent.length === 4 &&
298
+ extent.every((value) => Number.isFinite(value)) &&
299
+ extent[0] <= extent[2] &&
300
+ extent[1] <= extent[3]) {
301
+ return { minX: extent[0], minY: extent[1], maxX: extent[2], maxY: extent[3] };
302
+ }
303
+ return getBoundingBox(feature, tileSize);
304
+ }));
305
+ }
306
+ if (definition.hitPaddingPx !== undefined) {
307
+ add(deps.hitTestService.registerCandidateReach?.(type, definition.hitPaddingPx));
308
+ }
309
+ }
310
+ catch (error) {
311
+ uninstall();
312
+ throw error;
313
+ }
314
+ // What the Store already holds of the type is measured and drawn again
315
+ deps.map.triggerRepaint();
316
+ return uninstall;
317
+ }
318
+ // ============================================================================
319
+ // Providers
320
+ // ============================================================================
321
+ /** The kinds of snapping target the engine knows */
322
+ const ENGINE_KINDS = new Set([
323
+ 'vertex',
324
+ 'edge',
325
+ 'intersection',
326
+ 'guide',
327
+ ]);
328
+ /** What a provider of snapping candidates of the contract receives */
329
+ function toSnapContext(ctx, screen) {
330
+ const excludeIds = new Set(ctx.excludeFeatureIds ?? []);
331
+ if (ctx.excludeFeatureId !== undefined)
332
+ excludeIds.add(ctx.excludeFeatureId);
333
+ return {
334
+ point: toScreenPoint(ctx.point),
335
+ lngLat: toPosition(ctx.lngLat),
336
+ tolerancePx: ctx.tolerancePx,
337
+ screen,
338
+ excludeIds,
339
+ };
340
+ }
341
+ /** A snapping candidate of the contract as a candidate of the engine (a point) */
342
+ function toEngineCandidate(candidate, featureId) {
343
+ const own = !ENGINE_KINDS.has(candidate.kind);
344
+ return {
345
+ kind: own ? 'vertex' : candidate.kind,
346
+ ...(own && { ownKind: candidate.kind }),
347
+ coordinate: [candidate.position[0], candidate.position[1]],
348
+ ...(featureId !== undefined && { featureId }),
349
+ ...(candidate.source !== undefined && { description: candidate.source }),
350
+ ...(candidate.priority !== undefined && { priority: candidate.priority }),
351
+ };
352
+ }
353
+ /**
354
+ * A provider of snapping candidates of the contract as one of the engine
355
+ *
356
+ * @internal
357
+ */
358
+ export function adaptSnapProvider(provider, screen) {
359
+ return {
360
+ name: provider.name,
361
+ candidates: (_bbox, ctx) => provider
362
+ .candidates(toSnapContext(ctx, screen))
363
+ .map((candidate) => toEngineCandidate(candidate)),
364
+ };
365
+ }
366
+ /**
367
+ * A provider of handles of the contract as a provider of auxiliary handles of the engine
368
+ *
369
+ * The drag of a handle asks `onDragStart` first, which can refuse it, then calls `onDrag` for
370
+ * every move and applies its patch as an intermediate update; the patch of the end of the drag
371
+ * is applied as the final one, and `onDragEnd` follows it.
372
+ *
373
+ * @internal
374
+ */
375
+ export function adaptHandleProvider(provider, deps) {
376
+ let active = null;
377
+ const handlesOf = (featureId, global) => {
378
+ if (global)
379
+ return provider.globalHandles?.(deps.screen) ?? [];
380
+ const feature = deps.store.getFeature(featureId);
381
+ return feature ? provider.handles(feature, deps.screen) : [];
382
+ };
383
+ const drag = (event, final) => {
384
+ if (!active)
385
+ return;
386
+ const feature = active.featureId ? deps.store.getFeature(active.featureId) : undefined;
387
+ const patch = provider.onDrag(feature ?? null, active.handle, toPointerEvent(event));
388
+ if (patch && feature)
389
+ deps.applyPatch(feature.id, patch, final);
390
+ };
391
+ return {
392
+ id: provider.name,
393
+ getHandles: (feature) => provider.handles(feature, deps.screen).map(toEngineHandle),
394
+ ...(provider.globalHandles && {
395
+ getGlobalHandles: () => provider.globalHandles?.(deps.screen).map(toEngineHandle) ?? [],
396
+ }),
397
+ onHandleDragStart(hit, event) {
398
+ const handle = handlesOf(hit.featureId, hit.global).find((h) => h.id === hit.handleId);
399
+ if (!handle)
400
+ return false;
401
+ if (provider.onDragStart) {
402
+ const feature = hit.featureId ? deps.store.getFeature(hit.featureId) : undefined;
403
+ const accepted = provider.onDragStart(feature ?? null, handle, toPointerEvent(event));
404
+ if (accepted === false)
405
+ return false;
406
+ }
407
+ active = { featureId: hit.featureId, handle };
408
+ return true;
409
+ },
410
+ onHandleDragMove(event) {
411
+ drag(event, false);
412
+ },
413
+ onHandleDragEnd(event) {
414
+ const ended = active;
415
+ try {
416
+ drag(event, true);
417
+ }
418
+ finally {
419
+ active = null;
420
+ if (ended && provider.onDragEnd) {
421
+ const feature = ended.featureId ? deps.store.getFeature(ended.featureId) : undefined;
422
+ provider.onDragEnd(feature ?? null, ended.handle, toPointerEvent(event));
423
+ }
424
+ }
425
+ },
426
+ };
427
+ }
428
+ /**
429
+ * A provider of companions of the contract as one of the engine
430
+ *
431
+ * The hit the provider returns is kept with the hit of the engine, so that `onClick` and the
432
+ * hit testing of a mode get it back as it was.
433
+ *
434
+ * @internal
435
+ */
436
+ export function adaptCompanionProvider(provider, deps) {
437
+ const drawCompanion = createCompanionDrawer(deps, () => deps.customLayer.getGL());
438
+ const draw = provider.draw.bind(provider);
439
+ return {
440
+ id: provider.name,
441
+ has: (feature) => provider.has(feature),
442
+ draw(feature, projectionData, zoom, context) {
443
+ drawCompanion(draw, feature, projectionData, zoom, context);
444
+ },
445
+ hitTest(feature, point, context) {
446
+ const hit = provider.hitTest(feature, {
447
+ point: toScreenPoint(point),
448
+ lngLat: toPosition(context.unproject(point)),
449
+ tolerancePx: context.tolerancePx,
450
+ screen: deps.screen,
451
+ });
452
+ return hit ? { id: hit.id, contractHit: hit } : null;
453
+ },
454
+ onCompanionClick(featureId, hit, event) {
455
+ const feature = deps.store.getFeature(featureId);
456
+ const own = hit.contractHit;
457
+ if (!feature || !own || !provider.onClick || !event)
458
+ return false;
459
+ const handled = provider.onClick(feature, own, toPointerEvent(event));
460
+ return handled === true;
461
+ },
462
+ };
463
+ }