@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,247 @@
1
+ /**
2
+ * The contexts an extension works through
3
+ *
4
+ * Each kind of extension receives one narrow context with only what that kind needs. Every
5
+ * type a context holds is part of the public API and follows semver.
6
+ */
7
+ import type { Position } from 'geojson';
8
+ import type { BBox } from '../../geometry/types.js';
9
+ import type { DatasetRow } from '../datasets.js';
10
+ import type { Draw } from '../draw.js';
11
+ import type { DrawingResource } from '../drawing.js';
12
+ import type { DrawEvents, ScreenPoint } from '../events.js';
13
+ import type { ExtensionsCollections } from '../extensions.js';
14
+ import type { Feature, FeatureInput, FeatureType, Layer } from '../model.js';
15
+ import type { SelectionStyleOptions } from '../options.js';
16
+ import type { Mode, SnapResult } from '../state.js';
17
+ import type { Hit } from './provider.js';
18
+ import type { StoreView } from './store.js';
19
+ /** The positions and the heights on the terrain, for placing things on it. */
20
+ export interface TerrainAnchors {
21
+ /**
22
+ * The point on the screen of a position lifted to the ground.
23
+ *
24
+ * @returns The point, or `null` when the terrain is off or not ready
25
+ */
26
+ project(lngLat: Position): ScreenPoint | null;
27
+ /**
28
+ * The height of the ground at a position.
29
+ *
30
+ * @returns The height in meters; 0 when the terrain is off
31
+ */
32
+ elevation(lngLat: Position): number;
33
+ /**
34
+ * The opacity for a mark at a position: lower when the terrain hides it from the camera.
35
+ *
36
+ * @returns A value from 0 to 1; 1 when the terrain is off
37
+ */
38
+ ghostOpacity(lngLat: Position): number;
39
+ /** A number that changes whenever the heights `elevation` returns may have changed. */
40
+ generation(): number;
41
+ }
42
+ /** The automatic names of new features, layers and groups. */
43
+ export interface NameGenerator {
44
+ /**
45
+ * The next name for a type.
46
+ *
47
+ * @returns The name, or `undefined` for a feature when automatic names are off
48
+ */
49
+ next(type: FeatureType | 'Layer' | 'Group'): string | undefined;
50
+ }
51
+ /** The conversion between positions on the map and points on the screen. */
52
+ export interface ScreenContext {
53
+ /** The point on the screen of a position. */
54
+ project(lngLat: Position): ScreenPoint;
55
+ /** The position on the map of a point on the screen. */
56
+ unproject(point: ScreenPoint): Position;
57
+ /**
58
+ * The extent of a feature on the screen, in pixels; a feature off the screen still has
59
+ * one.
60
+ *
61
+ * @returns The corners of the extent, or `null` when the feature has nothing to draw
62
+ */
63
+ bounds(feature: Feature): {
64
+ min: ScreenPoint;
65
+ max: ScreenPoint;
66
+ } | null;
67
+ /**
68
+ * The outline of the selection frame of a feature on the screen, in pixels, without the
69
+ * margin the frame is drawn with (`selectionStyle.boundingBox.margin`): its four corners in
70
+ * the order top left, top right, bottom right, bottom left of the shape as it stands
71
+ * unturned. It answers for every type: an image and any other turned shape give the turned
72
+ * corners, a line or an area the corners of its extent, a point the square its marker
73
+ * spans (its radius and its outline), and a custom type the corners of its `outline`, or of
74
+ * its `bounds` when it has none. A feature
75
+ * off the screen still has one. The engine draws the frame with every edge moved the margin
76
+ * outward from these corners.
77
+ *
78
+ * A custom type must not call it for its own features from its `outline` or `bounds`, which
79
+ * it calls.
80
+ *
81
+ * @returns The four corners, or an empty array when the feature has nothing to draw
82
+ */
83
+ outline(feature: Feature): ScreenPoint[];
84
+ /** The zoom of the map */
85
+ readonly zoom: number;
86
+ /** The pixel ratio the drawing uses */
87
+ readonly pixelRatio: number;
88
+ }
89
+ /**
90
+ * What every context of an extension has: the public API, the Store, the events, the
91
+ * terrain, the automatic names, the screen and a way to redraw, and the shape being drawn.
92
+ */
93
+ export interface ExtensionContext {
94
+ /** The whole public API; an extension reads and writes the document through it */
95
+ readonly draw: Draw;
96
+ /** The Store, to read the document and the state and to subscribe to their changes */
97
+ readonly store: StoreView;
98
+ /**
99
+ * Subscribes to an event, with the same names as `draw.on`. The subscription ends by itself
100
+ * when the extension is removed.
101
+ *
102
+ * @returns The function that unsubscribes
103
+ */
104
+ on<K extends keyof DrawEvents>(event: K, listener: (payload: DrawEvents[K]) => void): () => void;
105
+ /** Unsubscribes from an event. */
106
+ off<K extends keyof DrawEvents>(event: K, listener: (payload: DrawEvents[K]) => void): void;
107
+ /**
108
+ * Subscribes to the next occurrence of an event only.
109
+ *
110
+ * @returns The function that unsubscribes before it occurs
111
+ */
112
+ once<K extends keyof DrawEvents>(event: K, listener: (payload: DrawEvents[K]) => void): () => void;
113
+ /** The positions and the heights on the terrain */
114
+ readonly terrain: TerrainAnchors;
115
+ /** The automatic names of new features, layers and groups */
116
+ readonly names: NameGenerator;
117
+ /** The conversion between the map and the screen */
118
+ readonly screen: ScreenContext;
119
+ /**
120
+ * Asks for the features to be drawn again.
121
+ *
122
+ * @param filter - Only the features of this type, or with these IDs; every feature when it
123
+ * is left out
124
+ */
125
+ invalidate(filter?: {
126
+ type?: string;
127
+ ids?: string[];
128
+ }): void;
129
+ /**
130
+ * The shape the current drawing mode is drawing: the same object as `draw.drawing`, to place,
131
+ * finish, cancel, undo and redo its vertices
132
+ */
133
+ readonly drawing: DrawingResource;
134
+ }
135
+ /**
136
+ * The context of a plugin.
137
+ */
138
+ export interface PluginContext extends ExtensionContext {
139
+ /**
140
+ * The same collections as `draw.extensions`. What a plugin adds through them is removed by
141
+ * itself when the plugin is removed.
142
+ */
143
+ readonly extensions: ExtensionsCollections;
144
+ }
145
+ /**
146
+ * The context of a mode.
147
+ */
148
+ export interface ModeContext extends ExtensionContext {
149
+ /**
150
+ * Changes the mode.
151
+ *
152
+ * @returns False when the mode cannot be entered now
153
+ */
154
+ setMode(mode: Mode): boolean;
155
+ /**
156
+ * The topmost feature or dataset row at a point on the screen.
157
+ *
158
+ * @param options - `tolerancePx` is how far from the point a hit may be, in pixels
159
+ * @returns What was hit, or `null`
160
+ */
161
+ hitTest(point: ScreenPoint, options?: {
162
+ tolerancePx?: number;
163
+ }): Hit | null;
164
+ /** Where a point on the screen snaps to; its own position when nothing is snapped to. */
165
+ snap(point: ScreenPoint): SnapResult;
166
+ /**
167
+ * Creates a feature the way the built-in modes do: the writable layer, the ID, the
168
+ * automatic name and the reference zoom follow the same rules.
169
+ *
170
+ * @returns The new feature, or `null` when it is refused (read-only, a lock)
171
+ */
172
+ commitFeature(input: FeatureInput): Feature | null;
173
+ /** Shows the shape being drawn before it is created. */
174
+ readonly preview: {
175
+ /**
176
+ * Shows this shape as the one being drawn.
177
+ *
178
+ * @param options - `confirmedVertices` is how many vertices from the start are placed:
179
+ * the line up to them is drawn solid and the rest, up to the pointer, dashed (every
180
+ * vertex when it is left out); `highlightVertex` is the index of a vertex drawn
181
+ * highlighted, such as the first vertex of an area the next click would close
182
+ */
183
+ set(feature: FeatureInput, options?: {
184
+ confirmedVertices?: number;
185
+ highlightVertex?: number;
186
+ }): void;
187
+ /** Stops showing it */
188
+ clear(): void;
189
+ };
190
+ /** The cursor of the map. */
191
+ readonly cursor: {
192
+ /** Sets the cursor, as a CSS cursor value */
193
+ set(cursor: string): void;
194
+ /**
195
+ * Goes back to the cursor of the mode: the one it set in `onEnter`, or the cursor of the
196
+ * map when it set none there. The cursor the mode set is taken back when it is left.
197
+ */
198
+ reset(): void;
199
+ };
200
+ /** The look of the selected features. */
201
+ readonly selectionStyle: Required<SelectionStyleOptions>;
202
+ /**
203
+ * The layer a new feature goes into: the active layer when it can be written (it exists,
204
+ * is visible, is not locked and not hidden on this client), otherwise the first layer that
205
+ * can.
206
+ *
207
+ * @returns The layer, or `null` when no layer can be written
208
+ */
209
+ writableLayer(): Layer | null;
210
+ /**
211
+ * The rows of the datasets that a shape can trace along, within an extent. Empty when
212
+ * snapping to the datasets is off.
213
+ *
214
+ * @param bbox - The extent, as `[west, south, east, north]` in degrees
215
+ * @returns The rows, each with the ID of its dataset and its index there; the dataset finds
216
+ * a row by the ID of a snapping target with `draw.datasets.get(datasetId).findRow(id)`
217
+ */
218
+ listTraceRows(bbox: BBox): {
219
+ datasetId: string;
220
+ rowIndex: number;
221
+ row: DatasetRow;
222
+ }[];
223
+ }
224
+ /** What a hit test of a custom feature type or a companion receives. */
225
+ export interface HitTestContext {
226
+ /** The point on the screen */
227
+ point: ScreenPoint;
228
+ /** The position on the map */
229
+ lngLat: Position;
230
+ /** How far from the point a hit may be, in pixels */
231
+ tolerancePx: number;
232
+ /** The conversion between the map and the screen */
233
+ screen: ScreenContext;
234
+ }
235
+ /** What a provider of snapping candidates receives. */
236
+ export interface SnapContext {
237
+ /** The point on the screen */
238
+ point: ScreenPoint;
239
+ /** The position on the map */
240
+ lngLat: Position;
241
+ /** How far from the point a candidate may be, in pixels */
242
+ tolerancePx: number;
243
+ /** The conversion between the map and the screen */
244
+ screen: ScreenContext;
245
+ /** The IDs of the features that must not be snapped to, such as the one being drawn */
246
+ excludeIds: ReadonlySet<string>;
247
+ }
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Custom feature types: the one definition that says how a type is drawn, hit, selected and
3
+ * resized
4
+ */
5
+ import type { Geometry, Position } from 'geojson';
6
+ import type { BBox } from '../../geometry/types.js';
7
+ import type { ScreenPoint } from '../events.js';
8
+ import type { Feature, FeaturePatch } from '../model.js';
9
+ import type { HitTestContext, ScreenContext, SnapContext } from './context.js';
10
+ import type { DrawPointerEvent } from './mode.js';
11
+ import type { Hit, SnapCandidate } from './provider.js';
12
+ import type { FeatureRenderer } from './render.js';
13
+ /** One handle on a selected feature. */
14
+ export interface Handle {
15
+ /** The ID of the handle, unique within the feature */
16
+ id: string;
17
+ /** The position of the handle */
18
+ position: Position;
19
+ /** The kind of handle, as its provider names it */
20
+ kind: string;
21
+ /** The CSS cursor over the handle */
22
+ cursor?: string;
23
+ }
24
+ /**
25
+ * The definition of a custom feature type. Its handles and snapping candidates are written
26
+ * here; a provider is only for the types an extension does not define.
27
+ */
28
+ export interface FeatureTypeDefinition {
29
+ /** The name of the type; it is registered under this name */
30
+ readonly type: string;
31
+ /** The kind of GeoJSON geometry the features of this type have; one kind per type */
32
+ readonly geometry: Geometry['type'];
33
+ /**
34
+ * How far beyond its geometry a feature of this type can be hit, in pixels, such as the
35
+ * half size of an icon drawn on a point. The candidates of a hit test are gathered this much
36
+ * farther out; 0 when it is left out.
37
+ */
38
+ readonly hitPaddingPx?: number;
39
+ /** How the features of this type are drawn */
40
+ readonly renderer: FeatureRenderer;
41
+ /**
42
+ * Which features of the type the definition takes, for a definition that overrides a
43
+ * built-in type (`extensions.featureTypes.override`). A feature for which it returns false
44
+ * keeps the built-in type: its built-in drawing (drawn in batches with the other features),
45
+ * hit test, box selection, selection frame, handles, snapping candidates and extent. The
46
+ * others are drawn, hit and framed by this definition. Every feature of the type is taken
47
+ * when it is left out.
48
+ *
49
+ * It is asked again whenever a feature changes, so its answer must follow from the feature
50
+ * (its properties, its geometry, its style) and nothing outside it. It is ignored in a
51
+ * definition given to `add`: a custom type takes every feature of its type.
52
+ */
53
+ appliesTo?(feature: Feature): boolean;
54
+ /**
55
+ * The extent of a feature on the map, `[west, south, east, north]` in degrees, for a type
56
+ * that draws beyond its geometry by a distance on the ground. The spatial index takes it:
57
+ * it gathers the candidates of a hit test and of a box selection, answers
58
+ * `features.list({ bbox })`, and decides which features are near enough to the view to be
59
+ * drawn. The extent of the geometry is used when it is left out, and when it returns an
60
+ * extent that is not four finite numbers from the west and south to the east and north.
61
+ *
62
+ * It is measured when a feature changes; call `invalidate({ type })` when it depends on
63
+ * something outside the document. A reach in pixels belongs in `hitPaddingPx`.
64
+ */
65
+ bbox?(feature: Feature): BBox;
66
+ /**
67
+ * Hit tests a feature of this type; the geometry is hit tested when it is left out.
68
+ *
69
+ * @returns What was hit, or `null`
70
+ */
71
+ hitTest?(feature: Feature, ctx: HitTestContext): Hit | null;
72
+ /**
73
+ * Whether a box selection takes a feature of this type.
74
+ *
75
+ * @param box - The corners of the box on the screen, in pixels
76
+ */
77
+ boxSelect?(feature: Feature, box: {
78
+ min: ScreenPoint;
79
+ max: ScreenPoint;
80
+ }, ctx: HitTestContext): boolean;
81
+ /**
82
+ * The extent of the selection box of a feature on the screen, in pixels.
83
+ *
84
+ * @returns The corners of the extent, or `null` when the feature has nothing to draw
85
+ */
86
+ bounds?(feature: Feature, ctx: ScreenContext): {
87
+ min: ScreenPoint;
88
+ max: ScreenPoint;
89
+ } | null;
90
+ /**
91
+ * The outline of the selection frame of a feature on the screen, in pixels, for a type whose
92
+ * shape turns: its four corners in the order top left, top right, bottom right, bottom left
93
+ * of the shape as it stands unturned, without the margin of the frame
94
+ * (`selectionStyle.boundingBox.margin`). The engine draws the selection frame along it when
95
+ * it is given, and from `bounds` otherwise, with every edge moved the margin outward. For a
96
+ * type of any geometry but `Point`, the resize and rotate handles sit on the corners of that
97
+ * frame too; a `Point` type keeps a frame with no such handles.
98
+ *
99
+ * @returns The four corners; anything else (or an empty array) gives the frame of `bounds`
100
+ */
101
+ outline?(feature: Feature, ctx: ScreenContext): ScreenPoint[];
102
+ /**
103
+ * The handles that resize or reshape a selected feature. The engine draws them with the
104
+ * look of the vertex handles, hit tests them at the same size, and gives their drags to
105
+ * `onHandleDrag`.
106
+ */
107
+ handles?(feature: Feature, ctx: ScreenContext): Handle[];
108
+ /**
109
+ * The change a drag of one of its handles makes.
110
+ *
111
+ * @returns The patch to apply to the feature, or `null` for no change
112
+ */
113
+ onHandleDrag?(feature: Feature, handle: Handle, event: DrawPointerEvent): FeaturePatch | null;
114
+ /**
115
+ * A drag of one of its handles is about to start, before the first `onHandleDrag`.
116
+ *
117
+ * @returns False to refuse the drag; no `onHandleDrag` nor `onHandleDragEnd` follows then
118
+ */
119
+ onHandleDragStart?(feature: Feature, handle: Handle, event: DrawPointerEvent): boolean;
120
+ /**
121
+ * A drag of one of its handles ended, after the last `onHandleDrag` and its patch. It is
122
+ * called once for every drag that started, also when the drag is cut short.
123
+ *
124
+ * @param feature - The feature as it is now, or `null` when it is gone
125
+ */
126
+ onHandleDragEnd?(feature: Feature | null, handle: Handle, event: DrawPointerEvent): void;
127
+ /** The snapping candidates a feature of this type offers. */
128
+ snapCandidates?(feature: Feature, ctx: SnapContext): SnapCandidate[];
129
+ }
@@ -0,0 +1,123 @@
1
+ /**
2
+ * The input contract: the events a mode and a plugin receive, and the handler of a mode
3
+ *
4
+ * One rule holds for every input handler: returning true consumes the event, so that nothing
5
+ * after the handler receives it.
6
+ */
7
+ import type { Position } from 'geojson';
8
+ import type { ScreenPoint } from '../events.js';
9
+ import type { SnapPreference, SnapResult } from '../state.js';
10
+ import type { ModeContext } from './context.js';
11
+ /** The modifier keys held during an input. */
12
+ export interface Modifiers {
13
+ /** Whether Shift was held */
14
+ shift: boolean;
15
+ /** Whether Control was held */
16
+ ctrl: boolean;
17
+ /** Whether Alt (Option on macOS) was held */
18
+ alt: boolean;
19
+ /** Whether Meta (Command on macOS) was held */
20
+ meta: boolean;
21
+ }
22
+ /** A pointer input on the map, as a mode and a plugin receive it. */
23
+ export interface DrawPointerEvent {
24
+ /** The point on the screen */
25
+ point: ScreenPoint;
26
+ /** The position on the map */
27
+ lngLat: Position;
28
+ /** Where the input snaps to; the position of the pointer when nothing is snapped to */
29
+ snapped: SnapResult;
30
+ /** The modifier keys held */
31
+ modifiers: Modifiers;
32
+ /** The kind of pointer */
33
+ pointerType: 'mouse' | 'touch' | 'pen';
34
+ /** The event of the browser */
35
+ original: PointerEvent;
36
+ /**
37
+ * True when the input was made from code by `draw.drawing` (`addVertex`, `moveTo`), not by
38
+ * the pointer. Its position is exact: a mode applies no click tolerance to it, so a vertex
39
+ * placed a few pixels from another is kept, and only one at exactly the same position is
40
+ * the same vertex. Left out for the input of the pointer.
41
+ */
42
+ programmatic?: boolean;
43
+ }
44
+ /** A key input, as a mode and a plugin receive it. */
45
+ export interface DrawKeyEvent {
46
+ /** The key, as `KeyboardEvent.key` gives it */
47
+ key: string;
48
+ /** The modifier keys held */
49
+ modifiers: Modifiers;
50
+ /** The event of the browser */
51
+ original: KeyboardEvent;
52
+ }
53
+ /**
54
+ * The receivers of the input; `Plugin.input` and `ModeHandler` take any of them. Returning
55
+ * true consumes the event, so that nothing after the receiver gets it.
56
+ */
57
+ export interface InputHandlers {
58
+ /** A pointer was pressed */
59
+ onPointerDown(event: DrawPointerEvent): boolean | void;
60
+ /** The pointer moved without a drag */
61
+ onPointerMove(event: DrawPointerEvent): boolean | void;
62
+ /** A pointer was released */
63
+ onPointerUp(event: DrawPointerEvent): boolean | void;
64
+ /** The pointer left the map */
65
+ onPointerLeave(): boolean | void;
66
+ /** A click */
67
+ onClick(event: DrawPointerEvent): boolean | void;
68
+ /** A double click */
69
+ onDoubleClick(event: DrawPointerEvent): boolean | void;
70
+ /** A drag started */
71
+ onDragStart(event: DrawPointerEvent): boolean | void;
72
+ /** The pointer moved during a drag */
73
+ onDrag(event: DrawPointerEvent): boolean | void;
74
+ /** A drag ended */
75
+ onDragEnd(event: DrawPointerEvent): boolean | void;
76
+ /** A drag was cancelled */
77
+ onDragCancel(event: DrawPointerEvent): boolean | void;
78
+ /** A key was pressed */
79
+ onKeyDown(event: DrawKeyEvent): boolean | void;
80
+ /** A key was released */
81
+ onKeyUp(event: DrawKeyEvent): boolean | void;
82
+ }
83
+ /**
84
+ * The contract of a mode: how it enters, exits and receives the input. Every member is
85
+ * optional; returning true from an input receiver consumes the event.
86
+ */
87
+ export interface ModeHandler extends Partial<InputHandlers> {
88
+ /**
89
+ * Whether the mode writes new features. Such a mode is entered only while a layer can be
90
+ * written, and a double click never zooms the map while it is the current mode, whether or
91
+ * not it takes the double click; false when it is left out.
92
+ */
93
+ readonly writes?: boolean;
94
+ /** How the mode wants the positions of its input snapped; every input snaps when left out */
95
+ readonly snapPreference?: SnapPreference;
96
+ /** Called when the mode is entered */
97
+ onEnter?(): void;
98
+ /** Called when the mode is left */
99
+ onExit?(): void;
100
+ /**
101
+ * Called when the mode is interrupted: by an Escape that neither a plugin nor the mode
102
+ * consumed, or when the Store replaces its whole document (a notification with
103
+ * `reset: true`). The mode drops what it was drawing and stays the current mode.
104
+ */
105
+ onCancel?(): void;
106
+ /**
107
+ * Removes the last vertex of the shape being drawn, as `ctx.drawing.undoVertex` asks.
108
+ *
109
+ * @returns True when a vertex was removed
110
+ */
111
+ onUndoVertex?(): boolean;
112
+ /**
113
+ * Puts back the vertex the last `onUndoVertex` removed, as `ctx.drawing.redoVertex` asks.
114
+ *
115
+ * @returns True when a vertex was put back
116
+ */
117
+ onRedoVertex?(): boolean;
118
+ }
119
+ /**
120
+ * The function that creates the handler of a mode. It is registered once, under its name,
121
+ * with `draw.extensions.modes.add(name, factory)`.
122
+ */
123
+ export type ModeFactory = (ctx: ModeContext) => ModeHandler;
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Plugins: bundles of other extensions and state
3
+ */
4
+ import type { Feature } from '../model.js';
5
+ import type { PluginContext } from './context.js';
6
+ import type { DrawPointerEvent, InputHandlers } from './mode.js';
7
+ /**
8
+ * A plugin: a bundle of modes, feature types, overlays, providers and state, added with
9
+ * `draw.extensions.plugins.add`. What it adds through its context is removed by itself when
10
+ * the plugin is removed. Plugins talk to each other through their `api`.
11
+ *
12
+ * @typeParam Api - The API the plugin offers to others
13
+ */
14
+ export interface Plugin<Api = unknown> {
15
+ /** The name it is registered under */
16
+ readonly name: string;
17
+ /** Called when the plugin is added; add its extensions and subscribe to events here. */
18
+ onAdd(ctx: PluginContext): void;
19
+ /** Called when the plugin is removed. */
20
+ onRemove?(): void;
21
+ /** The API others get with `draw.extensions.plugins.getApi(name)` */
22
+ readonly api?: Api;
23
+ /**
24
+ * Receivers of the input, called before those of the mode. Returning true consumes the
25
+ * event, so that the mode does not get it.
26
+ */
27
+ readonly input?: Partial<InputHandlers>;
28
+ /** The hooks of the select mode, and an exclusive interaction of the plugin */
29
+ readonly interaction?: {
30
+ /** Narrows the candidates of a selection to the IDs it returns */
31
+ filterSelection?(candidateIds: readonly string[]): string[];
32
+ /** A selected feature was clicked again; returning true means the plugin handled it */
33
+ onFeatureClick?(feature: Feature, event: DrawPointerEvent): boolean;
34
+ /** A feature was double-clicked; returning true means the plugin handled it */
35
+ onFeatureDoubleClick?(feature: Feature, event: DrawPointerEvent): boolean;
36
+ /**
37
+ * A drawing mode created a feature: a commit of `ModeContext.commitFeature`, which the
38
+ * built-in drawing modes use too, or the image placed by the load that follows a request
39
+ * of the image mode
40
+ */
41
+ onDrawCommit?(feature: Feature): void;
42
+ /** Whether the plugin is in an exclusive interaction, during which the mode stays still */
43
+ isBusy?(): boolean;
44
+ /** Completes the exclusive interaction */
45
+ finish?(): void;
46
+ /** Cancels the exclusive interaction */
47
+ cancel?(): void;
48
+ /** The element of the exclusive interaction; clicks inside it are left to the plugin */
49
+ container?(): HTMLElement | null;
50
+ };
51
+ }
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Providers: extensions that add snapping candidates, handles or companions to feature types
3
+ * they do not define
4
+ *
5
+ * A custom feature type describes its own handles and candidates in its definition; a
6
+ * provider is for the built-in types and the types of other extensions.
7
+ */
8
+ import type { Position } from 'geojson';
9
+ import type { Feature, FeaturePatch } from '../model.js';
10
+ import type { HitTestContext, ScreenContext, SnapContext } from './context.js';
11
+ import type { Handle } from './feature-type.js';
12
+ import type { DrawPointerEvent } from './mode.js';
13
+ import type { RenderContext } from './render.js';
14
+ /** What a hit test found. */
15
+ export interface Hit {
16
+ /** What was hit */
17
+ kind: 'feature' | 'dataset' | 'companion' | 'handle';
18
+ /** The ID of what was hit */
19
+ id: string;
20
+ /** The ID of the feature it belongs to */
21
+ featureId?: string;
22
+ /** The ID of the dataset, for a row of a dataset */
23
+ datasetId?: string;
24
+ /** The distance from the point, in pixels */
25
+ distancePx: number;
26
+ }
27
+ /** One snapping candidate. */
28
+ export interface SnapCandidate {
29
+ /** The position to snap to */
30
+ position: Position;
31
+ /** The kind of candidate; a provider may use a kind of its own */
32
+ kind: 'vertex' | 'edge' | 'intersection' | 'guide' | (string & {});
33
+ /** The priority among candidates at the same distance; higher wins */
34
+ priority?: number;
35
+ /** Where the candidate came from, for display */
36
+ source?: string;
37
+ }
38
+ /** An extension that adds snapping candidates. */
39
+ export interface SnapProvider {
40
+ /** The name it is registered under */
41
+ readonly name: string;
42
+ /** The candidates near the point of the context. */
43
+ candidates(ctx: SnapContext): SnapCandidate[];
44
+ }
45
+ /** An extension that shows handles of its own on the selected features and receives their drags. */
46
+ export interface HandleProvider {
47
+ /** The name it is registered under */
48
+ readonly name: string;
49
+ /**
50
+ * The handles of a selected feature. The engine draws them with the look of the vertex
51
+ * handles, hit tests them at the same size, and gives their drags to `onDrag`.
52
+ */
53
+ handles(feature: Feature, ctx: ScreenContext): Handle[];
54
+ /**
55
+ * The handles that belong to no feature, shown whatever is selected; they are hit and
56
+ * dragged like the others, and their drag arrives with `feature` as `null`.
57
+ */
58
+ globalHandles?(ctx: ScreenContext): Handle[];
59
+ /**
60
+ * The change a drag of one of its handles makes. It is called for every move of the drag
61
+ * and once more when the drag ends; the patch of the end is the one that stays.
62
+ *
63
+ * @param feature - The feature the handle is on; `null` for a handle of `globalHandles`
64
+ * @returns The patch to apply to the feature, or `null` for no change
65
+ */
66
+ onDrag(feature: Feature | null, handle: Handle, event: DrawPointerEvent): FeaturePatch | null;
67
+ /**
68
+ * A drag of one of its handles is about to start, before the first `onDrag`.
69
+ *
70
+ * @param feature - The feature the handle is on; `null` for a handle of `globalHandles`
71
+ * @returns False to refuse the drag: the pointer then does what it would do without the
72
+ * handle, and no `onDrag` nor `onDragEnd` follows
73
+ */
74
+ onDragStart?(feature: Feature | null, handle: Handle, event: DrawPointerEvent): boolean;
75
+ /**
76
+ * A drag of one of its handles ended, after the last `onDrag` and its patch. It is called
77
+ * once for every drag that started, also when the drag is cut short.
78
+ *
79
+ * @param feature - The feature the handle is on as it is now; `null` for a handle of
80
+ * `globalHandles`, or when the feature is gone
81
+ */
82
+ onDragEnd?(feature: Feature | null, handle: Handle, event: DrawPointerEvent): void;
83
+ }
84
+ /**
85
+ * An extension that draws a companion one step below a feature, such as a leader line, and
86
+ * hit tests it at the same step.
87
+ */
88
+ export interface CompanionProvider {
89
+ /** The name it is registered under */
90
+ readonly name: string;
91
+ /**
92
+ * Whether a feature has a companion. It is asked for every feature on every frame and
93
+ * every hit test, so it must answer at once.
94
+ */
95
+ has(feature: Feature): boolean;
96
+ /** Draws the companion of a feature. */
97
+ draw(feature: Feature, ctx: RenderContext): void;
98
+ /**
99
+ * Hit tests the companion of a feature.
100
+ *
101
+ * It is asked at the step of the feature in the stacking order: when the point missed the
102
+ * feature itself, and before the feature behind it. At one point, the handles of the
103
+ * selection come first; then, from the front, each feature and then its companions, so a
104
+ * feature (its marker, its line or its area, with the click tolerance) wins over its own
105
+ * companion and a companion wins over the features behind its feature; the rows of a
106
+ * dataset come only after the features and the companions in front of them.
107
+ *
108
+ * @returns What was hit, or `null`
109
+ */
110
+ hitTest(feature: Feature, ctx: HitTestContext): Hit | null;
111
+ /**
112
+ * A companion was clicked.
113
+ *
114
+ * @param hit - What `hitTest` returned
115
+ * @returns True to consume the click, which then changes nothing else; false, or nothing,
116
+ * to leave it to the select mode as a click on the feature
117
+ */
118
+ onClick?(feature: Feature, hit: Hit, event: DrawPointerEvent): boolean;
119
+ }
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};