@sakuzu/maplibre-gl-draw 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/CHANGELOG.md +1016 -2
  2. package/README.ja.md +39 -19
  3. package/README.md +41 -21
  4. package/dist/api/datasets.d.ts +258 -0
  5. package/dist/api/document.d.ts +66 -0
  6. package/dist/api/draw.d.ts +135 -0
  7. package/dist/api/draw.js +18 -0
  8. package/dist/api/drawing.d.ts +87 -0
  9. package/dist/api/errors.d.ts +35 -0
  10. package/dist/api/errors.js +35 -0
  11. package/dist/api/events.d.ts +306 -0
  12. package/dist/api/extension/context.d.ts +247 -0
  13. package/dist/api/extension/feature-type.d.ts +129 -0
  14. package/dist/api/extension/mode.d.ts +123 -0
  15. package/dist/api/extension/plugin.d.ts +51 -0
  16. package/dist/api/extension/plugin.js +3 -0
  17. package/dist/api/extension/provider.d.ts +119 -0
  18. package/dist/api/extension/provider.js +3 -0
  19. package/dist/api/extension/render.d.ts +176 -0
  20. package/dist/api/extension/render.js +3 -0
  21. package/dist/api/extension/store.d.ts +190 -0
  22. package/dist/api/extension/store.js +3 -0
  23. package/dist/api/extensions.d.ts +306 -0
  24. package/dist/api/extensions.js +3 -0
  25. package/dist/api/features.d.ts +188 -0
  26. package/dist/api/features.js +3 -0
  27. package/dist/api/groups.d.ts +111 -0
  28. package/dist/api/groups.js +3 -0
  29. package/dist/api/hidden.d.ts +45 -0
  30. package/dist/api/hidden.js +3 -0
  31. package/dist/api/impl/adapters.js +463 -0
  32. package/dist/api/impl/contexts.js +466 -0
  33. package/dist/api/impl/create-draw.js +124 -0
  34. package/dist/api/impl/datasets.js +404 -0
  35. package/dist/api/impl/destroy-guard.js +74 -0
  36. package/dist/api/impl/document.js +280 -0
  37. package/dist/api/impl/drawing.js +180 -0
  38. package/dist/api/impl/engine-context.d.ts +7 -0
  39. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  40. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  41. package/dist/api/impl/events.js +422 -0
  42. package/dist/api/impl/extension-host.js +361 -0
  43. package/dist/api/impl/extensions.js +229 -0
  44. package/dist/api/impl/features.js +445 -0
  45. package/dist/api/impl/geometry/apply.d.ts +32 -0
  46. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  47. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  48. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  49. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  50. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  51. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  52. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  53. package/dist/api/impl/geometry/types.js +3 -0
  54. package/dist/api/impl/groups.d.ts +3 -0
  55. package/dist/api/impl/groups.js +268 -0
  56. package/dist/api/impl/hidden.js +60 -0
  57. package/dist/api/impl/import-export/constants.d.ts +22 -0
  58. package/dist/api/impl/import-export/constants.js +24 -0
  59. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  60. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  61. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  62. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  63. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  64. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  66. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  68. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  69. package/dist/api/impl/import-export/image-import.js +73 -0
  70. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  71. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  72. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  73. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  74. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  75. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  76. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  77. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  78. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  79. package/dist/api/impl/import-export/style-validation.js +86 -0
  80. package/dist/api/impl/import-export/types.d.ts +52 -0
  81. package/dist/api/impl/import-export/types.js +3 -0
  82. package/dist/api/impl/input.js +180 -0
  83. package/dist/api/impl/layers.js +307 -0
  84. package/dist/api/impl/metadata.d.ts +1 -0
  85. package/dist/api/impl/metadata.js +22 -0
  86. package/dist/api/impl/options.d.ts +1 -0
  87. package/dist/api/impl/options.js +822 -0
  88. package/dist/api/impl/placement.d.ts +1 -0
  89. package/dist/api/impl/placement.js +138 -0
  90. package/dist/api/impl/render-context.d.ts +13 -0
  91. package/dist/api/impl/render-context.js +272 -0
  92. package/dist/api/impl/rows.d.ts +1 -0
  93. package/dist/api/impl/rows.js +46 -0
  94. package/dist/api/impl/selection.d.ts +1 -0
  95. package/dist/api/impl/selection.js +186 -0
  96. package/dist/api/impl/shared.d.ts +64 -0
  97. package/dist/api/impl/shared.js +178 -0
  98. package/dist/api/impl/validate-extension.d.ts +1 -0
  99. package/dist/api/impl/validate-extension.js +159 -0
  100. package/dist/api/layers.d.ts +130 -0
  101. package/dist/api/layers.js +3 -0
  102. package/dist/api/metadata.d.ts +18 -0
  103. package/dist/api/metadata.js +3 -0
  104. package/dist/api/model.d.ts +487 -0
  105. package/dist/api/model.js +47 -0
  106. package/dist/api/options.d.ts +466 -0
  107. package/dist/api/options.js +3 -0
  108. package/dist/api/selection.d.ts +94 -0
  109. package/dist/api/selection.js +3 -0
  110. package/dist/api/state.d.ts +155 -0
  111. package/dist/api/state.js +12 -0
  112. package/dist/{display → dataset}/chunk.d.ts +1 -1
  113. package/dist/{display → dataset}/chunk.js +4 -3
  114. package/dist/{display → dataset}/dataset.js +18 -21
  115. package/dist/dataset/interaction.d.ts +1 -0
  116. package/dist/{display → dataset}/interaction.js +18 -6
  117. package/dist/dataset/manager.d.ts +1 -0
  118. package/dist/dataset/provider.d.ts +1 -0
  119. package/dist/{display → dataset}/retained.d.ts +1 -1
  120. package/dist/{display → dataset}/retained.js +8 -7
  121. package/dist/dataset/source.d.ts +1 -0
  122. package/dist/{display → dataset}/source.js +17 -4
  123. package/dist/dataset/spatial.d.ts +1 -0
  124. package/dist/{display → dataset}/spatial.js +1 -1
  125. package/dist/dataset/style.d.ts +1 -0
  126. package/dist/{display → dataset}/style.js +1 -1
  127. package/dist/dataset/table-source.d.ts +1 -0
  128. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  129. package/dist/{display → dataset}/thinning.d.ts +0 -10
  130. package/dist/{display → dataset}/thinning.js +3 -2
  131. package/dist/dataset/triangulation.d.ts +1 -0
  132. package/dist/{display → dataset}/triangulation.js +0 -0
  133. package/dist/{display → dataset}/types.d.ts +82 -121
  134. package/dist/dataset/types.js +61 -0
  135. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  136. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  137. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  138. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  139. package/dist/dispatcher/hit-test/service.js +80 -16
  140. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  141. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  142. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  143. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  144. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  145. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  146. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  147. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  148. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  149. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  150. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  151. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  152. package/dist/dispatcher/input-router.js +152 -69
  153. package/dist/dispatcher/normalizer.js +6 -2
  154. package/dist/dispatcher/types.d.ts +6 -1
  155. package/dist/extension/feature-handler.d.ts +1 -182
  156. package/dist/extension/index.d.ts +4 -7
  157. package/dist/extension/renderers.d.ts +1 -208
  158. package/dist/geometry/angle.d.ts +0 -8
  159. package/dist/geometry/angle.js +0 -8
  160. package/dist/geometry/bbox.d.ts +4 -12
  161. package/dist/geometry/bbox.js +4 -12
  162. package/dist/geometry/boolean.d.ts +0 -51
  163. package/dist/geometry/boolean.js +0 -51
  164. package/dist/geometry/buffer.d.ts +0 -26
  165. package/dist/geometry/buffer.js +0 -26
  166. package/dist/geometry/circle.d.ts +0 -9
  167. package/dist/geometry/circle.js +0 -9
  168. package/dist/geometry/coords.d.ts +0 -16
  169. package/dist/geometry/coords.js +0 -16
  170. package/dist/geometry/distance.d.ts +0 -24
  171. package/dist/geometry/distance.js +0 -24
  172. package/dist/geometry/errors.d.ts +21 -36
  173. package/dist/geometry/errors.js +49 -29
  174. package/dist/geometry/geojson.d.ts +81 -0
  175. package/dist/geometry/geojson.js +164 -0
  176. package/dist/geometry/index.d.ts +38 -23
  177. package/dist/geometry/index.js +43 -31
  178. package/dist/geometry/measure.d.ts +0 -27
  179. package/dist/geometry/measure.js +0 -27
  180. package/dist/geometry/predicates.d.ts +0 -9
  181. package/dist/geometry/predicates.js +0 -9
  182. package/dist/geometry/public-bounds.d.ts +26 -0
  183. package/dist/geometry/public-bounds.js +30 -0
  184. package/dist/geometry/public-combine.d.ts +78 -0
  185. package/dist/geometry/public-combine.js +82 -0
  186. package/dist/geometry/public-create.d.ts +54 -0
  187. package/dist/geometry/public-create.js +70 -0
  188. package/dist/geometry/public-measure.d.ts +170 -0
  189. package/dist/geometry/public-measure.js +283 -0
  190. package/dist/geometry/public-predicates.d.ts +54 -0
  191. package/dist/geometry/public-predicates.js +144 -0
  192. package/dist/geometry/public-repair.d.ts +75 -0
  193. package/dist/geometry/public-repair.js +77 -0
  194. package/dist/geometry/simplify.d.ts +0 -7
  195. package/dist/geometry/simplify.js +0 -7
  196. package/dist/geometry/split.d.ts +0 -20
  197. package/dist/geometry/split.js +0 -20
  198. package/dist/geometry/units.d.ts +20 -12
  199. package/dist/geometry/units.js +20 -12
  200. package/dist/index.d.ts +52 -66
  201. package/dist/index.js +6 -18
  202. package/dist/messages.d.ts +7 -7
  203. package/dist/modes/draw/circle.js +83 -207
  204. package/dist/modes/draw/commit-layer.d.ts +5 -16
  205. package/dist/modes/draw/commit-layer.js +2 -13
  206. package/dist/modes/draw/freehand.js +108 -246
  207. package/dist/modes/draw/image.js +4 -2
  208. package/dist/modes/draw/index.d.ts +5 -5
  209. package/dist/modes/draw/index.js +5 -5
  210. package/dist/modes/draw/line.js +18 -354
  211. package/dist/modes/draw/point.js +29 -78
  212. package/dist/modes/draw/polygon.js +23 -368
  213. package/dist/modes/draw/trace-support.d.ts +43 -36
  214. package/dist/modes/draw/trace-support.js +95 -98
  215. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  216. package/dist/modes/draw/vertex-drawing.js +176 -0
  217. package/dist/modes/handler.d.ts +1 -285
  218. package/dist/modes/manager.d.ts +2 -2
  219. package/dist/modes/manager.js +3 -0
  220. package/dist/modes/select/box-selection.d.ts +3 -3
  221. package/dist/modes/select/box-selection.js +2 -1
  222. package/dist/modes/select/click-handler.d.ts +5 -5
  223. package/dist/modes/select/click-handler.js +22 -20
  224. package/dist/modes/select/cursor-handler.d.ts +2 -2
  225. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  226. package/dist/modes/select/drag/move.js +3 -3
  227. package/dist/modes/select/drag/operation.d.ts +3 -3
  228. package/dist/modes/select/drag/radius.js +5 -4
  229. package/dist/modes/select/drag/transform.d.ts +2 -2
  230. package/dist/modes/select/drag/transform.js +11 -5
  231. package/dist/modes/select/drag/vertex.d.ts +2 -2
  232. package/dist/modes/select/drag/vertex.js +13 -8
  233. package/dist/modes/select/drag-handler.js +44 -25
  234. package/dist/modes/select/mode.js +17 -17
  235. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  236. package/dist/modes/select/shortcut-handler.js +9 -7
  237. package/dist/operations/layer-operations.js +29 -168
  238. package/dist/operations/resize.d.ts +2 -2
  239. package/dist/operations/resize.js +5 -5
  240. package/dist/operations/rotate.js +5 -5
  241. package/dist/operations/selection-operations.d.ts +16 -1
  242. package/dist/operations/selection-operations.js +28 -13
  243. package/dist/operations/shared-vertex.js +4 -2
  244. package/dist/operations/trace-graph.d.ts +0 -18
  245. package/dist/operations/trace-graph.js +0 -18
  246. package/dist/operations/vertex.js +36 -35
  247. package/dist/shared/color.d.ts +1 -0
  248. package/dist/shared/color.js +245 -0
  249. package/dist/shared/config/constants.d.ts +1 -54
  250. package/dist/shared/config/constants.js +1 -58
  251. package/dist/shared/config/feature-style.d.ts +16 -13
  252. package/dist/shared/config/feature-style.js +9 -0
  253. package/dist/shared/config/rendering.d.ts +3 -3
  254. package/dist/shared/config/selection-highlight.d.ts +0 -15
  255. package/dist/shared/config/selection-highlight.js +4 -7
  256. package/dist/shared/config/selection.d.ts +2 -32
  257. package/dist/shared/config/selection.js +0 -18
  258. package/dist/shared/config/topology.d.ts +2 -2
  259. package/dist/shared/config/trace.d.ts +4 -4
  260. package/dist/shared/math/angle.d.ts +1 -1
  261. package/dist/shared/math/angle.js +1 -1
  262. package/dist/shared/math/circle.d.ts +1 -1
  263. package/dist/shared/math/circle.js +1 -1
  264. package/dist/shared/math/distance.d.ts +2 -1
  265. package/dist/shared/math/distance.js +3 -2
  266. package/dist/shared/math/index.d.ts +1 -1
  267. package/dist/shared/math/index.js +1 -1
  268. package/dist/shared/math/transform.d.ts +23 -0
  269. package/dist/shared/math/transform.js +47 -28
  270. package/dist/shared/properties.d.ts +18 -0
  271. package/dist/shared/properties.js +129 -0
  272. package/dist/shared/types/events.d.ts +15 -7
  273. package/dist/shared/types/model.d.ts +109 -159
  274. package/dist/shared/types/style.d.ts +1 -1
  275. package/dist/shared/utils/color.d.ts +2 -36
  276. package/dist/shared/utils/color.js +13 -70
  277. package/dist/shared/utils/coordinates.d.ts +30 -4
  278. package/dist/shared/utils/coordinates.js +56 -10
  279. package/dist/shared/utils/event-emitter.d.ts +1 -262
  280. package/dist/shared/utils/event-emitter.js +4 -3
  281. package/dist/shared/utils/feature-bbox.js +8 -7
  282. package/dist/shared/utils/feature-segments.js +5 -4
  283. package/dist/shared/utils/image.d.ts +0 -4
  284. package/dist/shared/utils/image.js +0 -6
  285. package/dist/shared/utils/name-generator.d.ts +14 -20
  286. package/dist/shared/utils/name-generator.js +20 -3
  287. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  288. package/dist/shared/utils/pixel-ratio.js +13 -4
  289. package/dist/shared/utils/property.d.ts +7 -50
  290. package/dist/shared/utils/property.js +22 -87
  291. package/dist/snapping/custom-targets.js +21 -4
  292. package/dist/snapping/indicator.js +20 -11
  293. package/dist/snapping/providers/display.d.ts +6 -1
  294. package/dist/snapping/providers/display.js +2 -1
  295. package/dist/snapping/providers/guide.d.ts +3 -43
  296. package/dist/snapping/providers/guide.js +1 -44
  297. package/dist/snapping/providers/intersection.js +1 -1
  298. package/dist/snapping/providers/store.js +3 -3
  299. package/dist/snapping/service.js +18 -7
  300. package/dist/snapping/types.d.ts +9 -35
  301. package/dist/store/draw-store.js +233 -142
  302. package/dist/store/local-visibility.d.ts +11 -6
  303. package/dist/store/local-visibility.js +38 -7
  304. package/dist/store/lock.d.ts +0 -6
  305. package/dist/store/lock.js +0 -6
  306. package/dist/store/memory/change-bus.d.ts +3 -3
  307. package/dist/store/memory/change-bus.js +12 -0
  308. package/dist/store/memory/file-store.d.ts +2 -2
  309. package/dist/store/memory/ui-state.d.ts +1 -51
  310. package/dist/store/memory/ui-state.js +122 -134
  311. package/dist/store/memory.d.ts +1 -8
  312. package/dist/store/memory.js +249 -45
  313. package/dist/store/ordering.d.ts +9 -0
  314. package/dist/store/ordering.js +17 -0
  315. package/dist/store/spatial/spatial-index.d.ts +1 -1
  316. package/dist/store/spatial/spatial-index.js +1 -1
  317. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  318. package/dist/store/spatial/store-spatial-index.js +9 -3
  319. package/dist/store/store.d.ts +66 -107
  320. package/dist/store/types.d.ts +1 -1
  321. package/dist/store/writable-layer.d.ts +1 -1
  322. package/dist/store/writable-layer.js +2 -2
  323. package/dist/table/builder.d.ts +83 -0
  324. package/dist/table/builder.js +381 -0
  325. package/dist/table/index.d.ts +37 -0
  326. package/dist/table/index.js +5 -0
  327. package/dist/table/packed-rtree.d.ts +1 -0
  328. package/dist/{display → table}/packed-rtree.js +1 -1
  329. package/dist/table/partition.d.ts +1 -0
  330. package/dist/{display → table}/partition.js +3 -3
  331. package/dist/table/prepare.d.ts +44 -0
  332. package/dist/table/prepare.js +136 -0
  333. package/dist/table/table.d.ts +1 -0
  334. package/dist/{display/columnar → table}/table.js +29 -25
  335. package/dist/{display/columnar → table}/types.d.ts +68 -72
  336. package/dist/table/types.js +3 -0
  337. package/dist/view/coordinator.js +4 -3
  338. package/dist/view/feature-companion.d.ts +13 -7
  339. package/dist/view/feature-companion.js +11 -3
  340. package/dist/view/globe-subdivision.js +3 -3
  341. package/dist/view/layer/attach.d.ts +1 -1
  342. package/dist/view/layer/attach.js +1 -1
  343. package/dist/view/layer/custom-layer.js +40 -11
  344. package/dist/view/layer/display-list.js +2 -1
  345. package/dist/view/layer/drape-planner.d.ts +2 -2
  346. package/dist/view/layer/frame-render.d.ts +3 -3
  347. package/dist/view/layer/frame-render.js +7 -2
  348. package/dist/view/layer/frame-state.d.ts +6 -6
  349. package/dist/view/layer/index.d.ts +2 -2
  350. package/dist/view/layer/index.js +1 -1
  351. package/dist/view/layer/render.d.ts +4 -4
  352. package/dist/view/layer/render.js +3 -8
  353. package/dist/view/layer/renderers.d.ts +2 -2
  354. package/dist/view/layer/renderers.js +1 -1
  355. package/dist/view/layer/slot-manager.d.ts +2 -2
  356. package/dist/view/layer/slot-manager.js +4 -4
  357. package/dist/view/layer/slots.d.ts +2 -2
  358. package/dist/view/layer/slots.js +1 -1
  359. package/dist/view/layer/store-retained-bbox.js +3 -2
  360. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  361. package/dist/view/layer/store-retained-classify.js +19 -7
  362. package/dist/view/layer/store-retained-collect.js +8 -7
  363. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  364. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  365. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  366. package/dist/view/layer/store-retained-immediate.js +3 -8
  367. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  368. package/dist/view/layer/store-retained.d.ts +2 -2
  369. package/dist/view/layer/store-retained.js +1 -1
  370. package/dist/view/renderers/batch-manager.js +8 -7
  371. package/dist/view/renderers/drawer.js +21 -15
  372. package/dist/view/renderers/image.js +13 -39
  373. package/dist/view/renderers/line/line-types.d.ts +3 -3
  374. package/dist/view/renderers/line/sdf-line.js +3 -1
  375. package/dist/view/renderers/point/billboard-depth.js +1 -1
  376. package/dist/view/renderers/point/point-instance.js +1 -1
  377. package/dist/view/renderers/point/point-shape.js +2 -2
  378. package/dist/view/renderers/point/point-style.js +48 -4
  379. package/dist/view/renderers/polygon/batch.js +1 -2
  380. package/dist/view/renderers/polygon/fill.js +3 -1
  381. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  382. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  383. package/dist/view/renderers/stroke.js +3 -1
  384. package/dist/view/shaders/helpers.d.ts +2 -42
  385. package/dist/view/shaders/helpers.js +0 -6
  386. package/dist/view/shaders/projection.d.ts +15 -7
  387. package/dist/view/shaders/projection.js +23 -6
  388. package/dist/view/shaders/quad.d.ts +16 -12
  389. package/dist/view/shaders/quad.js +34 -13
  390. package/dist/view/style-rule.d.ts +5 -42
  391. package/dist/view/style-rule.js +20 -44
  392. package/dist/view/terrain/binding.d.ts +1 -0
  393. package/dist/view/terrain/binding.js +29 -0
  394. package/dist/view/terrain/context.d.ts +3 -4
  395. package/dist/view/terrain/context.js +4 -5
  396. package/dist/view/terrain/drape/geometry.js +1 -1
  397. package/dist/view/terrain/drape/pass.d.ts +1 -1
  398. package/dist/view/terrain/drape/pass.js +8 -7
  399. package/dist/view/terrain/polygon.d.ts +9 -5
  400. package/dist/view/terrain/polygon.js +16 -2
  401. package/dist/view/terrain/state.d.ts +1 -1
  402. package/dist/view/terrain/state.js +1 -1
  403. package/dist/view/terrain/tessellation.d.ts +2 -2
  404. package/dist/view/terrain/tessellation.js +1 -1
  405. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  406. package/dist/view/ui/bounds.js +8 -12
  407. package/dist/view/ui/handle-test.js +2 -2
  408. package/dist/view/ui/handle-thinning.js +17 -17
  409. package/dist/view/ui/handles.js +21 -13
  410. package/dist/view/ui/helper.d.ts +1 -1
  411. package/dist/view/ui/helper.js +1 -1
  412. package/dist/view/ui/index.d.ts +1 -1
  413. package/dist/view/ui/selection-scope.js +4 -2
  414. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  415. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  416. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  417. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  418. package/dist/view/ui/selection-ui/index.js +1 -1
  419. package/dist/view/ui/selection-ui/renderer.js +15 -38
  420. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  421. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  422. package/dist/view/ui/selection-ui-drawer.js +63 -2
  423. package/dist/view/ui/tentative.js +1 -1
  424. package/dist/webgl/index.d.ts +65 -0
  425. package/dist/webgl/index.js +62 -0
  426. package/package.json +20 -9
  427. package/dist/api/api.d.ts +0 -1259
  428. package/dist/api/api.js +0 -86
  429. package/dist/api/context.d.ts +0 -173
  430. package/dist/api/display-api.js +0 -23
  431. package/dist/api/event-api.d.ts +0 -13
  432. package/dist/api/event-api.js +0 -17
  433. package/dist/api/extension-api.d.ts +0 -46
  434. package/dist/api/extension-api.js +0 -85
  435. package/dist/api/feature-api.d.ts +0 -11
  436. package/dist/api/feature-api.js +0 -101
  437. package/dist/api/geometry/apply.d.ts +0 -51
  438. package/dist/api/geometry/boolean.d.ts +0 -28
  439. package/dist/api/geometry/boolean.js +0 -65
  440. package/dist/api/geometry/types.d.ts +0 -31
  441. package/dist/api/geometry-operations.d.ts +0 -162
  442. package/dist/api/geometry-operations.js +0 -94
  443. package/dist/api/group-api.d.ts +0 -10
  444. package/dist/api/group-api.js +0 -78
  445. package/dist/api/import-export/constants.d.ts +0 -29
  446. package/dist/api/import-export/constants.js +0 -40
  447. package/dist/api/import-export/file-name.d.ts +0 -10
  448. package/dist/api/import-export/file-name.js +0 -20
  449. package/dist/api/import-export/geojson-export.d.ts +0 -19
  450. package/dist/api/import-export/image-import.d.ts +0 -12
  451. package/dist/api/import-export/image-import.js +0 -53
  452. package/dist/api/import-export/index.d.ts +0 -9
  453. package/dist/api/import-export/index.js +0 -107
  454. package/dist/api/import-export/native-format.d.ts +0 -15
  455. package/dist/api/import-export/style-validation.d.ts +0 -27
  456. package/dist/api/import-export/style-validation.js +0 -49
  457. package/dist/api/import-export/types.d.ts +0 -26
  458. package/dist/api/index.d.ts +0 -15
  459. package/dist/api/index.js +0 -3
  460. package/dist/api/input-api.d.ts +0 -158
  461. package/dist/api/input-api.js +0 -144
  462. package/dist/api/instance-api.d.ts +0 -38
  463. package/dist/api/instance-api.js +0 -136
  464. package/dist/api/layer-api.d.ts +0 -12
  465. package/dist/api/layer-api.js +0 -62
  466. package/dist/api/selection-api.d.ts +0 -7
  467. package/dist/api/selection-api.js +0 -78
  468. package/dist/api/snapping-api.d.ts +0 -125
  469. package/dist/api/snapping-api.js +0 -50
  470. package/dist/api/topology-api.d.ts +0 -30
  471. package/dist/api/topology-api.js +0 -16
  472. package/dist/api/tracing-api.d.ts +0 -31
  473. package/dist/api/tracing-api.js +0 -16
  474. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  475. package/dist/dispatcher/hit-test/index.js +0 -9
  476. package/dist/dispatcher/index.d.ts +0 -15
  477. package/dist/dispatcher/index.js +0 -3
  478. package/dist/display/columnar/index.d.ts +0 -12
  479. package/dist/display/columnar/index.js +0 -13
  480. package/dist/display/columnar/prepare.d.ts +0 -42
  481. package/dist/display/columnar/prepare.js +0 -116
  482. package/dist/display/index.d.ts +0 -13
  483. package/dist/display/types.js +0 -43
  484. package/dist/maplibre-gl-draw.d.ts +0 -47
  485. package/dist/modes/cursor.js +0 -72
  486. package/dist/modes/index.d.ts +0 -7
  487. package/dist/operations/index.d.ts +0 -9
  488. package/dist/operations/index.js +0 -3
  489. package/dist/plugins/index.d.ts +0 -10
  490. package/dist/plugins/mutation-hooks.d.ts +0 -28
  491. package/dist/plugins/mutation-hooks.js +0 -84
  492. package/dist/plugins/plugin-context.js +0 -367
  493. package/dist/plugins/plugin-manager.d.ts +0 -103
  494. package/dist/plugins/plugin-manager.js +0 -316
  495. package/dist/plugins/plugin.d.ts +0 -529
  496. package/dist/shared/config/index.d.ts +0 -17
  497. package/dist/shared/config/index.js +0 -8
  498. package/dist/shared/utils/index.d.ts +0 -15
  499. package/dist/shared/utils/index.js +0 -24
  500. package/dist/snapping/index.d.ts +0 -14
  501. package/dist/snapping/index.js +0 -4
  502. package/dist/store/change-merger.js +0 -102
  503. package/dist/store/event-bridge.js +0 -161
  504. package/dist/store/index.d.ts +0 -12
  505. package/dist/store/index.js +0 -4
  506. package/dist/view/index.d.ts +0 -47
  507. package/dist/view/index.js +0 -20
  508. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  509. /package/dist/api/{import-export/types.js → document.js} +0 -0
  510. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  511. /package/dist/{display/index.js → api/events.js} +0 -0
  512. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  513. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  514. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  515. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  516. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  517. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  518. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  519. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  520. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  521. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  522. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  523. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  524. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  525. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  526. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  527. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  528. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  529. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  532. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  533. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  534. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  535. /package/dist/{display → dataset}/chunk-set.js +0 -0
  536. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  537. /package/dist/{display → dataset}/manager.js +0 -0
  538. /package/dist/{display → dataset}/provider.js +0 -0
  539. /package/dist/{display → dataset}/selection.d.ts +0 -0
  540. /package/dist/{display → dataset}/selection.js +0 -0
@@ -0,0 +1,155 @@
1
+ /**
2
+ * The state of this client: the mode, the selection, the vertex selection, the snapping
3
+ * result, the stacking order and the terrain diagnostics
4
+ */
5
+ import type { Position } from 'geojson';
6
+ /** The names of the built-in modes. */
7
+ export declare const MODES: readonly ["select", "draw_point", "draw_line", "draw_polygon", "draw_image", "draw_circle", "draw_freehand"];
8
+ /**
9
+ * The name of a mode: how the input is received. One of {@link MODES}, or the name of a mode
10
+ * added with `draw.extensions.modes.add`.
11
+ */
12
+ export type Mode = (typeof MODES)[number] | (string & {});
13
+ /** What the selection holds: features, groups or layers. */
14
+ export type SelectionType = 'feature' | 'group' | 'layer';
15
+ /** What this client has selected: the type and the IDs. The selection holds one type at a time. */
16
+ export interface Selection {
17
+ /** The type of the selected items, or `null` when nothing is selected */
18
+ type: SelectionType | null;
19
+ /** The IDs of the selected items */
20
+ ids: readonly string[];
21
+ }
22
+ /**
23
+ * A vertex of a feature, as the part, the ring and the index within the ring.
24
+ */
25
+ export interface VertexRef {
26
+ /** The part of a Multi geometry; 0 when it is left out */
27
+ part?: number;
28
+ /** The ring of a polygon, 0 for the outer ring; 0 for lines and points */
29
+ ring: number;
30
+ /** The index of the vertex within the ring */
31
+ index: number;
32
+ }
33
+ /** The selected vertices of one feature. */
34
+ export interface VertexSelection {
35
+ /** The ID of the feature */
36
+ featureId: string;
37
+ /** The selected vertices */
38
+ vertices: readonly VertexRef[];
39
+ }
40
+ /**
41
+ * Where the pointer snapped to. When nothing was snapped to, `lngLat` is the position of the
42
+ * pointer and `target` is absent.
43
+ */
44
+ export interface SnapResult {
45
+ /** The position after snapping */
46
+ lngLat: Position;
47
+ /** What was snapped to */
48
+ target?: {
49
+ /**
50
+ * The kind of the target; a kind of its own that a snap provider gave its candidate is
51
+ * kept as it is
52
+ */
53
+ kind: 'vertex' | 'edge' | 'intersection' | 'guide' | (string & {});
54
+ /** The ID of the feature, for a target of the document */
55
+ featureId?: string;
56
+ /** The ID of the dataset, for a target of a dataset */
57
+ datasetId?: string;
58
+ /** A description to show */
59
+ description?: string;
60
+ /** The vertex, for a vertex target */
61
+ vertex?: VertexRef;
62
+ /** The segment, for an edge or a guide */
63
+ segment?: {
64
+ start: Position;
65
+ end: Position;
66
+ };
67
+ };
68
+ }
69
+ /**
70
+ * How a mode wants the positions of its input snapped, as `ModeHandler.snapPreference` declares
71
+ * it. It is read before every input is snapped, so a mode whose preference changes
72
+ * while it draws declares it as a getter.
73
+ */
74
+ export interface SnapPreference {
75
+ /**
76
+ * The feature to prefer when snapping candidates are at the same distance, such as the
77
+ * boundary a trace started along; none when it is left out or `null`
78
+ */
79
+ prefer?: {
80
+ featureId: string;
81
+ datasetId?: string;
82
+ } | null;
83
+ /**
84
+ * The inputs whose position is not snapped, by the name of their receiver; every input is
85
+ * snapped when it is left out. A stroke drawn by dragging leaves out `onDrag`, so that its
86
+ * inner points follow the pointer while its ends still snap.
87
+ */
88
+ unsnapped?: readonly ('onClick' | 'onPointerMove' | 'onDragStart' | 'onDrag' | 'onDragEnd')[];
89
+ }
90
+ /**
91
+ * One division of the stacking order: the map layer that draws one run of the layer order
92
+ * between two entries that come from outside the document.
93
+ */
94
+ export interface LayerStackEntry {
95
+ /** The ID of the map layer that draws the run */
96
+ readonly layerId: string;
97
+ /** The index in the layer order where the run starts (inclusive) */
98
+ readonly from: number;
99
+ /** The index in the layer order where the run ends (exclusive) */
100
+ readonly to: number;
101
+ }
102
+ /**
103
+ * The state the terrain was drawn with, for diagnostics. Its fields follow the drawing and
104
+ * carry a weaker promise than the rest of the API.
105
+ */
106
+ export interface TerrainDiagnostics {
107
+ /** The terrain state of the last drawing */
108
+ readonly render: {
109
+ /** Whether the terrain was on and its elevation data usable */
110
+ readonly active: boolean;
111
+ /** The Mercator rectangle the elevation data covers, `[x0, y0, 1 / width, 1 / height]` */
112
+ readonly atlasRect: readonly [number, number, number, number];
113
+ /** The size of the elevation data in texels, `[width, height]` */
114
+ readonly atlasSize: readonly [number, number];
115
+ /** The factor from meters to Mercator z at the latitude of the center of the screen */
116
+ readonly elevationScale: number;
117
+ /** The lift above the ground in meters */
118
+ readonly liftMeters: number;
119
+ /** The subdivision step in meters (0 means no subdivision) */
120
+ readonly stepMeters: number;
121
+ /** The grid spacing of the subdivision, in Mercator units */
122
+ readonly stepGrid: number;
123
+ /** The generation of the subdivision; it counts the changes of the step */
124
+ readonly generation: number;
125
+ };
126
+ /** How the areas were laid on the terrain in the last drawing */
127
+ readonly drape: {
128
+ /** Whether the analytic drape was used */
129
+ readonly used: boolean;
130
+ /** Why it was not used */
131
+ readonly reason: string;
132
+ /** The number of features laid on the drape */
133
+ readonly featureCount: number;
134
+ /** The number of edges */
135
+ readonly edgeCount: number;
136
+ /** The number of tiles drawn */
137
+ readonly tileCount: number;
138
+ /** The largest number of runs in one cell */
139
+ readonly maxRunsPerCell: number;
140
+ /** The largest number of edges in one cell */
141
+ readonly maxEdgesPerCell: number;
142
+ /** The largest number of edges in one tile of the view */
143
+ readonly maxTileEdges: number;
144
+ /** The number of cells cut short for going over the budget */
145
+ readonly truncatedCells: number;
146
+ /** The number of tiles that could not be evaluated and were not drawn */
147
+ readonly unfitTiles: number;
148
+ /** The number of runs whose cell origin was inside the feature */
149
+ readonly insideRuns: number;
150
+ /** The number of features left off the drape */
151
+ readonly excluded: number;
152
+ /** The number of features drawn without the drape */
153
+ readonly immediate: number;
154
+ };
155
+ }
@@ -0,0 +1,12 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /** The names of the built-in modes. */
4
+ export const MODES = [
5
+ 'select',
6
+ 'draw_point',
7
+ 'draw_line',
8
+ 'draw_polygon',
9
+ 'draw_image',
10
+ 'draw_circle',
11
+ 'draw_freehand',
12
+ ];
@@ -1 +1 @@
1
- export { CHUNK_TARGET_SIZE, CHUNK_TARGET_VERTICES, chunkTargetSizeFor, LARGE_CHUNK_TARGET_SIZE, LARGE_DATASET_THRESHOLD, } from './partition.js';
1
+ export { CHUNK_TARGET_SIZE, CHUNK_TARGET_VERTICES, chunkTargetSizeFor, LARGE_CHUNK_TARGET_SIZE, LARGE_DATASET_THRESHOLD, } from '../table/partition.js';
@@ -1,8 +1,9 @@
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
  import { getBoundingBox } from '../shared/utils/feature-bbox.js';
4
- import { CHUNK_TARGET_SIZE, partitionRows } from './partition.js';
5
- export { CHUNK_TARGET_SIZE, CHUNK_TARGET_VERTICES, chunkTargetSizeFor, LARGE_CHUNK_TARGET_SIZE, LARGE_DATASET_THRESHOLD, } from './partition.js';
5
+ import { CHUNK_TARGET_SIZE, partitionRows } from '../table/partition.js';
6
+ export { CHUNK_TARGET_SIZE, CHUNK_TARGET_VERTICES, chunkTargetSizeFor, LARGE_CHUNK_TARGET_SIZE, LARGE_DATASET_THRESHOLD, } from '../table/partition.js';
6
7
  /**
7
8
  * Whether two bboxes intersect
8
9
  *
@@ -17,7 +18,7 @@ export function boundsIntersect(a, b) {
17
18
  * @internal
18
19
  */
19
20
  export function countVertices(feature) {
20
- const geometry = feature;
21
+ const geometry = { type: feature.type, coordinates: coordinatesOf(feature) };
21
22
  const walk = (value, depth) => {
22
23
  if (!Array.isArray(value))
23
24
  return 0;
@@ -4,11 +4,11 @@ import { DEFAULT_FEATURE_STYLE_CONFIG } from '../shared/config/feature-style.js'
4
4
  import { sanitizeDrawFactors } from '../view/renderers/draw-factors.js';
5
5
  import { TerrainContext } from '../view/terrain/context.js';
6
6
  import { DisplayChunkSet } from './chunk-set.js';
7
- import { ColumnarSource } from './columnar/source.js';
8
7
  import { DisplayProviderLoader } from './provider.js';
9
8
  import { drawSelectionHighlight, hitTestDisplayFeatures, sameFeatureIds, } from './selection.js';
10
9
  import { FeatureArraySource } from './source.js';
11
10
  import { DisplayFeatureStyler } from './style.js';
11
+ import { TableSource } from './table-source.js';
12
12
  import { CollisionThinningState, pointMarkerRadiusPx } from './thinning.js';
13
13
  import { normalizeDisplayFeature } from './types.js';
14
14
  // The importers of these moved names keep their path (the definitions live in the parts)
@@ -218,12 +218,9 @@ export class DatasetImpl {
218
218
  writable: true,
219
219
  value: (feature) => feature.type === 'Point' && this.externalPointRender?.(feature) === true
220
220
  });
221
- const given = [options.features, options.columnar, options.provider].filter((input) => input !== undefined);
221
+ const given = [options.rows, options.table, options.provider].filter((input) => input !== undefined);
222
222
  if (given.length > 1) {
223
- throw new Error(`Dataset "${options.id}": only one of features, columnar and provider can be given`);
224
- }
225
- if (options.prepared && !options.columnar) {
226
- throw new Error(`Dataset "${options.id}": prepared is given without columnar`);
223
+ throw new Error(`Dataset "${options.id}": only one of rows, table and provider can be given`);
227
224
  }
228
225
  this.id = options.id;
229
226
  this.currentOrder = options.order ?? 'below-store';
@@ -267,11 +264,11 @@ export class DatasetImpl {
267
264
  },
268
265
  })
269
266
  : null;
270
- if (options.features) {
271
- this.setFeatures(options.features);
267
+ if (options.rows) {
268
+ this.setRows(options.rows);
272
269
  }
273
- else if (options.columnar) {
274
- this.setColumnar(options.columnar, options.prepared);
270
+ else if (options.table) {
271
+ this.setTable(options.table);
275
272
  }
276
273
  }
277
274
  /** Draw order (the current side) */
@@ -307,12 +304,12 @@ export class DatasetImpl {
307
304
  this.emit('change', { reason: 'visibility' });
308
305
  this.deps.requestRepaint();
309
306
  }
310
- setFeatures(features) {
311
- this.applySource(new FeatureArraySource(features.map(normalizeDisplayFeature)));
307
+ setRows(rows) {
308
+ this.applySource(new FeatureArraySource(rows.map(normalizeDisplayFeature)));
312
309
  this.deps.requestRepaint();
313
310
  }
314
- setColumnar(input, prepared) {
315
- this.applySource(new ColumnarSource(input, prepared));
311
+ setTable(table) {
312
+ this.applySource(new TableSource(table));
316
313
  this.deps.requestRepaint();
317
314
  }
318
315
  setStyleRule(rule) {
@@ -472,7 +469,7 @@ export class DatasetImpl {
472
469
  const source = this.source;
473
470
  // A table of points has nothing for it (and its rows are not built into features for
474
471
  // nothing)
475
- if (source instanceof ColumnarSource && source.table.onlyPoints)
472
+ if (source instanceof TableSource && source.table.onlyPoints)
476
473
  return [];
477
474
  const features = [];
478
475
  for (let row = 0; row < source.length; row++) {
@@ -515,10 +512,10 @@ export class DatasetImpl {
515
512
  // hidden rows)
516
513
  return source.index.searchWhere(bounds, (row) => thinning.isDrawnRow(row) && source.thinningRole(row) !== 'skip');
517
514
  }
518
- getRowFeature(row) {
519
- if (!this.hasRow(row))
520
- return null;
521
- return this.styler.prepareIfStyled(this.source.featureAt(row));
515
+ getRow(index) {
516
+ if (!this.hasRow(index))
517
+ return undefined;
518
+ return this.styler.prepareIfStyled(this.source.featureAt(index));
522
519
  }
523
520
  getRowId(row) {
524
521
  return this.hasRow(row) ? this.source.idOf(row) : null;
@@ -731,8 +728,8 @@ export class DatasetImpl {
731
728
  /**
732
729
  * Applies new contents (the chunks, the index and the caches come with them)
733
730
  *
734
- * The only triggers for rebuilding the retained batches are this path (setFeatures,
735
- * setColumnar and applying a provider result) and setStyleRule / setBaseStyle.
731
+ * The only triggers for rebuilding the retained batches are this path (setRows,
732
+ * setTable and applying a provider result) and setStyleRule / setBaseStyle.
736
733
  */
737
734
  applySource(source) {
738
735
  this.source = source;
@@ -0,0 +1 @@
1
+ export {};
@@ -13,7 +13,10 @@ export function createDisplayInteractions(deps) {
13
13
  function toCoordinate(event) {
14
14
  return [event.lngLat.lng, event.lngLat.lat];
15
15
  }
16
- function clearHover(lngLat) {
16
+ function toPoint(event) {
17
+ return { x: event.point.x, y: event.point.y };
18
+ }
19
+ function clearHover(lngLat, point) {
17
20
  if (hoveredDatasetId === null)
18
21
  return;
19
22
  const previous = manager.getInternal(hoveredDatasetId);
@@ -21,7 +24,7 @@ export function createDisplayInteractions(deps) {
21
24
  hoveredDatasetId = null;
22
25
  hoveredFeatureId = null;
23
26
  // Report with feature: null that it left the target
24
- previous?.emit('hover', { datasetId, feature: null, row: null, lngLat });
27
+ previous?.emit('hover', { datasetId, feature: null, row: null, lngLat, point });
25
28
  }
26
29
  return {
27
30
  handleClick(event) {
@@ -44,35 +47,43 @@ export function createDisplayInteractions(deps) {
44
47
  feature: top.feature,
45
48
  row,
46
49
  lngLat: coordinate,
50
+ point: toPoint(event),
47
51
  });
48
52
  notifyClick?.({
49
53
  datasetId: top.dataset.id,
50
54
  feature: top.feature,
51
55
  row,
52
56
  lngLat: coordinate,
57
+ point: toPoint(event),
53
58
  });
54
59
  return;
55
60
  }
56
61
  // Nothing was there, or a non-interactive dataset merely blocked it: it is reported as
57
62
  // a no-hit (the source of "click on empty space to deselect" on the host side)
58
- notifyClick?.({ datasetId: null, feature: null, row: null, lngLat: coordinate });
63
+ notifyClick?.({
64
+ datasetId: null,
65
+ feature: null,
66
+ row: null,
67
+ lngLat: coordinate,
68
+ point: toPoint(event),
69
+ });
59
70
  },
60
71
  handleMouseMove(event) {
61
72
  const coordinate = toCoordinate(event);
62
73
  if (!manager.hasAny()) {
63
- clearHover(coordinate);
74
+ clearHover(coordinate, toPoint(event));
64
75
  return;
65
76
  }
66
77
  const top = hitTestTopmost(event);
67
78
  if (top?.kind !== 'dataset' || !top.feature) {
68
- clearHover(coordinate);
79
+ clearHover(coordinate, toPoint(event));
69
80
  return;
70
81
  }
71
82
  if (top.dataset.id === hoveredDatasetId && top.feature.id === hoveredFeatureId) {
72
83
  // Nothing fires while the pointer only moves over the same feature
73
84
  return;
74
85
  }
75
- clearHover(coordinate);
86
+ clearHover(coordinate, toPoint(event));
76
87
  hoveredDatasetId = top.dataset.id;
77
88
  hoveredFeatureId = top.feature.id;
78
89
  manager.getInternal(top.dataset.id)?.emit('hover', {
@@ -80,6 +91,7 @@ export function createDisplayInteractions(deps) {
80
91
  feature: top.feature,
81
92
  row: top.row ?? null,
82
93
  lngLat: coordinate,
94
+ point: toPoint(event),
83
95
  });
84
96
  },
85
97
  reset() {
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -4,7 +4,7 @@ import type { RetainedRendererSet } from '../view/renderers/retained.js';
4
4
  *
5
5
  * What cannot be finished in one frame is advanced by the budget of the frame and handed on. The
6
6
  * caller keeps drawing the batches of the previous version until it is finished
7
- * (`display/chunk-set.ts`). It is built the same way as the one-shot build
7
+ * (`dataset/chunk-set.ts`). It is built the same way as the one-shot build
8
8
  * (`buildChunkBatches`); only the unit of bundling differs.
9
9
  */
10
10
  export interface ChunkBuildJob {
@@ -1,6 +1,7 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  import { generateCirclePolygon } from '../shared/math/index.js';
4
+ import { coordinatesOf } from '../shared/utils/coordinates.js';
4
5
  import { getCircleRadius, getCreatedZoom } from '../shared/utils/property.js';
5
6
  import { toLineBatchItem, toPointInstanceData } from '../view/renderers/batch-manager.js';
6
7
  import { NEUTRAL_DRAW_FACTORS } from '../view/renderers/draw-factors.js';
@@ -741,29 +742,29 @@ export function collectFeature(feature, draft, styles, isExternallyRenderedPoint
741
742
  const skipSolid = skipDrapedFills && isDrapedGeometry(feature);
742
743
  switch (feature.type) {
743
744
  case 'Point':
744
- collectPoint(feature, feature.coordinates, draft, styles, isExternallyRenderedPoint);
745
+ collectPoint(feature, coordinatesOf(feature), draft, styles, isExternallyRenderedPoint);
745
746
  return;
746
747
  case 'MultiPoint':
747
748
  // Whether the predicate applies to Point alone is up to the predicate itself (the test is
748
749
  // in one place)
749
- for (const coord of feature.coordinates) {
750
+ for (const coord of coordinatesOf(feature)) {
750
751
  collectPoint(feature, coord, draft, styles, isExternallyRenderedPoint);
751
752
  }
752
753
  return;
753
754
  case 'LineString':
754
755
  case 'Freehand':
755
- collectLine(feature, feature.coordinates, draft, styles, skipSolid);
756
+ collectLine(feature, coordinatesOf(feature), draft, styles, skipSolid);
756
757
  return;
757
758
  case 'MultiLineString':
758
- for (const coords of feature.coordinates) {
759
+ for (const coords of coordinatesOf(feature)) {
759
760
  collectLine(feature, coords, draft, styles, skipSolid);
760
761
  }
761
762
  return;
762
763
  case 'Polygon':
763
- collectPolygon(feature, feature.coordinates, draft, styles, 0, skipSolid);
764
+ collectPolygon(feature, coordinatesOf(feature), draft, styles, 0, skipSolid);
764
765
  return;
765
766
  case 'MultiPolygon': {
766
- const parts = feature.coordinates;
767
+ const parts = coordinatesOf(feature);
767
768
  for (let i = 0; i < parts.length; i++) {
768
769
  collectPolygon(feature, parts[i], draft, styles, i, skipSolid);
769
770
  }
@@ -773,7 +774,7 @@ export function collectFeature(feature, draft, styles, isExternallyRenderedPoint
773
774
  const radiusMeters = getCircleRadius(feature);
774
775
  if (!radiusMeters || radiusMeters <= 0)
775
776
  return;
776
- const center = feature.coordinates;
777
+ const center = coordinatesOf(feature);
777
778
  collectPolygon(feature, [generateCirclePolygon(center, radiusMeters)], draft, styles);
778
779
  return;
779
780
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,7 +1,8 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { coordinatesOf } from '../shared/utils/coordinates.js';
4
+ import { chunkTargetSizeFor } from '../table/partition.js';
3
5
  import { computeFeatureBounds, partitionIntoChunks } from './chunk.js';
4
- import { chunkTargetSizeFor } from './partition.js';
5
6
  import { collectFeatures } from './retained.js';
6
7
  import { maxStylePointRadiusOf } from './selection.js';
7
8
  import { DisplaySpatialIndex } from './spatial.js';
@@ -59,6 +60,13 @@ export class FeatureArraySource {
59
60
  writable: true,
60
61
  value: null
61
62
  });
63
+ /** The features of the rows with a geometry, found on the first request */
64
+ Object.defineProperty(this, "withGeometry", {
65
+ enumerable: true,
66
+ configurable: true,
67
+ writable: true,
68
+ value: null
69
+ });
62
70
  this.length = list.length;
63
71
  // The bboxes are shared by the spatial index and the chunk splitting (not computed twice)
64
72
  this.bounds = computeFeatureBounds(list);
@@ -83,7 +91,7 @@ export class FeatureArraySource {
83
91
  if (ids.size === 0)
84
92
  return rows;
85
93
  for (let row = 0; row < this.list.length; row++) {
86
- if (ids.has(this.list[row].id))
94
+ if (ids.has(this.list[row].id) && this.hasGeometry(row))
87
95
  rows.push(row);
88
96
  }
89
97
  return rows;
@@ -98,13 +106,18 @@ export class FeatureArraySource {
98
106
  return this.rowById.get(id) ?? -1;
99
107
  }
100
108
  features() {
101
- return this.list;
109
+ if (!this.withGeometry) {
110
+ // The rows without a geometry (NaN coordinates) are left out, as a table leaves them out
111
+ const all = this.list.every((_, row) => this.hasGeometry(row));
112
+ this.withGeometry = all ? this.list : this.list.filter((_, row) => this.hasGeometry(row));
113
+ }
114
+ return this.withGeometry;
102
115
  }
103
116
  thinningRole(row) {
104
117
  return featureThinningRole(this.list[row]);
105
118
  }
106
119
  pointOf(row) {
107
- return this.list[row].coordinates;
120
+ return coordinatesOf(this.list[row]);
108
121
  }
109
122
  styleRadiusOf(row) {
110
123
  return this.list[row].style?.pointRadius;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,6 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
- import { buildPackedRTree, searchPackedRTree } from './packed-rtree.js';
3
+ import { buildPackedRTree, searchPackedRTree } from '../table/packed-rtree.js';
4
4
  /**
5
5
  * Spatial index of a dataset
6
6
  *
@@ -0,0 +1 @@
1
+ export {};
@@ -89,7 +89,7 @@ export class DisplayFeatureStyler {
89
89
  const channel = getStyleRuleChannel(feature.type);
90
90
  const ruleColor = this.styleCache.resolve(feature, this.styleRule);
91
91
  const style = this.effectiveStyle(feature.style, ruleColor, channel);
92
- const prepared = style === feature.style ? feature : { ...feature, style };
92
+ const prepared = style === feature.style ? feature : { ...feature, style: style ?? {} };
93
93
  this.preparedCache.set(feature.id, prepared);
94
94
  return prepared;
95
95
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -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;