@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
@@ -1,378 +1,33 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
- import { createdZoomProperty, resolveCommitLayer } from './commit-layer.js';
4
- import { computeTracePath, isTraceEnabled, readTraceAnchor } from './trace-support.js';
5
- /** Tolerance for deciding a vertex click (in pixels) */
6
- const VERTEX_CLICK_TOLERANCE = 10;
3
+ import { createVertexDrawing } from './vertex-drawing.js';
7
4
  /**
8
- * DrawPolygonMode implementation
5
+ * The factory of the polygon drawing mode
9
6
  *
10
7
  * @internal
11
8
  */
12
- export class DrawPolygonMode {
13
- constructor() {
14
- Object.defineProperty(this, "modeName", {
15
- enumerable: true,
16
- configurable: true,
17
- writable: true,
18
- value: 'draw_polygon'
19
- });
20
- Object.defineProperty(this, "writesFeatures", {
21
- enumerable: true,
22
- configurable: true,
23
- writable: true,
24
- value: true
25
- });
26
- Object.defineProperty(this, "context", {
27
- enumerable: true,
28
- configurable: true,
29
- writable: true,
30
- value: void 0
31
- });
32
- Object.defineProperty(this, "coordinates", {
33
- enumerable: true,
34
- configurable: true,
35
- writable: true,
36
- value: []
37
- });
38
- Object.defineProperty(this, "isNearFirstVertex", {
39
- enumerable: true,
40
- configurable: true,
41
- writable: true,
42
- value: false
43
- });
44
- /** The redo stack (holds the undone vertices) */
45
- Object.defineProperty(this, "redoStack", {
46
- enumerable: true,
47
- configurable: true,
48
- writable: true,
49
- value: []
50
- });
51
- /** The last mouse coordinate (for displaying the dashed line on undo/redo) */
52
- Object.defineProperty(this, "lastMouseCoord", {
53
- enumerable: true,
54
- configurable: true,
55
- writable: true,
56
- value: null
57
- });
58
- /** The Feature ID that is going to be created */
59
- Object.defineProperty(this, "pendingFeatureId", {
60
- enumerable: true,
61
- configurable: true,
62
- writable: true,
63
- value: null
64
- });
65
- /**
66
- * The snap target of the previously confirmed click (the start point of the trace)
67
- *
68
- * It is reset to null for a click that did not snap and for a snap that cannot be traced.
69
- */
70
- Object.defineProperty(this, "traceAnchor", {
71
- enumerable: true,
72
- configurable: true,
73
- writable: true,
74
- value: null
75
- });
76
- /**
77
- * The trace path up to the cursor position (the unconfirmed vertices for the preview)
78
- *
79
- * They are inserted between the confirmed coordinates and the cursor point and drawn as
80
- * tentative.
81
- */
82
- Object.defineProperty(this, "tracePreview", {
83
- enumerable: true,
84
- configurable: true,
85
- writable: true,
86
- value: null
87
- });
88
- }
89
- onStart(context) {
90
- this.context = context;
91
- // Change the cursor to a crosshair
92
- this.context.map.getCanvas().style.cursor = 'crosshair';
93
- // Clear the selection (not notified as a change)
94
- this.context.store.transact(() => {
95
- this.context.store.setSelection(null, []);
96
- }, 'silent');
97
- // Reset the state
98
- this.coordinates = [];
99
- this.isNearFirstVertex = false;
100
- this.redoStack = [];
101
- this.lastMouseCoord = null;
102
- this.traceAnchor = null;
103
- this.tracePreview = null;
104
- // Generate the Feature ID in advance
105
- this.pendingFeatureId = this.context.generateFeatureId();
106
- }
107
- onStop() {
108
- // Restore the cursor
109
- this.context.map.getCanvas().style.cursor = '';
110
- // Clear the tentative state
111
- this.context.store.setTentative(null);
112
- this.coordinates = [];
113
- }
114
- /**
115
- * Called after an external state change
116
- *
117
- * Resets the state of the drawing in progress so that the next drawing operation can start
118
- * normally.
119
- */
120
- onExternalStateChange() {
121
- // Reset the state
122
- this.coordinates = [];
123
- this.redoStack = [];
124
- this.lastMouseCoord = null;
125
- this.pendingFeatureId = null;
126
- this.isNearFirstVertex = false;
127
- this.traceAnchor = null;
128
- this.tracePreview = null;
129
- // Clear the tentative state
130
- this.context.store.setTentative(null);
131
- }
132
- /**
133
- * A double click while drawing is two clicks of the drawing; it never zooms the map
134
- * (consumed by preventing its default action)
135
- */
136
- onDoubleClick(event) {
137
- event.originalEvent.preventDefault();
138
- }
139
- onClick(event) {
140
- // Complete when there are at least three points and the click is near the first vertex
141
- if (this.coordinates.length >= 3 && this.isNearFirstVertex) {
142
- this.finishPolygon();
143
- return;
9
+ export const drawPolygonMode = (ctx) => createVertexDrawing(ctx, {
10
+ minVertices: 3,
11
+ // The first vertex closes the ring
12
+ closingVertex: () => 0,
13
+ preview(vertices, pointer, closable) {
14
+ const coordinates = pointer ? [...vertices, ...pointer] : [...vertices];
15
+ if (coordinates.length < 2) {
16
+ // One vertex shows as a marker
17
+ return {
18
+ feature: { type: 'Point', geometry: { type: 'Point', coordinates: coordinates[0] } },
19
+ };
144
20
  }
145
- // Read the snap target of this click and first take in the sequence of boundary vertices
146
- // between it and the previously confirmed click (tracing)
147
- const anchor = readTraceAnchor(this.context, event);
148
- const path = computeTracePath(this.context, this.traceAnchor, anchor);
149
- if (path) {
150
- this.coordinates.push(...path);
151
- }
152
- this.traceAnchor = anchor;
153
- this.tracePreview = null;
154
- // Add the vertex
155
- const coord = [event.lngLat.lng, event.lngLat.lat];
156
- this.coordinates.push(coord);
157
- // Clear the redo stack when a new vertex is added
158
- this.redoStack = [];
159
- // Update the tentative state
160
- // Note: the redraw is triggered automatically by RenderCoordinator subscribing to Store changes
161
- this.updateTentative();
162
- }
163
- onMouseMove(event) {
164
- // Save the last mouse coordinate (for displaying the dashed line on undo/redo)
165
- this.lastMouseCoord = [event.lngLat.lng, event.lngLat.lat];
166
- // Check whether it is near the first vertex
167
- this.isNearFirstVertex = this.checkNearFirstVertex(event.point);
168
- // When the snap target of the cursor is the same feature as the previously confirmed
169
- // click, hold the path that is going to be inserted as a preview
170
- this.tracePreview = computeTracePath(this.context, this.traceAnchor, readTraceAnchor(this.context, event));
171
- // Update the cursor
172
- if (this.coordinates.length >= 3 && this.isNearFirstVertex) {
173
- this.context.map.getCanvas().style.cursor = 'pointer';
174
- }
175
- else {
176
- this.context.map.getCanvas().style.cursor = 'crosshair';
177
- }
178
- // When there is at least one vertex, display the line up to the mouse position
179
- if (this.coordinates.length > 0) {
180
- this.updateTentative(this.lastMouseCoord);
181
- }
182
- }
183
- onKeyDown(event) {
184
- if (event.key === 'Escape') {
185
- // Cancel
186
- this.cancelPolygon();
187
- }
188
- else if (event.key === 'Enter') {
189
- // Confirm
190
- this.finishPolygon();
191
- }
192
- else if (event.key === 'Backspace' || event.key === 'Delete') {
193
- // Remove the last vertex
194
- this.removeLastVertex();
195
- }
196
- }
197
- /**
198
- * The feature to prefer when snapping candidates are tied (the boundary that tracing started
199
- * along)
200
- */
201
- getSnapPreference() {
202
- if (!this.traceAnchor || !isTraceEnabled(this.context))
203
- return null;
204
21
  return {
205
- featureId: this.traceAnchor.featureId,
206
- datasetId: this.traceAnchor.datasetId,
207
- };
208
- }
209
- /**
210
- * Checks whether it is near the first vertex
211
- */
212
- checkNearFirstVertex(screenPoint) {
213
- if (this.coordinates.length === 0)
214
- return false;
215
- const firstCoord = this.coordinates[0];
216
- const firstScreenPoint = this.context.map.project(firstCoord);
217
- const dx = screenPoint.x - firstScreenPoint.x;
218
- const dy = screenPoint.y - firstScreenPoint.y;
219
- const distance = Math.sqrt(dx * dx + dy * dy);
220
- return distance <= VERTEX_CLICK_TOLERANCE;
221
- }
222
- /**
223
- * Confirms the polygon
224
- */
225
- finishPolygon() {
226
- // At least three points are required
227
- if (this.coordinates.length < 3) {
228
- return;
229
- }
230
- const { store, autoNameGenerator } = this.context;
231
- // Discard the drawing when no layer can be written any more
232
- const layerId = resolveCommitLayer(this.context);
233
- if (layerId === null)
234
- return;
235
- // Generate the automatic name
236
- const autoName = autoNameGenerator.generateName('Polygon');
237
- // Create the closed ring (append the first point at the end)
238
- const ring = [...this.coordinates, this.coordinates[0]];
239
- // Use the ID generated in advance (generate a new one if there is none)
240
- const featureId = this.pendingFeatureId ?? this.context.generateFeatureId();
241
- // Create a new polygon feature
242
- const feature = {
243
- id: featureId,
244
- type: 'Polygon',
245
- coordinates: [ring],
246
- layerId,
247
- properties: {
248
- ...createdZoomProperty(this.context),
249
- ...(autoName !== undefined && { name: autoName }),
22
+ feature: {
23
+ type: 'Polygon',
24
+ geometry: { type: 'Polygon', coordinates: [[...coordinates, coordinates[0]]] },
250
25
  },
251
- locked: false,
252
- visible: true,
26
+ options: { confirmedVertices: vertices.length, ...(closable && { highlightVertex: 0 }) },
253
27
  };
254
- // Bundle the feature creation and the selection into a single transaction
255
- // (so that both are undone at once on undo)
256
- store.transact(() => {
257
- store.createFeature(feature);
258
- // Clear the tentative state
259
- store.setTentative(null);
260
- // Select the created feature
261
- store.setSelection('feature', [feature.id]);
262
- });
263
- // Reset the state
264
- this.coordinates = [];
265
- this.isNearFirstVertex = false;
266
- this.pendingFeatureId = null;
267
- this.traceAnchor = null;
268
- this.tracePreview = null;
269
- // Return to the select mode
270
- this.context.setMode('select');
271
- }
272
- /**
273
- * Cancels the creation of the polygon
274
- */
275
- cancelPolygon() {
276
- if (this.coordinates.length > 0) {
277
- this.coordinates = [];
278
- this.pendingFeatureId = null;
279
- this.traceAnchor = null;
280
- this.tracePreview = null;
281
- this.context.store.setTentative(null);
282
- }
283
- else {
284
- // Return to the select mode if drawing is not in progress
285
- this.context.setMode('select');
286
- }
287
- }
288
- /**
289
- * Removes the last vertex
290
- */
291
- removeLastVertex() {
292
- if (this.coordinates.length > 0) {
293
- this.coordinates.pop();
294
- // A vertex removed with Backspace/Delete cannot be redone
295
- this.redoStack = [];
296
- // The previously confirmed click changes, so the start point of the trace is discarded too
297
- this.clearTrace();
298
- this.updateTentative();
299
- }
300
- }
301
- /**
302
- * Undoes a vertex while drawing
303
- */
304
- undoVertex() {
305
- if (this.coordinates.length === 0) {
306
- return false;
307
- }
308
- const removed = this.coordinates.pop();
309
- this.redoStack.push(removed);
310
- this.clearTrace();
311
- // Pass the mouse coordinate to keep the dashed line
312
- this.updateTentative(this.lastMouseCoord ?? undefined);
313
- return true;
314
- }
315
- /**
316
- * Redoes a vertex that was undone
317
- */
318
- redoVertex() {
319
- if (this.redoStack.length === 0) {
320
- return false;
321
- }
322
- const restored = this.redoStack.pop();
323
- this.coordinates.push(restored);
324
- this.clearTrace();
325
- // Pass the mouse coordinate to keep the dashed line
326
- this.updateTentative(this.lastMouseCoord ?? undefined);
327
- return true;
328
- }
329
- /**
330
- * Discards the state of the trace
331
- *
332
- * On an undo / redo of a vertex the "previously confirmed click" changes, so the snap target
333
- * that was held as the start point is not kept in use as it is.
334
- */
335
- clearTrace() {
336
- this.traceAnchor = null;
337
- this.tracePreview = null;
338
- }
339
- /**
340
- * Updates the tentative state
341
- */
342
- updateTentative(mouseCoord) {
343
- if (this.coordinates.length === 0) {
344
- this.context.store.setTentative(null);
345
- return;
346
- }
347
- // The coordinate array including the mouse position and the trace path up to it
348
- // (the confirmed ones remain the leading coordinates.length entries)
349
- const coords = mouseCoord
350
- ? [...this.coordinates, ...(this.tracePreview ?? []), mouseCoord]
351
- : [...this.coordinates];
352
- // Highlight it when the cursor is near the first vertex (only when it can be closed with
353
- // three or more points)
354
- const highlightedVertexIndex = this.coordinates.length >= 3 && this.isNearFirstVertex ? 0 : undefined;
355
- // Display it as a polygon (a closed shape) when there are at least two points
356
- if (coords.length >= 2) {
357
- // Display it as a closed ring
358
- const ring = [...coords, coords[0]];
359
- this.context.store.setTentative({
360
- type: 'Polygon',
361
- coordinates: [ring],
362
- layerId: this.context.getCurrentLayerId(),
363
- confirmedCount: this.coordinates.length, // Number of confirmed coordinates (before closing)
364
- highlightedVertexIndex,
365
- pendingFeatureId: this.pendingFeatureId ?? undefined,
366
- });
367
- }
368
- else {
369
- // Display it as a marker when there is only one point
370
- this.context.store.setTentative({
371
- type: 'Point',
372
- coordinates: coords[0],
373
- layerId: this.context.getCurrentLayerId(),
374
- pendingFeatureId: this.pendingFeatureId ?? undefined,
375
- });
376
- }
377
- }
378
- }
28
+ },
29
+ feature: (vertices) => ({
30
+ type: 'Polygon',
31
+ geometry: { type: 'Polygon', coordinates: [[...vertices, vertices[0]]] },
32
+ }),
33
+ });
@@ -1,49 +1,39 @@
1
1
  /**
2
2
  * Trace support for the drawing modes
3
3
  *
4
- * A small set of helpers, used in common by draw_line / draw_polygon, for deriving a trace
5
- * path from a snapping result. A mode does not hold a SnapService and learns about snapping
6
- * only through `getSnapResult()` of ModeContext (a port that does no more than read the most
7
- * recent snapping result).
8
- *
9
- * InputRouter passes the coordinates of click / mousemove through snapping before delivering
10
- * them to the mode, so at the time of onClick / onMouseMove the most recent readable result is
11
- * the result corresponding to the event that was just delivered. However, there are also
12
- * events delivered without going through snapping, such as `snap: false` of a synthetic input,
13
- * so the result is taken only after confirming that its coordinates match the coordinates of
14
- * the event (if they do not match, it is regarded as a stale result and ignored).
4
+ * A small set of helpers, used in common by the line and the polygon drawing modes, for
5
+ * deriving a trace path from the snapping result of an input. A mode learns about snapping only
6
+ * through `snapped` of the event it receives, so an input that was not snapped (`snap: false`
7
+ * of a synthetic input) has no target and starts no trace.
15
8
  *
16
9
  * The path itself is the shortest path of a graph assembled from the nearby edges
17
10
  * (operations/trace-graph.ts). The feature ID and the dataset ID of the snap target are
18
- * used only to resolve the exact coordinates of the endpoints (a vertex reference or the
19
- * references to both ends of an edge); whether the two points belong to the same feature does
20
- * not matter.
21
- */
22
- import type { MouseNormalizedEvent } from '../../dispatcher/types.js';
23
- import type { Coordinate, VertexRef } from '../../store/types.js';
24
- import type { ModeContext } from '../handler.js';
25
- /**
26
- * The vertex references of both ends of an edge, for when the snap was to that edge
11
+ * used only to resolve the exact coordinates of the endpoints (a vertex reference, or the two
12
+ * ends of an edge); whether the two points belong to the same feature does not matter.
13
+ *
14
+ * Everything the helpers read goes through a {@link TraceSource}, which `traceSourceOf` builds
15
+ * over the context of a mode.
27
16
  */
28
- export interface TraceAnchorSegment {
29
- /** The vertex reference of the start point of the edge */
30
- startRef: VertexRef;
31
- /** The vertex reference of the end point of the edge */
32
- endRef: VertexRef;
33
- }
17
+ import type { Geometry } from 'geojson';
18
+ import type { ModeContext } from '../../api/extension/context.js';
19
+ import type { DrawPointerEvent } from '../../api/extension/mode.js';
20
+ import type { BoundingBox, Coordinate, Feature, VertexRef } from '../../store/types.js';
34
21
  /**
35
22
  * An endpoint of a trace (the snap target of a single click)
36
23
  *
37
24
  * It has either vertex (snapped to a vertex) or segment (snapped to an edge). An endpoint that
38
- * has neither (a snap to a guide or to an intersection without references) cannot be traced.
25
+ * has neither (a snap to a guide or to an intersection) cannot be traced.
39
26
  */
40
27
  export interface TraceAnchorEndpoint {
41
28
  /** The coordinate decided by snapping (including a point in the middle of an edge) */
42
29
  coordinate: Coordinate;
43
30
  /** When snapped to a vertex, that vertex reference */
44
31
  vertex?: VertexRef;
45
- /** When snapped to an edge, the vertex references of both ends of that edge */
46
- segment?: TraceAnchorSegment;
32
+ /** When snapped to an edge, the two ends of that edge */
33
+ segment?: {
34
+ start: Coordinate;
35
+ end: Coordinate;
36
+ };
47
37
  }
48
38
  /**
49
39
  * The snap target that becomes the start point or the end point of a trace
@@ -57,16 +47,33 @@ export interface TraceAnchor {
57
47
  endpoint: TraceAnchorEndpoint;
58
48
  }
59
49
  /**
60
- * Whether tracing is enabled (if there is no configuration, it is regarded as enabled)
50
+ * What tracing reads: whether it is on, the snapping tolerance and the zoom, the geometry of a
51
+ * snap target, and the features the graph is built from
52
+ */
53
+ export interface TraceSource {
54
+ /** Whether tracing is on */
55
+ isEnabled(): boolean;
56
+ /** The snapping tolerance, in pixels */
57
+ tolerancePx(): number;
58
+ /** The zoom of the map */
59
+ zoom(): number;
60
+ /** The geometry of the feature or the row a snap target names, or null */
61
+ geometryOf(anchor: TraceAnchor): Geometry | null;
62
+ /** The visible features of the document and the rows of the datasets within an extent */
63
+ features(bbox: BoundingBox): Feature[];
64
+ }
65
+ /**
66
+ * The trace source over the context of a mode: the options of the instance, the features of
67
+ * the document by extent and the rows of the datasets to trace along
61
68
  */
62
- export declare function isTraceEnabled(context: ModeContext): boolean;
69
+ export declare function traceSourceOf(ctx: ModeContext): TraceSource;
63
70
  /**
64
- * Reads the snap target of the event that was just delivered as an endpoint of a trace
71
+ * Reads the snap target of an input as an endpoint of a trace
65
72
  *
66
- * Returns null for snaps that cannot be used for tracing (a guide, an intersection without
67
- * vertex references, an external candidate without a feature ID) and when nothing was snapped.
73
+ * Returns null for snaps that cannot be used for tracing (a guide, an intersection, an
74
+ * external candidate without a feature ID), when nothing was snapped, and when tracing is off.
68
75
  */
69
- export declare function readTraceAnchor(context: ModeContext, event: MouseNormalizedEvent): TraceAnchor | null;
76
+ export declare function readTraceAnchor(source: TraceSource, event: DrawPointerEvent): TraceAnchor | null;
70
77
  /**
71
78
  * Derives the path between the previous confirmed click and the current snap target
72
79
  *
@@ -76,4 +83,4 @@ export declare function readTraceAnchor(context: ModeContext, event: MouseNormal
76
83
  * shared vertex. Returns null when the two ends are not connected or when an endpoint cannot
77
84
  * be resolved (the caller then treats it as a straight line).
78
85
  */
79
- export declare function computeTracePath(context: ModeContext, from: TraceAnchor | null, to: TraceAnchor | null): Coordinate[] | null;
86
+ export declare function computeTracePath(source: TraceSource, from: TraceAnchor | null, to: TraceAnchor | null): Coordinate[] | null;