@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,513 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { getModifiers } from './types.js';
4
+ const DEFAULT_OPTIONS = {
5
+ dragThreshold: 3,
6
+ clickTimeThreshold: 300,
7
+ };
8
+ /** A finger is wide and wobbles, so it needs a larger slop than the mouse */
9
+ const TOUCH_DRAG_THRESHOLD = 10;
10
+ /** A pen tip wobbles a little when it lands */
11
+ const PEN_DRAG_THRESHOLD = 5;
12
+ /** The press and hold time for contextmenu on a touch screen */
13
+ const LONG_PRESS_TIME = 500;
14
+ /** Two taps closer than this in time form a dblclick (milliseconds) */
15
+ const DOUBLE_TAP_TIME = 300;
16
+ /** Two taps closer than this in distance form a dblclick (pixels) */
17
+ const DOUBLE_TAP_DISTANCE = 20;
18
+ /**
19
+ * After a touch, the browser emits compatibility mouse events (mousemove, mousedown,
20
+ * mouseup, click) for the same tap. They are ignored for this long after the last
21
+ * touch ends when the browser does not tell them apart (sourceCapabilities).
22
+ */
23
+ const TOUCH_COMPAT_WINDOW = 1000;
24
+ /** The keys MapLibre's keyboard handler acts on (pan, rotate, pitch and zoom) */
25
+ const MAP_KEYS = new Set([
26
+ 'ArrowLeft',
27
+ 'ArrowRight',
28
+ 'ArrowUp',
29
+ 'ArrowDown',
30
+ '+',
31
+ '=',
32
+ '-',
33
+ '_',
34
+ ]);
35
+ function createProfiles(opts) {
36
+ return {
37
+ mouse: {
38
+ dragThreshold: opts.dragThreshold,
39
+ clickTimeThreshold: opts.clickTimeThreshold,
40
+ longPressTime: null,
41
+ },
42
+ touch: {
43
+ dragThreshold: Math.max(opts.dragThreshold, TOUCH_DRAG_THRESHOLD),
44
+ clickTimeThreshold: Number.POSITIVE_INFINITY,
45
+ longPressTime: LONG_PRESS_TIME,
46
+ },
47
+ pen: {
48
+ dragThreshold: Math.max(opts.dragThreshold, PEN_DRAG_THRESHOLD),
49
+ clickTimeThreshold: Number.POSITIVE_INFINITY,
50
+ longPressTime: LONG_PRESS_TIME,
51
+ },
52
+ };
53
+ }
54
+ /**
55
+ * Whether a mouse event is the compatibility event a browser emits for a touch
56
+ */
57
+ function firesTouchEvents(e) {
58
+ const caps = e
59
+ .sourceCapabilities;
60
+ return caps ? caps.firesTouchEvents === true : undefined;
61
+ }
62
+ /**
63
+ * The pointer type of a touch event (a stylus on iPadOS reports touchType 'stylus')
64
+ */
65
+ function touchPointerType(e) {
66
+ const touch = e.touches[0] ?? e.changedTouches[0];
67
+ return touch?.touchType === 'stylus'
68
+ ? 'pen'
69
+ : 'touch';
70
+ }
71
+ /**
72
+ * Creates an InputNormalizer
73
+ *
74
+ * @internal
75
+ */
76
+ export function createInputNormalizer(map, options = {}) {
77
+ const canvas = map.getCanvas();
78
+ const listeners = new Set();
79
+ const opts = { ...DEFAULT_OPTIONS, ...options };
80
+ const profiles = createProfiles(opts);
81
+ // State management
82
+ let press = null;
83
+ /**
84
+ * Whether the click that follows the last mouse release is swallowed (the press moved
85
+ * into a drag or was held too long). The browser emits click after mouseup, so this
86
+ * outlives the press.
87
+ */
88
+ let swallowNextClick = false;
89
+ /** The pointerType of the latest pointerdown, consumed by the next mousedown */
90
+ let pendingPointerType = null;
91
+ /** The pointerType of the last mouse press, for the click that follows its mouseup */
92
+ let lastMousePointerType = 'mouse';
93
+ /** Number of fingers currently on the map */
94
+ let activeTouches = 0;
95
+ /** The time the last touch ended (for filtering the compatibility mouse events) */
96
+ let lastTouchEndTime = Number.NEGATIVE_INFINITY;
97
+ /** The last tap (for forming a dblclick from two taps) */
98
+ let lastTap = null;
99
+ /** The tabIndex the canvas had before attach, given back by detach */
100
+ let hostTabIndex = null;
101
+ /** The window, for the blur that ends a press (absent outside a browser) */
102
+ const view = canvas.ownerDocument?.defaultView ?? null;
103
+ /**
104
+ * Gives the canvas the keyboard focus on a press
105
+ *
106
+ * A mode that consumes the mousedown prevents its default action, which also stops the
107
+ * browser from focusing the canvas, and then Delete and Escape would never arrive.
108
+ */
109
+ function focusCanvas() {
110
+ if (typeof canvas.focus !== 'function')
111
+ return;
112
+ if (canvas.ownerDocument?.activeElement === canvas)
113
+ return;
114
+ canvas.focus({ preventScroll: true });
115
+ }
116
+ function emit(event) {
117
+ for (const listener of listeners) {
118
+ listener(event);
119
+ }
120
+ }
121
+ function mouseEvent(type, point, lngLat, originalEvent, pointerType) {
122
+ return {
123
+ type,
124
+ point,
125
+ lngLat,
126
+ originalEvent,
127
+ modifiers: getModifiers(originalEvent),
128
+ pointerType,
129
+ };
130
+ }
131
+ function dragEvent(type, current, point, lngLat, originalEvent) {
132
+ return {
133
+ type,
134
+ point,
135
+ lngLat,
136
+ originalEvent,
137
+ modifiers: getModifiers(originalEvent),
138
+ pointerType: current.pointerType,
139
+ dragStartPoint: current.startPoint,
140
+ dragStartLngLat: current.startLngLat,
141
+ };
142
+ }
143
+ function clearLongPress(current) {
144
+ if (current.longPressTimer !== null) {
145
+ clearTimeout(current.longPressTimer);
146
+ current.longPressTimer = null;
147
+ }
148
+ }
149
+ // --------------------------------------------------------------------------
150
+ // The press, shared by the mouse and touch paths
151
+ // --------------------------------------------------------------------------
152
+ function beginPress(source, pointerType, point, lngLat, originalEvent) {
153
+ if (press)
154
+ clearLongPress(press);
155
+ const current = {
156
+ source,
157
+ pointerType,
158
+ startPoint: point,
159
+ startLngLat: lngLat,
160
+ startTime: Date.now(),
161
+ lastPoint: point,
162
+ lastLngLat: lngLat,
163
+ lastEvent: originalEvent,
164
+ dragging: false,
165
+ longPressed: false,
166
+ longPressTimer: null,
167
+ };
168
+ press = current;
169
+ swallowNextClick = false;
170
+ const longPressTime = source === 'touch' ? profiles[pointerType].longPressTime : null;
171
+ if (longPressTime !== null) {
172
+ current.longPressTimer = setTimeout(() => {
173
+ current.longPressTimer = null;
174
+ if (press !== current || current.dragging)
175
+ return;
176
+ current.longPressed = true;
177
+ emit(mouseEvent('contextmenu', point, lngLat, originalEvent, pointerType));
178
+ }, longPressTime);
179
+ }
180
+ emit(mouseEvent('mousedown', point, lngLat, originalEvent, pointerType));
181
+ }
182
+ /**
183
+ * Moves the press: mousemove within the drag threshold, then dragstart and dragmove
184
+ *
185
+ * Once the press has become a drag it stays one until it is released.
186
+ */
187
+ function movePress(current, point, lngLat, originalEvent) {
188
+ current.lastPoint = point;
189
+ current.lastLngLat = lngLat;
190
+ current.lastEvent = originalEvent;
191
+ const dx = point.x - current.startPoint.x;
192
+ const dy = point.y - current.startPoint.y;
193
+ const distance = Math.sqrt(dx * dx + dy * dy);
194
+ if (current.dragging || distance > profiles[current.pointerType].dragThreshold) {
195
+ clearLongPress(current);
196
+ const type = current.dragging ? 'dragmove' : 'dragstart';
197
+ current.dragging = true;
198
+ emit(dragEvent(type, current, point, lngLat, originalEvent));
199
+ return;
200
+ }
201
+ emit(mouseEvent('mousemove', point, lngLat, originalEvent, current.pointerType));
202
+ }
203
+ /**
204
+ * Releases the press: dragend (when dragging) and mouseup. Returns whether the release
205
+ * is a click candidate.
206
+ */
207
+ function releasePress(current, point, lngLat, originalEvent) {
208
+ clearLongPress(current);
209
+ press = null;
210
+ if (current.dragging) {
211
+ emit(dragEvent('dragend', current, point, lngLat, originalEvent));
212
+ }
213
+ emit(mouseEvent('mouseup', point, lngLat, originalEvent, current.pointerType));
214
+ const elapsed = Date.now() - current.startTime;
215
+ return (!current.dragging &&
216
+ !current.longPressed &&
217
+ elapsed <= profiles[current.pointerType].clickTimeThreshold);
218
+ }
219
+ /**
220
+ * Cancels the press: dragcancel, and nothing after it
221
+ */
222
+ function cancelPress(current, originalEvent) {
223
+ clearLongPress(current);
224
+ press = null;
225
+ // The browser's click after the release of a cancelled mouse press is not a click
226
+ if (current.source === 'mouse')
227
+ swallowNextClick = true;
228
+ emit(dragEvent('dragcancel', current, current.lastPoint, current.lastLngLat, originalEvent));
229
+ }
230
+ // --------------------------------------------------------------------------
231
+ // MapLibre mouse event handlers
232
+ // --------------------------------------------------------------------------
233
+ /**
234
+ * Whether a mouse event is the browser's compatibility event for a touch
235
+ *
236
+ * The touch path has already normalized that tap, so it is ignored. When the
237
+ * browser does not say (no sourceCapabilities), the mouse events while a finger is
238
+ * down and shortly after the last one is lifted are taken for compatibility events.
239
+ */
240
+ function isTouchCompat(e) {
241
+ const fromTouch = firesTouchEvents(e);
242
+ if (fromTouch !== undefined)
243
+ return fromTouch;
244
+ return activeTouches > 0 || Date.now() - lastTouchEndTime < TOUCH_COMPAT_WINDOW;
245
+ }
246
+ function handlePointerDown(e) {
247
+ pendingPointerType = e.pointerType;
248
+ }
249
+ function handleMouseDown(e) {
250
+ const pointerType = pendingPointerType === 'pen' ? 'pen' : 'mouse';
251
+ pendingPointerType = null;
252
+ if (e.originalEvent.button !== 0)
253
+ return; // Left click only
254
+ // Ignore clicks outside the canvas (toolbar buttons and the like)
255
+ if (e.originalEvent.target !== canvas)
256
+ return;
257
+ if (isTouchCompat(e.originalEvent))
258
+ return;
259
+ focusCanvas();
260
+ beginPress('mouse', pointerType, { x: e.point.x, y: e.point.y }, { lng: e.lngLat.lng, lat: e.lngLat.lat }, e.originalEvent);
261
+ }
262
+ function handleMouseMove(e) {
263
+ if (isTouchCompat(e.originalEvent))
264
+ return;
265
+ const currentPoint = { x: e.point.x, y: e.point.y };
266
+ const currentLngLat = { lng: e.lngLat.lng, lat: e.lngLat.lat };
267
+ if (press?.source === 'mouse') {
268
+ // The left button is already up: its mouseup went where the page could not see it
269
+ // (outside the window, or swallowed by another listener). The press is released at
270
+ // the last position it had while the button was down, and the move is a hover.
271
+ const { buttons } = e.originalEvent;
272
+ if (typeof buttons === 'number' && (buttons & 1) === 0) {
273
+ const current = press;
274
+ releasePress(current, current.lastPoint, current.lastLngLat, e.originalEvent);
275
+ swallowNextClick = true;
276
+ lastMousePointerType = current.pointerType;
277
+ }
278
+ else {
279
+ movePress(press, currentPoint, currentLngLat, e.originalEvent);
280
+ return;
281
+ }
282
+ }
283
+ // Ordinary mouse move (hover)
284
+ emit(mouseEvent('mousemove', currentPoint, currentLngLat, e.originalEvent, 'mouse'));
285
+ }
286
+ function handleMouseUp(e) {
287
+ if (e.originalEvent.button !== 0)
288
+ return;
289
+ if (isTouchCompat(e.originalEvent))
290
+ return;
291
+ const currentPoint = { x: e.point.x, y: e.point.y };
292
+ const currentLngLat = { lng: e.lngLat.lng, lat: e.lngLat.lat };
293
+ if (press?.source === 'mouse') {
294
+ const current = press;
295
+ swallowNextClick = !releasePress(current, currentPoint, currentLngLat, e.originalEvent);
296
+ lastMousePointerType = current.pointerType;
297
+ return;
298
+ }
299
+ // A release with no press on the canvas (pressed outside it)
300
+ emit(mouseEvent('mouseup', currentPoint, currentLngLat, e.originalEvent, 'mouse'));
301
+ }
302
+ function handleClick(e) {
303
+ if (e.originalEvent.button !== 0)
304
+ return;
305
+ // Ignore clicks outside the canvas (toolbar buttons and the like).
306
+ // MapLibre fires the event for every click inside the container, so
307
+ // only clicks on the canvas are handled.
308
+ if (e.originalEvent.target !== canvas)
309
+ return;
310
+ if (isTouchCompat(e.originalEvent))
311
+ return;
312
+ // A click after a drag, or after a press held too long, is not treated as a click
313
+ if (swallowNextClick) {
314
+ swallowNextClick = false;
315
+ return;
316
+ }
317
+ emit(mouseEvent('click', { x: e.point.x, y: e.point.y }, { lng: e.lngLat.lng, lat: e.lngLat.lat }, e.originalEvent, lastMousePointerType));
318
+ }
319
+ function handleDoubleClick(e) {
320
+ if (e.originalEvent.button !== 0)
321
+ return;
322
+ // Ignore double clicks outside the canvas
323
+ if (e.originalEvent.target !== canvas)
324
+ return;
325
+ if (isTouchCompat(e.originalEvent))
326
+ return;
327
+ emit(mouseEvent('dblclick', { x: e.point.x, y: e.point.y }, { lng: e.lngLat.lng, lat: e.lngLat.lat }, e.originalEvent, lastMousePointerType));
328
+ // A mode that consumed the dblclick (InputRouter prevents its default action) keeps
329
+ // MapLibre's double click zoom off: MapLibre reads only its own event's flag
330
+ if (e.originalEvent.defaultPrevented)
331
+ e.preventDefault();
332
+ }
333
+ function handleContextMenu(e) {
334
+ e.preventDefault();
335
+ // The long press of the touch path emits its own contextmenu
336
+ if (isTouchCompat(e.originalEvent))
337
+ return;
338
+ emit(mouseEvent('contextmenu', { x: e.point.x, y: e.point.y }, { lng: e.lngLat.lng, lat: e.lngLat.lat }, e.originalEvent, 'mouse'));
339
+ }
340
+ // --------------------------------------------------------------------------
341
+ // MapLibre touch event handlers
342
+ //
343
+ // MapTouchEvent.preventDefault() is never called: on touchstart it would stop
344
+ // MapLibre's pan and pinch for the gesture. A mode that takes over a one-finger
345
+ // press disables dragPan, exactly as for the mouse.
346
+ // --------------------------------------------------------------------------
347
+ function handleTouchStart(e) {
348
+ activeTouches = e.originalEvent.touches.length;
349
+ // A second finger: the gesture belongs to MapLibre. A press in progress ends
350
+ if (activeTouches !== 1) {
351
+ lastTap = null;
352
+ if (press?.source === 'touch')
353
+ cancelPress(press, e.originalEvent);
354
+ return;
355
+ }
356
+ // Ignore touches outside the canvas (controls and markers in the container)
357
+ if (e.originalEvent.target !== canvas)
358
+ return;
359
+ const point = { x: e.point.x, y: e.point.y };
360
+ const lngLat = { lng: e.lngLat.lng, lat: e.lngLat.lat };
361
+ const pointerType = touchPointerType(e.originalEvent);
362
+ // A touch has no hover, so the position is announced before the press, in the
363
+ // same order as the browser's compatibility events
364
+ emit(mouseEvent('mousemove', point, lngLat, e.originalEvent, pointerType));
365
+ beginPress('touch', pointerType, point, lngLat, e.originalEvent);
366
+ }
367
+ function handleTouchMove(e) {
368
+ if (press?.source !== 'touch' || e.originalEvent.touches.length !== 1)
369
+ return;
370
+ movePress(press, { x: e.point.x, y: e.point.y }, { lng: e.lngLat.lng, lat: e.lngLat.lat }, e.originalEvent);
371
+ }
372
+ function handleTouchEnd(e) {
373
+ activeTouches = e.originalEvent.touches.length;
374
+ if (activeTouches === 0)
375
+ lastTouchEndTime = Date.now();
376
+ if (press?.source !== 'touch')
377
+ return;
378
+ const current = press;
379
+ // The point of a touchend is the lifted finger (changedTouches)
380
+ const point = { x: e.point.x, y: e.point.y };
381
+ const lngLat = { lng: e.lngLat.lng, lat: e.lngLat.lat };
382
+ if (!releasePress(current, point, lngLat, e.originalEvent)) {
383
+ lastTap = null;
384
+ return;
385
+ }
386
+ emit(mouseEvent('click', point, lngLat, e.originalEvent, current.pointerType));
387
+ // Two taps close in time and place form a dblclick, after the second click (the
388
+ // same order as the mouse)
389
+ const now = Date.now();
390
+ if (lastTap &&
391
+ now - lastTap.time <= DOUBLE_TAP_TIME &&
392
+ Math.hypot(point.x - lastTap.point.x, point.y - lastTap.point.y) <= DOUBLE_TAP_DISTANCE) {
393
+ lastTap = null;
394
+ emit(mouseEvent('dblclick', point, lngLat, e.originalEvent, current.pointerType));
395
+ }
396
+ else {
397
+ lastTap = { point, time: now };
398
+ }
399
+ }
400
+ function handleTouchCancel(e) {
401
+ activeTouches = e.originalEvent.touches.length;
402
+ if (activeTouches === 0)
403
+ lastTouchEndTime = Date.now();
404
+ lastTap = null;
405
+ if (press?.source === 'touch')
406
+ cancelPress(press, e.originalEvent);
407
+ }
408
+ // Keyboard event handlers
409
+ function handleKeyDown(e) {
410
+ // Escape during a drag cancels the drag, and the key is used up by that
411
+ if (e.key === 'Escape' && press?.dragging) {
412
+ cancelPress(press, press.lastEvent);
413
+ return;
414
+ }
415
+ const event = {
416
+ type: 'keydown',
417
+ key: e.key,
418
+ code: e.code,
419
+ modifiers: getModifiers(e),
420
+ originalEvent: e,
421
+ };
422
+ emit(event);
423
+ // A map key a mode used (it prevented the default action) does not also reach
424
+ // MapLibre's keyboard handler, which listens on the map container (an arrow key would
425
+ // move the selection and pan the map). Other keys keep bubbling to the page
426
+ if (e.defaultPrevented && MAP_KEYS.has(e.key))
427
+ e.stopPropagation();
428
+ }
429
+ function handleKeyUp(e) {
430
+ const event = {
431
+ type: 'keyup',
432
+ key: e.key,
433
+ code: e.code,
434
+ modifiers: getModifiers(e),
435
+ originalEvent: e,
436
+ };
437
+ emit(event);
438
+ }
439
+ /**
440
+ * The window lost the focus (another application or tab): a press cannot be finished,
441
+ * so it is cancelled
442
+ */
443
+ function handleWindowBlur() {
444
+ if (!press)
445
+ return;
446
+ cancelPress(press, press.lastEvent);
447
+ }
448
+ function attach() {
449
+ // Make the canvas focusable (for the keyboard) while attached. Its focus outline is left
450
+ // to the page (MapLibre and the browser show it for keyboard focus only)
451
+ if (hostTabIndex === null) {
452
+ hostTabIndex = canvas.tabIndex;
453
+ canvas.tabIndex = 0;
454
+ }
455
+ // The handlers are fixed references inside the closure, so they can be used
456
+ // as-is for registering and unregistering.
457
+ // MapLibre events
458
+ map.on('mousedown', handleMouseDown);
459
+ map.on('mousemove', handleMouseMove);
460
+ map.on('mouseup', handleMouseUp);
461
+ map.on('click', handleClick);
462
+ map.on('dblclick', handleDoubleClick);
463
+ map.on('contextmenu', handleContextMenu);
464
+ map.on('touchstart', handleTouchStart);
465
+ map.on('touchmove', handleTouchMove);
466
+ map.on('touchend', handleTouchEnd);
467
+ map.on('touchcancel', handleTouchCancel);
468
+ // Only read, to tell a pen from a mouse in the mouse events that follow
469
+ canvas.addEventListener('pointerdown', handlePointerDown);
470
+ // Keyboard events are registered on the canvas
471
+ canvas.addEventListener('keydown', handleKeyDown);
472
+ canvas.addEventListener('keyup', handleKeyUp);
473
+ // A press cannot outlive the focus of the window
474
+ view?.addEventListener('blur', handleWindowBlur);
475
+ }
476
+ function detach() {
477
+ // MapLibre events
478
+ map.off('mousedown', handleMouseDown);
479
+ map.off('mousemove', handleMouseMove);
480
+ map.off('mouseup', handleMouseUp);
481
+ map.off('click', handleClick);
482
+ map.off('dblclick', handleDoubleClick);
483
+ map.off('contextmenu', handleContextMenu);
484
+ map.off('touchstart', handleTouchStart);
485
+ map.off('touchmove', handleTouchMove);
486
+ map.off('touchend', handleTouchEnd);
487
+ map.off('touchcancel', handleTouchCancel);
488
+ canvas.removeEventListener('pointerdown', handlePointerDown);
489
+ // A press in progress is dropped without events (nobody is listening any more)
490
+ if (press)
491
+ clearLongPress(press);
492
+ press = null;
493
+ swallowNextClick = false;
494
+ activeTouches = 0;
495
+ lastTap = null;
496
+ // Keyboard
497
+ canvas.removeEventListener('keydown', handleKeyDown);
498
+ canvas.removeEventListener('keyup', handleKeyUp);
499
+ view?.removeEventListener('blur', handleWindowBlur);
500
+ // Give the host its own tabIndex back
501
+ if (hostTabIndex !== null) {
502
+ canvas.tabIndex = hostTabIndex;
503
+ hostTabIndex = null;
504
+ }
505
+ }
506
+ function on(handler) {
507
+ listeners.add(handler);
508
+ }
509
+ function off(handler) {
510
+ listeners.delete(handler);
511
+ }
512
+ return { attach, detach, on, off };
513
+ }
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Input Types
3
+ *
4
+ * Type definitions for event normalization
5
+ */
6
+ /**
7
+ * The state of the modifier keys at the time of an input.
8
+ */
9
+ export interface ModifierKeys {
10
+ /** Whether Shift was held */
11
+ shift: boolean;
12
+ /** Whether Control was held */
13
+ ctrl: boolean;
14
+ /** Whether Alt (Option on macOS) was held */
15
+ alt: boolean;
16
+ /** Whether Meta (Command on macOS, the Windows key on Windows) was held */
17
+ meta: boolean;
18
+ }
19
+ /**
20
+ * The kind of pointer an input came from.
21
+ *
22
+ * `'touch'` is one finger of a touch screen, `'pen'` a stylus (reported either through
23
+ * the touch events, as on iPadOS, or through the mouse events the browser emits for
24
+ * it), and `'mouse'` everything else. Input with no `pointerType` (synthetic input
25
+ * through `draw.input`, for example) is treated as `'mouse'`.
26
+ */
27
+ export type PointerType = 'mouse' | 'touch' | 'pen';
28
+ /**
29
+ * The original browser event of a pointer input.
30
+ *
31
+ * Input that arrives through the mouse events (a mouse, or a pen the browser reports as
32
+ * one) carries the MouseEvent; input that arrives through the touch events (a finger,
33
+ * or a stylus on iPadOS) carries the TouchEvent. Both have `target`, the modifier keys,
34
+ * `preventDefault` and `stopPropagation`; code that needs `button` or `clientX`
35
+ * narrows with `'touches' in originalEvent`.
36
+ */
37
+ export type PointerOriginalEvent = MouseEvent | TouchEvent;
38
+ /**
39
+ * A normalized pointer event that is not a drag: a click, a press, a release or a move.
40
+ *
41
+ * Despite the name it is also produced by one-finger touch and pen input; the
42
+ * `pointerType` field tells them apart. A mode receives it through its handler methods.
43
+ */
44
+ export interface MouseNormalizedEvent {
45
+ /** The kind of input */
46
+ type: 'click' | 'dblclick' | 'mousedown' | 'mouseup' | 'mousemove' | 'contextmenu';
47
+ /** The position in CSS px, relative to the top left of the map container */
48
+ point: {
49
+ x: number;
50
+ y: number;
51
+ };
52
+ /** The position in degrees; after snapping when snapping applied */
53
+ lngLat: {
54
+ lng: number;
55
+ lat: number;
56
+ };
57
+ /** The original event (a TouchEvent for touch input) */
58
+ originalEvent: PointerOriginalEvent;
59
+ /** Modifier keys */
60
+ modifiers: ModifierKeys;
61
+ /** The kind of pointer (`'mouse'` when omitted) */
62
+ pointerType?: PointerType;
63
+ /**
64
+ * Whether to apply snapping (snapping is applied when omitted)
65
+ *
66
+ * InputRouter looks at this just before delivering the event to the mode. An event
67
+ * with this set to false is not passed through SnapService. It is the marker with
68
+ * which synthetic input chooses whether to go through snapping.
69
+ */
70
+ snap?: boolean;
71
+ }
72
+ /**
73
+ * A normalized drag event: the start, each move, the end or the cancellation of a press
74
+ * that moved.
75
+ *
76
+ * `dragcancel` ends a press without a release: a second finger touched the screen
77
+ * (the gesture is left to MapLibre's pinch and rotate), the browser cancelled the
78
+ * touch, the window lost the focus, or Escape was pressed during the drag (that Escape
79
+ * is not delivered as a keydown). It follows the `mousedown` of the press, with or without a `dragstart` before
80
+ * it, and no `dragend`, `mouseup` or `click` follows it. A mode aborts what the press
81
+ * started and keeps nothing of it.
82
+ */
83
+ export interface DragNormalizedEvent {
84
+ /** The phase of the drag */
85
+ type: 'dragstart' | 'dragmove' | 'dragend' | 'dragcancel';
86
+ /**
87
+ * The current position in CSS px relative to the map container (the last known position for
88
+ * dragcancel)
89
+ */
90
+ point: {
91
+ x: number;
92
+ y: number;
93
+ };
94
+ /** The current position in degrees (the last known position for dragcancel) */
95
+ lngLat: {
96
+ lng: number;
97
+ lat: number;
98
+ };
99
+ /**
100
+ * The original event (a TouchEvent for touch input). For a `dragcancel` by Escape or by
101
+ * the window losing the focus, the last pointer event of the press
102
+ */
103
+ originalEvent: PointerOriginalEvent;
104
+ /** Modifier keys */
105
+ modifiers: ModifierKeys;
106
+ /** The kind of pointer (`'mouse'` when omitted) */
107
+ pointerType?: PointerType;
108
+ /** The position at the start of the drag, in CSS px relative to the map container */
109
+ dragStartPoint: {
110
+ x: number;
111
+ y: number;
112
+ };
113
+ /** The position at the start of the drag, in degrees */
114
+ dragStartLngLat: {
115
+ lng: number;
116
+ lat: number;
117
+ };
118
+ /**
119
+ * Whether to apply snapping (snapping is applied when omitted)
120
+ *
121
+ * Same meaning as snap on MouseNormalizedEvent.
122
+ */
123
+ snap?: boolean;
124
+ }
125
+ /**
126
+ * A normalized keyboard event, delivered while the map canvas has the keyboard focus.
127
+ */
128
+ export interface KeyNormalizedEvent {
129
+ /** Whether the key went down or up */
130
+ type: 'keydown' | 'keyup';
131
+ /** Key name (e.g. "Escape", "Enter", "a") */
132
+ key: string;
133
+ /** Key code (e.g. "Escape", "Enter", "KeyA") */
134
+ code: string;
135
+ /** Modifier keys */
136
+ modifiers: ModifierKeys;
137
+ /** The original event */
138
+ originalEvent: KeyboardEvent;
139
+ }
140
+ export type { MapClickEventPayload } from '../shared/types/events.js';
141
+ /**
142
+ * Any input event after normalization, as a mode receives it; narrow it with `type`.
143
+ */
144
+ export type NormalizedEvent = MouseNormalizedEvent | DragNormalizedEvent | KeyNormalizedEvent;
@@ -0,0 +1,15 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Helper function that extracts ModifierKeys
5
+ *
6
+ * @internal
7
+ */
8
+ export function getModifiers(event) {
9
+ return {
10
+ shift: event.shiftKey,
11
+ ctrl: event.ctrlKey,
12
+ alt: event.altKey,
13
+ meta: event.metaKey,
14
+ };
15
+ }