@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
@@ -236,7 +236,7 @@ export class PointShapeRenderer {
236
236
  this.gl = gl;
237
237
  this.pixelRatio = pixelRatio;
238
238
  this.terrain = terrain;
239
- this.projectionUniformManager = new ProjectionUniformManager(gl, { terrain });
239
+ this.projectionUniformManager = new ProjectionUniformManager(gl).useTerrainState(terrain);
240
240
  this.bufferCache = new BufferCache(gl);
241
241
  }
242
242
  /**
@@ -385,7 +385,7 @@ void main() {
385
385
  gl.uniform1f(this.anchorElevationLoc, elevationMeters ?? anchorElevationMeters(this.terrain, lng, lat));
386
386
  }
387
387
  // Billboards are drawn without the depth test (see the note in billboard-depth.ts). A
388
- // hand-drawn Point can arrive here through a CustomFeatureRenderer, so wrapping only the
388
+ // hand-drawn Point can arrive here through a FeatureTypeRenderer, so wrapping only the
389
389
  // instanced side would leave the points of this path as half circles.
390
390
  drawBillboardsWithoutDepth(gl, () => {
391
391
  // Draw the fill
@@ -9,7 +9,7 @@
9
9
  * datasets. The shape in particular decides which run and which batch a point
10
10
  * goes on, so resolving it anywhere else would split the z-order of the paths.
11
11
  */
12
- import { hexToColor } from '../../../shared/utils/color.js';
12
+ import { toColor } from '../../../shared/color.js';
13
13
  /** The shapes a feature may name (`'icon'` belongs to the defaults of an extension) */
14
14
  const FEATURE_POINT_SHAPES = new Set(['circle', 'square', 'triangle', 'star']);
15
15
  /**
@@ -22,12 +22,30 @@ function featurePointShape(style) {
22
22
  const shape = style.pointShape;
23
23
  return shape !== undefined && FEATURE_POINT_SHAPES.has(shape) ? shape : undefined;
24
24
  }
25
+ /**
26
+ * The opacity of the marker a feature names, from 0 to 1 (1 when it names none or a value
27
+ * outside the range)
28
+ */
29
+ function featurePointOpacity(style) {
30
+ const opacity = style.pointOpacity;
31
+ return typeof opacity === 'number' && opacity >= 0 && opacity <= 1 ? opacity : 1;
32
+ }
33
+ /**
34
+ * The width of the outline of the marker a feature names, or undefined when it names none or
35
+ * a value that is not a finite number of 0 or more
36
+ */
37
+ function featurePointStrokeWidth(style) {
38
+ const width = style.pointStrokeWidth;
39
+ return typeof width === 'number' && Number.isFinite(width) && width >= 0 ? width : undefined;
40
+ }
25
41
  /**
26
42
  * Merges the style of a point feature (already carrying the rule color) into the default
27
43
  *
28
44
  * The keys of the feature win key by key: `pointColor` becomes the fill, `pointRadius` the
29
- * size (a diameter), `pointShape` the shape. A key left unset (or a shape that is not one of
30
- * the four a feature may name) keeps the default.
45
+ * size (a diameter), `pointShape` the shape, `pointStrokeColor` and `pointStrokeWidth` the
46
+ * outline. `pointOpacity` is multiplied into the opacity of the fill and of the outline of the
47
+ * marker. A key left unset (or a shape that is not one of the four a feature may name, an
48
+ * opacity outside 0 to 1, or a negative width) keeps the default.
31
49
  *
32
50
  * @param style The style of the feature (undefined when it has none)
33
51
  * @param defaults The point style of the `style` option of the instance
@@ -37,10 +55,36 @@ function featurePointShape(style) {
37
55
  export function resolvePointStyle(style, defaults) {
38
56
  if (!style)
39
57
  return defaults;
58
+ const opacity = featurePointOpacity(style);
40
59
  return {
41
60
  ...defaults,
42
61
  shape: featurePointShape(style) ?? defaults.shape,
43
- fillColor: style.pointColor ? hexToColor(style.pointColor, 1) : defaults.fillColor,
62
+ fillColor: style.pointColor ? toColor(style.pointColor, 1) : defaults.fillColor,
44
63
  size: style.pointRadius ? style.pointRadius * 2 : defaults.size,
64
+ fillOpacity: defaults.fillOpacity * opacity,
65
+ strokeColor: style.pointStrokeColor ? toColor(style.pointStrokeColor, 1) : defaults.strokeColor,
66
+ strokeWidth: featurePointStrokeWidth(style) ?? defaults.strokeWidth,
67
+ strokeOpacity: defaults.strokeOpacity * opacity,
45
68
  };
46
69
  }
70
+ /**
71
+ * How far the marker of a point reaches from its position, in CSS pixels: the radius the
72
+ * marker is drawn with plus its outline when the outline is drawn
73
+ *
74
+ * It reads the keys `resolvePointStyle` reads for the size and the outline, without building
75
+ * the merged style, so the hit test can ask it of every point on every move of the pointer.
76
+ *
77
+ * @param style The style of the feature (undefined when it has none)
78
+ * @param defaults The point style of the `style` option of the instance
79
+ *
80
+ * @internal
81
+ */
82
+ export function pointMarkerReachPx(style, defaults) {
83
+ const radius = style?.pointRadius ? style.pointRadius : defaults.size / 2;
84
+ const strokeOpacity = defaults.strokeOpacity * (style ? featurePointOpacity(style) : 1);
85
+ const stroke = strokeOpacity > 0
86
+ ? ((style ? featurePointStrokeWidth(style) : undefined) ?? defaults.strokeWidth)
87
+ : 0;
88
+ const reach = radius + stroke;
89
+ return Number.isFinite(reach) && reach > 0 ? reach : 0;
90
+ }
@@ -92,8 +92,7 @@ export class PolygonBatchRenderer {
92
92
  this.earcutCache = scope.earcut ?? new EarcutCache();
93
93
  this.projectionUniformManager = new ProjectionUniformManager(gl, {
94
94
  surface: true,
95
- terrain: this.terrain,
96
- });
95
+ }).useTerrainState(this.terrain);
97
96
  this.vertexBuffer = gl.createBuffer();
98
97
  this.indexBuffer = gl.createBuffer();
99
98
  this.vao = gl.createVertexArray();
@@ -83,7 +83,9 @@ export class FillShaderManager {
83
83
  value: null
84
84
  });
85
85
  this.gl = gl;
86
- this.projectionUniformManager = new ProjectionUniformManager(gl, { surface: true, terrain });
86
+ this.projectionUniformManager = new ProjectionUniformManager(gl, {
87
+ surface: true,
88
+ }).useTerrainState(terrain);
87
89
  this.vertexBuffer = gl.createBuffer();
88
90
  this.indexBuffer = gl.createBuffer();
89
91
  this.vao = gl.createVertexArray();
@@ -210,8 +210,7 @@ export class SDFPolygonRenderer {
210
210
  this.earcutCache = scope.earcut ?? new EarcutCache();
211
211
  this.projectionUniformManager = new ProjectionUniformManager(gl, {
212
212
  surface: true,
213
- terrain: this.terrain,
214
- });
213
+ }).useTerrainState(this.terrain);
215
214
  this.vertexBuffer = gl.createBuffer();
216
215
  this.indexBuffer = gl.createBuffer();
217
216
  this.vao = gl.createVertexArray();
@@ -550,7 +549,7 @@ void main() {
550
549
  * the cache used by the drawing of the Store must not be polluted with the features
551
550
  * of datasets). However, when options.triangulator is passed, both the caching and the
552
551
  * time slicing of the triangulation become its responsibility
553
- * (display/triangulation.ts).
552
+ * (dataset/triangulation.ts).
554
553
  *
555
554
  * @returns The built batch. null when the shader is not initialized or there are no
556
555
  * vertices
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * Triangulating a huge polygon (a water body on the order of a million vertices)
9
9
  * takes more than ten seconds in one go, so the dataset path injects
10
- * an implementation that slices the work over time (display/triangulation.ts) here.
10
+ * an implementation that slices the work over time (dataset/triangulation.ts) here.
11
11
  * For a polygon whose triangulation has not finished yet, null is returned, and the
12
12
  * caller omits the fill of that polygon and puts it into the batch with the outline
13
13
  * only. Once the triangulation finishes, the injecting side prompts a rebuild.
@@ -159,7 +159,9 @@ export class StrokeRenderer {
159
159
  this.gl = gl;
160
160
  this.pixelRatio = pixelRatio;
161
161
  this.terrain = terrain;
162
- this.projectionUniformManager = new ProjectionUniformManager(gl, { surface: true, terrain });
162
+ this.projectionUniformManager = new ProjectionUniformManager(gl, {
163
+ surface: true,
164
+ }).useTerrainState(terrain);
163
165
  this.vertexBuffer = gl.createBuffer();
164
166
  this.vao = gl.createVertexArray();
165
167
  this.setupVAO();
@@ -4,23 +4,13 @@
4
4
  * Utilities for creating and managing WebGL2 shaders
5
5
  * Performs the WGS84 -> Mercator -> clip coordinate conversion on the GPU
6
6
  */
7
+ import type { OffsetUniforms, ShaderData } from '../../api/extension/render.js';
8
+ export type { OffsetUniforms, ShaderData };
7
9
  /**
8
10
  * Converts WGS84 coordinates to Mercator coordinates (high precision
9
11
  * computation on the CPU side)
10
12
  */
11
13
  export declare function lngLatToMercator(lng: number, lat: number): [number, number];
12
- /**
13
- * The shader prelude maplibre passes to the `prerender` / `render` of a custom layer, which
14
- * the renderers of this library take to compile their programs for the current projection.
15
- */
16
- export interface ShaderData {
17
- /** The GLSL maplibre prepends to a vertex shader (its projection functions) */
18
- vertexShaderPrelude: string;
19
- /** The `#define` lines of the current projection */
20
- define: string;
21
- /** The name of the projection variant; a program is recompiled when it changes */
22
- variantName: string;
23
- }
24
14
  /**
25
15
  * The precision every sampler of the engine is read with
26
16
  *
@@ -153,36 +143,6 @@ export declare function calculateOffsetUniforms(centerLngLat: [number, number],
153
143
  * @returns The translated matrix (64-bit values)
154
144
  */
155
145
  export declare function translateMatrixByLongitude(matrix: ArrayLike<number>, lngShift: number): number[];
156
- /**
157
- * The uniform values for offset mode
158
- *
159
- * The uniforms for globe mode are obtained directly from ProjectionData, so
160
- * this interface contains only the values needed for the offset computation of
161
- * the Mercator projection.
162
- */
163
- export interface OffsetUniforms {
164
- /** The center coordinates (rounded to Float32, for sending to the shader) */
165
- centerLngLat: [number, number];
166
- /** The center coordinates (64-bit precision, for the offset computation on the CPU side) */
167
- centerLngLat64: [number, number];
168
- /**
169
- * The Mercator coordinates of the center (a value computed at 64-bit
170
- * precision)
171
- *
172
- * Used to restore the Mercator relative coordinates of a vertex to absolute
173
- * coordinates when looking up the terrain DEM atlas. So that everything can
174
- * be handled relatively, the atlas origin is also handed over relative to
175
- * this value (absolute Mercator coordinates do not have enough digits in
176
- * Float32).
177
- */
178
- centerMercator: [number, number];
179
- /** The view center in clip space, computed at 64-bit precision */
180
- projectionCenter: [number, number, number, number];
181
- /** The Mercator units per degree of longitude and latitude at the center */
182
- unitsPerDegree: [number, number, number];
183
- /** The second-order correction of `unitsPerDegree` for the change with latitude */
184
- unitsPerDegree2: [number, number, number];
185
- }
186
146
  /**
187
147
  * Returns a position relative to the view center in degrees, computed at 64-bit precision
188
148
  * so that it survives Float32.
@@ -1,11 +1,5 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only AND MIT
3
- /**
4
- * Shader helpers
5
- *
6
- * Utilities for creating and managing WebGL2 shaders
7
- * Performs the WGS84 -> Mercator -> clip coordinate conversion on the GPU
8
- */
9
3
  /**
10
4
  * Converts WGS84 coordinates to Mercator coordinates (high precision
11
5
  * computation on the CPU side)
@@ -6,7 +6,8 @@
6
6
  * each renderer.
7
7
  */
8
8
  import type { ProjectionData } from 'maplibre-gl';
9
- import type { TerrainContext } from '../terrain/context.js';
9
+ import type { TerrainAnchors } from '../../api/extension/context.js';
10
+ import type { RenderContext } from '../../api/extension/render.js';
10
11
  import type { OffsetUniforms } from './helpers.js';
11
12
  /**
12
13
  * The locations of the projection and terrain uniforms of one program, as
@@ -81,19 +82,26 @@ export declare class ProjectionUniformManager {
81
82
  /**
82
83
  * The terrain state of the draw instance being drawn (null draws without terrain)
83
84
  *
84
- * The renderers of a CustomLayer pass their instance's context at construction. A renderer
85
- * of an extension implementation, which may be shared between draw instances, calls
86
- * `setTerrain(context.terrain)` with the context it receives in each draw call.
85
+ * The renderers of a CustomLayer bind their instance's state after construction. A renderer
86
+ * of an extension, which may be shared between draw instances, calls `setTerrain(ctx)` with
87
+ * the render context it receives in each draw call.
87
88
  */
88
89
  private terrain;
90
+ /**
91
+ * @param gl - The WebGL context of the map
92
+ * @param options - `surface`: whether the renderer draws things stuck to the ground (areas
93
+ * and lines), which lie flat on the frames that draw them flat
94
+ */
89
95
  constructor(gl: WebGL2RenderingContext, options?: {
90
96
  surface?: boolean;
91
- terrain?: TerrainContext | null;
92
97
  });
93
98
  /**
94
- * Sets the terrain state the next uniforms are taken from (null draws without terrain)
99
+ * Sets the terrain the next uniforms are taken from.
100
+ *
101
+ * @param terrain - The render context of the draw call, or its `terrain`; `null` (or an
102
+ * object the engine did not hand out) draws without terrain
95
103
  */
96
- setTerrain(terrain: TerrainContext | null): void;
104
+ setTerrain(terrain: RenderContext | TerrainAnchors | null): void;
97
105
  /**
98
106
  * Obtains the uniform locations from a program
99
107
  *
@@ -1,5 +1,6 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { terrainStateOf } from '../terrain/binding.js';
3
4
  import { INACTIVE_TERRAIN_STATE, TERRAIN_ATLAS_TEXTURE_UNIT, } from '../terrain/state.js';
4
5
  import { getRenderFrame } from './frame.js';
5
6
  /**
@@ -29,6 +30,11 @@ function createMemo() {
29
30
  * A class that manages the projection-related uniforms in one place
30
31
  */
31
32
  export class ProjectionUniformManager {
33
+ /**
34
+ * @param gl - The WebGL context of the map
35
+ * @param options - `surface`: whether the renderer draws things stuck to the ground (areas
36
+ * and lines), which lie flat on the frames that draw them flat
37
+ */
32
38
  constructor(gl, options = {}) {
33
39
  Object.defineProperty(this, "gl", {
34
40
  enumerable: true,
@@ -68,25 +74,36 @@ export class ProjectionUniformManager {
68
74
  /**
69
75
  * The terrain state of the draw instance being drawn (null draws without terrain)
70
76
  *
71
- * The renderers of a CustomLayer pass their instance's context at construction. A renderer
72
- * of an extension implementation, which may be shared between draw instances, calls
73
- * `setTerrain(context.terrain)` with the context it receives in each draw call.
77
+ * The renderers of a CustomLayer bind their instance's state after construction. A renderer
78
+ * of an extension, which may be shared between draw instances, calls `setTerrain(ctx)` with
79
+ * the render context it receives in each draw call.
74
80
  */
75
81
  Object.defineProperty(this, "terrain", {
76
82
  enumerable: true,
77
83
  configurable: true,
78
84
  writable: true,
79
- value: void 0
85
+ value: null
80
86
  });
81
87
  this.gl = gl;
82
88
  this.surface = options.surface === true;
83
- this.terrain = options.terrain ?? null;
84
89
  }
85
90
  /**
86
- * Sets the terrain state the next uniforms are taken from (null draws without terrain)
91
+ * Sets the terrain the next uniforms are taken from.
92
+ *
93
+ * @param terrain - The render context of the draw call, or its `terrain`; `null` (or an
94
+ * object the engine did not hand out) draws without terrain
87
95
  */
88
96
  setTerrain(terrain) {
97
+ this.terrain = terrainStateOf(terrain);
98
+ }
99
+ /**
100
+ * Sets the terrain state of an instance directly
101
+ *
102
+ * @internal
103
+ */
104
+ useTerrainState(terrain) {
89
105
  this.terrain = terrain;
106
+ return this;
90
107
  }
91
108
  /**
92
109
  * Obtains the uniform locations from a program
@@ -22,7 +22,8 @@
22
22
  * quad follows the sphere the way maplibre's layers do
23
23
  */
24
24
  import type { ProjectionData } from 'maplibre-gl';
25
- import type { TerrainContext } from '../terrain/context.js';
25
+ import type { TerrainAnchors } from '../../api/extension/context.js';
26
+ import type { RenderContext } from '../../api/extension/render.js';
26
27
  import type { DrapeQuadCorners, QuadDrapeSurface } from '../terrain/drape/quad.js';
27
28
  import type { OffsetUniforms } from './helpers.js';
28
29
  /**
@@ -72,15 +73,19 @@ export declare class QuadShader {
72
73
  /**
73
74
  * The terrain state of the draw instance being drawn (null draws without terrain)
74
75
  *
75
- * The CustomLayer passes its instance's context at construction. An extension renderer that
76
- * owns a QuadShader calls `setTerrain(context.terrain)` with the draw context it receives.
76
+ * The CustomLayer binds its instance's state after construction. An extension renderer that
77
+ * owns a QuadShader calls `setTerrain(ctx)` with the render context it receives.
77
78
  */
78
79
  private terrain;
79
- constructor(gl: WebGL2RenderingContext, terrain?: TerrainContext | null);
80
+ /** @param gl - The WebGL context of the map */
81
+ constructor(gl: WebGL2RenderingContext);
80
82
  /**
81
- * Sets the terrain state the next draws use (null draws without terrain)
83
+ * Sets the terrain the next draws use.
84
+ *
85
+ * @param terrain - The render context of the draw call, or its `terrain`; `null` (or an
86
+ * object the engine did not hand out) draws without terrain
82
87
  */
83
- setTerrain(terrain: TerrainContext | null): void;
88
+ setTerrain(terrain: RenderContext | TerrainAnchors | null): void;
84
89
  /**
85
90
  * Initializes the buffers
86
91
  */
@@ -164,14 +169,13 @@ export declare class QuadShader {
164
169
  * cannot be built). The caller falls back to the conventional way of drawing
165
170
  * (the fill texture + a separate draw of the text).
166
171
  *
167
- * @param terrain The terrain state of the draw instance being drawn
168
- * (`CustomRendererDrawContext.terrain`)
169
- * @param corners The corners of the quad in degrees
170
- * @param surface The fill and the text
171
- * @param opacity The opacity, 0..1
172
+ * @param terrain - The render context of the draw call, or its `terrain`
173
+ * @param corners - The corners of the quad in degrees
174
+ * @param surface - The fill and the text
175
+ * @param opacity - The opacity, 0..1
172
176
  * @returns true if it was painted; false when the caller must draw it another way
173
177
  */
174
- export declare function drawQuadSurfaceOnTerrain(terrain: TerrainContext, corners: DrapeQuadCorners, surface: QuadDrapeSurface, opacity: number): boolean;
178
+ export declare function drawQuadSurfaceOnTerrain(terrain: RenderContext | TerrainAnchors, corners: DrapeQuadCorners, surface: QuadDrapeSurface, opacity: number): boolean;
175
179
  /**
176
180
  * Returns the corners of a rectangle of a size in degrees, rotated about its center.
177
181
  *
@@ -1,6 +1,7 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  import { globeGridOf } from '../globe-subdivision.js';
4
+ import { terrainStateOf } from '../terrain/binding.js';
4
5
  import { quadMercatorCorners } from '../terrain/drape/quad.js';
5
6
  import { getQuadDrapeFrame, isTerrainElevationActive, reportTerrainCoarsening, } from '../terrain/state.js';
6
7
  import { calculateLngLatOffset, createProgram, getProjectionTransitionUniform, OFFSET_MODE_GLSL, } from './helpers.js';
@@ -15,7 +16,8 @@ import { buildQuadGrid, computeQuadGridSize, } from './quad-grid.js';
15
16
  * subdivided to the terrain mesh.
16
17
  */
17
18
  export class QuadShader {
18
- constructor(gl, terrain = null) {
19
+ /** @param gl - The WebGL context of the map */
20
+ constructor(gl) {
19
21
  Object.defineProperty(this, "gl", {
20
22
  enumerable: true,
21
23
  configurable: true,
@@ -134,26 +136,37 @@ export class QuadShader {
134
136
  /**
135
137
  * The terrain state of the draw instance being drawn (null draws without terrain)
136
138
  *
137
- * The CustomLayer passes its instance's context at construction. An extension renderer that
138
- * owns a QuadShader calls `setTerrain(context.terrain)` with the draw context it receives.
139
+ * The CustomLayer binds its instance's state after construction. An extension renderer that
140
+ * owns a QuadShader calls `setTerrain(ctx)` with the render context it receives.
139
141
  */
140
142
  Object.defineProperty(this, "terrain", {
141
143
  enumerable: true,
142
144
  configurable: true,
143
145
  writable: true,
144
- value: void 0
146
+ value: null
145
147
  });
146
148
  this.gl = gl;
147
- this.terrain = terrain;
148
- this.projectionUniformManager = new ProjectionUniformManager(gl, { terrain });
149
+ this.projectionUniformManager = new ProjectionUniformManager(gl);
149
150
  this.setupBuffers();
150
151
  }
151
152
  /**
152
- * Sets the terrain state the next draws use (null draws without terrain)
153
+ * Sets the terrain the next draws use.
154
+ *
155
+ * @param terrain - The render context of the draw call, or its `terrain`; `null` (or an
156
+ * object the engine did not hand out) draws without terrain
153
157
  */
154
158
  setTerrain(terrain) {
159
+ this.useTerrainState(terrainStateOf(terrain));
160
+ }
161
+ /**
162
+ * Sets the terrain state of an instance directly
163
+ *
164
+ * @internal
165
+ */
166
+ useTerrainState(terrain) {
155
167
  this.terrain = terrain;
156
- this.projectionUniformManager.setTerrain(terrain);
168
+ this.projectionUniformManager.useTerrainState(terrain);
169
+ return this;
157
170
  }
158
171
  /**
159
172
  * Initializes the buffers
@@ -491,14 +504,22 @@ void main() {
491
504
  * cannot be built). The caller falls back to the conventional way of drawing
492
505
  * (the fill texture + a separate draw of the text).
493
506
  *
494
- * @param terrain The terrain state of the draw instance being drawn
495
- * (`CustomRendererDrawContext.terrain`)
496
- * @param corners The corners of the quad in degrees
497
- * @param surface The fill and the text
498
- * @param opacity The opacity, 0..1
507
+ * @param terrain - The render context of the draw call, or its `terrain`
508
+ * @param corners - The corners of the quad in degrees
509
+ * @param surface - The fill and the text
510
+ * @param opacity - The opacity, 0..1
499
511
  * @returns true if it was painted; false when the caller must draw it another way
500
512
  */
501
513
  export function drawQuadSurfaceOnTerrain(terrain, corners, surface, opacity) {
514
+ const state = terrainStateOf(terrain);
515
+ return state !== null && drawQuadSurfaceOnTerrainState(state, corners, surface, opacity);
516
+ }
517
+ /**
518
+ * {@link drawQuadSurfaceOnTerrain} over the terrain state of an instance
519
+ *
520
+ * @internal
521
+ */
522
+ export function drawQuadSurfaceOnTerrainState(terrain, corners, surface, opacity) {
502
523
  if (!isTerrainElevationActive(terrain))
503
524
  return false;
504
525
  const frame = getQuadDrapeFrame(terrain);
@@ -27,7 +27,7 @@ import type { Feature, FeatureStyle, FeatureType, StyleRule } from '../store/typ
27
27
  export interface LegendEntry {
28
28
  /** The displayed label */
29
29
  label: string;
30
- /** The color (in #RRGGBB form) */
30
+ /** The color, as `#rrggbb` */
31
31
  color: string;
32
32
  }
33
33
  /**
@@ -57,27 +57,12 @@ export declare function getStyleRuleChannel(type: FeatureType): StyleRuleChannel
57
57
  * `categorical` matches strings, numbers and booleans by `String(value)`; `graduated` and
58
58
  * `continuous` take finite numbers only (a numeric string gives `other`). `continuous`
59
59
  * clamps values outside `min`..`max` and returns the first ramp color when `max <= min`. It
60
- * is a pure function.
60
+ * is a pure function. The colors of the rule may be any CSS color; the result is normalized
61
+ * to `#rrggbb`.
61
62
  *
62
63
  * @param rule The style rule
63
64
  * @param properties The attributes of the feature
64
- * @returns The color in `#RRGGBB` form
65
- *
66
- * @example
67
- * ```ts
68
- * import { evaluateStyleRule, type StyleRule } from '@sakuzu/maplibre-gl-draw';
69
- *
70
- * const rule: StyleRule = {
71
- * kind: 'graduated',
72
- * property: 'population',
73
- * breaks: [1000, 10000],
74
- * colors: ['#fee8c8', '#fdbb84', '#e34a33'],
75
- * other: '#cccccc',
76
- * };
77
- * evaluateStyleRule(rule, { population: 5000 }); // '#fdbb84'
78
- * evaluateStyleRule(rule, { population: '5000' }); // '#cccccc' (not a number)
79
- * evaluateStyleRule(rule, {}); // '#cccccc'
80
- * ```
65
+ * @returns The color in `#rrggbb` form
81
66
  */
82
67
  export declare function evaluateStyleRule(rule: StyleRule, properties: Record<string, unknown> | undefined): string;
83
68
  /**
@@ -134,33 +119,11 @@ export declare function resolveFeatureStyle(feature: Feature, rule: StyleRule |
134
119
  * `legendOther` is appended at the end
135
120
  *
136
121
  * Numbers are turned into strings with `String()`. Locale formatting is up to the caller.
122
+ * The colors are normalized to `#rrggbb`, as {@link evaluateStyleRule} returns them.
137
123
  *
138
124
  * @param rule The style rule
139
125
  * @param messages The entries of the messages table to use (default: `MESSAGES_EN`;
140
126
  * missing entries fall back to it)
141
127
  * @returns The legend rows, in the order to show them
142
- *
143
- * @example
144
- * ```ts
145
- * import { deriveLegend, type StyleRule } from '@sakuzu/maplibre-gl-draw';
146
- *
147
- * const rule: StyleRule = {
148
- * kind: 'graduated',
149
- * property: 'population',
150
- * breaks: [1000, 10000],
151
- * colors: ['#fee8c8', '#fdbb84', '#e34a33'],
152
- * other: '#cccccc',
153
- * };
154
- * deriveLegend(rule);
155
- * // [
156
- * // { label: 'Below 1000', color: '#fee8c8' },
157
- * // { label: '1000 to below 10000', color: '#fdbb84' },
158
- * // { label: '10000 or more', color: '#e34a33' },
159
- * // { label: 'Other', color: '#cccccc' },
160
- * // ]
161
- *
162
- * // In the language of the host application
163
- * deriveLegend(rule, { legendOther: 'Autres', legendBelow: (upper) => `Moins de ${upper}` });
164
- * ```
165
128
  */
166
129
  export declare function deriveLegend(rule: StyleRule, messages?: Partial<Messages>): LegendEntry[];