@sakuzu/maplibre-gl-draw 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/CHANGELOG.md +1016 -2
  2. package/README.ja.md +39 -19
  3. package/README.md +41 -21
  4. package/dist/api/datasets.d.ts +258 -0
  5. package/dist/api/document.d.ts +66 -0
  6. package/dist/api/draw.d.ts +135 -0
  7. package/dist/api/draw.js +18 -0
  8. package/dist/api/drawing.d.ts +87 -0
  9. package/dist/api/errors.d.ts +35 -0
  10. package/dist/api/errors.js +35 -0
  11. package/dist/api/events.d.ts +306 -0
  12. package/dist/api/extension/context.d.ts +247 -0
  13. package/dist/api/extension/feature-type.d.ts +129 -0
  14. package/dist/api/extension/mode.d.ts +123 -0
  15. package/dist/api/extension/plugin.d.ts +51 -0
  16. package/dist/api/extension/plugin.js +3 -0
  17. package/dist/api/extension/provider.d.ts +119 -0
  18. package/dist/api/extension/provider.js +3 -0
  19. package/dist/api/extension/render.d.ts +176 -0
  20. package/dist/api/extension/render.js +3 -0
  21. package/dist/api/extension/store.d.ts +190 -0
  22. package/dist/api/extension/store.js +3 -0
  23. package/dist/api/extensions.d.ts +306 -0
  24. package/dist/api/extensions.js +3 -0
  25. package/dist/api/features.d.ts +188 -0
  26. package/dist/api/features.js +3 -0
  27. package/dist/api/groups.d.ts +111 -0
  28. package/dist/api/groups.js +3 -0
  29. package/dist/api/hidden.d.ts +45 -0
  30. package/dist/api/hidden.js +3 -0
  31. package/dist/api/impl/adapters.js +463 -0
  32. package/dist/api/impl/contexts.js +466 -0
  33. package/dist/api/impl/create-draw.js +124 -0
  34. package/dist/api/impl/datasets.js +404 -0
  35. package/dist/api/impl/destroy-guard.js +74 -0
  36. package/dist/api/impl/document.js +280 -0
  37. package/dist/api/impl/drawing.js +180 -0
  38. package/dist/api/impl/engine-context.d.ts +7 -0
  39. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  40. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  41. package/dist/api/impl/events.js +422 -0
  42. package/dist/api/impl/extension-host.js +361 -0
  43. package/dist/api/impl/extensions.js +229 -0
  44. package/dist/api/impl/features.js +445 -0
  45. package/dist/api/impl/geometry/apply.d.ts +32 -0
  46. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  47. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  48. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  49. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  50. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  51. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  52. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  53. package/dist/api/impl/geometry/types.js +3 -0
  54. package/dist/api/impl/groups.d.ts +3 -0
  55. package/dist/api/impl/groups.js +268 -0
  56. package/dist/api/impl/hidden.js +60 -0
  57. package/dist/api/impl/import-export/constants.d.ts +22 -0
  58. package/dist/api/impl/import-export/constants.js +24 -0
  59. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  60. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  61. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  62. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  63. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  64. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  66. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  68. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  69. package/dist/api/impl/import-export/image-import.js +73 -0
  70. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  71. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  72. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  73. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  74. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  75. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  76. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  77. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  78. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  79. package/dist/api/impl/import-export/style-validation.js +86 -0
  80. package/dist/api/impl/import-export/types.d.ts +52 -0
  81. package/dist/api/impl/import-export/types.js +3 -0
  82. package/dist/api/impl/input.js +180 -0
  83. package/dist/api/impl/layers.js +307 -0
  84. package/dist/api/impl/metadata.d.ts +1 -0
  85. package/dist/api/impl/metadata.js +22 -0
  86. package/dist/api/impl/options.d.ts +1 -0
  87. package/dist/api/impl/options.js +822 -0
  88. package/dist/api/impl/placement.d.ts +1 -0
  89. package/dist/api/impl/placement.js +138 -0
  90. package/dist/api/impl/render-context.d.ts +13 -0
  91. package/dist/api/impl/render-context.js +272 -0
  92. package/dist/api/impl/rows.d.ts +1 -0
  93. package/dist/api/impl/rows.js +46 -0
  94. package/dist/api/impl/selection.d.ts +1 -0
  95. package/dist/api/impl/selection.js +186 -0
  96. package/dist/api/impl/shared.d.ts +64 -0
  97. package/dist/api/impl/shared.js +178 -0
  98. package/dist/api/impl/validate-extension.d.ts +1 -0
  99. package/dist/api/impl/validate-extension.js +159 -0
  100. package/dist/api/layers.d.ts +130 -0
  101. package/dist/api/layers.js +3 -0
  102. package/dist/api/metadata.d.ts +18 -0
  103. package/dist/api/metadata.js +3 -0
  104. package/dist/api/model.d.ts +487 -0
  105. package/dist/api/model.js +47 -0
  106. package/dist/api/options.d.ts +466 -0
  107. package/dist/api/options.js +3 -0
  108. package/dist/api/selection.d.ts +94 -0
  109. package/dist/api/selection.js +3 -0
  110. package/dist/api/state.d.ts +155 -0
  111. package/dist/api/state.js +12 -0
  112. package/dist/{display → dataset}/chunk.d.ts +1 -1
  113. package/dist/{display → dataset}/chunk.js +4 -3
  114. package/dist/{display → dataset}/dataset.js +18 -21
  115. package/dist/dataset/interaction.d.ts +1 -0
  116. package/dist/{display → dataset}/interaction.js +18 -6
  117. package/dist/dataset/manager.d.ts +1 -0
  118. package/dist/dataset/provider.d.ts +1 -0
  119. package/dist/{display → dataset}/retained.d.ts +1 -1
  120. package/dist/{display → dataset}/retained.js +8 -7
  121. package/dist/dataset/source.d.ts +1 -0
  122. package/dist/{display → dataset}/source.js +17 -4
  123. package/dist/dataset/spatial.d.ts +1 -0
  124. package/dist/{display → dataset}/spatial.js +1 -1
  125. package/dist/dataset/style.d.ts +1 -0
  126. package/dist/{display → dataset}/style.js +1 -1
  127. package/dist/dataset/table-source.d.ts +1 -0
  128. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  129. package/dist/{display → dataset}/thinning.d.ts +0 -10
  130. package/dist/{display → dataset}/thinning.js +3 -2
  131. package/dist/dataset/triangulation.d.ts +1 -0
  132. package/dist/{display → dataset}/triangulation.js +0 -0
  133. package/dist/{display → dataset}/types.d.ts +82 -121
  134. package/dist/dataset/types.js +61 -0
  135. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  136. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  137. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  138. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  139. package/dist/dispatcher/hit-test/service.js +80 -16
  140. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  141. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  142. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  143. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  144. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  145. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  146. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  147. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  148. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  149. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  150. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  151. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  152. package/dist/dispatcher/input-router.js +152 -69
  153. package/dist/dispatcher/normalizer.js +6 -2
  154. package/dist/dispatcher/types.d.ts +6 -1
  155. package/dist/extension/feature-handler.d.ts +1 -182
  156. package/dist/extension/index.d.ts +4 -7
  157. package/dist/extension/renderers.d.ts +1 -208
  158. package/dist/geometry/angle.d.ts +0 -8
  159. package/dist/geometry/angle.js +0 -8
  160. package/dist/geometry/bbox.d.ts +4 -12
  161. package/dist/geometry/bbox.js +4 -12
  162. package/dist/geometry/boolean.d.ts +0 -51
  163. package/dist/geometry/boolean.js +0 -51
  164. package/dist/geometry/buffer.d.ts +0 -26
  165. package/dist/geometry/buffer.js +0 -26
  166. package/dist/geometry/circle.d.ts +0 -9
  167. package/dist/geometry/circle.js +0 -9
  168. package/dist/geometry/coords.d.ts +0 -16
  169. package/dist/geometry/coords.js +0 -16
  170. package/dist/geometry/distance.d.ts +0 -24
  171. package/dist/geometry/distance.js +0 -24
  172. package/dist/geometry/errors.d.ts +21 -36
  173. package/dist/geometry/errors.js +49 -29
  174. package/dist/geometry/geojson.d.ts +81 -0
  175. package/dist/geometry/geojson.js +164 -0
  176. package/dist/geometry/index.d.ts +38 -23
  177. package/dist/geometry/index.js +43 -31
  178. package/dist/geometry/measure.d.ts +0 -27
  179. package/dist/geometry/measure.js +0 -27
  180. package/dist/geometry/predicates.d.ts +0 -9
  181. package/dist/geometry/predicates.js +0 -9
  182. package/dist/geometry/public-bounds.d.ts +26 -0
  183. package/dist/geometry/public-bounds.js +30 -0
  184. package/dist/geometry/public-combine.d.ts +78 -0
  185. package/dist/geometry/public-combine.js +82 -0
  186. package/dist/geometry/public-create.d.ts +54 -0
  187. package/dist/geometry/public-create.js +70 -0
  188. package/dist/geometry/public-measure.d.ts +170 -0
  189. package/dist/geometry/public-measure.js +283 -0
  190. package/dist/geometry/public-predicates.d.ts +54 -0
  191. package/dist/geometry/public-predicates.js +144 -0
  192. package/dist/geometry/public-repair.d.ts +75 -0
  193. package/dist/geometry/public-repair.js +77 -0
  194. package/dist/geometry/simplify.d.ts +0 -7
  195. package/dist/geometry/simplify.js +0 -7
  196. package/dist/geometry/split.d.ts +0 -20
  197. package/dist/geometry/split.js +0 -20
  198. package/dist/geometry/units.d.ts +20 -12
  199. package/dist/geometry/units.js +20 -12
  200. package/dist/index.d.ts +52 -66
  201. package/dist/index.js +6 -18
  202. package/dist/messages.d.ts +7 -7
  203. package/dist/modes/draw/circle.js +83 -207
  204. package/dist/modes/draw/commit-layer.d.ts +5 -16
  205. package/dist/modes/draw/commit-layer.js +2 -13
  206. package/dist/modes/draw/freehand.js +108 -246
  207. package/dist/modes/draw/image.js +4 -2
  208. package/dist/modes/draw/index.d.ts +5 -5
  209. package/dist/modes/draw/index.js +5 -5
  210. package/dist/modes/draw/line.js +18 -354
  211. package/dist/modes/draw/point.js +29 -78
  212. package/dist/modes/draw/polygon.js +23 -368
  213. package/dist/modes/draw/trace-support.d.ts +43 -36
  214. package/dist/modes/draw/trace-support.js +95 -98
  215. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  216. package/dist/modes/draw/vertex-drawing.js +176 -0
  217. package/dist/modes/handler.d.ts +1 -285
  218. package/dist/modes/manager.d.ts +2 -2
  219. package/dist/modes/manager.js +3 -0
  220. package/dist/modes/select/box-selection.d.ts +3 -3
  221. package/dist/modes/select/box-selection.js +2 -1
  222. package/dist/modes/select/click-handler.d.ts +5 -5
  223. package/dist/modes/select/click-handler.js +22 -20
  224. package/dist/modes/select/cursor-handler.d.ts +2 -2
  225. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  226. package/dist/modes/select/drag/move.js +3 -3
  227. package/dist/modes/select/drag/operation.d.ts +3 -3
  228. package/dist/modes/select/drag/radius.js +5 -4
  229. package/dist/modes/select/drag/transform.d.ts +2 -2
  230. package/dist/modes/select/drag/transform.js +11 -5
  231. package/dist/modes/select/drag/vertex.d.ts +2 -2
  232. package/dist/modes/select/drag/vertex.js +13 -8
  233. package/dist/modes/select/drag-handler.js +44 -25
  234. package/dist/modes/select/mode.js +17 -17
  235. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  236. package/dist/modes/select/shortcut-handler.js +9 -7
  237. package/dist/operations/layer-operations.js +29 -168
  238. package/dist/operations/resize.d.ts +2 -2
  239. package/dist/operations/resize.js +5 -5
  240. package/dist/operations/rotate.js +5 -5
  241. package/dist/operations/selection-operations.d.ts +16 -1
  242. package/dist/operations/selection-operations.js +28 -13
  243. package/dist/operations/shared-vertex.js +4 -2
  244. package/dist/operations/trace-graph.d.ts +0 -18
  245. package/dist/operations/trace-graph.js +0 -18
  246. package/dist/operations/vertex.js +36 -35
  247. package/dist/shared/color.d.ts +1 -0
  248. package/dist/shared/color.js +245 -0
  249. package/dist/shared/config/constants.d.ts +1 -54
  250. package/dist/shared/config/constants.js +1 -58
  251. package/dist/shared/config/feature-style.d.ts +16 -13
  252. package/dist/shared/config/feature-style.js +9 -0
  253. package/dist/shared/config/rendering.d.ts +3 -3
  254. package/dist/shared/config/selection-highlight.d.ts +0 -15
  255. package/dist/shared/config/selection-highlight.js +4 -7
  256. package/dist/shared/config/selection.d.ts +2 -32
  257. package/dist/shared/config/selection.js +0 -18
  258. package/dist/shared/config/topology.d.ts +2 -2
  259. package/dist/shared/config/trace.d.ts +4 -4
  260. package/dist/shared/math/angle.d.ts +1 -1
  261. package/dist/shared/math/angle.js +1 -1
  262. package/dist/shared/math/circle.d.ts +1 -1
  263. package/dist/shared/math/circle.js +1 -1
  264. package/dist/shared/math/distance.d.ts +2 -1
  265. package/dist/shared/math/distance.js +3 -2
  266. package/dist/shared/math/index.d.ts +1 -1
  267. package/dist/shared/math/index.js +1 -1
  268. package/dist/shared/math/transform.d.ts +23 -0
  269. package/dist/shared/math/transform.js +47 -28
  270. package/dist/shared/properties.d.ts +18 -0
  271. package/dist/shared/properties.js +129 -0
  272. package/dist/shared/types/events.d.ts +15 -7
  273. package/dist/shared/types/model.d.ts +109 -159
  274. package/dist/shared/types/style.d.ts +1 -1
  275. package/dist/shared/utils/color.d.ts +2 -36
  276. package/dist/shared/utils/color.js +13 -70
  277. package/dist/shared/utils/coordinates.d.ts +30 -4
  278. package/dist/shared/utils/coordinates.js +56 -10
  279. package/dist/shared/utils/event-emitter.d.ts +1 -262
  280. package/dist/shared/utils/event-emitter.js +4 -3
  281. package/dist/shared/utils/feature-bbox.js +8 -7
  282. package/dist/shared/utils/feature-segments.js +5 -4
  283. package/dist/shared/utils/image.d.ts +0 -4
  284. package/dist/shared/utils/image.js +0 -6
  285. package/dist/shared/utils/name-generator.d.ts +14 -20
  286. package/dist/shared/utils/name-generator.js +20 -3
  287. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  288. package/dist/shared/utils/pixel-ratio.js +13 -4
  289. package/dist/shared/utils/property.d.ts +7 -50
  290. package/dist/shared/utils/property.js +22 -87
  291. package/dist/snapping/custom-targets.js +21 -4
  292. package/dist/snapping/indicator.js +20 -11
  293. package/dist/snapping/providers/display.d.ts +6 -1
  294. package/dist/snapping/providers/display.js +2 -1
  295. package/dist/snapping/providers/guide.d.ts +3 -43
  296. package/dist/snapping/providers/guide.js +1 -44
  297. package/dist/snapping/providers/intersection.js +1 -1
  298. package/dist/snapping/providers/store.js +3 -3
  299. package/dist/snapping/service.js +18 -7
  300. package/dist/snapping/types.d.ts +9 -35
  301. package/dist/store/draw-store.js +233 -142
  302. package/dist/store/local-visibility.d.ts +11 -6
  303. package/dist/store/local-visibility.js +38 -7
  304. package/dist/store/lock.d.ts +0 -6
  305. package/dist/store/lock.js +0 -6
  306. package/dist/store/memory/change-bus.d.ts +3 -3
  307. package/dist/store/memory/change-bus.js +12 -0
  308. package/dist/store/memory/file-store.d.ts +2 -2
  309. package/dist/store/memory/ui-state.d.ts +1 -51
  310. package/dist/store/memory/ui-state.js +122 -134
  311. package/dist/store/memory.d.ts +1 -8
  312. package/dist/store/memory.js +249 -45
  313. package/dist/store/ordering.d.ts +9 -0
  314. package/dist/store/ordering.js +17 -0
  315. package/dist/store/spatial/spatial-index.d.ts +1 -1
  316. package/dist/store/spatial/spatial-index.js +1 -1
  317. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  318. package/dist/store/spatial/store-spatial-index.js +9 -3
  319. package/dist/store/store.d.ts +66 -107
  320. package/dist/store/types.d.ts +1 -1
  321. package/dist/store/writable-layer.d.ts +1 -1
  322. package/dist/store/writable-layer.js +2 -2
  323. package/dist/table/builder.d.ts +83 -0
  324. package/dist/table/builder.js +381 -0
  325. package/dist/table/index.d.ts +37 -0
  326. package/dist/table/index.js +5 -0
  327. package/dist/table/packed-rtree.d.ts +1 -0
  328. package/dist/{display → table}/packed-rtree.js +1 -1
  329. package/dist/table/partition.d.ts +1 -0
  330. package/dist/{display → table}/partition.js +3 -3
  331. package/dist/table/prepare.d.ts +44 -0
  332. package/dist/table/prepare.js +136 -0
  333. package/dist/table/table.d.ts +1 -0
  334. package/dist/{display/columnar → table}/table.js +29 -25
  335. package/dist/{display/columnar → table}/types.d.ts +68 -72
  336. package/dist/table/types.js +3 -0
  337. package/dist/view/coordinator.js +4 -3
  338. package/dist/view/feature-companion.d.ts +13 -7
  339. package/dist/view/feature-companion.js +11 -3
  340. package/dist/view/globe-subdivision.js +3 -3
  341. package/dist/view/layer/attach.d.ts +1 -1
  342. package/dist/view/layer/attach.js +1 -1
  343. package/dist/view/layer/custom-layer.js +40 -11
  344. package/dist/view/layer/display-list.js +2 -1
  345. package/dist/view/layer/drape-planner.d.ts +2 -2
  346. package/dist/view/layer/frame-render.d.ts +3 -3
  347. package/dist/view/layer/frame-render.js +7 -2
  348. package/dist/view/layer/frame-state.d.ts +6 -6
  349. package/dist/view/layer/index.d.ts +2 -2
  350. package/dist/view/layer/index.js +1 -1
  351. package/dist/view/layer/render.d.ts +4 -4
  352. package/dist/view/layer/render.js +3 -8
  353. package/dist/view/layer/renderers.d.ts +2 -2
  354. package/dist/view/layer/renderers.js +1 -1
  355. package/dist/view/layer/slot-manager.d.ts +2 -2
  356. package/dist/view/layer/slot-manager.js +4 -4
  357. package/dist/view/layer/slots.d.ts +2 -2
  358. package/dist/view/layer/slots.js +1 -1
  359. package/dist/view/layer/store-retained-bbox.js +3 -2
  360. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  361. package/dist/view/layer/store-retained-classify.js +19 -7
  362. package/dist/view/layer/store-retained-collect.js +8 -7
  363. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  364. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  365. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  366. package/dist/view/layer/store-retained-immediate.js +3 -8
  367. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  368. package/dist/view/layer/store-retained.d.ts +2 -2
  369. package/dist/view/layer/store-retained.js +1 -1
  370. package/dist/view/renderers/batch-manager.js +8 -7
  371. package/dist/view/renderers/drawer.js +21 -15
  372. package/dist/view/renderers/image.js +13 -39
  373. package/dist/view/renderers/line/line-types.d.ts +3 -3
  374. package/dist/view/renderers/line/sdf-line.js +3 -1
  375. package/dist/view/renderers/point/billboard-depth.js +1 -1
  376. package/dist/view/renderers/point/point-instance.js +1 -1
  377. package/dist/view/renderers/point/point-shape.js +2 -2
  378. package/dist/view/renderers/point/point-style.js +48 -4
  379. package/dist/view/renderers/polygon/batch.js +1 -2
  380. package/dist/view/renderers/polygon/fill.js +3 -1
  381. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  382. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  383. package/dist/view/renderers/stroke.js +3 -1
  384. package/dist/view/shaders/helpers.d.ts +2 -42
  385. package/dist/view/shaders/helpers.js +0 -6
  386. package/dist/view/shaders/projection.d.ts +15 -7
  387. package/dist/view/shaders/projection.js +23 -6
  388. package/dist/view/shaders/quad.d.ts +16 -12
  389. package/dist/view/shaders/quad.js +34 -13
  390. package/dist/view/style-rule.d.ts +5 -42
  391. package/dist/view/style-rule.js +20 -44
  392. package/dist/view/terrain/binding.d.ts +1 -0
  393. package/dist/view/terrain/binding.js +29 -0
  394. package/dist/view/terrain/context.d.ts +3 -4
  395. package/dist/view/terrain/context.js +4 -5
  396. package/dist/view/terrain/drape/geometry.js +1 -1
  397. package/dist/view/terrain/drape/pass.d.ts +1 -1
  398. package/dist/view/terrain/drape/pass.js +8 -7
  399. package/dist/view/terrain/polygon.d.ts +9 -5
  400. package/dist/view/terrain/polygon.js +16 -2
  401. package/dist/view/terrain/state.d.ts +1 -1
  402. package/dist/view/terrain/state.js +1 -1
  403. package/dist/view/terrain/tessellation.d.ts +2 -2
  404. package/dist/view/terrain/tessellation.js +1 -1
  405. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  406. package/dist/view/ui/bounds.js +8 -12
  407. package/dist/view/ui/handle-test.js +2 -2
  408. package/dist/view/ui/handle-thinning.js +17 -17
  409. package/dist/view/ui/handles.js +21 -13
  410. package/dist/view/ui/helper.d.ts +1 -1
  411. package/dist/view/ui/helper.js +1 -1
  412. package/dist/view/ui/index.d.ts +1 -1
  413. package/dist/view/ui/selection-scope.js +4 -2
  414. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  415. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  416. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  417. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  418. package/dist/view/ui/selection-ui/index.js +1 -1
  419. package/dist/view/ui/selection-ui/renderer.js +15 -38
  420. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  421. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  422. package/dist/view/ui/selection-ui-drawer.js +63 -2
  423. package/dist/view/ui/tentative.js +1 -1
  424. package/dist/webgl/index.d.ts +65 -0
  425. package/dist/webgl/index.js +62 -0
  426. package/package.json +20 -9
  427. package/dist/api/api.d.ts +0 -1259
  428. package/dist/api/api.js +0 -86
  429. package/dist/api/context.d.ts +0 -173
  430. package/dist/api/display-api.js +0 -23
  431. package/dist/api/event-api.d.ts +0 -13
  432. package/dist/api/event-api.js +0 -17
  433. package/dist/api/extension-api.d.ts +0 -46
  434. package/dist/api/extension-api.js +0 -85
  435. package/dist/api/feature-api.d.ts +0 -11
  436. package/dist/api/feature-api.js +0 -101
  437. package/dist/api/geometry/apply.d.ts +0 -51
  438. package/dist/api/geometry/boolean.d.ts +0 -28
  439. package/dist/api/geometry/boolean.js +0 -65
  440. package/dist/api/geometry/types.d.ts +0 -31
  441. package/dist/api/geometry-operations.d.ts +0 -162
  442. package/dist/api/geometry-operations.js +0 -94
  443. package/dist/api/group-api.d.ts +0 -10
  444. package/dist/api/group-api.js +0 -78
  445. package/dist/api/import-export/constants.d.ts +0 -29
  446. package/dist/api/import-export/constants.js +0 -40
  447. package/dist/api/import-export/file-name.d.ts +0 -10
  448. package/dist/api/import-export/file-name.js +0 -20
  449. package/dist/api/import-export/geojson-export.d.ts +0 -19
  450. package/dist/api/import-export/image-import.d.ts +0 -12
  451. package/dist/api/import-export/image-import.js +0 -53
  452. package/dist/api/import-export/index.d.ts +0 -9
  453. package/dist/api/import-export/index.js +0 -107
  454. package/dist/api/import-export/native-format.d.ts +0 -15
  455. package/dist/api/import-export/style-validation.d.ts +0 -27
  456. package/dist/api/import-export/style-validation.js +0 -49
  457. package/dist/api/import-export/types.d.ts +0 -26
  458. package/dist/api/index.d.ts +0 -15
  459. package/dist/api/index.js +0 -3
  460. package/dist/api/input-api.d.ts +0 -158
  461. package/dist/api/input-api.js +0 -144
  462. package/dist/api/instance-api.d.ts +0 -38
  463. package/dist/api/instance-api.js +0 -136
  464. package/dist/api/layer-api.d.ts +0 -12
  465. package/dist/api/layer-api.js +0 -62
  466. package/dist/api/selection-api.d.ts +0 -7
  467. package/dist/api/selection-api.js +0 -78
  468. package/dist/api/snapping-api.d.ts +0 -125
  469. package/dist/api/snapping-api.js +0 -50
  470. package/dist/api/topology-api.d.ts +0 -30
  471. package/dist/api/topology-api.js +0 -16
  472. package/dist/api/tracing-api.d.ts +0 -31
  473. package/dist/api/tracing-api.js +0 -16
  474. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  475. package/dist/dispatcher/hit-test/index.js +0 -9
  476. package/dist/dispatcher/index.d.ts +0 -15
  477. package/dist/dispatcher/index.js +0 -3
  478. package/dist/display/columnar/index.d.ts +0 -12
  479. package/dist/display/columnar/index.js +0 -13
  480. package/dist/display/columnar/prepare.d.ts +0 -42
  481. package/dist/display/columnar/prepare.js +0 -116
  482. package/dist/display/index.d.ts +0 -13
  483. package/dist/display/types.js +0 -43
  484. package/dist/maplibre-gl-draw.d.ts +0 -47
  485. package/dist/modes/cursor.js +0 -72
  486. package/dist/modes/index.d.ts +0 -7
  487. package/dist/operations/index.d.ts +0 -9
  488. package/dist/operations/index.js +0 -3
  489. package/dist/plugins/index.d.ts +0 -10
  490. package/dist/plugins/mutation-hooks.d.ts +0 -28
  491. package/dist/plugins/mutation-hooks.js +0 -84
  492. package/dist/plugins/plugin-context.js +0 -367
  493. package/dist/plugins/plugin-manager.d.ts +0 -103
  494. package/dist/plugins/plugin-manager.js +0 -316
  495. package/dist/plugins/plugin.d.ts +0 -529
  496. package/dist/shared/config/index.d.ts +0 -17
  497. package/dist/shared/config/index.js +0 -8
  498. package/dist/shared/utils/index.d.ts +0 -15
  499. package/dist/shared/utils/index.js +0 -24
  500. package/dist/snapping/index.d.ts +0 -14
  501. package/dist/snapping/index.js +0 -4
  502. package/dist/store/change-merger.js +0 -102
  503. package/dist/store/event-bridge.js +0 -161
  504. package/dist/store/index.d.ts +0 -12
  505. package/dist/store/index.js +0 -4
  506. package/dist/view/index.d.ts +0 -47
  507. package/dist/view/index.js +0 -20
  508. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  509. /package/dist/api/{import-export/types.js → document.js} +0 -0
  510. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  511. /package/dist/{display/index.js → api/events.js} +0 -0
  512. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  513. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  514. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  515. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  516. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  517. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  518. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  519. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  520. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  521. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  522. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  523. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  524. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  525. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  526. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  527. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  528. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  529. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  532. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  533. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  534. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  535. /package/dist/{display → dataset}/chunk-set.js +0 -0
  536. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  537. /package/dist/{display → dataset}/manager.js +0 -0
  538. /package/dist/{display → dataset}/provider.js +0 -0
  539. /package/dist/{display → dataset}/selection.d.ts +0 -0
  540. /package/dist/{display → dataset}/selection.js +0 -0
@@ -8,7 +8,7 @@
8
8
  * the host's `typeNames`, or from the English defaults below. Nothing else in the library
9
9
  * writes such a word inline.
10
10
  */
11
- import type { Feature, FeatureType, Group, Layer, StateChanges } from '../types/model.js';
11
+ import type { Feature, FeatureType, Group, Layer, StoreChange } from '../types/model.js';
12
12
  /**
13
13
  * What automatic naming names: a feature type, a layer or a group
14
14
  */
@@ -16,8 +16,8 @@ export type AutoNameType = FeatureType | 'Layer' | 'Group';
16
16
  /**
17
17
  * How new features, layers and groups are named automatically ("Point 1", "Layer 2")
18
18
  *
19
- * Give it through the `autoName` option of `createMapLibreGLDraw` (`true`, the default, turns
20
- * it on with these defaults, and `false` turns it off). Each type counts on its own, and a
19
+ * The engine reads it from the `autoName` option of `createDraw` (left out, it is on with
20
+ * these defaults, and `false` turns it off). Each type counts on its own, and a
21
21
  * number is never reused: after "Point 1" and "Point 2" are created and "Point 2" is deleted,
22
22
  * the next point is "Point 3". Existing names of the form "<word> <number>" move the count on
23
23
  * as well, however they arrived (a load, an import).
@@ -32,18 +32,6 @@ export type AutoNameType = FeatureType | 'Layer' | 'Group';
32
32
  * A layer or a group always has a name. When one is created without a name while `enabled`
33
33
  * is false, it gets the word of its type alone, without a number ("Layer", or the
34
34
  * `typeNames.Layer` of the host); features get no name then.
35
- *
36
- * @example
37
- * ```ts
38
- * const draw = createMapLibreGLDraw(map, {
39
- * autoName: {
40
- * enabled: true,
41
- * typeNames: { Point: 'Pin', Layer: 'Sheet' },
42
- * formatter: (typeName, n) => `${typeName} #${n}`,
43
- * },
44
- * });
45
- * // The first point is named "Pin #1"
46
- * ```
47
35
  */
48
36
  export interface AutoNameConfig {
49
37
  /**
@@ -90,7 +78,7 @@ export declare function normalizeAutoNameConfig(config: AutoNameConfig | boolean
90
78
  */
91
79
  export declare class AutoNameGenerator {
92
80
  private readonly store;
93
- private readonly config;
81
+ private config;
94
82
  /** Counter that remembers the largest number already generated per type */
95
83
  private readonly counters;
96
84
  /** Counter keys whose full scan is done (Layer/Group go into the same Set) */
@@ -98,15 +86,21 @@ export declare class AutoNameGenerator {
98
86
  /** Unsubscribe function of the Store subscription (null when not subscribed) */
99
87
  private unsubscribe;
100
88
  constructor(store: {
101
- getAllFeatures(): Feature[];
102
- getAllLayers(): Layer[];
103
- getAllGroups(): Group[];
104
- subscribe(listener: (changes: StateChanges) => void): () => void;
89
+ listFeatures(): Feature[];
90
+ listLayers(): Layer[];
91
+ listGroups(): Group[];
92
+ subscribe(listener: (changes: StoreChange) => void): () => void;
105
93
  }, config?: AutoNameConfig | boolean);
106
94
  /**
107
95
  * Returns whether it is enabled
108
96
  */
109
97
  isEnabled(): boolean;
98
+ /**
99
+ * Replaces the configuration: whether names are generated, the words of the types and the
100
+ * format. The numbers already used are not used again; the names already in the document
101
+ * are read again in the new words.
102
+ */
103
+ configure(config: AutoNameConfig | boolean): void;
110
104
  /**
111
105
  * Unsubscribes from the Store
112
106
  */
@@ -117,6 +117,23 @@ export class AutoNameGenerator {
117
117
  isEnabled() {
118
118
  return this.config.enabled;
119
119
  }
120
+ /**
121
+ * Replaces the configuration: whether names are generated, the words of the types and the
122
+ * format. The numbers already used are not used again; the names already in the document
123
+ * are read again in the new words.
124
+ */
125
+ configure(config) {
126
+ this.config = normalizeAutoNameConfig(config);
127
+ this.scannedTypes.clear();
128
+ if (this.config.enabled && !this.unsubscribe) {
129
+ this.unsubscribe = this.store.subscribe((changes) => {
130
+ this.observeChanges(changes);
131
+ });
132
+ }
133
+ else if (!this.config.enabled) {
134
+ this.dispose();
135
+ }
136
+ }
120
137
  /**
121
138
  * Unsubscribes from the Store
122
139
  */
@@ -244,7 +261,7 @@ export class AutoNameGenerator {
244
261
  * Gets the largest number from the existing Features
245
262
  */
246
263
  getMaxNumberFromFeatures(featureType, typeName) {
247
- const features = this.store.getAllFeatures();
264
+ const features = this.store.listFeatures();
248
265
  let maxNumber = 0;
249
266
  for (const feature of features) {
250
267
  // Only features of the same type are considered
@@ -287,7 +304,7 @@ export class AutoNameGenerator {
287
304
  findNextLayerNumber(typeName) {
288
305
  this.scanOnce(LAYER_COUNTER_KEY, () => {
289
306
  let maxNumber = 0;
290
- for (const layer of this.store.getAllLayers()) {
307
+ for (const layer of this.store.listLayers()) {
291
308
  const number = extractNumberFromName(layer.name, typeName);
292
309
  if (number !== null && number > maxNumber) {
293
310
  maxNumber = number;
@@ -322,7 +339,7 @@ export class AutoNameGenerator {
322
339
  findNextGroupNumber(typeName) {
323
340
  this.scanOnce(GROUP_COUNTER_KEY, () => {
324
341
  let maxNumber = 0;
325
- for (const group of this.store.getAllGroups()) {
342
+ for (const group of this.store.listGroups()) {
326
343
  const number = extractNumberFromName(group.name, typeName);
327
344
  if (number !== null && number > maxNumber) {
328
345
  maxNumber = number;
@@ -46,7 +46,7 @@ export interface PixelRatioProvider {
46
46
  /** The current rendering pixel ratio (the injected value or window x renderScale) */
47
47
  resolve: () => number;
48
48
  /** The factor of the current rendering pixel ratio (default 1) */
49
- getRenderScale: () => number;
49
+ getScaleFactor: () => number;
50
50
  }
51
51
  /**
52
52
  * The rendering pixel ratio that can be injected
@@ -88,9 +88,15 @@ export declare function resolveContentPixelRatio(pixelRatio?: PixelRatioInput):
88
88
  *
89
89
  * The read side (`PixelRatioProvider`) plus a socket for rewriting the factor.
90
90
  * Handing the source itself out to each renderer as the `PixelRatioInput` makes a change from
91
- * `setRenderScale` propagate from the next frame to every place that reads it directly.
91
+ * `setScaleFactor` propagate from the next frame to every place that reads it directly.
92
92
  */
93
93
  export interface PixelRatioSource extends PixelRatioProvider {
94
+ /**
95
+ * Replaces the pixel ratio given at creation; `undefined` goes back to the ratio of the map
96
+ *
97
+ * @returns Whether the value changed
98
+ */
99
+ setPixelRatio: (pixelRatio: number | undefined) => boolean;
94
100
  /**
95
101
  * Sets the factor of the rendering pixel ratio
96
102
  *
@@ -98,7 +104,7 @@ export interface PixelRatioSource extends PixelRatioProvider {
98
104
  * when the value changed, so the caller can trigger a redraw or a rebuild of the batches
99
105
  * only at that point.
100
106
  */
101
- setRenderScale: (scale: number) => boolean;
107
+ setScaleFactor: (scale: number) => boolean;
102
108
  }
103
109
  /**
104
110
  * Creates a source of the rendering pixel ratio
@@ -53,7 +53,7 @@ export function resolvePixelRatio(pixelRatio) {
53
53
  export function resolveContentPixelRatio(pixelRatio) {
54
54
  if (!isProvider(pixelRatio))
55
55
  return resolvePixelRatio(pixelRatio);
56
- const scale = pixelRatio.getRenderScale();
56
+ const scale = pixelRatio.getScaleFactor();
57
57
  const resolved = resolvePixelRatio(pixelRatio);
58
58
  if (!usable(scale))
59
59
  return resolved;
@@ -69,11 +69,20 @@ export function resolveContentPixelRatio(pixelRatio) {
69
69
  */
70
70
  export function createPixelRatioSource(pixelRatio, fallback) {
71
71
  let renderScale = 1;
72
- const input = usable(pixelRatio) ? pixelRatio : fallback;
72
+ let given = usable(pixelRatio) ? pixelRatio : undefined;
73
+ let input = given ?? fallback;
73
74
  return {
75
+ setPixelRatio: (value) => {
76
+ const next = usable(value) ? value : undefined;
77
+ if (next === given)
78
+ return false;
79
+ given = next;
80
+ input = given ?? fallback;
81
+ return true;
82
+ },
74
83
  resolve: () => resolvePixelRatio(input) * renderScale,
75
- getRenderScale: () => renderScale,
76
- setRenderScale: (scale) => {
84
+ getScaleFactor: () => renderScale,
85
+ setScaleFactor: (scale) => {
77
86
  if (!Number.isFinite(scale) || scale <= 0)
78
87
  return false;
79
88
  if (scale === renderScale)
@@ -1,75 +1,32 @@
1
1
  import type { Feature, ImageProperties } from '../types/model.js';
2
2
  /**
3
- * Gets the zoom at which the feature was created (`properties.createdZoom`)
3
+ * Gets the zoom at which the feature was created (`maplibre-gl-draw:createdZoom` in
4
+ * `properties`)
4
5
  *
5
6
  * The drawing modes record it. Line widths follow the map from that zoom, and an Image is
6
7
  * drawn at its size in pixels at that zoom (see {@link FeatureStyle.strokeWidth}).
7
8
  *
8
9
  * @returns The zoom, or undefined when the feature has none (it then keeps the same width on
9
10
  * the screen)
10
- *
11
- * @example
12
- * ```ts
13
- * const feature = draw.getFeature(id);
14
- * const zoom = feature ? getCreatedZoom(feature) : undefined;
15
- * ```
16
11
  */
17
12
  export declare function getCreatedZoom(feature: Feature): number | undefined;
18
13
  /**
19
14
  * Sets the zoom at which a feature was created, in a `properties` object
20
15
  *
21
- * Use it on the properties of a {@link FeatureInput} before `addFeature`, so that the new
16
+ * Use it on the properties of a {@link FeatureInput} before it is created, so that the new
22
17
  * feature scales with the map from the current zoom like a drawn one.
23
- *
24
- * @example
25
- * ```ts
26
- * const properties: Record<string, unknown> = {};
27
- * setCreatedZoom(properties, map.getZoom());
28
- * draw.addFeature({
29
- * type: 'LineString',
30
- * coordinates: [
31
- * [139.76, 35.68],
32
- * [139.78, 35.69],
33
- * ],
34
- * properties,
35
- * });
36
- * ```
37
18
  */
38
19
  export declare function setCreatedZoom(properties: Record<string, unknown>, zoom: number): void;
39
20
  /**
40
- * Gets the rotation of the feature in degrees (`properties.rotation`, 0 when unset)
21
+ * Gets the rotation of the feature in degrees (`maplibre-gl-draw:rotation` in `properties`, 0
22
+ * when unset)
41
23
  */
42
24
  export declare function getRotation(feature: Feature): number;
43
25
  /**
44
- * Sets the rotation in degrees, in a `properties` object (the properties of a
45
- * {@link FeatureInput} before `addFeature`, say)
46
- */
47
- export declare function setRotation(properties: Record<string, unknown>, rotation: number): void;
48
- /**
49
- * Gets the scale of the feature (`properties.scale`, 1 when unset), which resizing an Image
50
- * changes
26
+ * Gets the scale of the feature (`maplibre-gl-draw:scale` in `properties`, 1 when unset),
27
+ * which resizing an Image changes
51
28
  */
52
29
  export declare function getScale(feature: Feature): number;
53
- /**
54
- * Sets the scale of the feature
55
- */
56
- export declare function setScale(properties: Record<string, unknown>, scale: number): void;
57
- /**
58
- * Gets the name of the feature
59
- */
60
- export declare function getFeatureName(feature: Feature): string | undefined;
61
- /**
62
- * Sets the name of the feature
63
- */
64
- export declare function setFeatureName(properties: Record<string, unknown>, name: string): void;
65
- /**
66
- * Gets the description of the feature
67
- */
68
- export declare function getFeatureDescription(feature: Feature): string | undefined;
69
- /**
70
- * Sets the description of the feature
71
- */
72
- export declare function setFeatureDescription(properties: Record<string, unknown>, description: string): void;
73
30
  /**
74
31
  * Gets the properties of an Image feature in a type-safe way.
75
32
  *
@@ -4,107 +4,45 @@
4
4
  * Property helpers
5
5
  *
6
6
  * Utilities for handling the properties of a feature (feature.properties) in a type-safe way.
7
- *
8
- * This library's own data such as createdZoom/rotation/scale has to round-trip through
9
- * GeoJSON with the maplibre-gl-draw: prefix, so it is held inside feature.properties under
10
- * keys without the prefix.
7
+ * The values of the library are read and written through the accessors of
8
+ * shared/properties.ts, which own their keys.
11
9
  */
12
- import { INTERNAL_PROPERTIES } from '../config/constants.js';
10
+ import { getDrawProperty, setDrawProperty } from '../properties.js';
13
11
  /**
14
- * Gets the zoom at which the feature was created (`properties.createdZoom`)
12
+ * Gets the zoom at which the feature was created (`maplibre-gl-draw:createdZoom` in
13
+ * `properties`)
15
14
  *
16
15
  * The drawing modes record it. Line widths follow the map from that zoom, and an Image is
17
16
  * drawn at its size in pixels at that zoom (see {@link FeatureStyle.strokeWidth}).
18
17
  *
19
18
  * @returns The zoom, or undefined when the feature has none (it then keeps the same width on
20
19
  * the screen)
21
- *
22
- * @example
23
- * ```ts
24
- * const feature = draw.getFeature(id);
25
- * const zoom = feature ? getCreatedZoom(feature) : undefined;
26
- * ```
27
20
  */
28
21
  export function getCreatedZoom(feature) {
29
- const value = feature.properties[INTERNAL_PROPERTIES.CREATED_ZOOM];
30
- return typeof value === 'number' ? value : undefined;
22
+ return getDrawProperty(feature, 'createdZoom');
31
23
  }
32
24
  /**
33
25
  * Sets the zoom at which a feature was created, in a `properties` object
34
26
  *
35
- * Use it on the properties of a {@link FeatureInput} before `addFeature`, so that the new
27
+ * Use it on the properties of a {@link FeatureInput} before it is created, so that the new
36
28
  * feature scales with the map from the current zoom like a drawn one.
37
- *
38
- * @example
39
- * ```ts
40
- * const properties: Record<string, unknown> = {};
41
- * setCreatedZoom(properties, map.getZoom());
42
- * draw.addFeature({
43
- * type: 'LineString',
44
- * coordinates: [
45
- * [139.76, 35.68],
46
- * [139.78, 35.69],
47
- * ],
48
- * properties,
49
- * });
50
- * ```
51
29
  */
52
30
  export function setCreatedZoom(properties, zoom) {
53
- properties[INTERNAL_PROPERTIES.CREATED_ZOOM] = zoom;
31
+ setDrawProperty(properties, 'createdZoom', zoom);
54
32
  }
55
33
  /**
56
- * Gets the rotation of the feature in degrees (`properties.rotation`, 0 when unset)
34
+ * Gets the rotation of the feature in degrees (`maplibre-gl-draw:rotation` in `properties`, 0
35
+ * when unset)
57
36
  */
58
37
  export function getRotation(feature) {
59
- const value = feature.properties[INTERNAL_PROPERTIES.ROTATION];
60
- return typeof value === 'number' ? value : 0;
61
- }
62
- /**
63
- * Sets the rotation in degrees, in a `properties` object (the properties of a
64
- * {@link FeatureInput} before `addFeature`, say)
65
- */
66
- export function setRotation(properties, rotation) {
67
- properties[INTERNAL_PROPERTIES.ROTATION] = rotation;
38
+ return getDrawProperty(feature, 'rotation') ?? 0;
68
39
  }
69
40
  /**
70
- * Gets the scale of the feature (`properties.scale`, 1 when unset), which resizing an Image
71
- * changes
41
+ * Gets the scale of the feature (`maplibre-gl-draw:scale` in `properties`, 1 when unset),
42
+ * which resizing an Image changes
72
43
  */
73
44
  export function getScale(feature) {
74
- const value = feature.properties[INTERNAL_PROPERTIES.SCALE];
75
- return typeof value === 'number' ? value : 1;
76
- }
77
- /**
78
- * Sets the scale of the feature
79
- */
80
- export function setScale(properties, scale) {
81
- properties[INTERNAL_PROPERTIES.SCALE] = scale;
82
- }
83
- /**
84
- * Gets the name of the feature
85
- */
86
- export function getFeatureName(feature) {
87
- const value = feature.properties.name;
88
- return typeof value === 'string' ? value : undefined;
89
- }
90
- /**
91
- * Sets the name of the feature
92
- */
93
- export function setFeatureName(properties, name) {
94
- properties.name = name;
95
- }
96
- /**
97
- * Gets the description of the feature
98
- */
99
- export function getFeatureDescription(feature) {
100
- const value = feature.properties.description;
101
- return typeof value === 'string' ? value : undefined;
102
- }
103
- /**
104
- * Sets the description of the feature
105
- */
106
- export function setFeatureDescription(properties, description) {
107
- properties.description = description;
45
+ return getDrawProperty(feature, 'scale') ?? 1;
108
46
  }
109
47
  /**
110
48
  * Gets the properties of an Image feature in a type-safe way.
@@ -113,28 +51,25 @@ export function setFeatureDescription(properties, description) {
113
51
  * Use it instead of a dangerous cast such as `as unknown as ImageProperties`.
114
52
  */
115
53
  export function getImageProperties(feature) {
116
- const p = feature.properties;
117
54
  return {
118
- imageFileId: typeof p.imageFileId === 'string' ? p.imageFileId : '',
119
- imageWidth: typeof p.imageWidth === 'number' ? p.imageWidth : 0,
120
- imageHeight: typeof p.imageHeight === 'number' ? p.imageHeight : 0,
121
- createdZoom: typeof p.createdZoom === 'number' ? p.createdZoom : 0,
122
- rotation: typeof p.rotation === 'number' ? p.rotation : undefined,
123
- scale: typeof p.scale === 'number' ? p.scale : undefined,
55
+ imageFileId: getDrawProperty(feature, 'imageFileId') ?? '',
56
+ imageWidth: getDrawProperty(feature, 'imageWidth') ?? 0,
57
+ imageHeight: getDrawProperty(feature, 'imageHeight') ?? 0,
58
+ createdZoom: getDrawProperty(feature, 'createdZoom') ?? 0,
59
+ rotation: getDrawProperty(feature, 'rotation'),
60
+ scale: getDrawProperty(feature, 'scale'),
124
61
  };
125
62
  }
126
63
  /**
127
64
  * Gets the radius (meters) of a Circle feature. undefined when it is unset or invalid.
128
65
  */
129
66
  export function getCircleRadius(feature) {
130
- const value = feature.properties.radiusMeters;
131
- return typeof value === 'number' ? value : undefined;
67
+ return getDrawProperty(feature, 'radiusMeters');
132
68
  }
133
69
  /**
134
70
  * Gets the angle (degrees) of the radius handle of a Circle feature. The default is 135
135
71
  * (toward the southwest).
136
72
  */
137
73
  export function getRadiusHandleAngle(feature) {
138
- const value = feature.properties.radiusHandleAngle;
139
- return typeof value === 'number' ? value : 135;
74
+ return getDrawProperty(feature, 'radiusHandleAngle') ?? 135;
140
75
  }
@@ -7,15 +7,32 @@
7
7
  */
8
8
  export function createSnapTargetsRegistry() {
9
9
  const providers = new Map();
10
+ const narrowed = new Map();
10
11
  return {
11
- register(type, provider) {
12
+ register(type, provider, appliesTo) {
12
13
  providers.set(type, provider);
14
+ if (appliesTo)
15
+ narrowed.set(type, appliesTo);
16
+ else
17
+ narrowed.delete(type);
13
18
  return () => {
14
- if (providers.get(type) === provider)
15
- providers.delete(type);
19
+ if (providers.get(type) !== provider)
20
+ return;
21
+ providers.delete(type);
22
+ narrowed.delete(type);
16
23
  };
17
24
  },
18
25
  get: (type) => providers.get(type),
19
- clear: () => providers.clear(),
26
+ forFeature(feature) {
27
+ const provider = providers.get(feature.type);
28
+ if (!provider)
29
+ return undefined;
30
+ const appliesTo = narrowed.get(feature.type);
31
+ return appliesTo && !appliesTo(feature) ? undefined : provider;
32
+ },
33
+ clear() {
34
+ providers.clear();
35
+ narrowed.clear();
36
+ },
20
37
  };
21
38
  }
@@ -78,6 +78,17 @@ export const DEFAULT_SNAP_INDICATOR_STYLES = {
78
78
  intersection: INTERSECTION_STYLE,
79
79
  guide: GUIDE_STYLE,
80
80
  };
81
+ /**
82
+ * A look of the indicator with the defaults, which the caller may change in place
83
+ *
84
+ * @internal
85
+ */
86
+ export function createSnapIndicatorLook() {
87
+ return structuredClone({
88
+ styles: DEFAULT_SNAP_INDICATOR_STYLES,
89
+ guideLine: DEFAULT_SNAP_GUIDE_LINE_STYLE,
90
+ });
91
+ }
81
92
  /**
82
93
  * The renderer of the snapping indicator
83
94
  *
@@ -103,21 +114,17 @@ export class SnapIndicatorRenderer {
103
114
  writable: true,
104
115
  value: void 0
105
116
  });
106
- Object.defineProperty(this, "styles", {
107
- enumerable: true,
108
- configurable: true,
109
- writable: true,
110
- value: void 0
111
- });
112
- Object.defineProperty(this, "guideLineStyle", {
117
+ Object.defineProperty(this, "look", {
113
118
  enumerable: true,
114
119
  configurable: true,
115
120
  writable: true,
116
121
  value: void 0
117
122
  });
118
123
  this.snapService = deps.snapService;
119
- this.styles = { ...DEFAULT_SNAP_INDICATOR_STYLES, ...deps.styles };
120
- this.guideLineStyle = deps.guideLineStyle ?? DEFAULT_SNAP_GUIDE_LINE_STYLE;
124
+ this.look = deps.look ?? {
125
+ styles: { ...DEFAULT_SNAP_INDICATOR_STYLES, ...deps.styles },
126
+ guideLine: deps.guideLineStyle ?? DEFAULT_SNAP_GUIDE_LINE_STYLE,
127
+ };
121
128
  }
122
129
  onAdd(_gl, _map) {
123
130
  // It uses the existing drawing primitives, so it holds no GPU resources of its own
@@ -134,9 +141,11 @@ export class SnapIndicatorRenderer {
134
141
  [target.segment.start[0], target.segment.start[1]],
135
142
  [target.segment.end[0], target.segment.end[1]],
136
143
  ];
137
- context.sdfLineRenderer.draw(line, this.guideLineStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
144
+ context.sdfLineRenderer.draw(line, this.look.guideLine, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
138
145
  }
139
- const style = this.styles[target.kind];
146
+ // A kind of a provider's own is shown as a vertex
147
+ const { styles } = this.look;
148
+ const style = styles[target.kind] ?? styles.vertex;
140
149
  context.pointShapeRenderer.draw([result.lngLat.lng, result.lngLat.lat], style, zoom);
141
150
  }
142
151
  onRemove() {
@@ -18,7 +18,7 @@
18
18
  * "display x Store" are computed (Store x Store is the responsibility of
19
19
  * providers/intersection.ts).
20
20
  */
21
- import type { DatasetManager } from '../../display/manager.js';
21
+ import type { DatasetManager } from '../../dataset/manager.js';
22
22
  import { type Messages } from '../../messages.js';
23
23
  import type { SpatialIndex } from '../../store/spatial/spatial-index.js';
24
24
  import type { Store } from '../../store/store.js';
@@ -65,6 +65,11 @@ export interface DisplaySnapProviders {
65
65
  * of edges (it is wired to ModeContext.getDatasetTraceFeatures).
66
66
  */
67
67
  queryFeatures(bbox: BoundingBox): Feature[];
68
+ /** The same features as `queryFeatures`, each with the ID of its dataset */
69
+ queryRows(bbox: BoundingBox): Array<{
70
+ datasetId: string;
71
+ feature: Feature;
72
+ }>;
68
73
  }
69
74
  /**
70
75
  * Builds the snapping providers for datasets
@@ -132,7 +132,7 @@ export function createDisplaySnapProviders(deps) {
132
132
  for (const feature of queryFeatures({ store: deps.store, spatialIndex: deps.spatialIndex, snapTargets: deps.snapTargets }, bbox, ctx)) {
133
133
  // The candidates of a custom type are returned by the vertex provider
134
134
  // (getSnapTargets)
135
- if (deps.snapTargets?.get(feature.type))
135
+ if (deps.snapTargets?.forFeature(feature))
136
136
  continue;
137
137
  if (!hasSnapEdges(feature.type))
138
138
  continue;
@@ -254,6 +254,7 @@ export function createDisplaySnapProviders(deps) {
254
254
  queryFeatures(bbox) {
255
255
  return nearbyFeatures(bbox).map((entry) => entry.feature);
256
256
  },
257
+ queryRows: (bbox) => nearbyFeatures(bbox),
257
258
  getFeature(datasetId, featureId) {
258
259
  const dataset = deps.datasets.get(datasetId);
259
260
  if (!dataset) {
@@ -1,18 +1,17 @@
1
1
  import { type Messages } from '../../messages.js';
2
2
  import type { Store } from '../../store/store.js';
3
- import { type SnapProvider } from '../types.js';
4
3
  /**
5
- * The dependencies of {@link createGuideSnapProvider}.
4
+ * The dependencies of {@link createSteppedGuideSnapProvider}.
6
5
  *
7
6
  * The guides are built from the vertices committed so far in the drawing in progress, so the
8
7
  * Store alone is enough.
9
8
  */
10
9
  export interface GuideSnapProviderDeps {
11
- /** The Store of the draw instance, such as `ctx.getStore()` of a plugin */
10
+ /** The Store of the draw instance */
12
11
  store: Store;
13
12
  }
14
13
  /**
15
- * The options of {@link createGuideSnapProvider}.
14
+ * The options of {@link createSteppedGuideSnapProvider}.
16
15
  */
17
16
  export interface GuideSnapProviderOptions {
18
17
  /**
@@ -28,42 +27,3 @@ export interface GuideSnapProviderOptions {
28
27
  */
29
28
  messages?: Partial<Messages>;
30
29
  }
31
- /**
32
- * Creates a snapping provider of construction guides for `draw_line` and `draw_polygon`.
33
- *
34
- * The guides start at the last committed vertex (the anchor): the north-based guides at every
35
- * `northStepDegrees` from true north (from the first vertex on), and the extension and the
36
- * perpendiculars of the previous segment (from the second vertex on). Each guide is a
37
- * segment 4096 screen px long, returned as a candidate of kind `'guide'` whose description
38
- * comes from `messages` (`snapNorth`, `snapExtension`, `snapPerpendicular`). Outside those
39
- * two modes it returns no candidates.
40
- *
41
- * The draw instance already registers a built-in one, whose step is set with
42
- * `options.snap.guideStepDegrees` and changed at runtime with `draw.snapping.setGuideStep`.
43
- * Register another one to add guides at a second step on top of the built-in ones.
44
- *
45
- * @param deps The Store to read the drawing in progress from
46
- * @param options The step angle, the tile size and the messages
47
- * @returns A provider to pass to `draw.snapping.register`
48
- *
49
- * @example
50
- * ```ts
51
- * import { createGuideSnapProvider, type Plugin } from '@sakuzu/maplibre-gl-draw';
52
- *
53
- * // Guides every 15 degrees from north, in addition to the built-in ones
54
- * let unregister: (() => void) | undefined;
55
- * const fineGuides: Plugin = {
56
- * name: 'fine-guides',
57
- * onInstall(ctx) {
58
- * unregister = draw.snapping.register(
59
- * createGuideSnapProvider({ store: ctx.getStore() }, { northStepDegrees: 15 }),
60
- * );
61
- * },
62
- * onUninstall() {
63
- * unregister?.();
64
- * },
65
- * };
66
- * draw.addPlugin(fineGuides);
67
- * ```
68
- */
69
- export declare function createGuideSnapProvider(deps: GuideSnapProviderDeps, options?: GuideSnapProviderOptions): SnapProvider;