@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,166 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Rotation operation
5
+ *
6
+ * The operation that rotates features. It rotates in Web Mercator (see mercator-plane.ts),
7
+ * which is conformal, so the shape on the map is kept however large the feature is and however
8
+ * often it is rotated. The extension points of the draw instance are passed in as an argument
9
+ * ({@link RotateExtensions}).
10
+ */
11
+ import { fromPlane, toPlane } from '../shared/math/mercator-plane.js';
12
+ import { mapCoordinatesDeep } from '../shared/utils/coordinates.js';
13
+ import { getImageProperties } from '../shared/utils/property.js';
14
+ /**
15
+ * Decides whether a feature has a rotation property
16
+ *
17
+ * It covers Image, the custom feature types registered with resizeStrategy: 'scale' in the
18
+ * draw instance's registry (they rotate through the rotation property even when it is not
19
+ * set yet), and features that have a rotation property in properties.
20
+ */
21
+ function hasRotationProperty(feature, extensions) {
22
+ // Image is covered explicitly
23
+ if (feature.type === 'Image') {
24
+ return true;
25
+ }
26
+ // A custom type that scales (rather than rewriting its coordinates) rotates by property
27
+ if (extensions?.getResizeStrategy(feature.type) === 'scale') {
28
+ return true;
29
+ }
30
+ // Also covers features that have a rotation property in properties
31
+ return (feature.properties !== null &&
32
+ typeof feature.properties === 'object' &&
33
+ 'rotation' in feature.properties);
34
+ }
35
+ /**
36
+ * Gets the value of the rotation property of a feature
37
+ */
38
+ function getFeatureRotation(feature) {
39
+ if (feature.type === 'Image') {
40
+ const props = getImageProperties(feature);
41
+ return props.rotation ?? 0;
42
+ }
43
+ const props = feature.properties;
44
+ return typeof props.rotation === 'number' ? props.rotation : 0;
45
+ }
46
+ /**
47
+ * Computes the angle of a point around the center (radians, counterclockwise from east, in
48
+ * the transform plane)
49
+ */
50
+ function computeAngle(center, point) {
51
+ const [cx, cy] = toPlane(center);
52
+ const [px, py] = toPlane([point.lng, point.lat]);
53
+ return Math.atan2(py - cy, px - cx);
54
+ }
55
+ /**
56
+ * Rotates a coordinate around the center in the transform plane
57
+ */
58
+ function rotateCoordinate(coord, center, angle) {
59
+ const cos = Math.cos(angle);
60
+ const sin = Math.sin(angle);
61
+ const [cx, cy] = toPlane(center);
62
+ const [x, y] = toPlane(coord);
63
+ const dx = x - cx;
64
+ const dy = y - cy;
65
+ return fromPlane(cx + dx * cos - dy * sin, cy + dx * sin + dy * cos);
66
+ }
67
+ /**
68
+ * Rotates an array of coordinates
69
+ *
70
+ * It uses a common traversal that does not depend on the nesting depth, so Multi
71
+ * geometries (a MultiPolygon is nested 4 levels deep) can be rotated as they are.
72
+ */
73
+ function rotateCoordinates(coords, center, angle) {
74
+ return mapCoordinatesDeep(coords, (coord) => rotateCoordinate(coord, center, angle));
75
+ }
76
+ /**
77
+ * Computes the rotation
78
+ *
79
+ * @internal
80
+ */
81
+ export function computeRotation(state, currentLngLat, features) {
82
+ const { startAngle, center } = state;
83
+ // Compute the current angle
84
+ const currentAngle = computeAngle(center, currentLngLat);
85
+ // Compute the amount of rotation
86
+ const deltaAngle = currentAngle - startAngle;
87
+ // Compute the new coordinates of each feature
88
+ const result = new Map();
89
+ // Decide whether there are only features with a rotation property (the case of a
90
+ // single selection where the coordinates are not changed). Which features rotate by
91
+ // property was decided when the rotation started (initialRotations)
92
+ const byProperty = (f) => state.initialRotations.has(f.id);
93
+ const rotationFeatures = features.filter(byProperty);
94
+ const otherFeatures = features.filter((f) => !byProperty(f));
95
+ const isSingleRotationFeature = rotationFeatures.length === 1 && otherFeatures.length === 0;
96
+ for (const feature of features) {
97
+ const initialCoords = state.initialCoordinates.get(feature.id);
98
+ if (!initialCoords)
99
+ continue;
100
+ if (byProperty(feature)) {
101
+ // For a feature that has a rotation property (Image, custom types and so on)
102
+ // rotation is stored in degrees (because the rendering side expects degrees)
103
+ const initialRotation = state.initialRotations.get(feature.id) ?? 0;
104
+ const deltaAngleDeg = (deltaAngle * 180) / Math.PI;
105
+ const newRotation = initialRotation + deltaAngleDeg;
106
+ if (isSingleRotationFeature) {
107
+ // For a single selection: leave the coordinates unchanged and change only rotation
108
+ result.set(feature.id, {
109
+ coordinates: initialCoords,
110
+ rotation: newRotation,
111
+ });
112
+ }
113
+ else {
114
+ // For a multiple selection: rotate the coordinates too, around the center
115
+ const newCoords = rotateCoordinates(initialCoords, center, deltaAngle);
116
+ result.set(feature.id, {
117
+ coordinates: newCoords,
118
+ rotation: newRotation,
119
+ });
120
+ }
121
+ }
122
+ else {
123
+ // Point, LineString, Polygon and so on: change only the coordinates
124
+ const newCoords = rotateCoordinates(initialCoords, center, deltaAngle);
125
+ result.set(feature.id, { coordinates: newCoords });
126
+ }
127
+ }
128
+ return result;
129
+ }
130
+ /**
131
+ * Starts the rotation operation
132
+ *
133
+ * @param extensions The draw instance's extension points (a custom type registered with
134
+ * resizeStrategy: 'scale' rotates through its rotation property)
135
+ *
136
+ * @internal
137
+ */
138
+ export function startRotation(startLngLat, bbox, features, extensions) {
139
+ const center = bbox.center;
140
+ const startAngle = computeAngle(center, startLngLat);
141
+ const initialCoordinates = new Map();
142
+ const initialRotations = new Map();
143
+ for (const feature of features) {
144
+ initialCoordinates.set(feature.id, JSON.parse(JSON.stringify(feature.coordinates)));
145
+ // For a feature that has a rotation property, store the initial rotation angle
146
+ if (hasRotationProperty(feature, extensions)) {
147
+ initialRotations.set(feature.id, getFeatureRotation(feature));
148
+ }
149
+ }
150
+ return {
151
+ startLngLat,
152
+ startAngle,
153
+ center,
154
+ initialCoordinates,
155
+ initialRotations,
156
+ };
157
+ }
158
+ /**
159
+ * Gets the rotation angle (for debugging)
160
+ *
161
+ * @internal
162
+ */
163
+ export function getRotationDelta(state, currentLngLat) {
164
+ const currentAngle = computeAngle(state.center, currentLngLat);
165
+ return currentAngle - state.startAngle;
166
+ }
@@ -0,0 +1,20 @@
1
+ import type { Store } from '../store/store.js';
2
+ /**
3
+ * Deletes what is selected, as one change. The Delete key of the select mode and
4
+ * `draw.deleteSelection()` both run this.
5
+ *
6
+ * - vertices selected: deletes those vertices
7
+ * - feature: deletes the selected features
8
+ * - group: deletes the contents of the group (its features) (a group that becomes empty is
9
+ * deleted automatically)
10
+ * - layer: deletes the layer (the features / groups under it are deleted too). At least one
11
+ * layer is kept
12
+ *
13
+ * A deletion never removes a locked feature: a group loses only its unlocked members (it
14
+ * stays with the locked ones), and a layer that holds a locked feature or group is not
15
+ * deleted.
16
+ *
17
+ * @returns true when something was deleted; false while read-only or the interaction lock is
18
+ * on, when nothing is selected, or when everything selected is locked
19
+ */
20
+ export declare function deleteSelection(store: Store): boolean;
@@ -0,0 +1,159 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Selection operations
5
+ *
6
+ * Deletes what is selected. The Delete key of the select mode (modes/) and
7
+ * `draw.deleteSelection()` (api/) both call this, so the two paths delete the same things.
8
+ */
9
+ import { isFeatureLocked, isGroupLocked } from '../store/lock.js';
10
+ import { deleteVertex as deleteVertexOp, sortVertexRefsForDeletion } from './vertex.js';
11
+ /**
12
+ * Deletes what is selected, as one change. The Delete key of the select mode and
13
+ * `draw.deleteSelection()` both run this.
14
+ *
15
+ * - vertices selected: deletes those vertices
16
+ * - feature: deletes the selected features
17
+ * - group: deletes the contents of the group (its features) (a group that becomes empty is
18
+ * deleted automatically)
19
+ * - layer: deletes the layer (the features / groups under it are deleted too). At least one
20
+ * layer is kept
21
+ *
22
+ * A deletion never removes a locked feature: a group loses only its unlocked members (it
23
+ * stays with the locked ones), and a layer that holds a locked feature or group is not
24
+ * deleted.
25
+ *
26
+ * @returns true when something was deleted; false while read-only or the interaction lock is
27
+ * on, when nothing is selected, or when everything selected is locked
28
+ */
29
+ export function deleteSelection(store) {
30
+ // Do not start a deletion while readOnly / the interaction lock is on (group and layer
31
+ // deletion does not go through the per-feature isFeatureLocked).
32
+ if (store.isReadOnly() || store.isInteractionLocked())
33
+ return false;
34
+ // Delete the vertices when vertices are selected
35
+ const selectedVertices = store.getSelectedVertices();
36
+ if (selectedVertices && selectedVertices.vertexIndices.length > 0) {
37
+ return deleteSelectedVertices(store, selectedVertices) > 0;
38
+ }
39
+ const selection = store.getSelection();
40
+ if (selection.ids.length === 0)
41
+ return false;
42
+ if (selection.type === 'feature') {
43
+ // Locked features (themselves / their group / their layer) are not deleted
44
+ const selectedIds = selection.ids.filter((id) => {
45
+ const feature = store.getFeature(id);
46
+ return feature !== undefined && !isFeatureLocked(feature, store);
47
+ });
48
+ if (selectedIds.length === 0)
49
+ return false;
50
+ store.transact(() => {
51
+ store.setSelection(null, []);
52
+ for (const id of selectedIds) {
53
+ store.deleteFeature(id);
54
+ }
55
+ });
56
+ return true;
57
+ }
58
+ if (selection.type === 'group') {
59
+ // Locked groups (themselves / the layer they belong to) are not deleted
60
+ const findLayerOfGroup = (groupId) => store.getAllLayers().find((l) => l.order.includes(groupId));
61
+ const groupIds = selection.ids.filter((groupId) => {
62
+ const group = store.getGroup(groupId);
63
+ return group !== undefined && !isGroupLocked(group, findLayerOfGroup);
64
+ });
65
+ if (groupIds.length === 0)
66
+ return false;
67
+ store.transact(() => {
68
+ store.setSelection(null, []);
69
+ for (const groupId of groupIds) {
70
+ const group = store.getGroup(groupId);
71
+ if (!group)
72
+ continue;
73
+ // Delete the unlocked contents of the group. The group itself is deleted automatically
74
+ // the moment the last feature is removed.
75
+ for (const featureId of [...group.featureIds]) {
76
+ const feature = store.getFeature(featureId);
77
+ if (feature && isFeatureLocked(feature, store))
78
+ continue;
79
+ store.deleteFeature(featureId);
80
+ }
81
+ // When an empty group (a group with no contents) was selected, delete the group itself
82
+ // (a group that keeps locked members stays)
83
+ if (store.getGroup(groupId)?.featureIds.length === 0) {
84
+ store.deleteGroup(groupId);
85
+ }
86
+ }
87
+ });
88
+ return true;
89
+ }
90
+ if (selection.type === 'layer') {
91
+ // Locked layers, and layers holding a locked feature or group, are not deleted.
92
+ // At least one layer is kept (prevents deleting every layer).
93
+ const layerIds = [...new Set(selection.ids)].filter((layerId) => {
94
+ const layer = store.getLayer(layerId);
95
+ return layer !== undefined && !layer.locked && !holdsLockedItem(store, layerId);
96
+ });
97
+ const deletable = layerIds.slice(0, Math.max(0, store.getAllLayers().length - 1));
98
+ if (deletable.length === 0)
99
+ return false;
100
+ store.transact(() => {
101
+ store.setSelection(null, []);
102
+ for (const layerId of deletable) {
103
+ store.deleteLayer(layerId);
104
+ }
105
+ });
106
+ return true;
107
+ }
108
+ return false;
109
+ }
110
+ /**
111
+ * Whether a layer holds a feature or a group that is locked on its own
112
+ */
113
+ function holdsLockedItem(store, layerId) {
114
+ const layer = store.getLayer(layerId);
115
+ if (!layer)
116
+ return false;
117
+ for (const itemId of layer.order) {
118
+ const group = store.getGroup(itemId);
119
+ if (group?.locked)
120
+ return true;
121
+ }
122
+ return store.getAllFeatures().some((f) => f.layerId === layerId && isFeatureLocked(f, store));
123
+ }
124
+ /**
125
+ * Deletes the selected vertices of one feature as one change
126
+ *
127
+ * @returns The number of vertices deleted
128
+ */
129
+ function deleteSelectedVertices(store, selection) {
130
+ const feature = store.getFeature(selection.featureId);
131
+ if (!feature)
132
+ return 0;
133
+ // The vertices of a locked feature are not deleted
134
+ if (isFeatureLocked(feature, store))
135
+ return 0;
136
+ // Within the same part and the same ring, deletion goes in descending index order
137
+ // (avoiding the shift caused by what was already removed. For MultiPoint the part itself
138
+ // disappears, so parts are in descending order too)
139
+ const sortedRefs = sortVertexRefsForDeletion(selection.vertexIndices);
140
+ // deleteVertex does not mutate its input and returns a new coordinate structure
141
+ // (copy-on-write), so no upfront copy is needed. Successive deletions only need the return
142
+ // value fed into the next input
143
+ let coords = feature.coordinates;
144
+ let deletedCount = 0;
145
+ for (const ref of sortedRefs) {
146
+ const result = deleteVertexOp({ ...feature, coordinates: coords }, ref);
147
+ if (result !== null) {
148
+ coords = result;
149
+ deletedCount++;
150
+ }
151
+ }
152
+ if (deletedCount > 0) {
153
+ store.transact(() => {
154
+ store.updateFeature(selection.featureId, { coordinates: coords });
155
+ store.setSelectedVertices(null);
156
+ });
157
+ }
158
+ return deletedCount;
159
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,210 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Simultaneous movement of shared vertices
5
+ *
6
+ * The collection process for moving vertices that adjacent features hold at the
7
+ * same coordinate (shared vertices) together in a single drag. The "features that
8
+ * follow along and their vertex references" are fixed when the drag starts, and no
9
+ * further search is made afterwards (if the set changed during the drag it would
10
+ * interfere with other features such as snapping).
11
+ *
12
+ * The match test is an exact match with a tolerance of 0. Boundaries in GIS data
13
+ * are assumed to share the same coordinate values, and picking up neighbors would
14
+ * drag in unrelated vertices, so no rounding is applied.
15
+ *
16
+ * The targets are only the unlocked, visible features among the geometries that
17
+ * allow vertex editing (Point / LineString / Polygon and the Multi variants). Types
18
+ * without vertex movement, such as Circle / Image / Freehand, are excluded from the
19
+ * candidates.
20
+ */
21
+ import { hasVertexRef } from '../shared/utils/vertex-ref.js';
22
+ import { isLocallyHidden } from '../store/local-visibility.js';
23
+ import { isFeatureLocked } from '../store/lock.js';
24
+ import { startVertexMove } from './vertex.js';
25
+ /**
26
+ * Geometry types eligible for the simultaneous movement of shared vertices
27
+ *
28
+ * They are kept identical to the types whose coordinates computeVertexMove can
29
+ * move.
30
+ */
31
+ const VERTEX_MOVABLE_TYPES = new Set([
32
+ 'Point',
33
+ 'LineString',
34
+ 'Polygon',
35
+ 'MultiPoint',
36
+ 'MultiLineString',
37
+ 'MultiPolygon',
38
+ ]);
39
+ /**
40
+ * Lists every vertex of a feature
41
+ *
42
+ * The end of a closed ring (the closing point) is also listed as one vertex. The
43
+ * match test for shared vertices is done on coordinates, so leaving out the closing
44
+ * point would lose track of "which of the first and the last one matched".
45
+ */
46
+ function forEachVertex(feature, visit) {
47
+ const { type, coordinates } = feature;
48
+ if (type === 'Point') {
49
+ visit(coordinates, { ring: 0, index: 0 });
50
+ return;
51
+ }
52
+ if (type === 'LineString') {
53
+ const coords = coordinates;
54
+ for (let index = 0; index < coords.length; index++) {
55
+ visit(coords[index], { ring: 0, index });
56
+ }
57
+ return;
58
+ }
59
+ if (type === 'Polygon') {
60
+ visitRings(coordinates, visit);
61
+ return;
62
+ }
63
+ if (type === 'MultiPoint') {
64
+ // Each coordinate is one part. ring / index is always 0
65
+ const points = coordinates;
66
+ for (let part = 0; part < points.length; part++) {
67
+ visit(points[part], { part, ring: 0, index: 0 });
68
+ }
69
+ return;
70
+ }
71
+ if (type === 'MultiLineString') {
72
+ const parts = coordinates;
73
+ for (let part = 0; part < parts.length; part++) {
74
+ const coords = parts[part];
75
+ for (let index = 0; index < coords.length; index++) {
76
+ visit(coords[index], { part, ring: 0, index });
77
+ }
78
+ }
79
+ return;
80
+ }
81
+ if (type === 'MultiPolygon') {
82
+ const parts = coordinates;
83
+ for (let part = 0; part < parts.length; part++) {
84
+ visitRings(parts[part], visit, part);
85
+ }
86
+ }
87
+ }
88
+ /**
89
+ * Lists every vertex of an array of rings (including inner rings)
90
+ */
91
+ function visitRings(rings, visit, part) {
92
+ for (let ring = 0; ring < rings.length; ring++) {
93
+ const coords = rings[ring];
94
+ for (let index = 0; index < coords.length; index++) {
95
+ visit(coords[index], part === undefined ? { ring, index } : { part, ring, index });
96
+ }
97
+ }
98
+ }
99
+ /**
100
+ * Whether the coordinates match exactly (tolerance 0)
101
+ */
102
+ function isSameCoordinate(a, b) {
103
+ return a[0] === b[0] && a[1] === b[1];
104
+ }
105
+ /**
106
+ * Returns every vertex reference that matches one of the given coordinates exactly
107
+ *
108
+ * When a single feature has several vertices at the same coordinate (the first and
109
+ * the last one of a closed ring, for instance), all of them are returned.
110
+ *
111
+ * @internal
112
+ */
113
+ export function findVertexRefsAt(feature, targets) {
114
+ const refs = [];
115
+ if (!VERTEX_MOVABLE_TYPES.has(feature.type))
116
+ return refs;
117
+ forEachVertex(feature, (coord, ref) => {
118
+ if (targets.some((target) => isSameCoordinate(coord, target))) {
119
+ refs.push(ref);
120
+ }
121
+ });
122
+ return refs;
123
+ }
124
+ /**
125
+ * Takes out the coordinates pointed to by the vertex references (duplicates removed)
126
+ *
127
+ * @internal
128
+ */
129
+ export function resolveVertexCoordinates(feature, refs) {
130
+ const coords = [];
131
+ forEachVertex(feature, (coord, ref) => {
132
+ if (!hasVertexRef(refs, ref))
133
+ return;
134
+ if (coords.some((existing) => isSameCoordinate(existing, coord)))
135
+ return;
136
+ coords.push([coord[0], coord[1]]);
137
+ });
138
+ return coords;
139
+ }
140
+ /**
141
+ * Whether a feature can follow along with shared vertices
142
+ *
143
+ * Features under an effective lock (their own, their group's or their layer's) and
144
+ * hidden features are excluded. The cascade of the shared visible flag is aligned
145
+ * with the test in getOrderedFeatures, and local hiding with the one in
146
+ * getDisplayFeatures.
147
+ */
148
+ function isFollowCandidate(feature, store) {
149
+ if (!VERTEX_MOVABLE_TYPES.has(feature.type))
150
+ return false;
151
+ if (isFeatureLocked(feature, store))
152
+ return false;
153
+ if (!feature.visible)
154
+ return false;
155
+ if (feature.groupId && !store.getGroup(feature.groupId)?.visible)
156
+ return false;
157
+ if (!store.getLayer(feature.layerId)?.visible)
158
+ return false;
159
+ return !isLocallyHidden(feature, store);
160
+ }
161
+ /**
162
+ * Fixes the targets of the simultaneous movement of shared vertices when the drag
163
+ * starts
164
+ *
165
+ * Candidate features are narrowed down with SpatialIndex.findNear (tolerance 0), and
166
+ * only the features among them that have a vertex matching the coordinate exactly
167
+ * are taken. No further search is made during the drag; the set fixed here keeps
168
+ * being used.
169
+ *
170
+ * @param feature The feature being dragged (the main one)
171
+ * @param vertexRefs The vertex references being dragged
172
+ *
173
+ * @internal
174
+ */
175
+ export function collectSharedVertexMoves(params) {
176
+ const { store, spatialIndex, feature, vertexRefs, startLngLat } = params;
177
+ const targets = resolveVertexCoordinates(feature, vertexRefs);
178
+ const mainRefs = vertexRefs.map((ref) => ({ ...ref }));
179
+ if (targets.length === 0) {
180
+ return { mainRefs, followers: [] };
181
+ }
182
+ // Narrow down the candidate features with the spatial index (tolerance 0 = a point query)
183
+ const candidateIds = new Set();
184
+ for (const target of targets) {
185
+ for (const id of spatialIndex.findNear(target, 0)) {
186
+ candidateIds.add(id);
187
+ }
188
+ }
189
+ // Also move the vertices at the same coordinate within the main feature (the closing
190
+ // point of a closed ring, for instance)
191
+ for (const ref of findVertexRefsAt(feature, targets)) {
192
+ if (!hasVertexRef(mainRefs, ref))
193
+ mainRefs.push(ref);
194
+ }
195
+ const followers = [];
196
+ for (const id of candidateIds) {
197
+ if (id === feature.id)
198
+ continue;
199
+ const candidate = store.getFeature(id);
200
+ if (!candidate || !isFollowCandidate(candidate, store))
201
+ continue;
202
+ const refs = findVertexRefsAt(candidate, targets);
203
+ if (refs.length === 0)
204
+ continue;
205
+ const state = startVertexMove(candidate, refs, startLngLat);
206
+ if (state)
207
+ followers.push(state);
208
+ }
209
+ return { mainRefs, followers };
210
+ }
@@ -0,0 +1,96 @@
1
+ import type { BoundingBox, Coordinate, Feature } from '../store/types.js';
2
+ /**
3
+ * A connection from a node of a {@link TraceGraph} to an adjacent node, weighted by its
4
+ * geodesic length.
5
+ */
6
+ export interface TraceGraphEdge {
7
+ /** The node key this edge connects to */
8
+ to: string;
9
+ /** The haversine length of the edge in meters */
10
+ weight: number;
11
+ }
12
+ /**
13
+ * A vertex of a {@link TraceGraph}. Vertices at exactly the same coordinate share one node.
14
+ */
15
+ export interface TraceGraphNode {
16
+ /** The coordinate of the node, `[lng, lat]` in degrees */
17
+ coordinate: Coordinate;
18
+ /** The adjacent nodes */
19
+ edges: TraceGraphEdge[];
20
+ }
21
+ /**
22
+ * The undirected graph of the edges near the cursor, built by {@link buildTraceGraph} and
23
+ * searched by {@link findTracePath}.
24
+ */
25
+ export interface TraceGraph {
26
+ /** The nodes by key (the key is `"lng,lat"`) */
27
+ nodes: Map<string, TraceGraphNode>;
28
+ }
29
+ /**
30
+ * One end of a trace: the snapping target of a click, expressed in coordinates.
31
+ *
32
+ * It holds either node (snapped to a vertex) or segment (snapped to the middle of an
33
+ * edge). An end point with neither (a snap to a guide or to an intersection with no
34
+ * reference) cannot be traced.
35
+ */
36
+ export interface TraceGraphEndpoint {
37
+ /** The snapped coordinate `[lng, lat]` in degrees (may be in the middle of an edge) */
38
+ coordinate: Coordinate;
39
+ /** When snapped to a vertex, the coordinate of that vertex */
40
+ node?: Coordinate;
41
+ /** When snapped to the middle of an edge, the coordinates of both ends of that edge */
42
+ segment?: {
43
+ start: Coordinate;
44
+ end: Coordinate;
45
+ };
46
+ }
47
+ /**
48
+ * Builds the undirected graph of the edges of features within an extent, for
49
+ * {@link findTracePath}.
50
+ *
51
+ * Every segment of LineString, Polygon (holes included), MultiLineString and MultiPolygon
52
+ * features that touches `bbox` becomes an edge weighted by its haversine length in meters.
53
+ * Vertices at exactly the same coordinate share one node, so a path can cross from one
54
+ * feature to another through a shared vertex; edges that merely cross are not connected.
55
+ * Edges with the same pair of coordinates are folded into one, and edges of length 0 are
56
+ * skipped. Features of any other type contribute nothing. It is a pure
57
+ * function; it looks at neither the Store nor the map.
58
+ *
59
+ * @param features The features to build from (pass only the visible ones)
60
+ * @param bbox The extent in degrees; only the edges that touch it are taken in
61
+ * @returns The graph. It has no nodes when no edge falls in `bbox`
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * import { buildTraceGraph, findTracePath } from '@sakuzu/maplibre-gl-draw';
66
+ *
67
+ * const graph = buildTraceGraph(draw.getAllFeatures(), {
68
+ * minX: 139.7,
69
+ * minY: 35.6,
70
+ * maxX: 139.8,
71
+ * maxY: 35.7,
72
+ * });
73
+ * // The boundary vertices between two vertices of the same parcel
74
+ * const between = findTracePath(
75
+ * graph,
76
+ * { coordinate: [139.71, 35.61], node: [139.71, 35.61] },
77
+ * { coordinate: [139.75, 35.65], node: [139.75, 35.65] },
78
+ * );
79
+ * ```
80
+ */
81
+ export declare function buildTraceGraph(features: readonly Feature[], bbox: BoundingBox): TraceGraph;
82
+ /**
83
+ * Returns the boundary vertices on the shortest path between two snapped points.
84
+ *
85
+ * The search is Dijkstra over the geodesic lengths of {@link TraceGraph}. An end snapped to
86
+ * the middle of an edge is connected to both ends of that edge with the partial lengths;
87
+ * when both ends lie on the same edge they are connected directly. It is a pure function.
88
+ *
89
+ * @param graph The graph built from the nearby edges by {@link buildTraceGraph}
90
+ * @param from The snapping target of the click confirmed just before
91
+ * @param to The snapping target of this click (or of the cursor)
92
+ * @returns The vertices `[lng, lat]` in between, both ends excluded. An empty array when
93
+ * the two ends are the same node or adjacent. `null` when an end has neither `node` nor
94
+ * `segment`, when an end is not in the graph, and when the two ends are not connected
95
+ */
96
+ export declare function findTracePath(graph: TraceGraph, from: TraceGraphEndpoint, to: TraceGraphEndpoint): Coordinate[] | null;