@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,78 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Selection API
5
+ *
6
+ * Provides the Selection and Vertex Selection operations of MapLibreGLDraw.
7
+ */
8
+ import { deleteSelection } from '../operations/selection-operations.js';
9
+ import { deleteVertex as deleteVertexOp, sortVertexRefsForDeletion } from '../operations/vertex.js';
10
+ export function createSelectionApi(deps) {
11
+ const { store } = deps;
12
+ return {
13
+ getSelection() {
14
+ return store.getSelection();
15
+ },
16
+ select(ids, type = 'feature') {
17
+ const idsArray = Array.isArray(ids) ? ids : [ids];
18
+ store.setSelection(type, idsArray);
19
+ },
20
+ deselect() {
21
+ store.setSelection(null, []);
22
+ },
23
+ getSelectedFeatures() {
24
+ const selection = store.getSelection();
25
+ if (selection.type !== 'feature')
26
+ return [];
27
+ return selection.ids
28
+ .map((id) => store.getFeature(id))
29
+ .filter((f) => f !== undefined);
30
+ },
31
+ getSelectedIds() {
32
+ return [...store.getSelection().ids];
33
+ },
34
+ deleteSelection() {
35
+ return deleteSelection(store);
36
+ },
37
+ selectVertices(featureId, vertices) {
38
+ store.setSelectedVertices({ featureId, vertexIndices: vertices });
39
+ },
40
+ deselectVertices() {
41
+ store.setSelectedVertices(null);
42
+ },
43
+ getSelectedVertices() {
44
+ return store.getSelectedVertices();
45
+ },
46
+ deleteVertices(featureId, vertices) {
47
+ if (vertices.length === 0)
48
+ return 0;
49
+ const feature = store.getFeature(featureId);
50
+ if (!feature)
51
+ return 0;
52
+ // Within the same part and the same ring, delete in descending index order
53
+ // (avoids the shift caused by earlier deletions; for MultiPoint the part itself
54
+ // disappears, so parts are in descending order too)
55
+ const sortedRefs = sortVertexRefsForDeletion(vertices);
56
+ let coords = JSON.parse(JSON.stringify(feature.coordinates));
57
+ let deletedCount = 0;
58
+ for (const ref of sortedRefs) {
59
+ const result = deleteVertexOp({ ...feature, coordinates: coords }, ref);
60
+ if (result !== null) {
61
+ coords = result;
62
+ deletedCount++;
63
+ }
64
+ }
65
+ if (deletedCount > 0) {
66
+ store.transact(() => {
67
+ store.updateFeature(featureId, { coordinates: coords });
68
+ // If the deleted vertices were selected, clear the selection
69
+ const selectedVertices = store.getSelectedVertices();
70
+ if (selectedVertices?.featureId === featureId) {
71
+ store.setSelectedVertices(null);
72
+ }
73
+ });
74
+ }
75
+ return deletedCount;
76
+ },
77
+ };
78
+ }
@@ -0,0 +1,125 @@
1
+ import type { ScreenPoint } from '../shared/math/index.js';
2
+ import type { ResolvedSnapOptions, SnapContext, SnapLngLat, SnapProvider, SnapResult, SnapTargetKind } from '../snapping/types.js';
3
+ /**
4
+ * The snapping of a draw instance, reached as `draw.snapping`: switching it at runtime,
5
+ * reading its settings and adding candidates.
6
+ *
7
+ * Snapping replaces the coordinate of a click, a move or a drag with the nearest candidate
8
+ * within the tolerance, before any mode sees it, so it works the same way in every mode and
9
+ * for vertex dragging. The initial settings come from {@link Options.snap}. Holding the
10
+ * modifier of `disableKey` (Alt by default) releases it while held. Every change of the
11
+ * result is announced by the `draw.snap.change` event.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * draw.snapping.setEnabled(false);
16
+ * draw.snapping.setKindEnabled('guide', false); // turn off guides only
17
+ * const unregister = draw.snapping.register(myProvider);
18
+ * unregister();
19
+ * ```
20
+ */
21
+ export interface SnappingOperations {
22
+ /**
23
+ * Registers a provider of snapping candidates.
24
+ *
25
+ * The candidates are mixed in on top of the built-in providers (the vertices and edges of
26
+ * the Store) and compete with them by distance and priority. On a destroyed instance the
27
+ * registration is ignored.
28
+ *
29
+ * @param provider the provider to register
30
+ * @returns a function that unregisters it
31
+ */
32
+ register(provider: SnapProvider): () => void;
33
+ /**
34
+ * Enables or disables snapping.
35
+ *
36
+ * The initial value is `options.snap.enabled` (default true). A change takes effect from the
37
+ * next input.
38
+ *
39
+ * @param enabled true to snap, false to pass every coordinate through as it is
40
+ */
41
+ setEnabled(enabled: boolean): void;
42
+ /** Whether snapping is enabled */
43
+ isEnabled(): boolean;
44
+ /**
45
+ * Enables or disables snapping per kind (vertex / edge / intersection / guide).
46
+ *
47
+ * The initial value is `options.snap.kinds` (all true by default). The candidates of a
48
+ * disabled kind are excluded from the evaluation, even when a provider returns them.
49
+ *
50
+ * @param kind the kind of target
51
+ * @param enabled whether that kind is snapped to
52
+ */
53
+ setKindEnabled(kind: SnapTargetKind, enabled: boolean): void;
54
+ /**
55
+ * Whether the kind is enabled
56
+ *
57
+ * @param kind the kind of target
58
+ */
59
+ isKindEnabled(kind: SnapTargetKind): boolean;
60
+ /**
61
+ * Switches whether datasets (data that is only displayed) are included as
62
+ * snapping targets.
63
+ *
64
+ * The initial value is `options.snap.datasets` (default true). Setting it to false stops
65
+ * only the snapping to that data; snapping to the features of the Store remains.
66
+ *
67
+ * @param enabled whether datasets are snapping targets
68
+ */
69
+ setDatasetsEnabled(enabled: boolean): void;
70
+ /** Whether datasets are snapping targets */
71
+ isDatasetsEnabled(): boolean;
72
+ /**
73
+ * Sets the step angle of the built-in north-based guides.
74
+ *
75
+ * The initial value is `options.snap.guideStepDegrees` (default 45, which gives 8 guides).
76
+ * The change takes effect from the next snapping query. A value of 0 or less, or a
77
+ * non-finite value, gives the default 45. The current value is in
78
+ * `getOptions().guideStepDegrees`. Guides added with `createGuideSnapProvider` keep their
79
+ * own step.
80
+ *
81
+ * @param degrees the step angle in degrees, counted from true north
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * draw.snapping.setGuideStep(15); // 24 guides, every 15 degrees
86
+ * ```
87
+ */
88
+ setGuideStep(degrees: number): void;
89
+ /**
90
+ * Gets the snapping options with the defaults filled in.
91
+ *
92
+ * enabled, kinds, display and guideStepDegrees are the current values, reflecting the changes made at runtime.
93
+ * `kinds` is a copy with every kind filled in, so changing it has no effect. A settings UI
94
+ * reads its current values here.
95
+ */
96
+ getOptions(): ResolvedSnapOptions;
97
+ /**
98
+ * Gets the most recent snapping result.
99
+ *
100
+ * null if nothing has been resolved yet. When nothing is snapped, it returns a SnapResult
101
+ * with no target.
102
+ */
103
+ getResult(): SnapResult | null;
104
+ /**
105
+ * Resolves snapping for a coordinate.
106
+ *
107
+ * There is no need to call it for normal input, because the InputRouter passes it through
108
+ * automatically. It is the entry point for when a coordinate produced outside the library,
109
+ * such as numeric input or synthetic input, should be passed through snapping.
110
+ *
111
+ * @param lngLat the input coordinate
112
+ * @param point the screen coordinate (when omitted, it is computed with map.project)
113
+ * @param ctx overrides for the context (when omitted, zoom is the current zoom and
114
+ * modifiers are all false)
115
+ * @returns the snapped coordinate and what it snapped to; the input coordinate with no
116
+ * target when nothing is within the tolerance
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * const { lngLat, target } = draw.snapping.resolve({ lng: 139.7, lat: 35.68 });
121
+ * if (target) console.log('snapped to a', target.kind);
122
+ * ```
123
+ */
124
+ resolve(lngLat: SnapLngLat, point?: ScreenPoint, ctx?: Partial<SnapContext>): SnapResult;
125
+ }
@@ -0,0 +1,50 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /** The state in which no modifier key is pressed */
4
+ const NO_MODIFIERS = { shift: false, ctrl: false, alt: false, meta: false };
5
+ /** @internal */
6
+ export function createSnappingApi(deps) {
7
+ const { snapService, map } = deps;
8
+ return {
9
+ snapping: {
10
+ register(provider) {
11
+ return snapService.register(provider);
12
+ },
13
+ setEnabled(enabled) {
14
+ snapService.setEnabled(enabled);
15
+ },
16
+ isEnabled() {
17
+ return snapService.isEnabled();
18
+ },
19
+ setKindEnabled(kind, enabled) {
20
+ snapService.setKindEnabled(kind, enabled);
21
+ },
22
+ isKindEnabled(kind) {
23
+ return snapService.isKindEnabled(kind);
24
+ },
25
+ setDatasetsEnabled(enabled) {
26
+ snapService.setDatasetsEnabled(enabled);
27
+ },
28
+ isDatasetsEnabled() {
29
+ return snapService.isDatasetsEnabled();
30
+ },
31
+ setGuideStep(degrees) {
32
+ snapService.setGuideStep(degrees);
33
+ },
34
+ getOptions() {
35
+ return snapService.getOptions();
36
+ },
37
+ getResult() {
38
+ return snapService.getResult();
39
+ },
40
+ resolve(lngLat, point, ctx) {
41
+ const screenPoint = point ?? map.project([lngLat.lng, lngLat.lat]);
42
+ return snapService.resolve(lngLat, { x: screenPoint.x, y: screenPoint.y }, {
43
+ zoom: map.getZoom(),
44
+ modifiers: { ...NO_MODIFIERS },
45
+ ...ctx,
46
+ });
47
+ },
48
+ },
49
+ };
50
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * The topology settings of a draw instance, reached as `draw.topology`: switching at runtime
3
+ * the settings that keep editing from breaking boundaries shared by adjacent features.
4
+ *
5
+ * The initial values come from {@link Options.topology}. A switch takes effect from the next
6
+ * drag start and does not affect a drag in progress.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * sharedVertexToggle.onchange = () => {
11
+ * draw.topology.setSharedVertexDrag(sharedVertexToggle.checked);
12
+ * };
13
+ * ```
14
+ */
15
+ export interface TopologyOperations {
16
+ /**
17
+ * Enables or disables simultaneous movement of shared vertices.
18
+ *
19
+ * The initial value is `options.topology.sharedVertexDrag` (the core default is false).
20
+ * While it is enabled, dragging a vertex also moves other features that have a vertex at
21
+ * an exact match (tolerance 0), and the following vertices are highlighted during the drag.
22
+ * The following features must be visible and unlocked, and be of a type whose vertices can
23
+ * be edited (not Circle, Image or Freehand). The drag commits as one change, one notification.
24
+ *
25
+ * @param enabled whether shared vertices move together
26
+ */
27
+ setSharedVertexDrag(enabled: boolean): void;
28
+ /** Whether simultaneous movement of shared vertices is enabled */
29
+ isSharedVertexDrag(): boolean;
30
+ }
@@ -0,0 +1,16 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /** @internal */
4
+ export function createTopologyApi(deps) {
5
+ const { topology } = deps;
6
+ return {
7
+ topology: {
8
+ setSharedVertexDrag(enabled) {
9
+ topology.sharedVertexDrag = enabled;
10
+ },
11
+ isSharedVertexDrag() {
12
+ return topology.sharedVertexDrag;
13
+ },
14
+ },
15
+ };
16
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The edge tracing of a draw instance, reached as `draw.tracing`.
3
+ *
4
+ * In draw_line / draw_polygon, when the previous click and this click both snapped to the
5
+ * boundary (a vertex or an edge) of the same feature, the boundary vertices between them are
6
+ * inserted: the shortest path along the edges of the visible features nearby, across shared
7
+ * vertices. It needs snapping, so it does not hold while snapping is off or released. The
8
+ * path is previewed while the pointer moves.
9
+ * The initial value comes from {@link Options.trace}; the path itself is computed by
10
+ * {@link buildTraceGraph} and {@link findTracePath}.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * draw.tracing.setEnabled(false);
15
+ * draw.tracing.isEnabled(); // false
16
+ * ```
17
+ */
18
+ export interface TracingOperations {
19
+ /**
20
+ * Enables or disables tracing.
21
+ *
22
+ * The initial value is `options.trace.enabled` (default true). When it is disabled, the
23
+ * clicks and the preview while drawing add only the point clicked. A change takes effect
24
+ * from the next click or move.
25
+ *
26
+ * @param enabled whether to trace
27
+ */
28
+ setEnabled(enabled: boolean): void;
29
+ /** Whether tracing is enabled */
30
+ isEnabled(): boolean;
31
+ }
@@ -0,0 +1,16 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /** @internal */
4
+ export function createTracingApi(deps) {
5
+ const { trace } = deps;
6
+ return {
7
+ tracing: {
8
+ setEnabled(enabled) {
9
+ trace.enabled = enabled;
10
+ },
11
+ isEnabled() {
12
+ return trace.enabled;
13
+ },
14
+ },
15
+ };
16
+ }
@@ -0,0 +1,19 @@
1
+ import type { BoundingBox, Feature } from '../../store/types.js';
2
+ import type { BoxSelectionStrategy } from './box-strategy.js';
3
+ /**
4
+ * Box selection test for Circle
5
+ *
6
+ * It tests the intersection between the selection box and the ring of the circle, which is
7
+ * expressed as a center plus a radius (in meters). Testing with the center point alone
8
+ * would fail to select a circle whose ring overlaps the box widely while its center is
9
+ * outside the box.
10
+ *
11
+ * In geographic coordinate (lng/lat) space a circle becomes an ellipse stretched by a
12
+ * factor of 1/cos(lat) along the longitude axis, so the latitude axis is normalized by a
13
+ * factor of rLng/rLat to turn it back into a true circle, and the box is put through the
14
+ * same transformation before the test.
15
+ */
16
+ export declare class CircleBoxSelectionStrategy implements BoxSelectionStrategy {
17
+ readonly featureType: "Circle";
18
+ intersects(feature: Feature, rect: BoundingBox): boolean;
19
+ }
@@ -0,0 +1,275 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * BoxSelectionStrategies
5
+ *
6
+ * The basic BoxSelectionStrategy implementations of the core edition.
7
+ * They provide the intersection test logic for box selection of each feature type.
8
+ */
9
+ import { createOBB, DEFAULT_TILE_SIZE, getMetersPerPixel, getOBBCorners, metersToDegreesLat, metersToDegreesLng, pointInRectangle, rectangleIntersectsCircle, rectangleIntersectsLineString, rectangleIntersectsOBB, rectangleIntersectsPolygon, } from '../../shared/math/index.js';
10
+ import { getCircleRadius, getImageProperties } from '../../shared/utils/property.js';
11
+ /**
12
+ * Box selection test for Point
13
+ *
14
+ * It tests whether the center coordinate is contained in the box.
15
+ *
16
+ * @internal
17
+ */
18
+ export class PointBoxSelectionStrategy {
19
+ constructor() {
20
+ Object.defineProperty(this, "featureType", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: 'Point'
25
+ });
26
+ }
27
+ intersects(feature, rect) {
28
+ if (feature.type !== 'Point')
29
+ return false;
30
+ const coord = feature.coordinates;
31
+ return pointInRectangle(coord, rect);
32
+ }
33
+ }
34
+ /**
35
+ * Box selection test for LineString
36
+ *
37
+ * It tests the intersection between the geometry and the selection box.
38
+ * true when any vertex is inside the box, or any edge intersects the box.
39
+ *
40
+ * @internal
41
+ */
42
+ export class LineStringBoxSelectionStrategy {
43
+ constructor() {
44
+ Object.defineProperty(this, "featureType", {
45
+ enumerable: true,
46
+ configurable: true,
47
+ writable: true,
48
+ value: 'LineString'
49
+ });
50
+ }
51
+ intersects(feature, rect) {
52
+ if (feature.type !== 'LineString')
53
+ return false;
54
+ const coords = feature.coordinates;
55
+ return rectangleIntersectsLineString(rect, coords);
56
+ }
57
+ }
58
+ /**
59
+ * Box selection test for Polygon
60
+ *
61
+ * It tests the intersection between the geometry and the selection box.
62
+ * true when any vertex of the polygon is inside the box,
63
+ * or any vertex of the box is inside the polygon,
64
+ * or any edge of the polygon intersects the box.
65
+ *
66
+ * @internal
67
+ */
68
+ export class PolygonBoxSelectionStrategy {
69
+ constructor() {
70
+ Object.defineProperty(this, "featureType", {
71
+ enumerable: true,
72
+ configurable: true,
73
+ writable: true,
74
+ value: 'Polygon'
75
+ });
76
+ }
77
+ intersects(feature, rect) {
78
+ if (feature.type !== 'Polygon')
79
+ return false;
80
+ const rings = feature.coordinates;
81
+ return rectangleIntersectsPolygon(rect, rings);
82
+ }
83
+ }
84
+ /**
85
+ * Box selection test for MultiPoint
86
+ *
87
+ * true when any part (a point) is inside the box.
88
+ *
89
+ * @internal
90
+ */
91
+ export class MultiPointBoxSelectionStrategy {
92
+ constructor() {
93
+ Object.defineProperty(this, "featureType", {
94
+ enumerable: true,
95
+ configurable: true,
96
+ writable: true,
97
+ value: 'MultiPoint'
98
+ });
99
+ }
100
+ intersects(feature, rect) {
101
+ if (feature.type !== 'MultiPoint')
102
+ return false;
103
+ const parts = feature.coordinates;
104
+ return parts.some((coord) => pointInRectangle(coord, rect));
105
+ }
106
+ }
107
+ /**
108
+ * Box selection test for MultiLineString
109
+ *
110
+ * true when any part (a polyline) intersects the box.
111
+ *
112
+ * @internal
113
+ */
114
+ export class MultiLineStringBoxSelectionStrategy {
115
+ constructor() {
116
+ Object.defineProperty(this, "featureType", {
117
+ enumerable: true,
118
+ configurable: true,
119
+ writable: true,
120
+ value: 'MultiLineString'
121
+ });
122
+ }
123
+ intersects(feature, rect) {
124
+ if (feature.type !== 'MultiLineString')
125
+ return false;
126
+ const parts = feature.coordinates;
127
+ return parts.some((coords) => rectangleIntersectsLineString(rect, coords));
128
+ }
129
+ }
130
+ /**
131
+ * Box selection test for MultiPolygon
132
+ *
133
+ * true when any part (an array of rings) intersects the box.
134
+ *
135
+ * @internal
136
+ */
137
+ export class MultiPolygonBoxSelectionStrategy {
138
+ constructor() {
139
+ Object.defineProperty(this, "featureType", {
140
+ enumerable: true,
141
+ configurable: true,
142
+ writable: true,
143
+ value: 'MultiPolygon'
144
+ });
145
+ }
146
+ intersects(feature, rect) {
147
+ if (feature.type !== 'MultiPolygon')
148
+ return false;
149
+ const parts = feature.coordinates;
150
+ return parts.some((rings) => rings.length > 0 && rectangleIntersectsPolygon(rect, rings));
151
+ }
152
+ }
153
+ /**
154
+ * Box selection test for Image
155
+ *
156
+ * It tests the intersection between the OBB (a bounding box that accounts for the
157
+ * rotation) and the selection box.
158
+ *
159
+ * @internal
160
+ */
161
+ export class ImageBoxSelectionStrategy {
162
+ constructor(tileSize = DEFAULT_TILE_SIZE) {
163
+ Object.defineProperty(this, "featureType", {
164
+ enumerable: true,
165
+ configurable: true,
166
+ writable: true,
167
+ value: 'Image'
168
+ });
169
+ Object.defineProperty(this, "tileSize", {
170
+ enumerable: true,
171
+ configurable: true,
172
+ writable: true,
173
+ value: void 0
174
+ });
175
+ this.tileSize = tileSize;
176
+ }
177
+ intersects(feature, rect) {
178
+ if (feature.type !== 'Image')
179
+ return false;
180
+ const obb = this.createOBBForImage(feature);
181
+ if (!obb) {
182
+ // When the OBB cannot be created, test with the coordinate alone
183
+ const coord = feature.coordinates;
184
+ return pointInRectangle(coord, rect);
185
+ }
186
+ const corners = getOBBCorners(obb);
187
+ return rectangleIntersectsOBB(rect, { corners });
188
+ }
189
+ createOBBForImage(feature) {
190
+ const properties = getImageProperties(feature);
191
+ if (!properties.imageFileId)
192
+ return null;
193
+ const coord = feature.coordinates;
194
+ const latitude = coord[1];
195
+ const style = feature.style;
196
+ const imageWidth = properties.imageWidth || 100;
197
+ const imageHeight = properties.imageHeight || 100;
198
+ const displayWidth = style?.width || imageWidth;
199
+ const displayHeight = style?.height || imageHeight;
200
+ const createdZoom = properties.createdZoom || 14;
201
+ const scale = properties.scale || 1;
202
+ const widthMeters = getMetersPerPixel(latitude, createdZoom, this.tileSize) * displayWidth * scale;
203
+ const heightMeters = getMetersPerPixel(latitude, createdZoom, this.tileSize) * displayHeight * scale;
204
+ const widthDeg = metersToDegreesLng(widthMeters, latitude);
205
+ const heightDeg = metersToDegreesLat(heightMeters);
206
+ const rotation = (style?.rotation || 0) + (properties.rotation || 0);
207
+ return createOBB(coord[0], coord[1], widthDeg, heightDeg, rotation);
208
+ }
209
+ }
210
+ /**
211
+ * Box selection test for Circle
212
+ *
213
+ * It tests the intersection between the selection box and the ring of the circle, which is
214
+ * expressed as a center plus a radius (in meters). Testing with the center point alone
215
+ * would fail to select a circle whose ring overlaps the box widely while its center is
216
+ * outside the box.
217
+ *
218
+ * In geographic coordinate (lng/lat) space a circle becomes an ellipse stretched by a
219
+ * factor of 1/cos(lat) along the longitude axis, so the latitude axis is normalized by a
220
+ * factor of rLng/rLat to turn it back into a true circle, and the box is put through the
221
+ * same transformation before the test.
222
+ */
223
+ export class CircleBoxSelectionStrategy {
224
+ constructor() {
225
+ Object.defineProperty(this, "featureType", {
226
+ enumerable: true,
227
+ configurable: true,
228
+ writable: true,
229
+ value: 'Circle'
230
+ });
231
+ }
232
+ intersects(feature, rect) {
233
+ if (feature.type !== 'Circle')
234
+ return false;
235
+ const center = feature.coordinates;
236
+ const radiusMeters = getCircleRadius(feature);
237
+ if (!radiusMeters || radiusMeters <= 0) {
238
+ return pointInRectangle(center, rect);
239
+ }
240
+ const rLng = metersToDegreesLng(radiusMeters, center[1]);
241
+ const rLat = metersToDegreesLat(radiusMeters);
242
+ if (rLng <= 0 || rLat <= 0) {
243
+ return pointInRectangle(center, rect);
244
+ }
245
+ // Normalize the latitude axis by k = rLng/rLat -> the ellipse becomes a true circle of
246
+ // radius rLng. The box is axis-aligned, so multiplying each y coordinate by k is an
247
+ // equivalent transformation.
248
+ const k = rLng / rLat;
249
+ const normRect = {
250
+ minX: rect.minX,
251
+ maxX: rect.maxX,
252
+ minY: rect.minY * k,
253
+ maxY: rect.maxY * k,
254
+ };
255
+ const normCenter = [center[0], center[1] * k];
256
+ return rectangleIntersectsCircle(normRect, normCenter, rLng);
257
+ }
258
+ }
259
+ /**
260
+ * Creates every BoxSelectionStrategy of the core edition
261
+ *
262
+ * @internal
263
+ */
264
+ export function createCoreBoxSelectionStrategies(tileSize = DEFAULT_TILE_SIZE) {
265
+ return [
266
+ new PointBoxSelectionStrategy(),
267
+ new LineStringBoxSelectionStrategy(),
268
+ new PolygonBoxSelectionStrategy(),
269
+ new MultiPointBoxSelectionStrategy(),
270
+ new MultiLineStringBoxSelectionStrategy(),
271
+ new MultiPolygonBoxSelectionStrategy(),
272
+ new CircleBoxSelectionStrategy(),
273
+ new ImageBoxSelectionStrategy(tileSize),
274
+ ];
275
+ }