@sakuzu/maplibre-gl-draw 1.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 (636) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/LICENSE +661 -0
  3. package/README.ja.md +248 -0
  4. package/README.md +255 -0
  5. package/THIRD_PARTY_NOTICES.md +275 -0
  6. package/dist/api/api.d.ts +1259 -0
  7. package/dist/api/api.js +86 -0
  8. package/dist/api/context.d.ts +173 -0
  9. package/dist/api/context.js +193 -0
  10. package/dist/api/display-api.d.ts +1 -0
  11. package/dist/api/display-api.js +23 -0
  12. package/dist/api/event-api.d.ts +13 -0
  13. package/dist/api/event-api.js +17 -0
  14. package/dist/api/extension-api.d.ts +46 -0
  15. package/dist/api/extension-api.js +85 -0
  16. package/dist/api/feature-api.d.ts +11 -0
  17. package/dist/api/feature-api.js +101 -0
  18. package/dist/api/geometry/apply.d.ts +51 -0
  19. package/dist/api/geometry/apply.js +114 -0
  20. package/dist/api/geometry/boolean.d.ts +28 -0
  21. package/dist/api/geometry/boolean.js +65 -0
  22. package/dist/api/geometry/buffer.d.ts +11 -0
  23. package/dist/api/geometry/buffer.js +105 -0
  24. package/dist/api/geometry/split.d.ts +16 -0
  25. package/dist/api/geometry/split.js +75 -0
  26. package/dist/api/geometry/targets.d.ts +76 -0
  27. package/dist/api/geometry/targets.js +158 -0
  28. package/dist/api/geometry/types.d.ts +31 -0
  29. package/dist/api/geometry/types.js +3 -0
  30. package/dist/api/geometry-operations.d.ts +162 -0
  31. package/dist/api/geometry-operations.js +94 -0
  32. package/dist/api/group-api.d.ts +10 -0
  33. package/dist/api/group-api.js +78 -0
  34. package/dist/api/import-export/constants.d.ts +29 -0
  35. package/dist/api/import-export/constants.js +40 -0
  36. package/dist/api/import-export/embedded-file.d.ts +13 -0
  37. package/dist/api/import-export/embedded-file.js +31 -0
  38. package/dist/api/import-export/file-name.d.ts +10 -0
  39. package/dist/api/import-export/file-name.js +20 -0
  40. package/dist/api/import-export/format-detection.d.ts +12 -0
  41. package/dist/api/import-export/format-detection.js +29 -0
  42. package/dist/api/import-export/geojson-export.d.ts +19 -0
  43. package/dist/api/import-export/geojson-export.js +262 -0
  44. package/dist/api/import-export/geojson-import.d.ts +34 -0
  45. package/dist/api/import-export/geojson-import.js +538 -0
  46. package/dist/api/import-export/geometry-validation.d.ts +20 -0
  47. package/dist/api/import-export/geometry-validation.js +107 -0
  48. package/dist/api/import-export/image-import.d.ts +12 -0
  49. package/dist/api/import-export/image-import.js +53 -0
  50. package/dist/api/import-export/index.d.ts +9 -0
  51. package/dist/api/import-export/index.js +107 -0
  52. package/dist/api/import-export/native-format.d.ts +15 -0
  53. package/dist/api/import-export/native-format.js +126 -0
  54. package/dist/api/import-export/native-validation.d.ts +28 -0
  55. package/dist/api/import-export/native-validation.js +212 -0
  56. package/dist/api/import-export/own-property.d.ts +10 -0
  57. package/dist/api/import-export/own-property.js +19 -0
  58. package/dist/api/import-export/style-validation.d.ts +27 -0
  59. package/dist/api/import-export/style-validation.js +49 -0
  60. package/dist/api/import-export/types.d.ts +26 -0
  61. package/dist/api/import-export/types.js +3 -0
  62. package/dist/api/index.d.ts +15 -0
  63. package/dist/api/index.js +3 -0
  64. package/dist/api/input-api.d.ts +158 -0
  65. package/dist/api/input-api.js +144 -0
  66. package/dist/api/instance-api.d.ts +38 -0
  67. package/dist/api/instance-api.js +136 -0
  68. package/dist/api/layer-api.d.ts +12 -0
  69. package/dist/api/layer-api.js +62 -0
  70. package/dist/api/selection-api.d.ts +7 -0
  71. package/dist/api/selection-api.js +78 -0
  72. package/dist/api/snapping-api.d.ts +125 -0
  73. package/dist/api/snapping-api.js +50 -0
  74. package/dist/api/topology-api.d.ts +30 -0
  75. package/dist/api/topology-api.js +16 -0
  76. package/dist/api/tracing-api.d.ts +31 -0
  77. package/dist/api/tracing-api.js +16 -0
  78. package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
  79. package/dist/dispatcher/hit-test/box-strategies.js +275 -0
  80. package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
  81. package/dist/dispatcher/hit-test/box-strategy.js +37 -0
  82. package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
  83. package/dist/dispatcher/hit-test/globe-shape.js +70 -0
  84. package/dist/dispatcher/hit-test/index.d.ts +14 -0
  85. package/dist/dispatcher/hit-test/index.js +9 -0
  86. package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
  87. package/dist/dispatcher/hit-test/local-frame.js +112 -0
  88. package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
  89. package/dist/dispatcher/hit-test/segment-grid.js +79 -0
  90. package/dist/dispatcher/hit-test/service.d.ts +120 -0
  91. package/dist/dispatcher/hit-test/service.js +333 -0
  92. package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
  93. package/dist/dispatcher/hit-test/strategies/base.js +66 -0
  94. package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
  95. package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
  96. package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
  97. package/dist/dispatcher/hit-test/strategies/image.js +115 -0
  98. package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
  99. package/dist/dispatcher/hit-test/strategies/index.js +10 -0
  100. package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
  101. package/dist/dispatcher/hit-test/strategies/line.js +30 -0
  102. package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
  103. package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
  104. package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
  105. package/dist/dispatcher/hit-test/strategies/point.js +29 -0
  106. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
  107. package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
  108. package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
  109. package/dist/dispatcher/hit-test/topmost.js +157 -0
  110. package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
  111. package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
  112. package/dist/dispatcher/index.d.ts +15 -0
  113. package/dist/dispatcher/index.js +3 -0
  114. package/dist/dispatcher/input-router.d.ts +1 -0
  115. package/dist/dispatcher/input-router.js +288 -0
  116. package/dist/dispatcher/normalizer.d.ts +1 -0
  117. package/dist/dispatcher/normalizer.js +513 -0
  118. package/dist/dispatcher/types.d.ts +144 -0
  119. package/dist/dispatcher/types.js +15 -0
  120. package/dist/display/chunk-set.d.ts +24 -0
  121. package/dist/display/chunk-set.js +533 -0
  122. package/dist/display/chunk.d.ts +1 -0
  123. package/dist/display/chunk.js +104 -0
  124. package/dist/display/columnar/index.d.ts +12 -0
  125. package/dist/display/columnar/index.js +13 -0
  126. package/dist/display/columnar/prepare.d.ts +42 -0
  127. package/dist/display/columnar/prepare.js +116 -0
  128. package/dist/display/columnar/source.d.ts +1 -0
  129. package/dist/display/columnar/source.js +531 -0
  130. package/dist/display/columnar/table.d.ts +1 -0
  131. package/dist/display/columnar/table.js +471 -0
  132. package/dist/display/columnar/types.d.ts +223 -0
  133. package/dist/display/columnar/types.js +3 -0
  134. package/dist/display/dataset.d.ts +2 -0
  135. package/dist/display/dataset.js +891 -0
  136. package/dist/display/index.d.ts +13 -0
  137. package/dist/display/index.js +3 -0
  138. package/dist/display/interaction.d.ts +1 -0
  139. package/dist/display/interaction.js +90 -0
  140. package/dist/display/manager.d.ts +1 -0
  141. package/dist/display/manager.js +440 -0
  142. package/dist/display/packed-rtree.d.ts +1 -0
  143. package/dist/display/packed-rtree.js +244 -0
  144. package/dist/display/partition.d.ts +1 -0
  145. package/dist/display/partition.js +226 -0
  146. package/dist/display/provider.d.ts +1 -0
  147. package/dist/display/provider.js +342 -0
  148. package/dist/display/retained.d.ts +40 -0
  149. package/dist/display/retained.js +898 -0
  150. package/dist/display/selection.d.ts +13 -0
  151. package/dist/display/selection.js +226 -0
  152. package/dist/display/source.d.ts +1 -0
  153. package/dist/display/source.js +119 -0
  154. package/dist/display/spatial.d.ts +1 -0
  155. package/dist/display/spatial.js +71 -0
  156. package/dist/display/style.d.ts +1 -0
  157. package/dist/display/style.js +126 -0
  158. package/dist/display/thinning.d.ts +65 -0
  159. package/dist/display/thinning.js +910 -0
  160. package/dist/display/triangulation.d.ts +1 -0
  161. package/dist/display/triangulation.js +0 -0
  162. package/dist/display/types.d.ts +561 -0
  163. package/dist/display/types.js +43 -0
  164. package/dist/extension/feature-handler.d.ts +182 -0
  165. package/dist/extension/feature-handler.js +3 -0
  166. package/dist/extension/index.d.ts +9 -0
  167. package/dist/extension/index.js +3 -0
  168. package/dist/extension/renderers.d.ts +208 -0
  169. package/dist/extension/renderers.js +3 -0
  170. package/dist/geometry/angle.d.ts +47 -0
  171. package/dist/geometry/angle.js +44 -0
  172. package/dist/geometry/bbox.d.ts +48 -0
  173. package/dist/geometry/bbox.js +83 -0
  174. package/dist/geometry/boolean.d.ts +162 -0
  175. package/dist/geometry/boolean.js +331 -0
  176. package/dist/geometry/buffer.d.ts +72 -0
  177. package/dist/geometry/buffer.js +218 -0
  178. package/dist/geometry/circle.d.ts +55 -0
  179. package/dist/geometry/circle.js +107 -0
  180. package/dist/geometry/coords.d.ts +97 -0
  181. package/dist/geometry/coords.js +149 -0
  182. package/dist/geometry/distance.d.ts +79 -0
  183. package/dist/geometry/distance.js +111 -0
  184. package/dist/geometry/errors.d.ts +74 -0
  185. package/dist/geometry/errors.js +104 -0
  186. package/dist/geometry/index.d.ts +28 -0
  187. package/dist/geometry/index.js +38 -0
  188. package/dist/geometry/measure.d.ts +81 -0
  189. package/dist/geometry/measure.js +236 -0
  190. package/dist/geometry/predicates.d.ts +62 -0
  191. package/dist/geometry/predicates.js +132 -0
  192. package/dist/geometry/simplify.d.ts +74 -0
  193. package/dist/geometry/simplify.js +159 -0
  194. package/dist/geometry/split.d.ts +68 -0
  195. package/dist/geometry/split.js +430 -0
  196. package/dist/geometry/types.d.ts +95 -0
  197. package/dist/geometry/types.js +3 -0
  198. package/dist/geometry/units.d.ts +35 -0
  199. package/dist/geometry/units.js +41 -0
  200. package/dist/index.d.ts +72 -0
  201. package/dist/index.js +20 -0
  202. package/dist/maplibre-gl-draw.d.ts +47 -0
  203. package/dist/maplibre-gl-draw.js +407 -0
  204. package/dist/messages.d.ts +64 -0
  205. package/dist/messages.js +36 -0
  206. package/dist/modes/cursor.d.ts +1 -0
  207. package/dist/modes/cursor.js +72 -0
  208. package/dist/modes/draw/circle.d.ts +1 -0
  209. package/dist/modes/draw/circle.js +222 -0
  210. package/dist/modes/draw/commit-layer.d.ts +26 -0
  211. package/dist/modes/draw/commit-layer.js +31 -0
  212. package/dist/modes/draw/freehand.d.ts +1 -0
  213. package/dist/modes/draw/freehand.js +264 -0
  214. package/dist/modes/draw/image.d.ts +1 -0
  215. package/dist/modes/draw/image.js +60 -0
  216. package/dist/modes/draw/index.d.ts +9 -0
  217. package/dist/modes/draw/index.js +11 -0
  218. package/dist/modes/draw/line.d.ts +1 -0
  219. package/dist/modes/draw/line.js +363 -0
  220. package/dist/modes/draw/point.d.ts +1 -0
  221. package/dist/modes/draw/point.js +87 -0
  222. package/dist/modes/draw/polygon.d.ts +1 -0
  223. package/dist/modes/draw/polygon.js +378 -0
  224. package/dist/modes/draw/trace-support.d.ts +79 -0
  225. package/dist/modes/draw/trace-support.js +161 -0
  226. package/dist/modes/handler.d.ts +285 -0
  227. package/dist/modes/handler.js +3 -0
  228. package/dist/modes/index.d.ts +7 -0
  229. package/dist/modes/index.js +3 -0
  230. package/dist/modes/manager.d.ts +15 -0
  231. package/dist/modes/manager.js +196 -0
  232. package/dist/modes/select/box-selection.d.ts +52 -0
  233. package/dist/modes/select/box-selection.js +140 -0
  234. package/dist/modes/select/click-handler.d.ts +32 -0
  235. package/dist/modes/select/click-handler.js +166 -0
  236. package/dist/modes/select/cursor-handler.d.ts +15 -0
  237. package/dist/modes/select/cursor-handler.js +59 -0
  238. package/dist/modes/select/drag/auxiliary.d.ts +26 -0
  239. package/dist/modes/select/drag/auxiliary.js +56 -0
  240. package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
  241. package/dist/modes/select/drag/intermediate-writes.js +171 -0
  242. package/dist/modes/select/drag/move.d.ts +24 -0
  243. package/dist/modes/select/drag/move.js +59 -0
  244. package/dist/modes/select/drag/operation.d.ts +30 -0
  245. package/dist/modes/select/drag/operation.js +18 -0
  246. package/dist/modes/select/drag/radius.d.ts +15 -0
  247. package/dist/modes/select/drag/radius.js +49 -0
  248. package/dist/modes/select/drag/transform.d.ts +17 -0
  249. package/dist/modes/select/drag/transform.js +155 -0
  250. package/dist/modes/select/drag/vertex.d.ts +17 -0
  251. package/dist/modes/select/drag/vertex.js +163 -0
  252. package/dist/modes/select/drag-handler.d.ts +1 -0
  253. package/dist/modes/select/drag-handler.js +254 -0
  254. package/dist/modes/select/hit-helpers.d.ts +40 -0
  255. package/dist/modes/select/hit-helpers.js +51 -0
  256. package/dist/modes/select/mode.d.ts +1 -0
  257. package/dist/modes/select/mode.js +397 -0
  258. package/dist/modes/select/shortcut-handler.d.ts +40 -0
  259. package/dist/modes/select/shortcut-handler.js +128 -0
  260. package/dist/operations/index.d.ts +9 -0
  261. package/dist/operations/index.js +3 -0
  262. package/dist/operations/layer-operations.d.ts +1 -0
  263. package/dist/operations/layer-operations.js +350 -0
  264. package/dist/operations/resize.d.ts +71 -0
  265. package/dist/operations/resize.js +252 -0
  266. package/dist/operations/rotate.d.ts +17 -0
  267. package/dist/operations/rotate.js +166 -0
  268. package/dist/operations/selection-operations.d.ts +20 -0
  269. package/dist/operations/selection-operations.js +159 -0
  270. package/dist/operations/shared-vertex.d.ts +1 -0
  271. package/dist/operations/shared-vertex.js +210 -0
  272. package/dist/operations/trace-graph.d.ts +96 -0
  273. package/dist/operations/trace-graph.js +283 -0
  274. package/dist/operations/vertex.d.ts +1 -0
  275. package/dist/operations/vertex.js +538 -0
  276. package/dist/plugins/index.d.ts +10 -0
  277. package/dist/plugins/index.js +3 -0
  278. package/dist/plugins/mutation-hooks.d.ts +28 -0
  279. package/dist/plugins/mutation-hooks.js +84 -0
  280. package/dist/plugins/plugin-context.d.ts +1 -0
  281. package/dist/plugins/plugin-context.js +367 -0
  282. package/dist/plugins/plugin-manager.d.ts +103 -0
  283. package/dist/plugins/plugin-manager.js +316 -0
  284. package/dist/plugins/plugin.d.ts +529 -0
  285. package/dist/plugins/plugin.js +3 -0
  286. package/dist/shared/config/constants.d.ts +66 -0
  287. package/dist/shared/config/constants.js +60 -0
  288. package/dist/shared/config/feature-style.d.ts +155 -0
  289. package/dist/shared/config/feature-style.js +154 -0
  290. package/dist/shared/config/index.d.ts +17 -0
  291. package/dist/shared/config/index.js +8 -0
  292. package/dist/shared/config/rendering.d.ts +107 -0
  293. package/dist/shared/config/rendering.js +33 -0
  294. package/dist/shared/config/selection-highlight.d.ts +29 -0
  295. package/dist/shared/config/selection-highlight.js +35 -0
  296. package/dist/shared/config/selection.d.ts +273 -0
  297. package/dist/shared/config/selection.js +266 -0
  298. package/dist/shared/config/topology.d.ts +33 -0
  299. package/dist/shared/config/topology.js +17 -0
  300. package/dist/shared/config/trace.d.ts +40 -0
  301. package/dist/shared/config/trace.js +17 -0
  302. package/dist/shared/math/angle.d.ts +21 -0
  303. package/dist/shared/math/angle.js +34 -0
  304. package/dist/shared/math/circle.d.ts +6 -0
  305. package/dist/shared/math/circle.js +10 -0
  306. package/dist/shared/math/constants.d.ts +48 -0
  307. package/dist/shared/math/constants.js +59 -0
  308. package/dist/shared/math/distance.d.ts +78 -0
  309. package/dist/shared/math/distance.js +147 -0
  310. package/dist/shared/math/globe-subdivision.d.ts +62 -0
  311. package/dist/shared/math/globe-subdivision.js +99 -0
  312. package/dist/shared/math/index.d.ts +17 -0
  313. package/dist/shared/math/index.js +21 -0
  314. package/dist/shared/math/intersection.d.ts +63 -0
  315. package/dist/shared/math/intersection.js +236 -0
  316. package/dist/shared/math/longitude.d.ts +20 -0
  317. package/dist/shared/math/longitude.js +31 -0
  318. package/dist/shared/math/mercator-plane.d.ts +27 -0
  319. package/dist/shared/math/mercator-plane.js +26 -0
  320. package/dist/shared/math/obb.d.ts +65 -0
  321. package/dist/shared/math/obb.js +107 -0
  322. package/dist/shared/math/rotation.d.ts +93 -0
  323. package/dist/shared/math/rotation.js +186 -0
  324. package/dist/shared/math/segment-grid.d.ts +69 -0
  325. package/dist/shared/math/segment-grid.js +159 -0
  326. package/dist/shared/math/transform.d.ts +140 -0
  327. package/dist/shared/math/transform.js +189 -0
  328. package/dist/shared/types/events.d.ts +128 -0
  329. package/dist/shared/types/events.js +3 -0
  330. package/dist/shared/types/model.d.ts +950 -0
  331. package/dist/shared/types/model.js +3 -0
  332. package/dist/shared/types/selection-box.d.ts +23 -0
  333. package/dist/shared/types/selection-box.js +3 -0
  334. package/dist/shared/types/style.d.ts +68 -0
  335. package/dist/shared/types/style.js +3 -0
  336. package/dist/shared/utils/color.d.ts +49 -0
  337. package/dist/shared/utils/color.js +180 -0
  338. package/dist/shared/utils/coordinates.d.ts +52 -0
  339. package/dist/shared/utils/coordinates.js +75 -0
  340. package/dist/shared/utils/embedded-image.d.ts +34 -0
  341. package/dist/shared/utils/embedded-image.js +161 -0
  342. package/dist/shared/utils/event-emitter.d.ts +262 -0
  343. package/dist/shared/utils/event-emitter.js +44 -0
  344. package/dist/shared/utils/feature-bbox.d.ts +8 -0
  345. package/dist/shared/utils/feature-bbox.js +207 -0
  346. package/dist/shared/utils/feature-segments.d.ts +23 -0
  347. package/dist/shared/utils/feature-segments.js +179 -0
  348. package/dist/shared/utils/id.d.ts +1 -0
  349. package/dist/shared/utils/id.js +35 -0
  350. package/dist/shared/utils/image.d.ts +34 -0
  351. package/dist/shared/utils/image.js +106 -0
  352. package/dist/shared/utils/index.d.ts +15 -0
  353. package/dist/shared/utils/index.js +24 -0
  354. package/dist/shared/utils/map.d.ts +26 -0
  355. package/dist/shared/utils/map.js +35 -0
  356. package/dist/shared/utils/name-generator.d.ts +197 -0
  357. package/dist/shared/utils/name-generator.js +337 -0
  358. package/dist/shared/utils/pixel-ratio.d.ts +111 -0
  359. package/dist/shared/utils/pixel-ratio.js +85 -0
  360. package/dist/shared/utils/property.d.ts +88 -0
  361. package/dist/shared/utils/property.js +140 -0
  362. package/dist/shared/utils/vertex-ref.d.ts +23 -0
  363. package/dist/shared/utils/vertex-ref.js +20 -0
  364. package/dist/snapping/custom-targets.d.ts +1 -0
  365. package/dist/snapping/custom-targets.js +21 -0
  366. package/dist/snapping/geometry.d.ts +1 -0
  367. package/dist/snapping/geometry.js +61 -0
  368. package/dist/snapping/index.d.ts +14 -0
  369. package/dist/snapping/index.js +4 -0
  370. package/dist/snapping/indicator.d.ts +19 -0
  371. package/dist/snapping/indicator.js +145 -0
  372. package/dist/snapping/providers/display.d.ts +72 -0
  373. package/dist/snapping/providers/display.js +268 -0
  374. package/dist/snapping/providers/guide.d.ts +69 -0
  375. package/dist/snapping/providers/guide.js +187 -0
  376. package/dist/snapping/providers/intersection.d.ts +1 -0
  377. package/dist/snapping/providers/intersection.js +92 -0
  378. package/dist/snapping/providers/shared.d.ts +39 -0
  379. package/dist/snapping/providers/shared.js +146 -0
  380. package/dist/snapping/providers/store.d.ts +1 -0
  381. package/dist/snapping/providers/store.js +132 -0
  382. package/dist/snapping/service.d.ts +1 -0
  383. package/dist/snapping/service.js +272 -0
  384. package/dist/snapping/types.d.ts +267 -0
  385. package/dist/snapping/types.js +66 -0
  386. package/dist/store/change-merger.d.ts +1 -0
  387. package/dist/store/change-merger.js +102 -0
  388. package/dist/store/draw-store.d.ts +1 -0
  389. package/dist/store/draw-store.js +396 -0
  390. package/dist/store/event-bridge.d.ts +1 -0
  391. package/dist/store/event-bridge.js +161 -0
  392. package/dist/store/index.d.ts +12 -0
  393. package/dist/store/index.js +4 -0
  394. package/dist/store/local-visibility.d.ts +21 -0
  395. package/dist/store/local-visibility.js +27 -0
  396. package/dist/store/lock.d.ts +67 -0
  397. package/dist/store/lock.js +54 -0
  398. package/dist/store/memory/change-bus.d.ts +60 -0
  399. package/dist/store/memory/change-bus.js +232 -0
  400. package/dist/store/memory/file-store.d.ts +15 -0
  401. package/dist/store/memory/file-store.js +33 -0
  402. package/dist/store/memory/frozen.d.ts +21 -0
  403. package/dist/store/memory/frozen.js +51 -0
  404. package/dist/store/memory/ui-state.d.ts +51 -0
  405. package/dist/store/memory/ui-state.js +223 -0
  406. package/dist/store/memory.d.ts +26 -0
  407. package/dist/store/memory.js +708 -0
  408. package/dist/store/spatial/index.d.ts +6 -0
  409. package/dist/store/spatial/index.js +4 -0
  410. package/dist/store/spatial/spatial-index.d.ts +90 -0
  411. package/dist/store/spatial/spatial-index.js +148 -0
  412. package/dist/store/spatial/store-spatial-index.d.ts +60 -0
  413. package/dist/store/spatial/store-spatial-index.js +125 -0
  414. package/dist/store/store.d.ts +417 -0
  415. package/dist/store/store.js +3 -0
  416. package/dist/store/types.d.ts +8 -0
  417. package/dist/store/types.js +3 -0
  418. package/dist/store/writable-layer.d.ts +35 -0
  419. package/dist/store/writable-layer.js +20 -0
  420. package/dist/view/cache/buffer.d.ts +28 -0
  421. package/dist/view/cache/buffer.js +176 -0
  422. package/dist/view/cache/earcut.d.ts +1 -0
  423. package/dist/view/cache/earcut.js +122 -0
  424. package/dist/view/cache/style-rule.d.ts +1 -0
  425. package/dist/view/cache/style-rule.js +97 -0
  426. package/dist/view/cache/terrain-fill.d.ts +30 -0
  427. package/dist/view/cache/terrain-fill.js +60 -0
  428. package/dist/view/cache/texture.d.ts +14 -0
  429. package/dist/view/cache/texture.js +292 -0
  430. package/dist/view/coordinator.d.ts +27 -0
  431. package/dist/view/coordinator.js +72 -0
  432. package/dist/view/feature-companion.d.ts +173 -0
  433. package/dist/view/feature-companion.js +108 -0
  434. package/dist/view/globe-subdivision.d.ts +78 -0
  435. package/dist/view/globe-subdivision.js +128 -0
  436. package/dist/view/index.d.ts +47 -0
  437. package/dist/view/index.js +20 -0
  438. package/dist/view/layer/attach.d.ts +20 -0
  439. package/dist/view/layer/attach.js +47 -0
  440. package/dist/view/layer/blend.d.ts +57 -0
  441. package/dist/view/layer/blend.js +14 -0
  442. package/dist/view/layer/custom-layer.d.ts +1 -0
  443. package/dist/view/layer/custom-layer.js +509 -0
  444. package/dist/view/layer/depth-state.d.ts +14 -0
  445. package/dist/view/layer/depth-state.js +44 -0
  446. package/dist/view/layer/display-list.d.ts +1 -0
  447. package/dist/view/layer/display-list.js +111 -0
  448. package/dist/view/layer/drape-planner.d.ts +139 -0
  449. package/dist/view/layer/drape-planner.js +726 -0
  450. package/dist/view/layer/frame-render.d.ts +57 -0
  451. package/dist/view/layer/frame-render.js +209 -0
  452. package/dist/view/layer/frame-state.d.ts +147 -0
  453. package/dist/view/layer/frame-state.js +484 -0
  454. package/dist/view/layer/gl-state.d.ts +77 -0
  455. package/dist/view/layer/gl-state.js +132 -0
  456. package/dist/view/layer/index.d.ts +6 -0
  457. package/dist/view/layer/index.js +5 -0
  458. package/dist/view/layer/render-scope.d.ts +30 -0
  459. package/dist/view/layer/render-scope.js +28 -0
  460. package/dist/view/layer/render.d.ts +87 -0
  461. package/dist/view/layer/render.js +187 -0
  462. package/dist/view/layer/renderers.d.ts +81 -0
  463. package/dist/view/layer/renderers.js +142 -0
  464. package/dist/view/layer/slot-manager.d.ts +26 -0
  465. package/dist/view/layer/slot-manager.js +133 -0
  466. package/dist/view/layer/slots.d.ts +33 -0
  467. package/dist/view/layer/slots.js +50 -0
  468. package/dist/view/layer/store-retained-bbox.d.ts +36 -0
  469. package/dist/view/layer/store-retained-bbox.js +188 -0
  470. package/dist/view/layer/store-retained-chunk.d.ts +97 -0
  471. package/dist/view/layer/store-retained-chunk.js +94 -0
  472. package/dist/view/layer/store-retained-classify.d.ts +34 -0
  473. package/dist/view/layer/store-retained-classify.js +88 -0
  474. package/dist/view/layer/store-retained-collect.d.ts +24 -0
  475. package/dist/view/layer/store-retained-collect.js +121 -0
  476. package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
  477. package/dist/view/layer/store-retained-coord-patch.js +168 -0
  478. package/dist/view/layer/store-retained-immediate.d.ts +63 -0
  479. package/dist/view/layer/store-retained-immediate.js +49 -0
  480. package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
  481. package/dist/view/layer/store-retained-invalidation.js +192 -0
  482. package/dist/view/layer/store-retained.d.ts +198 -0
  483. package/dist/view/layer/store-retained.js +430 -0
  484. package/dist/view/layer/terrain-resolver.d.ts +1 -0
  485. package/dist/view/layer/terrain-resolver.js +174 -0
  486. package/dist/view/renderers/batch-manager.d.ts +61 -0
  487. package/dist/view/renderers/batch-manager.js +718 -0
  488. package/dist/view/renderers/draw-factors.d.ts +60 -0
  489. package/dist/view/renderers/draw-factors.js +35 -0
  490. package/dist/view/renderers/drawer.d.ts +1 -0
  491. package/dist/view/renderers/drawer.js +346 -0
  492. package/dist/view/renderers/image.d.ts +1 -0
  493. package/dist/view/renderers/image.js +255 -0
  494. package/dist/view/renderers/line/dash.d.ts +31 -0
  495. package/dist/view/renderers/line/dash.js +152 -0
  496. package/dist/view/renderers/line/line-geometry.d.ts +39 -0
  497. package/dist/view/renderers/line/line-geometry.js +460 -0
  498. package/dist/view/renderers/line/line-gl.d.ts +1 -0
  499. package/dist/view/renderers/line/line-gl.js +236 -0
  500. package/dist/view/renderers/line/line-shader.d.ts +1 -0
  501. package/dist/view/renderers/line/line-shader.js +364 -0
  502. package/dist/view/renderers/line/line-types.d.ts +43 -0
  503. package/dist/view/renderers/line/line-types.js +3 -0
  504. package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
  505. package/dist/view/renderers/line/line-uniforms.js +390 -0
  506. package/dist/view/renderers/line/sdf-line.d.ts +92 -0
  507. package/dist/view/renderers/line/sdf-line.js +567 -0
  508. package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
  509. package/dist/view/renderers/point/billboard-depth.js +56 -0
  510. package/dist/view/renderers/point/point-instance.d.ts +124 -0
  511. package/dist/view/renderers/point/point-instance.js +738 -0
  512. package/dist/view/renderers/point/point-sdf.d.ts +58 -0
  513. package/dist/view/renderers/point/point-sdf.js +170 -0
  514. package/dist/view/renderers/point/point-shape.d.ts +99 -0
  515. package/dist/view/renderers/point/point-shape.js +504 -0
  516. package/dist/view/renderers/point/point-style.d.ts +1 -0
  517. package/dist/view/renderers/point/point-style.js +46 -0
  518. package/dist/view/renderers/polygon/batch.d.ts +26 -0
  519. package/dist/view/renderers/polygon/batch.js +336 -0
  520. package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
  521. package/dist/view/renderers/polygon/earcut-input.js +55 -0
  522. package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
  523. package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
  524. package/dist/view/renderers/polygon/fill.d.ts +74 -0
  525. package/dist/view/renderers/polygon/fill.js +251 -0
  526. package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
  527. package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
  528. package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
  529. package/dist/view/renderers/polygon/terrain-cull.js +14 -0
  530. package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
  531. package/dist/view/renderers/polygon/triangulator.js +3 -0
  532. package/dist/view/renderers/retained.d.ts +43 -0
  533. package/dist/view/renderers/retained.js +3 -0
  534. package/dist/view/renderers/stroke.d.ts +121 -0
  535. package/dist/view/renderers/stroke.js +621 -0
  536. package/dist/view/shaders/frame.d.ts +8 -0
  537. package/dist/view/shaders/frame.js +37 -0
  538. package/dist/view/shaders/helpers.d.ts +238 -0
  539. package/dist/view/shaders/helpers.js +611 -0
  540. package/dist/view/shaders/initializer.d.ts +27 -0
  541. package/dist/view/shaders/initializer.js +125 -0
  542. package/dist/view/shaders/projection.d.ts +123 -0
  543. package/dist/view/shaders/projection.js +299 -0
  544. package/dist/view/shaders/quad-grid.d.ts +77 -0
  545. package/dist/view/shaders/quad-grid.js +128 -0
  546. package/dist/view/shaders/quad.d.ts +189 -0
  547. package/dist/view/shaders/quad.js +582 -0
  548. package/dist/view/shaders/retained-origin.d.ts +50 -0
  549. package/dist/view/shaders/retained-origin.js +67 -0
  550. package/dist/view/shaders/terrain-shade.d.ts +23 -0
  551. package/dist/view/shaders/terrain-shade.js +93 -0
  552. package/dist/view/style-rule.d.ts +166 -0
  553. package/dist/view/style-rule.js +300 -0
  554. package/dist/view/terrain/anchor.d.ts +135 -0
  555. package/dist/view/terrain/anchor.js +226 -0
  556. package/dist/view/terrain/context.d.ts +132 -0
  557. package/dist/view/terrain/context.js +437 -0
  558. package/dist/view/terrain/dem-atlas.d.ts +97 -0
  559. package/dist/view/terrain/dem-atlas.js +534 -0
  560. package/dist/view/terrain/detect.d.ts +126 -0
  561. package/dist/view/terrain/detect.js +198 -0
  562. package/dist/view/terrain/drape/bin-store.d.ts +179 -0
  563. package/dist/view/terrain/drape/bin-store.js +529 -0
  564. package/dist/view/terrain/drape/binning.d.ts +259 -0
  565. package/dist/view/terrain/drape/binning.js +604 -0
  566. package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
  567. package/dist/view/terrain/drape/edge-constrain.js +175 -0
  568. package/dist/view/terrain/drape/geometry.d.ts +95 -0
  569. package/dist/view/terrain/drape/geometry.js +260 -0
  570. package/dist/view/terrain/drape/mesh.d.ts +50 -0
  571. package/dist/view/terrain/drape/mesh.js +86 -0
  572. package/dist/view/terrain/drape/pass.d.ts +122 -0
  573. package/dist/view/terrain/drape/pass.js +379 -0
  574. package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
  575. package/dist/view/terrain/drape/quad-glyphs.js +117 -0
  576. package/dist/view/terrain/drape/quad.d.ts +249 -0
  577. package/dist/view/terrain/drape/quad.js +835 -0
  578. package/dist/view/terrain/drape/renderer.d.ts +184 -0
  579. package/dist/view/terrain/drape/renderer.js +706 -0
  580. package/dist/view/terrain/drape/shared.d.ts +80 -0
  581. package/dist/view/terrain/drape/shared.js +173 -0
  582. package/dist/view/terrain/drape/stitch.d.ts +155 -0
  583. package/dist/view/terrain/drape/stitch.js +228 -0
  584. package/dist/view/terrain/ground.d.ts +72 -0
  585. package/dist/view/terrain/ground.js +151 -0
  586. package/dist/view/terrain/metrics.d.ts +180 -0
  587. package/dist/view/terrain/metrics.js +231 -0
  588. package/dist/view/terrain/occlusion.d.ts +11 -0
  589. package/dist/view/terrain/occlusion.js +129 -0
  590. package/dist/view/terrain/polygon.d.ts +86 -0
  591. package/dist/view/terrain/polygon.js +301 -0
  592. package/dist/view/terrain/shade.d.ts +48 -0
  593. package/dist/view/terrain/shade.js +45 -0
  594. package/dist/view/terrain/state.d.ts +99 -0
  595. package/dist/view/terrain/state.js +186 -0
  596. package/dist/view/terrain/tessellation.d.ts +265 -0
  597. package/dist/view/terrain/tessellation.js +924 -0
  598. package/dist/view/terrain/tiling.d.ts +56 -0
  599. package/dist/view/terrain/tiling.js +155 -0
  600. package/dist/view/terrain/upstream-terrain.d.ts +82 -0
  601. package/dist/view/terrain/upstream-terrain.js +116 -0
  602. package/dist/view/ui/auxiliary-handles.d.ts +151 -0
  603. package/dist/view/ui/auxiliary-handles.js +22 -0
  604. package/dist/view/ui/bounds.d.ts +53 -0
  605. package/dist/view/ui/bounds.js +149 -0
  606. package/dist/view/ui/box-selection.d.ts +1 -0
  607. package/dist/view/ui/box-selection.js +83 -0
  608. package/dist/view/ui/handle-test.d.ts +1 -0
  609. package/dist/view/ui/handle-test.js +437 -0
  610. package/dist/view/ui/handle-thinning.d.ts +122 -0
  611. package/dist/view/ui/handle-thinning.js +430 -0
  612. package/dist/view/ui/handles.d.ts +25 -0
  613. package/dist/view/ui/handles.js +673 -0
  614. package/dist/view/ui/helper.d.ts +19 -0
  615. package/dist/view/ui/helper.js +76 -0
  616. package/dist/view/ui/index.d.ts +15 -0
  617. package/dist/view/ui/index.js +15 -0
  618. package/dist/view/ui/selection-scope.d.ts +25 -0
  619. package/dist/view/ui/selection-scope.js +34 -0
  620. package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
  621. package/dist/view/ui/selection-ui/bounding-box.js +240 -0
  622. package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
  623. package/dist/view/ui/selection-ui/extension-registry.js +78 -0
  624. package/dist/view/ui/selection-ui/index.d.ts +12 -0
  625. package/dist/view/ui/selection-ui/index.js +12 -0
  626. package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
  627. package/dist/view/ui/selection-ui/renderer.js +227 -0
  628. package/dist/view/ui/selection-ui/types.d.ts +55 -0
  629. package/dist/view/ui/selection-ui/types.js +3 -0
  630. package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
  631. package/dist/view/ui/selection-ui-drawer.js +329 -0
  632. package/dist/view/ui/tentative.d.ts +1 -0
  633. package/dist/view/ui/tentative.js +320 -0
  634. package/dist/view/viewport.d.ts +119 -0
  635. package/dist/view/viewport.js +254 -0
  636. package/package.json +113 -0
@@ -0,0 +1,142 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { TextureCache } from '../cache/texture.js';
4
+ import { BatchManager } from '../renderers/batch-manager.js';
5
+ import { FeatureDrawer } from '../renderers/drawer.js';
6
+ import { ImageRenderer } from '../renderers/image.js';
7
+ import { SDFLineRenderer } from '../renderers/line/sdf-line.js';
8
+ import { PointInstanceRenderer } from '../renderers/point/point-instance.js';
9
+ import { PointShapeRenderer } from '../renderers/point/point-shape.js';
10
+ import { PolygonBatchRenderer } from '../renderers/polygon/batch.js';
11
+ import { FillShaderManager } from '../renderers/polygon/fill.js';
12
+ import { SDFPolygonRenderer } from '../renderers/polygon/sdf-polygon.js';
13
+ import { StrokeRenderer } from '../renderers/stroke.js';
14
+ import { ShaderInitializer } from '../shaders/initializer.js';
15
+ import { QuadShader } from '../shaders/quad.js';
16
+ import { BoxSelectionRenderer } from '../ui/box-selection.js';
17
+ import { SelectionHandlesRenderer, SelectionUIRenderer } from '../ui/index.js';
18
+ import { TentativeRenderer } from '../ui/tentative.js';
19
+ import { ViewportFilter } from '../viewport.js';
20
+ /**
21
+ * Initialize the renderers
22
+ */
23
+ export function initRenderers(deps) {
24
+ const { gl, map: mapInstance, store, spatialIndex, featureStyle, selectionConfig, renderingConfig, customFeatureHandlers, pixelRatio, scope, onImageError, } = deps;
25
+ const textureCache = new TextureCache(gl);
26
+ const terrain = scope.terrain;
27
+ const quadShader = new QuadShader(gl, terrain);
28
+ const imageRenderer = new ImageRenderer(mapInstance, gl, textureCache, quadShader, (fileId) => store.getFile(fileId), onImageError);
29
+ const strokeRenderer = new StrokeRenderer(mapInstance, gl, pixelRatio, terrain);
30
+ const sdfLineRenderer = new SDFLineRenderer(mapInstance, gl, pixelRatio, terrain);
31
+ const pointShapeRenderer = new PointShapeRenderer(mapInstance, gl, pixelRatio, terrain);
32
+ const pointInstanceRenderer = new PointInstanceRenderer(mapInstance, gl, pixelRatio, terrain);
33
+ const polygonScope = { terrain, earcut: scope.earcut };
34
+ const polygonBatchRenderer = new PolygonBatchRenderer(gl, polygonScope);
35
+ const sdfPolygonRenderer = new SDFPolygonRenderer(gl, pixelRatio, polygonScope);
36
+ const fillShaderManager = new FillShaderManager(gl, terrain);
37
+ const selectionExtensions = scope.selection.extensions;
38
+ const selectionUIRenderer = new SelectionUIRenderer(strokeRenderer, selectionConfig, selectionExtensions);
39
+ // The tile size of this instance's map (read by the custom bounding box calculators)
40
+ const tileSize = mapInstance.transform?.tileSize ?? 512;
41
+ selectionExtensions.setTileSize(tileSize);
42
+ // Register the bounding box functions used by the selection UI for custom feature handlers
43
+ if (customFeatureHandlers) {
44
+ for (const handler of customFeatureHandlers) {
45
+ if (handler.getSelectionBoundingBox) {
46
+ selectionExtensions.registerBoundingBox(handler.type, handler.getSelectionBoundingBox);
47
+ }
48
+ }
49
+ }
50
+ const selectionHandlesRenderer = new SelectionHandlesRenderer(strokeRenderer, pointShapeRenderer, selectionConfig);
51
+ selectionHandlesRenderer.setPointInstanceRenderer(pointInstanceRenderer);
52
+ const featureDrawer = new FeatureDrawer({
53
+ gl,
54
+ map: mapInstance,
55
+ sdfLineRenderer,
56
+ pointShapeRenderer,
57
+ imageRenderer,
58
+ featureStyle,
59
+ styleRules: scope.styleRules,
60
+ terrain,
61
+ });
62
+ const tentativeRenderer = new TentativeRenderer({
63
+ gl,
64
+ map: mapInstance,
65
+ sdfLineRenderer,
66
+ pointShapeRenderer,
67
+ tentativeStyle: featureStyle.tentative,
68
+ terrain,
69
+ });
70
+ const boxSelectionRenderer = new BoxSelectionRenderer(mapInstance, gl, renderingConfig.boxSelectionStyle, pixelRatio);
71
+ const viewportFilter = new ViewportFilter({ map: mapInstance, spatialIndex });
72
+ const shaderInitializer = new ShaderInitializer({
73
+ featureDrawer,
74
+ tentativeRenderer,
75
+ quadShader,
76
+ strokeRenderer,
77
+ pointShapeRenderer,
78
+ pointInstanceRenderer,
79
+ sdfLineRenderer,
80
+ polygonBatchRenderer,
81
+ sdfPolygonRenderer,
82
+ });
83
+ const batchManager = new BatchManager({
84
+ gl,
85
+ featureDrawer,
86
+ pointInstanceRenderer,
87
+ sdfLineRenderer,
88
+ polygonBatchRenderer,
89
+ sdfPolygonRenderer,
90
+ terrain,
91
+ });
92
+ return {
93
+ textureCache,
94
+ quadShader,
95
+ imageRenderer,
96
+ strokeRenderer,
97
+ sdfLineRenderer,
98
+ pointShapeRenderer,
99
+ pointInstanceRenderer,
100
+ polygonBatchRenderer,
101
+ sdfPolygonRenderer,
102
+ fillShaderManager,
103
+ selectionUIRenderer,
104
+ selectionHandlesRenderer,
105
+ featureDrawer,
106
+ tentativeRenderer,
107
+ boxSelectionRenderer,
108
+ viewportFilter,
109
+ shaderInitializer,
110
+ batchManager,
111
+ };
112
+ }
113
+ /**
114
+ * Every member that owns GPU resources, in the order they are released
115
+ *
116
+ * The list is checked against the type: a member with a dispose() that is missing here is a
117
+ * compile error (see `UNRELEASED` below), so a renderer added to Renderers cannot leak its
118
+ * programs, buffers and textures when the layer is removed and added again.
119
+ */
120
+ const GPU_OWNERS = [
121
+ 'featureDrawer',
122
+ 'tentativeRenderer',
123
+ 'boxSelectionRenderer',
124
+ 'textureCache',
125
+ 'quadShader',
126
+ 'strokeRenderer',
127
+ 'pointShapeRenderer',
128
+ 'pointInstanceRenderer',
129
+ 'sdfLineRenderer',
130
+ 'polygonBatchRenderer',
131
+ 'sdfPolygonRenderer',
132
+ 'fillShaderManager',
133
+ ];
134
+ const UNRELEASED = true;
135
+ void UNRELEASED;
136
+ /**
137
+ * Dispose the renderers
138
+ */
139
+ export function disposeRenderers(r) {
140
+ for (const key of GPU_OWNERS)
141
+ r[key].dispose();
142
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SlotManager
3
+ *
4
+ * Keeps the slots (one CustomLayer per segment of the stacking order) in step with the stacking
5
+ * order, and counts how many of them are on the maplibre map. The engine behind the slots is
6
+ * built when the first slot goes onto the map and torn down when the last one leaves; the
7
+ * manager only answers "first" and "last", and the layer builds and tears down. How the order is
8
+ * cut into segments is in slots.ts, and the design is chapter 5 of
9
+ * docs/internals/rendering.md ("Slots and separators").
10
+ */
11
+ import type { CustomLayerInterface, Map as MapLibreMap } from 'maplibre-gl';
12
+ import { type RenderSlot } from './slots.js';
13
+ /** What the manager needs */
14
+ export interface SlotManagerDeps {
15
+ map: Pick<MapLibreMap, 'getLayer' | 'addLayer' | 'removeLayer'> & {
16
+ triggerRepaint?: () => void;
17
+ };
18
+ /** The current stacking order */
19
+ getLayerOrder: () => readonly string[];
20
+ /** Predicate that identifies the separators (always false when omitted = a single slot) */
21
+ isExternalEntry?: (entryId: string) => boolean;
22
+ /** Where the changes of the slots and of the segments are notified */
23
+ onSlotsChange?: (slots: RenderSlot[]) => void;
24
+ /** Creates the CustomLayer of the slot at `index` (index 1 onwards) */
25
+ createSlotLayer: (index: number) => CustomLayerInterface;
26
+ }
@@ -0,0 +1,133 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { partitionLayerOrder, renderSlotLayerId, sameSegments, } from './slots.js';
4
+ /**
5
+ * The slots of one draw instance
6
+ *
7
+ * @internal
8
+ */
9
+ export class SlotManager {
10
+ constructor(deps) {
11
+ Object.defineProperty(this, "deps", {
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ value: void 0
16
+ });
17
+ /** The current list of segments (layerOrder cut at the separators) */
18
+ Object.defineProperty(this, "currentSegments", {
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true,
22
+ value: void 0
23
+ });
24
+ /** The CustomLayers of the slots (first = backmost; the first is the primary layer) */
25
+ Object.defineProperty(this, "slotLayers", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: []
30
+ });
31
+ /** Number of slots added to maplibre (0 → 1 builds the engine, 1 → 0 tears it down) */
32
+ Object.defineProperty(this, "added", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: 0
37
+ });
38
+ this.deps = deps;
39
+ this.currentSegments = partitionLayerOrder(deps.getLayerOrder(), deps.isExternalEntry);
40
+ }
41
+ /** The current list of segments */
42
+ get segments() {
43
+ return this.currentSegments;
44
+ }
45
+ /** Number of slots currently on the map */
46
+ get addedCount() {
47
+ return this.added;
48
+ }
49
+ /**
50
+ * Registers the primary layer as the first slot and prepares the following slots
51
+ *
52
+ * When there are separators, the following slots are prepared here (the host adds them to the
53
+ * map in order from the first).
54
+ */
55
+ init(primary) {
56
+ this.slotLayers.push(primary);
57
+ for (let index = 1; index < this.currentSegments.length; index++) {
58
+ this.slotLayers.push(this.deps.createSlotLayer(index));
59
+ }
60
+ }
61
+ /**
62
+ * Records that a slot went onto the map
63
+ *
64
+ * @returns true when it is the first one (the engine is to be built)
65
+ */
66
+ attach() {
67
+ this.added++;
68
+ return this.added === 1;
69
+ }
70
+ /**
71
+ * Records that a slot left the map
72
+ *
73
+ * @returns true when none is left (the engine is to be torn down)
74
+ */
75
+ detach() {
76
+ this.added = Math.max(0, this.added - 1);
77
+ return this.added === 0;
78
+ }
79
+ /** The list of slots (public form) */
80
+ getRenderSlots() {
81
+ return this.currentSegments.map((segment, index) => ({
82
+ layerId: this.slotLayers[index]?.id ?? renderSlotLayerId(index),
83
+ from: segment.from,
84
+ to: segment.to,
85
+ }));
86
+ }
87
+ /** The CustomLayers of the slots (first = backmost) */
88
+ getSlotLayers() {
89
+ return this.slotLayers.slice();
90
+ }
91
+ /**
92
+ * Makes the slots follow the changes of the stacking order
93
+ *
94
+ * Nothing happens when the list of segments has not changed. A new slot is added to the front
95
+ * of the maplibre order (which is consistent with the slots added from the first one onwards;
96
+ * placing the native layers of the separators again is the responsibility of the host and is
97
+ * prompted by the notification). When a slot is removed, it is removed from the last one.
98
+ */
99
+ sync() {
100
+ const { map, isExternalEntry, onSlotsChange } = this.deps;
101
+ const next = partitionLayerOrder(this.deps.getLayerOrder(), isExternalEntry);
102
+ if (sameSegments(next, this.currentSegments))
103
+ return;
104
+ this.currentSegments = next;
105
+ const slotLayers = this.slotLayers;
106
+ while (slotLayers.length < next.length) {
107
+ const slot = this.deps.createSlotLayer(slotLayers.length);
108
+ slotLayers.push(slot);
109
+ // The following slots are added to the map only while the first slot is on it (when it is
110
+ // not, the host adds them later in order from the first)
111
+ if (this.hasMapLayer(slotLayers[0].id) && !this.hasMapLayer(slot.id)) {
112
+ map.addLayer(slot);
113
+ }
114
+ }
115
+ while (slotLayers.length > next.length) {
116
+ const slot = slotLayers.pop();
117
+ if (slot && this.hasMapLayer(slot.id)) {
118
+ map.removeLayer(slot.id);
119
+ }
120
+ }
121
+ onSlotsChange?.(this.getRenderSlots());
122
+ map.triggerRepaint?.();
123
+ }
124
+ /** Whether the map has that layer (always false while the style is not loaded) */
125
+ hasMapLayer(id) {
126
+ try {
127
+ return !!this.deps.map.getLayer(id);
128
+ }
129
+ catch {
130
+ return false;
131
+ }
132
+ }
133
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Separators and slots of the stacking order
3
+ *
4
+ * Entries of the stacking order (layerOrder) that the host declares as "external entries"
5
+ * (entries we do not draw ourselves, which the host places as native maplibre layers) are treated
6
+ * as separators, and every segment between separators gets its own CustomLayer (a slot).
7
+ * A maplibre style is a single ordered list and nothing can be inserted inside a CustomLayer, so
8
+ * a native layer can be placed in between our own rendering only once the slots are split per
9
+ * segment. The design is in docs/internals/rendering.md, "Slots and separators".
10
+ */
11
+ export type { RenderSlot } from '../../shared/types/events.js';
12
+ /** A segment ([from, to) in layerOrder) */
13
+ export interface RenderSegment {
14
+ readonly from: number;
15
+ readonly to: number;
16
+ }
17
+ /** Layer id of the first slot (keeps the same id as the single layer used before) */
18
+ export declare const PRIMARY_RENDER_LAYER_ID = "maplibre-gl-draw-layer";
19
+ /** Layer id of the slot at `index` */
20
+ export declare function renderSlotLayerId(index: number): string;
21
+ /**
22
+ * Split the stacking order into segments at the separators
23
+ *
24
+ * A separator is an entry for which the predicate returns true, and the separator itself belongs
25
+ * to no segment. No segment is created for an empty run between separators (where separators are
26
+ * adjacent) because there is nothing to draw. If there is no separator at all, the whole list
27
+ * becomes a single segment and the behaviour is the same as the single CustomLayer used before.
28
+ * Even for a list with no entry drawn by us, a slot is needed to draw the foreground pass
29
+ * (selection UI and overlays), so one empty segment is returned.
30
+ */
31
+ export declare function partitionLayerOrder(order: readonly string[], isExternalEntry?: (entryId: string) => boolean): RenderSegment[];
32
+ /** Whether two lists of segments are the same */
33
+ export declare function sameSegments(a: readonly RenderSegment[], b: readonly RenderSegment[]): boolean;
@@ -0,0 +1,50 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /** Layer id of the first slot (keeps the same id as the single layer used before) */
4
+ export const PRIMARY_RENDER_LAYER_ID = 'maplibre-gl-draw-layer';
5
+ /** Layer id of the slot at `index` */
6
+ export function renderSlotLayerId(index) {
7
+ return index === 0 ? PRIMARY_RENDER_LAYER_ID : `${PRIMARY_RENDER_LAYER_ID}:${index}`;
8
+ }
9
+ /**
10
+ * Split the stacking order into segments at the separators
11
+ *
12
+ * A separator is an entry for which the predicate returns true, and the separator itself belongs
13
+ * to no segment. No segment is created for an empty run between separators (where separators are
14
+ * adjacent) because there is nothing to draw. If there is no separator at all, the whole list
15
+ * becomes a single segment and the behaviour is the same as the single CustomLayer used before.
16
+ * Even for a list with no entry drawn by us, a slot is needed to draw the foreground pass
17
+ * (selection UI and overlays), so one empty segment is returned.
18
+ */
19
+ export function partitionLayerOrder(order, isExternalEntry) {
20
+ if (!isExternalEntry)
21
+ return [{ from: 0, to: order.length }];
22
+ const segments = [];
23
+ let start = -1;
24
+ for (let i = 0; i < order.length; i++) {
25
+ if (isExternalEntry(order[i])) {
26
+ if (start >= 0) {
27
+ segments.push({ from: start, to: i });
28
+ start = -1;
29
+ }
30
+ }
31
+ else if (start < 0) {
32
+ start = i;
33
+ }
34
+ }
35
+ if (start >= 0)
36
+ segments.push({ from: start, to: order.length });
37
+ if (segments.length === 0)
38
+ segments.push({ from: 0, to: 0 });
39
+ return segments;
40
+ }
41
+ /** Whether two lists of segments are the same */
42
+ export function sameSegments(a, b) {
43
+ if (a.length !== b.length)
44
+ return false;
45
+ for (let i = 0; i < a.length; i++) {
46
+ if (a[i].from !== b[i].from || a[i].to !== b[i].to)
47
+ return false;
48
+ }
49
+ return true;
50
+ }
@@ -0,0 +1,36 @@
1
+ import type { BoundingBox, Coordinate, Feature } from '../../store/types.js';
2
+ import type { SelectionExtensionRegistry } from '../ui/selection-ui/index.js';
3
+ /**
4
+ * Longitude/latitude bounding box of a chunk `[minLng, minLat, maxLng, maxLat]`
5
+ */
6
+ export type ChunkBBox = [number, number, number, number];
7
+ /**
8
+ * Whether the chunk bbox intersects the expanded viewport
9
+ *
10
+ * Both are treated as longitude/latitude rectangles (touching edges count as intersecting).
11
+ */
12
+ export declare function bboxIntersects(bbox: ChunkBBox, viewport: BoundingBox): boolean;
13
+ /**
14
+ * The chunk bbox as a BoundingBox
15
+ */
16
+ export declare function chunkBBoxToBounds(bbox: ChunkBBox): BoundingBox;
17
+ /**
18
+ * Expands the chunk bbox by one point (it never shrinks it)
19
+ *
20
+ * The incremental update of vertices only looks at the vertices that moved, so the bbox cannot be
21
+ * recomputed exactly. As long as it only grows, "retained mode ⊇ immediate mode" holds: thinning
22
+ * simply misses and the rendering result stays correct. The exact bbox comes back with the next
23
+ * rebuild.
24
+ *
25
+ * @param bbox The current bbox. null (= always drawn without thinning) is returned as it is
26
+ */
27
+ export declare function expandBBox(bbox: ChunkBBox | null, coord: Coordinate): ChunkBBox | null;
28
+ /**
29
+ * Computes the longitude/latitude bbox of a list of features
30
+ *
31
+ * min/max are taken on the raw longitude values without normalization. Data crossing ±180 ends up
32
+ * with a huge bbox, so the thinning misses and it is always drawn (erring on the safe side).
33
+ *
34
+ * @returns null when there is not a single coordinate (= no thinning)
35
+ */
36
+ export declare function computeFeaturesBBox(features: readonly Feature[], extensions: SelectionExtensionRegistry | undefined): ChunkBBox | null;
@@ -0,0 +1,188 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Longitude/latitude extents of the retained chunks
5
+ *
6
+ * A retained batch does not depend on the camera, so each chunk keeps the bbox of its features
7
+ * and a frame skips the chunks that do not intersect the expanded viewport. The functions here
8
+ * compute that bbox, grow it during an incremental update and test it against the viewport.
9
+ */
10
+ import { circleBoundingBox } from '../../geometry/circle.js';
11
+ import { DEFAULT_TILE_SIZE } from '../../shared/math/index.js';
12
+ import { getCircleRadius } from '../../shared/utils/property.js';
13
+ import { getBoundingBox } from '../../store/spatial/index.js';
14
+ /**
15
+ * Whether the chunk bbox intersects the expanded viewport
16
+ *
17
+ * Both are treated as longitude/latitude rectangles (touching edges count as intersecting).
18
+ */
19
+ export function bboxIntersects(bbox, viewport) {
20
+ return (bbox[0] <= viewport.maxX &&
21
+ bbox[2] >= viewport.minX &&
22
+ bbox[1] <= viewport.maxY &&
23
+ bbox[3] >= viewport.minY);
24
+ }
25
+ /**
26
+ * The chunk bbox as a BoundingBox
27
+ */
28
+ export function chunkBBoxToBounds(bbox) {
29
+ return { minX: bbox[0], minY: bbox[1], maxX: bbox[2], maxY: bbox[3] };
30
+ }
31
+ /**
32
+ * Expands the chunk bbox by one point (it never shrinks it)
33
+ *
34
+ * The incremental update of vertices only looks at the vertices that moved, so the bbox cannot be
35
+ * recomputed exactly. As long as it only grows, "retained mode ⊇ immediate mode" holds: thinning
36
+ * simply misses and the rendering result stays correct. The exact bbox comes back with the next
37
+ * rebuild.
38
+ *
39
+ * @param bbox The current bbox. null (= always drawn without thinning) is returned as it is
40
+ */
41
+ export function expandBBox(bbox, coord) {
42
+ if (!bbox)
43
+ return null;
44
+ const [lng, lat] = coord;
45
+ if (!Number.isFinite(lng) || !Number.isFinite(lat))
46
+ return bbox;
47
+ return [
48
+ Math.min(bbox[0], lng),
49
+ Math.min(bbox[1], lat),
50
+ Math.max(bbox[2], lng),
51
+ Math.max(bbox[3], lat),
52
+ ];
53
+ }
54
+ /**
55
+ * Walks the nesting of coordinates (Coordinate / Coordinate[] / Coordinate[][] / ...)
56
+ *
57
+ * To avoid having a branch per feature type, it recurses until it reaches a pair of numbers. It
58
+ * also withstands the unknown nesting of a custom type.
59
+ */
60
+ function walkCoordinates(value, visit) {
61
+ if (!Array.isArray(value))
62
+ return;
63
+ if (typeof value[0] === 'number' && typeof value[1] === 'number') {
64
+ visit(value[0], value[1]);
65
+ return;
66
+ }
67
+ for (const item of value)
68
+ walkCoordinates(item, visit);
69
+ }
70
+ /**
71
+ * Computes the rectangle occupied by a feature that spreads around its anchor
72
+ *
73
+ * A kind where "coordinates is a single anchor point and the body spreads around it", such as
74
+ * Note / Text, degenerates into a point of zero area when only the coordinates are walked. The
75
+ * whole chunk would then be thinned away the moment the center of the map enters it (= the moment
76
+ * the anchor leaves the expanded viewport), and a feature that should cover the whole screen
77
+ * would disappear entirely.
78
+ *
79
+ * The rectangle it actually occupies is already known to the calculator registered by the
80
+ * extension (for Note, the selection box including the rotation) and to the size computation of
81
+ * Image. That is folded into an AABB and used.
82
+ *
83
+ * @returns null for a kind where walking the raw coordinates is enough (Point / LineString /
84
+ * Polygon and so on) and when the computation did not produce finite values (the caller then
85
+ * walks them as before)
86
+ */
87
+ function computeAnchoredExtent(feature, extensions) {
88
+ const tileSize = extensions?.getTileSize() ?? DEFAULT_TILE_SIZE;
89
+ // A custom type folds its registered rectangle (the 4 corners)
90
+ const calculator = extensions?.getBoundingBoxCalculator(feature.type);
91
+ if (calculator) {
92
+ const box = calculator(feature, tileSize);
93
+ if (!box)
94
+ return null;
95
+ return cornersToBBox([box.topLeft, box.topRight, box.bottomRight, box.bottomLeft]);
96
+ }
97
+ // Image is a standard kind of core, but its size is determined by the style and createdZoom
98
+ if (feature.type === 'Image') {
99
+ const box = getBoundingBox(feature, tileSize);
100
+ return isFiniteBBox([box.minX, box.minY, box.maxX, box.maxY])
101
+ ? [box.minX, box.minY, box.maxX, box.maxY]
102
+ : null;
103
+ }
104
+ return null;
105
+ }
106
+ /**
107
+ * Folds a sequence of coordinates into an AABB (null when a non-finite value is mixed in)
108
+ */
109
+ function cornersToBBox(corners) {
110
+ let minLng = Number.POSITIVE_INFINITY;
111
+ let minLat = Number.POSITIVE_INFINITY;
112
+ let maxLng = Number.NEGATIVE_INFINITY;
113
+ let maxLat = Number.NEGATIVE_INFINITY;
114
+ for (const corner of corners) {
115
+ const lng = corner?.[0];
116
+ const lat = corner?.[1];
117
+ if (!Number.isFinite(lng) || !Number.isFinite(lat))
118
+ return null;
119
+ if (lng < minLng)
120
+ minLng = lng;
121
+ if (lng > maxLng)
122
+ maxLng = lng;
123
+ if (lat < minLat)
124
+ minLat = lat;
125
+ if (lat > maxLat)
126
+ maxLat = lat;
127
+ }
128
+ return corners.length > 0 ? [minLng, minLat, maxLng, maxLat] : null;
129
+ }
130
+ /** Whether all 4 values of the bbox are finite */
131
+ function isFiniteBBox(bbox) {
132
+ return bbox.every((value) => Number.isFinite(value));
133
+ }
134
+ /**
135
+ * Computes the longitude/latitude bbox of a list of features
136
+ *
137
+ * min/max are taken on the raw longitude values without normalization. Data crossing ±180 ends up
138
+ * with a huge bbox, so the thinning misses and it is always drawn (erring on the safe side).
139
+ *
140
+ * @returns null when there is not a single coordinate (= no thinning)
141
+ */
142
+ export function computeFeaturesBBox(features, extensions) {
143
+ let minLng = Number.POSITIVE_INFINITY;
144
+ let minLat = Number.POSITIVE_INFINITY;
145
+ let maxLng = Number.NEGATIVE_INFINITY;
146
+ let maxLat = Number.NEGATIVE_INFINITY;
147
+ let found = false;
148
+ const visit = (lng, lat) => {
149
+ if (!Number.isFinite(lng) || !Number.isFinite(lat))
150
+ return;
151
+ found = true;
152
+ if (lng < minLng)
153
+ minLng = lng;
154
+ if (lng > maxLng)
155
+ maxLng = lng;
156
+ if (lat < minLat)
157
+ minLat = lat;
158
+ if (lat > maxLat)
159
+ maxLat = lat;
160
+ };
161
+ for (const feature of features) {
162
+ // A kind that spreads around its anchor (a custom type, Image) uses the rectangle it really
163
+ // occupies. For a standard kind that falls back to walking the raw coordinates this only adds
164
+ // one registry lookup, and the cost per chunk build does not change.
165
+ const extent = computeAnchoredExtent(feature, extensions);
166
+ if (extent) {
167
+ visit(extent[0], extent[1]);
168
+ visit(extent[2], extent[3]);
169
+ continue;
170
+ }
171
+ if (feature.type === 'Circle') {
172
+ const radiusMeters = getCircleRadius(feature);
173
+ const center = feature.coordinates;
174
+ if (radiusMeters && radiusMeters > 0 && typeof center?.[0] === 'number') {
175
+ // The box of the geodesic circle, whose east and west extremes lie poleward of due
176
+ // east and west; it contains the polygon used for drawing (generateCirclePolygon).
177
+ const box = circleBoundingBox(center, radiusMeters);
178
+ if (box) {
179
+ visit(box[0], box[1]);
180
+ visit(box[2], box[3]);
181
+ continue;
182
+ }
183
+ }
184
+ }
185
+ walkCoordinates(feature.coordinates, visit);
186
+ }
187
+ return found ? [minLng, minLat, maxLng, maxLat] : null;
188
+ }