@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
@@ -67,7 +67,7 @@ function toStoredCopy(event, reference) {
67
67
  * @internal
68
68
  */
69
69
  export function createInputRouter(deps) {
70
- const { normalizer, modeManager, context, map, pluginManager, displayInteractions, notifyMapClick, snapService, } = deps;
70
+ const { normalizer, modeManager, context, map, displayInteractions, notifyMapClick, trackClick, snapService, extensionInput, } = deps;
71
71
  let boundHandleEvent = null;
72
72
  /**
73
73
  * Whether input originating from the pointer is currently held
@@ -126,68 +126,140 @@ export function createInputRouter(deps) {
126
126
  */
127
127
  function applySnap(event, inputType) {
128
128
  if (!snapService || event.snap === false)
129
- return event;
130
- if (modeManager.getHandler()?.isSnapEnabledFor?.(inputType) === false)
131
- return event;
129
+ return { event, result: null };
130
+ if (modeManager.getHandler()?.isSnapEnabledFor?.(inputType) === false) {
131
+ return { event, result: null };
132
+ }
132
133
  const result = snapService.resolve(event.lngLat, event.point, buildSnapContext(event.modifiers));
133
134
  if (result.lngLat.lng === event.lngLat.lng && result.lngLat.lat === event.lngLat.lat) {
134
- return event;
135
+ return { event, result: result.target ? result : null };
136
+ }
137
+ return {
138
+ event: { ...event, lngLat: { lng: result.lngLat.lng, lat: result.lngLat.lat } },
139
+ result,
140
+ };
141
+ }
142
+ /**
143
+ * What a consumed event stops besides the receivers after it: a consumed press does not
144
+ * reach the map (no pan starts) and a consumed double click does not zoom it
145
+ */
146
+ function stopConsumed(event) {
147
+ if (event.type === 'mousedown') {
148
+ const original = event.originalEvent;
149
+ original.stopPropagation();
150
+ if (!('touches' in original))
151
+ original.preventDefault();
152
+ }
153
+ else if (event.type === 'dblclick') {
154
+ event.originalEvent.preventDefault();
155
+ }
156
+ }
157
+ /**
158
+ * Hands the event to the plugins of the extensions, then to a mode written to the extension
159
+ * contract
160
+ *
161
+ * @returns 'consumed' when the event goes no further, 'mode' when a mode of the contract
162
+ * received it, 'engine' when the mode is a mode of the engine the router calls
163
+ */
164
+ function toExtensions(handler, event, snapped, snap) {
165
+ if (!extensionInput)
166
+ return 'engine';
167
+ if (extensionInput.toPlugins(event, snapped, snap)) {
168
+ stopConsumed(event);
169
+ return 'consumed';
170
+ }
171
+ const consumed = extensionInput.toMode(handler, event, snapped, snap);
172
+ if (consumed === undefined)
173
+ return 'engine';
174
+ if (consumed) {
175
+ stopConsumed(event);
176
+ return 'consumed';
177
+ }
178
+ return 'mode';
179
+ }
180
+ /**
181
+ * A click: to the extensions, the mode, the datasets and the map.clicked notification
182
+ *
183
+ * @returns Whether a receiver took it
184
+ */
185
+ function handleClickEvent(handler, event) {
186
+ // Deliver to the mode with the snapped coordinates (if nothing snapped,
187
+ // the original event is used unchanged)
188
+ const { event: snapped, result } = applySnap(event, 'click');
189
+ const route = toExtensions(handler, event, snapped, result);
190
+ if (route === 'consumed')
191
+ return true;
192
+ if (route === 'engine')
193
+ handleClick(handler, snapped);
194
+ // Delivery to datasets happens only in select mode. A click
195
+ // in a drawing mode places a vertex, and delivering that same click as a
196
+ // click on the data as well would make the host application's "click to
197
+ // select" fire by mistake while drawing (for example, starting to draw a
198
+ // circle on top of a huge polygon of data would cover the whole screen with
199
+ // the selection highlight). The rule that a hit in the Store always wins is
200
+ // decided on the interception side, so the selection behavior of the mode
201
+ // during select is unaffected.
202
+ if (handler.modeName === 'select')
203
+ displayInteractions?.handleClick(snapped);
204
+ // Emit the click of select mode as a single stream regardless of whether
205
+ // anything was hit (draw.map.click). display.click is designed not to fire
206
+ // when a feature in the Store is hit, so a host application that needs "a
207
+ // click anywhere on the map" (placing a comment pin, for instance) watches
208
+ // this one. The coordinates are copied from the raw event before snapping.
209
+ if (handler.modeName === 'select') {
210
+ notifyMapClick?.({
211
+ lngLat: [event.lngLat.lng, event.lngLat.lat],
212
+ point: { x: event.point.x, y: event.point.y },
213
+ });
135
214
  }
136
- return { ...event, lngLat: { lng: result.lngLat.lng, lat: result.lngLat.lat } };
215
+ return route === 'engine' && handler.onClick !== undefined;
137
216
  }
217
+ /**
218
+ * Hands an event to the extensions and the mode
219
+ *
220
+ * @returns Whether a receiver took it: a plugin or a mode of the contract consumed it, or
221
+ * the mode of the engine has a receiver for it
222
+ */
138
223
  function handleEvent(input, options = {}) {
139
224
  // Only input originating from the real pointer is stopped while held.
140
225
  // Synthetic input (dispatch) is let through
141
226
  if (pointerHeld && !options.synthetic && HELD_EVENT_TYPES.has(input.type))
142
- return;
227
+ return false;
143
228
  const handler = modeManager.getHandler();
144
229
  if (!handler)
145
- return;
230
+ return false;
146
231
  // The single place where the longitude of the input is decided (see toStoredCopy)
147
232
  const event = toStoredCopy(input, firstTentativeCoordinate(context.store.getTentative()));
148
233
  switch (event.type) {
149
- case 'click': {
150
- // Deliver to the mode with the snapped coordinates (if nothing snapped,
151
- // the original event is used unchanged)
152
- const snapped = applySnap(event, 'click');
153
- handleClick(handler, snapped);
154
- // Delivery to datasets happens only in select mode. A click
155
- // in a drawing mode places a vertex, and delivering that same click as a
156
- // click on the data as well would make the host application's "click to
157
- // select" fire by mistake while drawing (for example, starting to draw a
158
- // circle on top of a huge polygon of data would cover the whole screen with
159
- // the selection highlight). The rule that a hit in the Store always wins is
160
- // decided on the interception side, so the selection behavior of the mode
161
- // during select is unaffected.
162
- if (handler.modeName === 'select')
163
- displayInteractions?.handleClick(snapped);
164
- // Emit the click of select mode as a single stream regardless of whether
165
- // anything was hit (draw.map.click). display.click is designed not to fire
166
- // when a feature in the Store is hit, so a host application that needs "a
167
- // click anywhere on the map" (placing a comment pin, for instance) watches
168
- // this one. The coordinates are copied from the raw event before snapping.
169
- if (handler.modeName === 'select') {
170
- notifyMapClick?.({
171
- lngLat: [event.lngLat.lng, event.lngLat.lat],
172
- point: { x: event.point.x, y: event.point.y },
173
- });
234
+ case 'click':
235
+ trackClick?.([event.lngLat.lng, event.lngLat.lat]);
236
+ try {
237
+ return handleClickEvent(handler, event);
174
238
  }
175
- break;
239
+ finally {
240
+ trackClick?.(null);
241
+ }
242
+ case 'dblclick': {
243
+ const taken = engineOr(toExtensions(handler, event, event, null), handler.onDoubleClick, () => handler.onDoubleClick?.(event));
244
+ // A double click never zooms the map while a drawing mode is active, whether or not
245
+ // anything took it: its clicks were meant for the drawing
246
+ if (handler.writesFeatures === true)
247
+ event.originalEvent.preventDefault();
248
+ return taken;
176
249
  }
177
- case 'dblclick':
178
- handler.onDoubleClick?.(event);
179
- break;
180
250
  case 'mousedown':
181
- handleMouseDown(handler, event);
182
- break;
251
+ return engineOr(toExtensions(handler, event, event, null), handler.onMouseDown, () => handleMouseDown(handler, event));
183
252
  case 'mouseup':
184
- handler.onMouseUp?.(event);
185
- break;
253
+ return engineOr(toExtensions(handler, event, event, null), handler.onMouseUp, () => handler.onMouseUp?.(event));
186
254
  case 'mousemove': {
187
- const snapped = applySnap(event, 'mousemove');
188
- // Call the onMouseMove of the plugins (they do not consume it)
189
- pluginManager?.handleMouseMove(snapped);
190
- handler.onMouseMove?.(snapped);
255
+ const { event: snapped, result } = applySnap(event, 'mousemove');
256
+ if (extensionInput?.toPlugins(event, snapped, result))
257
+ return true;
258
+ const consumed = extensionInput?.toMode(handler, event, snapped, result);
259
+ if (consumed === true)
260
+ return true;
261
+ if (consumed === undefined)
262
+ handler.onMouseMove?.(snapped);
191
263
  // The hover of datasets is likewise limited to select mode,
192
264
  // by the same rule as click. When switching to a drawing mode, a hover that
193
265
  // is still held is discarded (so that it does not fire on the stale target
@@ -198,53 +270,64 @@ export function createInputRouter(deps) {
198
270
  else {
199
271
  displayInteractions?.reset();
200
272
  }
201
- break;
273
+ return consumed === undefined && handler.onMouseMove !== undefined;
202
274
  }
203
275
  case 'contextmenu':
204
276
  // contextmenu currently has no special handling
205
- break;
277
+ return false;
206
278
  // The start and end of a drag also go through snapping. This is to keep
207
279
  // "start drawing exactly at a corner of a boundary and end at a corner" for
208
280
  // drag-driven drawing (freehand). The drag operations of select mode use
209
281
  // dragStartLngLat (the press position from before the threshold was exceeded)
210
282
  // as their start position, so they are unaffected by the replacement here.
211
283
  case 'dragstart': {
212
- const snapped = applySnap(event, 'dragstart');
213
- handler.onDragStart?.(snapped);
214
- break;
284
+ const { event: snapped, result } = applySnap(event, 'dragstart');
285
+ return engineOr(toExtensions(handler, event, snapped, result), handler.onDragStart, () => handler.onDragStart?.(snapped));
215
286
  }
216
287
  case 'dragmove': {
217
- const snapped = applySnap(event, 'dragmove');
218
- // Call the onDragMove of the plugins (they do not consume it; the
219
- // counterpart of onMouseMove)
220
- pluginManager?.handleDragMove(snapped);
288
+ const { event: snapped, result } = applySnap(event, 'dragmove');
289
+ if (extensionInput?.toPlugins(event, snapped, result))
290
+ return true;
291
+ const consumed = extensionInput?.toMode(handler, event, snapped, result);
292
+ if (consumed !== undefined)
293
+ return consumed;
221
294
  handler.onDragMove?.(snapped);
222
- break;
295
+ return handler.onDragMove !== undefined;
223
296
  }
224
297
  case 'dragend': {
225
- const snapped = applySnap(event, 'dragend');
226
- handler.onDragEnd?.(snapped);
227
- break;
298
+ const { event: snapped, result } = applySnap(event, 'dragend');
299
+ return engineOr(toExtensions(handler, event, snapped, result), handler.onDragEnd, () => handler.onDragEnd?.(snapped));
228
300
  }
229
301
  // A press ended without a release (a second finger, or the browser cancelled the
230
302
  // touch). No coordinates are decided, so it does not go through snapping, and it
231
303
  // is never held: the mode must always get the chance to abort the press.
232
304
  case 'dragcancel':
233
- handler.onDragCancel?.(event);
234
- break;
235
- case 'keydown':
236
- // Call the onKeyDown of the plugins first
237
- if (pluginManager?.handleKeyDown(event)) {
238
- // Handled by a plugin
239
- break;
240
- }
305
+ return engineOr(toExtensions(handler, event, event, null), handler.onDragCancel, () => handler.onDragCancel?.(event));
306
+ case 'keydown': {
307
+ if (extensionInput?.toPlugins(event, event, null))
308
+ return true;
309
+ const consumed = extensionInput?.toMode(handler, event, event, null);
310
+ if (consumed !== undefined)
311
+ return consumed;
241
312
  handler.onKeyDown?.(event);
242
- break;
313
+ return handler.onKeyDown !== undefined;
314
+ }
243
315
  case 'keyup':
244
- handler.onKeyUp?.(event);
245
- break;
316
+ return engineOr(toExtensions(handler, event, event, null), handler.onKeyUp, () => handler.onKeyUp?.(event));
246
317
  }
247
318
  }
319
+ /**
320
+ * Runs the receiver of the mode of the engine when the route leads to it
321
+ *
322
+ * @param receiver - The receiver of the mode of the engine, to tell whether it has one
323
+ * @returns Whether a receiver took the event
324
+ */
325
+ function engineOr(route, receiver, run) {
326
+ if (route !== 'engine')
327
+ return route === 'consumed';
328
+ run();
329
+ return receiver !== undefined;
330
+ }
248
331
  function handleClick(handler, event) {
249
332
  handler.onClick?.(event);
250
333
  }
@@ -77,7 +77,7 @@ export function createInputNormalizer(map, options = {}) {
77
77
  const canvas = map.getCanvas();
78
78
  const listeners = new Set();
79
79
  const opts = { ...DEFAULT_OPTIONS, ...options };
80
- const profiles = createProfiles(opts);
80
+ let profiles = createProfiles(opts);
81
81
  // State management
82
82
  let press = null;
83
83
  /**
@@ -509,5 +509,9 @@ export function createInputNormalizer(map, options = {}) {
509
509
  function off(handler) {
510
510
  listeners.delete(handler);
511
511
  }
512
- return { attach, detach, on, off };
512
+ const setDragThreshold = (px) => {
513
+ opts.dragThreshold = px;
514
+ profiles = createProfiles(opts);
515
+ };
516
+ return { attach, detach, on, off, setDragThreshold };
513
517
  }
@@ -22,7 +22,7 @@ export interface ModifierKeys {
22
22
  * `'touch'` is one finger of a touch screen, `'pen'` a stylus (reported either through
23
23
  * the touch events, as on iPadOS, or through the mouse events the browser emits for
24
24
  * it), and `'mouse'` everything else. Input with no `pointerType` (synthetic input
25
- * through `draw.input`, for example) is treated as `'mouse'`.
25
+ * of the tests, for example) is treated as `'mouse'`.
26
26
  */
27
27
  export type PointerType = 'mouse' | 'touch' | 'pen';
28
28
  /**
@@ -68,6 +68,11 @@ export interface MouseNormalizedEvent {
68
68
  * which synthetic input chooses whether to go through snapping.
69
69
  */
70
70
  snap?: boolean;
71
+ /**
72
+ * Whether the event was made from code (`draw.drawing`) at an exact position, not by the
73
+ * pointer; the modes apply no click tolerance to it (`DrawPointerEvent.programmatic`)
74
+ */
75
+ programmatic?: boolean;
71
76
  }
72
77
  /**
73
78
  * A normalized drag event: the start, each move, the end or the cancellation of a press
@@ -1,182 +1 @@
1
- /**
2
- * The feature handler contract of an extension
3
- *
4
- * The shape an extension implements to add a custom feature type: its renderer, its hit
5
- * testing, its box selection, its bounding boxes, its resize and its snapping candidates, all
6
- * registered at once with `registerFeatureHandler`. It is types only and sits low in the layer
7
- * order, so the view, snapping and operations layers read it without reaching up into api.
8
- */
9
- import type { BoxSelectionStrategy } from '../dispatcher/hit-test/box-strategy.js';
10
- import type { HitTestStrategy } from '../dispatcher/hit-test/strategies/index.js';
11
- import type { ResizeState } from '../operations/resize.js';
12
- import type { HandleType } from '../shared/config/constants.js';
13
- import type { BoundingBox, Coordinate, Feature } from '../shared/types/model.js';
14
- import type { BoundingBoxCoords } from '../shared/types/selection-box.js';
15
- import type { SnapCandidate, SnapProviderContext } from '../snapping/types.js';
16
- import type { HandleInfo } from '../view/ui/handles.js';
17
- import type { PointFrameExtent } from '../view/ui/selection-ui/index.js';
18
- import type { CustomFeatureRenderer } from './renderers.js';
19
- /**
20
- * Custom resize result
21
- *
22
- * The result of the resize computation for a custom feature.
23
- * Used when processing different from the standard resize (changing scale) is needed.
24
- */
25
- export interface CustomResizeResult {
26
- /** The new coordinates */
27
- coordinates: Coordinate;
28
- /** The new width (in pixels, optional) */
29
- width?: number;
30
- /** The new height (in pixels, optional) */
31
- height?: number;
32
- }
33
- /**
34
- * The type of a custom resize computation function
35
- */
36
- export type CustomResizeCalculator = (handle: HandleType, state: ResizeState, currentLngLat: {
37
- lng: number;
38
- lat: number;
39
- }, feature: Feature) => CustomResizeResult | null;
40
- /**
41
- * A custom feature type: how its features are drawn, hit, selected, resized and snapped to
42
- *
43
- * Register it with `draw.registerFeatureHandler(handler)`, usually from `onInstall` of a
44
- * {@link Plugin}. The registration belongs to that draw instance, and the returned function
45
- * removes it. Features of the type are ordinary features in the Store (`type` is the name of
46
- * the handler), so they are saved, exported, grouped and stacked like the built-in types;
47
- * GeoJSON export writes the type in `maplibre-gl-draw:featureType` so that it comes back.
48
- *
49
- * `type`, `renderer` and `hitTest` are required. The rest have fallbacks: box selection and
50
- * the bounding box use the coordinates, and without `getSelectionBoundingBox` no selection UI
51
- * is drawn.
52
- *
53
- * @example
54
- * ```ts
55
- * import type { CustomFeatureHandler, Feature } from '@sakuzu/maplibre-gl-draw';
56
- *
57
- * // A "marker" type: one coordinate, drawn as a square, hit within the tolerance
58
- * const distanceTo = (feature: Feature, [lng, lat]: [number, number]) => {
59
- * const [x, y] = feature.coordinates as [number, number];
60
- * return Math.hypot(x - lng, y - lat);
61
- * };
62
- *
63
- * const markerHandler: CustomFeatureHandler = {
64
- * type: 'marker',
65
- * renderer: markerRenderer, // see CustomFeatureRenderer
66
- * hitTest: {
67
- * geometryType: 'marker',
68
- * test: (feature, coordinate, tolerance) => distanceTo(feature, coordinate) <= tolerance,
69
- * distance: (feature, coordinate) => distanceTo(feature, coordinate),
70
- * },
71
- * };
72
- *
73
- * const unregister = draw.registerFeatureHandler(markerHandler);
74
- * draw.addFeature({ type: 'marker', coordinates: [139.767, 35.681] });
75
- * ```
76
- */
77
- export interface CustomFeatureHandler {
78
- /** The feature type name */
79
- readonly type: string;
80
- /** The custom renderer */
81
- readonly renderer: CustomFeatureRenderer;
82
- /** The custom hit testing strategy */
83
- readonly hitTest: HitTestStrategy;
84
- /** The custom box selection strategy (when omitted, a coordinate-based fallback is used) */
85
- readonly boxSelection?: BoxSelectionStrategy;
86
- /**
87
- * The resize strategy (applied when computeCustomResize returns null)
88
- * - 'scale': changes the scale property (as an Image does)
89
- * - 'coordinates': changes the coordinates directly (the same as Polygon and LineString)
90
- * - when omitted: a generic check (decided by the presence of the scale property)
91
- */
92
- readonly resizeStrategy?: 'scale' | 'coordinates';
93
- /**
94
- * Bounding box computation
95
- *
96
- * Used for viewport filtering in SpatialIndex.
97
- * When omitted, a simple bounding box is computed from the coordinates.
98
- *
99
- * @param feature The target feature
100
- * @param tileSize The tile size (512 by default)
101
- */
102
- getBoundingBox?(feature: Feature, tileSize: number): BoundingBox;
103
- /**
104
- * The additional reach for narrowing down candidates (in CSS pixels)
105
- *
106
- * The first stage of hit testing narrows down candidates with a radius equivalent to
107
- * clickTolerance, so when the hitTest strategy of this type treats a wider area as a hit
108
- * (icons and the like), the candidate is dropped before the precise test is reached.
109
- * Registering "how far from the center a hit can occur" here widens the candidate search
110
- * radius by that much.
111
- *
112
- * The test itself is still decided by the hitTest strategy as before (only the number of
113
- * candidates increases slightly). A value that changes with zoom or with settings is
114
- * registered as a function (it is evaluated on every query).
115
- */
116
- readonly candidateReachPx?: number | (() => number);
117
- /**
118
- * The half width and half height of the selection box of a zero-area point (in CSS pixels)
119
- *
120
- * A point keeps its zero area and is treated with the "point appearance" (box only, no resize
121
- * or rotation handles, move inside the box). This function only decides the dimensions of that
122
- * box (the special treatment of zero area itself does not change).
123
- *
124
- * When it is omitted, or returns null, the default 12px square is used.
125
- *
126
- * @param feature The target feature
127
- */
128
- getPointFrameExtent?(feature: Feature): PointFrameExtent | null;
129
- /**
130
- * Bounding box computation for the selection UI
131
- *
132
- * Used for the visual feedback of the selected state (bounding box, handles).
133
- * Returns an OBB (Oriented Bounding Box) that takes rotation into account.
134
- * When omitted, no selection UI is drawn.
135
- *
136
- * @param feature The target feature
137
- * @param tileSize The tile size (512 by default)
138
- */
139
- getSelectionBoundingBox?(feature: Feature, tileSize: number): BoundingBoxCoords;
140
- /**
141
- * Returns additional resize handles
142
- *
143
- * Returns the handles to display in addition to the standard four corner handles.
144
- * When omitted, only the four corner handles are shown.
145
- * Called only for a single selection.
146
- *
147
- * @param feature The target feature
148
- * @param bbox The bounding box for the selection UI
149
- */
150
- getAdditionalResizeHandles?(feature: Feature, bbox: BoundingBoxCoords): HandleInfo[];
151
- /**
152
- * Custom resize computation
153
- *
154
- * Provides custom resize logic such as edge-midpoint handles.
155
- * Returning null applies the standard resize (changing scale).
156
- *
157
- * @param handle The type of the handle being operated
158
- * @param state The state of the resize operation
159
- * @param currentLngLat The current mouse coordinate
160
- * @param feature The target feature
161
- */
162
- computeCustomResize?(handle: HandleType, state: ResizeState, currentLngLat: {
163
- lng: number;
164
- lat: number;
165
- }, feature: Feature): CustomResizeResult | null;
166
- /**
167
- * Returns the snapping candidates
168
- *
169
- * An extension point that lets a custom type provide its own vertices and edges as snapping
170
- * targets. The built-in vertex provider calls this when there is a registration for the type
171
- * of the target feature (when it is called, the standard enumeration of the vertices and edges
172
- * of that feature is not performed).
173
- *
174
- * The returned candidates may be either point candidates that have a coordinate
175
- * (kind: 'vertex' and the like) or segment candidates that have two endpoints (kind: 'edge').
176
- * The nearest point on a segment candidate is computed by SnapService.
177
- *
178
- * @param feature The target feature
179
- * @param ctx The snapping context (includes the cursor position, the tolerance and exclusions)
180
- */
181
- getSnapTargets?(feature: Feature, ctx: SnapProviderContext): SnapCandidate[];
182
- }
1
+ export {};
@@ -1,9 +1,6 @@
1
1
  /**
2
- * The contracts an extension implements
3
- *
4
- * The types a plugin, a custom feature type or an overlay implements to plug into the
5
- * extension points of a draw instance. The registration itself is on the instance
6
- * (`registerFeatureHandler`, `addOverlayRenderer` and so on).
2
+ * The contracts of the engine for the feature types that are not built in and for the
3
+ * overlays. The extension contract of `api/extension/` is installed into them.
7
4
  */
8
- export type { CustomFeatureHandler, CustomResizeCalculator, CustomResizeResult, } from './feature-handler.js';
9
- export type { CustomFeatureRenderer, CustomOverlayRenderer, CustomRendererDrawContext, LayerAwareOverlayRenderer, } from './renderers.js';
5
+ export type { FeatureTypeHandler, TypeResizeCalculator, TypeResizeResult, } from './feature-handler.js';
6
+ export type { EngineOverlayRenderer, FeatureTypeRenderer, FrameDrawContext, LayeredOverlayRenderer, } from './renderers.js';