@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,397 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
4
+ if (kind === "m") throw new TypeError("Private method is not writable");
5
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
6
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
7
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
8
+ };
9
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
10
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
11
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
12
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
13
+ };
14
+ var _SelectMode_context, _SelectMode_dragHandler, _SelectMode_config;
15
+ import { DEFAULT_SELECTION_CONFIG } from '../../shared/config/selection.js';
16
+ import { createCoordinateTransform } from '../../shared/math/index.js';
17
+ import { getDisplayFeatures } from '../../store/local-visibility.js';
18
+ import { computeCombinedGeoBoundingBox, isPointInGeoBoundingBox } from '../../view/ui/bounds.js';
19
+ import { hitTestGlobalAuxiliaryHandles, hitTestHandles } from '../../view/ui/handle-test.js';
20
+ import { computeSelectionBoundingBox, getSelectedFeatureIds, getSelectedFeatures, } from '../../view/ui/helper.js';
21
+ import { queryFeaturesInBox } from './box-selection.js';
22
+ import { handleSelectClick, handleSelectDoubleClick } from './click-handler.js';
23
+ import { updateCursorForSelection } from './cursor-handler.js';
24
+ import { SelectModeDragHandler } from './drag-handler.js';
25
+ import { getAdditionalResizeHandlesCallback, getAuxiliaryHandlesCallback, getGlobalAuxiliaryHandlesCallback, } from './hit-helpers.js';
26
+ import { handleDeleteShortcut, handleEscapeShortcut, handleGroupShortcut, handleNudgeShortcut, handleUngroupShortcut, } from './shortcut-handler.js';
27
+ /**
28
+ * Whether the selection is a feature selection of exactly these IDs, in this order
29
+ */
30
+ function selectsExactly(selection, ids) {
31
+ if (ids.length === 0)
32
+ return selection.type === null && selection.ids.length === 0;
33
+ return (selection.type === 'feature' &&
34
+ selection.ids.length === ids.length &&
35
+ selection.ids.every((id, i) => id === ids[i]));
36
+ }
37
+ /** @internal */
38
+ export class SelectMode {
39
+ constructor() {
40
+ Object.defineProperty(this, "modeName", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: 'select'
45
+ });
46
+ _SelectMode_context.set(this, void 0);
47
+ _SelectMode_dragHandler.set(this, new SelectModeDragHandler());
48
+ _SelectMode_config.set(this, DEFAULT_SELECTION_CONFIG);
49
+ }
50
+ // ============================================================================
51
+ // Lifecycle
52
+ // ============================================================================
53
+ onStart(context) {
54
+ __classPrivateFieldSet(this, _SelectMode_context, context, "f");
55
+ context.map.getCanvas().style.cursor = 'default';
56
+ // If there are features awaiting editing, notify plugins and clear the editing state
57
+ const editingIds = context.store.getEditingIds();
58
+ if (editingIds.length > 0) {
59
+ for (const id of editingIds) {
60
+ const feature = context.store.getFeature(id);
61
+ if (feature) {
62
+ context.pluginManager?.notifyFeatureCreated(feature.id, feature.type);
63
+ }
64
+ }
65
+ context.store.endEditing([...editingIds]);
66
+ }
67
+ }
68
+ onStop() {
69
+ const { store, map, pluginManager } = __classPrivateFieldGet(this, _SelectMode_context, "f");
70
+ pluginManager?.finishPluginInteraction();
71
+ __classPrivateFieldGet(this, _SelectMode_dragHandler, "f").reset(store);
72
+ if (store.getBoxSelection())
73
+ store.setBoxSelection(null);
74
+ if (store.getSelectedVertices())
75
+ store.setSelectedVertices(null);
76
+ if (!map.dragPan.isEnabled())
77
+ map.dragPan.enable();
78
+ // Clear the selection when switching modes (not notified as a change)
79
+ store.transact(() => {
80
+ store.setSelection(null, []);
81
+ }, 'silent');
82
+ }
83
+ /**
84
+ * Called after a state change from the outside (a change applied from outside the mode).
85
+ * Resets the mode's internal state to keep it consistent.
86
+ */
87
+ onExternalStateChange() {
88
+ const { store } = __classPrivateFieldGet(this, _SelectMode_context, "f");
89
+ __classPrivateFieldGet(this, _SelectMode_dragHandler, "f").reset(store);
90
+ // The selection and the vertex selection follow the change by themselves (the Store
91
+ // drops what was deleted or hidden and the vertices whose coordinates changed)
92
+ if (store.getDragState())
93
+ store.setDragState(null);
94
+ if (store.getBoxSelection())
95
+ store.setBoxSelection(null);
96
+ }
97
+ // ============================================================================
98
+ // Mouse: down / up
99
+ // ============================================================================
100
+ /**
101
+ * Disable dragPan when a handle or a feature is hit on mouse down.
102
+ * @returns true when there was a hit (the event is consumed)
103
+ */
104
+ onMouseDown(event) {
105
+ const { pluginManager, map, store } = __classPrivateFieldGet(this, _SelectMode_context, "f");
106
+ // During a plugin interaction: consume clicks inside the container
107
+ if (pluginManager?.isPluginInteracting()) {
108
+ const container = pluginManager.getPluginInteractionContainer();
109
+ if (container) {
110
+ const target = event.originalEvent.target;
111
+ if (container.contains(target))
112
+ return true;
113
+ }
114
+ }
115
+ // Shift+drag = start of a box selection: return false to avoid stopPropagation
116
+ if (event.modifiers.shift) {
117
+ map.dragPan.disable();
118
+ return false;
119
+ }
120
+ // While the interaction lock is on, dragPan is not disabled even on a
121
+ // handle / feature hit, and the drag is passed straight through to the map pan. While
122
+ // locked, moving / resizing / rotating / vertex editing are forbidden (drag-handler does not
123
+ // start them because of isInteractionBlocked), so this prevents the defect where dragging
124
+ // from on top of a feature kills the pan alone. Returning true here would make InputRouter
125
+ // call preventDefault and stop MapLibre's pan along with it, so false is always returned to
126
+ // let the event pass through. Selection by click is handled separately by
127
+ // onClick, so it is unaffected. Shift box selection is already handled above.
128
+ if (store.isInteractionLocked())
129
+ return false;
130
+ const orderedFeatures = getDisplayFeatures(store);
131
+ const selectedFeatures = getSelectedFeatures(store);
132
+ const transform = createCoordinateTransform(map);
133
+ // Test against the handles of the selected features / inside their bbox
134
+ if (selectedFeatures.length > 0) {
135
+ const bbox = computeSelectionBoundingBox(selectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope.extensions);
136
+ if (bbox) {
137
+ const zoom = map.getZoom();
138
+ const getAdditionalHandles = getAdditionalResizeHandlesCallback(selectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope);
139
+ const getAuxiliaryHandles = getAuxiliaryHandlesCallback(selectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope);
140
+ const handleHit = hitTestHandles(event.point, selectedFeatures, transform, __classPrivateFieldGet(this, _SelectMode_config, "f"), zoom, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope, getAdditionalHandles, getAuxiliaryHandles);
141
+ if (handleHit) {
142
+ map.dragPan.disable();
143
+ return true;
144
+ }
145
+ }
146
+ const geoBbox = computeCombinedGeoBoundingBox(selectedFeatures, transform, __classPrivateFieldGet(this, _SelectMode_config, "f"), __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope.extensions);
147
+ if (geoBbox) {
148
+ const geoLngLat = transform.unproject(event.point);
149
+ const geoPoint = [geoLngLat.lng, geoLngLat.lat];
150
+ if (isPointInGeoBoundingBox(geoPoint, geoBbox)) {
151
+ map.dragPan.disable();
152
+ return true;
153
+ }
154
+ }
155
+ }
156
+ // Selection-independent auxiliary handles (an extension implementation's focus, etc.). They
157
+ // appear even when the selection is empty, so they are taken after the selection handle test
158
+ // and before the feature hit test. They cannot be grabbed while readOnly (this prevents
159
+ // dragPan alone from dying even though no drag starts).
160
+ if (!store.isReadOnly()) {
161
+ const globalHit = hitTestGlobalAuxiliaryHandles(event.point, transform, __classPrivateFieldGet(this, _SelectMode_config, "f"), map.getZoom(), getGlobalAuxiliaryHandlesCallback(__classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope));
162
+ if (globalHit) {
163
+ map.dragPan.disable();
164
+ return true;
165
+ }
166
+ }
167
+ // Feature hit test (unified z traversal)
168
+ // Nothing is grabbed when a dataset is in the foreground. dragPan is also
169
+ // left alive so that the map can be panned even from on top of the data.
170
+ const top = __classPrivateFieldGet(this, _SelectMode_context, "f").hitTestTopmost(event.point, { orderedFeatures });
171
+ if (top?.kind === 'store') {
172
+ map.dragPan.disable();
173
+ return true;
174
+ }
175
+ return false;
176
+ }
177
+ onMouseUp() {
178
+ if (!__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive()) {
179
+ __classPrivateFieldGet(this, _SelectMode_context, "f").map.dragPan.enable();
180
+ }
181
+ }
182
+ // ============================================================================
183
+ // Click / DoubleClick
184
+ // ============================================================================
185
+ onClick(event) {
186
+ if (__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive())
187
+ return;
188
+ handleSelectClick(event, __classPrivateFieldGet(this, _SelectMode_context, "f"), __classPrivateFieldGet(this, _SelectMode_config, "f"));
189
+ }
190
+ onDoubleClick(event) {
191
+ handleSelectDoubleClick(event, __classPrivateFieldGet(this, _SelectMode_context, "f"));
192
+ }
193
+ // ============================================================================
194
+ // Drag
195
+ // ============================================================================
196
+ onDragStart(event) {
197
+ if (__classPrivateFieldGet(this, _SelectMode_context, "f").pluginManager?.isPluginInteracting())
198
+ return;
199
+ const { store, map } = __classPrivateFieldGet(this, _SelectMode_context, "f");
200
+ // Group / layer selections are also resolved to their members (so dragging the selection box
201
+ // moves a group as one).
202
+ const selectedIds = getSelectedFeatureIds(store);
203
+ const transform = createCoordinateTransform(map);
204
+ const dragStartPoint = event.dragStartPoint ?? event.point;
205
+ // Shift+drag = box selection
206
+ if (event.modifiers.shift) {
207
+ const geoLngLat = map.unproject([dragStartPoint.x, dragStartPoint.y]);
208
+ const startPoint = [geoLngLat.lng, geoLngLat.lat];
209
+ store.setBoxSelection({
210
+ startPoint,
211
+ endPoint: startPoint,
212
+ previousSelection: [...selectedIds],
213
+ });
214
+ map.dragPan.disable();
215
+ map.triggerRepaint();
216
+ return;
217
+ }
218
+ // While the interaction lock is on, the drag is passed straight through to
219
+ // the map pan. Neither the selection is changed nor a drag operation started (paired with
220
+ // onMouseDown not disabling dragPan; starting a move selection here would select a feature
221
+ // during a pan). Shift box selection is already handled above, so it is preserved.
222
+ if (store.isInteractionLocked())
223
+ return;
224
+ // A handle hit on the selected features -> start the corresponding drag operation
225
+ if (selectedIds.length > 0) {
226
+ const selectedFeatures = getSelectedFeatures(store);
227
+ if (selectedFeatures.length > 0) {
228
+ const bbox = computeSelectionBoundingBox(selectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope.extensions);
229
+ if (bbox) {
230
+ const zoom = map.getZoom();
231
+ const getAdditionalHandles = getAdditionalResizeHandlesCallback(selectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope);
232
+ const getAuxiliaryHandles = getAuxiliaryHandlesCallback(selectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope);
233
+ const handleHit = hitTestHandles(dragStartPoint, selectedFeatures, transform, __classPrivateFieldGet(this, _SelectMode_config, "f"), zoom, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope, getAdditionalHandles, getAuxiliaryHandles);
234
+ if (handleHit) {
235
+ __classPrivateFieldGet(this, _SelectMode_dragHandler, "f").startDrag(handleHit, event, __classPrivateFieldGet(this, _SelectMode_context, "f"), bbox);
236
+ return;
237
+ }
238
+ }
239
+ }
240
+ }
241
+ // Selection-independent auxiliary handles (an extension implementation's focus, etc.). When
242
+ // no selection handle was hit, they are taken before grabbing a feature. Whether delegation
243
+ // is accepted and the readOnly test are decided by drag-handler.
244
+ const globalHit = hitTestGlobalAuxiliaryHandles(dragStartPoint, transform, __classPrivateFieldGet(this, _SelectMode_config, "f"), map.getZoom(), getGlobalAuxiliaryHandlesCallback(__classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope));
245
+ if (globalHit) {
246
+ __classPrivateFieldGet(this, _SelectMode_dragHandler, "f").startDrag(globalHit, event, __classPrivateFieldGet(this, _SelectMode_context, "f"), null);
247
+ return;
248
+ }
249
+ // When no handle was hit: select the feature -> move operation
250
+ // When a dataset is in the foreground, nothing is grabbed and no drag is
251
+ // started (dragPan is alive, so it becomes a map pan).
252
+ const orderedFeatures = getDisplayFeatures(store);
253
+ const top = __classPrivateFieldGet(this, _SelectMode_context, "f").hitTestTopmost(dragStartPoint, { orderedFeatures });
254
+ if (top?.kind !== 'store')
255
+ return;
256
+ const hitFeatureId = top.feature.id;
257
+ if (!selectedIds.includes(hitFeatureId)) {
258
+ const filtered = __classPrivateFieldGet(this, _SelectMode_context, "f").pluginManager?.filterSelectionCandidates([hitFeatureId]) ?? [
259
+ hitFeatureId,
260
+ ];
261
+ if (filtered.length === 0)
262
+ return;
263
+ store.setSelection('feature', filtered);
264
+ }
265
+ const newSelectedFeatures = getSelectedFeatures(store);
266
+ const bbox = computeSelectionBoundingBox(newSelectedFeatures, __classPrivateFieldGet(this, _SelectMode_context, "f").selectionScope.extensions);
267
+ const moveHit = { type: 'move' };
268
+ __classPrivateFieldGet(this, _SelectMode_dragHandler, "f").startDrag(moveHit, event, __classPrivateFieldGet(this, _SelectMode_context, "f"), bbox);
269
+ }
270
+ onDragMove(event) {
271
+ const { store, map, pluginManager } = __classPrivateFieldGet(this, _SelectMode_context, "f");
272
+ const boxSelection = store.getBoxSelection();
273
+ // Update the box selection
274
+ if (boxSelection) {
275
+ const geoLngLat = map.unproject([event.point.x, event.point.y]);
276
+ const endPoint = [geoLngLat.lng, geoLngLat.lat];
277
+ const updatedBoxSelection = { ...boxSelection, endPoint };
278
+ store.setBoxSelection(updatedBoxSelection);
279
+ // Live selection preview (a frame that selects the same features changes nothing)
280
+ const hitIds = queryFeaturesInBox(updatedBoxSelection, __classPrivateFieldGet(this, _SelectMode_context, "f"));
281
+ const filtered = hitIds.length > 0 ? (pluginManager?.filterSelectionCandidates(hitIds) ?? hitIds) : hitIds;
282
+ if (!selectsExactly(store.getSelection(), filtered)) {
283
+ if (filtered.length === 0) {
284
+ store.setSelection(null, []);
285
+ }
286
+ else {
287
+ store.setSelection('feature', filtered);
288
+ }
289
+ }
290
+ return;
291
+ }
292
+ if (__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive()) {
293
+ __classPrivateFieldGet(this, _SelectMode_dragHandler, "f").updateDrag(event, __classPrivateFieldGet(this, _SelectMode_context, "f"));
294
+ }
295
+ }
296
+ onDragEnd(event) {
297
+ const { store, map, pluginManager } = __classPrivateFieldGet(this, _SelectMode_context, "f");
298
+ const boxSelection = store.getBoxSelection();
299
+ // Commit the box selection
300
+ if (boxSelection) {
301
+ const hitIds = queryFeaturesInBox(boxSelection, __classPrivateFieldGet(this, _SelectMode_context, "f"));
302
+ const filtered = hitIds.length > 0 ? (pluginManager?.filterSelectionCandidates(hitIds) ?? hitIds) : hitIds;
303
+ if (filtered.length === 0) {
304
+ store.setSelection(null, []);
305
+ }
306
+ else {
307
+ store.setSelection('feature', filtered);
308
+ }
309
+ store.setBoxSelection(null);
310
+ map.dragPan.enable();
311
+ return;
312
+ }
313
+ if (__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive()) {
314
+ __classPrivateFieldGet(this, _SelectMode_dragHandler, "f").endDrag(__classPrivateFieldGet(this, _SelectMode_context, "f"), event);
315
+ }
316
+ }
317
+ /**
318
+ * The press ended without a release (a second finger, or the browser cancelled the touch)
319
+ *
320
+ * Nothing is committed: a box selection returns to the selection it started from, a drag
321
+ * operation is abandoned, and the pan goes back to MapLibre (which also covers a press that
322
+ * disabled it in onMouseDown and never became a drag).
323
+ */
324
+ onDragCancel() {
325
+ const { store, map } = __classPrivateFieldGet(this, _SelectMode_context, "f");
326
+ const boxSelection = store.getBoxSelection();
327
+ if (boxSelection) {
328
+ if (boxSelection.previousSelection.length === 0) {
329
+ store.setSelection(null, []);
330
+ }
331
+ else {
332
+ store.setSelection('feature', [...boxSelection.previousSelection]);
333
+ }
334
+ store.setBoxSelection(null);
335
+ }
336
+ if (__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive()) {
337
+ __classPrivateFieldGet(this, _SelectMode_dragHandler, "f").reset(store);
338
+ }
339
+ if (store.getDragState())
340
+ store.setDragState(null);
341
+ if (!map.dragPan.isEnabled())
342
+ map.dragPan.enable();
343
+ }
344
+ // ============================================================================
345
+ // Keyboard / MouseMove
346
+ // ============================================================================
347
+ onKeyDown(event) {
348
+ const { pluginManager, store } = __classPrivateFieldGet(this, _SelectMode_context, "f");
349
+ // Skip destructive key operations during a plugin interaction
350
+ if (pluginManager?.isPluginInteracting()) {
351
+ if (event.key === 'Escape') {
352
+ pluginManager.cancelPluginInteraction();
353
+ }
354
+ return;
355
+ }
356
+ // Escape during a drag cancels the drag (the InputNormalizer already turns a real
357
+ // Escape into dragcancel; this covers synthetic input)
358
+ if (event.key === 'Escape' && (__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive() || store.getBoxSelection())) {
359
+ this.onDragCancel();
360
+ return;
361
+ }
362
+ // Arrow keys: move the selection by a few pixels. A used key is not also a map pan
363
+ if (handleNudgeShortcut(__classPrivateFieldGet(this, _SelectMode_context, "f"), event.key, event.modifiers)) {
364
+ event.originalEvent.preventDefault();
365
+ return;
366
+ }
367
+ const isMetaOrCtrl = event.modifiers.meta || event.modifiers.ctrl;
368
+ // Cmd+G / Ctrl+G: group
369
+ if (event.key.toLowerCase() === 'g' && isMetaOrCtrl && !event.modifiers.shift) {
370
+ event.originalEvent.preventDefault();
371
+ handleGroupShortcut(__classPrivateFieldGet(this, _SelectMode_context, "f"));
372
+ return;
373
+ }
374
+ // Shift+Cmd+G / Shift+Ctrl+G: ungroup
375
+ if (event.key.toLowerCase() === 'g' && isMetaOrCtrl && event.modifiers.shift) {
376
+ event.originalEvent.preventDefault();
377
+ handleUngroupShortcut(__classPrivateFieldGet(this, _SelectMode_context, "f"));
378
+ return;
379
+ }
380
+ // Delete / Backspace: delete the selection
381
+ if (event.key === 'Delete' || event.key === 'Backspace') {
382
+ handleDeleteShortcut(__classPrivateFieldGet(this, _SelectMode_context, "f"));
383
+ return;
384
+ }
385
+ // Escape: cancel the box selection / clear the selection
386
+ if (event.key === 'Escape') {
387
+ handleEscapeShortcut(__classPrivateFieldGet(this, _SelectMode_context, "f"));
388
+ }
389
+ }
390
+ onMouseMove(event) {
391
+ if (__classPrivateFieldGet(this, _SelectMode_dragHandler, "f").isActive() || __classPrivateFieldGet(this, _SelectMode_context, "f").pluginManager?.isPluginInteracting()) {
392
+ return;
393
+ }
394
+ updateCursorForSelection(event, __classPrivateFieldGet(this, _SelectMode_context, "f"), __classPrivateFieldGet(this, _SelectMode_config, "f"));
395
+ }
396
+ }
397
+ _SelectMode_context = new WeakMap(), _SelectMode_dragHandler = new WeakMap(), _SelectMode_config = new WeakMap();
@@ -0,0 +1,40 @@
1
+ import type { ModeContext } from '../handler.js';
2
+ /**
3
+ * Handling of the group shortcut (Cmd+G / Ctrl+G).
4
+ *
5
+ * The behavior is identical to the API's groupSelection (the key, the menu and the API place the
6
+ * new group at the same position).
7
+ */
8
+ export declare function handleGroupShortcut(context: ModeContext): void;
9
+ /**
10
+ * Handling of the ungroup shortcut (Shift+Cmd+G / Shift+Ctrl+G).
11
+ *
12
+ * The behavior is identical to the API's ungroupSelection (keeping the key, the menu and the API
13
+ * consistent): a group selection is dissolved, and for a member feature selection only that
14
+ * member leaves.
15
+ */
16
+ export declare function handleUngroupShortcut(context: ModeContext): void;
17
+ /**
18
+ * Handling of the Delete / Backspace key: deletes what is selected, exactly like
19
+ * `draw.deleteSelection()` (vertices, features, groups or layers; locked items are kept).
20
+ */
21
+ export declare function handleDeleteShortcut(context: ModeContext): void;
22
+ /**
23
+ * Handling of the arrow keys: moves the selected features by a few pixels on the screen
24
+ *
25
+ * One key press is one committed change (one notification). Like a drag, nothing moves while
26
+ * any selected feature is blocked (read-only, the interaction lock or a lock of its own).
27
+ *
28
+ * @returns whether the key was used (a selection was moved); otherwise the key is left to
29
+ * the map (MapLibre pans with it)
30
+ */
31
+ export declare function handleNudgeShortcut(context: ModeContext, key: string, modifiers: {
32
+ shift: boolean;
33
+ ctrl: boolean;
34
+ alt: boolean;
35
+ meta: boolean;
36
+ }): boolean;
37
+ /**
38
+ * Handling of the Escape key
39
+ */
40
+ export declare function handleEscapeShortcut(context: ModeContext): void;
@@ -0,0 +1,128 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Shortcut key handler
5
+ *
6
+ * Responsible for handling keyboard shortcuts in select mode
7
+ */
8
+ import { groupSelection, ungroupSelection } from '../../operations/layer-operations.js';
9
+ import { deleteSelection } from '../../operations/selection-operations.js';
10
+ import { mapCoordinatesDeep } from '../../shared/utils/coordinates.js';
11
+ import { isInteractionBlocked } from '../../store/lock.js';
12
+ import { getSelectedFeatureIds } from '../../view/ui/helper.js';
13
+ /** The distance an arrow key moves the selection (pixels; with Shift, NUDGE_LARGE) */
14
+ const NUDGE_SMALL = 1;
15
+ const NUDGE_LARGE = 10;
16
+ /** Screen direction of each arrow key */
17
+ const ARROW_DIRECTIONS = {
18
+ ArrowLeft: [-1, 0],
19
+ ArrowRight: [1, 0],
20
+ ArrowUp: [0, -1],
21
+ ArrowDown: [0, 1],
22
+ };
23
+ /**
24
+ * Handling of the group shortcut (Cmd+G / Ctrl+G).
25
+ *
26
+ * The behavior is identical to the API's groupSelection (the key, the menu and the API place the
27
+ * new group at the same position).
28
+ */
29
+ export function handleGroupShortcut(context) {
30
+ const { store, autoNameGenerator, generateFeatureId } = context;
31
+ if (store.isReadOnly() || store.isInteractionLocked())
32
+ return;
33
+ groupSelection(store, generateFeatureId, autoNameGenerator);
34
+ }
35
+ /**
36
+ * Handling of the ungroup shortcut (Shift+Cmd+G / Shift+Ctrl+G).
37
+ *
38
+ * The behavior is identical to the API's ungroupSelection (keeping the key, the menu and the API
39
+ * consistent): a group selection is dissolved, and for a member feature selection only that
40
+ * member leaves.
41
+ */
42
+ export function handleUngroupShortcut(context) {
43
+ const { store } = context;
44
+ if (store.isReadOnly() || store.isInteractionLocked())
45
+ return;
46
+ ungroupSelection(store);
47
+ }
48
+ /**
49
+ * Handling of the Delete / Backspace key: deletes what is selected, exactly like
50
+ * `draw.deleteSelection()` (vertices, features, groups or layers; locked items are kept).
51
+ */
52
+ export function handleDeleteShortcut(context) {
53
+ deleteSelection(context.store);
54
+ }
55
+ /**
56
+ * Handling of the arrow keys: moves the selected features by a few pixels on the screen
57
+ *
58
+ * One key press is one committed change (one notification). Like a drag, nothing moves while
59
+ * any selected feature is blocked (read-only, the interaction lock or a lock of its own).
60
+ *
61
+ * @returns whether the key was used (a selection was moved); otherwise the key is left to
62
+ * the map (MapLibre pans with it)
63
+ */
64
+ export function handleNudgeShortcut(context, key, modifiers) {
65
+ const direction = ARROW_DIRECTIONS[key];
66
+ if (!direction || modifiers.ctrl || modifiers.alt || modifiers.meta)
67
+ return false;
68
+ const { store, map } = context;
69
+ const features = getSelectedFeatureIds(store)
70
+ .map((id) => store.getFeature(id))
71
+ .filter((f) => f !== undefined);
72
+ if (features.length === 0)
73
+ return false;
74
+ if (features.some((f) => isInteractionBlocked(f, store)))
75
+ return false;
76
+ // One offset in degrees for every feature, taken at a point of the selection, so the
77
+ // features keep their relative placement (the same translation as a move drag)
78
+ const reference = firstCoordinate(features[0].coordinates);
79
+ if (!reference)
80
+ return false;
81
+ const step = modifiers.shift ? NUDGE_LARGE : NUDGE_SMALL;
82
+ const from = map.project(reference);
83
+ const to = map.unproject([from.x + direction[0] * step, from.y + direction[1] * step]);
84
+ const dx = to.lng - reference[0];
85
+ const dy = to.lat - reference[1];
86
+ store.transact(() => {
87
+ for (const feature of features) {
88
+ const coordinates = mapCoordinatesDeep(feature.coordinates, (c) => [c[0] + dx, c[1] + dy]);
89
+ store.updateFeature(feature.id, { coordinates });
90
+ }
91
+ });
92
+ return true;
93
+ }
94
+ function firstCoordinate(coordinates) {
95
+ let value = coordinates;
96
+ while (Array.isArray(value) && Array.isArray(value[0]))
97
+ value = value[0];
98
+ return Array.isArray(value) && typeof value[0] === 'number' ? value : null;
99
+ }
100
+ /**
101
+ * Handling of the Escape key
102
+ */
103
+ export function handleEscapeShortcut(context) {
104
+ const { store, map } = context;
105
+ const boxSelection = store.getBoxSelection();
106
+ if (boxSelection) {
107
+ // Cancel when a box selection is in progress (restore the selection as it was when the drag
108
+ // started)
109
+ if (boxSelection.previousSelection.length === 0) {
110
+ store.setSelection(null, []);
111
+ }
112
+ else {
113
+ store.setSelection('feature', boxSelection.previousSelection);
114
+ }
115
+ store.setBoxSelection(null);
116
+ map.dragPan.enable();
117
+ map.triggerRepaint();
118
+ return;
119
+ }
120
+ // Clear the vertex selection when vertices are selected
121
+ const selectedVertices = store.getSelectedVertices();
122
+ if (selectedVertices) {
123
+ store.setSelectedVertices(null);
124
+ return;
125
+ }
126
+ // Clear the feature selection
127
+ store.setSelection(null, []);
128
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Operations module
3
+ *
4
+ * Only the symbols that src/index.ts publishes are listed here (see "The public
5
+ * surface" in CONTRIBUTING.md). Internal code imports from the defining file.
6
+ */
7
+ export type { ResizeState } from './resize.js';
8
+ export type { TraceGraph, TraceGraphEdge, TraceGraphEndpoint, TraceGraphNode, } from './trace-graph.js';
9
+ export { buildTraceGraph, findTracePath } from './trace-graph.js';
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export { buildTraceGraph, findTracePath } from './trace-graph.js';
@@ -0,0 +1 @@
1
+ export {};