@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
@@ -1,16 +1,38 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
- import { toPackedPointStyle } from '../../view/renderers/batch-manager.js';
4
- import { toLineInstanceColor } from '../../view/renderers/line/line-geometry.js';
5
- import { toInstancedPointShape, } from '../../view/renderers/point/point-instance.js';
6
- import { evaluateStyleRuleValue, getStyleRuleChannel } from '../../view/style-rule.js';
7
- import { toDisplayChunks } from '../chunk.js';
8
- import { COLLECT_SLICE_ROWS, FIXED_WIDTH_ZOOM, isDrapedGeometry, PackedLinesBuilder, PackedPointsBuilder, pushFallback, } from '../retained.js';
9
- import { DisplaySpatialIndex } from '../spatial.js';
10
- import { prepareDatasetColumnar } from './prepare.js';
11
- import { ColumnarTable, columnValue, isDictionaryColumn, } from './table.js';
3
+ /**
4
+ * The contents given as a table (`TableSource`)
5
+ *
6
+ * It implements the contract of `source.ts` over the typed arrays of the table. What a draw and a
7
+ * hit test need is read from the arrays as they are: the chunks and the spatial index come from
8
+ * `prepareTable` (computed in a Worker, or here when it was not given), and the rows of
9
+ * a chunk are packed straight into the GPU arrays. A feature is built only for a row that is
10
+ * asked for (a hit, the selection, `getFeatures`, the analytic drape, a row drawn in immediate
11
+ * mode).
12
+ *
13
+ * The styles are resolved once per geometry type and rule color, not per row: the rows have no
14
+ * individual style, so two rows of the same type with the same rule color look the same. The
15
+ * resolution goes through the same styler and the same resolver as the features, so a row looks
16
+ * exactly as its feature would.
17
+ *
18
+ * A row is read from the geometry column that holds it: the one column of a table of one type, or
19
+ * the child of a mixed geometry column that the row names, at the row within that child. Each row
20
+ * is collected as its type is (the decisions of `collectFeature`), so the rows of a mixed table
21
+ * are drawn in the order of the table whatever the order within the children.
22
+ */
23
+ import { drawPropertyKey } from '../shared/properties.js';
24
+ import { geometryFromCoordinates } from '../shared/utils/coordinates.js';
25
+ import { isPreparedTable, prepareTable } from '../table/prepare.js';
26
+ import { columnValue, isDictionaryColumn, TableReader, } from '../table/table.js';
27
+ import { toPackedPointStyle } from '../view/renderers/batch-manager.js';
28
+ import { toLineInstanceColor } from '../view/renderers/line/line-geometry.js';
29
+ import { toInstancedPointShape } from '../view/renderers/point/point-instance.js';
30
+ import { evaluateStyleRuleValue, getStyleRuleChannel } from '../view/style-rule.js';
31
+ import { toDisplayChunks } from './chunk.js';
32
+ import { COLLECT_SLICE_ROWS, FIXED_WIDTH_ZOOM, isDrapedGeometry, PackedLinesBuilder, PackedPointsBuilder, pushFallback, } from './retained.js';
33
+ import { DisplaySpatialIndex } from './spatial.js';
12
34
  /** The column the zoom of creation of a row is read from (the same key as on a feature) */
13
- const CREATED_ZOOM_COLUMN = 'createdZoom';
35
+ const CREATED_ZOOM_COLUMN = drawPropertyKey('createdZoom');
14
36
  /** The key of the slots for "no rule color" */
15
37
  const NO_RULE_COLOR = '';
16
38
  /** The slots of a geometry type (created on the first request) */
@@ -25,7 +47,7 @@ function slotsOfType(maps, type) {
25
47
  /**
26
48
  * The styles of the rows of a table, resolved once per geometry type and rule color
27
49
  */
28
- class ColumnarStyleSlots {
50
+ class TableStyleSlots {
29
51
  constructor(table, styler, resolver) {
30
52
  Object.defineProperty(this, "table", {
31
53
  enumerable: true,
@@ -150,27 +172,28 @@ class ColumnarStyleSlots {
150
172
  return {
151
173
  id: '',
152
174
  type,
153
- coordinates: [],
175
+ geometry: geometryFromCoordinates(type, []),
154
176
  layerId: '',
177
+ groupId: undefined,
155
178
  properties: {},
156
- style: this.styler.effectiveStyle(undefined, color, getStyleRuleChannel(type)),
179
+ style: this.styler.effectiveStyle(undefined, color, getStyleRuleChannel(type)) ?? {},
157
180
  locked: false,
158
181
  visible: true,
159
182
  };
160
183
  }
161
184
  }
162
185
  /**
163
- * The contents of a dataset given as a columnar table
186
+ * The contents of a dataset given as a table
164
187
  *
165
188
  * @internal
166
189
  */
167
- export class ColumnarSource {
190
+ export class TableSource {
168
191
  /**
169
- * @param prepared The result of `prepareDatasetColumnar` for this table (computed here when
170
- * omitted)
171
- * @throws when the table does not add up, or when `prepared` was made for another length
192
+ * @param given The table, or the result of `prepareTable` (the preparation is computed here
193
+ * for a bare table)
194
+ * @throws when the table does not add up, or when a prepared table does not match its table
172
195
  */
173
- constructor(input, prepared) {
196
+ constructor(given) {
174
197
  Object.defineProperty(this, "table", {
175
198
  enumerable: true,
176
199
  configurable: true,
@@ -235,13 +258,18 @@ export class ColumnarSource {
235
258
  writable: true,
236
259
  value: null
237
260
  });
238
- this.table = new ColumnarTable(input);
261
+ const prepared = isPreparedTable(given) ? given : null;
262
+ const input = prepared ? prepared.table : given;
263
+ this.table = new TableReader(input);
239
264
  this.length = this.table.length;
240
- const ready = prepared ?? prepareDatasetColumnar(input);
241
- if (ready.length !== this.length || ready.bounds.length !== this.length * 4) {
242
- throw new Error(`Columnar input: prepared was made for ${ready.length} rows, the table has ${this.length}`);
265
+ const ready = prepared ?? prepareTable(input);
266
+ if (!(ready.rowBounds instanceof Float64Array) || !(ready.indexBoxes instanceof Float64Array)) {
267
+ throw new Error('Table: a prepared table must be made by prepareTable');
268
+ }
269
+ if (ready.length !== this.length || ready.rowBounds.length !== this.length * 4) {
270
+ throw new Error(`Table: the prepared table was made for ${ready.length} rows, the table has ${this.length}`);
243
271
  }
244
- this.bounds = ready.bounds;
272
+ this.bounds = ready.rowBounds;
245
273
  this.chunks = toDisplayChunks({
246
274
  rows: ready.chunkRows,
247
275
  offsets: ready.chunkOffsets,
@@ -405,7 +433,7 @@ export class ColumnarSource {
405
433
  key[0] !== context.styleKey ||
406
434
  key[1] !== context.styler ||
407
435
  key[2] !== resolver) {
408
- this.slots = new ColumnarStyleSlots(this.table, context.styler, resolver);
436
+ this.slots = new TableStyleSlots(this.table, context.styler, resolver);
409
437
  this.slotsKey = [context.styleKey, context.styler, resolver];
410
438
  }
411
439
  return this.slots;
@@ -7,16 +7,6 @@
7
7
  * polygons and MultiPoint are always drawn. The overlap is tested with the size actually drawn
8
8
  * (the radius + the outline + `marginPx`), and the winners are picked greedily from the front
9
9
  * of the draw order for each integer zoom band, so panning does not swap them.
10
- *
11
- * @example
12
- * ```ts
13
- * const places = draw.addDataset({
14
- * id: 'places',
15
- * features,
16
- * collisionThinning: { enabled: true, fullDisplayZoom: 17, marginPx: 2 },
17
- * });
18
- * const { total, visible } = places.getThinningStats(); // "showing 1,200 of 50,000"
19
- * ```
20
10
  */
21
11
  export interface DatasetCollisionThinning {
22
12
  /** Whether the thinning is enabled (false by default = everything is drawn as before) */
@@ -1,5 +1,6 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { coordinatesOf } from '../shared/utils/coordinates.js';
3
4
  /**
4
5
  * The zoom at which the thinning stops (default). At or above it every feature is drawn
5
6
  *
@@ -476,7 +477,7 @@ export function selectCollisionWinners(input) {
476
477
  const rows = {
477
478
  length: features.length,
478
479
  thinningRole: (row) => featureThinningRole(features[row]),
479
- pointOf: (row) => features[row].coordinates,
480
+ pointOf: (row) => coordinatesOf(features[row]),
480
481
  styleRadiusOf: (row) => features[row].style?.pointRadius,
481
482
  idOf: (row) => features[row].id,
482
483
  };
@@ -498,7 +499,7 @@ export function featureThinningRole(feature) {
498
499
  return 'skip';
499
500
  if (feature.type !== 'Point')
500
501
  return 'winner';
501
- const coord = feature.coordinates;
502
+ const coord = coordinatesOf(feature);
502
503
  if (!Array.isArray(coord) || typeof coord[0] !== 'number' || typeof coord[1] !== 'number') {
503
504
  return 'winner';
504
505
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,14 @@
1
+ /**
2
+ * Type definitions of the datasets
3
+ *
4
+ * It defines the types for showing large numbers of features that are not being edited, quickly
5
+ * and with attribute-driven styles. It is a path independent of the Store (editing, undo,
6
+ * events), and there is no editing API here.
7
+ */
8
+ import type { Feature as GeoJSONFeature, Geometry as GeoJSONGeometry } from 'geojson';
1
9
  import type { BoundingBox, Coordinate, Feature, StyleRule } from '../shared/types/model.js';
10
+ import type { PreparedTable, Table } from '../table/types.js';
2
11
  import type { StyleRuleChannel } from '../view/style-rule.js';
3
- import type { DatasetColumnarInput, DatasetColumnarPrepared } from './columnar/types.js';
4
12
  import type { DatasetCollisionThinning, DatasetThinningStats, ResolvedCollisionThinning } from './thinning.js';
5
13
  /**
6
14
  * The default style of a dataset, per geometry channel.
@@ -14,34 +22,22 @@ import type { DatasetCollisionThinning, DatasetThinningStats, ResolvedCollisionT
14
22
  */
15
23
  export type DatasetBaseStyle = Partial<Record<StyleRuleChannel, Feature['style']>>;
16
24
  /**
17
- * A feature passed to a dataset.
25
+ * A row passed to a dataset: a GeoJSON feature.
18
26
  *
19
- * It accepts the same coordinate shapes as a feature of the Store (including Multi and holes).
20
- * It is not put into the Store, so the layer it belongs to, the lock and the visibility can be
21
- * omitted (when omitted they are treated as an empty string, false and true respectively).
22
- * `Feature` satisfies this type, so a feature taken out of the Store can be passed as it is.
23
- * Positions with a third element (an elevation from GeoJSON) are truncated to `[lng, lat]`.
27
+ * The geometry is a GeoJSON geometry of any type but `GeometryCollection`. A null geometry (or a
28
+ * `GeometryCollection`) gives a row without a geometry: it keeps its place and its id but is
29
+ * neither drawn nor hit. Positions with a third element (an elevation) are truncated to
30
+ * `[lng, lat]`. The id is turned into a string with `String()` (the row number as a string when
31
+ * omitted) and should be unique within the dataset. The properties are what the style rule
32
+ * reads.
33
+ *
34
+ * Besides the members of GeoJSON, a row may carry `style`, its individual style, which wins
35
+ * over the rule color and the base style.
24
36
  */
25
- export interface DatasetFeatureInput {
26
- /** The feature id, unique within the dataset */
27
- id: string;
28
- /** The geometry type, the same values as a feature of the Store */
29
- type: Feature['type'];
30
- /** The coordinates in `[lng, lat]` degrees, shaped as for `type` (holes and Multi included) */
31
- coordinates: Feature['coordinates'];
32
- /** The attributes the style rule reads (`{}` when omitted) */
33
- properties?: Record<string, unknown>;
34
- /** The individual style; it wins over the rule color and the base style */
37
+ export type DatasetRow = GeoJSONFeature<GeoJSONGeometry | null> & {
38
+ /** The individual style of the row; it wins over the rule color and the base style */
35
39
  style?: Feature['style'];
36
- /** The layer id (`''` when omitted). Kept on the feature; the dataset does not use it */
37
- layerId?: string;
38
- /** The group id. Kept on the feature; the dataset does not use it */
39
- groupId?: string;
40
- /** The lock flag (`false` when omitted). Kept on the feature; nothing is edited here */
41
- locked?: boolean;
42
- /** `false` hides this feature (`true` when omitted) */
43
- visible?: boolean;
44
- }
40
+ };
45
41
  /**
46
42
  * Where a dataset is drawn relative to the layers of the Store.
47
43
  *
@@ -56,7 +52,7 @@ export interface DatasetFeatureInput {
56
52
  */
57
53
  export type DatasetOrder = 'below-store' | 'above-store' | 'layer-order';
58
54
  /**
59
- * The destination of {@link MapLibreGLDraw.moveDataset}: a side and a position
55
+ * The destination of a move of a dataset (`draw.datasets.move`): a side and a position
60
56
  * within it.
61
57
  *
62
58
  * order is the side (in front of or behind the Store) and index is the position within that
@@ -77,26 +73,16 @@ export interface DatasetPlacement {
77
73
  index?: number;
78
74
  }
79
75
  /**
80
- * Fetches the features of a dataset for the displayed range.
76
+ * Fetches the rows of a dataset for the displayed range.
81
77
  *
82
78
  * It is called, debounced by 200 ms, when the displayed range changes. `bbox` is the range in
83
79
  * degrees rounded out to the boundaries of the tiles at the integer zoom, and `zoom` is the
84
80
  * zoom at the time of the call. A result is cached per rounded range, so a small pan or zoom
85
81
  * causes no call; {@link Dataset.invalidateProviderCache} discards the cache. Only
86
82
  * the result of the last request is applied, and a rejected promise is logged with
87
- * `console.error` and leaves the features shown as they are.
88
- *
89
- * @example
90
- * ```ts
91
- * const provider: DatasetFeatureProvider = async (bbox, zoom) => {
92
- * const url = `/api/parcels?bbox=${bbox.minX},${bbox.minY},${bbox.maxX},${bbox.maxY}&z=${zoom}`;
93
- * const response = await fetch(url);
94
- * return response.json(); // DatasetFeatureInput[]
95
- * };
96
- * draw.addDataset({ id: 'parcels', provider });
97
- * ```
83
+ * `console.error` and leaves the rows shown as they are.
98
84
  */
99
- export type DatasetFeatureProvider = (bbox: BoundingBox, zoom: number) => Promise<DatasetFeatureInput[]>;
85
+ export type DatasetFeatureProvider = (bbox: BoundingBox, zoom: number) => Promise<DatasetRow[]>;
100
86
  /**
101
87
  * Returns the size and opacity factors of a dataset for a zoom.
102
88
  *
@@ -121,39 +107,35 @@ export type DatasetZoomScale = (zoom: number) => {
121
107
  opacity: number;
122
108
  };
123
109
  /**
124
- * The options of {@link MapLibreGLDraw.addDataset}.
110
+ * The options of a dataset the engine adds (`draw.datasets.add` checks and translates them).
125
111
  *
126
- * Only `id` is required. Give at most one of `features` (static), `columnar` (static, as
127
- * columns of typed arrays) and `provider` (fetched for the displayed range).
112
+ * Only `id` is required. Give at most one of `rows` (static GeoJSON features), `table`
113
+ * (static, as columns of typed arrays) and `provider` (fetched for the displayed range).
128
114
  */
129
115
  export interface DatasetOptions {
130
116
  /**
131
117
  * The dataset id. It must be unique among the datasets of the draw
132
- * instance; a duplicate makes `addDataset` throw. With `order: 'layer-order'` it is
118
+ * instance; a duplicate makes the addition throw. With `order: 'layer-order'` it is
133
119
  * also the id placed in the layer order of the Store
134
120
  */
135
121
  id: string;
136
122
  /**
137
- * The static features, drawn in array order (the last in front). Cannot be given together
138
- * with `columnar` or `provider` (it throws). Replace them later with
139
- * {@link Dataset.setFeatures}
123
+ * The static rows as GeoJSON features, drawn in array order (the last in front). Cannot be
124
+ * given together with `table` or `provider` (it throws). Replace them later with
125
+ * {@link Dataset.setRows}
140
126
  */
141
- features?: DatasetFeatureInput[];
127
+ rows?: readonly DatasetRow[];
142
128
  /**
143
- * The static rows as columns of typed arrays, drawn in row order (the last in front); the
144
- * fast way in for a large table, read in a Worker if need be. Cannot be given together with
145
- * `features` or `provider` (it throws). Replace them later with
146
- * {@link Dataset.setColumnar}
129
+ * The static rows as a table (from `@sakuzu/maplibre-gl-draw/table`), drawn in row order (the
130
+ * last in front); the fast way in for a large table, read in a Worker if need be. A table
131
+ * prepared with `prepareTable` is taken as it is, and the dataset computes none of the
132
+ * preparation on the main thread. Cannot be given together with `rows` or `provider` (it
133
+ * throws). Replace it later with {@link Dataset.setTable}
147
134
  */
148
- columnar?: DatasetColumnarInput;
135
+ table?: Table | PreparedTable;
149
136
  /**
150
- * What `prepareDatasetColumnar` computed for `columnar` (in a Worker, say). The dataset then
151
- * computes none of it on the main thread. Only with `columnar` (it throws otherwise)
152
- */
153
- prepared?: DatasetColumnarPrepared;
154
- /**
155
- * Fetches the features for the displayed range. Cannot be given together with `features` or
156
- * `columnar` (it throws)
137
+ * Fetches the rows for the displayed range. Cannot be given together with `rows` or `table`
138
+ * (it throws)
157
139
  */
158
140
  provider?: DatasetFeatureProvider;
159
141
  /**
@@ -205,13 +187,18 @@ export interface DatasetClickPayload {
205
187
  /** The feature that was hit, as normalized by the dataset */
206
188
  feature: Feature;
207
189
  /**
208
- * The row of the feature: its index in the features given to the dataset (or in the result
209
- * of the provider), or its row in the columnar table. A host that keeps its own columns reads
190
+ * The row of the feature: its index in the rows given to the dataset (or in the result of
191
+ * the provider), or its row in the table. A host that keeps its own columns reads
210
192
  * the values of the row from them
211
193
  */
212
194
  row: number;
213
195
  /** The clicked position `[lng, lat]` in degrees */
214
196
  lngLat: Coordinate;
197
+ /** The clicked point on the screen, in CSS pixels */
198
+ point?: {
199
+ x: number;
200
+ y: number;
201
+ };
215
202
  }
216
203
  /**
217
204
  * The payload of the `hover` event of a {@link Dataset}.
@@ -228,6 +215,11 @@ export interface DatasetHoverPayload {
228
215
  row: number | null;
229
216
  /** The pointer position `[lng, lat]` in degrees */
230
217
  lngLat: Coordinate;
218
+ /** The pointer position on the screen, in CSS pixels */
219
+ point?: {
220
+ x: number;
221
+ y: number;
222
+ };
231
223
  }
232
224
  /**
233
225
  * The payload of the `change` event of a {@link Dataset}.
@@ -236,8 +228,8 @@ export interface DatasetHoverPayload {
236
228
  * changed. It exists so that a host that builds another representation from the contents of a
237
229
  * dataset, such as label rendering, gets a trigger to rebuild it.
238
230
  *
239
- * - features: the features were replaced (setFeatures, setColumnar, or a provider result
240
- * applied). The rows are new, and so are the drawn rows
231
+ * - features: the rows were replaced (setRows, setTable, or a provider result applied). The
232
+ * rows are new, and so are the drawn rows
241
233
  * - style: the style rule or the base style changed (the drawn rows may have changed with it)
242
234
  * - visibility: it was actually switched between shown and hidden
243
235
  * - selection: the selected features actually changed
@@ -268,40 +260,10 @@ export interface DatasetEventMap {
268
260
  *
269
261
  * It is meant for overlaying tens of thousands of read-only records, such as parcels or a
270
262
  * table of places. The features never enter the Store, so none of the following applies to
271
- * them: editing, undo / redo, the `draw.feature.*` events, the selection UI, and
272
- * `getAllFeatures()` / `export()`. A caller who wants to edit one copies it into the Store with
273
- * `addFeature`; the library does not relate the two. Create one with
274
- * {@link MapLibreGLDraw.addDataset}.
275
- *
276
- * @example
277
- * ```ts
278
- * const parcels = draw.addDataset({
279
- * id: 'parcels',
280
- * features: [
281
- * {
282
- * id: 'p1',
283
- * type: 'Polygon',
284
- * coordinates: [[[139.76, 35.68], [139.77, 35.68], [139.77, 35.69], [139.76, 35.68]]],
285
- * properties: { population: 4200 },
286
- * },
287
- * ],
288
- * styleRule: {
289
- * kind: 'graduated',
290
- * property: 'population',
291
- * breaks: [1000, 5000],
292
- * colors: ['#eff3ff', '#6baed6', '#2171b5'],
293
- * other: '#cccccc',
294
- * },
295
- * interactive: true,
296
- * });
297
- *
298
- * const unsubscribe = parcels.on('click', ({ feature }) => {
299
- * console.log(feature.id, feature.properties);
300
- * });
301
- *
302
- * parcels.setVisible(false); // hide without discarding the features
303
- * parcels.remove(); // the same as draw.removeDataset('parcels')
304
- * ```
263
+ * them: editing, undo / redo, the events of the features, the selection UI, and
264
+ * `draw.features.list()` / `draw.document`. A caller who wants to edit one copies it into the
265
+ * document with `draw.features.create`; the library does not relate the two. The public
266
+ * `Dataset` of `draw.datasets` is built on it.
305
267
  */
306
268
  export interface Dataset {
307
269
  /** The dataset id given at creation */
@@ -309,7 +271,7 @@ export interface Dataset {
309
271
  /**
310
272
  * Where it is drawn relative to the Store (the current side)
311
273
  *
312
- * When the side is changed with `moveDataset`, this value becomes the new side.
274
+ * When the side is changed by a move, this value becomes the new side.
313
275
  */
314
276
  readonly order: DatasetOrder;
315
277
  /** Whether click / hover are fired (hits are blocked even with false) */
@@ -324,28 +286,28 @@ export interface Dataset {
324
286
  */
325
287
  setVisible(visible: boolean): void;
326
288
  /**
327
- * Replaces all the features that are shown (there is no partial update). The selection
328
- * drops the ids that disappear
289
+ * Replaces all the rows that are shown with GeoJSON features (there is no partial update).
290
+ * The selection drops the ids that disappear
329
291
  */
330
- setFeatures(features: DatasetFeatureInput[]): void;
292
+ setRows(rows: readonly DatasetRow[]): void;
331
293
  /**
332
- * Replaces all the rows that are shown with a columnar table (there is no partial update).
333
- * The selection drops the ids that disappear
294
+ * Replaces all the rows that are shown with a table (there is no partial update). The
295
+ * selection drops the ids that disappear
334
296
  *
335
297
  * The arrays are kept and read as they are, not copied. The rows are packed straight into the
336
298
  * GPU arrays, and a row becomes a feature only when it is asked for (a hit, the selection,
337
299
  * `getFeatures`, `collectVisible`). The bboxes, the spatial chunks and the spatial index of the
338
- * hit testing are computed here unless `prepared` brings them.
300
+ * hit testing are computed here, unless the table was prepared with `prepareTable`.
339
301
  *
340
- * @param input The table
341
- * @param prepared What `prepareDatasetColumnar` (from `@sakuzu/maplibre-gl-draw/columnar`)
342
- * computed for this table, typically in the Worker that read it
343
- * @throws when the shape of the table does not add up, or when `prepared` was made for a table
344
- * of another length
302
+ * @param table The table, or the result of `prepareTable` (from
303
+ * `@sakuzu/maplibre-gl-draw/table`), typically computed in the Worker that read it
304
+ * @throws when the shape of the table does not add up
345
305
  */
346
- setColumnar(input: DatasetColumnarInput, prepared?: DatasetColumnarPrepared): void;
306
+ setTable(table: Table | PreparedTable): void;
347
307
  /** Replaces the style rule (undefined clears it) */
348
308
  setStyleRule(rule: StyleRule | undefined): void;
309
+ /** The style rule in effect (undefined when not set) */
310
+ getStyleRule(): StyleRule | undefined;
349
311
  /**
350
312
  * Replaces the zoom-dependent drawing factors (null clears them)
351
313
  *
@@ -380,7 +342,7 @@ export interface Dataset {
380
342
  * The features currently held, in draw order, as normalized by the dataset. The rule
381
343
  * colors and the base style are not merged in (use `collectVisible` for that)
382
344
  *
383
- * For a columnar table every row with a geometry is built into a feature on the first call
345
+ * For a table every row with a geometry is built into a feature on the first call
384
346
  * (and kept), which costs as much as giving the rows as features in the first place.
385
347
  */
386
348
  getFeatures(): Feature[];
@@ -414,10 +376,10 @@ export interface Dataset {
414
376
  * The narrowing uses the spatial index and builds no feature, so the cost is proportional to
415
377
  * the number of rows in the range. It is the entry point for code that walks only what is
416
378
  * drawn, such as placing text next to points: choose rows with the `getRow*` reads and build
417
- * the features of the chosen ones alone with `getRowFeature`.
379
+ * the features of the chosen ones alone with `getRow`.
418
380
  *
419
- * A row is the one reported as `row` by `click` and `hover`: the index in the features given
420
- * (or in the result of the provider), or the row of the columnar table. The numbers hold until
381
+ * A row is the one reported as `row` by `click` and `hover`: the index in the rows given (or
382
+ * in the result of the provider), or the row of the table. The numbers hold until
421
383
  * the contents are replaced (a `change` with the reason `features`).
422
384
  *
423
385
  * @param bounds The range in degrees (`minX` / `maxX` are longitudes, `minY` / `maxY`
@@ -426,14 +388,15 @@ export interface Dataset {
426
388
  */
427
389
  collectDrawnRows(bounds: BoundingBox): Int32Array;
428
390
  /**
429
- * The feature of a row, with the rule colors and the base style applied (the same feature
391
+ * Reads a row as a feature, with the rule colors and the base style applied (the same feature
430
392
  * `collectVisible` returns for that row)
431
393
  *
432
- * A row of a columnar table is built into a feature on each call.
394
+ * A row of a table is built into a feature on each call.
433
395
  *
434
- * @returns null when the row is out of range
396
+ * @param index The row
397
+ * @returns undefined when the row is out of range
435
398
  */
436
- getRowFeature(row: number): Feature | null;
399
+ getRow(index: number): Feature | undefined;
437
400
  /**
438
401
  * The id of a row, without building its feature
439
402
  *
@@ -478,7 +441,7 @@ export interface Dataset {
478
441
  * of the retained rendering. The retained batches are not touched, so switching the selection
479
442
  * never rebuilds a GPU resource.
480
443
  *
481
- * An id that is not held is ignored. An id that disappears through setFeatures or through a
444
+ * An id that is not held is ignored. An id that disappears through setRows, setTable or a
482
445
  * provider result is dropped from the selection automatically.
483
446
  */
484
447
  setSelectedIds(ids: string[]): void;
@@ -554,7 +517,7 @@ export interface Dataset {
554
517
  off<K extends keyof DatasetEventMap>(event: K, handler: (payload: DatasetEventMap[K]) => void): void;
555
518
  /**
556
519
  * Removes the dataset and releases its GPU resources; the same as
557
- * {@link MapLibreGLDraw.removeDataset}, including the `draw.dataset.remove` event.
520
+ * `draw.datasets.remove`, including the `dataset.removed` event.
558
521
  * Calling it again does nothing
559
522
  */
560
523
  remove(): void;
@@ -0,0 +1,61 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /** Recursively checks whether it contains a position with 3 or more elements */
4
+ function hasExtraPositionElements(value) {
5
+ if (typeof value[0] === 'number') {
6
+ return value.length !== 2;
7
+ }
8
+ return value.some(hasExtraPositionElements);
9
+ }
10
+ /** Returns a copy with every position truncated to the 2 elements [longitude, latitude] */
11
+ function truncatePositions(value) {
12
+ if (typeof value[0] === 'number') {
13
+ return [value[0], value[1]];
14
+ }
15
+ return value.map(truncatePositions);
16
+ }
17
+ /**
18
+ * Normalizes a row into a feature of the same shape as in the Store
19
+ *
20
+ * It fills in the fields a row does not have and, since it is not put into the Store, layerId is
21
+ * an empty string. A row without a geometry (null, or a GeometryCollection) becomes a hidden
22
+ * Point with NaN coordinates, so it keeps its place but is neither drawn nor hit. The
23
+ * coordinates may contain 3-element positions (with an elevation), so a copy truncated to 2
24
+ * elements is made only when they do (ordinary input with only 2 elements is not copied).
25
+ *
26
+ * @param input The row
27
+ * @param index The row number, the id of a row without one
28
+ * @internal
29
+ */
30
+ export function normalizeDisplayFeature(input, index) {
31
+ const id = input.id === undefined || input.id === null ? String(index) : String(input.id);
32
+ const properties = (input.properties ?? {});
33
+ const geometry = input.geometry;
34
+ if (!geometry || geometry.type === 'GeometryCollection') {
35
+ return {
36
+ id,
37
+ type: 'Point',
38
+ geometry: { type: 'Point', coordinates: [Number.NaN, Number.NaN] },
39
+ layerId: '',
40
+ groupId: undefined,
41
+ properties,
42
+ style: input.style ?? {},
43
+ locked: false,
44
+ visible: false,
45
+ };
46
+ }
47
+ const coords = geometry.coordinates;
48
+ return {
49
+ id,
50
+ type: geometry.type,
51
+ geometry: hasExtraPositionElements(coords)
52
+ ? { type: geometry.type, coordinates: truncatePositions(coords) }
53
+ : geometry,
54
+ layerId: '',
55
+ groupId: undefined,
56
+ properties,
57
+ style: input.style ?? {},
58
+ locked: false,
59
+ visible: true,
60
+ };
61
+ }