@sakuzu/maplibre-gl-draw 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/LICENSE +661 -0
  3. package/README.ja.md +248 -0
  4. package/README.md +255 -0
  5. package/THIRD_PARTY_NOTICES.md +275 -0
  6. package/dist/api/api.d.ts +1259 -0
  7. package/dist/api/api.js +86 -0
  8. package/dist/api/context.d.ts +173 -0
  9. package/dist/api/context.js +193 -0
  10. package/dist/api/display-api.d.ts +1 -0
  11. package/dist/api/display-api.js +23 -0
  12. package/dist/api/event-api.d.ts +13 -0
  13. package/dist/api/event-api.js +17 -0
  14. package/dist/api/extension-api.d.ts +46 -0
  15. package/dist/api/extension-api.js +85 -0
  16. package/dist/api/feature-api.d.ts +11 -0
  17. package/dist/api/feature-api.js +101 -0
  18. package/dist/api/geometry/apply.d.ts +51 -0
  19. package/dist/api/geometry/apply.js +114 -0
  20. package/dist/api/geometry/boolean.d.ts +28 -0
  21. package/dist/api/geometry/boolean.js +65 -0
  22. package/dist/api/geometry/buffer.d.ts +11 -0
  23. package/dist/api/geometry/buffer.js +105 -0
  24. package/dist/api/geometry/split.d.ts +16 -0
  25. package/dist/api/geometry/split.js +75 -0
  26. package/dist/api/geometry/targets.d.ts +76 -0
  27. package/dist/api/geometry/targets.js +158 -0
  28. package/dist/api/geometry/types.d.ts +31 -0
  29. package/dist/api/geometry/types.js +3 -0
  30. package/dist/api/geometry-operations.d.ts +162 -0
  31. package/dist/api/geometry-operations.js +94 -0
  32. package/dist/api/group-api.d.ts +10 -0
  33. package/dist/api/group-api.js +78 -0
  34. package/dist/api/import-export/constants.d.ts +29 -0
  35. package/dist/api/import-export/constants.js +40 -0
  36. package/dist/api/import-export/embedded-file.d.ts +13 -0
  37. package/dist/api/import-export/embedded-file.js +31 -0
  38. package/dist/api/import-export/file-name.d.ts +10 -0
  39. package/dist/api/import-export/file-name.js +20 -0
  40. package/dist/api/import-export/format-detection.d.ts +12 -0
  41. package/dist/api/import-export/format-detection.js +29 -0
  42. package/dist/api/import-export/geojson-export.d.ts +19 -0
  43. package/dist/api/import-export/geojson-export.js +262 -0
  44. package/dist/api/import-export/geojson-import.d.ts +34 -0
  45. package/dist/api/import-export/geojson-import.js +538 -0
  46. package/dist/api/import-export/geometry-validation.d.ts +20 -0
  47. package/dist/api/import-export/geometry-validation.js +107 -0
  48. package/dist/api/import-export/image-import.d.ts +12 -0
  49. package/dist/api/import-export/image-import.js +53 -0
  50. package/dist/api/import-export/index.d.ts +9 -0
  51. package/dist/api/import-export/index.js +107 -0
  52. package/dist/api/import-export/native-format.d.ts +15 -0
  53. package/dist/api/import-export/native-format.js +126 -0
  54. package/dist/api/import-export/native-validation.d.ts +28 -0
  55. package/dist/api/import-export/native-validation.js +212 -0
  56. package/dist/api/import-export/own-property.d.ts +10 -0
  57. package/dist/api/import-export/own-property.js +19 -0
  58. package/dist/api/import-export/style-validation.d.ts +27 -0
  59. package/dist/api/import-export/style-validation.js +49 -0
  60. package/dist/api/import-export/types.d.ts +26 -0
  61. package/dist/api/import-export/types.js +3 -0
  62. package/dist/api/index.d.ts +15 -0
  63. package/dist/api/index.js +3 -0
  64. package/dist/api/input-api.d.ts +158 -0
  65. package/dist/api/input-api.js +144 -0
  66. package/dist/api/instance-api.d.ts +38 -0
  67. package/dist/api/instance-api.js +136 -0
  68. package/dist/api/layer-api.d.ts +12 -0
  69. package/dist/api/layer-api.js +62 -0
  70. package/dist/api/selection-api.d.ts +7 -0
  71. package/dist/api/selection-api.js +78 -0
  72. package/dist/api/snapping-api.d.ts +125 -0
  73. package/dist/api/snapping-api.js +50 -0
  74. package/dist/api/topology-api.d.ts +30 -0
  75. package/dist/api/topology-api.js +16 -0
  76. package/dist/api/tracing-api.d.ts +31 -0
  77. package/dist/api/tracing-api.js +16 -0
  78. package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
  79. package/dist/dispatcher/hit-test/box-strategies.js +275 -0
  80. package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
  81. package/dist/dispatcher/hit-test/box-strategy.js +37 -0
  82. package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
  83. package/dist/dispatcher/hit-test/globe-shape.js +70 -0
  84. package/dist/dispatcher/hit-test/index.d.ts +14 -0
  85. package/dist/dispatcher/hit-test/index.js +9 -0
  86. package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
  87. package/dist/dispatcher/hit-test/local-frame.js +112 -0
  88. package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
  89. package/dist/dispatcher/hit-test/segment-grid.js +79 -0
  90. package/dist/dispatcher/hit-test/service.d.ts +120 -0
  91. package/dist/dispatcher/hit-test/service.js +333 -0
  92. package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
  93. package/dist/dispatcher/hit-test/strategies/base.js +66 -0
  94. package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
  95. package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
  96. package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
  97. package/dist/dispatcher/hit-test/strategies/image.js +115 -0
  98. package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
  99. package/dist/dispatcher/hit-test/strategies/index.js +10 -0
  100. package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
  101. package/dist/dispatcher/hit-test/strategies/line.js +30 -0
  102. package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
  103. package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
  104. package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
  105. package/dist/dispatcher/hit-test/strategies/point.js +29 -0
  106. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
  107. package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
  108. package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
  109. package/dist/dispatcher/hit-test/topmost.js +157 -0
  110. package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
  111. package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
  112. package/dist/dispatcher/index.d.ts +15 -0
  113. package/dist/dispatcher/index.js +3 -0
  114. package/dist/dispatcher/input-router.d.ts +1 -0
  115. package/dist/dispatcher/input-router.js +288 -0
  116. package/dist/dispatcher/normalizer.d.ts +1 -0
  117. package/dist/dispatcher/normalizer.js +513 -0
  118. package/dist/dispatcher/types.d.ts +144 -0
  119. package/dist/dispatcher/types.js +15 -0
  120. package/dist/display/chunk-set.d.ts +24 -0
  121. package/dist/display/chunk-set.js +533 -0
  122. package/dist/display/chunk.d.ts +1 -0
  123. package/dist/display/chunk.js +104 -0
  124. package/dist/display/columnar/index.d.ts +12 -0
  125. package/dist/display/columnar/index.js +13 -0
  126. package/dist/display/columnar/prepare.d.ts +42 -0
  127. package/dist/display/columnar/prepare.js +116 -0
  128. package/dist/display/columnar/source.d.ts +1 -0
  129. package/dist/display/columnar/source.js +531 -0
  130. package/dist/display/columnar/table.d.ts +1 -0
  131. package/dist/display/columnar/table.js +471 -0
  132. package/dist/display/columnar/types.d.ts +223 -0
  133. package/dist/display/columnar/types.js +3 -0
  134. package/dist/display/dataset.d.ts +2 -0
  135. package/dist/display/dataset.js +891 -0
  136. package/dist/display/index.d.ts +13 -0
  137. package/dist/display/index.js +3 -0
  138. package/dist/display/interaction.d.ts +1 -0
  139. package/dist/display/interaction.js +90 -0
  140. package/dist/display/manager.d.ts +1 -0
  141. package/dist/display/manager.js +440 -0
  142. package/dist/display/packed-rtree.d.ts +1 -0
  143. package/dist/display/packed-rtree.js +244 -0
  144. package/dist/display/partition.d.ts +1 -0
  145. package/dist/display/partition.js +226 -0
  146. package/dist/display/provider.d.ts +1 -0
  147. package/dist/display/provider.js +342 -0
  148. package/dist/display/retained.d.ts +40 -0
  149. package/dist/display/retained.js +898 -0
  150. package/dist/display/selection.d.ts +13 -0
  151. package/dist/display/selection.js +226 -0
  152. package/dist/display/source.d.ts +1 -0
  153. package/dist/display/source.js +119 -0
  154. package/dist/display/spatial.d.ts +1 -0
  155. package/dist/display/spatial.js +71 -0
  156. package/dist/display/style.d.ts +1 -0
  157. package/dist/display/style.js +126 -0
  158. package/dist/display/thinning.d.ts +65 -0
  159. package/dist/display/thinning.js +910 -0
  160. package/dist/display/triangulation.d.ts +1 -0
  161. package/dist/display/triangulation.js +0 -0
  162. package/dist/display/types.d.ts +561 -0
  163. package/dist/display/types.js +43 -0
  164. package/dist/extension/feature-handler.d.ts +182 -0
  165. package/dist/extension/feature-handler.js +3 -0
  166. package/dist/extension/index.d.ts +9 -0
  167. package/dist/extension/index.js +3 -0
  168. package/dist/extension/renderers.d.ts +208 -0
  169. package/dist/extension/renderers.js +3 -0
  170. package/dist/geometry/angle.d.ts +47 -0
  171. package/dist/geometry/angle.js +44 -0
  172. package/dist/geometry/bbox.d.ts +48 -0
  173. package/dist/geometry/bbox.js +83 -0
  174. package/dist/geometry/boolean.d.ts +162 -0
  175. package/dist/geometry/boolean.js +331 -0
  176. package/dist/geometry/buffer.d.ts +72 -0
  177. package/dist/geometry/buffer.js +218 -0
  178. package/dist/geometry/circle.d.ts +55 -0
  179. package/dist/geometry/circle.js +107 -0
  180. package/dist/geometry/coords.d.ts +97 -0
  181. package/dist/geometry/coords.js +149 -0
  182. package/dist/geometry/distance.d.ts +79 -0
  183. package/dist/geometry/distance.js +111 -0
  184. package/dist/geometry/errors.d.ts +74 -0
  185. package/dist/geometry/errors.js +104 -0
  186. package/dist/geometry/index.d.ts +28 -0
  187. package/dist/geometry/index.js +38 -0
  188. package/dist/geometry/measure.d.ts +81 -0
  189. package/dist/geometry/measure.js +236 -0
  190. package/dist/geometry/predicates.d.ts +62 -0
  191. package/dist/geometry/predicates.js +132 -0
  192. package/dist/geometry/simplify.d.ts +74 -0
  193. package/dist/geometry/simplify.js +159 -0
  194. package/dist/geometry/split.d.ts +68 -0
  195. package/dist/geometry/split.js +430 -0
  196. package/dist/geometry/types.d.ts +95 -0
  197. package/dist/geometry/types.js +3 -0
  198. package/dist/geometry/units.d.ts +35 -0
  199. package/dist/geometry/units.js +41 -0
  200. package/dist/index.d.ts +72 -0
  201. package/dist/index.js +20 -0
  202. package/dist/maplibre-gl-draw.d.ts +47 -0
  203. package/dist/maplibre-gl-draw.js +407 -0
  204. package/dist/messages.d.ts +64 -0
  205. package/dist/messages.js +36 -0
  206. package/dist/modes/cursor.d.ts +1 -0
  207. package/dist/modes/cursor.js +72 -0
  208. package/dist/modes/draw/circle.d.ts +1 -0
  209. package/dist/modes/draw/circle.js +222 -0
  210. package/dist/modes/draw/commit-layer.d.ts +26 -0
  211. package/dist/modes/draw/commit-layer.js +31 -0
  212. package/dist/modes/draw/freehand.d.ts +1 -0
  213. package/dist/modes/draw/freehand.js +264 -0
  214. package/dist/modes/draw/image.d.ts +1 -0
  215. package/dist/modes/draw/image.js +60 -0
  216. package/dist/modes/draw/index.d.ts +9 -0
  217. package/dist/modes/draw/index.js +11 -0
  218. package/dist/modes/draw/line.d.ts +1 -0
  219. package/dist/modes/draw/line.js +363 -0
  220. package/dist/modes/draw/point.d.ts +1 -0
  221. package/dist/modes/draw/point.js +87 -0
  222. package/dist/modes/draw/polygon.d.ts +1 -0
  223. package/dist/modes/draw/polygon.js +378 -0
  224. package/dist/modes/draw/trace-support.d.ts +79 -0
  225. package/dist/modes/draw/trace-support.js +161 -0
  226. package/dist/modes/handler.d.ts +285 -0
  227. package/dist/modes/handler.js +3 -0
  228. package/dist/modes/index.d.ts +7 -0
  229. package/dist/modes/index.js +3 -0
  230. package/dist/modes/manager.d.ts +15 -0
  231. package/dist/modes/manager.js +196 -0
  232. package/dist/modes/select/box-selection.d.ts +52 -0
  233. package/dist/modes/select/box-selection.js +140 -0
  234. package/dist/modes/select/click-handler.d.ts +32 -0
  235. package/dist/modes/select/click-handler.js +166 -0
  236. package/dist/modes/select/cursor-handler.d.ts +15 -0
  237. package/dist/modes/select/cursor-handler.js +59 -0
  238. package/dist/modes/select/drag/auxiliary.d.ts +26 -0
  239. package/dist/modes/select/drag/auxiliary.js +56 -0
  240. package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
  241. package/dist/modes/select/drag/intermediate-writes.js +171 -0
  242. package/dist/modes/select/drag/move.d.ts +24 -0
  243. package/dist/modes/select/drag/move.js +59 -0
  244. package/dist/modes/select/drag/operation.d.ts +30 -0
  245. package/dist/modes/select/drag/operation.js +18 -0
  246. package/dist/modes/select/drag/radius.d.ts +15 -0
  247. package/dist/modes/select/drag/radius.js +49 -0
  248. package/dist/modes/select/drag/transform.d.ts +17 -0
  249. package/dist/modes/select/drag/transform.js +155 -0
  250. package/dist/modes/select/drag/vertex.d.ts +17 -0
  251. package/dist/modes/select/drag/vertex.js +163 -0
  252. package/dist/modes/select/drag-handler.d.ts +1 -0
  253. package/dist/modes/select/drag-handler.js +254 -0
  254. package/dist/modes/select/hit-helpers.d.ts +40 -0
  255. package/dist/modes/select/hit-helpers.js +51 -0
  256. package/dist/modes/select/mode.d.ts +1 -0
  257. package/dist/modes/select/mode.js +397 -0
  258. package/dist/modes/select/shortcut-handler.d.ts +40 -0
  259. package/dist/modes/select/shortcut-handler.js +128 -0
  260. package/dist/operations/index.d.ts +9 -0
  261. package/dist/operations/index.js +3 -0
  262. package/dist/operations/layer-operations.d.ts +1 -0
  263. package/dist/operations/layer-operations.js +350 -0
  264. package/dist/operations/resize.d.ts +71 -0
  265. package/dist/operations/resize.js +252 -0
  266. package/dist/operations/rotate.d.ts +17 -0
  267. package/dist/operations/rotate.js +166 -0
  268. package/dist/operations/selection-operations.d.ts +20 -0
  269. package/dist/operations/selection-operations.js +159 -0
  270. package/dist/operations/shared-vertex.d.ts +1 -0
  271. package/dist/operations/shared-vertex.js +210 -0
  272. package/dist/operations/trace-graph.d.ts +96 -0
  273. package/dist/operations/trace-graph.js +283 -0
  274. package/dist/operations/vertex.d.ts +1 -0
  275. package/dist/operations/vertex.js +538 -0
  276. package/dist/plugins/index.d.ts +10 -0
  277. package/dist/plugins/index.js +3 -0
  278. package/dist/plugins/mutation-hooks.d.ts +28 -0
  279. package/dist/plugins/mutation-hooks.js +84 -0
  280. package/dist/plugins/plugin-context.d.ts +1 -0
  281. package/dist/plugins/plugin-context.js +367 -0
  282. package/dist/plugins/plugin-manager.d.ts +103 -0
  283. package/dist/plugins/plugin-manager.js +316 -0
  284. package/dist/plugins/plugin.d.ts +529 -0
  285. package/dist/plugins/plugin.js +3 -0
  286. package/dist/shared/config/constants.d.ts +66 -0
  287. package/dist/shared/config/constants.js +60 -0
  288. package/dist/shared/config/feature-style.d.ts +155 -0
  289. package/dist/shared/config/feature-style.js +154 -0
  290. package/dist/shared/config/index.d.ts +17 -0
  291. package/dist/shared/config/index.js +8 -0
  292. package/dist/shared/config/rendering.d.ts +107 -0
  293. package/dist/shared/config/rendering.js +33 -0
  294. package/dist/shared/config/selection-highlight.d.ts +29 -0
  295. package/dist/shared/config/selection-highlight.js +35 -0
  296. package/dist/shared/config/selection.d.ts +273 -0
  297. package/dist/shared/config/selection.js +266 -0
  298. package/dist/shared/config/topology.d.ts +33 -0
  299. package/dist/shared/config/topology.js +17 -0
  300. package/dist/shared/config/trace.d.ts +40 -0
  301. package/dist/shared/config/trace.js +17 -0
  302. package/dist/shared/math/angle.d.ts +21 -0
  303. package/dist/shared/math/angle.js +34 -0
  304. package/dist/shared/math/circle.d.ts +6 -0
  305. package/dist/shared/math/circle.js +10 -0
  306. package/dist/shared/math/constants.d.ts +48 -0
  307. package/dist/shared/math/constants.js +59 -0
  308. package/dist/shared/math/distance.d.ts +78 -0
  309. package/dist/shared/math/distance.js +147 -0
  310. package/dist/shared/math/globe-subdivision.d.ts +62 -0
  311. package/dist/shared/math/globe-subdivision.js +99 -0
  312. package/dist/shared/math/index.d.ts +17 -0
  313. package/dist/shared/math/index.js +21 -0
  314. package/dist/shared/math/intersection.d.ts +63 -0
  315. package/dist/shared/math/intersection.js +236 -0
  316. package/dist/shared/math/longitude.d.ts +20 -0
  317. package/dist/shared/math/longitude.js +31 -0
  318. package/dist/shared/math/mercator-plane.d.ts +27 -0
  319. package/dist/shared/math/mercator-plane.js +26 -0
  320. package/dist/shared/math/obb.d.ts +65 -0
  321. package/dist/shared/math/obb.js +107 -0
  322. package/dist/shared/math/rotation.d.ts +93 -0
  323. package/dist/shared/math/rotation.js +186 -0
  324. package/dist/shared/math/segment-grid.d.ts +69 -0
  325. package/dist/shared/math/segment-grid.js +159 -0
  326. package/dist/shared/math/transform.d.ts +140 -0
  327. package/dist/shared/math/transform.js +189 -0
  328. package/dist/shared/types/events.d.ts +128 -0
  329. package/dist/shared/types/events.js +3 -0
  330. package/dist/shared/types/model.d.ts +950 -0
  331. package/dist/shared/types/model.js +3 -0
  332. package/dist/shared/types/selection-box.d.ts +23 -0
  333. package/dist/shared/types/selection-box.js +3 -0
  334. package/dist/shared/types/style.d.ts +68 -0
  335. package/dist/shared/types/style.js +3 -0
  336. package/dist/shared/utils/color.d.ts +49 -0
  337. package/dist/shared/utils/color.js +180 -0
  338. package/dist/shared/utils/coordinates.d.ts +52 -0
  339. package/dist/shared/utils/coordinates.js +75 -0
  340. package/dist/shared/utils/embedded-image.d.ts +34 -0
  341. package/dist/shared/utils/embedded-image.js +161 -0
  342. package/dist/shared/utils/event-emitter.d.ts +262 -0
  343. package/dist/shared/utils/event-emitter.js +44 -0
  344. package/dist/shared/utils/feature-bbox.d.ts +8 -0
  345. package/dist/shared/utils/feature-bbox.js +207 -0
  346. package/dist/shared/utils/feature-segments.d.ts +23 -0
  347. package/dist/shared/utils/feature-segments.js +179 -0
  348. package/dist/shared/utils/id.d.ts +1 -0
  349. package/dist/shared/utils/id.js +35 -0
  350. package/dist/shared/utils/image.d.ts +34 -0
  351. package/dist/shared/utils/image.js +106 -0
  352. package/dist/shared/utils/index.d.ts +15 -0
  353. package/dist/shared/utils/index.js +24 -0
  354. package/dist/shared/utils/map.d.ts +26 -0
  355. package/dist/shared/utils/map.js +35 -0
  356. package/dist/shared/utils/name-generator.d.ts +197 -0
  357. package/dist/shared/utils/name-generator.js +337 -0
  358. package/dist/shared/utils/pixel-ratio.d.ts +111 -0
  359. package/dist/shared/utils/pixel-ratio.js +85 -0
  360. package/dist/shared/utils/property.d.ts +88 -0
  361. package/dist/shared/utils/property.js +140 -0
  362. package/dist/shared/utils/vertex-ref.d.ts +23 -0
  363. package/dist/shared/utils/vertex-ref.js +20 -0
  364. package/dist/snapping/custom-targets.d.ts +1 -0
  365. package/dist/snapping/custom-targets.js +21 -0
  366. package/dist/snapping/geometry.d.ts +1 -0
  367. package/dist/snapping/geometry.js +61 -0
  368. package/dist/snapping/index.d.ts +14 -0
  369. package/dist/snapping/index.js +4 -0
  370. package/dist/snapping/indicator.d.ts +19 -0
  371. package/dist/snapping/indicator.js +145 -0
  372. package/dist/snapping/providers/display.d.ts +72 -0
  373. package/dist/snapping/providers/display.js +268 -0
  374. package/dist/snapping/providers/guide.d.ts +69 -0
  375. package/dist/snapping/providers/guide.js +187 -0
  376. package/dist/snapping/providers/intersection.d.ts +1 -0
  377. package/dist/snapping/providers/intersection.js +92 -0
  378. package/dist/snapping/providers/shared.d.ts +39 -0
  379. package/dist/snapping/providers/shared.js +146 -0
  380. package/dist/snapping/providers/store.d.ts +1 -0
  381. package/dist/snapping/providers/store.js +132 -0
  382. package/dist/snapping/service.d.ts +1 -0
  383. package/dist/snapping/service.js +272 -0
  384. package/dist/snapping/types.d.ts +267 -0
  385. package/dist/snapping/types.js +66 -0
  386. package/dist/store/change-merger.d.ts +1 -0
  387. package/dist/store/change-merger.js +102 -0
  388. package/dist/store/draw-store.d.ts +1 -0
  389. package/dist/store/draw-store.js +396 -0
  390. package/dist/store/event-bridge.d.ts +1 -0
  391. package/dist/store/event-bridge.js +161 -0
  392. package/dist/store/index.d.ts +12 -0
  393. package/dist/store/index.js +4 -0
  394. package/dist/store/local-visibility.d.ts +21 -0
  395. package/dist/store/local-visibility.js +27 -0
  396. package/dist/store/lock.d.ts +67 -0
  397. package/dist/store/lock.js +54 -0
  398. package/dist/store/memory/change-bus.d.ts +60 -0
  399. package/dist/store/memory/change-bus.js +232 -0
  400. package/dist/store/memory/file-store.d.ts +15 -0
  401. package/dist/store/memory/file-store.js +33 -0
  402. package/dist/store/memory/frozen.d.ts +21 -0
  403. package/dist/store/memory/frozen.js +51 -0
  404. package/dist/store/memory/ui-state.d.ts +51 -0
  405. package/dist/store/memory/ui-state.js +223 -0
  406. package/dist/store/memory.d.ts +26 -0
  407. package/dist/store/memory.js +708 -0
  408. package/dist/store/spatial/index.d.ts +6 -0
  409. package/dist/store/spatial/index.js +4 -0
  410. package/dist/store/spatial/spatial-index.d.ts +90 -0
  411. package/dist/store/spatial/spatial-index.js +148 -0
  412. package/dist/store/spatial/store-spatial-index.d.ts +60 -0
  413. package/dist/store/spatial/store-spatial-index.js +125 -0
  414. package/dist/store/store.d.ts +417 -0
  415. package/dist/store/store.js +3 -0
  416. package/dist/store/types.d.ts +8 -0
  417. package/dist/store/types.js +3 -0
  418. package/dist/store/writable-layer.d.ts +35 -0
  419. package/dist/store/writable-layer.js +20 -0
  420. package/dist/view/cache/buffer.d.ts +28 -0
  421. package/dist/view/cache/buffer.js +176 -0
  422. package/dist/view/cache/earcut.d.ts +1 -0
  423. package/dist/view/cache/earcut.js +122 -0
  424. package/dist/view/cache/style-rule.d.ts +1 -0
  425. package/dist/view/cache/style-rule.js +97 -0
  426. package/dist/view/cache/terrain-fill.d.ts +30 -0
  427. package/dist/view/cache/terrain-fill.js +60 -0
  428. package/dist/view/cache/texture.d.ts +14 -0
  429. package/dist/view/cache/texture.js +292 -0
  430. package/dist/view/coordinator.d.ts +27 -0
  431. package/dist/view/coordinator.js +72 -0
  432. package/dist/view/feature-companion.d.ts +173 -0
  433. package/dist/view/feature-companion.js +108 -0
  434. package/dist/view/globe-subdivision.d.ts +78 -0
  435. package/dist/view/globe-subdivision.js +128 -0
  436. package/dist/view/index.d.ts +47 -0
  437. package/dist/view/index.js +20 -0
  438. package/dist/view/layer/attach.d.ts +20 -0
  439. package/dist/view/layer/attach.js +47 -0
  440. package/dist/view/layer/blend.d.ts +57 -0
  441. package/dist/view/layer/blend.js +14 -0
  442. package/dist/view/layer/custom-layer.d.ts +1 -0
  443. package/dist/view/layer/custom-layer.js +509 -0
  444. package/dist/view/layer/depth-state.d.ts +14 -0
  445. package/dist/view/layer/depth-state.js +44 -0
  446. package/dist/view/layer/display-list.d.ts +1 -0
  447. package/dist/view/layer/display-list.js +111 -0
  448. package/dist/view/layer/drape-planner.d.ts +139 -0
  449. package/dist/view/layer/drape-planner.js +726 -0
  450. package/dist/view/layer/frame-render.d.ts +57 -0
  451. package/dist/view/layer/frame-render.js +209 -0
  452. package/dist/view/layer/frame-state.d.ts +147 -0
  453. package/dist/view/layer/frame-state.js +484 -0
  454. package/dist/view/layer/gl-state.d.ts +77 -0
  455. package/dist/view/layer/gl-state.js +132 -0
  456. package/dist/view/layer/index.d.ts +6 -0
  457. package/dist/view/layer/index.js +5 -0
  458. package/dist/view/layer/render-scope.d.ts +30 -0
  459. package/dist/view/layer/render-scope.js +28 -0
  460. package/dist/view/layer/render.d.ts +87 -0
  461. package/dist/view/layer/render.js +187 -0
  462. package/dist/view/layer/renderers.d.ts +81 -0
  463. package/dist/view/layer/renderers.js +142 -0
  464. package/dist/view/layer/slot-manager.d.ts +26 -0
  465. package/dist/view/layer/slot-manager.js +133 -0
  466. package/dist/view/layer/slots.d.ts +33 -0
  467. package/dist/view/layer/slots.js +50 -0
  468. package/dist/view/layer/store-retained-bbox.d.ts +36 -0
  469. package/dist/view/layer/store-retained-bbox.js +188 -0
  470. package/dist/view/layer/store-retained-chunk.d.ts +97 -0
  471. package/dist/view/layer/store-retained-chunk.js +94 -0
  472. package/dist/view/layer/store-retained-classify.d.ts +34 -0
  473. package/dist/view/layer/store-retained-classify.js +88 -0
  474. package/dist/view/layer/store-retained-collect.d.ts +24 -0
  475. package/dist/view/layer/store-retained-collect.js +121 -0
  476. package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
  477. package/dist/view/layer/store-retained-coord-patch.js +168 -0
  478. package/dist/view/layer/store-retained-immediate.d.ts +63 -0
  479. package/dist/view/layer/store-retained-immediate.js +49 -0
  480. package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
  481. package/dist/view/layer/store-retained-invalidation.js +192 -0
  482. package/dist/view/layer/store-retained.d.ts +198 -0
  483. package/dist/view/layer/store-retained.js +430 -0
  484. package/dist/view/layer/terrain-resolver.d.ts +1 -0
  485. package/dist/view/layer/terrain-resolver.js +174 -0
  486. package/dist/view/renderers/batch-manager.d.ts +61 -0
  487. package/dist/view/renderers/batch-manager.js +718 -0
  488. package/dist/view/renderers/draw-factors.d.ts +60 -0
  489. package/dist/view/renderers/draw-factors.js +35 -0
  490. package/dist/view/renderers/drawer.d.ts +1 -0
  491. package/dist/view/renderers/drawer.js +346 -0
  492. package/dist/view/renderers/image.d.ts +1 -0
  493. package/dist/view/renderers/image.js +255 -0
  494. package/dist/view/renderers/line/dash.d.ts +31 -0
  495. package/dist/view/renderers/line/dash.js +152 -0
  496. package/dist/view/renderers/line/line-geometry.d.ts +39 -0
  497. package/dist/view/renderers/line/line-geometry.js +460 -0
  498. package/dist/view/renderers/line/line-gl.d.ts +1 -0
  499. package/dist/view/renderers/line/line-gl.js +236 -0
  500. package/dist/view/renderers/line/line-shader.d.ts +1 -0
  501. package/dist/view/renderers/line/line-shader.js +364 -0
  502. package/dist/view/renderers/line/line-types.d.ts +43 -0
  503. package/dist/view/renderers/line/line-types.js +3 -0
  504. package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
  505. package/dist/view/renderers/line/line-uniforms.js +390 -0
  506. package/dist/view/renderers/line/sdf-line.d.ts +92 -0
  507. package/dist/view/renderers/line/sdf-line.js +567 -0
  508. package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
  509. package/dist/view/renderers/point/billboard-depth.js +56 -0
  510. package/dist/view/renderers/point/point-instance.d.ts +124 -0
  511. package/dist/view/renderers/point/point-instance.js +738 -0
  512. package/dist/view/renderers/point/point-sdf.d.ts +58 -0
  513. package/dist/view/renderers/point/point-sdf.js +170 -0
  514. package/dist/view/renderers/point/point-shape.d.ts +99 -0
  515. package/dist/view/renderers/point/point-shape.js +504 -0
  516. package/dist/view/renderers/point/point-style.d.ts +1 -0
  517. package/dist/view/renderers/point/point-style.js +46 -0
  518. package/dist/view/renderers/polygon/batch.d.ts +26 -0
  519. package/dist/view/renderers/polygon/batch.js +336 -0
  520. package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
  521. package/dist/view/renderers/polygon/earcut-input.js +55 -0
  522. package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
  523. package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
  524. package/dist/view/renderers/polygon/fill.d.ts +74 -0
  525. package/dist/view/renderers/polygon/fill.js +251 -0
  526. package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
  527. package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
  528. package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
  529. package/dist/view/renderers/polygon/terrain-cull.js +14 -0
  530. package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
  531. package/dist/view/renderers/polygon/triangulator.js +3 -0
  532. package/dist/view/renderers/retained.d.ts +43 -0
  533. package/dist/view/renderers/retained.js +3 -0
  534. package/dist/view/renderers/stroke.d.ts +121 -0
  535. package/dist/view/renderers/stroke.js +621 -0
  536. package/dist/view/shaders/frame.d.ts +8 -0
  537. package/dist/view/shaders/frame.js +37 -0
  538. package/dist/view/shaders/helpers.d.ts +238 -0
  539. package/dist/view/shaders/helpers.js +611 -0
  540. package/dist/view/shaders/initializer.d.ts +27 -0
  541. package/dist/view/shaders/initializer.js +125 -0
  542. package/dist/view/shaders/projection.d.ts +123 -0
  543. package/dist/view/shaders/projection.js +299 -0
  544. package/dist/view/shaders/quad-grid.d.ts +77 -0
  545. package/dist/view/shaders/quad-grid.js +128 -0
  546. package/dist/view/shaders/quad.d.ts +189 -0
  547. package/dist/view/shaders/quad.js +582 -0
  548. package/dist/view/shaders/retained-origin.d.ts +50 -0
  549. package/dist/view/shaders/retained-origin.js +67 -0
  550. package/dist/view/shaders/terrain-shade.d.ts +23 -0
  551. package/dist/view/shaders/terrain-shade.js +93 -0
  552. package/dist/view/style-rule.d.ts +166 -0
  553. package/dist/view/style-rule.js +300 -0
  554. package/dist/view/terrain/anchor.d.ts +135 -0
  555. package/dist/view/terrain/anchor.js +226 -0
  556. package/dist/view/terrain/context.d.ts +132 -0
  557. package/dist/view/terrain/context.js +437 -0
  558. package/dist/view/terrain/dem-atlas.d.ts +97 -0
  559. package/dist/view/terrain/dem-atlas.js +534 -0
  560. package/dist/view/terrain/detect.d.ts +126 -0
  561. package/dist/view/terrain/detect.js +198 -0
  562. package/dist/view/terrain/drape/bin-store.d.ts +179 -0
  563. package/dist/view/terrain/drape/bin-store.js +529 -0
  564. package/dist/view/terrain/drape/binning.d.ts +259 -0
  565. package/dist/view/terrain/drape/binning.js +604 -0
  566. package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
  567. package/dist/view/terrain/drape/edge-constrain.js +175 -0
  568. package/dist/view/terrain/drape/geometry.d.ts +95 -0
  569. package/dist/view/terrain/drape/geometry.js +260 -0
  570. package/dist/view/terrain/drape/mesh.d.ts +50 -0
  571. package/dist/view/terrain/drape/mesh.js +86 -0
  572. package/dist/view/terrain/drape/pass.d.ts +122 -0
  573. package/dist/view/terrain/drape/pass.js +379 -0
  574. package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
  575. package/dist/view/terrain/drape/quad-glyphs.js +117 -0
  576. package/dist/view/terrain/drape/quad.d.ts +249 -0
  577. package/dist/view/terrain/drape/quad.js +835 -0
  578. package/dist/view/terrain/drape/renderer.d.ts +184 -0
  579. package/dist/view/terrain/drape/renderer.js +706 -0
  580. package/dist/view/terrain/drape/shared.d.ts +80 -0
  581. package/dist/view/terrain/drape/shared.js +173 -0
  582. package/dist/view/terrain/drape/stitch.d.ts +155 -0
  583. package/dist/view/terrain/drape/stitch.js +228 -0
  584. package/dist/view/terrain/ground.d.ts +72 -0
  585. package/dist/view/terrain/ground.js +151 -0
  586. package/dist/view/terrain/metrics.d.ts +180 -0
  587. package/dist/view/terrain/metrics.js +231 -0
  588. package/dist/view/terrain/occlusion.d.ts +11 -0
  589. package/dist/view/terrain/occlusion.js +129 -0
  590. package/dist/view/terrain/polygon.d.ts +86 -0
  591. package/dist/view/terrain/polygon.js +301 -0
  592. package/dist/view/terrain/shade.d.ts +48 -0
  593. package/dist/view/terrain/shade.js +45 -0
  594. package/dist/view/terrain/state.d.ts +99 -0
  595. package/dist/view/terrain/state.js +186 -0
  596. package/dist/view/terrain/tessellation.d.ts +265 -0
  597. package/dist/view/terrain/tessellation.js +924 -0
  598. package/dist/view/terrain/tiling.d.ts +56 -0
  599. package/dist/view/terrain/tiling.js +155 -0
  600. package/dist/view/terrain/upstream-terrain.d.ts +82 -0
  601. package/dist/view/terrain/upstream-terrain.js +116 -0
  602. package/dist/view/ui/auxiliary-handles.d.ts +151 -0
  603. package/dist/view/ui/auxiliary-handles.js +22 -0
  604. package/dist/view/ui/bounds.d.ts +53 -0
  605. package/dist/view/ui/bounds.js +149 -0
  606. package/dist/view/ui/box-selection.d.ts +1 -0
  607. package/dist/view/ui/box-selection.js +83 -0
  608. package/dist/view/ui/handle-test.d.ts +1 -0
  609. package/dist/view/ui/handle-test.js +437 -0
  610. package/dist/view/ui/handle-thinning.d.ts +122 -0
  611. package/dist/view/ui/handle-thinning.js +430 -0
  612. package/dist/view/ui/handles.d.ts +25 -0
  613. package/dist/view/ui/handles.js +673 -0
  614. package/dist/view/ui/helper.d.ts +19 -0
  615. package/dist/view/ui/helper.js +76 -0
  616. package/dist/view/ui/index.d.ts +15 -0
  617. package/dist/view/ui/index.js +15 -0
  618. package/dist/view/ui/selection-scope.d.ts +25 -0
  619. package/dist/view/ui/selection-scope.js +34 -0
  620. package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
  621. package/dist/view/ui/selection-ui/bounding-box.js +240 -0
  622. package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
  623. package/dist/view/ui/selection-ui/extension-registry.js +78 -0
  624. package/dist/view/ui/selection-ui/index.d.ts +12 -0
  625. package/dist/view/ui/selection-ui/index.js +12 -0
  626. package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
  627. package/dist/view/ui/selection-ui/renderer.js +227 -0
  628. package/dist/view/ui/selection-ui/types.d.ts +55 -0
  629. package/dist/view/ui/selection-ui/types.js +3 -0
  630. package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
  631. package/dist/view/ui/selection-ui-drawer.js +329 -0
  632. package/dist/view/ui/tentative.d.ts +1 -0
  633. package/dist/view/ui/tentative.js +320 -0
  634. package/dist/view/viewport.d.ts +119 -0
  635. package/dist/view/viewport.js +254 -0
  636. package/package.json +113 -0
@@ -0,0 +1,378 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
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;
7
+ /**
8
+ * DrawPolygonMode implementation
9
+ *
10
+ * @internal
11
+ */
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;
144
+ }
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
+ 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 }),
250
+ },
251
+ locked: false,
252
+ visible: true,
253
+ };
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
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Trace support for the drawing modes
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).
15
+ *
16
+ * The path itself is the shortest path of a graph assembled from the nearby edges
17
+ * (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
27
+ */
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
+ }
34
+ /**
35
+ * An endpoint of a trace (the snap target of a single click)
36
+ *
37
+ * 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.
39
+ */
40
+ export interface TraceAnchorEndpoint {
41
+ /** The coordinate decided by snapping (including a point in the middle of an edge) */
42
+ coordinate: Coordinate;
43
+ /** When snapped to a vertex, that vertex reference */
44
+ vertex?: VertexRef;
45
+ /** When snapped to an edge, the vertex references of both ends of that edge */
46
+ segment?: TraceAnchorSegment;
47
+ }
48
+ /**
49
+ * The snap target that becomes the start point or the end point of a trace
50
+ */
51
+ export interface TraceAnchor {
52
+ /** The feature ID of the snap target */
53
+ featureId: string;
54
+ /** The dataset ID of the snap target (only for one from a dataset) */
55
+ datasetId?: string;
56
+ /** The geometric references and the coordinate of the snap target */
57
+ endpoint: TraceAnchorEndpoint;
58
+ }
59
+ /**
60
+ * Whether tracing is enabled (if there is no configuration, it is regarded as enabled)
61
+ */
62
+ export declare function isTraceEnabled(context: ModeContext): boolean;
63
+ /**
64
+ * Reads the snap target of the event that was just delivered as an endpoint of a trace
65
+ *
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.
68
+ */
69
+ export declare function readTraceAnchor(context: ModeContext, event: MouseNormalizedEvent): TraceAnchor | null;
70
+ /**
71
+ * Derives the path between the previous confirmed click and the current snap target
72
+ *
73
+ * Returns the shortest path of the graph assembled from the nearby edges, as the sequence of
74
+ * vertices to insert in between. Vertices whose coordinates match are folded into a single
75
+ * node, so edges of different features also form a path as long as they are connected by a
76
+ * shared vertex. Returns null when the two ends are not connected or when an endpoint cannot
77
+ * be resolved (the caller then treats it as a straight line).
78
+ */
79
+ export declare function computeTracePath(context: ModeContext, from: TraceAnchor | null, to: TraceAnchor | null): Coordinate[] | null;
@@ -0,0 +1,161 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { resolveVertexCoordinates } from '../../operations/shared-vertex.js';
4
+ import { buildTraceGraph, findTracePath } from '../../operations/trace-graph.js';
5
+ import { degreesPerPixel } from '../../snapping/geometry.js';
6
+ import { isSnapVisible } from '../../snapping/providers/shared.js';
7
+ import { DEFAULT_SNAP_OPTIONS } from '../../snapping/types.js';
8
+ /**
9
+ * The margin of the extent over which the material of the graph is collected
10
+ * (as a ratio of the bbox of the two endpoints)
11
+ */
12
+ const TRACE_BBOX_MARGIN_RATIO = 0.2;
13
+ /**
14
+ * Whether tracing is enabled (if there is no configuration, it is regarded as enabled)
15
+ */
16
+ export function isTraceEnabled(context) {
17
+ return context.trace?.enabled !== false;
18
+ }
19
+ /**
20
+ * Reads the snap target of the event that was just delivered as an endpoint of a trace
21
+ *
22
+ * Returns null for snaps that cannot be used for tracing (a guide, an intersection without
23
+ * vertex references, an external candidate without a feature ID) and when nothing was snapped.
24
+ */
25
+ export function readTraceAnchor(context, event) {
26
+ if (!isTraceEnabled(context))
27
+ return null;
28
+ const result = context.getSnapResult?.();
29
+ const target = result?.target;
30
+ if (!result || !target || target.featureId === undefined)
31
+ return null;
32
+ // For an event delivered without going through snapping (such as snap: false of a synthetic
33
+ // input), the most recent result belongs to a different coordinate, so it is not used
34
+ if (result.lngLat.lng !== event.lngLat.lng || result.lngLat.lat !== event.lngLat.lat) {
35
+ return null;
36
+ }
37
+ const coordinate = [result.lngLat.lng, result.lngLat.lat];
38
+ if (target.vertex) {
39
+ return {
40
+ featureId: target.featureId,
41
+ datasetId: target.datasetId,
42
+ endpoint: { coordinate, vertex: target.vertex },
43
+ };
44
+ }
45
+ const segment = target.segment;
46
+ if (segment?.startRef && segment.endRef) {
47
+ return {
48
+ featureId: target.featureId,
49
+ datasetId: target.datasetId,
50
+ endpoint: {
51
+ coordinate,
52
+ segment: { startRef: segment.startRef, endRef: segment.endRef },
53
+ },
54
+ };
55
+ }
56
+ return null;
57
+ }
58
+ /**
59
+ * Looks up the feature of the snap target
60
+ *
61
+ * Where it is resolved from depends on its origin. One from the Store is looked up with
62
+ * store.getFeature, one from a dataset with getDatasetFeature.
63
+ */
64
+ function anchorFeature(context, anchor) {
65
+ if (anchor.datasetId === undefined) {
66
+ return context.store.getFeature(anchor.featureId) ?? null;
67
+ }
68
+ return context.getDatasetFeature?.(anchor.datasetId, anchor.featureId) ?? null;
69
+ }
70
+ /**
71
+ * Turns the snap target into an endpoint of the graph (resolves the vertex references into
72
+ * actual coordinates)
73
+ */
74
+ function toGraphEndpoint(context, anchor) {
75
+ const { coordinate, vertex, segment } = anchor.endpoint;
76
+ const feature = anchorFeature(context, anchor);
77
+ if (vertex) {
78
+ // For a snap to a vertex the snapped coordinate is the vertex itself, but if the feature
79
+ // can be looked up, that one is taken as authoritative
80
+ const resolved = feature ? resolveVertexCoordinates(feature, [vertex])[0] : undefined;
81
+ return { coordinate, node: resolved ?? coordinate };
82
+ }
83
+ if (!segment || !feature)
84
+ return null;
85
+ const start = resolveVertexCoordinates(feature, [segment.startRef])[0];
86
+ const end = resolveVertexCoordinates(feature, [segment.endRef])[0];
87
+ if (!start || !end)
88
+ return null;
89
+ return { coordinate, segment: { start, end } };
90
+ }
91
+ /**
92
+ * The extent over which the material of the graph is collected
93
+ *
94
+ * The bbox of the two endpoints is expanded by 20 percent of its size plus the snapping
95
+ * tolerance.
96
+ */
97
+ function traceBounds(context, from, to) {
98
+ const minX = Math.min(from[0], to[0]);
99
+ const maxX = Math.max(from[0], to[0]);
100
+ const minY = Math.min(from[1], to[1]);
101
+ const maxY = Math.max(from[1], to[1]);
102
+ const tolerancePx = context.snapOptions?.tolerancePx ?? DEFAULT_SNAP_OPTIONS.tolerancePx;
103
+ const perPixel = degreesPerPixel((minY + maxY) / 2, context.map.getZoom());
104
+ const marginX = (maxX - minX) * TRACE_BBOX_MARGIN_RATIO + perPixel.lng * tolerancePx;
105
+ const marginY = (maxY - minY) * TRACE_BBOX_MARGIN_RATIO + perPixel.lat * tolerancePx;
106
+ return {
107
+ minX: minX - marginX,
108
+ minY: minY - marginY,
109
+ maxX: maxX + marginX,
110
+ maxY: maxY + marginY,
111
+ };
112
+ }
113
+ /**
114
+ * Collects the features that become the material of the graph
115
+ *
116
+ * The same scope as the targets of snapping, that is, the visible features of the Store and,
117
+ * when snapping to data is enabled, the visible features of the datasets.
118
+ */
119
+ function collectTraceFeatures(context, bbox) {
120
+ const lng = (bbox.minX + bbox.maxX) / 2;
121
+ const lat = (bbox.minY + bbox.maxY) / 2;
122
+ // findNear looks up with a square extent, so the larger of the two radii is used
123
+ const radius = Math.max(bbox.maxX - lng, bbox.maxY - lat);
124
+ const features = [];
125
+ const seen = new Set();
126
+ for (const id of context.spatialIndex.findNear([lng, lat], radius)) {
127
+ if (seen.has(id))
128
+ continue;
129
+ seen.add(id);
130
+ const feature = context.store.getFeature(id);
131
+ if (!feature)
132
+ continue;
133
+ if (!isSnapVisible(feature, context.store))
134
+ continue;
135
+ features.push(feature);
136
+ }
137
+ const display = context.getDatasetTraceFeatures?.(bbox);
138
+ if (display)
139
+ features.push(...display);
140
+ return features;
141
+ }
142
+ /**
143
+ * Derives the path between the previous confirmed click and the current snap target
144
+ *
145
+ * Returns the shortest path of the graph assembled from the nearby edges, as the sequence of
146
+ * vertices to insert in between. Vertices whose coordinates match are folded into a single
147
+ * node, so edges of different features also form a path as long as they are connected by a
148
+ * shared vertex. Returns null when the two ends are not connected or when an endpoint cannot
149
+ * be resolved (the caller then treats it as a straight line).
150
+ */
151
+ export function computeTracePath(context, from, to) {
152
+ if (!from || !to)
153
+ return null;
154
+ const fromEndpoint = toGraphEndpoint(context, from);
155
+ const toEndpoint = toGraphEndpoint(context, to);
156
+ if (!fromEndpoint || !toEndpoint)
157
+ return null;
158
+ const bbox = traceBounds(context, fromEndpoint.coordinate, toEndpoint.coordinate);
159
+ const features = collectTraceFeatures(context, bbox);
160
+ return findTracePath(buildTraceGraph(features, bbox), fromEndpoint, toEndpoint);
161
+ }