@sakuzu/maplibre-gl-draw 1.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) hide show
  1. package/CHANGELOG.md +1109 -2
  2. package/README.ja.md +83 -50
  3. package/README.md +89 -53
  4. package/THIRD_PARTY_NOTICES.md +29 -0
  5. package/dist/api/datasets.d.ts +263 -0
  6. package/dist/api/document.d.ts +66 -0
  7. package/dist/api/draw.d.ts +137 -0
  8. package/dist/api/draw.js +20 -0
  9. package/dist/api/drawing.d.ts +87 -0
  10. package/dist/api/errors.d.ts +35 -0
  11. package/dist/api/errors.js +35 -0
  12. package/dist/api/events.d.ts +316 -0
  13. package/dist/api/extension/context.d.ts +247 -0
  14. package/dist/api/extension/feature-type.d.ts +129 -0
  15. package/dist/api/extension/mode.d.ts +123 -0
  16. package/dist/api/extension/plugin.d.ts +51 -0
  17. package/dist/api/extension/plugin.js +3 -0
  18. package/dist/api/extension/provider.d.ts +119 -0
  19. package/dist/api/extension/provider.js +3 -0
  20. package/dist/api/extension/render.d.ts +176 -0
  21. package/dist/api/extension/render.js +3 -0
  22. package/dist/api/extension/store.d.ts +190 -0
  23. package/dist/api/extension/store.js +3 -0
  24. package/dist/api/extensions.d.ts +306 -0
  25. package/dist/api/extensions.js +3 -0
  26. package/dist/api/features.d.ts +188 -0
  27. package/dist/api/features.js +3 -0
  28. package/dist/api/groups.d.ts +111 -0
  29. package/dist/api/groups.js +3 -0
  30. package/dist/api/hidden.d.ts +45 -0
  31. package/dist/api/hidden.js +3 -0
  32. package/dist/api/impl/adapters.js +463 -0
  33. package/dist/api/impl/contexts.js +466 -0
  34. package/dist/api/impl/create-draw.js +124 -0
  35. package/dist/api/impl/datasets.js +405 -0
  36. package/dist/api/impl/destroy-guard.js +74 -0
  37. package/dist/api/impl/document.js +280 -0
  38. package/dist/api/impl/drawing.js +180 -0
  39. package/dist/api/impl/engine-context.d.ts +7 -0
  40. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  41. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  42. package/dist/api/impl/events.js +423 -0
  43. package/dist/api/impl/extension-host.js +364 -0
  44. package/dist/api/impl/extensions.js +229 -0
  45. package/dist/api/impl/features.js +445 -0
  46. package/dist/api/impl/geometry/apply.d.ts +32 -0
  47. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  48. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  49. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  50. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  51. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  52. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  53. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  54. package/dist/api/impl/geometry/types.js +3 -0
  55. package/dist/api/impl/groups.d.ts +3 -0
  56. package/dist/api/impl/groups.js +268 -0
  57. package/dist/api/impl/hidden.js +60 -0
  58. package/dist/api/impl/import-export/constants.d.ts +22 -0
  59. package/dist/api/impl/import-export/constants.js +24 -0
  60. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  61. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  62. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  63. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  64. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  66. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  68. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  69. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  70. package/dist/api/impl/import-export/image-import.js +73 -0
  71. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  72. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  73. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  74. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  75. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  76. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  77. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  78. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  79. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  80. package/dist/api/impl/import-export/style-validation.js +86 -0
  81. package/dist/api/impl/import-export/types.d.ts +52 -0
  82. package/dist/api/impl/import-export/types.js +3 -0
  83. package/dist/api/impl/input.js +180 -0
  84. package/dist/api/impl/layers.js +307 -0
  85. package/dist/api/impl/metadata.d.ts +1 -0
  86. package/dist/api/impl/metadata.js +22 -0
  87. package/dist/api/impl/options.d.ts +1 -0
  88. package/dist/api/impl/options.js +851 -0
  89. package/dist/api/impl/placement.d.ts +1 -0
  90. package/dist/api/impl/placement.js +138 -0
  91. package/dist/api/impl/render-context.d.ts +13 -0
  92. package/dist/api/impl/render-context.js +272 -0
  93. package/dist/api/impl/rows.d.ts +1 -0
  94. package/dist/api/impl/rows.js +46 -0
  95. package/dist/api/impl/selection.d.ts +1 -0
  96. package/dist/api/impl/selection.js +186 -0
  97. package/dist/api/impl/shared.d.ts +64 -0
  98. package/dist/api/impl/shared.js +178 -0
  99. package/dist/api/impl/validate-extension.d.ts +1 -0
  100. package/dist/api/impl/validate-extension.js +159 -0
  101. package/dist/api/layers.d.ts +130 -0
  102. package/dist/api/layers.js +3 -0
  103. package/dist/api/metadata.d.ts +18 -0
  104. package/dist/api/metadata.js +3 -0
  105. package/dist/api/model.d.ts +487 -0
  106. package/dist/api/model.js +47 -0
  107. package/dist/api/options.d.ts +466 -0
  108. package/dist/api/options.js +3 -0
  109. package/dist/api/selection.d.ts +94 -0
  110. package/dist/api/selection.js +3 -0
  111. package/dist/api/state.d.ts +155 -0
  112. package/dist/api/state.js +12 -0
  113. package/dist/{display → dataset}/chunk.d.ts +1 -1
  114. package/dist/{display → dataset}/chunk.js +4 -3
  115. package/dist/{display → dataset}/dataset.js +21 -21
  116. package/dist/dataset/interaction.d.ts +1 -0
  117. package/dist/{display → dataset}/interaction.js +18 -6
  118. package/dist/dataset/manager.d.ts +1 -0
  119. package/dist/dataset/provider.d.ts +1 -0
  120. package/dist/{display → dataset}/retained.d.ts +1 -1
  121. package/dist/{display → dataset}/retained.js +8 -7
  122. package/dist/dataset/source.d.ts +1 -0
  123. package/dist/{display → dataset}/source.js +17 -4
  124. package/dist/dataset/spatial.d.ts +1 -0
  125. package/dist/{display → dataset}/spatial.js +1 -1
  126. package/dist/dataset/style.d.ts +1 -0
  127. package/dist/{display → dataset}/style.js +1 -1
  128. package/dist/dataset/table-source.d.ts +1 -0
  129. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  130. package/dist/{display → dataset}/thinning.d.ts +0 -10
  131. package/dist/{display → dataset}/thinning.js +3 -2
  132. package/dist/dataset/triangulation.d.ts +1 -0
  133. package/dist/{display → dataset}/triangulation.js +0 -0
  134. package/dist/{display → dataset}/types.d.ts +84 -121
  135. package/dist/dataset/types.js +61 -0
  136. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  137. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  138. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  139. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  140. package/dist/dispatcher/hit-test/service.js +80 -16
  141. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  142. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  143. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  144. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  145. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  146. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  147. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  148. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  149. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  150. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  151. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  152. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  153. package/dist/dispatcher/input-router.js +154 -70
  154. package/dist/dispatcher/normalizer.js +25 -4
  155. package/dist/dispatcher/types.d.ts +6 -1
  156. package/dist/extension/feature-handler.d.ts +1 -182
  157. package/dist/extension/index.d.ts +4 -7
  158. package/dist/extension/renderers.d.ts +1 -208
  159. package/dist/geometry/angle.d.ts +0 -8
  160. package/dist/geometry/angle.js +0 -8
  161. package/dist/geometry/bbox.d.ts +4 -12
  162. package/dist/geometry/bbox.js +4 -12
  163. package/dist/geometry/boolean.d.ts +0 -51
  164. package/dist/geometry/boolean.js +0 -51
  165. package/dist/geometry/buffer.d.ts +0 -26
  166. package/dist/geometry/buffer.js +0 -26
  167. package/dist/geometry/circle.d.ts +0 -9
  168. package/dist/geometry/circle.js +0 -9
  169. package/dist/geometry/coords.d.ts +0 -16
  170. package/dist/geometry/coords.js +0 -16
  171. package/dist/geometry/distance.d.ts +0 -24
  172. package/dist/geometry/distance.js +0 -24
  173. package/dist/geometry/errors.d.ts +21 -36
  174. package/dist/geometry/errors.js +49 -29
  175. package/dist/geometry/geojson.d.ts +85 -0
  176. package/dist/geometry/geojson.js +173 -0
  177. package/dist/geometry/index.d.ts +38 -23
  178. package/dist/geometry/index.js +43 -31
  179. package/dist/geometry/measure.d.ts +0 -27
  180. package/dist/geometry/measure.js +0 -27
  181. package/dist/geometry/predicates.d.ts +0 -9
  182. package/dist/geometry/predicates.js +0 -9
  183. package/dist/geometry/public-bounds.d.ts +26 -0
  184. package/dist/geometry/public-bounds.js +30 -0
  185. package/dist/geometry/public-combine.d.ts +78 -0
  186. package/dist/geometry/public-combine.js +82 -0
  187. package/dist/geometry/public-create.d.ts +54 -0
  188. package/dist/geometry/public-create.js +70 -0
  189. package/dist/geometry/public-measure.d.ts +170 -0
  190. package/dist/geometry/public-measure.js +283 -0
  191. package/dist/geometry/public-predicates.d.ts +54 -0
  192. package/dist/geometry/public-predicates.js +144 -0
  193. package/dist/geometry/public-repair.d.ts +75 -0
  194. package/dist/geometry/public-repair.js +77 -0
  195. package/dist/geometry/simplify.d.ts +0 -7
  196. package/dist/geometry/simplify.js +0 -7
  197. package/dist/geometry/split.d.ts +0 -20
  198. package/dist/geometry/split.js +0 -20
  199. package/dist/geometry/units.d.ts +20 -12
  200. package/dist/geometry/units.js +20 -12
  201. package/dist/index.d.ts +66 -66
  202. package/dist/index.js +6 -18
  203. package/dist/messages.d.ts +7 -7
  204. package/dist/modes/draw/circle.js +83 -207
  205. package/dist/modes/draw/commit-layer.d.ts +5 -16
  206. package/dist/modes/draw/commit-layer.js +2 -13
  207. package/dist/modes/draw/freehand.js +108 -246
  208. package/dist/modes/draw/image.js +4 -2
  209. package/dist/modes/draw/index.d.ts +5 -5
  210. package/dist/modes/draw/index.js +5 -5
  211. package/dist/modes/draw/line.js +18 -354
  212. package/dist/modes/draw/point.js +29 -78
  213. package/dist/modes/draw/polygon.js +23 -368
  214. package/dist/modes/draw/trace-support.d.ts +43 -36
  215. package/dist/modes/draw/trace-support.js +95 -98
  216. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  217. package/dist/modes/draw/vertex-drawing.js +176 -0
  218. package/dist/modes/handler.d.ts +1 -285
  219. package/dist/modes/manager.d.ts +2 -2
  220. package/dist/modes/manager.js +3 -0
  221. package/dist/modes/select/box-selection.d.ts +3 -3
  222. package/dist/modes/select/box-selection.js +2 -1
  223. package/dist/modes/select/click-handler.d.ts +5 -5
  224. package/dist/modes/select/click-handler.js +22 -20
  225. package/dist/modes/select/cursor-handler.d.ts +2 -2
  226. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  227. package/dist/modes/select/drag/move.js +3 -3
  228. package/dist/modes/select/drag/operation.d.ts +3 -3
  229. package/dist/modes/select/drag/radius.js +5 -4
  230. package/dist/modes/select/drag/transform.d.ts +2 -2
  231. package/dist/modes/select/drag/transform.js +11 -5
  232. package/dist/modes/select/drag/vertex.d.ts +2 -2
  233. package/dist/modes/select/drag/vertex.js +13 -8
  234. package/dist/modes/select/drag-handler.js +44 -25
  235. package/dist/modes/select/mode.js +17 -17
  236. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  237. package/dist/modes/select/shortcut-handler.js +9 -7
  238. package/dist/operations/layer-operations.js +29 -168
  239. package/dist/operations/resize.d.ts +2 -2
  240. package/dist/operations/resize.js +5 -5
  241. package/dist/operations/rotate.js +5 -5
  242. package/dist/operations/selection-operations.d.ts +16 -1
  243. package/dist/operations/selection-operations.js +28 -13
  244. package/dist/operations/shared-vertex.js +4 -2
  245. package/dist/operations/trace-graph.d.ts +0 -18
  246. package/dist/operations/trace-graph.js +0 -18
  247. package/dist/operations/vertex.js +36 -35
  248. package/dist/shared/color.d.ts +1 -0
  249. package/dist/shared/color.js +245 -0
  250. package/dist/shared/config/constants.d.ts +1 -54
  251. package/dist/shared/config/constants.js +1 -58
  252. package/dist/shared/config/feature-style.d.ts +16 -13
  253. package/dist/shared/config/feature-style.js +9 -0
  254. package/dist/shared/config/rendering.d.ts +3 -3
  255. package/dist/shared/config/selection-highlight.d.ts +0 -15
  256. package/dist/shared/config/selection-highlight.js +4 -7
  257. package/dist/shared/config/selection.d.ts +2 -32
  258. package/dist/shared/config/selection.js +0 -18
  259. package/dist/shared/config/topology.d.ts +2 -2
  260. package/dist/shared/config/trace.d.ts +4 -4
  261. package/dist/shared/math/angle.d.ts +1 -1
  262. package/dist/shared/math/angle.js +1 -1
  263. package/dist/shared/math/circle.d.ts +1 -1
  264. package/dist/shared/math/circle.js +1 -1
  265. package/dist/shared/math/distance.d.ts +2 -1
  266. package/dist/shared/math/distance.js +3 -2
  267. package/dist/shared/math/index.d.ts +1 -1
  268. package/dist/shared/math/index.js +1 -1
  269. package/dist/shared/math/transform.d.ts +23 -0
  270. package/dist/shared/math/transform.js +47 -28
  271. package/dist/shared/properties.d.ts +18 -0
  272. package/dist/shared/properties.js +129 -0
  273. package/dist/shared/types/events.d.ts +15 -7
  274. package/dist/shared/types/model.d.ts +109 -159
  275. package/dist/shared/types/style.d.ts +1 -1
  276. package/dist/shared/utils/color.d.ts +2 -36
  277. package/dist/shared/utils/color.js +13 -70
  278. package/dist/shared/utils/coordinates.d.ts +30 -4
  279. package/dist/shared/utils/coordinates.js +56 -10
  280. package/dist/shared/utils/event-emitter.d.ts +1 -262
  281. package/dist/shared/utils/event-emitter.js +4 -3
  282. package/dist/shared/utils/feature-bbox.js +8 -7
  283. package/dist/shared/utils/feature-segments.js +5 -4
  284. package/dist/shared/utils/image.d.ts +0 -4
  285. package/dist/shared/utils/image.js +0 -6
  286. package/dist/shared/utils/name-generator.d.ts +14 -20
  287. package/dist/shared/utils/name-generator.js +20 -3
  288. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  289. package/dist/shared/utils/pixel-ratio.js +13 -4
  290. package/dist/shared/utils/property.d.ts +7 -50
  291. package/dist/shared/utils/property.js +22 -87
  292. package/dist/snapping/custom-targets.js +21 -4
  293. package/dist/snapping/indicator.js +20 -11
  294. package/dist/snapping/providers/display.d.ts +6 -1
  295. package/dist/snapping/providers/display.js +2 -1
  296. package/dist/snapping/providers/guide.d.ts +3 -43
  297. package/dist/snapping/providers/guide.js +1 -44
  298. package/dist/snapping/providers/intersection.js +1 -1
  299. package/dist/snapping/providers/store.js +3 -3
  300. package/dist/snapping/service.js +18 -7
  301. package/dist/snapping/types.d.ts +9 -35
  302. package/dist/store/draw-store.js +233 -142
  303. package/dist/store/local-visibility.d.ts +11 -6
  304. package/dist/store/local-visibility.js +38 -7
  305. package/dist/store/lock.d.ts +0 -6
  306. package/dist/store/lock.js +0 -6
  307. package/dist/store/memory/change-bus.d.ts +3 -3
  308. package/dist/store/memory/change-bus.js +12 -0
  309. package/dist/store/memory/file-store.d.ts +2 -2
  310. package/dist/store/memory/ui-state.d.ts +1 -51
  311. package/dist/store/memory/ui-state.js +122 -134
  312. package/dist/store/memory.d.ts +1 -8
  313. package/dist/store/memory.js +249 -45
  314. package/dist/store/ordering.d.ts +9 -0
  315. package/dist/store/ordering.js +17 -0
  316. package/dist/store/spatial/spatial-index.d.ts +1 -1
  317. package/dist/store/spatial/spatial-index.js +1 -1
  318. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  319. package/dist/store/spatial/store-spatial-index.js +9 -3
  320. package/dist/store/store.d.ts +66 -107
  321. package/dist/store/types.d.ts +1 -1
  322. package/dist/store/writable-layer.d.ts +1 -1
  323. package/dist/store/writable-layer.js +2 -2
  324. package/dist/table/builder.d.ts +83 -0
  325. package/dist/table/builder.js +381 -0
  326. package/dist/table/index.d.ts +37 -0
  327. package/dist/table/index.js +5 -0
  328. package/dist/table/packed-rtree.d.ts +1 -0
  329. package/dist/{display → table}/packed-rtree.js +1 -1
  330. package/dist/table/partition.d.ts +1 -0
  331. package/dist/{display → table}/partition.js +3 -3
  332. package/dist/table/prepare.d.ts +44 -0
  333. package/dist/table/prepare.js +136 -0
  334. package/dist/table/table.d.ts +1 -0
  335. package/dist/{display/columnar → table}/table.js +29 -25
  336. package/dist/{display/columnar → table}/types.d.ts +68 -72
  337. package/dist/table/types.js +3 -0
  338. package/dist/view/coordinator.js +4 -3
  339. package/dist/view/feature-companion.d.ts +13 -7
  340. package/dist/view/feature-companion.js +11 -3
  341. package/dist/view/globe-subdivision.js +3 -3
  342. package/dist/view/layer/attach.d.ts +12 -6
  343. package/dist/view/layer/attach.js +86 -10
  344. package/dist/view/layer/custom-layer.js +40 -11
  345. package/dist/view/layer/display-list.js +2 -1
  346. package/dist/view/layer/drape-planner.d.ts +2 -2
  347. package/dist/view/layer/frame-render.d.ts +3 -3
  348. package/dist/view/layer/frame-render.js +7 -2
  349. package/dist/view/layer/frame-state.d.ts +6 -6
  350. package/dist/view/layer/index.d.ts +2 -2
  351. package/dist/view/layer/index.js +1 -1
  352. package/dist/view/layer/render.d.ts +4 -4
  353. package/dist/view/layer/render.js +3 -8
  354. package/dist/view/layer/renderers.d.ts +2 -2
  355. package/dist/view/layer/renderers.js +1 -1
  356. package/dist/view/layer/slot-manager.d.ts +2 -2
  357. package/dist/view/layer/slot-manager.js +4 -4
  358. package/dist/view/layer/slots.d.ts +2 -2
  359. package/dist/view/layer/slots.js +1 -1
  360. package/dist/view/layer/store-retained-bbox.js +3 -2
  361. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  362. package/dist/view/layer/store-retained-classify.js +19 -7
  363. package/dist/view/layer/store-retained-collect.js +8 -7
  364. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  365. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  366. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  367. package/dist/view/layer/store-retained-immediate.js +3 -8
  368. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  369. package/dist/view/layer/store-retained.d.ts +2 -2
  370. package/dist/view/layer/store-retained.js +1 -1
  371. package/dist/view/renderers/batch-manager.js +8 -7
  372. package/dist/view/renderers/drawer.js +21 -15
  373. package/dist/view/renderers/image.js +13 -39
  374. package/dist/view/renderers/line/line-types.d.ts +3 -3
  375. package/dist/view/renderers/line/sdf-line.js +3 -1
  376. package/dist/view/renderers/point/billboard-depth.js +1 -1
  377. package/dist/view/renderers/point/point-instance.js +1 -1
  378. package/dist/view/renderers/point/point-shape.js +2 -2
  379. package/dist/view/renderers/point/point-style.js +48 -4
  380. package/dist/view/renderers/polygon/batch.js +1 -2
  381. package/dist/view/renderers/polygon/fill.js +3 -1
  382. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  383. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  384. package/dist/view/renderers/stroke.js +3 -1
  385. package/dist/view/shaders/helpers.d.ts +2 -42
  386. package/dist/view/shaders/helpers.js +0 -6
  387. package/dist/view/shaders/projection.d.ts +15 -7
  388. package/dist/view/shaders/projection.js +23 -6
  389. package/dist/view/shaders/quad.d.ts +16 -12
  390. package/dist/view/shaders/quad.js +34 -13
  391. package/dist/view/style-rule.d.ts +5 -42
  392. package/dist/view/style-rule.js +20 -44
  393. package/dist/view/terrain/binding.d.ts +1 -0
  394. package/dist/view/terrain/binding.js +29 -0
  395. package/dist/view/terrain/context.d.ts +3 -4
  396. package/dist/view/terrain/context.js +4 -5
  397. package/dist/view/terrain/drape/geometry.js +1 -1
  398. package/dist/view/terrain/drape/pass.d.ts +1 -1
  399. package/dist/view/terrain/drape/pass.js +8 -7
  400. package/dist/view/terrain/polygon.d.ts +9 -5
  401. package/dist/view/terrain/polygon.js +16 -2
  402. package/dist/view/terrain/state.d.ts +1 -1
  403. package/dist/view/terrain/state.js +1 -1
  404. package/dist/view/terrain/tessellation.d.ts +2 -2
  405. package/dist/view/terrain/tessellation.js +1 -1
  406. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  407. package/dist/view/ui/bounds.js +8 -12
  408. package/dist/view/ui/handle-test.js +2 -2
  409. package/dist/view/ui/handle-thinning.js +17 -17
  410. package/dist/view/ui/handles.js +21 -13
  411. package/dist/view/ui/helper.d.ts +1 -1
  412. package/dist/view/ui/helper.js +1 -1
  413. package/dist/view/ui/index.d.ts +1 -1
  414. package/dist/view/ui/selection-scope.js +4 -2
  415. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  416. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  417. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  418. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  419. package/dist/view/ui/selection-ui/index.js +1 -1
  420. package/dist/view/ui/selection-ui/renderer.js +15 -38
  421. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  422. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  423. package/dist/view/ui/selection-ui-drawer.js +63 -2
  424. package/dist/view/ui/tentative.js +1 -1
  425. package/dist/webgl/index.d.ts +65 -0
  426. package/dist/webgl/index.js +62 -0
  427. package/package.json +38 -15
  428. package/dist/api/api.d.ts +0 -1259
  429. package/dist/api/api.js +0 -86
  430. package/dist/api/context.d.ts +0 -173
  431. package/dist/api/display-api.js +0 -23
  432. package/dist/api/event-api.d.ts +0 -13
  433. package/dist/api/event-api.js +0 -17
  434. package/dist/api/extension-api.d.ts +0 -46
  435. package/dist/api/extension-api.js +0 -85
  436. package/dist/api/feature-api.d.ts +0 -11
  437. package/dist/api/feature-api.js +0 -101
  438. package/dist/api/geometry/apply.d.ts +0 -51
  439. package/dist/api/geometry/boolean.d.ts +0 -28
  440. package/dist/api/geometry/boolean.js +0 -65
  441. package/dist/api/geometry/types.d.ts +0 -31
  442. package/dist/api/geometry-operations.d.ts +0 -162
  443. package/dist/api/geometry-operations.js +0 -94
  444. package/dist/api/group-api.d.ts +0 -10
  445. package/dist/api/group-api.js +0 -78
  446. package/dist/api/import-export/constants.d.ts +0 -29
  447. package/dist/api/import-export/constants.js +0 -40
  448. package/dist/api/import-export/file-name.d.ts +0 -10
  449. package/dist/api/import-export/file-name.js +0 -20
  450. package/dist/api/import-export/geojson-export.d.ts +0 -19
  451. package/dist/api/import-export/image-import.d.ts +0 -12
  452. package/dist/api/import-export/image-import.js +0 -53
  453. package/dist/api/import-export/index.d.ts +0 -9
  454. package/dist/api/import-export/index.js +0 -107
  455. package/dist/api/import-export/native-format.d.ts +0 -15
  456. package/dist/api/import-export/style-validation.d.ts +0 -27
  457. package/dist/api/import-export/style-validation.js +0 -49
  458. package/dist/api/import-export/types.d.ts +0 -26
  459. package/dist/api/index.d.ts +0 -15
  460. package/dist/api/index.js +0 -3
  461. package/dist/api/input-api.d.ts +0 -158
  462. package/dist/api/input-api.js +0 -144
  463. package/dist/api/instance-api.d.ts +0 -38
  464. package/dist/api/instance-api.js +0 -136
  465. package/dist/api/layer-api.d.ts +0 -12
  466. package/dist/api/layer-api.js +0 -62
  467. package/dist/api/selection-api.d.ts +0 -7
  468. package/dist/api/selection-api.js +0 -78
  469. package/dist/api/snapping-api.d.ts +0 -125
  470. package/dist/api/snapping-api.js +0 -50
  471. package/dist/api/topology-api.d.ts +0 -30
  472. package/dist/api/topology-api.js +0 -16
  473. package/dist/api/tracing-api.d.ts +0 -31
  474. package/dist/api/tracing-api.js +0 -16
  475. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  476. package/dist/dispatcher/hit-test/index.js +0 -9
  477. package/dist/dispatcher/index.d.ts +0 -15
  478. package/dist/dispatcher/index.js +0 -3
  479. package/dist/display/columnar/index.d.ts +0 -12
  480. package/dist/display/columnar/index.js +0 -13
  481. package/dist/display/columnar/prepare.d.ts +0 -42
  482. package/dist/display/columnar/prepare.js +0 -116
  483. package/dist/display/index.d.ts +0 -13
  484. package/dist/display/types.js +0 -43
  485. package/dist/maplibre-gl-draw.d.ts +0 -47
  486. package/dist/modes/cursor.js +0 -72
  487. package/dist/modes/index.d.ts +0 -7
  488. package/dist/operations/index.d.ts +0 -9
  489. package/dist/operations/index.js +0 -3
  490. package/dist/plugins/index.d.ts +0 -10
  491. package/dist/plugins/mutation-hooks.d.ts +0 -28
  492. package/dist/plugins/mutation-hooks.js +0 -84
  493. package/dist/plugins/plugin-context.js +0 -367
  494. package/dist/plugins/plugin-manager.d.ts +0 -103
  495. package/dist/plugins/plugin-manager.js +0 -316
  496. package/dist/plugins/plugin.d.ts +0 -529
  497. package/dist/shared/config/index.d.ts +0 -17
  498. package/dist/shared/config/index.js +0 -8
  499. package/dist/shared/utils/index.d.ts +0 -15
  500. package/dist/shared/utils/index.js +0 -24
  501. package/dist/snapping/index.d.ts +0 -14
  502. package/dist/snapping/index.js +0 -4
  503. package/dist/store/change-merger.js +0 -102
  504. package/dist/store/event-bridge.js +0 -161
  505. package/dist/store/index.d.ts +0 -12
  506. package/dist/store/index.js +0 -4
  507. package/dist/view/index.d.ts +0 -47
  508. package/dist/view/index.js +0 -20
  509. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  510. /package/dist/api/{import-export/types.js → document.js} +0 -0
  511. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  512. /package/dist/{display/index.js → api/events.js} +0 -0
  513. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  514. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  515. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  516. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  517. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  518. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  519. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  520. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  521. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  522. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  523. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  524. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  525. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  526. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  527. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  528. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  529. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  532. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  533. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  534. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  535. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  536. /package/dist/{display → dataset}/chunk-set.js +0 -0
  537. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  538. /package/dist/{display → dataset}/manager.js +0 -0
  539. /package/dist/{display → dataset}/provider.js +0 -0
  540. /package/dist/{display → dataset}/selection.d.ts +0 -0
  541. /package/dist/{display → dataset}/selection.js +0 -0
@@ -0,0 +1,123 @@
1
+ /**
2
+ * The input contract: the events a mode and a plugin receive, and the handler of a mode
3
+ *
4
+ * One rule holds for every input handler: returning true consumes the event, so that nothing
5
+ * after the handler receives it.
6
+ */
7
+ import type { Position } from 'geojson';
8
+ import type { ScreenPoint } from '../events.js';
9
+ import type { SnapPreference, SnapResult } from '../state.js';
10
+ import type { ModeContext } from './context.js';
11
+ /** The modifier keys held during an input. */
12
+ export interface Modifiers {
13
+ /** Whether Shift was held */
14
+ shift: boolean;
15
+ /** Whether Control was held */
16
+ ctrl: boolean;
17
+ /** Whether Alt (Option on macOS) was held */
18
+ alt: boolean;
19
+ /** Whether Meta (Command on macOS) was held */
20
+ meta: boolean;
21
+ }
22
+ /** A pointer input on the map, as a mode and a plugin receive it. */
23
+ export interface DrawPointerEvent {
24
+ /** The point on the screen */
25
+ point: ScreenPoint;
26
+ /** The position on the map */
27
+ lngLat: Position;
28
+ /** Where the input snaps to; the position of the pointer when nothing is snapped to */
29
+ snapped: SnapResult;
30
+ /** The modifier keys held */
31
+ modifiers: Modifiers;
32
+ /** The kind of pointer */
33
+ pointerType: 'mouse' | 'touch' | 'pen';
34
+ /** The event of the browser */
35
+ original: PointerEvent;
36
+ /**
37
+ * True when the input was made from code by `draw.drawing` (`addVertex`, `moveTo`), not by
38
+ * the pointer. Its position is exact: a mode applies no click tolerance to it, so a vertex
39
+ * placed a few pixels from another is kept, and only one at exactly the same position is
40
+ * the same vertex. Left out for the input of the pointer.
41
+ */
42
+ programmatic?: boolean;
43
+ }
44
+ /** A key input, as a mode and a plugin receive it. */
45
+ export interface DrawKeyEvent {
46
+ /** The key, as `KeyboardEvent.key` gives it */
47
+ key: string;
48
+ /** The modifier keys held */
49
+ modifiers: Modifiers;
50
+ /** The event of the browser */
51
+ original: KeyboardEvent;
52
+ }
53
+ /**
54
+ * The receivers of the input; `Plugin.input` and `ModeHandler` take any of them. Returning
55
+ * true consumes the event, so that nothing after the receiver gets it.
56
+ */
57
+ export interface InputHandlers {
58
+ /** A pointer was pressed */
59
+ onPointerDown(event: DrawPointerEvent): boolean | void;
60
+ /** The pointer moved without a drag */
61
+ onPointerMove(event: DrawPointerEvent): boolean | void;
62
+ /** A pointer was released */
63
+ onPointerUp(event: DrawPointerEvent): boolean | void;
64
+ /** The pointer left the map */
65
+ onPointerLeave(): boolean | void;
66
+ /** A click */
67
+ onClick(event: DrawPointerEvent): boolean | void;
68
+ /** A double click */
69
+ onDoubleClick(event: DrawPointerEvent): boolean | void;
70
+ /** A drag started */
71
+ onDragStart(event: DrawPointerEvent): boolean | void;
72
+ /** The pointer moved during a drag */
73
+ onDrag(event: DrawPointerEvent): boolean | void;
74
+ /** A drag ended */
75
+ onDragEnd(event: DrawPointerEvent): boolean | void;
76
+ /** A drag was cancelled */
77
+ onDragCancel(event: DrawPointerEvent): boolean | void;
78
+ /** A key was pressed */
79
+ onKeyDown(event: DrawKeyEvent): boolean | void;
80
+ /** A key was released */
81
+ onKeyUp(event: DrawKeyEvent): boolean | void;
82
+ }
83
+ /**
84
+ * The contract of a mode: how it enters, exits and receives the input. Every member is
85
+ * optional; returning true from an input receiver consumes the event.
86
+ */
87
+ export interface ModeHandler extends Partial<InputHandlers> {
88
+ /**
89
+ * Whether the mode writes new features. Such a mode is entered only while a layer can be
90
+ * written, and a double click never zooms the map while it is the current mode, whether or
91
+ * not it takes the double click; false when it is left out.
92
+ */
93
+ readonly writes?: boolean;
94
+ /** How the mode wants the positions of its input snapped; every input snaps when left out */
95
+ readonly snapPreference?: SnapPreference;
96
+ /** Called when the mode is entered */
97
+ onEnter?(): void;
98
+ /** Called when the mode is left */
99
+ onExit?(): void;
100
+ /**
101
+ * Called when the mode is interrupted: by an Escape that neither a plugin nor the mode
102
+ * consumed, or when the Store replaces its whole document (a notification with
103
+ * `reset: true`). The mode drops what it was drawing and stays the current mode.
104
+ */
105
+ onCancel?(): void;
106
+ /**
107
+ * Removes the last vertex of the shape being drawn, as `ctx.drawing.undoVertex` asks.
108
+ *
109
+ * @returns True when a vertex was removed
110
+ */
111
+ onUndoVertex?(): boolean;
112
+ /**
113
+ * Puts back the vertex the last `onUndoVertex` removed, as `ctx.drawing.redoVertex` asks.
114
+ *
115
+ * @returns True when a vertex was put back
116
+ */
117
+ onRedoVertex?(): boolean;
118
+ }
119
+ /**
120
+ * The function that creates the handler of a mode. It is registered once, under its name,
121
+ * with `draw.extensions.modes.add(name, factory)`.
122
+ */
123
+ export type ModeFactory = (ctx: ModeContext) => ModeHandler;
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Plugins: bundles of other extensions and state
3
+ */
4
+ import type { Feature } from '../model.js';
5
+ import type { PluginContext } from './context.js';
6
+ import type { DrawPointerEvent, InputHandlers } from './mode.js';
7
+ /**
8
+ * A plugin: a bundle of modes, feature types, overlays, providers and state, added with
9
+ * `draw.extensions.plugins.add`. What it adds through its context is removed by itself when
10
+ * the plugin is removed. Plugins talk to each other through their `api`.
11
+ *
12
+ * @typeParam Api - The API the plugin offers to others
13
+ */
14
+ export interface Plugin<Api = unknown> {
15
+ /** The name it is registered under */
16
+ readonly name: string;
17
+ /** Called when the plugin is added; add its extensions and subscribe to events here. */
18
+ onAdd(ctx: PluginContext): void;
19
+ /** Called when the plugin is removed. */
20
+ onRemove?(): void;
21
+ /** The API others get with `draw.extensions.plugins.getApi(name)` */
22
+ readonly api?: Api;
23
+ /**
24
+ * Receivers of the input, called before those of the mode. Returning true consumes the
25
+ * event, so that the mode does not get it.
26
+ */
27
+ readonly input?: Partial<InputHandlers>;
28
+ /** The hooks of the select mode, and an exclusive interaction of the plugin */
29
+ readonly interaction?: {
30
+ /** Narrows the candidates of a selection to the IDs it returns */
31
+ filterSelection?(candidateIds: readonly string[]): string[];
32
+ /** A selected feature was clicked again; returning true means the plugin handled it */
33
+ onFeatureClick?(feature: Feature, event: DrawPointerEvent): boolean;
34
+ /** A feature was double-clicked; returning true means the plugin handled it */
35
+ onFeatureDoubleClick?(feature: Feature, event: DrawPointerEvent): boolean;
36
+ /**
37
+ * A drawing mode created a feature: a commit of `ModeContext.commitFeature`, which the
38
+ * built-in drawing modes use too, or the image placed by the load that follows a request
39
+ * of the image mode
40
+ */
41
+ onDrawCommit?(feature: Feature): void;
42
+ /** Whether the plugin is in an exclusive interaction, during which the mode stays still */
43
+ isBusy?(): boolean;
44
+ /** Completes the exclusive interaction */
45
+ finish?(): void;
46
+ /** Cancels the exclusive interaction */
47
+ cancel?(): void;
48
+ /** The element of the exclusive interaction; clicks inside it are left to the plugin */
49
+ container?(): HTMLElement | null;
50
+ };
51
+ }
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Providers: extensions that add snapping candidates, handles or companions to feature types
3
+ * they do not define
4
+ *
5
+ * A custom feature type describes its own handles and candidates in its definition; a
6
+ * provider is for the built-in types and the types of other extensions.
7
+ */
8
+ import type { Position } from 'geojson';
9
+ import type { Feature, FeaturePatch } from '../model.js';
10
+ import type { HitTestContext, ScreenContext, SnapContext } from './context.js';
11
+ import type { Handle } from './feature-type.js';
12
+ import type { DrawPointerEvent } from './mode.js';
13
+ import type { RenderContext } from './render.js';
14
+ /** What a hit test found. */
15
+ export interface Hit {
16
+ /** What was hit */
17
+ kind: 'feature' | 'dataset' | 'companion' | 'handle';
18
+ /** The ID of what was hit */
19
+ id: string;
20
+ /** The ID of the feature it belongs to */
21
+ featureId?: string;
22
+ /** The ID of the dataset, for a row of a dataset */
23
+ datasetId?: string;
24
+ /** The distance from the point, in pixels */
25
+ distancePx: number;
26
+ }
27
+ /** One snapping candidate. */
28
+ export interface SnapCandidate {
29
+ /** The position to snap to */
30
+ position: Position;
31
+ /** The kind of candidate; a provider may use a kind of its own */
32
+ kind: 'vertex' | 'edge' | 'intersection' | 'guide' | (string & {});
33
+ /** The priority among candidates at the same distance; higher wins */
34
+ priority?: number;
35
+ /** Where the candidate came from, for display */
36
+ source?: string;
37
+ }
38
+ /** An extension that adds snapping candidates. */
39
+ export interface SnapProvider {
40
+ /** The name it is registered under */
41
+ readonly name: string;
42
+ /** The candidates near the point of the context. */
43
+ candidates(ctx: SnapContext): SnapCandidate[];
44
+ }
45
+ /** An extension that shows handles of its own on the selected features and receives their drags. */
46
+ export interface HandleProvider {
47
+ /** The name it is registered under */
48
+ readonly name: string;
49
+ /**
50
+ * The handles of a selected feature. The engine draws them with the look of the vertex
51
+ * handles, hit tests them at the same size, and gives their drags to `onDrag`.
52
+ */
53
+ handles(feature: Feature, ctx: ScreenContext): Handle[];
54
+ /**
55
+ * The handles that belong to no feature, shown whatever is selected; they are hit and
56
+ * dragged like the others, and their drag arrives with `feature` as `null`.
57
+ */
58
+ globalHandles?(ctx: ScreenContext): Handle[];
59
+ /**
60
+ * The change a drag of one of its handles makes. It is called for every move of the drag
61
+ * and once more when the drag ends; the patch of the end is the one that stays.
62
+ *
63
+ * @param feature - The feature the handle is on; `null` for a handle of `globalHandles`
64
+ * @returns The patch to apply to the feature, or `null` for no change
65
+ */
66
+ onDrag(feature: Feature | null, handle: Handle, event: DrawPointerEvent): FeaturePatch | null;
67
+ /**
68
+ * A drag of one of its handles is about to start, before the first `onDrag`.
69
+ *
70
+ * @param feature - The feature the handle is on; `null` for a handle of `globalHandles`
71
+ * @returns False to refuse the drag: the pointer then does what it would do without the
72
+ * handle, and no `onDrag` nor `onDragEnd` follows
73
+ */
74
+ onDragStart?(feature: Feature | null, handle: Handle, event: DrawPointerEvent): boolean;
75
+ /**
76
+ * A drag of one of its handles ended, after the last `onDrag` and its patch. It is called
77
+ * once for every drag that started, also when the drag is cut short.
78
+ *
79
+ * @param feature - The feature the handle is on as it is now; `null` for a handle of
80
+ * `globalHandles`, or when the feature is gone
81
+ */
82
+ onDragEnd?(feature: Feature | null, handle: Handle, event: DrawPointerEvent): void;
83
+ }
84
+ /**
85
+ * An extension that draws a companion one step below a feature, such as a leader line, and
86
+ * hit tests it at the same step.
87
+ */
88
+ export interface CompanionProvider {
89
+ /** The name it is registered under */
90
+ readonly name: string;
91
+ /**
92
+ * Whether a feature has a companion. It is asked for every feature on every frame and
93
+ * every hit test, so it must answer at once.
94
+ */
95
+ has(feature: Feature): boolean;
96
+ /** Draws the companion of a feature. */
97
+ draw(feature: Feature, ctx: RenderContext): void;
98
+ /**
99
+ * Hit tests the companion of a feature.
100
+ *
101
+ * It is asked at the step of the feature in the stacking order: when the point missed the
102
+ * feature itself, and before the feature behind it. At one point, the handles of the
103
+ * selection come first; then, from the front, each feature and then its companions, so a
104
+ * feature (its marker, its line or its area, with the click tolerance) wins over its own
105
+ * companion and a companion wins over the features behind its feature; the rows of a
106
+ * dataset come only after the features and the companions in front of them.
107
+ *
108
+ * @returns What was hit, or `null`
109
+ */
110
+ hitTest(feature: Feature, ctx: HitTestContext): Hit | null;
111
+ /**
112
+ * A companion was clicked.
113
+ *
114
+ * @param hit - What `hitTest` returned
115
+ * @returns True to consume the click, which then changes nothing else; false, or nothing,
116
+ * to leave it to the select mode as a click on the feature
117
+ */
118
+ onClick?(feature: Feature, hit: Hit, event: DrawPointerEvent): boolean;
119
+ }
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Drawing: the renderers of custom feature types and overlays, the values they draw with,
3
+ * and the shared renderers they can draw through
4
+ */
5
+ import type { Position } from 'geojson';
6
+ import type { Map as MaplibreMap, ProjectionData } from 'maplibre-gl';
7
+ import type { Feature, LineStyle, PointShape } from '../model.js';
8
+ import type { TerrainAnchors } from './context.js';
9
+ /**
10
+ * The shader prelude the map passes to a custom layer, for compiling programs for the current
11
+ * projection.
12
+ */
13
+ export interface ShaderData {
14
+ /** The GLSL the map prepends to a vertex shader (its projection functions) */
15
+ vertexShaderPrelude: string;
16
+ /** The `#define` lines of the current projection */
17
+ define: string;
18
+ /** The name of the projection variant; a program is compiled again when it changes */
19
+ variantName: string;
20
+ }
21
+ /**
22
+ * The values for drawing positions relative to the center of the view, which keeps the
23
+ * precision of 32-bit floats near the camera.
24
+ */
25
+ export interface OffsetUniforms {
26
+ /** The center, rounded to 32-bit floats for the shader */
27
+ centerLngLat: [number, number];
28
+ /** The center at 64-bit precision, for the offsets computed on the CPU */
29
+ centerLngLat64: [number, number];
30
+ /** The Mercator coordinates of the center, at 64-bit precision */
31
+ centerMercator: [number, number];
32
+ /** The center of the view in clip space, at 64-bit precision */
33
+ projectionCenter: [number, number, number, number];
34
+ /** The Mercator units per degree of longitude and latitude at the center */
35
+ unitsPerDegree: [number, number, number];
36
+ /** The second-order correction of `unitsPerDegree` for the change with latitude */
37
+ unitsPerDegree2: [number, number, number];
38
+ }
39
+ /**
40
+ * The shared renderer of lines. It only draws; the zoom, the projection and the terrain come
41
+ * from the {@link RenderContext} it was taken from.
42
+ */
43
+ export interface LineRenderer {
44
+ /**
45
+ * Draws a line.
46
+ *
47
+ * @param coordinates - The positions of the line
48
+ * @param style - The width in pixels, the CSS color, the opacity from 0 to 1, the dash
49
+ * pattern, and a custom `[dash, gap]` in pixels
50
+ * @param options - `closed` joins the last position to the first; `widthUnit` says whether
51
+ * the width is in pixels or meters; `createdZoom` is the zoom at which the width applies,
52
+ * so that the line grows and shrinks with the zoom
53
+ */
54
+ draw(coordinates: readonly Position[], style: {
55
+ width: number;
56
+ color: string;
57
+ opacity: number;
58
+ lineStyle: LineStyle;
59
+ dashArray?: number[];
60
+ }, options?: {
61
+ closed?: boolean;
62
+ widthUnit?: 'pixels' | 'meters';
63
+ createdZoom?: number;
64
+ }): void;
65
+ }
66
+ /**
67
+ * The shared renderer of areas. It only draws; the zoom, the projection and the terrain come
68
+ * from the {@link RenderContext} it was taken from.
69
+ */
70
+ export interface FillRenderer {
71
+ /**
72
+ * Fills an area.
73
+ *
74
+ * @param rings - The outer ring first, then the holes
75
+ * @param style - The CSS color and the opacity from 0 to 1
76
+ */
77
+ draw(rings: readonly (readonly Position[])[], style: {
78
+ color: string;
79
+ opacity: number;
80
+ }): void;
81
+ }
82
+ /**
83
+ * The shared renderer of point markers. It only draws; the zoom, the projection and the
84
+ * terrain come from the {@link RenderContext} it was taken from.
85
+ */
86
+ export interface PointRenderer {
87
+ /**
88
+ * Draws a point marker.
89
+ *
90
+ * @param position - The position
91
+ * @param style - The shape, the size in pixels, the fill and the outline (CSS colors,
92
+ * opacities from 0 to 1, the outline width in pixels)
93
+ * @param options - `elevationMeters` places the marker at this height instead of on the
94
+ * ground
95
+ */
96
+ draw(position: Position, style: {
97
+ shape: PointShape;
98
+ size: number;
99
+ fillColor: string;
100
+ fillOpacity: number;
101
+ strokeColor: string;
102
+ strokeWidth: number;
103
+ strokeOpacity: number;
104
+ }, options?: {
105
+ elevationMeters?: number;
106
+ }): void;
107
+ }
108
+ /**
109
+ * Everything a renderer needs to draw a frame. The offsets are already computed.
110
+ */
111
+ export interface RenderContext {
112
+ /** The WebGL context of the map */
113
+ readonly gl: WebGL2RenderingContext;
114
+ /** The shader prelude of the current projection */
115
+ readonly shader: ShaderData;
116
+ /** The values for drawing relative to the center of the view */
117
+ readonly offset: OffsetUniforms;
118
+ /** The projection of the frame, as the map passes it to a custom layer */
119
+ readonly projection: ProjectionData;
120
+ /** The zoom of the frame */
121
+ readonly zoom: number;
122
+ /** The pixel ratio of the drawing */
123
+ readonly pixelRatio: number;
124
+ /** The opacity of the layer being drawn, from 0 to 1 */
125
+ readonly opacity: number;
126
+ /**
127
+ * The positions and the heights on the terrain. The building blocks of the `/webgl` entry
128
+ * that draw on the terrain take it, or the whole render context.
129
+ */
130
+ readonly terrain: TerrainAnchors;
131
+ /** The shared renderer of lines */
132
+ readonly line: LineRenderer;
133
+ /** The shared renderer of areas */
134
+ readonly fill: FillRenderer;
135
+ /** The shared renderer of point markers */
136
+ readonly point: PointRenderer;
137
+ }
138
+ /**
139
+ * How the features of a custom type are drawn. The methods take their arguments in the order
140
+ * of a custom layer of the map.
141
+ */
142
+ export interface FeatureRenderer {
143
+ /** Called when the renderer is added to the map; create the programs and buffers here. */
144
+ onAdd(map: MaplibreMap, gl: WebGL2RenderingContext): void;
145
+ /** Draws one feature. */
146
+ draw(feature: Feature, ctx: RenderContext): void;
147
+ /** Called when the renderer is removed; release what `onAdd` created. */
148
+ onRemove(map: MaplibreMap, gl: WebGL2RenderingContext): void;
149
+ }
150
+ /**
151
+ * A renderer that draws above the features, or between the layers.
152
+ */
153
+ export interface OverlayRenderer {
154
+ /** The name it is registered under */
155
+ readonly name: string;
156
+ /**
157
+ * The order among the overlays: a lower one is drawn first, below a higher one. Overlays of
158
+ * the same order are drawn in the order they were added; 0 when it is left out.
159
+ */
160
+ readonly order?: number;
161
+ /** Called when the renderer is added to the map; create the programs and buffers here. */
162
+ onAdd(map: MaplibreMap, gl: WebGL2RenderingContext): void;
163
+ /** Draws above every layer. */
164
+ draw(ctx: RenderContext): void;
165
+ /** Draws just above one layer, for an overlay drawn between the layers. */
166
+ drawForLayer?(layerId: string, ctx: RenderContext): void;
167
+ /**
168
+ * Draws the vertices of what the overlay shows, above the features of every layer and the
169
+ * selection, so that they stay visible over a layer further back.
170
+ */
171
+ drawVertices?(ctx: RenderContext): void;
172
+ /** Whether some of its drawing has not finished yet. */
173
+ hasPendingWork?(): boolean;
174
+ /** Called when the renderer is removed; release what `onAdd` created. */
175
+ onRemove(map: MaplibreMap, gl: WebGL2RenderingContext): void;
176
+ }
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};
@@ -0,0 +1,190 @@
1
+ /**
2
+ * The Store: where the document and the state of this client are kept
3
+ *
4
+ * The built-in Store keeps them in memory. An application replaces it through the `store`
5
+ * option of `createDraw`, for example to keep the document somewhere shared.
6
+ */
7
+ import type { DocumentChange } from '../events.js';
8
+ import type { Feature, FileData, Group, Layer, Metadata } from '../model.js';
9
+ import type { Mode, Selection, SelectionType, VertexSelection } from '../state.js';
10
+ /**
11
+ * Where a write came from, as it arrives in {@link DocumentChange.source} and in the `source` of
12
+ * the events.
13
+ *
14
+ * - `local`: an operation of the user or a call of the API (the default)
15
+ * - `silent`: a change that a subscriber recording changes leaves out, such as the selection a
16
+ * drawing mode clears as it is entered
17
+ * - `load`: a load of any format (`document.load`, `document.loadMany`), with the replacement
18
+ * of `mode: 'replace'`, in one transaction
19
+ * - `batch`: a bulk change of an application or an extension recorded as one step; the
20
+ * library does not write it
21
+ * - `remote`: a change a replaced Store applies from outside the instance
22
+ * - `import`: data an application or an extension loads by its own means
23
+ *
24
+ * Any other string can be used by an extension or a Store for the changes it applies itself.
25
+ */
26
+ export type UpdateSource = 'local' | 'silent' | 'load' | 'batch' | 'remote' | 'import' | (string & Record<never, never>);
27
+ /**
28
+ * The read side of the Store: the document, the state of this client, and the subscription
29
+ * to their changes.
30
+ *
31
+ * What it returns and notifies keeps these rules:
32
+ *
33
+ * - Returned objects are never changed afterwards. Callers treat what a getter returns or a
34
+ * notification carries as read-only, and the Store never changes such an object: a change
35
+ * stores a new object.
36
+ * - The stacking order (`getLayerOrder()`) is part of the document. It may hold entries that
37
+ * are not layers (a dataset with `order: 'layer-order'`, a separator of the application),
38
+ * and its entries are distinct non-empty strings.
39
+ * - One notification per outermost transaction: `subscribe` delivers one `DocumentChange`
40
+ * per outermost `transact` (or per write outside one), with its `source`. The transactions
41
+ * inside another fold into the outermost one.
42
+ * - A replacement of the whole document is one `DocumentChange`. A load that replaces the
43
+ * document in one `transact` arrives as one change; a document the Store takes from
44
+ * elsewhere in one step arrives as one change with `reset: true`, which lists what was
45
+ * replaced.
46
+ * - A write of the selection, the editing or the mode is notified with its category; a write
47
+ * of the vertex selection, read-only, the interaction lock or the hidden items may be
48
+ * notified with no category.
49
+ * - A change applied from outside the instance is notified like a local one, with the source
50
+ * `'remote'`. The instance follows it: a deleted item leaves the selection, the editing and
51
+ * the hidden items through the writes of {@link Store}.
52
+ * - An optional field (`Feature.groupId`, `Layer.metadata`, `Layer.styleRule`) may be given as
53
+ * `null`: null is accepted and read as `undefined`, so the instance and its API always hand
54
+ * out `undefined` for it.
55
+ * - The state of this client (the selection, the editing, the selected vertices, the mode,
56
+ * read-only, the interaction lock and the hidden items) is not part of the document: it is
57
+ * not saved, and a change from outside the instance does not carry it.
58
+ */
59
+ export interface StoreView {
60
+ /** A feature by ID, or `undefined` */
61
+ getFeature(id: string): Feature | undefined;
62
+ /** Every feature, in no particular order */
63
+ listFeatures(): Feature[];
64
+ /** Every feature in stacking order, from the back */
65
+ listFeaturesInOrder(): Feature[];
66
+ /** A layer by ID, or `undefined` */
67
+ getLayer(id: string): Layer | undefined;
68
+ /** Every layer, in no particular order */
69
+ listLayers(): Layer[];
70
+ /** The stacking order, from the back: the layers and the entries from outside the document */
71
+ getLayerOrder(): readonly string[];
72
+ /** A group by ID, or `undefined` */
73
+ getGroup(id: string): Group | undefined;
74
+ /** Every group */
75
+ listGroups(): Group[];
76
+ /** An embedded file by ID, or `undefined` */
77
+ getFile(id: string): FileData | undefined;
78
+ /** Every embedded file */
79
+ listFiles(): FileData[];
80
+ /** The title and the description */
81
+ getMetadata(): Metadata;
82
+ /** The selection of this client */
83
+ getSelection(): Selection;
84
+ /** The IDs of the features being edited */
85
+ getEditingIds(): readonly string[];
86
+ /** The selected vertices, or `null` */
87
+ getVertexSelection(): VertexSelection | null;
88
+ /** The current mode */
89
+ getMode(): Mode;
90
+ /** Whether the document is read-only */
91
+ isReadOnly(): boolean;
92
+ /** Whether the interaction lock is on */
93
+ isInteractionLocked(): boolean;
94
+ /** Whether this client hides the item */
95
+ isHidden(id: string): boolean;
96
+ /** The IDs this client hides */
97
+ listHidden(): ReadonlySet<string>;
98
+ /**
99
+ * Subscribes to the changes; one notification arrives per outermost transaction.
100
+ *
101
+ * @returns The function that unsubscribes
102
+ */
103
+ subscribe(listener: (changes: DocumentChange) => void): () => void;
104
+ /**
105
+ * Runs `fn` as one transaction, so that its writes arrive as one notification.
106
+ *
107
+ * @returns What `fn` returns
108
+ */
109
+ transact<T>(fn: () => T, source?: UpdateSource): T;
110
+ }
111
+ /**
112
+ * The Store with its writes: what the `store` option of `createDraw` takes.
113
+ *
114
+ * The instance reads and writes the document and the state of this client only through these
115
+ * methods, subscribes to it and groups its writes with `transact`. The shape being drawn, the
116
+ * box selection and the drag stay in the instance. A Store keeps the rules of
117
+ * {@link StoreView} and these:
118
+ *
119
+ * - Unique IDs: the IDs of features and groups are unique together (both are listed in
120
+ * `Layer.items`), the IDs of layers are unique, and so are the IDs of files. A write that
121
+ * would take an ID in use does not apply.
122
+ * - `Layer.items` is consistent: every feature is listed in exactly one container, in
123
+ * `Group.featureIds` of its group when it has `groupId`, otherwise in `Layer.items` of its
124
+ * layer, and every group is listed in `Layer.items` of one layer. The writes keep it so: a
125
+ * new feature or group is listed, a deleted one is taken out, a change of `layerId` or
126
+ * `groupId` moves the feature, and a group whose last member leaves is deleted.
127
+ * - `Group.layerId` is maintained by the Store: it is always the layer whose `items` list the
128
+ * group.
129
+ * - The stacking order: `createLayer` adds the new layer at the front unless the order
130
+ * already holds it, `deleteLayer` takes it out, and no other write adds or removes entries.
131
+ * - Writes return whether they were applied: a write of the document returns true when it
132
+ * changed the Store, and false when it was refused, changing nothing. A write whose
133
+ * argument cannot apply (an ID that names nothing) may throw instead, storing nothing.
134
+ * - Read-only refusals: the instance does not call the writes of the document while
135
+ * `isReadOnly()` is true, and a Store may refuse them then (and for reasons of its own) by
136
+ * returning false. The interaction lock does not stop any write. The writes of the state of
137
+ * this client return nothing: the instance takes them as applied.
138
+ */
139
+ export interface Store extends StoreView {
140
+ /** Creates a feature. */
141
+ createFeature(feature: Feature): boolean;
142
+ /** Changes the fields given of a feature; `isIntermediate` marks an edit in progress. */
143
+ updateFeature(id: string, updates: Partial<Feature>, options?: {
144
+ isIntermediate?: boolean;
145
+ }): boolean;
146
+ /** Drops the intermediate updates of these features that were not followed by a final one. */
147
+ abortIntermediateUpdates?(ids: string[]): void;
148
+ /** Deletes a feature. */
149
+ deleteFeature(id: string): boolean;
150
+ /** Creates a layer. */
151
+ createLayer(layer: Layer): boolean;
152
+ /** Changes the fields given of a layer. */
153
+ updateLayer(id: string, updates: Partial<Layer>): boolean;
154
+ /** Deletes a layer. */
155
+ deleteLayer(id: string): boolean;
156
+ /** Replaces the stacking order. */
157
+ setLayerOrder(order: string[]): boolean;
158
+ /** Moves an item to a position within a layer. */
159
+ reorderInLayer(itemId: string, layerId: string, newIndex: number): boolean;
160
+ /** Moves a feature to a position within a group. */
161
+ reorderInGroup(featureId: string, groupId: string, newIndex: number): boolean;
162
+ /** Creates a group. */
163
+ createGroup(group: Group): boolean;
164
+ /** Changes the fields given of a group. */
165
+ updateGroup(id: string, updates: Partial<Group>): boolean;
166
+ /** Deletes a group. */
167
+ deleteGroup(id: string): boolean;
168
+ /** Adds an embedded file. */
169
+ createFile(file: FileData): boolean;
170
+ /** Deletes an embedded file. */
171
+ deleteFile(id: string): boolean;
172
+ /** Changes the fields given of the metadata. */
173
+ setMetadata(metadata: Partial<Metadata>): boolean;
174
+ /** Replaces the selection of this client. */
175
+ setSelection(type: SelectionType | null, ids: string[]): void;
176
+ /** Marks features as being edited. */
177
+ startEditing(ids: string[]): void;
178
+ /** Marks features as no longer being edited. */
179
+ endEditing(ids: string[]): void;
180
+ /** Replaces the selected vertices. */
181
+ setSelectedVertices(selection: VertexSelection | null): void;
182
+ /** Replaces the mode. */
183
+ setMode(mode: Mode): void;
184
+ /** Turns read-only on or off. */
185
+ setReadOnly(value: boolean): void;
186
+ /** Turns the interaction lock on or off. */
187
+ setInteractionLock(value: boolean): void;
188
+ /** Hides or shows an item in this client. */
189
+ setLocallyHidden(id: string, hidden: boolean): void;
190
+ }
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};