@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,157 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { getDisplayFeatures } from '../../store/local-visibility.js';
4
+ import { hitTestFeatureCompanions } from '../../view/feature-companion.js';
5
+ import { clickCopies } from './local-frame.js';
6
+ import { DEFAULT_HIT_TEST_OPTIONS } from './strategies/base.js';
7
+ import { createVisibilityLookup } from './visibility-lookup.js';
8
+ /**
9
+ * Creates the hit tester of the unified z traversal
10
+ *
11
+ * @internal
12
+ */
13
+ export function createTopmostHitTester(deps) {
14
+ const { store, hitTestService, unproject, toleranceLngLat, datasets } = deps;
15
+ const test = (feature, coordinate, tolerance) => hitTestService.hitTestFeature(feature, coordinate, tolerance);
16
+ /**
17
+ * Builds the context of the companion hits (null unless the configuration can perform
18
+ * the test)
19
+ *
20
+ * It is not built when no provider at all is registered, so the conventional traversal
21
+ * changes neither in cost nor in path.
22
+ */
23
+ const companionContext = (point) => {
24
+ if (!deps.companions?.any())
25
+ return null;
26
+ const project = deps.project;
27
+ const getZoom = deps.getZoom;
28
+ if (!project || !getZoom)
29
+ return null;
30
+ return {
31
+ point,
32
+ project,
33
+ unproject: (p) => {
34
+ const { lng, lat } = unproject(p);
35
+ return { lng, lat };
36
+ },
37
+ zoom: getZoom(),
38
+ tolerancePx: deps.clickTolerancePx ?? DEFAULT_HIT_TEST_OPTIONS.clickTolerance,
39
+ };
40
+ };
41
+ /**
42
+ * Asks for a hit on the companions of one feature (a feature that is not visible is not
43
+ * asked)
44
+ */
45
+ const companionOf = (feature, context, visible) => {
46
+ if (!context)
47
+ return null;
48
+ if (!visible(feature))
49
+ return null;
50
+ const companions = deps.companions;
51
+ if (!companions)
52
+ return null;
53
+ const companion = hitTestFeatureCompanions(companions, feature, context);
54
+ return companion ? { kind: 'companion', companion } : null;
55
+ };
56
+ return (point, options) => {
57
+ const orderedFeatures = options?.orderedFeatures ?? getDisplayFeatures(store);
58
+ const companion = companionContext(point);
59
+ // Within one hit test, the visibility of a layer or a group is looked up only once per
60
+ // container.
61
+ const visible = createVisibilityLookup(store);
62
+ // On a map with no dataset at all (none is visible), the cost is kept the same as
63
+ // the conventional path. The spatial index is queried only once as well.
64
+ if (!datasets?.hasAny()) {
65
+ if (!companion) {
66
+ const hit = hitTestService.hitTest(point, unproject, orderedFeatures);
67
+ return hit ? { kind: 'store', feature: hit.feature } : null;
68
+ }
69
+ // A companion sits one z below the feature itself, so the features are examined one
70
+ // at a time from the front in the order "the feature itself -> its companions". The
71
+ // spatial index is queried only once.
72
+ const storeHits = new Set(hitTestService.hitTestAll(point, unproject, orderedFeatures).map((r) => r.feature.id));
73
+ for (let i = orderedFeatures.length - 1; i >= 0; i--) {
74
+ const feature = orderedFeatures[i];
75
+ if (storeHits.has(feature.id))
76
+ return { kind: 'store', feature };
77
+ const companionHit = companionOf(feature, companion, visible);
78
+ if (companionHit)
79
+ return companionHit;
80
+ }
81
+ return null;
82
+ }
83
+ const lngLat = unproject(point);
84
+ const tolerance = toleranceLngLat(point);
85
+ // The click on each copy of the world it can reach (the stored copy first; local-frame.ts)
86
+ const copies = clickCopies([lngLat.lng, lngLat.lat], tolerance);
87
+ const onCopies = (hitOn) => {
88
+ for (const copy of copies) {
89
+ const hit = hitOn(copy);
90
+ if (hit)
91
+ return hit;
92
+ }
93
+ return null;
94
+ };
95
+ // 1. The above-store side
96
+ const above = onCopies((copy) => datasets.hitTestSide('above-store', copy, tolerance, test));
97
+ if (above)
98
+ return toTopHit(above);
99
+ // 2. The stacking order from the front. One hit test per frame is enough on the Store
100
+ // side, so it is performed only once, at the moment a layer entry is first met.
101
+ let storeHits;
102
+ let byLayer;
103
+ const layerOrder = store.getLayerOrder();
104
+ for (let i = layerOrder.length - 1; i >= 0; i--) {
105
+ const entryId = layerOrder[i];
106
+ if (store.getLayer(entryId) !== undefined) {
107
+ if (!storeHits) {
108
+ storeHits = new Set(hitTestService
109
+ .hitTestAll(point, unproject, orderedFeatures)
110
+ .map((result) => result.feature.id));
111
+ byLayer = groupByLayer(orderedFeatures);
112
+ }
113
+ // Even when not a single feature itself was hit, a companion can still be hit
114
+ if (storeHits.size === 0 && !companion)
115
+ continue;
116
+ const features = byLayer?.get(entryId);
117
+ if (!features)
118
+ continue;
119
+ for (let j = features.length - 1; j >= 0; j--) {
120
+ const feature = features[j];
121
+ if (storeHits.has(feature.id))
122
+ return { kind: 'store', feature };
123
+ const companionHit = companionOf(feature, companion, visible);
124
+ if (companionHit)
125
+ return companionHit;
126
+ }
127
+ continue;
128
+ }
129
+ const entry = onCopies((copy) => datasets.hitTestEntry(entryId, copy, tolerance, test));
130
+ if (entry)
131
+ return toTopHit(entry);
132
+ }
133
+ // 3. The below-store side
134
+ const below = onCopies((copy) => datasets.hitTestSide('below-store', copy, tolerance, test));
135
+ return below ? toTopHit(below) : null;
136
+ };
137
+ }
138
+ /**
139
+ * Converts a dataset hit into a TopHit
140
+ */
141
+ function toTopHit(hit) {
142
+ return { kind: 'dataset', dataset: hit.dataset, feature: hit.feature, row: hit.row };
143
+ }
144
+ /**
145
+ * Splits the features in display order per layer (the order is preserved)
146
+ */
147
+ function groupByLayer(orderedFeatures) {
148
+ const byLayer = new Map();
149
+ for (const feature of orderedFeatures) {
150
+ const features = byLayer.get(feature.layerId);
151
+ if (features)
152
+ features.push(feature);
153
+ else
154
+ byLayer.set(feature.layerId, [feature]);
155
+ }
156
+ return byLayer;
157
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Visibility lookup for hit testing
3
+ *
4
+ * Whether a feature can be selected is decided by the visible flag of the feature itself,
5
+ * its layer and its group. A single hit test asks this once per feature, so looking the
6
+ * store up for every feature makes one test O(N^2) on implementations where reading a
7
+ * layer costs time proportional to the feature count N (such as a replaced DocumentStore
8
+ * that copies the order array on every read). Here each layer and group is looked up only
9
+ * once per hit test, and features reuse the result of that lookup.
10
+ *
11
+ * The lookup is built for each hit test call (it is never carried over across store changes).
12
+ */
13
+ import type { Store } from '../../store/store.js';
14
+ import type { Feature } from '../../store/types.js';
15
+ export type VisibilityLookup = (feature: Feature) => boolean;
16
+ /**
17
+ * Builds the lookup for a single hit test.
18
+ *
19
+ * Features that are not visible (any of feature / layer / group has visible=false) are not
20
+ * drawn, so they are excluded from the targets. A lock forbids interaction, not selection,
21
+ * so it is not consulted here.
22
+ */
23
+ export declare function createVisibilityLookup(store: Store): VisibilityLookup;
@@ -0,0 +1,40 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Builds the lookup for a single hit test.
5
+ *
6
+ * Features that are not visible (any of feature / layer / group has visible=false) are not
7
+ * drawn, so they are excluded from the targets. A lock forbids interaction, not selection,
8
+ * so it is not consulted here.
9
+ */
10
+ export function createVisibilityLookup(store) {
11
+ const layers = new Map();
12
+ const groups = new Map();
13
+ const layerVisible = (id) => {
14
+ let visible = layers.get(id);
15
+ if (visible === undefined) {
16
+ const layer = store.getLayer(id);
17
+ visible = !layer || layer.visible;
18
+ layers.set(id, visible);
19
+ }
20
+ return visible;
21
+ };
22
+ const groupVisible = (id) => {
23
+ let visible = groups.get(id);
24
+ if (visible === undefined) {
25
+ const group = store.getGroup(id);
26
+ visible = !group || group.visible;
27
+ groups.set(id, visible);
28
+ }
29
+ return visible;
30
+ };
31
+ return (feature) => {
32
+ if (!feature.visible)
33
+ return false;
34
+ if (!layerVisible(feature.layerId))
35
+ return false;
36
+ if (feature.groupId && !groupVisible(feature.groupId))
37
+ return false;
38
+ return true;
39
+ };
40
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Dispatcher module
3
+ *
4
+ * Responsible for accepting user input and routing it to modes.
5
+ * The input handling layer of the Flux architecture.
6
+ *
7
+ * Only the symbols that src/index.ts publishes are listed here (see "The public
8
+ * surface" in CONTRIBUTING.md). Internal code imports from the defining file.
9
+ */
10
+ export type { BoxSelectionStrategy, BoxSelectionStrategyRegistry, } from './hit-test/box-strategy.js';
11
+ export type { HitTestService, UnprojectFunction } from './hit-test/service.js';
12
+ export type { HitTestOptions, HitTestResult, HitTestStrategy, VertexHit, } from './hit-test/strategies/base.js';
13
+ export { PointHitTestStrategy } from './hit-test/strategies/point.js';
14
+ export type { HitTestTopmost, TopHit, TopmostHitTestOptions } from './hit-test/topmost.js';
15
+ export type { DragNormalizedEvent, KeyNormalizedEvent, MapClickEventPayload, ModifierKeys, MouseNormalizedEvent, NormalizedEvent, PointerOriginalEvent, PointerType, } from './types.js';
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export { PointHitTestStrategy } from './hit-test/strategies/point.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,288 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { nearestLongitude, wrapLongitude } from '../shared/math/longitude.js';
4
+ /**
5
+ * The event types that are stopped while the pointer is held
6
+ *
7
+ * Only the ones that determine coordinates are stopped. Stopping mousedown /
8
+ * mouseup / the drag events would also break the pan and zoom of MapLibre.
9
+ */
10
+ const HELD_EVENT_TYPES = new Set([
11
+ 'click',
12
+ 'dblclick',
13
+ 'mousemove',
14
+ ]);
15
+ /**
16
+ * The first coordinate of a shape being drawn (null when there is none)
17
+ */
18
+ function firstTentativeCoordinate(tentative) {
19
+ let value = tentative?.coordinates;
20
+ while (Array.isArray(value) && Array.isArray(value[0]))
21
+ value = value[0];
22
+ if (Array.isArray(value) && typeof value[0] === 'number' && typeof value[1] === 'number') {
23
+ return value;
24
+ }
25
+ return null;
26
+ }
27
+ /**
28
+ * Brings the longitudes of an event onto the stored copy of the world
29
+ *
30
+ * The rule, from the point of view of the pointer:
31
+ *
32
+ * - A click, a move or a press on its own lands in [-180, 180], the range the features are
33
+ * stored in. This is the same point hit testing starts from (`clickCopies` in
34
+ * hit-test/local-frame.ts), so a point placed or a feature picked on the copy east of the
35
+ * antimeridian gets its stored longitude
36
+ * - While a shape is being drawn, the pointer goes to the copy nearest to the first vertex of the
37
+ * shape instead, so a line drawn across the antimeridian stays continuous (170 then 190, not
38
+ * 170 then -170, which would run the other way round the world). Its vertices can then lie a
39
+ * little beyond ±180; the rendering and the export deal with that
40
+ * - A drag moves every coordinate of its events by the one shift decided from where it started
41
+ * (`dragStartLngLat`), so the distance dragged never jumps by 360 degrees when the pointer
42
+ * crosses the antimeridian during the drag
43
+ *
44
+ * Away from the antimeridian, on the main copy of the world, nothing changes and the event is
45
+ * returned as it is.
46
+ */
47
+ function toStoredCopy(event, reference) {
48
+ if (!('lngLat' in event))
49
+ return event;
50
+ const anchor = 'dragStartLngLat' in event ? event.dragStartLngLat.lng : event.lngLat.lng;
51
+ const target = reference ? nearestLongitude(anchor, reference[0]) : wrapLongitude(anchor);
52
+ const shift = target - anchor;
53
+ if (shift === 0)
54
+ return event;
55
+ const moved = { ...event, lngLat: { lng: event.lngLat.lng + shift, lat: event.lngLat.lat } };
56
+ if ('dragStartLngLat' in event) {
57
+ moved.dragStartLngLat = {
58
+ lng: event.dragStartLngLat.lng + shift,
59
+ lat: event.dragStartLngLat.lat,
60
+ };
61
+ }
62
+ return moved;
63
+ }
64
+ /**
65
+ * Creates an InputRouter
66
+ *
67
+ * @internal
68
+ */
69
+ export function createInputRouter(deps) {
70
+ const { normalizer, modeManager, context, map, pluginManager, displayInteractions, notifyMapClick, snapService, } = deps;
71
+ let boundHandleEvent = null;
72
+ /**
73
+ * Whether input originating from the pointer is currently held
74
+ *
75
+ * While the keyboard is determining the coordinates, as with a numeric input
76
+ * panel, interruption by the real pointer is stopped. What is stopped is only the
77
+ * events that "determine" coordinates (click / dblclick / mousemove); mousedown /
78
+ * mouseup / the drag events are let through (so as not to kill the pan and zoom of
79
+ * MapLibre; drawing modes do not consume them).
80
+ */
81
+ let pointerHeld = false;
82
+ /**
83
+ * Builds the snapping context
84
+ *
85
+ * While a vertex / midpoint is being dragged, the grabbed vertex itself is
86
+ * excluded (the other vertices of the same feature stay as candidates so that a
87
+ * ring can be closed). The exclusion can be derived from the drag state of the
88
+ * Store, so no modification is needed on the select mode side.
89
+ *
90
+ * While a move drag is in progress, the features being moved are excluded whole.
91
+ * A feature being moved travels with the cursor, so if it stayed a candidate it
92
+ * would always sit inside the tolerance, the cursor would be pulled back to its
93
+ * own position, and it would repeat "drift every frame by the offset from when it
94
+ * was grabbed, then leave the tolerance and catch up all at once" (which looks
95
+ * like a vibration). It is the same reasoning as excludeVertex for a vertex drag,
96
+ * except that the unit that is removed is the whole feature.
97
+ *
98
+ * The feature to prefer when candidates tie is read from the current mode (a
99
+ * drawing mode returns the boundary it started tracing).
100
+ */
101
+ function buildSnapContext(modifiers) {
102
+ const dragState = context.store.getDragState();
103
+ const isVertexDrag = dragState?.operation === 'vertex' || dragState?.operation === 'midpoint';
104
+ const excludeVertex = isVertexDrag && dragState?.activeFeatureId && dragState.activeVertex
105
+ ? { featureId: dragState.activeFeatureId, vertex: dragState.activeVertex }
106
+ : undefined;
107
+ const moving = dragState?.operation === 'move' ? dragState.movingFeatureIds : undefined;
108
+ const excludeFeatureIds = moving && moving.length > 0 ? new Set(moving) : undefined;
109
+ const preferFeature = modeManager.getHandler()?.getSnapPreference?.() ?? undefined;
110
+ return {
111
+ zoom: map.getZoom(),
112
+ excludeVertex,
113
+ excludeFeatureIds,
114
+ preferFeature,
115
+ modifiers,
116
+ };
117
+ }
118
+ /**
119
+ * Replaces lngLat with the snapped coordinates just before delivery to the mode
120
+ *
121
+ * When nothing was snapped, the event is returned as-is (no pointless copy).
122
+ *
123
+ * Whether snapping is wanted is asked of the current mode per input type
124
+ * (isSnapEnabledFor). A mode that does not declare it snaps for every input type
125
+ * (as before).
126
+ */
127
+ function applySnap(event, inputType) {
128
+ if (!snapService || event.snap === false)
129
+ return event;
130
+ if (modeManager.getHandler()?.isSnapEnabledFor?.(inputType) === false)
131
+ return event;
132
+ const result = snapService.resolve(event.lngLat, event.point, buildSnapContext(event.modifiers));
133
+ if (result.lngLat.lng === event.lngLat.lng && result.lngLat.lat === event.lngLat.lat) {
134
+ return event;
135
+ }
136
+ return { ...event, lngLat: { lng: result.lngLat.lng, lat: result.lngLat.lat } };
137
+ }
138
+ function handleEvent(input, options = {}) {
139
+ // Only input originating from the real pointer is stopped while held.
140
+ // Synthetic input (dispatch) is let through
141
+ if (pointerHeld && !options.synthetic && HELD_EVENT_TYPES.has(input.type))
142
+ return;
143
+ const handler = modeManager.getHandler();
144
+ if (!handler)
145
+ return;
146
+ // The single place where the longitude of the input is decided (see toStoredCopy)
147
+ const event = toStoredCopy(input, firstTentativeCoordinate(context.store.getTentative()));
148
+ switch (event.type) {
149
+ case 'click': {
150
+ // Deliver to the mode with the snapped coordinates (if nothing snapped,
151
+ // the original event is used unchanged)
152
+ const snapped = applySnap(event, 'click');
153
+ handleClick(handler, snapped);
154
+ // Delivery to datasets happens only in select mode. A click
155
+ // in a drawing mode places a vertex, and delivering that same click as a
156
+ // click on the data as well would make the host application's "click to
157
+ // select" fire by mistake while drawing (for example, starting to draw a
158
+ // circle on top of a huge polygon of data would cover the whole screen with
159
+ // the selection highlight). The rule that a hit in the Store always wins is
160
+ // decided on the interception side, so the selection behavior of the mode
161
+ // during select is unaffected.
162
+ if (handler.modeName === 'select')
163
+ displayInteractions?.handleClick(snapped);
164
+ // Emit the click of select mode as a single stream regardless of whether
165
+ // anything was hit (draw.map.click). display.click is designed not to fire
166
+ // when a feature in the Store is hit, so a host application that needs "a
167
+ // click anywhere on the map" (placing a comment pin, for instance) watches
168
+ // this one. The coordinates are copied from the raw event before snapping.
169
+ if (handler.modeName === 'select') {
170
+ notifyMapClick?.({
171
+ lngLat: [event.lngLat.lng, event.lngLat.lat],
172
+ point: { x: event.point.x, y: event.point.y },
173
+ });
174
+ }
175
+ break;
176
+ }
177
+ case 'dblclick':
178
+ handler.onDoubleClick?.(event);
179
+ break;
180
+ case 'mousedown':
181
+ handleMouseDown(handler, event);
182
+ break;
183
+ case 'mouseup':
184
+ handler.onMouseUp?.(event);
185
+ break;
186
+ case 'mousemove': {
187
+ const snapped = applySnap(event, 'mousemove');
188
+ // Call the onMouseMove of the plugins (they do not consume it)
189
+ pluginManager?.handleMouseMove(snapped);
190
+ handler.onMouseMove?.(snapped);
191
+ // The hover of datasets is likewise limited to select mode,
192
+ // by the same rule as click. When switching to a drawing mode, a hover that
193
+ // is still held is discarded (so that it does not fire on the stale target
194
+ // when coming back).
195
+ if (handler.modeName === 'select') {
196
+ displayInteractions?.handleMouseMove(snapped);
197
+ }
198
+ else {
199
+ displayInteractions?.reset();
200
+ }
201
+ break;
202
+ }
203
+ case 'contextmenu':
204
+ // contextmenu currently has no special handling
205
+ break;
206
+ // The start and end of a drag also go through snapping. This is to keep
207
+ // "start drawing exactly at a corner of a boundary and end at a corner" for
208
+ // drag-driven drawing (freehand). The drag operations of select mode use
209
+ // dragStartLngLat (the press position from before the threshold was exceeded)
210
+ // as their start position, so they are unaffected by the replacement here.
211
+ case 'dragstart': {
212
+ const snapped = applySnap(event, 'dragstart');
213
+ handler.onDragStart?.(snapped);
214
+ break;
215
+ }
216
+ case 'dragmove': {
217
+ const snapped = applySnap(event, 'dragmove');
218
+ // Call the onDragMove of the plugins (they do not consume it; the
219
+ // counterpart of onMouseMove)
220
+ pluginManager?.handleDragMove(snapped);
221
+ handler.onDragMove?.(snapped);
222
+ break;
223
+ }
224
+ case 'dragend': {
225
+ const snapped = applySnap(event, 'dragend');
226
+ handler.onDragEnd?.(snapped);
227
+ break;
228
+ }
229
+ // A press ended without a release (a second finger, or the browser cancelled the
230
+ // touch). No coordinates are decided, so it does not go through snapping, and it
231
+ // is never held: the mode must always get the chance to abort the press.
232
+ case 'dragcancel':
233
+ handler.onDragCancel?.(event);
234
+ break;
235
+ case 'keydown':
236
+ // Call the onKeyDown of the plugins first
237
+ if (pluginManager?.handleKeyDown(event)) {
238
+ // Handled by a plugin
239
+ break;
240
+ }
241
+ handler.onKeyDown?.(event);
242
+ break;
243
+ case 'keyup':
244
+ handler.onKeyUp?.(event);
245
+ break;
246
+ }
247
+ }
248
+ function handleClick(handler, event) {
249
+ handler.onClick?.(event);
250
+ }
251
+ function handleMouseDown(handler, event) {
252
+ if (handler.onMouseDown) {
253
+ const consumed = handler.onMouseDown(event);
254
+ // When the event has been consumed, stop it from propagating to MapLibre
255
+ if (consumed) {
256
+ const original = event.originalEvent;
257
+ original.stopPropagation();
258
+ // MapLibre listens to touchstart as a passive listener, where preventDefault() is
259
+ // ignored and makes the browser warn. The pan and the pinch of a touch are left to
260
+ // MapLibre, so only a mouse press has its default action prevented.
261
+ if (!('touches' in original)) {
262
+ original.preventDefault();
263
+ }
264
+ }
265
+ }
266
+ }
267
+ function start() {
268
+ boundHandleEvent = handleEvent;
269
+ normalizer.on(boundHandleEvent);
270
+ }
271
+ function stop() {
272
+ if (boundHandleEvent) {
273
+ normalizer.off(boundHandleEvent);
274
+ boundHandleEvent = null;
275
+ }
276
+ }
277
+ return {
278
+ start,
279
+ stop,
280
+ dispatch: (event) => handleEvent(event, { synthetic: true }),
281
+ setPointerHold(held) {
282
+ pointerHeld = held;
283
+ },
284
+ isPointerHeld() {
285
+ return pointerHeld;
286
+ },
287
+ };
288
+ }
@@ -0,0 +1 @@
1
+ export {};