@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
@@ -12,18 +12,81 @@ function styleAcceptsLayers(map) {
12
12
  return map.style?._loaded === true;
13
13
  }
14
14
  /**
15
- * Keeps the render slots of Draw on the map for as long as the returned detach function has not
15
+ * Puts the slots back on top of the map after a style change
16
+ *
17
+ * The slots, and the native layers the host placed between them (the separators), form one
18
+ * block that belongs at the top of the map, with the slots in their order (the first is the
19
+ * backmost). A full `setStyle` gives that by itself: the old layers are gone and the slots are
20
+ * added again on top. A diffed `setStyle` does not: maplibre's `Style.serialize()` leaves custom
21
+ * layers out, so the diff neither removes nor adds the slots, and the layers of the new style are
22
+ * added above them, which hides the drawing under the basemap.
23
+ *
24
+ * Nothing is moved when the block is already in place, so the `styledata` that follows a move
25
+ * finds nothing to do. When it is not, the block is moved to the top: each slot, followed by the
26
+ * native layers that sat just above it (up to the next slot), keeps its neighbours. The layers
27
+ * above the frontmost slot are taken as part of the new style and stay below the block.
28
+ *
29
+ * @param map The map
30
+ * @param slotLayers The slots (first = backmost)
31
+ */
32
+ function placeSlotsOnTop(map, slotLayers) {
33
+ const order = map.getLayersOrder();
34
+ const slotIds = slotLayers.map((layer) => layer.id).filter((id) => order.includes(id));
35
+ if (slotIds.length === 0)
36
+ return;
37
+ const isSlot = new Set(slotIds);
38
+ // The block runs from the backmost slot on the map to the frontmost one
39
+ let first = -1;
40
+ let last = -1;
41
+ order.forEach((id, index) => {
42
+ if (!isSlot.has(id))
43
+ return;
44
+ if (first < 0)
45
+ first = index;
46
+ last = index;
47
+ });
48
+ const block = order.slice(first, last + 1);
49
+ const slotsInBlock = block.filter((id) => isSlot.has(id));
50
+ const inOrder = slotsInBlock.every((id, index) => id === slotIds[index]);
51
+ if (inOrder && last === order.length - 1)
52
+ return;
53
+ // Each slot keeps the native layers that followed it
54
+ const following = new Map();
55
+ let current = '';
56
+ for (const id of block) {
57
+ if (isSlot.has(id)) {
58
+ current = id;
59
+ following.set(id, []);
60
+ }
61
+ else {
62
+ following.get(current)?.push(id);
63
+ }
64
+ }
65
+ for (const slotId of slotIds) {
66
+ map.moveLayer(slotId);
67
+ for (const id of following.get(slotId) ?? [])
68
+ map.moveLayer(id);
69
+ }
70
+ }
71
+ /**
72
+ * Keeps the frames of the stacking order on the map for as long as the returned detach function has not
16
73
  * been called
17
74
  *
18
75
  * One rule covers every timing: the slots are added whenever the style accepts layers and a slot
19
76
  * is missing. It is checked once now (for a map whose style is already parsed, even while tiles
20
- * are still loading) and again on every `styledata` event. maplibre fires `styledata` when a
21
- * style finishes loading (before `style.load` and `load`) and after changes to the style, so the
22
- * slots are also restored after `setStyle`, including a diffed `setStyle` that drops layers it
23
- * does not know. A slot that is already on the map is never added twice.
77
+ * are still loading) and again on every `styledata` and `style.load` event. maplibre fires
78
+ * `styledata` when a style finishes loading (before `style.load` and `load`) and after changes to
79
+ * the style, so the slots are also restored after a full `setStyle`. A slot that is already on
80
+ * the map is never added twice.
24
81
  *
25
82
  * The slots are added in order from the first (the backmost), which lines them up in the same
26
- * order in maplibre (layers added later are on top).
83
+ * order in maplibre (layers added later are on top). A slot missing while a later one is on the
84
+ * map is added just behind it.
85
+ *
86
+ * On `style.load` the slots are also put back on top of the map (see `placeSlotsOnTop`). maplibre
87
+ * fires it when a style is loaded and at the end of a diffed `setStyle` that changed something,
88
+ * and only then: a layer the host adds or moves itself fires `styledata` alone, so a layer the
89
+ * host put above the drawing stays there until the style is changed.
27
90
  *
28
91
  * @param map The map
29
92
  * @param getSlotLayers Returns the current list of slots (first = backmost)
@@ -33,15 +96,28 @@ export function attachSlotLayers(map, getSlotLayers) {
33
96
  const ensureSlots = () => {
34
97
  if (!styleAcceptsLayers(map))
35
98
  return;
36
- for (const slotLayer of getSlotLayers()) {
37
- if (!map.getLayer(slotLayer.id)) {
99
+ const slotLayers = getSlotLayers();
100
+ slotLayers.forEach((slotLayer, index) => {
101
+ if (map.getLayer(slotLayer.id))
102
+ return;
103
+ // Behind the next slot that is on the map, so that the slots stay in order
104
+ const next = slotLayers.slice(index + 1).find((later) => map.getLayer(later.id));
105
+ if (next)
106
+ map.addLayer(slotLayer, next.id);
107
+ else
38
108
  map.addLayer(slotLayer);
39
- }
40
- }
109
+ });
110
+ };
111
+ const restoreSlots = () => {
112
+ ensureSlots();
113
+ if (styleAcceptsLayers(map))
114
+ placeSlotsOnTop(map, getSlotLayers());
41
115
  };
42
116
  map.on('styledata', ensureSlots);
117
+ map.on('style.load', restoreSlots);
43
118
  ensureSlots();
44
119
  return () => {
45
120
  map.off('styledata', ensureSlots);
121
+ map.off('style.load', restoreSlots);
46
122
  };
47
123
  }
@@ -14,7 +14,7 @@ import { buildFrameState, StyleZoom } from './frame-state.js';
14
14
  import { createRenderScope } from './render-scope.js';
15
15
  import { disposeRenderers, initRenderers } from './renderers.js';
16
16
  import { SlotManager } from './slot-manager.js';
17
- import { renderSlotLayerId } from './slots.js';
17
+ import { slotLayerId } from './slots.js';
18
18
  import { StoreRetainedCache } from './store-retained.js';
19
19
  import { isOpacityOnlyLayersChange } from './store-retained-invalidation.js';
20
20
  import { TerrainResolver } from './terrain-resolver.js';
@@ -66,7 +66,10 @@ export function createCustomLayer(deps) {
66
66
  store,
67
67
  terrain: terrainContext,
68
68
  datasets,
69
- timeSlicing: renderingConfig.timeSlicing,
69
+ // Read at each build, so a change of the rendering switches applies to the next one
70
+ get timeSlicing() {
71
+ return renderingConfig.timeSlicing;
72
+ },
70
73
  });
71
74
  const styleZoom = new StyleZoom();
72
75
  const slots = new SlotManager({
@@ -94,6 +97,14 @@ export function createCustomLayer(deps) {
94
97
  // Changes made while the layer was off the map were not seen
95
98
  displayList.invalidate();
96
99
  engine.unsubscribeStore = store.subscribe((changes) => {
100
+ // A replacement of the whole document drops every cache of the features, whatever the
101
+ // notification lists (the new document can reuse an ID with another shape)
102
+ if (changes.reset === true) {
103
+ renderScope.earcut.clear();
104
+ renderScope.styleRules.clear();
105
+ terrainContext.fillCache.clear();
106
+ engine.storeRetainedCache?.invalidateAll();
107
+ }
97
108
  engine.storeRetainedCache?.applyChanges(changes);
98
109
  displayList.applyChanges(changes);
99
110
  // The binning of the analytic drape is rebuilt only on a change of the geometry, the style,
@@ -293,7 +304,7 @@ export function createCustomLayer(deps) {
293
304
  // renderer; see shaders/frame.ts)
294
305
  beginRenderFrame();
295
306
  // While the camera is moving, the re-baking of the retained batches is deferred (read by
296
- // display/chunk-set.ts)
307
+ // dataset/chunk-set.ts)
297
308
  setTerrainCameraMoving(terrainContext, map?.isMoving?.() === true || map?.isZooming?.() === true);
298
309
  // The zoom that the rendering reads is the style zoom (a value that absorbs the steps of the
299
310
  // elevation settlement; frame-state.ts). The position of the camera (the altitude in meters)
@@ -319,7 +330,7 @@ export function createCustomLayer(deps) {
319
330
  // The cells the globe cuts the geometry into (none on a flat map; globe-subdivision.ts)
320
331
  updateGlobeSubdivision(terrainContext, renderOptions.defaultProjectionData.projectionTransition ?? 0, rawZoom);
321
332
  // Follow the changes of the rendering pixel ratio (moving to another display, or
322
- // draw.setRenderScale()). The widths of the already baked retained batches no longer match
333
+ // draw.setScaleFactor()). The widths of the already baked retained batches no longer match
323
334
  // when the ratio changes, so they are discarded.
324
335
  const dpr = resolvePixelRatio(pixelRatio);
325
336
  if (engine.builtPixelRatio !== dpr) {
@@ -389,7 +400,7 @@ export function createCustomLayer(deps) {
389
400
  /** Creates the CustomLayer of the slot at `index` (the first one is customLayer itself) */
390
401
  function makeSlotLayer(index) {
391
402
  return {
392
- id: renderSlotLayerId(index),
403
+ id: slotLayerId(index),
393
404
  type: 'custom',
394
405
  renderingMode: '3d',
395
406
  onAdd(mapInstance, glContext) {
@@ -412,7 +423,7 @@ export function createCustomLayer(deps) {
412
423
  return false;
413
424
  }
414
425
  const customLayer = {
415
- id: renderSlotLayerId(0),
426
+ id: slotLayerId(0),
416
427
  type: 'custom',
417
428
  renderingMode: '3d',
418
429
  onAdd(mapInstance, glContext) {
@@ -436,7 +447,7 @@ export function createCustomLayer(deps) {
436
447
  onRemove() {
437
448
  engineRemove();
438
449
  },
439
- addOverlayRenderer(renderer) {
450
+ addOverlay(renderer) {
440
451
  dynamicOverlayRenderers.push(renderer);
441
452
  // An element involved in the rendering was added, so the prepared retained batches are
442
453
  // rebuilt
@@ -445,9 +456,9 @@ export function createCustomLayer(deps) {
445
456
  if (engine.renderers && engine.gl && engine.mapInstance) {
446
457
  renderer.onAdd(engine.gl, engine.mapInstance);
447
458
  }
448
- return () => customLayer.removeOverlayRenderer(renderer);
459
+ return () => customLayer.removeOverlay(renderer);
449
460
  },
450
- removeOverlayRenderer(renderer) {
461
+ removeOverlay(renderer) {
451
462
  const index = dynamicOverlayRenderers.indexOf(renderer);
452
463
  if (index === -1)
453
464
  return;
@@ -481,8 +492,8 @@ export function createCustomLayer(deps) {
481
492
  engine.mapInstance?.triggerRepaint();
482
493
  };
483
494
  },
484
- getRenderSlots() {
485
- return slots.getRenderSlots();
495
+ getStackSlots() {
496
+ return slots.getStackSlots();
486
497
  },
487
498
  getSlotLayers() {
488
499
  return slots.getSlotLayers();
@@ -490,6 +501,9 @@ export function createCustomLayer(deps) {
490
501
  getTerrainContext() {
491
502
  return terrainContext;
492
503
  },
504
+ getGL() {
505
+ return engine.renderers ? engine.gl : null;
506
+ },
493
507
  hasPendingWork() {
494
508
  if (drape.hasPendingWork)
495
509
  return true;
@@ -501,6 +515,21 @@ export function createCustomLayer(deps) {
501
515
  }
502
516
  return false;
503
517
  },
518
+ refresh() {
519
+ renderScope.earcut.clear();
520
+ renderScope.styleRules.clear();
521
+ displayList.invalidate();
522
+ drape.invalidate();
523
+ if (!engine.mapInstance)
524
+ return;
525
+ // The renderers and the retained batches read the configuration when they are built
526
+ if (engine.renderers) {
527
+ releaseGpuResources();
528
+ buildGpuResources();
529
+ }
530
+ slots.sync();
531
+ engine.mapInstance.triggerRepaint();
532
+ },
504
533
  };
505
534
  // The first slot is customLayer itself. When there are separators, the following slots are
506
535
  // prepared here (the host adds them to the map in order from the first)
@@ -90,7 +90,8 @@ export class DisplayListCache {
90
90
  changes.groups !== undefined ||
91
91
  changes.layerReorder !== undefined ||
92
92
  changes.groupReorder !== undefined ||
93
- changes.uiStateChanged === true) {
93
+ changes.uiStateChanged === true ||
94
+ changes.reset === true) {
94
95
  this.invalidate();
95
96
  }
96
97
  }
@@ -92,8 +92,8 @@ export interface DrapePlannerDataset extends DrapeDatasetSource {
92
92
  /**
93
93
  * The datasets as the planner sees them
94
94
  *
95
- * The manager in `display/manager.ts` satisfies this shape. Only the structure is declared here,
96
- * so that the planner does not read a type from display/ (which sits above view/).
95
+ * The manager in `dataset/manager.ts` satisfies this shape. Only the structure is declared here,
96
+ * so that the planner does not read a type from dataset/ (which sits above view/).
97
97
  */
98
98
  export interface DrapePlannerDatasets {
99
99
  listInternal(): readonly DrapePlannerDataset[];
@@ -8,7 +8,7 @@
8
8
  * set and restored through gl-state.ts.
9
9
  */
10
10
  import type { Map as MapLibreMap } from 'maplibre-gl';
11
- import type { CustomFeatureHandler } from '../../extension/index.js';
11
+ import type { FeatureTypeHandler } from '../../extension/index.js';
12
12
  import type { Store } from '../../store/store.js';
13
13
  import type { FeatureCompanionRegistry } from '../feature-companion.js';
14
14
  import type { TerrainContext } from '../terrain/context.js';
@@ -20,7 +20,7 @@ import type { Renderers } from './renderers.js';
20
20
  import type { StoreRetainedCache } from './store-retained.js';
21
21
  /**
22
22
  * The datasets as the per-layer rendering takes them (the type is owned by
23
- * render.ts, so this file does not read a type from display/)
23
+ * render.ts, so this file does not read a type from dataset/)
24
24
  */
25
25
  type RenderedDatasets = Parameters<typeof renderLayers>[10];
26
26
  /** What the drawing of a frame reads (the engine of the layer, while its GPU side exists) */
@@ -31,7 +31,7 @@ export interface FrameRenderDeps {
31
31
  store: Store;
32
32
  terrainContext: TerrainContext;
33
33
  drape: DrapePlanner;
34
- customRenderers: Map<string, CustomFeatureHandler['renderer']>;
34
+ customRenderers: Map<string, FeatureTypeHandler['renderer']>;
35
35
  featureCompanions: FeatureCompanionRegistry;
36
36
  datasets?: RenderedDatasets;
37
37
  storeRetainedCache: StoreRetainedCache | null;
@@ -2,7 +2,7 @@
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  import { isInteractionBlocked } from '../../store/lock.js';
4
4
  import { setDrapePaintedDatasets, setQuadDrapeFrame, setTerrainRenderState, setTerrainShadeLight, setTerrainSurfacesFlattened, } from '../terrain/state.js';
5
- import { renderFollowedVertices, renderSelectionUI } from '../ui/selection-ui-drawer.js';
5
+ import { renderFollowedVertices, renderGlobalAuxiliaryHandles, renderSelectionUI, } from '../ui/selection-ui-drawer.js';
6
6
  import { applyDrapeGlState, applySegmentDepthState, applySegmentGlState, enterSymbolGlState, restoreSegmentGlState, resumeDrapeGlState, } from './gl-state.js';
7
7
  import { renderLayers } from './render.js';
8
8
  /** Makes the renderers draw on one copy of the world */
@@ -156,11 +156,16 @@ export function renderForeground(deps, f) {
156
156
  };
157
157
  const tentative = store.getTentative();
158
158
  const boxSelection = store.getBoxSelection();
159
+ const globalHandlesShown = store.getMode() === 'select' && !store.isReadOnly() && !store.isInteractionLocked();
159
160
  // Once per copy of the world in view (the selection UI of a feature on the other side of the
160
161
  // antimeridian is drawn on the copy the feature is drawn on)
161
162
  for (const copy of f.copies) {
162
163
  applyCopy(deps, copy);
163
- renderSelectionUI(copy.selectedFeatures, f.zoom, copy.projectionData, selectionUIDeps, store.getDragState(), store.getSelectedVertices(), selectionLocked);
164
+ renderSelectionUI(copy.selectedFeatures, f.zoom, copy.projectionData, selectionUIDeps, store.getDragState(), store.getVertexSelection(), selectionLocked);
165
+ // The handles of the extensions that belong to no feature, while they can be grabbed
166
+ if (globalHandlesShown) {
167
+ renderGlobalAuxiliaryHandles(f.zoom, copy.projectionData, selectionUIDeps, store.getDragState());
168
+ }
164
169
  // The vertices that follow along when a shared vertex is moved (raised only during a
165
170
  // drag). The features that follow are not selected, so they are drawn separately from the
166
171
  // selection UI.
@@ -8,7 +8,7 @@
8
8
  * drawing of the slots is in frame-render.ts.
9
9
  */
10
10
  import type { CustomRenderMethodInput, Map as MapLibreMap } from 'maplibre-gl';
11
- import type { CustomOverlayRenderer, CustomRendererDrawContext, LayerAwareOverlayRenderer } from '../../extension/index.js';
11
+ import type { EngineOverlayRenderer, FrameDrawContext, LayeredOverlayRenderer } from '../../extension/index.js';
12
12
  import type { Store } from '../../store/store.js';
13
13
  import type { Feature } from '../../store/types.js';
14
14
  import { type OffsetUniforms } from '../shaders/helpers.js';
@@ -37,7 +37,7 @@ export interface CopyPass {
37
37
  readonly view: RenderLayersView | undefined;
38
38
  readonly projectionData: CustomRenderMethodInput['defaultProjectionData'];
39
39
  readonly offsetUniforms: OffsetUniforms;
40
- readonly customRendererContext: CustomRendererDrawContext;
40
+ readonly customRendererContext: FrameDrawContext;
41
41
  /** The features drawn in immediate mode on this copy */
42
42
  readonly features: Feature[];
43
43
  /** The selected features whose selection UI is drawn on this copy */
@@ -72,9 +72,9 @@ export interface FrameState {
72
72
  readonly features: Feature[];
73
73
  readonly selectedIdSet: Set<string>;
74
74
  readonly selectedFeatures: Feature[];
75
- readonly customRendererContext: CustomRendererDrawContext;
76
- readonly layerAwareRenderers: LayerAwareOverlayRenderer[];
77
- readonly otherRenderers: CustomOverlayRenderer[];
75
+ readonly customRendererContext: FrameDrawContext;
76
+ readonly layerAwareRenderers: LayeredOverlayRenderer[];
77
+ readonly otherRenderers: EngineOverlayRenderer[];
78
78
  readonly quadDrapeFrame: QuadDrapeFrame | null;
79
79
  readonly restoreBlendState: () => void;
80
80
  /** Whether the drape can be drawn (the shaders and the plan are ready) */
@@ -116,7 +116,7 @@ export interface FrameBuildInput {
116
116
  terrainState: TerrainRenderState;
117
117
  /** Whether the retained batches of the Store rendering exist */
118
118
  retainedAvailable: boolean;
119
- overlayRenderers: readonly CustomOverlayRenderer[];
119
+ overlayRenderers: readonly EngineOverlayRenderer[];
120
120
  segments: readonly RenderSegment[];
121
121
  }
122
122
  /**
@@ -2,5 +2,5 @@ export type { BlendCapableGL } from './blend.js';
2
2
  export { applyDrawBlendState } from './blend.js';
3
3
  export type { CustomLayerDeps, CustomLayerInterface } from './custom-layer.js';
4
4
  export { createCustomLayer } from './custom-layer.js';
5
- export type { RenderSegment, RenderSlot } from './slots.js';
6
- export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder, renderSlotLayerId } from './slots.js';
5
+ export type { RenderSegment, StackSlot } from './slots.js';
6
+ export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder, slotLayerId } from './slots.js';
@@ -2,4 +2,4 @@
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  export { applyDrawBlendState } from './blend.js';
4
4
  export { createCustomLayer } from './custom-layer.js';
5
- export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder, renderSlotLayerId } from './slots.js';
5
+ export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder, slotLayerId } from './slots.js';
@@ -4,8 +4,8 @@
4
4
  * The per-layer rendering loop called from CustomLayer's render()
5
5
  */
6
6
  import type { ProjectionData } from 'maplibre-gl';
7
- import type { DatasetManager } from '../../display/manager.js';
8
- import type { CustomFeatureHandler, CustomRendererDrawContext, LayerAwareOverlayRenderer } from '../../extension/index.js';
7
+ import type { DatasetManager } from '../../dataset/manager.js';
8
+ import type { FeatureTypeHandler, FrameDrawContext, LayeredOverlayRenderer } from '../../extension/index.js';
9
9
  import type { Store } from '../../store/store.js';
10
10
  import type { BoundingBox, Feature, Layer } from '../../store/types.js';
11
11
  import type { FeatureCompanionRegistry } from '../feature-companion.js';
@@ -55,7 +55,7 @@ import type { StoreRetainedCache } from './store-retained.js';
55
55
  * of the ViewportFilter when omitted). A view across the antimeridian is drawn once per
56
56
  * copy, each with its own range
57
57
  */
58
- export declare function renderLayers(r: Renderers, store: Store, features: Feature[], selectedIdSet: Set<string>, defaultProjectionData: ProjectionData, zoom: number, customRenderers: Map<string, CustomFeatureHandler['renderer']>, customRendererContext: CustomRendererDrawContext, companions: FeatureCompanionRegistry, layerAwareRenderers: LayerAwareOverlayRenderer[], datasets?: DatasetManager, storeRetained?: StoreRetainedCache, restoreBlendState?: () => void, range?: RenderLayersRange, view?: RenderLayersView): void;
58
+ export declare function renderLayers(r: Renderers, store: Store, features: Feature[], selectedIdSet: Set<string>, defaultProjectionData: ProjectionData, zoom: number, customRenderers: Map<string, FeatureTypeHandler['renderer']>, customRendererContext: FrameDrawContext, companions: FeatureCompanionRegistry, layerAwareRenderers: LayeredOverlayRenderer[], datasets?: DatasetManager, storeRetained?: StoreRetainedCache, restoreBlendState?: () => void, range?: RenderLayersRange, view?: RenderLayersView): void;
59
59
  /**
60
60
  * The context of the custom renderers for one layer (the context of the frame with the opacity
61
61
  * of the layer)
@@ -63,7 +63,7 @@ export declare function renderLayers(r: Renderers, store: Store, features: Featu
63
63
  * The same object is returned when the opacity is already the one of the context, so a map whose
64
64
  * layers are all opaque allocates nothing per layer.
65
65
  */
66
- export declare function layerRendererContext(base: CustomRendererDrawContext, layer: Layer): CustomRendererDrawContext;
66
+ export declare function layerRendererContext(base: FrameDrawContext, layer: Layer): FrameDrawContext;
67
67
  /**
68
68
  * The part of the view one rendering covers (one copy of the world)
69
69
  */
@@ -2,6 +2,7 @@
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  import { drawFeatureCompanionsInFrame } from '../feature-companion.js';
4
4
  import { layerDrawFactors } from '../renderers/draw-factors.js';
5
+ import { customRendererOf } from './store-retained-classify.js';
5
6
  /**
6
7
  * Draw features and overlays layer by layer
7
8
  *
@@ -131,20 +132,14 @@ export function renderLayers(r, store, features, selectedIdSet, defaultProjectio
131
132
  // Companion drawing (feature companion): drawn right before the feature itself, that is,
132
133
  // one z below it. If no provider at all is registered, not even has is called.
133
134
  drawFeatureCompanionsInFrame(companions, feature, r.batchManager, defaultProjectionData, zoom, layer, layerContext, restoreBlendState);
134
- const customRenderer = customRenderers.get(feature.type);
135
+ const customRenderer = customRendererOf(customRenderers, feature);
135
136
  if (customRenderer) {
136
137
  // To keep the draw order (painter's algorithm), the core batch that has accumulated is
137
138
  // flushed first and only then the custom feature is drawn immediately.
138
139
  // A batch is not painted until endFrame, so without flushing here a custom feature
139
140
  // would ignore layer.order and be drawn before the core features of the same layer.
140
141
  r.batchManager.endFrame();
141
- customRenderer.draw({
142
- id: feature.id,
143
- type: feature.type,
144
- coordinates: feature.coordinates,
145
- properties: feature.properties,
146
- style: feature.style,
147
- }, defaultProjectionData, zoom, layerContext);
142
+ customRenderer.draw(feature, defaultProjectionData, zoom, layerContext);
148
143
  // Re-establish the blend state that the external renderer may have rewritten.
149
144
  restoreBlendState?.();
150
145
  // Restart the batch for the core features that follow.
@@ -4,7 +4,7 @@
4
4
  * Lifecycle management of every renderer that CustomLayer uses
5
5
  */
6
6
  import type { Map as MapLibreMap } from 'maplibre-gl';
7
- import type { CustomFeatureHandler } from '../../extension/index.js';
7
+ import type { FeatureTypeHandler } from '../../extension/index.js';
8
8
  import type { FeatureStyleConfig } from '../../shared/config/feature-style.js';
9
9
  import type { RenderingConfig } from '../../shared/config/rendering.js';
10
10
  import type { SelectionUIConfig } from '../../shared/config/selection.js';
@@ -63,7 +63,7 @@ export interface InitRenderersDeps {
63
63
  featureStyle: FeatureStyleConfig;
64
64
  selectionConfig: SelectionUIConfig;
65
65
  renderingConfig: RenderingConfig;
66
- customFeatureHandlers: CustomFeatureHandler[] | undefined;
66
+ customFeatureHandlers: FeatureTypeHandler[] | undefined;
67
67
  /** Injected rendering pixel ratio (when omitted, read from window every time) */
68
68
  pixelRatio?: PixelRatioInput;
69
69
  /** The state and the caches owned by the draw instance (never shared between instances) */
@@ -24,7 +24,7 @@ export function initRenderers(deps) {
24
24
  const { gl, map: mapInstance, store, spatialIndex, featureStyle, selectionConfig, renderingConfig, customFeatureHandlers, pixelRatio, scope, onImageError, } = deps;
25
25
  const textureCache = new TextureCache(gl);
26
26
  const terrain = scope.terrain;
27
- const quadShader = new QuadShader(gl, terrain);
27
+ const quadShader = new QuadShader(gl).useTerrainState(terrain);
28
28
  const imageRenderer = new ImageRenderer(mapInstance, gl, textureCache, quadShader, (fileId) => store.getFile(fileId), onImageError);
29
29
  const strokeRenderer = new StrokeRenderer(mapInstance, gl, pixelRatio, terrain);
30
30
  const sdfLineRenderer = new SDFLineRenderer(mapInstance, gl, pixelRatio, terrain);
@@ -9,7 +9,7 @@
9
9
  * docs/internals/rendering.md ("Slots and separators").
10
10
  */
11
11
  import type { CustomLayerInterface, Map as MapLibreMap } from 'maplibre-gl';
12
- import { type RenderSlot } from './slots.js';
12
+ import { type StackSlot } from './slots.js';
13
13
  /** What the manager needs */
14
14
  export interface SlotManagerDeps {
15
15
  map: Pick<MapLibreMap, 'getLayer' | 'addLayer' | 'removeLayer'> & {
@@ -20,7 +20,7 @@ export interface SlotManagerDeps {
20
20
  /** Predicate that identifies the separators (always false when omitted = a single slot) */
21
21
  isExternalEntry?: (entryId: string) => boolean;
22
22
  /** Where the changes of the slots and of the segments are notified */
23
- onSlotsChange?: (slots: RenderSlot[]) => void;
23
+ onSlotsChange?: (slots: StackSlot[]) => void;
24
24
  /** Creates the CustomLayer of the slot at `index` (index 1 onwards) */
25
25
  createSlotLayer: (index: number) => CustomLayerInterface;
26
26
  }
@@ -1,6 +1,6 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
- import { partitionLayerOrder, renderSlotLayerId, sameSegments, } from './slots.js';
3
+ import { partitionLayerOrder, sameSegments, slotLayerId, } from './slots.js';
4
4
  /**
5
5
  * The slots of one draw instance
6
6
  *
@@ -77,9 +77,9 @@ export class SlotManager {
77
77
  return this.added === 0;
78
78
  }
79
79
  /** The list of slots (public form) */
80
- getRenderSlots() {
80
+ getStackSlots() {
81
81
  return this.currentSegments.map((segment, index) => ({
82
- layerId: this.slotLayers[index]?.id ?? renderSlotLayerId(index),
82
+ layerId: this.slotLayers[index]?.id ?? slotLayerId(index),
83
83
  from: segment.from,
84
84
  to: segment.to,
85
85
  }));
@@ -118,7 +118,7 @@ export class SlotManager {
118
118
  map.removeLayer(slot.id);
119
119
  }
120
120
  }
121
- onSlotsChange?.(this.getRenderSlots());
121
+ onSlotsChange?.(this.getStackSlots());
122
122
  map.triggerRepaint?.();
123
123
  }
124
124
  /** Whether the map has that layer (always false while the style is not loaded) */
@@ -8,7 +8,7 @@
8
8
  * a native layer can be placed in between our own rendering only once the slots are split per
9
9
  * segment. The design is in docs/internals/rendering.md, "Slots and separators".
10
10
  */
11
- export type { RenderSlot } from '../../shared/types/events.js';
11
+ export type { StackSlot } from '../../shared/types/events.js';
12
12
  /** A segment ([from, to) in layerOrder) */
13
13
  export interface RenderSegment {
14
14
  readonly from: number;
@@ -17,7 +17,7 @@ export interface RenderSegment {
17
17
  /** Layer id of the first slot (keeps the same id as the single layer used before) */
18
18
  export declare const PRIMARY_RENDER_LAYER_ID = "maplibre-gl-draw-layer";
19
19
  /** Layer id of the slot at `index` */
20
- export declare function renderSlotLayerId(index: number): string;
20
+ export declare function slotLayerId(index: number): string;
21
21
  /**
22
22
  * Split the stacking order into segments at the separators
23
23
  *
@@ -3,7 +3,7 @@
3
3
  /** Layer id of the first slot (keeps the same id as the single layer used before) */
4
4
  export const PRIMARY_RENDER_LAYER_ID = 'maplibre-gl-draw-layer';
5
5
  /** Layer id of the slot at `index` */
6
- export function renderSlotLayerId(index) {
6
+ export function slotLayerId(index) {
7
7
  return index === 0 ? PRIMARY_RENDER_LAYER_ID : `${PRIMARY_RENDER_LAYER_ID}:${index}`;
8
8
  }
9
9
  /**
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import { circleBoundingBox } from '../../geometry/circle.js';
11
11
  import { DEFAULT_TILE_SIZE } from '../../shared/math/index.js';
12
+ import { coordinatesOf } from '../../shared/utils/coordinates.js';
12
13
  import { getCircleRadius } from '../../shared/utils/property.js';
13
14
  import { getBoundingBox } from '../../store/spatial/index.js';
14
15
  /**
@@ -170,7 +171,7 @@ export function computeFeaturesBBox(features, extensions) {
170
171
  }
171
172
  if (feature.type === 'Circle') {
172
173
  const radiusMeters = getCircleRadius(feature);
173
- const center = feature.coordinates;
174
+ const center = coordinatesOf(feature);
174
175
  if (radiusMeters && radiusMeters > 0 && typeof center?.[0] === 'number') {
175
176
  // The box of the geodesic circle, whose east and west extremes lie poleward of due
176
177
  // east and west; it contains the polygon used for drawing (generateCirclePolygon).
@@ -182,7 +183,7 @@ export function computeFeaturesBBox(features, extensions) {
182
183
  }
183
184
  }
184
185
  }
185
- walkCoordinates(feature.coordinates, visit);
186
+ walkCoordinates(coordinatesOf(feature), visit);
186
187
  }
187
188
  return found ? [minLng, minLat, maxLng, maxLat] : null;
188
189
  }
@@ -1,10 +1,3 @@
1
- /**
2
- * Classification of the Store features into runs
3
- *
4
- * A run is a sequence of features that the BatchManager of immediate mode would draw in one
5
- * batch. Cutting the feature list where the kind changes keeps the z-order of retained mode
6
- * identical to immediate mode.
7
- */
8
1
  import type { Feature, Layer } from '../../store/types.js';
9
2
  import type { FeatureCompanionRegistry } from '../feature-companion.js';
10
3
  import { type PointShape } from '../renderers/point/point-instance.js';
@@ -16,6 +9,11 @@ import type { RetainedStyleResolver } from '../renderers/retained.js';
16
9
  * batch kind and the point shape). A position where the kind changes becomes a run boundary.
17
10
  */
18
11
  export type RunKind = 'polygon' | 'line' | `point-${PointShape}` | 'immediate';
12
+ /**
13
+ * The custom renderer that draws a feature: the one registered for its type, unless it
14
+ * refuses the feature, which the built-in drawing of the type then draws
15
+ */
16
+ export declare function customRendererOf<R>(customTypes: ReadonlyMap<string, R>, feature: Feature): R | undefined;
19
17
  /**
20
18
  * Classifies a feature into the kind of its run
21
19
  *