@sakuzu/maplibre-gl-draw 1.0.0 → 2.1.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 (541) hide show
  1. package/CHANGELOG.md +1109 -2
  2. package/README.ja.md +83 -50
  3. package/README.md +89 -53
  4. package/THIRD_PARTY_NOTICES.md +29 -0
  5. package/dist/api/datasets.d.ts +263 -0
  6. package/dist/api/document.d.ts +66 -0
  7. package/dist/api/draw.d.ts +137 -0
  8. package/dist/api/draw.js +20 -0
  9. package/dist/api/drawing.d.ts +87 -0
  10. package/dist/api/errors.d.ts +35 -0
  11. package/dist/api/errors.js +35 -0
  12. package/dist/api/events.d.ts +316 -0
  13. package/dist/api/extension/context.d.ts +247 -0
  14. package/dist/api/extension/feature-type.d.ts +129 -0
  15. package/dist/api/extension/mode.d.ts +123 -0
  16. package/dist/api/extension/plugin.d.ts +51 -0
  17. package/dist/api/extension/plugin.js +3 -0
  18. package/dist/api/extension/provider.d.ts +119 -0
  19. package/dist/api/extension/provider.js +3 -0
  20. package/dist/api/extension/render.d.ts +176 -0
  21. package/dist/api/extension/render.js +3 -0
  22. package/dist/api/extension/store.d.ts +190 -0
  23. package/dist/api/extension/store.js +3 -0
  24. package/dist/api/extensions.d.ts +306 -0
  25. package/dist/api/extensions.js +3 -0
  26. package/dist/api/features.d.ts +188 -0
  27. package/dist/api/features.js +3 -0
  28. package/dist/api/groups.d.ts +111 -0
  29. package/dist/api/groups.js +3 -0
  30. package/dist/api/hidden.d.ts +45 -0
  31. package/dist/api/hidden.js +3 -0
  32. package/dist/api/impl/adapters.js +463 -0
  33. package/dist/api/impl/contexts.js +466 -0
  34. package/dist/api/impl/create-draw.js +124 -0
  35. package/dist/api/impl/datasets.js +405 -0
  36. package/dist/api/impl/destroy-guard.js +74 -0
  37. package/dist/api/impl/document.js +280 -0
  38. package/dist/api/impl/drawing.js +180 -0
  39. package/dist/api/impl/engine-context.d.ts +7 -0
  40. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  41. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  42. package/dist/api/impl/events.js +423 -0
  43. package/dist/api/impl/extension-host.js +364 -0
  44. package/dist/api/impl/extensions.js +229 -0
  45. package/dist/api/impl/features.js +445 -0
  46. package/dist/api/impl/geometry/apply.d.ts +32 -0
  47. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  48. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  49. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  50. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  51. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  52. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  53. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  54. package/dist/api/impl/geometry/types.js +3 -0
  55. package/dist/api/impl/groups.d.ts +3 -0
  56. package/dist/api/impl/groups.js +268 -0
  57. package/dist/api/impl/hidden.js +60 -0
  58. package/dist/api/impl/import-export/constants.d.ts +22 -0
  59. package/dist/api/impl/import-export/constants.js +24 -0
  60. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  61. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  62. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  63. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  64. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  66. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  68. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  69. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  70. package/dist/api/impl/import-export/image-import.js +73 -0
  71. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  72. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  73. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  74. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  75. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  76. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  77. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  78. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  79. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  80. package/dist/api/impl/import-export/style-validation.js +86 -0
  81. package/dist/api/impl/import-export/types.d.ts +52 -0
  82. package/dist/api/impl/import-export/types.js +3 -0
  83. package/dist/api/impl/input.js +180 -0
  84. package/dist/api/impl/layers.js +307 -0
  85. package/dist/api/impl/metadata.d.ts +1 -0
  86. package/dist/api/impl/metadata.js +22 -0
  87. package/dist/api/impl/options.d.ts +1 -0
  88. package/dist/api/impl/options.js +851 -0
  89. package/dist/api/impl/placement.d.ts +1 -0
  90. package/dist/api/impl/placement.js +138 -0
  91. package/dist/api/impl/render-context.d.ts +13 -0
  92. package/dist/api/impl/render-context.js +272 -0
  93. package/dist/api/impl/rows.d.ts +1 -0
  94. package/dist/api/impl/rows.js +46 -0
  95. package/dist/api/impl/selection.d.ts +1 -0
  96. package/dist/api/impl/selection.js +186 -0
  97. package/dist/api/impl/shared.d.ts +64 -0
  98. package/dist/api/impl/shared.js +178 -0
  99. package/dist/api/impl/validate-extension.d.ts +1 -0
  100. package/dist/api/impl/validate-extension.js +159 -0
  101. package/dist/api/layers.d.ts +130 -0
  102. package/dist/api/layers.js +3 -0
  103. package/dist/api/metadata.d.ts +18 -0
  104. package/dist/api/metadata.js +3 -0
  105. package/dist/api/model.d.ts +487 -0
  106. package/dist/api/model.js +47 -0
  107. package/dist/api/options.d.ts +466 -0
  108. package/dist/api/options.js +3 -0
  109. package/dist/api/selection.d.ts +94 -0
  110. package/dist/api/selection.js +3 -0
  111. package/dist/api/state.d.ts +155 -0
  112. package/dist/api/state.js +12 -0
  113. package/dist/{display → dataset}/chunk.d.ts +1 -1
  114. package/dist/{display → dataset}/chunk.js +4 -3
  115. package/dist/{display → dataset}/dataset.js +21 -21
  116. package/dist/dataset/interaction.d.ts +1 -0
  117. package/dist/{display → dataset}/interaction.js +18 -6
  118. package/dist/dataset/manager.d.ts +1 -0
  119. package/dist/dataset/provider.d.ts +1 -0
  120. package/dist/{display → dataset}/retained.d.ts +1 -1
  121. package/dist/{display → dataset}/retained.js +8 -7
  122. package/dist/dataset/source.d.ts +1 -0
  123. package/dist/{display → dataset}/source.js +17 -4
  124. package/dist/dataset/spatial.d.ts +1 -0
  125. package/dist/{display → dataset}/spatial.js +1 -1
  126. package/dist/dataset/style.d.ts +1 -0
  127. package/dist/{display → dataset}/style.js +1 -1
  128. package/dist/dataset/table-source.d.ts +1 -0
  129. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  130. package/dist/{display → dataset}/thinning.d.ts +0 -10
  131. package/dist/{display → dataset}/thinning.js +3 -2
  132. package/dist/dataset/triangulation.d.ts +1 -0
  133. package/dist/{display → dataset}/triangulation.js +0 -0
  134. package/dist/{display → dataset}/types.d.ts +84 -121
  135. package/dist/dataset/types.js +61 -0
  136. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  137. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  138. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  139. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  140. package/dist/dispatcher/hit-test/service.js +80 -16
  141. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  142. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  143. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  144. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  145. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  146. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  147. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  148. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  149. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  150. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  151. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  152. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  153. package/dist/dispatcher/input-router.js +154 -70
  154. package/dist/dispatcher/normalizer.js +25 -4
  155. package/dist/dispatcher/types.d.ts +6 -1
  156. package/dist/extension/feature-handler.d.ts +1 -182
  157. package/dist/extension/index.d.ts +4 -7
  158. package/dist/extension/renderers.d.ts +1 -208
  159. package/dist/geometry/angle.d.ts +0 -8
  160. package/dist/geometry/angle.js +0 -8
  161. package/dist/geometry/bbox.d.ts +4 -12
  162. package/dist/geometry/bbox.js +4 -12
  163. package/dist/geometry/boolean.d.ts +0 -51
  164. package/dist/geometry/boolean.js +0 -51
  165. package/dist/geometry/buffer.d.ts +0 -26
  166. package/dist/geometry/buffer.js +0 -26
  167. package/dist/geometry/circle.d.ts +0 -9
  168. package/dist/geometry/circle.js +0 -9
  169. package/dist/geometry/coords.d.ts +0 -16
  170. package/dist/geometry/coords.js +0 -16
  171. package/dist/geometry/distance.d.ts +0 -24
  172. package/dist/geometry/distance.js +0 -24
  173. package/dist/geometry/errors.d.ts +21 -36
  174. package/dist/geometry/errors.js +49 -29
  175. package/dist/geometry/geojson.d.ts +85 -0
  176. package/dist/geometry/geojson.js +173 -0
  177. package/dist/geometry/index.d.ts +38 -23
  178. package/dist/geometry/index.js +43 -31
  179. package/dist/geometry/measure.d.ts +0 -27
  180. package/dist/geometry/measure.js +0 -27
  181. package/dist/geometry/predicates.d.ts +0 -9
  182. package/dist/geometry/predicates.js +0 -9
  183. package/dist/geometry/public-bounds.d.ts +26 -0
  184. package/dist/geometry/public-bounds.js +30 -0
  185. package/dist/geometry/public-combine.d.ts +78 -0
  186. package/dist/geometry/public-combine.js +82 -0
  187. package/dist/geometry/public-create.d.ts +54 -0
  188. package/dist/geometry/public-create.js +70 -0
  189. package/dist/geometry/public-measure.d.ts +170 -0
  190. package/dist/geometry/public-measure.js +283 -0
  191. package/dist/geometry/public-predicates.d.ts +54 -0
  192. package/dist/geometry/public-predicates.js +144 -0
  193. package/dist/geometry/public-repair.d.ts +75 -0
  194. package/dist/geometry/public-repair.js +77 -0
  195. package/dist/geometry/simplify.d.ts +0 -7
  196. package/dist/geometry/simplify.js +0 -7
  197. package/dist/geometry/split.d.ts +0 -20
  198. package/dist/geometry/split.js +0 -20
  199. package/dist/geometry/units.d.ts +20 -12
  200. package/dist/geometry/units.js +20 -12
  201. package/dist/index.d.ts +66 -66
  202. package/dist/index.js +6 -18
  203. package/dist/messages.d.ts +7 -7
  204. package/dist/modes/draw/circle.js +83 -207
  205. package/dist/modes/draw/commit-layer.d.ts +5 -16
  206. package/dist/modes/draw/commit-layer.js +2 -13
  207. package/dist/modes/draw/freehand.js +108 -246
  208. package/dist/modes/draw/image.js +4 -2
  209. package/dist/modes/draw/index.d.ts +5 -5
  210. package/dist/modes/draw/index.js +5 -5
  211. package/dist/modes/draw/line.js +18 -354
  212. package/dist/modes/draw/point.js +29 -78
  213. package/dist/modes/draw/polygon.js +23 -368
  214. package/dist/modes/draw/trace-support.d.ts +43 -36
  215. package/dist/modes/draw/trace-support.js +95 -98
  216. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  217. package/dist/modes/draw/vertex-drawing.js +176 -0
  218. package/dist/modes/handler.d.ts +1 -285
  219. package/dist/modes/manager.d.ts +2 -2
  220. package/dist/modes/manager.js +3 -0
  221. package/dist/modes/select/box-selection.d.ts +3 -3
  222. package/dist/modes/select/box-selection.js +2 -1
  223. package/dist/modes/select/click-handler.d.ts +5 -5
  224. package/dist/modes/select/click-handler.js +22 -20
  225. package/dist/modes/select/cursor-handler.d.ts +2 -2
  226. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  227. package/dist/modes/select/drag/move.js +3 -3
  228. package/dist/modes/select/drag/operation.d.ts +3 -3
  229. package/dist/modes/select/drag/radius.js +5 -4
  230. package/dist/modes/select/drag/transform.d.ts +2 -2
  231. package/dist/modes/select/drag/transform.js +11 -5
  232. package/dist/modes/select/drag/vertex.d.ts +2 -2
  233. package/dist/modes/select/drag/vertex.js +13 -8
  234. package/dist/modes/select/drag-handler.js +44 -25
  235. package/dist/modes/select/mode.js +17 -17
  236. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  237. package/dist/modes/select/shortcut-handler.js +9 -7
  238. package/dist/operations/layer-operations.js +29 -168
  239. package/dist/operations/resize.d.ts +2 -2
  240. package/dist/operations/resize.js +5 -5
  241. package/dist/operations/rotate.js +5 -5
  242. package/dist/operations/selection-operations.d.ts +16 -1
  243. package/dist/operations/selection-operations.js +28 -13
  244. package/dist/operations/shared-vertex.js +4 -2
  245. package/dist/operations/trace-graph.d.ts +0 -18
  246. package/dist/operations/trace-graph.js +0 -18
  247. package/dist/operations/vertex.js +36 -35
  248. package/dist/shared/color.d.ts +1 -0
  249. package/dist/shared/color.js +245 -0
  250. package/dist/shared/config/constants.d.ts +1 -54
  251. package/dist/shared/config/constants.js +1 -58
  252. package/dist/shared/config/feature-style.d.ts +16 -13
  253. package/dist/shared/config/feature-style.js +9 -0
  254. package/dist/shared/config/rendering.d.ts +3 -3
  255. package/dist/shared/config/selection-highlight.d.ts +0 -15
  256. package/dist/shared/config/selection-highlight.js +4 -7
  257. package/dist/shared/config/selection.d.ts +2 -32
  258. package/dist/shared/config/selection.js +0 -18
  259. package/dist/shared/config/topology.d.ts +2 -2
  260. package/dist/shared/config/trace.d.ts +4 -4
  261. package/dist/shared/math/angle.d.ts +1 -1
  262. package/dist/shared/math/angle.js +1 -1
  263. package/dist/shared/math/circle.d.ts +1 -1
  264. package/dist/shared/math/circle.js +1 -1
  265. package/dist/shared/math/distance.d.ts +2 -1
  266. package/dist/shared/math/distance.js +3 -2
  267. package/dist/shared/math/index.d.ts +1 -1
  268. package/dist/shared/math/index.js +1 -1
  269. package/dist/shared/math/transform.d.ts +23 -0
  270. package/dist/shared/math/transform.js +47 -28
  271. package/dist/shared/properties.d.ts +18 -0
  272. package/dist/shared/properties.js +129 -0
  273. package/dist/shared/types/events.d.ts +15 -7
  274. package/dist/shared/types/model.d.ts +109 -159
  275. package/dist/shared/types/style.d.ts +1 -1
  276. package/dist/shared/utils/color.d.ts +2 -36
  277. package/dist/shared/utils/color.js +13 -70
  278. package/dist/shared/utils/coordinates.d.ts +30 -4
  279. package/dist/shared/utils/coordinates.js +56 -10
  280. package/dist/shared/utils/event-emitter.d.ts +1 -262
  281. package/dist/shared/utils/event-emitter.js +4 -3
  282. package/dist/shared/utils/feature-bbox.js +8 -7
  283. package/dist/shared/utils/feature-segments.js +5 -4
  284. package/dist/shared/utils/image.d.ts +0 -4
  285. package/dist/shared/utils/image.js +0 -6
  286. package/dist/shared/utils/name-generator.d.ts +14 -20
  287. package/dist/shared/utils/name-generator.js +20 -3
  288. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  289. package/dist/shared/utils/pixel-ratio.js +13 -4
  290. package/dist/shared/utils/property.d.ts +7 -50
  291. package/dist/shared/utils/property.js +22 -87
  292. package/dist/snapping/custom-targets.js +21 -4
  293. package/dist/snapping/indicator.js +20 -11
  294. package/dist/snapping/providers/display.d.ts +6 -1
  295. package/dist/snapping/providers/display.js +2 -1
  296. package/dist/snapping/providers/guide.d.ts +3 -43
  297. package/dist/snapping/providers/guide.js +1 -44
  298. package/dist/snapping/providers/intersection.js +1 -1
  299. package/dist/snapping/providers/store.js +3 -3
  300. package/dist/snapping/service.js +18 -7
  301. package/dist/snapping/types.d.ts +9 -35
  302. package/dist/store/draw-store.js +233 -142
  303. package/dist/store/local-visibility.d.ts +11 -6
  304. package/dist/store/local-visibility.js +38 -7
  305. package/dist/store/lock.d.ts +0 -6
  306. package/dist/store/lock.js +0 -6
  307. package/dist/store/memory/change-bus.d.ts +3 -3
  308. package/dist/store/memory/change-bus.js +12 -0
  309. package/dist/store/memory/file-store.d.ts +2 -2
  310. package/dist/store/memory/ui-state.d.ts +1 -51
  311. package/dist/store/memory/ui-state.js +122 -134
  312. package/dist/store/memory.d.ts +1 -8
  313. package/dist/store/memory.js +249 -45
  314. package/dist/store/ordering.d.ts +9 -0
  315. package/dist/store/ordering.js +17 -0
  316. package/dist/store/spatial/spatial-index.d.ts +1 -1
  317. package/dist/store/spatial/spatial-index.js +1 -1
  318. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  319. package/dist/store/spatial/store-spatial-index.js +9 -3
  320. package/dist/store/store.d.ts +66 -107
  321. package/dist/store/types.d.ts +1 -1
  322. package/dist/store/writable-layer.d.ts +1 -1
  323. package/dist/store/writable-layer.js +2 -2
  324. package/dist/table/builder.d.ts +83 -0
  325. package/dist/table/builder.js +381 -0
  326. package/dist/table/index.d.ts +37 -0
  327. package/dist/table/index.js +5 -0
  328. package/dist/table/packed-rtree.d.ts +1 -0
  329. package/dist/{display → table}/packed-rtree.js +1 -1
  330. package/dist/table/partition.d.ts +1 -0
  331. package/dist/{display → table}/partition.js +3 -3
  332. package/dist/table/prepare.d.ts +44 -0
  333. package/dist/table/prepare.js +136 -0
  334. package/dist/table/table.d.ts +1 -0
  335. package/dist/{display/columnar → table}/table.js +29 -25
  336. package/dist/{display/columnar → table}/types.d.ts +68 -72
  337. package/dist/table/types.js +3 -0
  338. package/dist/view/coordinator.js +4 -3
  339. package/dist/view/feature-companion.d.ts +13 -7
  340. package/dist/view/feature-companion.js +11 -3
  341. package/dist/view/globe-subdivision.js +3 -3
  342. package/dist/view/layer/attach.d.ts +12 -6
  343. package/dist/view/layer/attach.js +86 -10
  344. package/dist/view/layer/custom-layer.js +40 -11
  345. package/dist/view/layer/display-list.js +2 -1
  346. package/dist/view/layer/drape-planner.d.ts +2 -2
  347. package/dist/view/layer/frame-render.d.ts +3 -3
  348. package/dist/view/layer/frame-render.js +7 -2
  349. package/dist/view/layer/frame-state.d.ts +6 -6
  350. package/dist/view/layer/index.d.ts +2 -2
  351. package/dist/view/layer/index.js +1 -1
  352. package/dist/view/layer/render.d.ts +4 -4
  353. package/dist/view/layer/render.js +3 -8
  354. package/dist/view/layer/renderers.d.ts +2 -2
  355. package/dist/view/layer/renderers.js +1 -1
  356. package/dist/view/layer/slot-manager.d.ts +2 -2
  357. package/dist/view/layer/slot-manager.js +4 -4
  358. package/dist/view/layer/slots.d.ts +2 -2
  359. package/dist/view/layer/slots.js +1 -1
  360. package/dist/view/layer/store-retained-bbox.js +3 -2
  361. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  362. package/dist/view/layer/store-retained-classify.js +19 -7
  363. package/dist/view/layer/store-retained-collect.js +8 -7
  364. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  365. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  366. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  367. package/dist/view/layer/store-retained-immediate.js +3 -8
  368. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  369. package/dist/view/layer/store-retained.d.ts +2 -2
  370. package/dist/view/layer/store-retained.js +1 -1
  371. package/dist/view/renderers/batch-manager.js +8 -7
  372. package/dist/view/renderers/drawer.js +21 -15
  373. package/dist/view/renderers/image.js +13 -39
  374. package/dist/view/renderers/line/line-types.d.ts +3 -3
  375. package/dist/view/renderers/line/sdf-line.js +3 -1
  376. package/dist/view/renderers/point/billboard-depth.js +1 -1
  377. package/dist/view/renderers/point/point-instance.js +1 -1
  378. package/dist/view/renderers/point/point-shape.js +2 -2
  379. package/dist/view/renderers/point/point-style.js +48 -4
  380. package/dist/view/renderers/polygon/batch.js +1 -2
  381. package/dist/view/renderers/polygon/fill.js +3 -1
  382. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  383. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  384. package/dist/view/renderers/stroke.js +3 -1
  385. package/dist/view/shaders/helpers.d.ts +2 -42
  386. package/dist/view/shaders/helpers.js +0 -6
  387. package/dist/view/shaders/projection.d.ts +15 -7
  388. package/dist/view/shaders/projection.js +23 -6
  389. package/dist/view/shaders/quad.d.ts +16 -12
  390. package/dist/view/shaders/quad.js +34 -13
  391. package/dist/view/style-rule.d.ts +5 -42
  392. package/dist/view/style-rule.js +20 -44
  393. package/dist/view/terrain/binding.d.ts +1 -0
  394. package/dist/view/terrain/binding.js +29 -0
  395. package/dist/view/terrain/context.d.ts +3 -4
  396. package/dist/view/terrain/context.js +4 -5
  397. package/dist/view/terrain/drape/geometry.js +1 -1
  398. package/dist/view/terrain/drape/pass.d.ts +1 -1
  399. package/dist/view/terrain/drape/pass.js +8 -7
  400. package/dist/view/terrain/polygon.d.ts +9 -5
  401. package/dist/view/terrain/polygon.js +16 -2
  402. package/dist/view/terrain/state.d.ts +1 -1
  403. package/dist/view/terrain/state.js +1 -1
  404. package/dist/view/terrain/tessellation.d.ts +2 -2
  405. package/dist/view/terrain/tessellation.js +1 -1
  406. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  407. package/dist/view/ui/bounds.js +8 -12
  408. package/dist/view/ui/handle-test.js +2 -2
  409. package/dist/view/ui/handle-thinning.js +17 -17
  410. package/dist/view/ui/handles.js +21 -13
  411. package/dist/view/ui/helper.d.ts +1 -1
  412. package/dist/view/ui/helper.js +1 -1
  413. package/dist/view/ui/index.d.ts +1 -1
  414. package/dist/view/ui/selection-scope.js +4 -2
  415. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  416. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  417. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  418. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  419. package/dist/view/ui/selection-ui/index.js +1 -1
  420. package/dist/view/ui/selection-ui/renderer.js +15 -38
  421. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  422. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  423. package/dist/view/ui/selection-ui-drawer.js +63 -2
  424. package/dist/view/ui/tentative.js +1 -1
  425. package/dist/webgl/index.d.ts +65 -0
  426. package/dist/webgl/index.js +62 -0
  427. package/package.json +38 -15
  428. package/dist/api/api.d.ts +0 -1259
  429. package/dist/api/api.js +0 -86
  430. package/dist/api/context.d.ts +0 -173
  431. package/dist/api/display-api.js +0 -23
  432. package/dist/api/event-api.d.ts +0 -13
  433. package/dist/api/event-api.js +0 -17
  434. package/dist/api/extension-api.d.ts +0 -46
  435. package/dist/api/extension-api.js +0 -85
  436. package/dist/api/feature-api.d.ts +0 -11
  437. package/dist/api/feature-api.js +0 -101
  438. package/dist/api/geometry/apply.d.ts +0 -51
  439. package/dist/api/geometry/boolean.d.ts +0 -28
  440. package/dist/api/geometry/boolean.js +0 -65
  441. package/dist/api/geometry/types.d.ts +0 -31
  442. package/dist/api/geometry-operations.d.ts +0 -162
  443. package/dist/api/geometry-operations.js +0 -94
  444. package/dist/api/group-api.d.ts +0 -10
  445. package/dist/api/group-api.js +0 -78
  446. package/dist/api/import-export/constants.d.ts +0 -29
  447. package/dist/api/import-export/constants.js +0 -40
  448. package/dist/api/import-export/file-name.d.ts +0 -10
  449. package/dist/api/import-export/file-name.js +0 -20
  450. package/dist/api/import-export/geojson-export.d.ts +0 -19
  451. package/dist/api/import-export/image-import.d.ts +0 -12
  452. package/dist/api/import-export/image-import.js +0 -53
  453. package/dist/api/import-export/index.d.ts +0 -9
  454. package/dist/api/import-export/index.js +0 -107
  455. package/dist/api/import-export/native-format.d.ts +0 -15
  456. package/dist/api/import-export/style-validation.d.ts +0 -27
  457. package/dist/api/import-export/style-validation.js +0 -49
  458. package/dist/api/import-export/types.d.ts +0 -26
  459. package/dist/api/index.d.ts +0 -15
  460. package/dist/api/index.js +0 -3
  461. package/dist/api/input-api.d.ts +0 -158
  462. package/dist/api/input-api.js +0 -144
  463. package/dist/api/instance-api.d.ts +0 -38
  464. package/dist/api/instance-api.js +0 -136
  465. package/dist/api/layer-api.d.ts +0 -12
  466. package/dist/api/layer-api.js +0 -62
  467. package/dist/api/selection-api.d.ts +0 -7
  468. package/dist/api/selection-api.js +0 -78
  469. package/dist/api/snapping-api.d.ts +0 -125
  470. package/dist/api/snapping-api.js +0 -50
  471. package/dist/api/topology-api.d.ts +0 -30
  472. package/dist/api/topology-api.js +0 -16
  473. package/dist/api/tracing-api.d.ts +0 -31
  474. package/dist/api/tracing-api.js +0 -16
  475. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  476. package/dist/dispatcher/hit-test/index.js +0 -9
  477. package/dist/dispatcher/index.d.ts +0 -15
  478. package/dist/dispatcher/index.js +0 -3
  479. package/dist/display/columnar/index.d.ts +0 -12
  480. package/dist/display/columnar/index.js +0 -13
  481. package/dist/display/columnar/prepare.d.ts +0 -42
  482. package/dist/display/columnar/prepare.js +0 -116
  483. package/dist/display/index.d.ts +0 -13
  484. package/dist/display/types.js +0 -43
  485. package/dist/maplibre-gl-draw.d.ts +0 -47
  486. package/dist/modes/cursor.js +0 -72
  487. package/dist/modes/index.d.ts +0 -7
  488. package/dist/operations/index.d.ts +0 -9
  489. package/dist/operations/index.js +0 -3
  490. package/dist/plugins/index.d.ts +0 -10
  491. package/dist/plugins/mutation-hooks.d.ts +0 -28
  492. package/dist/plugins/mutation-hooks.js +0 -84
  493. package/dist/plugins/plugin-context.js +0 -367
  494. package/dist/plugins/plugin-manager.d.ts +0 -103
  495. package/dist/plugins/plugin-manager.js +0 -316
  496. package/dist/plugins/plugin.d.ts +0 -529
  497. package/dist/shared/config/index.d.ts +0 -17
  498. package/dist/shared/config/index.js +0 -8
  499. package/dist/shared/utils/index.d.ts +0 -15
  500. package/dist/shared/utils/index.js +0 -24
  501. package/dist/snapping/index.d.ts +0 -14
  502. package/dist/snapping/index.js +0 -4
  503. package/dist/store/change-merger.js +0 -102
  504. package/dist/store/event-bridge.js +0 -161
  505. package/dist/store/index.d.ts +0 -12
  506. package/dist/store/index.js +0 -4
  507. package/dist/view/index.d.ts +0 -47
  508. package/dist/view/index.js +0 -20
  509. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  510. /package/dist/api/{import-export/types.js → document.js} +0 -0
  511. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  512. /package/dist/{display/index.js → api/events.js} +0 -0
  513. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  514. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  515. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  516. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  517. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  518. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  519. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  520. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  521. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  522. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  523. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  524. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  525. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  526. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  527. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  528. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  529. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  532. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  533. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  534. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  535. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  536. /package/dist/{display → dataset}/chunk-set.js +0 -0
  537. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  538. /package/dist/{display → dataset}/manager.js +0 -0
  539. /package/dist/{display → dataset}/provider.js +0 -0
  540. /package/dist/{display → dataset}/selection.d.ts +0 -0
  541. /package/dist/{display → dataset}/selection.js +0 -0
@@ -0,0 +1,316 @@
1
+ /**
2
+ * The events: one list, `DrawEvents`, that applications and extensions subscribe to alike
3
+ *
4
+ * An event is named `resource.pastParticiple`. A change of the document carries its source,
5
+ * and `document.changed` arrives once per transaction with every change of it.
6
+ */
7
+ import type { Position } from 'geojson';
8
+ import type { Dataset, DatasetRow } from './datasets.js';
9
+ import type { DrawError } from './errors.js';
10
+ import type { Hit } from './extension/provider.js';
11
+ import type { UpdateSource } from './extension/store.js';
12
+ import type { Feature, FeatureInput, FileData, Group, Layer, LoadResult, Metadata, MoveTarget } from './model.js';
13
+ import type { RuntimeOptions } from './options.js';
14
+ import type { LayerStackEntry, Mode, Selection, SelectionType, SnapResult, VertexSelection } from './state.js';
15
+ /** A point on the screen, as `[x, y]` in CSS pixels. */
16
+ export type ScreenPoint = [number, number];
17
+ /**
18
+ * Everything one transaction changed, as `document.changed` and the subscribers of the Store
19
+ * receive it. It arrives once per transaction, and each category is present only when the
20
+ * transaction changed it.
21
+ *
22
+ * `document.changed` fires only for a transaction that changed the document (features, layers,
23
+ * groups, metadata or files); the selection, the editing and the mode are carried along when
24
+ * the same transaction changed them. A change of the state of this client alone has its own
25
+ * event (`selection.changed`, `mode.changed` and so on).
26
+ */
27
+ export interface DocumentChange {
28
+ /** Where the writes came from */
29
+ source?: UpdateSource;
30
+ /**
31
+ * True when the notification replaces the whole document at once, as a Store given in the
32
+ * `store` option does when it takes a document from elsewhere. The current mode drops what
33
+ * it was drawing then (`ModeHandler.onCancel`), because the shape it holds may refer to
34
+ * what is gone. A Store sets it; the changes that come with it list what was replaced.
35
+ */
36
+ reset?: boolean;
37
+ /** The features created, updated and deleted */
38
+ features?: {
39
+ created?: Feature[];
40
+ updated?: Array<{
41
+ id: string;
42
+ feature: Feature;
43
+ previous: Feature;
44
+ /** True while a drag or a drawing is in progress; a final update always follows */
45
+ isIntermediate?: boolean;
46
+ }>;
47
+ deleted?: Feature[];
48
+ };
49
+ /** The layers created, updated and deleted, and the change of their stacking order */
50
+ layers?: {
51
+ created?: Layer[];
52
+ updated?: Array<{
53
+ id: string;
54
+ layer: Layer;
55
+ previous: Layer;
56
+ }>;
57
+ deleted?: Layer[];
58
+ orderChanged?: {
59
+ order: string[];
60
+ previous: string[];
61
+ };
62
+ };
63
+ /** The groups created, updated and deleted */
64
+ groups?: {
65
+ created?: Group[];
66
+ updated?: Array<{
67
+ id: string;
68
+ group: Group;
69
+ previous: Group;
70
+ }>;
71
+ deleted?: Group[];
72
+ };
73
+ /** The new order of the items of a layer */
74
+ layerReorder?: {
75
+ layerId: string;
76
+ order: string[];
77
+ previous: string[];
78
+ };
79
+ /** The new order of the features of a group */
80
+ groupReorder?: {
81
+ groupId: string;
82
+ featureIds: string[];
83
+ previous: string[];
84
+ };
85
+ /** The new selection and the one before it */
86
+ selection?: {
87
+ type: SelectionType | null;
88
+ ids: string[];
89
+ previousType: SelectionType | null;
90
+ previousIds: string[];
91
+ };
92
+ /** The IDs of the features whose editing started and ended */
93
+ editing?: {
94
+ started?: string[];
95
+ ended?: string[];
96
+ };
97
+ /** The new mode and the one before it */
98
+ mode?: {
99
+ mode: Mode;
100
+ previous: Mode;
101
+ };
102
+ /** The new metadata and the one before it */
103
+ metadata?: {
104
+ metadata: Metadata;
105
+ previous: Metadata;
106
+ };
107
+ /** The embedded files created and deleted */
108
+ files?: {
109
+ created?: FileData[];
110
+ deleted?: FileData[];
111
+ };
112
+ }
113
+ /**
114
+ * The events, by name, with their payloads.
115
+ */
116
+ export interface DrawEvents {
117
+ /** A feature was created */
118
+ 'feature.created': {
119
+ feature: Feature;
120
+ source: string;
121
+ };
122
+ /** A feature changed; `intermediate` is true while a drag is in progress */
123
+ 'feature.updated': {
124
+ feature: Feature;
125
+ previous: Feature;
126
+ source: string;
127
+ intermediate: boolean;
128
+ };
129
+ /** A feature was deleted */
130
+ 'feature.deleted': {
131
+ feature: Feature;
132
+ source: string;
133
+ };
134
+ /** A feature moved between layers or groups */
135
+ 'feature.moved': {
136
+ feature: Feature;
137
+ from: MoveTarget;
138
+ to: MoveTarget;
139
+ source: string;
140
+ };
141
+ /** A layer was created */
142
+ 'layer.created': {
143
+ layer: Layer;
144
+ source: string;
145
+ };
146
+ /** A layer changed */
147
+ 'layer.updated': {
148
+ layer: Layer;
149
+ previous: Layer;
150
+ source: string;
151
+ };
152
+ /** A layer was deleted */
153
+ 'layer.deleted': {
154
+ layer: Layer;
155
+ source: string;
156
+ };
157
+ /** The stacking order of the layers changed */
158
+ 'layer.reordered': {
159
+ order: readonly string[];
160
+ previous: readonly string[];
161
+ source: string;
162
+ };
163
+ /** A group was created */
164
+ 'group.created': {
165
+ group: Group;
166
+ source: string;
167
+ };
168
+ /** A group changed */
169
+ 'group.updated': {
170
+ group: Group;
171
+ previous: Group;
172
+ source: string;
173
+ };
174
+ /** A group was ungrouped */
175
+ 'group.deleted': {
176
+ group: Group;
177
+ source: string;
178
+ };
179
+ /** The title or the description changed */
180
+ 'metadata.updated': {
181
+ metadata: Metadata;
182
+ previous: Metadata;
183
+ source: string;
184
+ };
185
+ /**
186
+ * Every change of one transaction that changed the document (features, layers, groups,
187
+ * metadata or files); it arrives once per such transaction, after the events of the
188
+ * resources. A change of the selection, the mode or another state of this client alone does
189
+ * not fire it.
190
+ */
191
+ 'document.changed': DocumentChange;
192
+ /** A document was loaded */
193
+ 'document.loaded': {
194
+ result: LoadResult;
195
+ source: string;
196
+ };
197
+ /** The selection changed */
198
+ 'selection.changed': {
199
+ selection: Selection;
200
+ previous: Selection;
201
+ };
202
+ /** The vertex selection changed */
203
+ 'vertexSelection.changed': {
204
+ selection: VertexSelection | null;
205
+ previous: VertexSelection | null;
206
+ };
207
+ /** A drag started */
208
+ 'drag.started': {
209
+ kind: 'feature' | 'vertex' | 'handle';
210
+ featureIds: string[];
211
+ };
212
+ /** A drag ended; `cancelled` is true when it was cancelled */
213
+ 'drag.ended': {
214
+ kind: 'feature' | 'vertex' | 'handle';
215
+ featureIds: string[];
216
+ cancelled: boolean;
217
+ };
218
+ /** The mode changed */
219
+ 'mode.changed': {
220
+ mode: Mode;
221
+ previous: Mode;
222
+ };
223
+ /** The items this client hides changed; `ids` is the whole set after the change */
224
+ 'hidden.changed': {
225
+ ids: readonly string[];
226
+ };
227
+ /** Read-only was turned on or off */
228
+ 'readOnly.changed': {
229
+ readOnly: boolean;
230
+ };
231
+ /** The interaction lock was turned on or off */
232
+ 'interactionLock.changed': {
233
+ locked: boolean;
234
+ };
235
+ /**
236
+ * `draw.options.update` changed the options; `options` and `previous` are what
237
+ * `draw.options.get()` returns after and before the change. An update that leaves every
238
+ * value as it was does not fire it
239
+ */
240
+ 'options.changed': {
241
+ options: Readonly<RuntimeOptions>;
242
+ previous: Readonly<RuntimeOptions>;
243
+ };
244
+ /** The snapping target changed */
245
+ 'snap.changed': {
246
+ result: SnapResult | null;
247
+ };
248
+ /**
249
+ * The shape being drawn changed, or was cleared (`feature` is `null`). It fires once per
250
+ * change, with no throttling: at each vertex, at each move of the pointer that moves the
251
+ * shape, and when the shape is created, cancelled or left. `feature` has the type, the
252
+ * geometry and the layer of the shape, the ID it will be created with, and the radius of a
253
+ * circle; it is a copy that the drawing does not change afterwards. `confirmedVertices` and
254
+ * `highlightVertex` are the options the shape was shown with (`ModeContext.preview.set`):
255
+ * each is left out when it was not given, and both when the shape is cleared.
256
+ */
257
+ 'preview.changed': {
258
+ feature: FeatureInput | null;
259
+ confirmedVertices?: number;
260
+ highlightVertex?: number;
261
+ };
262
+ /**
263
+ * A click on the map in the select mode, whether it hit something or not. `lngLat` is the
264
+ * position of the pointer before snapping, and `hit` the frontmost thing under it (a feature,
265
+ * a row of a dataset, a companion), or `null` when the click hit nothing
266
+ */
267
+ 'map.clicked': {
268
+ lngLat: Position;
269
+ point: ScreenPoint;
270
+ hit: Hit | null;
271
+ };
272
+ /** A row of a dataset was clicked */
273
+ 'dataset.clicked': {
274
+ datasetId: string;
275
+ rowIndex: number;
276
+ row: DatasetRow;
277
+ lngLat: Position;
278
+ point: ScreenPoint;
279
+ };
280
+ /** A dataset was added */
281
+ 'dataset.added': {
282
+ dataset: Dataset;
283
+ };
284
+ /** A dataset was removed */
285
+ 'dataset.removed': {
286
+ datasetId: string;
287
+ };
288
+ /** The stacking order of the datasets changed */
289
+ 'dataset.reordered': {
290
+ order: readonly string[];
291
+ previous: readonly string[];
292
+ };
293
+ /**
294
+ * The image mode asks for an image to place at a position: the application picks a file
295
+ * and loads it with `document.load(file, { coordinate: lngLat, zoom, layerId })`. `lngLat` is
296
+ * the clicked position when a click led to the mode (a listener of `map.clicked` entered it),
297
+ * and the center of the map when the mode was entered otherwise
298
+ */
299
+ 'image.requested': {
300
+ lngLat: Position;
301
+ zoom: number;
302
+ layerId: string;
303
+ };
304
+ /** The divisions of the stacking order changed */
305
+ 'layerStack.changed': {
306
+ entries: readonly LayerStackEntry[];
307
+ };
308
+ /** Loading or reading an image failed */
309
+ error: {
310
+ error: DrawError;
311
+ source: string;
312
+ featureId?: string;
313
+ };
314
+ }
315
+ /** A function that receives the payload of an event. */
316
+ export type DrawEventListener<K extends keyof DrawEvents = keyof DrawEvents> = (payload: DrawEvents[K]) => void;
@@ -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
+ }