@sakuzu/maplibre-gl-draw 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/CHANGELOG.md +1016 -2
  2. package/README.ja.md +39 -19
  3. package/README.md +41 -21
  4. package/dist/api/datasets.d.ts +258 -0
  5. package/dist/api/document.d.ts +66 -0
  6. package/dist/api/draw.d.ts +135 -0
  7. package/dist/api/draw.js +18 -0
  8. package/dist/api/drawing.d.ts +87 -0
  9. package/dist/api/errors.d.ts +35 -0
  10. package/dist/api/errors.js +35 -0
  11. package/dist/api/events.d.ts +306 -0
  12. package/dist/api/extension/context.d.ts +247 -0
  13. package/dist/api/extension/feature-type.d.ts +129 -0
  14. package/dist/api/extension/mode.d.ts +123 -0
  15. package/dist/api/extension/plugin.d.ts +51 -0
  16. package/dist/api/extension/plugin.js +3 -0
  17. package/dist/api/extension/provider.d.ts +119 -0
  18. package/dist/api/extension/provider.js +3 -0
  19. package/dist/api/extension/render.d.ts +176 -0
  20. package/dist/api/extension/render.js +3 -0
  21. package/dist/api/extension/store.d.ts +190 -0
  22. package/dist/api/extension/store.js +3 -0
  23. package/dist/api/extensions.d.ts +306 -0
  24. package/dist/api/extensions.js +3 -0
  25. package/dist/api/features.d.ts +188 -0
  26. package/dist/api/features.js +3 -0
  27. package/dist/api/groups.d.ts +111 -0
  28. package/dist/api/groups.js +3 -0
  29. package/dist/api/hidden.d.ts +45 -0
  30. package/dist/api/hidden.js +3 -0
  31. package/dist/api/impl/adapters.js +463 -0
  32. package/dist/api/impl/contexts.js +466 -0
  33. package/dist/api/impl/create-draw.js +124 -0
  34. package/dist/api/impl/datasets.js +404 -0
  35. package/dist/api/impl/destroy-guard.js +74 -0
  36. package/dist/api/impl/document.js +280 -0
  37. package/dist/api/impl/drawing.js +180 -0
  38. package/dist/api/impl/engine-context.d.ts +7 -0
  39. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  40. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  41. package/dist/api/impl/events.js +422 -0
  42. package/dist/api/impl/extension-host.js +361 -0
  43. package/dist/api/impl/extensions.js +229 -0
  44. package/dist/api/impl/features.js +445 -0
  45. package/dist/api/impl/geometry/apply.d.ts +32 -0
  46. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  47. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  48. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  49. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  50. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  51. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  52. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  53. package/dist/api/impl/geometry/types.js +3 -0
  54. package/dist/api/impl/groups.d.ts +3 -0
  55. package/dist/api/impl/groups.js +268 -0
  56. package/dist/api/impl/hidden.js +60 -0
  57. package/dist/api/impl/import-export/constants.d.ts +22 -0
  58. package/dist/api/impl/import-export/constants.js +24 -0
  59. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  60. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  61. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  62. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  63. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  64. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  66. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  68. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  69. package/dist/api/impl/import-export/image-import.js +73 -0
  70. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  71. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  72. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  73. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  74. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  75. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  76. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  77. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  78. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  79. package/dist/api/impl/import-export/style-validation.js +86 -0
  80. package/dist/api/impl/import-export/types.d.ts +52 -0
  81. package/dist/api/impl/import-export/types.js +3 -0
  82. package/dist/api/impl/input.js +180 -0
  83. package/dist/api/impl/layers.js +307 -0
  84. package/dist/api/impl/metadata.d.ts +1 -0
  85. package/dist/api/impl/metadata.js +22 -0
  86. package/dist/api/impl/options.d.ts +1 -0
  87. package/dist/api/impl/options.js +822 -0
  88. package/dist/api/impl/placement.d.ts +1 -0
  89. package/dist/api/impl/placement.js +138 -0
  90. package/dist/api/impl/render-context.d.ts +13 -0
  91. package/dist/api/impl/render-context.js +272 -0
  92. package/dist/api/impl/rows.d.ts +1 -0
  93. package/dist/api/impl/rows.js +46 -0
  94. package/dist/api/impl/selection.d.ts +1 -0
  95. package/dist/api/impl/selection.js +186 -0
  96. package/dist/api/impl/shared.d.ts +64 -0
  97. package/dist/api/impl/shared.js +178 -0
  98. package/dist/api/impl/validate-extension.d.ts +1 -0
  99. package/dist/api/impl/validate-extension.js +159 -0
  100. package/dist/api/layers.d.ts +130 -0
  101. package/dist/api/layers.js +3 -0
  102. package/dist/api/metadata.d.ts +18 -0
  103. package/dist/api/metadata.js +3 -0
  104. package/dist/api/model.d.ts +487 -0
  105. package/dist/api/model.js +47 -0
  106. package/dist/api/options.d.ts +466 -0
  107. package/dist/api/options.js +3 -0
  108. package/dist/api/selection.d.ts +94 -0
  109. package/dist/api/selection.js +3 -0
  110. package/dist/api/state.d.ts +155 -0
  111. package/dist/api/state.js +12 -0
  112. package/dist/{display → dataset}/chunk.d.ts +1 -1
  113. package/dist/{display → dataset}/chunk.js +4 -3
  114. package/dist/{display → dataset}/dataset.js +18 -21
  115. package/dist/dataset/interaction.d.ts +1 -0
  116. package/dist/{display → dataset}/interaction.js +18 -6
  117. package/dist/dataset/manager.d.ts +1 -0
  118. package/dist/dataset/provider.d.ts +1 -0
  119. package/dist/{display → dataset}/retained.d.ts +1 -1
  120. package/dist/{display → dataset}/retained.js +8 -7
  121. package/dist/dataset/source.d.ts +1 -0
  122. package/dist/{display → dataset}/source.js +17 -4
  123. package/dist/dataset/spatial.d.ts +1 -0
  124. package/dist/{display → dataset}/spatial.js +1 -1
  125. package/dist/dataset/style.d.ts +1 -0
  126. package/dist/{display → dataset}/style.js +1 -1
  127. package/dist/dataset/table-source.d.ts +1 -0
  128. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  129. package/dist/{display → dataset}/thinning.d.ts +0 -10
  130. package/dist/{display → dataset}/thinning.js +3 -2
  131. package/dist/dataset/triangulation.d.ts +1 -0
  132. package/dist/{display → dataset}/triangulation.js +0 -0
  133. package/dist/{display → dataset}/types.d.ts +82 -121
  134. package/dist/dataset/types.js +61 -0
  135. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  136. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  137. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  138. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  139. package/dist/dispatcher/hit-test/service.js +80 -16
  140. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  141. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  142. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  143. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  144. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  145. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  146. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  147. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  148. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  149. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  150. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  151. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  152. package/dist/dispatcher/input-router.js +152 -69
  153. package/dist/dispatcher/normalizer.js +6 -2
  154. package/dist/dispatcher/types.d.ts +6 -1
  155. package/dist/extension/feature-handler.d.ts +1 -182
  156. package/dist/extension/index.d.ts +4 -7
  157. package/dist/extension/renderers.d.ts +1 -208
  158. package/dist/geometry/angle.d.ts +0 -8
  159. package/dist/geometry/angle.js +0 -8
  160. package/dist/geometry/bbox.d.ts +4 -12
  161. package/dist/geometry/bbox.js +4 -12
  162. package/dist/geometry/boolean.d.ts +0 -51
  163. package/dist/geometry/boolean.js +0 -51
  164. package/dist/geometry/buffer.d.ts +0 -26
  165. package/dist/geometry/buffer.js +0 -26
  166. package/dist/geometry/circle.d.ts +0 -9
  167. package/dist/geometry/circle.js +0 -9
  168. package/dist/geometry/coords.d.ts +0 -16
  169. package/dist/geometry/coords.js +0 -16
  170. package/dist/geometry/distance.d.ts +0 -24
  171. package/dist/geometry/distance.js +0 -24
  172. package/dist/geometry/errors.d.ts +21 -36
  173. package/dist/geometry/errors.js +49 -29
  174. package/dist/geometry/geojson.d.ts +81 -0
  175. package/dist/geometry/geojson.js +164 -0
  176. package/dist/geometry/index.d.ts +38 -23
  177. package/dist/geometry/index.js +43 -31
  178. package/dist/geometry/measure.d.ts +0 -27
  179. package/dist/geometry/measure.js +0 -27
  180. package/dist/geometry/predicates.d.ts +0 -9
  181. package/dist/geometry/predicates.js +0 -9
  182. package/dist/geometry/public-bounds.d.ts +26 -0
  183. package/dist/geometry/public-bounds.js +30 -0
  184. package/dist/geometry/public-combine.d.ts +78 -0
  185. package/dist/geometry/public-combine.js +82 -0
  186. package/dist/geometry/public-create.d.ts +54 -0
  187. package/dist/geometry/public-create.js +70 -0
  188. package/dist/geometry/public-measure.d.ts +170 -0
  189. package/dist/geometry/public-measure.js +283 -0
  190. package/dist/geometry/public-predicates.d.ts +54 -0
  191. package/dist/geometry/public-predicates.js +144 -0
  192. package/dist/geometry/public-repair.d.ts +75 -0
  193. package/dist/geometry/public-repair.js +77 -0
  194. package/dist/geometry/simplify.d.ts +0 -7
  195. package/dist/geometry/simplify.js +0 -7
  196. package/dist/geometry/split.d.ts +0 -20
  197. package/dist/geometry/split.js +0 -20
  198. package/dist/geometry/units.d.ts +20 -12
  199. package/dist/geometry/units.js +20 -12
  200. package/dist/index.d.ts +52 -66
  201. package/dist/index.js +6 -18
  202. package/dist/messages.d.ts +7 -7
  203. package/dist/modes/draw/circle.js +83 -207
  204. package/dist/modes/draw/commit-layer.d.ts +5 -16
  205. package/dist/modes/draw/commit-layer.js +2 -13
  206. package/dist/modes/draw/freehand.js +108 -246
  207. package/dist/modes/draw/image.js +4 -2
  208. package/dist/modes/draw/index.d.ts +5 -5
  209. package/dist/modes/draw/index.js +5 -5
  210. package/dist/modes/draw/line.js +18 -354
  211. package/dist/modes/draw/point.js +29 -78
  212. package/dist/modes/draw/polygon.js +23 -368
  213. package/dist/modes/draw/trace-support.d.ts +43 -36
  214. package/dist/modes/draw/trace-support.js +95 -98
  215. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  216. package/dist/modes/draw/vertex-drawing.js +176 -0
  217. package/dist/modes/handler.d.ts +1 -285
  218. package/dist/modes/manager.d.ts +2 -2
  219. package/dist/modes/manager.js +3 -0
  220. package/dist/modes/select/box-selection.d.ts +3 -3
  221. package/dist/modes/select/box-selection.js +2 -1
  222. package/dist/modes/select/click-handler.d.ts +5 -5
  223. package/dist/modes/select/click-handler.js +22 -20
  224. package/dist/modes/select/cursor-handler.d.ts +2 -2
  225. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  226. package/dist/modes/select/drag/move.js +3 -3
  227. package/dist/modes/select/drag/operation.d.ts +3 -3
  228. package/dist/modes/select/drag/radius.js +5 -4
  229. package/dist/modes/select/drag/transform.d.ts +2 -2
  230. package/dist/modes/select/drag/transform.js +11 -5
  231. package/dist/modes/select/drag/vertex.d.ts +2 -2
  232. package/dist/modes/select/drag/vertex.js +13 -8
  233. package/dist/modes/select/drag-handler.js +44 -25
  234. package/dist/modes/select/mode.js +17 -17
  235. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  236. package/dist/modes/select/shortcut-handler.js +9 -7
  237. package/dist/operations/layer-operations.js +29 -168
  238. package/dist/operations/resize.d.ts +2 -2
  239. package/dist/operations/resize.js +5 -5
  240. package/dist/operations/rotate.js +5 -5
  241. package/dist/operations/selection-operations.d.ts +16 -1
  242. package/dist/operations/selection-operations.js +28 -13
  243. package/dist/operations/shared-vertex.js +4 -2
  244. package/dist/operations/trace-graph.d.ts +0 -18
  245. package/dist/operations/trace-graph.js +0 -18
  246. package/dist/operations/vertex.js +36 -35
  247. package/dist/shared/color.d.ts +1 -0
  248. package/dist/shared/color.js +245 -0
  249. package/dist/shared/config/constants.d.ts +1 -54
  250. package/dist/shared/config/constants.js +1 -58
  251. package/dist/shared/config/feature-style.d.ts +16 -13
  252. package/dist/shared/config/feature-style.js +9 -0
  253. package/dist/shared/config/rendering.d.ts +3 -3
  254. package/dist/shared/config/selection-highlight.d.ts +0 -15
  255. package/dist/shared/config/selection-highlight.js +4 -7
  256. package/dist/shared/config/selection.d.ts +2 -32
  257. package/dist/shared/config/selection.js +0 -18
  258. package/dist/shared/config/topology.d.ts +2 -2
  259. package/dist/shared/config/trace.d.ts +4 -4
  260. package/dist/shared/math/angle.d.ts +1 -1
  261. package/dist/shared/math/angle.js +1 -1
  262. package/dist/shared/math/circle.d.ts +1 -1
  263. package/dist/shared/math/circle.js +1 -1
  264. package/dist/shared/math/distance.d.ts +2 -1
  265. package/dist/shared/math/distance.js +3 -2
  266. package/dist/shared/math/index.d.ts +1 -1
  267. package/dist/shared/math/index.js +1 -1
  268. package/dist/shared/math/transform.d.ts +23 -0
  269. package/dist/shared/math/transform.js +47 -28
  270. package/dist/shared/properties.d.ts +18 -0
  271. package/dist/shared/properties.js +129 -0
  272. package/dist/shared/types/events.d.ts +15 -7
  273. package/dist/shared/types/model.d.ts +109 -159
  274. package/dist/shared/types/style.d.ts +1 -1
  275. package/dist/shared/utils/color.d.ts +2 -36
  276. package/dist/shared/utils/color.js +13 -70
  277. package/dist/shared/utils/coordinates.d.ts +30 -4
  278. package/dist/shared/utils/coordinates.js +56 -10
  279. package/dist/shared/utils/event-emitter.d.ts +1 -262
  280. package/dist/shared/utils/event-emitter.js +4 -3
  281. package/dist/shared/utils/feature-bbox.js +8 -7
  282. package/dist/shared/utils/feature-segments.js +5 -4
  283. package/dist/shared/utils/image.d.ts +0 -4
  284. package/dist/shared/utils/image.js +0 -6
  285. package/dist/shared/utils/name-generator.d.ts +14 -20
  286. package/dist/shared/utils/name-generator.js +20 -3
  287. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  288. package/dist/shared/utils/pixel-ratio.js +13 -4
  289. package/dist/shared/utils/property.d.ts +7 -50
  290. package/dist/shared/utils/property.js +22 -87
  291. package/dist/snapping/custom-targets.js +21 -4
  292. package/dist/snapping/indicator.js +20 -11
  293. package/dist/snapping/providers/display.d.ts +6 -1
  294. package/dist/snapping/providers/display.js +2 -1
  295. package/dist/snapping/providers/guide.d.ts +3 -43
  296. package/dist/snapping/providers/guide.js +1 -44
  297. package/dist/snapping/providers/intersection.js +1 -1
  298. package/dist/snapping/providers/store.js +3 -3
  299. package/dist/snapping/service.js +18 -7
  300. package/dist/snapping/types.d.ts +9 -35
  301. package/dist/store/draw-store.js +233 -142
  302. package/dist/store/local-visibility.d.ts +11 -6
  303. package/dist/store/local-visibility.js +38 -7
  304. package/dist/store/lock.d.ts +0 -6
  305. package/dist/store/lock.js +0 -6
  306. package/dist/store/memory/change-bus.d.ts +3 -3
  307. package/dist/store/memory/change-bus.js +12 -0
  308. package/dist/store/memory/file-store.d.ts +2 -2
  309. package/dist/store/memory/ui-state.d.ts +1 -51
  310. package/dist/store/memory/ui-state.js +122 -134
  311. package/dist/store/memory.d.ts +1 -8
  312. package/dist/store/memory.js +249 -45
  313. package/dist/store/ordering.d.ts +9 -0
  314. package/dist/store/ordering.js +17 -0
  315. package/dist/store/spatial/spatial-index.d.ts +1 -1
  316. package/dist/store/spatial/spatial-index.js +1 -1
  317. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  318. package/dist/store/spatial/store-spatial-index.js +9 -3
  319. package/dist/store/store.d.ts +66 -107
  320. package/dist/store/types.d.ts +1 -1
  321. package/dist/store/writable-layer.d.ts +1 -1
  322. package/dist/store/writable-layer.js +2 -2
  323. package/dist/table/builder.d.ts +83 -0
  324. package/dist/table/builder.js +381 -0
  325. package/dist/table/index.d.ts +37 -0
  326. package/dist/table/index.js +5 -0
  327. package/dist/table/packed-rtree.d.ts +1 -0
  328. package/dist/{display → table}/packed-rtree.js +1 -1
  329. package/dist/table/partition.d.ts +1 -0
  330. package/dist/{display → table}/partition.js +3 -3
  331. package/dist/table/prepare.d.ts +44 -0
  332. package/dist/table/prepare.js +136 -0
  333. package/dist/table/table.d.ts +1 -0
  334. package/dist/{display/columnar → table}/table.js +29 -25
  335. package/dist/{display/columnar → table}/types.d.ts +68 -72
  336. package/dist/table/types.js +3 -0
  337. package/dist/view/coordinator.js +4 -3
  338. package/dist/view/feature-companion.d.ts +13 -7
  339. package/dist/view/feature-companion.js +11 -3
  340. package/dist/view/globe-subdivision.js +3 -3
  341. package/dist/view/layer/attach.d.ts +1 -1
  342. package/dist/view/layer/attach.js +1 -1
  343. package/dist/view/layer/custom-layer.js +40 -11
  344. package/dist/view/layer/display-list.js +2 -1
  345. package/dist/view/layer/drape-planner.d.ts +2 -2
  346. package/dist/view/layer/frame-render.d.ts +3 -3
  347. package/dist/view/layer/frame-render.js +7 -2
  348. package/dist/view/layer/frame-state.d.ts +6 -6
  349. package/dist/view/layer/index.d.ts +2 -2
  350. package/dist/view/layer/index.js +1 -1
  351. package/dist/view/layer/render.d.ts +4 -4
  352. package/dist/view/layer/render.js +3 -8
  353. package/dist/view/layer/renderers.d.ts +2 -2
  354. package/dist/view/layer/renderers.js +1 -1
  355. package/dist/view/layer/slot-manager.d.ts +2 -2
  356. package/dist/view/layer/slot-manager.js +4 -4
  357. package/dist/view/layer/slots.d.ts +2 -2
  358. package/dist/view/layer/slots.js +1 -1
  359. package/dist/view/layer/store-retained-bbox.js +3 -2
  360. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  361. package/dist/view/layer/store-retained-classify.js +19 -7
  362. package/dist/view/layer/store-retained-collect.js +8 -7
  363. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  364. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  365. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  366. package/dist/view/layer/store-retained-immediate.js +3 -8
  367. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  368. package/dist/view/layer/store-retained.d.ts +2 -2
  369. package/dist/view/layer/store-retained.js +1 -1
  370. package/dist/view/renderers/batch-manager.js +8 -7
  371. package/dist/view/renderers/drawer.js +21 -15
  372. package/dist/view/renderers/image.js +13 -39
  373. package/dist/view/renderers/line/line-types.d.ts +3 -3
  374. package/dist/view/renderers/line/sdf-line.js +3 -1
  375. package/dist/view/renderers/point/billboard-depth.js +1 -1
  376. package/dist/view/renderers/point/point-instance.js +1 -1
  377. package/dist/view/renderers/point/point-shape.js +2 -2
  378. package/dist/view/renderers/point/point-style.js +48 -4
  379. package/dist/view/renderers/polygon/batch.js +1 -2
  380. package/dist/view/renderers/polygon/fill.js +3 -1
  381. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  382. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  383. package/dist/view/renderers/stroke.js +3 -1
  384. package/dist/view/shaders/helpers.d.ts +2 -42
  385. package/dist/view/shaders/helpers.js +0 -6
  386. package/dist/view/shaders/projection.d.ts +15 -7
  387. package/dist/view/shaders/projection.js +23 -6
  388. package/dist/view/shaders/quad.d.ts +16 -12
  389. package/dist/view/shaders/quad.js +34 -13
  390. package/dist/view/style-rule.d.ts +5 -42
  391. package/dist/view/style-rule.js +20 -44
  392. package/dist/view/terrain/binding.d.ts +1 -0
  393. package/dist/view/terrain/binding.js +29 -0
  394. package/dist/view/terrain/context.d.ts +3 -4
  395. package/dist/view/terrain/context.js +4 -5
  396. package/dist/view/terrain/drape/geometry.js +1 -1
  397. package/dist/view/terrain/drape/pass.d.ts +1 -1
  398. package/dist/view/terrain/drape/pass.js +8 -7
  399. package/dist/view/terrain/polygon.d.ts +9 -5
  400. package/dist/view/terrain/polygon.js +16 -2
  401. package/dist/view/terrain/state.d.ts +1 -1
  402. package/dist/view/terrain/state.js +1 -1
  403. package/dist/view/terrain/tessellation.d.ts +2 -2
  404. package/dist/view/terrain/tessellation.js +1 -1
  405. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  406. package/dist/view/ui/bounds.js +8 -12
  407. package/dist/view/ui/handle-test.js +2 -2
  408. package/dist/view/ui/handle-thinning.js +17 -17
  409. package/dist/view/ui/handles.js +21 -13
  410. package/dist/view/ui/helper.d.ts +1 -1
  411. package/dist/view/ui/helper.js +1 -1
  412. package/dist/view/ui/index.d.ts +1 -1
  413. package/dist/view/ui/selection-scope.js +4 -2
  414. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  415. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  416. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  417. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  418. package/dist/view/ui/selection-ui/index.js +1 -1
  419. package/dist/view/ui/selection-ui/renderer.js +15 -38
  420. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  421. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  422. package/dist/view/ui/selection-ui-drawer.js +63 -2
  423. package/dist/view/ui/tentative.js +1 -1
  424. package/dist/webgl/index.d.ts +65 -0
  425. package/dist/webgl/index.js +62 -0
  426. package/package.json +20 -9
  427. package/dist/api/api.d.ts +0 -1259
  428. package/dist/api/api.js +0 -86
  429. package/dist/api/context.d.ts +0 -173
  430. package/dist/api/display-api.js +0 -23
  431. package/dist/api/event-api.d.ts +0 -13
  432. package/dist/api/event-api.js +0 -17
  433. package/dist/api/extension-api.d.ts +0 -46
  434. package/dist/api/extension-api.js +0 -85
  435. package/dist/api/feature-api.d.ts +0 -11
  436. package/dist/api/feature-api.js +0 -101
  437. package/dist/api/geometry/apply.d.ts +0 -51
  438. package/dist/api/geometry/boolean.d.ts +0 -28
  439. package/dist/api/geometry/boolean.js +0 -65
  440. package/dist/api/geometry/types.d.ts +0 -31
  441. package/dist/api/geometry-operations.d.ts +0 -162
  442. package/dist/api/geometry-operations.js +0 -94
  443. package/dist/api/group-api.d.ts +0 -10
  444. package/dist/api/group-api.js +0 -78
  445. package/dist/api/import-export/constants.d.ts +0 -29
  446. package/dist/api/import-export/constants.js +0 -40
  447. package/dist/api/import-export/file-name.d.ts +0 -10
  448. package/dist/api/import-export/file-name.js +0 -20
  449. package/dist/api/import-export/geojson-export.d.ts +0 -19
  450. package/dist/api/import-export/image-import.d.ts +0 -12
  451. package/dist/api/import-export/image-import.js +0 -53
  452. package/dist/api/import-export/index.d.ts +0 -9
  453. package/dist/api/import-export/index.js +0 -107
  454. package/dist/api/import-export/native-format.d.ts +0 -15
  455. package/dist/api/import-export/style-validation.d.ts +0 -27
  456. package/dist/api/import-export/style-validation.js +0 -49
  457. package/dist/api/import-export/types.d.ts +0 -26
  458. package/dist/api/index.d.ts +0 -15
  459. package/dist/api/index.js +0 -3
  460. package/dist/api/input-api.d.ts +0 -158
  461. package/dist/api/input-api.js +0 -144
  462. package/dist/api/instance-api.d.ts +0 -38
  463. package/dist/api/instance-api.js +0 -136
  464. package/dist/api/layer-api.d.ts +0 -12
  465. package/dist/api/layer-api.js +0 -62
  466. package/dist/api/selection-api.d.ts +0 -7
  467. package/dist/api/selection-api.js +0 -78
  468. package/dist/api/snapping-api.d.ts +0 -125
  469. package/dist/api/snapping-api.js +0 -50
  470. package/dist/api/topology-api.d.ts +0 -30
  471. package/dist/api/topology-api.js +0 -16
  472. package/dist/api/tracing-api.d.ts +0 -31
  473. package/dist/api/tracing-api.js +0 -16
  474. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  475. package/dist/dispatcher/hit-test/index.js +0 -9
  476. package/dist/dispatcher/index.d.ts +0 -15
  477. package/dist/dispatcher/index.js +0 -3
  478. package/dist/display/columnar/index.d.ts +0 -12
  479. package/dist/display/columnar/index.js +0 -13
  480. package/dist/display/columnar/prepare.d.ts +0 -42
  481. package/dist/display/columnar/prepare.js +0 -116
  482. package/dist/display/index.d.ts +0 -13
  483. package/dist/display/types.js +0 -43
  484. package/dist/maplibre-gl-draw.d.ts +0 -47
  485. package/dist/modes/cursor.js +0 -72
  486. package/dist/modes/index.d.ts +0 -7
  487. package/dist/operations/index.d.ts +0 -9
  488. package/dist/operations/index.js +0 -3
  489. package/dist/plugins/index.d.ts +0 -10
  490. package/dist/plugins/mutation-hooks.d.ts +0 -28
  491. package/dist/plugins/mutation-hooks.js +0 -84
  492. package/dist/plugins/plugin-context.js +0 -367
  493. package/dist/plugins/plugin-manager.d.ts +0 -103
  494. package/dist/plugins/plugin-manager.js +0 -316
  495. package/dist/plugins/plugin.d.ts +0 -529
  496. package/dist/shared/config/index.d.ts +0 -17
  497. package/dist/shared/config/index.js +0 -8
  498. package/dist/shared/utils/index.d.ts +0 -15
  499. package/dist/shared/utils/index.js +0 -24
  500. package/dist/snapping/index.d.ts +0 -14
  501. package/dist/snapping/index.js +0 -4
  502. package/dist/store/change-merger.js +0 -102
  503. package/dist/store/event-bridge.js +0 -161
  504. package/dist/store/index.d.ts +0 -12
  505. package/dist/store/index.js +0 -4
  506. package/dist/view/index.d.ts +0 -47
  507. package/dist/view/index.js +0 -20
  508. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  509. /package/dist/api/{import-export/types.js → document.js} +0 -0
  510. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  511. /package/dist/{display/index.js → api/events.js} +0 -0
  512. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  513. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  514. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  515. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  516. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  517. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  518. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  519. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  520. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  521. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  522. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  523. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  524. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  525. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  526. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  527. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  528. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  529. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  532. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  533. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  534. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  535. /package/dist/{display → dataset}/chunk-set.js +0 -0
  536. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  537. /package/dist/{display → dataset}/manager.js +0 -0
  538. /package/dist/{display → dataset}/provider.js +0 -0
  539. /package/dist/{display → dataset}/selection.d.ts +0 -0
  540. /package/dist/{display → dataset}/selection.js +0 -0
package/README.ja.md CHANGED
@@ -93,12 +93,15 @@ GeoParquet や Arrow の表は、点、線、多角形が行ごとに混ざっ
93
93
  決められ、クリックすると属性を読めます
94
94
  ([大量のデータ](docs/guides/large-data.ja.md))。
95
95
 
96
- ### 書き出しと読み込み
97
-
98
- 独自形式で書き出すと、レイヤー、グループ、スタイル、画像まで含めて
99
- 保存でき、読み込めば同じ状態に戻ります。GeoJSON で書き出せば、ほかの
100
- ツールと地物をやり取りできます。地物を保存するストアは差し替えられ、
101
- 変更はすべてイベントで通知されます
96
+ ### 保存と読み込み
97
+
98
+ 文書を独自形式で書き出すと、レイヤー、グループ、スタイル、画像まで
99
+ 含めて保存でき、読み込めば同じ状態に戻ります。GeoJSON で書き出せば、
100
+ ほかのツールと地物をやり取りできます。地物は GeoJSON の図形と
101
+ GeoJSON の properties を持つので、ファイルはコードで読む地物と同じ形に
102
+ なります。
103
+ 変更は取引ごとに 1 つのイベントで、出どころを添えて届きます。文書を
104
+ 保存するストアは差し替えられます
102
105
  ([保存と読み込み](docs/guides/save-load.ja.md))。
103
106
 
104
107
  ### 閲覧専用
@@ -108,7 +111,9 @@ GeoParquet や Arrow の表は、点、線、多角形が行ごとに混ざっ
108
111
 
109
112
  ### 拡張
110
113
 
111
- プラグイン、独自のモード、独自の地物型を足して拡張できます
114
+ プラグイン、独自のモード、独自の描き方を持つ地物の型、重ね描き、
115
+ 吸着の候補やハンドルの提供者を足せます。どの種類も同じ方法で足し、
116
+ 足したときに返る関数で外します
112
117
  ([プラグイン](docs/guides/plugins.ja.md)、
113
118
  [独自の型](docs/guides/custom-types.ja.md))。
114
119
 
@@ -132,12 +137,12 @@ GeoParquet や Arrow の表は、点、線、多角形が行ごとに混ざっ
132
137
  - [閲覧専用][ex-read-only]
133
138
  - 閲覧専用モード、操作のロック、ロックしたレイヤー
134
139
  - [プラグイン][ex-plugin]
135
- - フックと独自のモードを持つプラグイン
140
+ - イベント、API、独自のモードを持つプラグイン
136
141
  - [独自の地物型][ex-custom-feature-type]
137
- - 独自のレンダラーと当たり判定を持つ地物型
142
+ - 独自の描き方、当たり判定、範囲選択を持つ地物の型
138
143
  - [データセット][ex-large-data]
139
144
  - 5 万のマス目の色分けと、見えている範囲の点の取り寄せ
140
- - [100 万の点][ex-columnar-worker]
145
+ - [100 万の点][ex-table-worker]
141
146
  - Worker で読み込む 100 万の点
142
147
 
143
148
  ## インストール
@@ -156,7 +161,7 @@ maplibre-gl (`~6.11.1`) を使います。まだ入っていなければ、npm 7
156
161
  import * as maplibregl from 'maplibre-gl';
157
162
  import 'maplibre-gl/dist/maplibre-gl.css';
158
163
  import workerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url';
159
- import { createMapLibreGLDraw } from '@sakuzu/maplibre-gl-draw';
164
+ import { createDraw } from '@sakuzu/maplibre-gl-draw';
160
165
 
161
166
  // maplibre-gl v6 はページごとに 1 回 worker の URL を要する (これは Vite の例)
162
167
  maplibregl.setWorkerUrl(workerUrl);
@@ -168,7 +173,7 @@ const map = new maplibregl.Map({
168
173
  zoom: 12,
169
174
  });
170
175
 
171
- const draw = createMapLibreGLDraw(map);
176
+ const draw = createDraw(map);
172
177
 
173
178
  // 自分のボタンで描き始める。クリックで頂点を足し、最初の頂点のクリックか
174
179
  // Enter で確定する
@@ -176,20 +181,35 @@ document.querySelector('#polygon')?.addEventListener('click', () => {
176
181
  draw.setMode('draw_polygon');
177
182
  });
178
183
 
179
- draw.on('draw.feature.create', ({ feature }) => {
180
- console.log(feature.id, feature.type, feature.coordinates);
184
+ draw.on('feature.created', ({ feature }) => {
185
+ console.log(feature.id, feature.type, feature.geometry);
181
186
  });
182
187
 
183
- // すべての地物を GeoJSON の FeatureCollection (文字列) で得る
188
+ // すべての地物を GeoJSON の FeatureCollection で得る
184
189
  document.querySelector('#save')?.addEventListener('click', () => {
185
- const { data } = draw.export('geojson');
186
- console.log(data);
190
+ console.log(JSON.stringify(draw.document.toGeoJSON()));
187
191
  });
188
192
  ```
189
193
 
190
194
  ページ全体は [examples/basic/](examples/basic/) にあります。
191
195
  [はじめかた](docs/getting-started.ja.md) で順を追って説明しています。
192
196
 
197
+ ## 入口
198
+
199
+ ほかの入口が要るとき以外は、main の入口から import します。
200
+
201
+ - `@sakuzu/maplibre-gl-draw` は、描画のインスタンス (`createDraw`)、
202
+ その地物、レイヤー、グループ、データセット、イベント、設定、拡張の
203
+ 窓口です
204
+ - `@sakuzu/maplibre-gl-draw/geometry` は、地図の要らない図形の計算
205
+ です。長さや面積を測る、円やバッファーを作る、面を合成して分ける
206
+ ことができます。Node や Worker でも動きます
207
+ - `@sakuzu/maplibre-gl-draw/table` は、大きな表を Worker で読んで
208
+ データセットに渡す部品です
209
+ - `@sakuzu/maplibre-gl-draw/webgl` は、独自のシェーダーを書くための
210
+ 部品です。小さい版で変わることがあります。ほかの 3 つはセマンティック
211
+ バージョニングに従います
212
+
193
213
  ## 動作環境
194
214
 
195
215
  - maplibre-gl `~6.11.1` で動き、WebGL2 が必要です。
@@ -209,7 +229,7 @@ document.querySelector('#save')?.addEventListener('click', () => {
209
229
  ## ドキュメント
210
230
 
211
231
  [docs/README.ja.md](docs/README.ja.md) に、はじめかた、手引き、
212
- リファレンス、内部の文書を読む順に並べています。mapbox-gl-draw や
232
+ リファレンス、内部の文書を読む順に並べています。1.0、mapbox-gl-draw、
213
233
  terra-draw から移る場合は [移行](docs/guides/migrating.ja.md) を参照して
214
234
  ください。
215
235
 
@@ -245,4 +265,4 @@ AGPL が製品に合わない場合は、Kasika, Inc. (可視化技研株式会
245
265
  [ex-plugin]: https://sakuzu.github.io/maplibre-gl-draw/examples/plugin/
246
266
  [ex-custom-feature-type]: https://sakuzu.github.io/maplibre-gl-draw/examples/custom-feature-type/
247
267
  [ex-large-data]: https://sakuzu.github.io/maplibre-gl-draw/examples/large-data/
248
- [ex-columnar-worker]: https://sakuzu.github.io/maplibre-gl-draw/examples/columnar-worker/
268
+ [ex-table-worker]: https://sakuzu.github.io/maplibre-gl-draw/examples/table-worker/
package/README.md CHANGED
@@ -97,12 +97,15 @@ large file opens. It is styled by the same style rules as drawn
97
97
  features, and a click reads its properties
98
98
  ([large data](docs/guides/large-data.md)).
99
99
 
100
- ### Export and load
101
-
102
- Export in the native format to keep layers, groups, styles and images,
103
- and load it to get the same state back. Export as GeoJSON to exchange
104
- features with other tools. The store that holds the features can be
105
- replaced, and every change is reported as an event
100
+ ### Save and load
101
+
102
+ Write the document in the native format to keep layers, groups, styles
103
+ and images, and load it to get the same state back. Write it as GeoJSON
104
+ to exchange features with other tools: a feature holds a GeoJSON
105
+ geometry and GeoJSON properties, so the file has the shape of the
106
+ features you read in code.
107
+ Every change arrives as one event per transaction, with where it came
108
+ from, and the store that holds the document can be replaced
106
109
  ([save and load](docs/guides/save-load.md)).
107
110
 
108
111
  ### Read-only
@@ -112,8 +115,10 @@ drawing ([read-only](docs/guides/read-only.md)).
112
115
 
113
116
  ### Extending
114
117
 
115
- Extend it with plugins, custom modes and custom feature types
116
- ([plugins](docs/guides/plugins.md),
118
+ Add plugins, modes of your own, feature types with their own drawing,
119
+ overlays, and providers of snapping candidates and handles. Every kind
120
+ is added the same way and removed with the function that adding
121
+ returns ([plugins](docs/guides/plugins.md),
117
122
  [custom types](docs/guides/custom-types.md)).
118
123
 
119
124
  ## Demos
@@ -138,13 +143,13 @@ Try them in the browser, with nothing to install.
138
143
  - [Read-only][ex-read-only]
139
144
  - The read-only mode, the interaction lock and locked layers
140
145
  - [Plugin][ex-plugin]
141
- - A plugin with a hook and a mode of its own
146
+ - A plugin with an event, an API and a mode of its own
142
147
  - [Custom feature type][ex-custom-feature-type]
143
- - A kind of feature with its own renderer and hit test
148
+ - A kind of feature with its own drawing, hit test and box selection
144
149
  - [Datasets][ex-large-data]
145
150
  - 50,000 cells colored by a property, and points fetched for the part
146
151
  of the map in view
147
- - [A million points][ex-columnar-worker]
152
+ - [A million points][ex-table-worker]
148
153
  - A million points read in a Worker
149
154
 
150
155
  ## Installation
@@ -163,7 +168,7 @@ npm 7 and later install it along.
163
168
  import * as maplibregl from 'maplibre-gl';
164
169
  import 'maplibre-gl/dist/maplibre-gl.css';
165
170
  import workerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url';
166
- import { createMapLibreGLDraw } from '@sakuzu/maplibre-gl-draw';
171
+ import { createDraw } from '@sakuzu/maplibre-gl-draw';
167
172
 
168
173
  // maplibre-gl v6 needs its worker URL once per page (Vite shown here)
169
174
  maplibregl.setWorkerUrl(workerUrl);
@@ -175,7 +180,7 @@ const map = new maplibregl.Map({
175
180
  zoom: 12,
176
181
  });
177
182
 
178
- const draw = createMapLibreGLDraw(map);
183
+ const draw = createDraw(map);
179
184
 
180
185
  // Your own button starts drawing. Click to add vertices; click the first
181
186
  // vertex or press Enter to finish
@@ -183,20 +188,35 @@ document.querySelector('#polygon')?.addEventListener('click', () => {
183
188
  draw.setMode('draw_polygon');
184
189
  });
185
190
 
186
- draw.on('draw.feature.create', ({ feature }) => {
187
- console.log(feature.id, feature.type, feature.coordinates);
191
+ draw.on('feature.created', ({ feature }) => {
192
+ console.log(feature.id, feature.type, feature.geometry);
188
193
  });
189
194
 
190
- // Every feature as a GeoJSON FeatureCollection (a string)
195
+ // Every feature as a GeoJSON FeatureCollection
191
196
  document.querySelector('#save')?.addEventListener('click', () => {
192
- const { data } = draw.export('geojson');
193
- console.log(data);
197
+ console.log(JSON.stringify(draw.document.toGeoJSON()));
194
198
  });
195
199
  ```
196
200
 
197
201
  The complete page is [examples/basic/](examples/basic/), and
198
202
  [getting started](docs/getting-started.md) walks through it step by step.
199
203
 
204
+ ## Entry points
205
+
206
+ Import from the main entry unless you need one of the others.
207
+
208
+ - `@sakuzu/maplibre-gl-draw`: the draw instance (`createDraw`), its
209
+ features, layers, groups and datasets, the events, the options and the
210
+ extension contract
211
+ - `@sakuzu/maplibre-gl-draw/geometry`: geometry that needs no map:
212
+ measure lengths and areas, build circles and buffers, combine and split
213
+ polygons. It also runs in Node and in Workers
214
+ - `@sakuzu/maplibre-gl-draw/table`: read a large table in a Worker and
215
+ pass it to a dataset
216
+ - `@sakuzu/maplibre-gl-draw/webgl`: the building blocks for writing your
217
+ own shaders. It may change in a minor release; the other three follow
218
+ semantic versioning
219
+
200
220
  ## Compatibility
201
221
 
202
222
  - maplibre-gl `~6.11.1` and WebGL2 are required.
@@ -217,8 +237,8 @@ The complete page is [examples/basic/](examples/basic/), and
217
237
  ## Documentation
218
238
 
219
239
  [docs/README.md](docs/README.md) lists every document in reading order:
220
- getting started, the guides, the reference and the internals. Coming from
221
- mapbox-gl-draw or terra-draw? See [migrating](docs/guides/migrating.md).
240
+ getting started, the guides, the reference and the internals. Moving from
241
+ 1.0, mapbox-gl-draw or terra-draw? See [migrating](docs/guides/migrating.md).
222
242
 
223
243
  ## Contributing
224
244
 
@@ -252,4 +272,4 @@ The notices of the third-party code this package contains are in
252
272
  [ex-plugin]: https://sakuzu.github.io/maplibre-gl-draw/examples/plugin/
253
273
  [ex-custom-feature-type]: https://sakuzu.github.io/maplibre-gl-draw/examples/custom-feature-type/
254
274
  [ex-large-data]: https://sakuzu.github.io/maplibre-gl-draw/examples/large-data/
255
- [ex-columnar-worker]: https://sakuzu.github.io/maplibre-gl-draw/examples/columnar-worker/
275
+ [ex-table-worker]: https://sakuzu.github.io/maplibre-gl-draw/examples/table-worker/
@@ -0,0 +1,258 @@
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
+ /** Replaces the scale factor and the opacity by zoom; `null` removes them. */
158
+ setZoomScale(zoomScale: DatasetZoomScale | null): void;
159
+ /** The scale factor and the opacity by zoom, or `null` when none is set. */
160
+ getZoomScale(): DatasetZoomScale | null;
161
+ /** Replaces the default look; `undefined` removes it. */
162
+ setBaseStyle(style: DatasetBaseStyle | undefined): void;
163
+ /** Replaces the function that picks the point rows another renderer draws. */
164
+ setExternalPointRender(predicate: ((row: DatasetRow) => boolean) | undefined): void;
165
+ /** The default look, or `undefined` when none is set. */
166
+ getBaseStyle(): DatasetBaseStyle | undefined;
167
+ /** Every row, in drawing order, without the rule colors and the default look. */
168
+ listRows(): DatasetRow[];
169
+ /** The rows whose extent meets the range, with the rule colors and the default look. */
170
+ listVisibleRows(bbox: BBox): DatasetRow[];
171
+ /** The indexes of the rows drawn now whose extent meets the range, in ascending order. */
172
+ listDrawnRows(bbox: BBox): Int32Array;
173
+ /** Reads a row as a GeoJSON feature; `undefined` when there is no such row. */
174
+ getRow(index: number): DatasetRow | undefined;
175
+ /** The ID of a row, or `null` when there is no such row or it has no ID. */
176
+ getRowId(index: number): string | null;
177
+ /** The type of the geometry of a row, or `null` when there is no such row. */
178
+ getRowType(index: number): FeatureType | null;
179
+ /** The extent of a row, or `null` when there is no such row or it has no geometry. */
180
+ getRowBounds(index: number): BBox | null;
181
+ /** The position of a point row, or `null` when the row is not a point. */
182
+ getRowPoint(index: number): Position | null;
183
+ /** The index of the row with this ID, or `null` when there is none. */
184
+ findRow(id: string): number | null;
185
+ /** Replaces the IDs of the selected rows. */
186
+ setSelectedRowIds(ids: readonly string[]): void;
187
+ /** The IDs of the selected rows. */
188
+ getSelectedRowIds(): string[];
189
+ /** Replaces the thinning of overlapping points; `null` turns it off. */
190
+ setCollisionThinning(options: DatasetCollisionThinning | null): void;
191
+ /** The thinning in effect with every default filled in, or `null` when it is off. */
192
+ getCollisionThinning(): Required<DatasetCollisionThinning> | null;
193
+ /** The IDs of the rows the thinning draws, or `null` when it thins nothing. */
194
+ listVisibleRowIds(): ReadonlySet<string> | null;
195
+ /** What the thinning is doing now. */
196
+ getThinningStats(): DatasetThinningStats;
197
+ /** A number that changes whenever the rows drawn change. */
198
+ getDrawnRowsRevision(): number;
199
+ /** Fetches the rows of the provider again on the next move of the map. */
200
+ refresh(): void;
201
+ /** Subscribes to an event of this dataset and returns the function that unsubscribes. */
202
+ on<K extends keyof DatasetEvents>(event: K, listener: (payload: DatasetEvents[K]) => void): () => void;
203
+ /** Unsubscribes from an event of this dataset. */
204
+ off<K extends keyof DatasetEvents>(event: K, listener: (payload: DatasetEvents[K]) => void): void;
205
+ }
206
+ /**
207
+ * The datasets on the map, in stacking order.
208
+ */
209
+ export interface DatasetsCollection {
210
+ /**
211
+ * Gets a dataset by ID.
212
+ *
213
+ * @returns The dataset, or `undefined` when there is none with this ID
214
+ */
215
+ get(id: string): Dataset | undefined;
216
+ /** Lists the datasets in stacking order. */
217
+ list(): Dataset[];
218
+ /** Counts the datasets. */
219
+ count(): number;
220
+ /** Whether a dataset with this ID exists. */
221
+ has(id: string): boolean;
222
+ /**
223
+ * Adds a dataset and returns it.
224
+ *
225
+ * @throws `DrawError` with the code `already-exists` when the ID is taken, or
226
+ * `invalid-input` when the options are wrong
227
+ */
228
+ add(options: DatasetOptions): Dataset;
229
+ /**
230
+ * Adds several datasets in one transaction, all of them or none, and returns them.
231
+ *
232
+ * @throws `DrawError` as {@link DatasetsCollection.add} does, for any of the options;
233
+ * nothing is added then
234
+ */
235
+ addMany(options: readonly DatasetOptions[]): Dataset[];
236
+ /**
237
+ * Removes a dataset.
238
+ *
239
+ * @returns True when it was removed
240
+ * @throws `DrawError` with the code `not-found` when there is no dataset with this ID
241
+ */
242
+ remove(id: string): boolean;
243
+ /**
244
+ * Removes several datasets in one transaction: all of them or none.
245
+ *
246
+ * @returns True when they were removed
247
+ * @throws `DrawError` with the code `not-found` when one of the IDs does not exist; nothing
248
+ * is removed then
249
+ */
250
+ removeMany(ids: readonly string[]): boolean;
251
+ /**
252
+ * Moves a dataset in the stacking order.
253
+ *
254
+ * @returns True when it moved
255
+ * @throws `DrawError` with the code `not-found` when there is no dataset with this ID
256
+ */
257
+ move(id: string, placement: DatasetPlacement): boolean;
258
+ }
@@ -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
+ }