@sakuzu/maplibre-gl-draw 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/CHANGELOG.md +1016 -2
  2. package/README.ja.md +39 -19
  3. package/README.md +41 -21
  4. package/dist/api/datasets.d.ts +258 -0
  5. package/dist/api/document.d.ts +66 -0
  6. package/dist/api/draw.d.ts +135 -0
  7. package/dist/api/draw.js +18 -0
  8. package/dist/api/drawing.d.ts +87 -0
  9. package/dist/api/errors.d.ts +35 -0
  10. package/dist/api/errors.js +35 -0
  11. package/dist/api/events.d.ts +306 -0
  12. package/dist/api/extension/context.d.ts +247 -0
  13. package/dist/api/extension/feature-type.d.ts +129 -0
  14. package/dist/api/extension/mode.d.ts +123 -0
  15. package/dist/api/extension/plugin.d.ts +51 -0
  16. package/dist/api/extension/plugin.js +3 -0
  17. package/dist/api/extension/provider.d.ts +119 -0
  18. package/dist/api/extension/provider.js +3 -0
  19. package/dist/api/extension/render.d.ts +176 -0
  20. package/dist/api/extension/render.js +3 -0
  21. package/dist/api/extension/store.d.ts +190 -0
  22. package/dist/api/extension/store.js +3 -0
  23. package/dist/api/extensions.d.ts +306 -0
  24. package/dist/api/extensions.js +3 -0
  25. package/dist/api/features.d.ts +188 -0
  26. package/dist/api/features.js +3 -0
  27. package/dist/api/groups.d.ts +111 -0
  28. package/dist/api/groups.js +3 -0
  29. package/dist/api/hidden.d.ts +45 -0
  30. package/dist/api/hidden.js +3 -0
  31. package/dist/api/impl/adapters.js +463 -0
  32. package/dist/api/impl/contexts.js +466 -0
  33. package/dist/api/impl/create-draw.js +124 -0
  34. package/dist/api/impl/datasets.js +404 -0
  35. package/dist/api/impl/destroy-guard.js +74 -0
  36. package/dist/api/impl/document.js +280 -0
  37. package/dist/api/impl/drawing.js +180 -0
  38. package/dist/api/impl/engine-context.d.ts +7 -0
  39. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  40. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  41. package/dist/api/impl/events.js +422 -0
  42. package/dist/api/impl/extension-host.js +361 -0
  43. package/dist/api/impl/extensions.js +229 -0
  44. package/dist/api/impl/features.js +445 -0
  45. package/dist/api/impl/geometry/apply.d.ts +32 -0
  46. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  47. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  48. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  49. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  50. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  51. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  52. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  53. package/dist/api/impl/geometry/types.js +3 -0
  54. package/dist/api/impl/groups.d.ts +3 -0
  55. package/dist/api/impl/groups.js +268 -0
  56. package/dist/api/impl/hidden.js +60 -0
  57. package/dist/api/impl/import-export/constants.d.ts +22 -0
  58. package/dist/api/impl/import-export/constants.js +24 -0
  59. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  60. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  61. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  62. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  63. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  64. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  66. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  68. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  69. package/dist/api/impl/import-export/image-import.js +73 -0
  70. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  71. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  72. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  73. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  74. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  75. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  76. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  77. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  78. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  79. package/dist/api/impl/import-export/style-validation.js +86 -0
  80. package/dist/api/impl/import-export/types.d.ts +52 -0
  81. package/dist/api/impl/import-export/types.js +3 -0
  82. package/dist/api/impl/input.js +180 -0
  83. package/dist/api/impl/layers.js +307 -0
  84. package/dist/api/impl/metadata.d.ts +1 -0
  85. package/dist/api/impl/metadata.js +22 -0
  86. package/dist/api/impl/options.d.ts +1 -0
  87. package/dist/api/impl/options.js +822 -0
  88. package/dist/api/impl/placement.d.ts +1 -0
  89. package/dist/api/impl/placement.js +138 -0
  90. package/dist/api/impl/render-context.d.ts +13 -0
  91. package/dist/api/impl/render-context.js +272 -0
  92. package/dist/api/impl/rows.d.ts +1 -0
  93. package/dist/api/impl/rows.js +46 -0
  94. package/dist/api/impl/selection.d.ts +1 -0
  95. package/dist/api/impl/selection.js +186 -0
  96. package/dist/api/impl/shared.d.ts +64 -0
  97. package/dist/api/impl/shared.js +178 -0
  98. package/dist/api/impl/validate-extension.d.ts +1 -0
  99. package/dist/api/impl/validate-extension.js +159 -0
  100. package/dist/api/layers.d.ts +130 -0
  101. package/dist/api/layers.js +3 -0
  102. package/dist/api/metadata.d.ts +18 -0
  103. package/dist/api/metadata.js +3 -0
  104. package/dist/api/model.d.ts +487 -0
  105. package/dist/api/model.js +47 -0
  106. package/dist/api/options.d.ts +466 -0
  107. package/dist/api/options.js +3 -0
  108. package/dist/api/selection.d.ts +94 -0
  109. package/dist/api/selection.js +3 -0
  110. package/dist/api/state.d.ts +155 -0
  111. package/dist/api/state.js +12 -0
  112. package/dist/{display → dataset}/chunk.d.ts +1 -1
  113. package/dist/{display → dataset}/chunk.js +4 -3
  114. package/dist/{display → dataset}/dataset.js +18 -21
  115. package/dist/dataset/interaction.d.ts +1 -0
  116. package/dist/{display → dataset}/interaction.js +18 -6
  117. package/dist/dataset/manager.d.ts +1 -0
  118. package/dist/dataset/provider.d.ts +1 -0
  119. package/dist/{display → dataset}/retained.d.ts +1 -1
  120. package/dist/{display → dataset}/retained.js +8 -7
  121. package/dist/dataset/source.d.ts +1 -0
  122. package/dist/{display → dataset}/source.js +17 -4
  123. package/dist/dataset/spatial.d.ts +1 -0
  124. package/dist/{display → dataset}/spatial.js +1 -1
  125. package/dist/dataset/style.d.ts +1 -0
  126. package/dist/{display → dataset}/style.js +1 -1
  127. package/dist/dataset/table-source.d.ts +1 -0
  128. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  129. package/dist/{display → dataset}/thinning.d.ts +0 -10
  130. package/dist/{display → dataset}/thinning.js +3 -2
  131. package/dist/dataset/triangulation.d.ts +1 -0
  132. package/dist/{display → dataset}/triangulation.js +0 -0
  133. package/dist/{display → dataset}/types.d.ts +82 -121
  134. package/dist/dataset/types.js +61 -0
  135. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  136. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  137. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  138. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  139. package/dist/dispatcher/hit-test/service.js +80 -16
  140. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  141. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  142. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  143. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  144. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  145. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  146. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  147. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  148. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  149. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  150. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  151. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  152. package/dist/dispatcher/input-router.js +152 -69
  153. package/dist/dispatcher/normalizer.js +6 -2
  154. package/dist/dispatcher/types.d.ts +6 -1
  155. package/dist/extension/feature-handler.d.ts +1 -182
  156. package/dist/extension/index.d.ts +4 -7
  157. package/dist/extension/renderers.d.ts +1 -208
  158. package/dist/geometry/angle.d.ts +0 -8
  159. package/dist/geometry/angle.js +0 -8
  160. package/dist/geometry/bbox.d.ts +4 -12
  161. package/dist/geometry/bbox.js +4 -12
  162. package/dist/geometry/boolean.d.ts +0 -51
  163. package/dist/geometry/boolean.js +0 -51
  164. package/dist/geometry/buffer.d.ts +0 -26
  165. package/dist/geometry/buffer.js +0 -26
  166. package/dist/geometry/circle.d.ts +0 -9
  167. package/dist/geometry/circle.js +0 -9
  168. package/dist/geometry/coords.d.ts +0 -16
  169. package/dist/geometry/coords.js +0 -16
  170. package/dist/geometry/distance.d.ts +0 -24
  171. package/dist/geometry/distance.js +0 -24
  172. package/dist/geometry/errors.d.ts +21 -36
  173. package/dist/geometry/errors.js +49 -29
  174. package/dist/geometry/geojson.d.ts +81 -0
  175. package/dist/geometry/geojson.js +164 -0
  176. package/dist/geometry/index.d.ts +38 -23
  177. package/dist/geometry/index.js +43 -31
  178. package/dist/geometry/measure.d.ts +0 -27
  179. package/dist/geometry/measure.js +0 -27
  180. package/dist/geometry/predicates.d.ts +0 -9
  181. package/dist/geometry/predicates.js +0 -9
  182. package/dist/geometry/public-bounds.d.ts +26 -0
  183. package/dist/geometry/public-bounds.js +30 -0
  184. package/dist/geometry/public-combine.d.ts +78 -0
  185. package/dist/geometry/public-combine.js +82 -0
  186. package/dist/geometry/public-create.d.ts +54 -0
  187. package/dist/geometry/public-create.js +70 -0
  188. package/dist/geometry/public-measure.d.ts +170 -0
  189. package/dist/geometry/public-measure.js +283 -0
  190. package/dist/geometry/public-predicates.d.ts +54 -0
  191. package/dist/geometry/public-predicates.js +144 -0
  192. package/dist/geometry/public-repair.d.ts +75 -0
  193. package/dist/geometry/public-repair.js +77 -0
  194. package/dist/geometry/simplify.d.ts +0 -7
  195. package/dist/geometry/simplify.js +0 -7
  196. package/dist/geometry/split.d.ts +0 -20
  197. package/dist/geometry/split.js +0 -20
  198. package/dist/geometry/units.d.ts +20 -12
  199. package/dist/geometry/units.js +20 -12
  200. package/dist/index.d.ts +52 -66
  201. package/dist/index.js +6 -18
  202. package/dist/messages.d.ts +7 -7
  203. package/dist/modes/draw/circle.js +83 -207
  204. package/dist/modes/draw/commit-layer.d.ts +5 -16
  205. package/dist/modes/draw/commit-layer.js +2 -13
  206. package/dist/modes/draw/freehand.js +108 -246
  207. package/dist/modes/draw/image.js +4 -2
  208. package/dist/modes/draw/index.d.ts +5 -5
  209. package/dist/modes/draw/index.js +5 -5
  210. package/dist/modes/draw/line.js +18 -354
  211. package/dist/modes/draw/point.js +29 -78
  212. package/dist/modes/draw/polygon.js +23 -368
  213. package/dist/modes/draw/trace-support.d.ts +43 -36
  214. package/dist/modes/draw/trace-support.js +95 -98
  215. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  216. package/dist/modes/draw/vertex-drawing.js +176 -0
  217. package/dist/modes/handler.d.ts +1 -285
  218. package/dist/modes/manager.d.ts +2 -2
  219. package/dist/modes/manager.js +3 -0
  220. package/dist/modes/select/box-selection.d.ts +3 -3
  221. package/dist/modes/select/box-selection.js +2 -1
  222. package/dist/modes/select/click-handler.d.ts +5 -5
  223. package/dist/modes/select/click-handler.js +22 -20
  224. package/dist/modes/select/cursor-handler.d.ts +2 -2
  225. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  226. package/dist/modes/select/drag/move.js +3 -3
  227. package/dist/modes/select/drag/operation.d.ts +3 -3
  228. package/dist/modes/select/drag/radius.js +5 -4
  229. package/dist/modes/select/drag/transform.d.ts +2 -2
  230. package/dist/modes/select/drag/transform.js +11 -5
  231. package/dist/modes/select/drag/vertex.d.ts +2 -2
  232. package/dist/modes/select/drag/vertex.js +13 -8
  233. package/dist/modes/select/drag-handler.js +44 -25
  234. package/dist/modes/select/mode.js +17 -17
  235. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  236. package/dist/modes/select/shortcut-handler.js +9 -7
  237. package/dist/operations/layer-operations.js +29 -168
  238. package/dist/operations/resize.d.ts +2 -2
  239. package/dist/operations/resize.js +5 -5
  240. package/dist/operations/rotate.js +5 -5
  241. package/dist/operations/selection-operations.d.ts +16 -1
  242. package/dist/operations/selection-operations.js +28 -13
  243. package/dist/operations/shared-vertex.js +4 -2
  244. package/dist/operations/trace-graph.d.ts +0 -18
  245. package/dist/operations/trace-graph.js +0 -18
  246. package/dist/operations/vertex.js +36 -35
  247. package/dist/shared/color.d.ts +1 -0
  248. package/dist/shared/color.js +245 -0
  249. package/dist/shared/config/constants.d.ts +1 -54
  250. package/dist/shared/config/constants.js +1 -58
  251. package/dist/shared/config/feature-style.d.ts +16 -13
  252. package/dist/shared/config/feature-style.js +9 -0
  253. package/dist/shared/config/rendering.d.ts +3 -3
  254. package/dist/shared/config/selection-highlight.d.ts +0 -15
  255. package/dist/shared/config/selection-highlight.js +4 -7
  256. package/dist/shared/config/selection.d.ts +2 -32
  257. package/dist/shared/config/selection.js +0 -18
  258. package/dist/shared/config/topology.d.ts +2 -2
  259. package/dist/shared/config/trace.d.ts +4 -4
  260. package/dist/shared/math/angle.d.ts +1 -1
  261. package/dist/shared/math/angle.js +1 -1
  262. package/dist/shared/math/circle.d.ts +1 -1
  263. package/dist/shared/math/circle.js +1 -1
  264. package/dist/shared/math/distance.d.ts +2 -1
  265. package/dist/shared/math/distance.js +3 -2
  266. package/dist/shared/math/index.d.ts +1 -1
  267. package/dist/shared/math/index.js +1 -1
  268. package/dist/shared/math/transform.d.ts +23 -0
  269. package/dist/shared/math/transform.js +47 -28
  270. package/dist/shared/properties.d.ts +18 -0
  271. package/dist/shared/properties.js +129 -0
  272. package/dist/shared/types/events.d.ts +15 -7
  273. package/dist/shared/types/model.d.ts +109 -159
  274. package/dist/shared/types/style.d.ts +1 -1
  275. package/dist/shared/utils/color.d.ts +2 -36
  276. package/dist/shared/utils/color.js +13 -70
  277. package/dist/shared/utils/coordinates.d.ts +30 -4
  278. package/dist/shared/utils/coordinates.js +56 -10
  279. package/dist/shared/utils/event-emitter.d.ts +1 -262
  280. package/dist/shared/utils/event-emitter.js +4 -3
  281. package/dist/shared/utils/feature-bbox.js +8 -7
  282. package/dist/shared/utils/feature-segments.js +5 -4
  283. package/dist/shared/utils/image.d.ts +0 -4
  284. package/dist/shared/utils/image.js +0 -6
  285. package/dist/shared/utils/name-generator.d.ts +14 -20
  286. package/dist/shared/utils/name-generator.js +20 -3
  287. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  288. package/dist/shared/utils/pixel-ratio.js +13 -4
  289. package/dist/shared/utils/property.d.ts +7 -50
  290. package/dist/shared/utils/property.js +22 -87
  291. package/dist/snapping/custom-targets.js +21 -4
  292. package/dist/snapping/indicator.js +20 -11
  293. package/dist/snapping/providers/display.d.ts +6 -1
  294. package/dist/snapping/providers/display.js +2 -1
  295. package/dist/snapping/providers/guide.d.ts +3 -43
  296. package/dist/snapping/providers/guide.js +1 -44
  297. package/dist/snapping/providers/intersection.js +1 -1
  298. package/dist/snapping/providers/store.js +3 -3
  299. package/dist/snapping/service.js +18 -7
  300. package/dist/snapping/types.d.ts +9 -35
  301. package/dist/store/draw-store.js +233 -142
  302. package/dist/store/local-visibility.d.ts +11 -6
  303. package/dist/store/local-visibility.js +38 -7
  304. package/dist/store/lock.d.ts +0 -6
  305. package/dist/store/lock.js +0 -6
  306. package/dist/store/memory/change-bus.d.ts +3 -3
  307. package/dist/store/memory/change-bus.js +12 -0
  308. package/dist/store/memory/file-store.d.ts +2 -2
  309. package/dist/store/memory/ui-state.d.ts +1 -51
  310. package/dist/store/memory/ui-state.js +122 -134
  311. package/dist/store/memory.d.ts +1 -8
  312. package/dist/store/memory.js +249 -45
  313. package/dist/store/ordering.d.ts +9 -0
  314. package/dist/store/ordering.js +17 -0
  315. package/dist/store/spatial/spatial-index.d.ts +1 -1
  316. package/dist/store/spatial/spatial-index.js +1 -1
  317. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  318. package/dist/store/spatial/store-spatial-index.js +9 -3
  319. package/dist/store/store.d.ts +66 -107
  320. package/dist/store/types.d.ts +1 -1
  321. package/dist/store/writable-layer.d.ts +1 -1
  322. package/dist/store/writable-layer.js +2 -2
  323. package/dist/table/builder.d.ts +83 -0
  324. package/dist/table/builder.js +381 -0
  325. package/dist/table/index.d.ts +37 -0
  326. package/dist/table/index.js +5 -0
  327. package/dist/table/packed-rtree.d.ts +1 -0
  328. package/dist/{display → table}/packed-rtree.js +1 -1
  329. package/dist/table/partition.d.ts +1 -0
  330. package/dist/{display → table}/partition.js +3 -3
  331. package/dist/table/prepare.d.ts +44 -0
  332. package/dist/table/prepare.js +136 -0
  333. package/dist/table/table.d.ts +1 -0
  334. package/dist/{display/columnar → table}/table.js +29 -25
  335. package/dist/{display/columnar → table}/types.d.ts +68 -72
  336. package/dist/table/types.js +3 -0
  337. package/dist/view/coordinator.js +4 -3
  338. package/dist/view/feature-companion.d.ts +13 -7
  339. package/dist/view/feature-companion.js +11 -3
  340. package/dist/view/globe-subdivision.js +3 -3
  341. package/dist/view/layer/attach.d.ts +1 -1
  342. package/dist/view/layer/attach.js +1 -1
  343. package/dist/view/layer/custom-layer.js +40 -11
  344. package/dist/view/layer/display-list.js +2 -1
  345. package/dist/view/layer/drape-planner.d.ts +2 -2
  346. package/dist/view/layer/frame-render.d.ts +3 -3
  347. package/dist/view/layer/frame-render.js +7 -2
  348. package/dist/view/layer/frame-state.d.ts +6 -6
  349. package/dist/view/layer/index.d.ts +2 -2
  350. package/dist/view/layer/index.js +1 -1
  351. package/dist/view/layer/render.d.ts +4 -4
  352. package/dist/view/layer/render.js +3 -8
  353. package/dist/view/layer/renderers.d.ts +2 -2
  354. package/dist/view/layer/renderers.js +1 -1
  355. package/dist/view/layer/slot-manager.d.ts +2 -2
  356. package/dist/view/layer/slot-manager.js +4 -4
  357. package/dist/view/layer/slots.d.ts +2 -2
  358. package/dist/view/layer/slots.js +1 -1
  359. package/dist/view/layer/store-retained-bbox.js +3 -2
  360. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  361. package/dist/view/layer/store-retained-classify.js +19 -7
  362. package/dist/view/layer/store-retained-collect.js +8 -7
  363. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  364. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  365. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  366. package/dist/view/layer/store-retained-immediate.js +3 -8
  367. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  368. package/dist/view/layer/store-retained.d.ts +2 -2
  369. package/dist/view/layer/store-retained.js +1 -1
  370. package/dist/view/renderers/batch-manager.js +8 -7
  371. package/dist/view/renderers/drawer.js +21 -15
  372. package/dist/view/renderers/image.js +13 -39
  373. package/dist/view/renderers/line/line-types.d.ts +3 -3
  374. package/dist/view/renderers/line/sdf-line.js +3 -1
  375. package/dist/view/renderers/point/billboard-depth.js +1 -1
  376. package/dist/view/renderers/point/point-instance.js +1 -1
  377. package/dist/view/renderers/point/point-shape.js +2 -2
  378. package/dist/view/renderers/point/point-style.js +48 -4
  379. package/dist/view/renderers/polygon/batch.js +1 -2
  380. package/dist/view/renderers/polygon/fill.js +3 -1
  381. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  382. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  383. package/dist/view/renderers/stroke.js +3 -1
  384. package/dist/view/shaders/helpers.d.ts +2 -42
  385. package/dist/view/shaders/helpers.js +0 -6
  386. package/dist/view/shaders/projection.d.ts +15 -7
  387. package/dist/view/shaders/projection.js +23 -6
  388. package/dist/view/shaders/quad.d.ts +16 -12
  389. package/dist/view/shaders/quad.js +34 -13
  390. package/dist/view/style-rule.d.ts +5 -42
  391. package/dist/view/style-rule.js +20 -44
  392. package/dist/view/terrain/binding.d.ts +1 -0
  393. package/dist/view/terrain/binding.js +29 -0
  394. package/dist/view/terrain/context.d.ts +3 -4
  395. package/dist/view/terrain/context.js +4 -5
  396. package/dist/view/terrain/drape/geometry.js +1 -1
  397. package/dist/view/terrain/drape/pass.d.ts +1 -1
  398. package/dist/view/terrain/drape/pass.js +8 -7
  399. package/dist/view/terrain/polygon.d.ts +9 -5
  400. package/dist/view/terrain/polygon.js +16 -2
  401. package/dist/view/terrain/state.d.ts +1 -1
  402. package/dist/view/terrain/state.js +1 -1
  403. package/dist/view/terrain/tessellation.d.ts +2 -2
  404. package/dist/view/terrain/tessellation.js +1 -1
  405. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  406. package/dist/view/ui/bounds.js +8 -12
  407. package/dist/view/ui/handle-test.js +2 -2
  408. package/dist/view/ui/handle-thinning.js +17 -17
  409. package/dist/view/ui/handles.js +21 -13
  410. package/dist/view/ui/helper.d.ts +1 -1
  411. package/dist/view/ui/helper.js +1 -1
  412. package/dist/view/ui/index.d.ts +1 -1
  413. package/dist/view/ui/selection-scope.js +4 -2
  414. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  415. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  416. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  417. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  418. package/dist/view/ui/selection-ui/index.js +1 -1
  419. package/dist/view/ui/selection-ui/renderer.js +15 -38
  420. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  421. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  422. package/dist/view/ui/selection-ui-drawer.js +63 -2
  423. package/dist/view/ui/tentative.js +1 -1
  424. package/dist/webgl/index.d.ts +65 -0
  425. package/dist/webgl/index.js +62 -0
  426. package/package.json +20 -9
  427. package/dist/api/api.d.ts +0 -1259
  428. package/dist/api/api.js +0 -86
  429. package/dist/api/context.d.ts +0 -173
  430. package/dist/api/display-api.js +0 -23
  431. package/dist/api/event-api.d.ts +0 -13
  432. package/dist/api/event-api.js +0 -17
  433. package/dist/api/extension-api.d.ts +0 -46
  434. package/dist/api/extension-api.js +0 -85
  435. package/dist/api/feature-api.d.ts +0 -11
  436. package/dist/api/feature-api.js +0 -101
  437. package/dist/api/geometry/apply.d.ts +0 -51
  438. package/dist/api/geometry/boolean.d.ts +0 -28
  439. package/dist/api/geometry/boolean.js +0 -65
  440. package/dist/api/geometry/types.d.ts +0 -31
  441. package/dist/api/geometry-operations.d.ts +0 -162
  442. package/dist/api/geometry-operations.js +0 -94
  443. package/dist/api/group-api.d.ts +0 -10
  444. package/dist/api/group-api.js +0 -78
  445. package/dist/api/import-export/constants.d.ts +0 -29
  446. package/dist/api/import-export/constants.js +0 -40
  447. package/dist/api/import-export/file-name.d.ts +0 -10
  448. package/dist/api/import-export/file-name.js +0 -20
  449. package/dist/api/import-export/geojson-export.d.ts +0 -19
  450. package/dist/api/import-export/image-import.d.ts +0 -12
  451. package/dist/api/import-export/image-import.js +0 -53
  452. package/dist/api/import-export/index.d.ts +0 -9
  453. package/dist/api/import-export/index.js +0 -107
  454. package/dist/api/import-export/native-format.d.ts +0 -15
  455. package/dist/api/import-export/style-validation.d.ts +0 -27
  456. package/dist/api/import-export/style-validation.js +0 -49
  457. package/dist/api/import-export/types.d.ts +0 -26
  458. package/dist/api/index.d.ts +0 -15
  459. package/dist/api/index.js +0 -3
  460. package/dist/api/input-api.d.ts +0 -158
  461. package/dist/api/input-api.js +0 -144
  462. package/dist/api/instance-api.d.ts +0 -38
  463. package/dist/api/instance-api.js +0 -136
  464. package/dist/api/layer-api.d.ts +0 -12
  465. package/dist/api/layer-api.js +0 -62
  466. package/dist/api/selection-api.d.ts +0 -7
  467. package/dist/api/selection-api.js +0 -78
  468. package/dist/api/snapping-api.d.ts +0 -125
  469. package/dist/api/snapping-api.js +0 -50
  470. package/dist/api/topology-api.d.ts +0 -30
  471. package/dist/api/topology-api.js +0 -16
  472. package/dist/api/tracing-api.d.ts +0 -31
  473. package/dist/api/tracing-api.js +0 -16
  474. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  475. package/dist/dispatcher/hit-test/index.js +0 -9
  476. package/dist/dispatcher/index.d.ts +0 -15
  477. package/dist/dispatcher/index.js +0 -3
  478. package/dist/display/columnar/index.d.ts +0 -12
  479. package/dist/display/columnar/index.js +0 -13
  480. package/dist/display/columnar/prepare.d.ts +0 -42
  481. package/dist/display/columnar/prepare.js +0 -116
  482. package/dist/display/index.d.ts +0 -13
  483. package/dist/display/types.js +0 -43
  484. package/dist/maplibre-gl-draw.d.ts +0 -47
  485. package/dist/modes/cursor.js +0 -72
  486. package/dist/modes/index.d.ts +0 -7
  487. package/dist/operations/index.d.ts +0 -9
  488. package/dist/operations/index.js +0 -3
  489. package/dist/plugins/index.d.ts +0 -10
  490. package/dist/plugins/mutation-hooks.d.ts +0 -28
  491. package/dist/plugins/mutation-hooks.js +0 -84
  492. package/dist/plugins/plugin-context.js +0 -367
  493. package/dist/plugins/plugin-manager.d.ts +0 -103
  494. package/dist/plugins/plugin-manager.js +0 -316
  495. package/dist/plugins/plugin.d.ts +0 -529
  496. package/dist/shared/config/index.d.ts +0 -17
  497. package/dist/shared/config/index.js +0 -8
  498. package/dist/shared/utils/index.d.ts +0 -15
  499. package/dist/shared/utils/index.js +0 -24
  500. package/dist/snapping/index.d.ts +0 -14
  501. package/dist/snapping/index.js +0 -4
  502. package/dist/store/change-merger.js +0 -102
  503. package/dist/store/event-bridge.js +0 -161
  504. package/dist/store/index.d.ts +0 -12
  505. package/dist/store/index.js +0 -4
  506. package/dist/view/index.d.ts +0 -47
  507. package/dist/view/index.js +0 -20
  508. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  509. /package/dist/api/{import-export/types.js → document.js} +0 -0
  510. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  511. /package/dist/{display/index.js → api/events.js} +0 -0
  512. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  513. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  514. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  515. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  516. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  517. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  518. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  519. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  520. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  521. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  522. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  523. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  524. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  525. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  526. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  527. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  528. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  529. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  532. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  533. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  534. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  535. /package/dist/{display → dataset}/chunk-set.js +0 -0
  536. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  537. /package/dist/{display → dataset}/manager.js +0 -0
  538. /package/dist/{display → dataset}/provider.js +0 -0
  539. /package/dist/{display → dataset}/selection.d.ts +0 -0
  540. /package/dist/{display → dataset}/selection.js +0 -0
@@ -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[];
@@ -20,6 +20,7 @@
20
20
  * "the rule is not taking effect" apart from "there is no value".
21
21
  */
22
22
  import { MESSAGES_EN, resolveMessages } from '../messages.js';
23
+ import { toHexColor } from '../shared/color.js';
23
24
  import { interpolateHexColor } from '../shared/utils/color.js';
24
25
  /** The name of the FeatureStyle color property corresponding to each channel */
25
26
  const CHANNEL_COLOR_PROPERTY = {
@@ -95,31 +96,16 @@ function graduatedIndex(breaks, value) {
95
96
  * `categorical` matches strings, numbers and booleans by `String(value)`; `graduated` and
96
97
  * `continuous` take finite numbers only (a numeric string gives `other`). `continuous`
97
98
  * clamps values outside `min`..`max` and returns the first ramp color when `max <= min`. It
98
- * is a pure function.
99
+ * is a pure function. The colors of the rule may be any CSS color; the result is normalized
100
+ * to `#rrggbb`.
99
101
  *
100
102
  * @param rule The style rule
101
103
  * @param properties The attributes of the feature
102
- * @returns The color in `#RRGGBB` form
103
- *
104
- * @example
105
- * ```ts
106
- * import { evaluateStyleRule, type StyleRule } from '@sakuzu/maplibre-gl-draw';
107
- *
108
- * const rule: StyleRule = {
109
- * kind: 'graduated',
110
- * property: 'population',
111
- * breaks: [1000, 10000],
112
- * colors: ['#fee8c8', '#fdbb84', '#e34a33'],
113
- * other: '#cccccc',
114
- * };
115
- * evaluateStyleRule(rule, { population: 5000 }); // '#fdbb84'
116
- * evaluateStyleRule(rule, { population: '5000' }); // '#cccccc' (not a number)
117
- * evaluateStyleRule(rule, {}); // '#cccccc'
118
- * ```
104
+ * @returns The color in `#rrggbb` form
119
105
  */
120
106
  export function evaluateStyleRule(rule, properties) {
121
107
  if (rule.kind === 'single') {
122
- return rule.color;
108
+ return toHexColor(rule.color);
123
109
  }
124
110
  return evaluateStyleRuleValue(rule, properties?.[rule.property]);
125
111
  }
@@ -132,6 +118,10 @@ export function evaluateStyleRule(rule, properties) {
132
118
  * @internal
133
119
  */
134
120
  export function evaluateStyleRuleValue(rule, value) {
121
+ return toHexColor(ruleColorOf(rule, value));
122
+ }
123
+ /** The color of the rule for a value, as the rule writes it */
124
+ function ruleColorOf(rule, value) {
135
125
  if (rule.kind === 'single') {
136
126
  return rule.color;
137
127
  }
@@ -150,12 +140,16 @@ export function evaluateStyleRuleValue(rule, value) {
150
140
  // An invalid rule whose colors count falls short of breaks + 1 falls back to other
151
141
  return color ?? rule.other;
152
142
  }
153
- // continuous: linearly interpolates the 2 colors of the ramp over min..max
154
- // (out-of-range values are clamped)
143
+ // continuous: linearly interpolates the 2 colors of the ramp over min..max in OKLab
144
+ // (out-of-range values are clamped; the end points are the colors of the ramp)
155
145
  const [from, to] = rule.ramp;
156
146
  if (!(rule.max > rule.min))
157
147
  return from;
158
148
  const t = Math.min(1, Math.max(0, (numeric - rule.min) / (rule.max - rule.min)));
149
+ if (t === 0)
150
+ return from;
151
+ if (t === 1)
152
+ return to;
159
153
  return interpolateHexColor(from, to, t);
160
154
  }
161
155
  /**
@@ -241,36 +235,18 @@ function graduatedLabel(breaks, index, messages) {
241
235
  * `legendOther` is appended at the end
242
236
  *
243
237
  * Numbers are turned into strings with `String()`. Locale formatting is up to the caller.
238
+ * The colors are normalized to `#rrggbb`, as {@link evaluateStyleRule} returns them.
244
239
  *
245
240
  * @param rule The style rule
246
241
  * @param messages The entries of the messages table to use (default: `MESSAGES_EN`;
247
242
  * missing entries fall back to it)
248
243
  * @returns The legend rows, in the order to show them
249
- *
250
- * @example
251
- * ```ts
252
- * import { deriveLegend, type StyleRule } from '@sakuzu/maplibre-gl-draw';
253
- *
254
- * const rule: StyleRule = {
255
- * kind: 'graduated',
256
- * property: 'population',
257
- * breaks: [1000, 10000],
258
- * colors: ['#fee8c8', '#fdbb84', '#e34a33'],
259
- * other: '#cccccc',
260
- * };
261
- * deriveLegend(rule);
262
- * // [
263
- * // { label: 'Below 1000', color: '#fee8c8' },
264
- * // { label: '1000 to below 10000', color: '#fdbb84' },
265
- * // { label: '10000 or more', color: '#e34a33' },
266
- * // { label: 'Other', color: '#cccccc' },
267
- * // ]
268
- *
269
- * // In the language of the host application
270
- * deriveLegend(rule, { legendOther: 'Autres', legendBelow: (upper) => `Moins de ${upper}` });
271
- * ```
272
244
  */
273
245
  export function deriveLegend(rule, messages) {
246
+ return legendOf(rule, messages).map(({ label, color }) => ({ label, color: toHexColor(color) }));
247
+ }
248
+ /** The legend rows with the colors as the rule writes them */
249
+ function legendOf(rule, messages) {
274
250
  const table = messages ? resolveMessages(messages) : MESSAGES_EN;
275
251
  if (rule.kind === 'single') {
276
252
  return [{ label: table.legendAll, color: rule.color }];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /** The terrain state behind each render context and each set of anchors */
4
+ const terrainByHandle = new WeakMap();
5
+ /**
6
+ * Binds a render context or a set of anchors to the terrain state it stands for
7
+ *
8
+ * @internal
9
+ */
10
+ export function bindTerrainState(handle, terrain) {
11
+ terrainByHandle.set(handle, terrain);
12
+ }
13
+ /**
14
+ * The terrain state behind a render context or its `terrain`
15
+ *
16
+ * @returns The state, or `null` for `null` and for an object the engine did not hand out
17
+ * @internal
18
+ */
19
+ export function terrainStateOf(source) {
20
+ if (!source)
21
+ return null;
22
+ return terrainByHandle.get(source) ?? terrainByHandle.get(renderTerrainOf(source)) ?? null;
23
+ }
24
+ /** The `terrain` of a render context, or the object itself */
25
+ function renderTerrainOf(source) {
26
+ return 'terrain' in source && typeof source.terrain === 'object' && source.terrain !== null
27
+ ? source.terrain
28
+ : source;
29
+ }
@@ -117,10 +117,9 @@ export declare const INACTIVE_ANCHOR_FRAME: AnchorFrame;
117
117
  /**
118
118
  * The terrain state of one draw instance.
119
119
  *
120
- * Treat it as an opaque handle: a custom renderer receives it as
121
- * `CustomRendererDrawContext.terrain` and passes it to the renderers and to the terrain
122
- * functions (such as {@link anchorElevationMeters} and {@link drawQuadSurfaceOnTerrain}).
123
- * Constructing one gives a state with no terrain.
120
+ * It stays inside the engine: the renderers of a CustomLayer receive it at construction, and
121
+ * the public building blocks of the second entry reach it through the render context an
122
+ * extension receives (`terrain/binding.ts`). Constructing one gives a state with no terrain.
124
123
  */
125
124
  export declare class TerrainContext {
126
125
  /** This frame's terrain state (read by the shaders' projection uniforms) */
@@ -22,7 +22,7 @@
22
22
  * module-level "current" context: every reader (state.ts / anchor.ts / occlusion.ts /
23
23
  * polygon.ts) takes the context explicitly. The renderers of a CustomLayer receive their
24
24
  * instance's context at construction, extension renderers receive it in the draw context
25
- * (`CustomRendererDrawContext.terrain`), hit testing uses the anchor projection bound per map
25
+ * (`FrameDrawContext.terrain`), hit testing uses the anchor projection bound per map
26
26
  * (`installAnchorProjector`), and plugins use the projection bound to their instance
27
27
  * (`PluginContext.projectAnchor`). A read from outside rendering therefore always sees its own
28
28
  * instance, never "the instance drawn last".
@@ -75,10 +75,9 @@ export const INACTIVE_ANCHOR_FRAME = {
75
75
  /**
76
76
  * The terrain state of one draw instance.
77
77
  *
78
- * Treat it as an opaque handle: a custom renderer receives it as
79
- * `CustomRendererDrawContext.terrain` and passes it to the renderers and to the terrain
80
- * functions (such as {@link anchorElevationMeters} and {@link drawQuadSurfaceOnTerrain}).
81
- * Constructing one gives a state with no terrain.
78
+ * It stays inside the engine: the renderers of a CustomLayer receive it at construction, and
79
+ * the public building blocks of the second entry reach it through the render context an
80
+ * extension receives (`terrain/binding.ts`). Constructing one gives a state with no terrain.
82
81
  */
83
82
  export class TerrainContext {
84
83
  constructor() {
@@ -16,7 +16,7 @@ export function drapeMercatorY(lat) {
16
16
  *
17
17
  * The key is decided by the caller. For a feature in the Store the instance is replaced on
18
18
  * every edit, so the feature itself is the key; for a dataset the replacement
19
- * happens per `setFeatures` and the coordinate arrays are not reused, so the coordinate array
19
+ * happens per `setRows` and the coordinate arrays are not reused, so the coordinate array
20
20
  * is the key (when applying a style rule rebuilds only the feature instances, the same
21
21
  * coordinate arrays remain, so merely changing a color does not require converting a million
22
22
  * vertices again).
@@ -71,7 +71,7 @@ export declare function drapeLayerSource(layerIndex: number, datasetCount: numbe
71
71
  /**
72
72
  * The view of a dataset restricted to the part the drape needs
73
73
  *
74
- * The implementation in `display/dataset.ts` satisfies this shape. To keep the type
74
+ * The implementation in `dataset/dataset.ts` satisfies this shape. To keep the type
75
75
  * dependency one-directional, only the structure is declared here.
76
76
  */
77
77
  export interface DrapeDatasetSource {