@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,263 @@
1
+ /**
2
+ * `draw.datasets`: large data that is drawn but not edited, and is not part of the document
3
+ */
4
+ import type { Feature as GeoJSONFeature, Geometry, Position } from 'geojson';
5
+ import type { BBox } from '../geometry/types.js';
6
+ import type { PreparedTable, Table } from '../table/index.js';
7
+ import type { ScreenPoint } from './events.js';
8
+ import type { FeatureStyle, FeatureType, StyleRule } from './model.js';
9
+ /**
10
+ * A row of a dataset, given and read as a GeoJSON feature. Its geometry may be `null`, as
11
+ * GeoJSON allows; such a row is kept in the table and is not drawn.
12
+ *
13
+ * Besides the members of GeoJSON, a row may carry `style`, its own look, which wins over the
14
+ * color of the style rule and the base style of the dataset. A row read back carries the look
15
+ * it was given merged over the base style, when that has a key.
16
+ */
17
+ export type DatasetRow = GeoJSONFeature<Geometry | null> & {
18
+ /** The look of the row; it wins over the style rule and the base style of the dataset */
19
+ style?: FeatureStyle;
20
+ };
21
+ /**
22
+ * Where a dataset is stacked: below the layers of the document, above them, or inside the
23
+ * layer order.
24
+ */
25
+ export type DatasetOrder = 'below-store' | 'above-store' | 'layer-order';
26
+ /** Where a dataset goes in the stacking order. */
27
+ export interface DatasetPlacement {
28
+ /** The division of the stacking order */
29
+ order?: DatasetOrder;
30
+ /** The position within the division, 0 at the back */
31
+ index?: number;
32
+ }
33
+ /**
34
+ * The default look of the rows of a dataset for each part a style rule colors (`point`,
35
+ * `stroke` and `fill`). A row without a look of its own takes it.
36
+ */
37
+ export type DatasetBaseStyle = Partial<Record<'point' | 'stroke' | 'fill', FeatureStyle>>;
38
+ /** The scale factor and the opacity the rows of a dataset are drawn with at a zoom. */
39
+ export type DatasetZoomScale = (zoom: number) => {
40
+ scale: number;
41
+ opacity: number;
42
+ };
43
+ /**
44
+ * A function that returns the rows of the range in view, for a dataset whose rows are fetched
45
+ * as the map moves.
46
+ *
47
+ * @param bbox - The range in view, in degrees
48
+ * @param zoom - The zoom of the map
49
+ * @returns The rows of the range
50
+ */
51
+ export type DatasetProvider = (bbox: BBox, zoom: number) => Promise<DatasetRow[]>;
52
+ /** How the point rows of a dataset that overlap on the screen are thinned out. */
53
+ export interface DatasetCollisionThinning {
54
+ /** Whether the thinning is on; false when it is left out */
55
+ enabled?: boolean;
56
+ /** The zoom from which every row is drawn; 17 when it is left out */
57
+ fullDisplayZoom?: number;
58
+ /** The margin around each marker, in screen pixels; 2 when it is left out */
59
+ marginPx?: number;
60
+ }
61
+ /** What the thinning of a dataset is doing now, for a message such as "showing n of N". */
62
+ export interface DatasetThinningStats {
63
+ /** Whether the thinning is on */
64
+ enabled: boolean;
65
+ /** Whether it is thinning out rows at the current zoom */
66
+ active: boolean;
67
+ /** The number of rows */
68
+ total: number;
69
+ /** The number of rows drawn */
70
+ visible: number;
71
+ /** The zoom band the drawn rows were chosen for, or `null` */
72
+ band: number | null;
73
+ }
74
+ /** The events of one dataset, by name, with their payloads. */
75
+ export interface DatasetEvents {
76
+ /** A row was clicked */
77
+ clicked: {
78
+ datasetId: string;
79
+ rowIndex: number;
80
+ row: DatasetRow;
81
+ lngLat: Position;
82
+ point: ScreenPoint;
83
+ };
84
+ /** The pointer moved over a row, or off every row (`rowIndex` and `row` are then `null`) */
85
+ hovered: {
86
+ datasetId: string;
87
+ rowIndex: number | null;
88
+ row: DatasetRow | null;
89
+ lngLat: Position;
90
+ point: ScreenPoint;
91
+ };
92
+ /** The rows, the look, the visibility, the selection or the thinning changed */
93
+ changed: {
94
+ reason: 'rows' | 'style' | 'visibility' | 'selection' | 'thinning';
95
+ };
96
+ }
97
+ /**
98
+ * What `datasets.add` takes. The rows are given in one of three ways, told apart by the name
99
+ * of the field: `rows`, `table` or `provider`. With none of them the dataset starts empty: it
100
+ * can be placed at once (`layers.reorder` takes its ID when its order is `layer-order`), and
101
+ * its rows are given later with `setRows` or `setTable`.
102
+ */
103
+ export type DatasetOptions = {
104
+ /** The ID */
105
+ id: string;
106
+ /** The rule that colors the rows from their attributes */
107
+ styleRule?: StyleRule;
108
+ /** The default look */
109
+ baseStyle?: DatasetBaseStyle;
110
+ /** Whether the rows can be clicked and snapped to */
111
+ interactive?: boolean;
112
+ /** Where it is stacked */
113
+ order?: DatasetOrder;
114
+ /** The scale factor and the opacity by zoom */
115
+ zoomScale?: DatasetZoomScale;
116
+ /** The thinning of overlapping points */
117
+ collisionThinning?: DatasetCollisionThinning;
118
+ /** Picks the point rows that another renderer draws; they are not drawn by the dataset */
119
+ externalPointRender?: (row: DatasetRow) => boolean;
120
+ } & ({
121
+ /** The rows as GeoJSON features */
122
+ rows: readonly DatasetRow[];
123
+ } | {
124
+ /** The rows as a table, prepared or not */
125
+ table: Table | PreparedTable;
126
+ } | {
127
+ /** The function that returns the rows of the range in view */
128
+ provider: DatasetProvider;
129
+ } | {
130
+ /** No rows yet: they are given later with `setRows` or `setTable` */
131
+ rows?: undefined;
132
+ /** No table yet */
133
+ table?: undefined;
134
+ /** No provider */
135
+ provider?: undefined;
136
+ });
137
+ /**
138
+ * Large data drawn on the map and not edited; it is not part of the document.
139
+ */
140
+ export interface Dataset {
141
+ /** The ID */
142
+ readonly id: string;
143
+ /** Where it is stacked */
144
+ readonly order: DatasetOrder;
145
+ /** Whether the rows can be clicked and snapped to */
146
+ readonly interactive: boolean;
147
+ /** Whether it is visible */
148
+ readonly visible: boolean;
149
+ /** Shows or hides the dataset. */
150
+ setVisible(visible: boolean): void;
151
+ /** Replaces every row. */
152
+ setRows(rows: readonly DatasetRow[]): void;
153
+ /** Replaces every row with a table. */
154
+ setTable(table: Table | PreparedTable): void;
155
+ /** Replaces the style rule; `undefined` removes it. */
156
+ setStyleRule(rule: StyleRule | undefined): void;
157
+ /**
158
+ * The style rule, or `undefined` when none is set: the rule last given to `setStyleRule`, or
159
+ * the one given to `datasets.add` when it was not replaced.
160
+ */
161
+ getStyleRule(): StyleRule | undefined;
162
+ /** Replaces the scale factor and the opacity by zoom; `null` removes them. */
163
+ setZoomScale(zoomScale: DatasetZoomScale | null): void;
164
+ /** The scale factor and the opacity by zoom, or `null` when none is set. */
165
+ getZoomScale(): DatasetZoomScale | null;
166
+ /** Replaces the default look; `undefined` removes it. */
167
+ setBaseStyle(style: DatasetBaseStyle | undefined): void;
168
+ /** Replaces the function that picks the point rows another renderer draws. */
169
+ setExternalPointRender(predicate: ((row: DatasetRow) => boolean) | undefined): void;
170
+ /** The default look, or `undefined` when none is set. */
171
+ getBaseStyle(): DatasetBaseStyle | undefined;
172
+ /** Every row, in drawing order, without the rule colors and the default look. */
173
+ listRows(): DatasetRow[];
174
+ /** The rows whose extent meets the range, with the rule colors and the default look. */
175
+ listVisibleRows(bbox: BBox): DatasetRow[];
176
+ /** The indexes of the rows drawn now whose extent meets the range, in ascending order. */
177
+ listDrawnRows(bbox: BBox): Int32Array;
178
+ /** Reads a row as a GeoJSON feature; `undefined` when there is no such row. */
179
+ getRow(index: number): DatasetRow | undefined;
180
+ /** The ID of a row, or `null` when there is no such row or it has no ID. */
181
+ getRowId(index: number): string | null;
182
+ /** The type of the geometry of a row, or `null` when there is no such row. */
183
+ getRowType(index: number): FeatureType | null;
184
+ /** The extent of a row, or `null` when there is no such row or it has no geometry. */
185
+ getRowBounds(index: number): BBox | null;
186
+ /** The position of a point row, or `null` when the row is not a point. */
187
+ getRowPoint(index: number): Position | null;
188
+ /** The index of the row with this ID, or `null` when there is none. */
189
+ findRow(id: string): number | null;
190
+ /** Replaces the IDs of the selected rows. */
191
+ setSelectedRowIds(ids: readonly string[]): void;
192
+ /** The IDs of the selected rows. */
193
+ getSelectedRowIds(): string[];
194
+ /** Replaces the thinning of overlapping points; `null` turns it off. */
195
+ setCollisionThinning(options: DatasetCollisionThinning | null): void;
196
+ /** The thinning in effect with every default filled in, or `null` when it is off. */
197
+ getCollisionThinning(): Required<DatasetCollisionThinning> | null;
198
+ /** The IDs of the rows the thinning draws, or `null` when it thins nothing. */
199
+ listVisibleRowIds(): ReadonlySet<string> | null;
200
+ /** What the thinning is doing now. */
201
+ getThinningStats(): DatasetThinningStats;
202
+ /** A number that changes whenever the rows drawn change. */
203
+ getDrawnRowsRevision(): number;
204
+ /** Fetches the rows of the provider again on the next move of the map. */
205
+ refresh(): void;
206
+ /** Subscribes to an event of this dataset and returns the function that unsubscribes. */
207
+ on<K extends keyof DatasetEvents>(event: K, listener: (payload: DatasetEvents[K]) => void): () => void;
208
+ /** Unsubscribes from an event of this dataset. */
209
+ off<K extends keyof DatasetEvents>(event: K, listener: (payload: DatasetEvents[K]) => void): void;
210
+ }
211
+ /**
212
+ * The datasets on the map, in stacking order.
213
+ */
214
+ export interface DatasetsCollection {
215
+ /**
216
+ * Gets a dataset by ID.
217
+ *
218
+ * @returns The dataset, or `undefined` when there is none with this ID
219
+ */
220
+ get(id: string): Dataset | undefined;
221
+ /** Lists the datasets in stacking order. */
222
+ list(): Dataset[];
223
+ /** Counts the datasets. */
224
+ count(): number;
225
+ /** Whether a dataset with this ID exists. */
226
+ has(id: string): boolean;
227
+ /**
228
+ * Adds a dataset and returns it.
229
+ *
230
+ * @throws `DrawError` with the code `already-exists` when the ID is taken, or
231
+ * `invalid-input` when the options are wrong
232
+ */
233
+ add(options: DatasetOptions): Dataset;
234
+ /**
235
+ * Adds several datasets in one transaction, all of them or none, and returns them.
236
+ *
237
+ * @throws `DrawError` as {@link DatasetsCollection.add} does, for any of the options;
238
+ * nothing is added then
239
+ */
240
+ addMany(options: readonly DatasetOptions[]): Dataset[];
241
+ /**
242
+ * Removes a dataset.
243
+ *
244
+ * @returns True when it was removed
245
+ * @throws `DrawError` with the code `not-found` when there is no dataset with this ID
246
+ */
247
+ remove(id: string): boolean;
248
+ /**
249
+ * Removes several datasets in one transaction: all of them or none.
250
+ *
251
+ * @returns True when they were removed
252
+ * @throws `DrawError` with the code `not-found` when one of the IDs does not exist; nothing
253
+ * is removed then
254
+ */
255
+ removeMany(ids: readonly string[]): boolean;
256
+ /**
257
+ * Moves a dataset in the stacking order.
258
+ *
259
+ * @returns True when it moved
260
+ * @throws `DrawError` with the code `not-found` when there is no dataset with this ID
261
+ */
262
+ move(id: string, placement: DatasetPlacement): boolean;
263
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * `draw.document`: the whole document, to load and to write out
3
+ */
4
+ import type { FeatureCollection } from 'geojson';
5
+ import type { DrawDocument, LoadOptions, LoadResult, LoadSource } from './model.js';
6
+ /**
7
+ * The whole document: features, layers, groups and metadata.
8
+ */
9
+ export interface DocumentResource {
10
+ /**
11
+ * Reads a file, a JSON string, a document of the library or GeoJSON.
12
+ *
13
+ * `options.mode` decides whether the document is replaced or the features are added; it is
14
+ * `replace` for a document of the library and `merge` for GeoJSON when it is left out.
15
+ *
16
+ * The source is read (and an image decoded) first; then every write is one transaction with
17
+ * the source `load`, whatever the format: one `document.changed` and one notification of the
18
+ * Store, one step for a subscriber that records changes. A load that fails writes nothing.
19
+ * The layer of `options.layer` and the group of `options.group` are created in that
20
+ * transaction too.
21
+ *
22
+ * @returns What was read, or `null` when the document is read-only
23
+ * @throws `DrawError` (the promise rejects; every failure is a `DrawError`) with the code
24
+ * `unsupported-format` when the source cannot be read (text that is not JSON, data that is
25
+ * neither a document of the library nor GeoJSON, an image file that cannot be decoded), or
26
+ * `invalid-input` when the document is not valid (a document of the library that breaks
27
+ * its format, an embedded image that is broken, an image without `coordinate`, `layer`
28
+ * with `layerId`, `layer` or `group` with a document of the library), `not-found` for a
29
+ * `layerId` the document does not have, or `already-exists` for an ID of `layer` or
30
+ * `group` that is taken
31
+ */
32
+ load(source: LoadSource, options?: LoadOptions): Promise<LoadResult | null>;
33
+ /**
34
+ * Reads several sources and writes all of them in one transaction with the source `load`:
35
+ * one `document.changed` and one notification of the Store, so that an import of several
36
+ * files is one step to undo and one change to send. Every source is read first, in order; the
37
+ * writes then follow in the same order, each as `load` would write it, against the document
38
+ * the earlier items left (a document of the library replaces what the earlier items wrote).
39
+ * `document.loaded` arrives once per item, after the writes.
40
+ *
41
+ * An item may name with `layerId` a layer that an earlier item creates with `layer`, so the
42
+ * items can fill one new layer and a group of it. A layer named by `layerId` that an earlier
43
+ * item removed is replaced with the active layer. With `layer` and `group` in the options of
44
+ * the items, an import of one layer per file and one group per folder is still one
45
+ * transaction.
46
+ *
47
+ * @param items - The sources, each with the options `load` takes
48
+ * @returns What was read from each item, in the order of the items, or `null` when the
49
+ * document is read-only
50
+ * @throws `DrawError` (the promise rejects) as `load` does, for the first item that cannot
51
+ * be read (`not-found` for a `layerId` that neither the document nor an earlier item has);
52
+ * nothing is written then. `invalid-input` when `items` is not an array of objects
53
+ * with a `source`
54
+ */
55
+ loadMany(items: readonly {
56
+ source: LoadSource;
57
+ options?: LoadOptions;
58
+ }[]): Promise<LoadResult[] | null>;
59
+ /** The whole document in the format of the library. */
60
+ toJSON(): DrawDocument;
61
+ /**
62
+ * The whole document as GeoJSON. The values of the library are kept in `properties` under
63
+ * the prefixed keys.
64
+ */
65
+ toGeoJSON(): FeatureCollection;
66
+ }
@@ -0,0 +1,137 @@
1
+ /**
2
+ * `Draw`: the draw instance, its resources and the members that belong to no resource
3
+ */
4
+ import type { Map as MaplibreMap } from 'maplibre-gl';
5
+ import type { DatasetsCollection } from './datasets.js';
6
+ import type { DocumentResource } from './document.js';
7
+ import type { DrawingResource } from './drawing.js';
8
+ import type { DrawEvents } from './events.js';
9
+ import type { StoreView, UpdateSource } from './extension/store.js';
10
+ import type { ExtensionsCollections } from './extensions.js';
11
+ import type { FeaturesCollection } from './features.js';
12
+ import type { GroupsCollection } from './groups.js';
13
+ import type { HiddenCollection } from './hidden.js';
14
+ import type { LayersCollection } from './layers.js';
15
+ import type { MetadataResource } from './metadata.js';
16
+ import type { DrawOptions, OptionsResource } from './options.js';
17
+ import type { SelectionResource, VertexSelectionResource } from './selection.js';
18
+ import type { LayerStackEntry, Mode, TerrainDiagnostics } from './state.js';
19
+ /** The options of {@link Draw.transact} */
20
+ export interface TransactOptions {
21
+ /** Where the writes come from; `'local'` when left out */
22
+ source?: UpdateSource;
23
+ /**
24
+ * Whether the writes ignore the locks of the features, groups and layers; read-only still
25
+ * refuses them. False when left out.
26
+ */
27
+ ignoreLocks?: boolean;
28
+ }
29
+ /**
30
+ * A draw instance on a map: the collections and resources of the document and of this
31
+ * client, and the members that belong to no resource.
32
+ */
33
+ export interface Draw {
34
+ /** The features of the document */
35
+ readonly features: FeaturesCollection;
36
+ /** The layers of the document */
37
+ readonly layers: LayersCollection;
38
+ /** The groups of the document */
39
+ readonly groups: GroupsCollection;
40
+ /** The large data that is drawn but not edited, outside the document */
41
+ readonly datasets: DatasetsCollection;
42
+ /** What this client hides without changing the document */
43
+ readonly hidden: HiddenCollection;
44
+ /** What this client has selected */
45
+ readonly selection: SelectionResource;
46
+ /** The selected vertices of one feature in this client */
47
+ readonly vertexSelection: VertexSelectionResource;
48
+ /** The shape the current drawing mode is drawing, to drive it from code */
49
+ readonly drawing: DrawingResource;
50
+ /** The title and the description of the document */
51
+ readonly metadata: MetadataResource;
52
+ /** The options that can change while the instance runs */
53
+ readonly options: OptionsResource;
54
+ /** The whole document, to load and to write out */
55
+ readonly document: DocumentResource;
56
+ /** The plugins, modes, feature types, overlays and providers */
57
+ readonly extensions: ExtensionsCollections;
58
+ /** The map the instance draws on. */
59
+ getMap(): MaplibreMap;
60
+ /** The Store, to read the document and the state and to subscribe to their changes. */
61
+ getStore(): StoreView;
62
+ /** The current mode. */
63
+ getMode(): Mode;
64
+ /**
65
+ * Changes the mode.
66
+ *
67
+ * @returns False when the mode cannot be entered now
68
+ * @throws `DrawError` with the code `not-found` when there is no mode with this name
69
+ */
70
+ setMode(mode: Mode): boolean;
71
+ /** Whether the document is read-only. */
72
+ isReadOnly(): boolean;
73
+ /** Turns read-only on or off. */
74
+ setReadOnly(value: boolean): void;
75
+ /** Whether the interaction lock is on. */
76
+ isInteractionLocked(): boolean;
77
+ /** Turns the interaction lock on or off. */
78
+ setInteractionLocked(value: boolean): void;
79
+ /**
80
+ * Runs `fn` as one transaction: its writes arrive as one `document.changed`.
81
+ *
82
+ * In nested calls the source of the outermost call wins. With `ignoreLocks`, the writes of
83
+ * `fn` through the resources of this instance ignore the locks of the features, groups and
84
+ * layers, as a change applied again from a record needs; read-only still refuses them, and
85
+ * what the user does with the pointer and the keys still respects the locks. A nested call
86
+ * inside such a call ignores them as well.
87
+ *
88
+ * @param options - `source` names where the writes come from; `ignoreLocks` lets them
89
+ * change locked features, groups and layers
90
+ * @returns What `fn` returns
91
+ */
92
+ transact<T>(fn: () => T, options?: TransactOptions): T;
93
+ /**
94
+ * Subscribes to an event.
95
+ *
96
+ * @returns The function that unsubscribes
97
+ */
98
+ on<K extends keyof DrawEvents>(event: K, listener: (payload: DrawEvents[K]) => void): () => void;
99
+ /** Unsubscribes from an event. */
100
+ off<K extends keyof DrawEvents>(event: K, listener: (payload: DrawEvents[K]) => void): void;
101
+ /**
102
+ * Subscribes to the next occurrence of an event only.
103
+ *
104
+ * @returns The function that unsubscribes before it occurs
105
+ */
106
+ once<K extends keyof DrawEvents>(event: K, listener: (payload: DrawEvents[K]) => void): () => void;
107
+ /** Whether some drawing work has not finished yet. */
108
+ hasPendingWork(): boolean;
109
+ /** The divisions of the stacking order, one per run of layers. */
110
+ getLayerStack(): readonly LayerStackEntry[];
111
+ /** Diagnostics; their fields follow the drawing and carry a weaker promise. */
112
+ readonly debug: {
113
+ /** The state the terrain was drawn with. */
114
+ terrain(): TerrainDiagnostics;
115
+ };
116
+ /**
117
+ * Removes the instance from the map and releases everything it holds. A second call does
118
+ * nothing; every other method of the instance and of its collections then throws `DrawError`
119
+ * with the code `invalid-state` (`document.load` rejects with it).
120
+ */
121
+ destroy(): void;
122
+ }
123
+ /**
124
+ * Puts a draw instance on a map and returns it.
125
+ *
126
+ * It can be called before, while or after the map loads. The layers are added on top of the map
127
+ * as soon as the style accepts them. After `setStyle`, with or without `diff`, they are on top
128
+ * again: added again after a full replacement, and moved above the layers of the new style after
129
+ * a diff. A layer added to the map later goes above them and stays there until the style changes.
130
+ * Unless `initDefaultLayer: false` is given, the document starts with one empty layer. Several
131
+ * instances can share a page, each on its own map.
132
+ *
133
+ * @param map - The map to draw on
134
+ * @param options - The options; every one can be omitted
135
+ * @returns The draw instance
136
+ */
137
+ export declare function createDraw(map: MaplibreMap, options?: DrawOptions): Draw;
@@ -0,0 +1,20 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { createDraw as createDrawInstance } from './impl/create-draw.js';
4
+ /**
5
+ * Puts a draw instance on a map and returns it.
6
+ *
7
+ * It can be called before, while or after the map loads. The layers are added on top of the map
8
+ * as soon as the style accepts them. After `setStyle`, with or without `diff`, they are on top
9
+ * again: added again after a full replacement, and moved above the layers of the new style after
10
+ * a diff. A layer added to the map later goes above them and stays there until the style changes.
11
+ * Unless `initDefaultLayer: false` is given, the document starts with one empty layer. Several
12
+ * instances can share a page, each on its own map.
13
+ *
14
+ * @param map - The map to draw on
15
+ * @param options - The options; every one can be omitted
16
+ * @returns The draw instance
17
+ */
18
+ export function createDraw(map, options) {
19
+ return createDrawInstance(map, options);
20
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * `draw.drawing`: the shape the current drawing mode is drawing, driven from outside the
3
+ * pointer and the keys
4
+ */
5
+ import type { Position } from 'geojson';
6
+ /**
7
+ * The shape the current drawing mode is drawing, driven from code: to draw from typed
8
+ * coordinates, from another input device, or in an automated run.
9
+ *
10
+ * `addVertex`, `moveTo` and `finish` act as the input they stand for would: they are made into
11
+ * the same pointer and key events the map gives, at the point of the screen the position
12
+ * projects to, and go the same way as that input, through the `input` receivers of the plugins
13
+ * first and then to the mode. The position is used as it is: nothing snaps it, and the event
14
+ * carries it as its snapped position. A mode that ignores clicks, or a plugin that consumes
15
+ * them, ignores or consumes these as well.
16
+ *
17
+ * Extensions reach the same object as `ctx.drawing`.
18
+ */
19
+ export interface DrawingResource {
20
+ /**
21
+ * Whether a drawing mode is drawing: a shape is in progress, or the mode is ready to place its
22
+ * first vertex (the current mode writes features).
23
+ */
24
+ isActive(): boolean;
25
+ /**
26
+ * Whether a shape is in progress: the mode shows a shape that is not created yet. False
27
+ * while a drawing mode waits for its first vertex.
28
+ */
29
+ isDrawing(): boolean;
30
+ /**
31
+ * Places a vertex at a position, as a click there would: the pointer moves there, then
32
+ * clicks. It does not snap. What the click does is up to the mode: the point mode creates the
33
+ * point, and a click on the closing vertex of a line or an area finishes it. The position is
34
+ * exact, so the click tolerance of the pointer (10 px) does not apply: a vertex a few pixels
35
+ * from the last one is placed, and one near the closing vertex does not finish the shape.
36
+ * Only a position exactly equal to the closing vertex (the last vertex of a line, the first
37
+ * of an area) finishes it, and one exactly equal to the last vertex of an area is not placed
38
+ * again.
39
+ *
40
+ * @param position - The position, as `[longitude, latitude]` in degrees
41
+ * @returns True when the mode (or a plugin) took the click; false when no drawing mode is
42
+ * active or nothing took it
43
+ * @throws `DrawError` with the code `invalid-input` when the position is not two finite
44
+ * numbers
45
+ */
46
+ addVertex(position: Position): boolean;
47
+ /**
48
+ * Moves the pointer to a position, as a pointer move there would: the preview of the shape
49
+ * follows it. It does not snap, and, as with `addVertex`, the position is exact. It does
50
+ * nothing when no drawing mode is active.
51
+ *
52
+ * @param position - The position, as `[longitude, latitude]` in degrees
53
+ * @throws `DrawError` with the code `invalid-input` when the position is not two finite
54
+ * numbers
55
+ */
56
+ moveTo(position: Position): void;
57
+ /**
58
+ * Completes the shape in progress, as a double click on its last vertex or Enter would: the
59
+ * mode creates the feature from the vertices placed so far, as soon as there are enough of
60
+ * them (2 for a line, 3 for an area), wherever the last one is.
61
+ *
62
+ * @returns True when the shape was completed; false when no shape is in progress, or the mode
63
+ * did not complete it (too few vertices)
64
+ */
65
+ finish(): boolean;
66
+ /**
67
+ * Cancels the shape in progress, as an Escape does while drawing: the mode drops it
68
+ * (`ModeHandler.onCancel`), the preview is cleared and the mode stays the current one. When
69
+ * no shape is in progress it does nothing; unlike an Escape, it does not leave the mode.
70
+ *
71
+ * @returns True when a shape was in progress and was cancelled
72
+ */
73
+ cancel(): boolean;
74
+ /**
75
+ * Removes the last vertex of the shape in progress.
76
+ *
77
+ * @returns True when a vertex was removed; false when nothing is being drawn or the mode has
78
+ * no vertex to remove
79
+ */
80
+ undoVertex(): boolean;
81
+ /**
82
+ * Puts back the vertex the last `undoVertex` removed.
83
+ *
84
+ * @returns True when a vertex was put back
85
+ */
86
+ redoVertex(): boolean;
87
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The error thrown for a wrong argument
3
+ *
4
+ * A method throws it when an argument is wrong (an ID that does not exist, an input of the
5
+ * wrong shape) and changes nothing. A refusal because of the state (read-only, a lock) is not
6
+ * an error: the method returns `null` or `false` instead.
7
+ */
8
+ /**
9
+ * Why a {@link DrawError} was thrown.
10
+ *
11
+ * - `not-found`: an ID that does not exist
12
+ * - `already-exists`: an ID that is already taken
13
+ * - `invalid-input`: an input of the wrong shape or value
14
+ * - `unsupported-format`: a source that cannot be read
15
+ * - `invalid-state`: a call that is not possible in the current situation, such as deleting
16
+ * a feature while it is being drawn, or any call on an instance that was destroyed
17
+ */
18
+ export type DrawErrorCode = 'not-found' | 'already-exists' | 'invalid-input' | 'unsupported-format' | 'invalid-state';
19
+ /**
20
+ * The error a method throws when an argument is wrong; the method has changed nothing.
21
+ */
22
+ export declare class DrawError extends Error {
23
+ /** Why it was thrown */
24
+ readonly code: DrawErrorCode;
25
+ /** More about the cause, such as the ID that was not found */
26
+ readonly details?: unknown;
27
+ /**
28
+ * Creates the error
29
+ *
30
+ * @param code - Why it is thrown
31
+ * @param message - A description in English, for logs
32
+ * @param details - More about the cause
33
+ */
34
+ constructor(code: DrawErrorCode, message: string, details?: unknown);
35
+ }
@@ -0,0 +1,35 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * The error a method throws when an argument is wrong; the method has changed nothing.
5
+ */
6
+ export class DrawError extends Error {
7
+ /**
8
+ * Creates the error
9
+ *
10
+ * @param code - Why it is thrown
11
+ * @param message - A description in English, for logs
12
+ * @param details - More about the cause
13
+ */
14
+ constructor(code, message, details) {
15
+ super(message);
16
+ /** Why it was thrown */
17
+ Object.defineProperty(this, "code", {
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ value: void 0
22
+ });
23
+ /** More about the cause, such as the ID that was not found */
24
+ Object.defineProperty(this, "details", {
25
+ enumerable: true,
26
+ configurable: true,
27
+ writable: true,
28
+ value: void 0
29
+ });
30
+ this.name = 'DrawError';
31
+ this.code = code;
32
+ if (details !== undefined)
33
+ this.details = details;
34
+ }
35
+ }