@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,285 @@
1
+ /**
2
+ * ModeHandler
3
+ *
4
+ * Handler interface for the drawing modes.
5
+ * Every mode implements this interface.
6
+ */
7
+ import type { Map as MapLibreMap } from 'maplibre-gl';
8
+ import type { DragNormalizedEvent, KeyNormalizedEvent, MouseNormalizedEvent } from '../dispatcher/types.js';
9
+ import type { Mode } from '../store/types.js';
10
+ /**
11
+ * An input whose coordinates go through snapping, as asked about by
12
+ * {@link ModeHandler.isSnapEnabledFor}.
13
+ *
14
+ * Corresponds one to one with the inputs whose coordinates InputRouter passes through snapping
15
+ * (click / mousemove / dragstart / dragmove / dragend).
16
+ */
17
+ export type SnapInputType = 'click' | 'mousemove' | 'dragstart' | 'dragmove' | 'dragend';
18
+ /**
19
+ * The services of the draw instance a mode works with, passed to
20
+ * {@link ModeHandler.onStart}.
21
+ *
22
+ * Note: the redraw is triggered automatically by RenderCoordinator subscribing to Store changes,
23
+ * so a mode does not need to call requestRepaint() explicitly.
24
+ */
25
+ export interface ModeContext {
26
+ /** The map the draw instance is attached to */
27
+ map: MapLibreMap;
28
+ /** The Store of the document; a mode writes features through it */
29
+ store: import('../store/store.js').Store;
30
+ /**
31
+ * The queries of the spatial index (it is derived from the Store, so a mode only reads it)
32
+ */
33
+ spatialIndex: import('../store/spatial/spatial-index.js').SpatialQuery;
34
+ /** The hit test of the features of the Store alone */
35
+ hitTestService: import('../dispatcher/hit-test/service.js').HitTestService;
36
+ /**
37
+ * Returns the foreground hit in the visual stacking order (unified z traversal)
38
+ *
39
+ * Traverses the features of the Store and the datasets in a single
40
+ * stacking order. Selection, drag and cursor decisions use this one (`hitTestService.hitTest`
41
+ * looks only at the Store, so it would grab a feature that is occluded by a dataset).
42
+ */
43
+ hitTestTopmost: import('../dispatcher/hit-test/topmost.js').HitTestTopmost;
44
+ /**
45
+ * Provider of the companion rendering and the companion hits (the ones of this draw instance)
46
+ *
47
+ * Used to return a consumed companion hit to the provider.
48
+ */
49
+ featureCompanions: import('../view/feature-companion.js').FeatureCompanionRegistry;
50
+ /**
51
+ * The selection scope of this draw instance (the extension points of the custom feature
52
+ * types, the auxiliary handles and the thinned handle sets)
53
+ *
54
+ * The same object the CustomLayer draws the selection UI with, so hit testing and rendering
55
+ * agree, and a second draw instance on the page never takes part.
56
+ */
57
+ selectionScope: import('../view/ui/selection-scope.js').SelectionScope;
58
+ /** The emitter of the `draw.*` events of the draw instance */
59
+ eventEmitter: import('../shared/utils/event-emitter.js').EventEmitter;
60
+ /** The resolved colors and sizes of the selection UI */
61
+ selectionStyle: import('../shared/config/selection.js').SelectionUIConfig;
62
+ /**
63
+ * Topology configuration (simultaneous movement of shared vertices, and so on)
64
+ *
65
+ * When omitted, it is treated as the default value (everything disabled).
66
+ */
67
+ topology?: import('../shared/config/topology.js').TopologyConfig;
68
+ /**
69
+ * Trace configuration (whether edge tracing is enabled or disabled)
70
+ *
71
+ * When omitted, it is treated as the default value (enabled). It is the same object that
72
+ * draw.tracing rewrites, so a switch at runtime takes effect on the very next input.
73
+ */
74
+ trace?: import('../shared/config/trace.js').TraceConfig;
75
+ /**
76
+ * The resolved snapping options
77
+ *
78
+ * Read so that the simultaneous movement of shared vertices shares the "modifier key for
79
+ * temporary disabling" with snapping. When snapping is not configured, it is omitted and
80
+ * the default 'alt' is assumed.
81
+ */
82
+ snapOptions?: import('../snapping/types.js').ResolvedSnapOptions;
83
+ /** Generates the default name of a new feature (such as "Polygon 3") */
84
+ autoNameGenerator: import('../shared/utils/name-generator.js').AutoNameGenerator;
85
+ /** The box selection strategies by feature type */
86
+ boxSelectionRegistry: import('../dispatcher/hit-test/box-strategy.js').BoxSelectionStrategyRegistry;
87
+ /** The plugin manager of the draw instance (omitted when none is set up) */
88
+ pluginManager?: import('../plugins/plugin-manager.js').PluginManager;
89
+ /** Requests a mode change, as `draw.setMode` does (the same refusals apply) */
90
+ setMode: (mode: Mode) => void;
91
+ /** Generates a new unique feature id */
92
+ generateFeatureId: () => string;
93
+ /**
94
+ * Gets the ID of the writable layer, the layer that new features are written into
95
+ *
96
+ * The active layer when it exists, is not locked, is visible and is not locally hidden,
97
+ * otherwise the first such layer, otherwise an empty string. A mode reads it when it
98
+ * commits a feature; when it is an empty string the mode must not create the feature: it
99
+ * discards the drawing (clears the tentative state) and returns to select.
100
+ */
101
+ getCurrentLayerId: () => string;
102
+ /**
103
+ * Whether the line widths of the features a drawing mode creates follow the zoom (the
104
+ * `scaleWithZoom` option of the instance)
105
+ *
106
+ * When it is true, a mode writes the zoom of the commit into `properties.createdZoom`, and
107
+ * the widths of the feature grow and shrink with the map from there. When it is false, it
108
+ * writes no created zoom and the widths stay the same on the screen.
109
+ */
110
+ scaleWithZoom: boolean;
111
+ /**
112
+ * Gets the most recent snapping result (always null when snapping is not configured)
113
+ *
114
+ * This is the only read port through which a mode learns about snapping. InputRouter passes
115
+ * the coordinates of click / mousemove through snapping before delivering them to the mode,
116
+ * so at the time of onClick / onMouseMove the result readable here is the snapping result
117
+ * corresponding to the event that was just delivered (tracing reads it).
118
+ */
119
+ getSnapResult?: () => import('../snapping/types.js').SnapResult | null;
120
+ /**
121
+ * Gets a feature of a dataset (omitted when it is not configured)
122
+ *
123
+ * This is the port through which a mode resolves to a feature a snap target that was snapped
124
+ * to data (a dataset). It is a feature that is not in the Store, so it cannot
125
+ * be looked up with store.getFeature (tracing reads it).
126
+ */
127
+ getDatasetFeature?: (datasetId: string, featureId: string) => import('../store/types.js').Feature | null;
128
+ /**
129
+ * Looks up, by extent, the features of the datasets usable for tracing
130
+ *
131
+ * This is the port for adding the features of data (a dataset) to the material
132
+ * of the edge graph. It returns an empty array when snapping to data is disabled.
133
+ */
134
+ getDatasetTraceFeatures?: (bbox: import('../store/types.js').BoundingBox) => import('../store/types.js').Feature[];
135
+ }
136
+ /**
137
+ * The implementation of an interaction mode: it receives the normalized input while it is the
138
+ * current mode.
139
+ *
140
+ * Register a custom mode with `draw.registerMode(name, factory)` or `Plugin.modes`, and enter
141
+ * it with `draw.setMode(name)`. The context is passed in `onStart()` and the implementation
142
+ * keeps it in a field; it is not passed to the event handlers. Every handler is optional. The
143
+ * coordinates of the pointer events have already gone through snapping (see
144
+ * `isSnapEnabledFor`).
145
+ *
146
+ * @example
147
+ * ```ts
148
+ * import type { ModeContext, ModeHandler, MouseNormalizedEvent } from '@sakuzu/maplibre-gl-draw';
149
+ *
150
+ * // A mode that logs the clicked position and returns to select on Escape
151
+ * class ProbeMode implements ModeHandler {
152
+ * readonly modeName = 'probe';
153
+ * private context: ModeContext | null = null;
154
+ *
155
+ * onStart(context: ModeContext): void {
156
+ * this.context = context;
157
+ * }
158
+ * onClick(event: MouseNormalizedEvent): void {
159
+ * console.log(event.lngLat.lng, event.lngLat.lat);
160
+ * }
161
+ * onKeyDown(event: { key: string }): void {
162
+ * if (event.key === 'Escape') this.context?.setMode('select');
163
+ * }
164
+ * }
165
+ *
166
+ * draw.registerMode('probe', () => new ProbeMode());
167
+ * draw.setMode('probe');
168
+ * ```
169
+ */
170
+ export interface ModeHandler {
171
+ /** The name the mode is registered under */
172
+ readonly modeName: Mode;
173
+ /**
174
+ * Whether the mode writes new features into a layer
175
+ *
176
+ * A mode that declares true is entered only while a layer can be written (while
177
+ * `ModeContext.getCurrentLayerId` returns a non-empty string); otherwise setMode is ignored
178
+ * and the current mode is kept. The built-in drawing modes declare it, and a plugin mode
179
+ * that creates features declares it to get the same gate. The declaration does not remove
180
+ * the check at commit time: the layer can stop being writable while the mode is active.
181
+ */
182
+ readonly writesFeatures?: boolean;
183
+ /** Called when the mode becomes the current mode; keep the context for later */
184
+ onStart?(context: ModeContext): void;
185
+ /** Called when another mode replaces it or the draw instance is destroyed */
186
+ onStop?(): void;
187
+ /** Called on a click */
188
+ onClick?(event: MouseNormalizedEvent): void;
189
+ /** Called on a double click */
190
+ onDoubleClick?(event: MouseNormalizedEvent): void;
191
+ /** Called on a mouse move */
192
+ onMouseMove?(event: MouseNormalizedEvent): void;
193
+ /**
194
+ * Called on a mouse down
195
+ * @returns returning true consumes the event (stops the propagation to MapLibre)
196
+ */
197
+ onMouseDown?(event: MouseNormalizedEvent): boolean | undefined;
198
+ /** Called on a mouse up */
199
+ onMouseUp?(event: MouseNormalizedEvent): void;
200
+ /** Called when a drag starts */
201
+ onDragStart?(event: DragNormalizedEvent): void;
202
+ /** Called during a drag */
203
+ onDragMove?(event: DragNormalizedEvent): void;
204
+ /** Called when a drag ends */
205
+ onDragEnd?(event: DragNormalizedEvent): void;
206
+ /**
207
+ * Called when a press ends without a release (a second finger touched the screen, or the
208
+ * browser cancelled the touch)
209
+ *
210
+ * Nothing is decided: the mode abandons the press, restores what the press changed and
211
+ * gives the pan back to MapLibre. It can arrive before onDragStart (a press that has not
212
+ * become a drag yet). The coordinates are the last known position.
213
+ */
214
+ onDragCancel?(event: DragNormalizedEvent): void;
215
+ /** Called on a key down (normalized) */
216
+ onKeyDown?(event: KeyNormalizedEvent): void;
217
+ /** Called on a key up (normalized) */
218
+ onKeyUp?(event: KeyNormalizedEvent): void;
219
+ /**
220
+ * Called after an external state change
221
+ *
222
+ * Used to reset the internal state of the mode after an external state change
223
+ * (a change applied from outside the mode) has been carried out.
224
+ * Example: when the state is changed externally while drawing in the Circle mode,
225
+ * the drawing state is reset.
226
+ */
227
+ onExternalStateChange?(): void;
228
+ /**
229
+ * Called after a selection change
230
+ *
231
+ * Used to update the internal state of the mode when the selection is changed from a plugin.
232
+ */
233
+ onSelectionChange?(): void;
234
+ /**
235
+ * Undoes a vertex while drawing
236
+ *
237
+ * Called when Cmd+Z/Ctrl+Z is pressed while drawing a LineString/Polygon.
238
+ * @returns whether the undo was carried out
239
+ */
240
+ undoVertex?(): boolean;
241
+ /**
242
+ * Redoes a vertex that was undone
243
+ *
244
+ * Called when Cmd+Shift+Z/Ctrl+Y is pressed while drawing.
245
+ * @returns whether the redo was carried out
246
+ */
247
+ redoVertex?(): boolean;
248
+ /**
249
+ * Returns the feature to prefer when snapping candidates are tied
250
+ *
251
+ * Read by InputRouter right before it passes the coordinates through snapping, and passed as
252
+ * the preferFeature of SnapContext. A drawing mode returns the anchor of the trace (the
253
+ * boundary it started tracing along), which prevents the snap target from jumping to another
254
+ * feature whose coordinates overlap exactly.
255
+ *
256
+ * @returns the feature to prefer, or null if there is none
257
+ */
258
+ getSnapPreference?(): {
259
+ featureId: string;
260
+ datasetId?: string;
261
+ } | null;
262
+ /**
263
+ * Returns, per input type, whether snapping is to be applied
264
+ *
265
+ * Read by InputRouter right before it passes the coordinates through snapping. An input type
266
+ * for which false is returned does not go through SnapService and reaches the mode with its
267
+ * raw coordinates. When this is omitted (and when true is returned), snapping is applied as
268
+ * before.
269
+ *
270
+ * The tolerance (10 pixels by default) is a value premised on "once per click", so in a
271
+ * drag-driven drawing that passes several hundred points in a single stroke (freehand), the
272
+ * intermediate sample points are pulled one after another to nearby vertices and a line drawn
273
+ * straight ends up bent. A port that can be switched off per input type is provided so that
274
+ * only the inside of the stroke can be let through untouched (the start point and the end
275
+ * point can remain snapped).
276
+ *
277
+ * @param inputType the type of the input for which snapping is about to be applied
278
+ * @returns true if snapping is to be applied
279
+ */
280
+ isSnapEnabledFor?(inputType: SnapInputType): boolean;
281
+ }
282
+ /**
283
+ * Creates a new {@link ModeHandler}; called every time the mode is entered.
284
+ */
285
+ export type ModeFactory = () => ModeHandler;
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Modes module
3
+ *
4
+ * Only the symbols that src/index.ts publishes are listed here (see "The public
5
+ * surface" in CONTRIBUTING.md). Internal code imports from the defining file.
6
+ */
7
+ export type { ModeContext, ModeFactory, ModeHandler, SnapInputType } from './handler.js';
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};
@@ -0,0 +1,15 @@
1
+ import type { ModeHandler } from './handler.js';
2
+ /**
3
+ * Options of ModeManagerImpl
4
+ */
5
+ export interface ModeManagerOptions {
6
+ /**
7
+ * Whether the mode of the handler can be entered now
8
+ *
9
+ * Asked on every setMode (except the one to select) with a handler that the factory of the
10
+ * requested mode has just created; it reads what the mode declares (for example
11
+ * `writesFeatures`). When it returns false the request is ignored and the current mode is
12
+ * kept, like the interaction lock. When it is omitted, every registered mode can be entered.
13
+ */
14
+ canEnter?: (handler: ModeHandler) => boolean;
15
+ }
@@ -0,0 +1,196 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * ModeManager implementation
5
+ *
6
+ * Subscribes to the mode state of the Store and switches the handler when the mode changes.
7
+ *
8
+ * @internal
9
+ */
10
+ export class ModeManagerImpl {
11
+ constructor(store, options = {}) {
12
+ Object.defineProperty(this, "store", {
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true,
16
+ value: store
17
+ });
18
+ Object.defineProperty(this, "options", {
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true,
22
+ value: options
23
+ });
24
+ Object.defineProperty(this, "currentHandler", {
25
+ enumerable: true,
26
+ configurable: true,
27
+ writable: true,
28
+ value: null
29
+ });
30
+ Object.defineProperty(this, "factories", {
31
+ enumerable: true,
32
+ configurable: true,
33
+ writable: true,
34
+ value: new Map()
35
+ });
36
+ Object.defineProperty(this, "context", {
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true,
40
+ value: null
41
+ });
42
+ Object.defineProperty(this, "unsubscribe", {
43
+ enumerable: true,
44
+ configurable: true,
45
+ writable: true,
46
+ value: null
47
+ });
48
+ /**
49
+ * The handler created by setMode to ask canEnter, which starts when the Store reports the
50
+ * mode change (so a mode is never constructed twice for one transition)
51
+ */
52
+ Object.defineProperty(this, "pending", {
53
+ enumerable: true,
54
+ configurable: true,
55
+ writable: true,
56
+ value: null
57
+ });
58
+ }
59
+ /**
60
+ * Sets the context
61
+ */
62
+ setContext(context) {
63
+ this.context = context;
64
+ }
65
+ getMode() {
66
+ return this.store.getMode();
67
+ }
68
+ setMode(mode) {
69
+ if (mode === this.store.getMode())
70
+ return true;
71
+ // A mode without a factory is refused before the Store changes, so the Store, the
72
+ // draw.mode.change event and the running handler never disagree (a typo in a mode name
73
+ // is reported, not half applied).
74
+ const factory = this.factories.get(mode);
75
+ if (!factory) {
76
+ console.warn(`Mode "${mode}" is not registered`);
77
+ return false;
78
+ }
79
+ // While the interaction lock is on, transitions to drawing modes (anything other than
80
+ // select) are refused. In the read-only state only select is allowed, which prevents
81
+ // entering an editing mode. This is not a write gate, so it is a suppression independent
82
+ // of readOnly, and returning to select is always allowed.
83
+ if (mode !== 'select' && this.store.isInteractionLocked())
84
+ return false;
85
+ // A mode that the canEnter predicate rejects (for example, one that writes features
86
+ // while no layer can be written) is refused in the same way.
87
+ const { canEnter } = this.options;
88
+ if (canEnter && mode !== 'select') {
89
+ const handler = factory();
90
+ if (!canEnter(handler))
91
+ return false;
92
+ this.pending = { mode, handler };
93
+ }
94
+ // Following SSoT, the mode change is carried out through the Store
95
+ // The result of the mode change is handled in handleModeChange through the Store subscription
96
+ this.store.setMode(mode);
97
+ return this.store.getMode() === mode;
98
+ }
99
+ registerMode(mode, factory) {
100
+ this.factories.set(mode, factory);
101
+ return () => {
102
+ if (this.factories.get(mode) === factory)
103
+ this.unregisterMode(mode);
104
+ };
105
+ }
106
+ unregisterMode(mode) {
107
+ if (!this.factories.has(mode))
108
+ return;
109
+ if (mode !== 'select' && this.store.getMode() === mode)
110
+ this.setMode('select');
111
+ if (this.pending?.mode === mode)
112
+ this.pending = null;
113
+ this.factories.delete(mode);
114
+ }
115
+ getHandler() {
116
+ return this.currentHandler;
117
+ }
118
+ /**
119
+ * Starts the initial mode and starts subscribing to the Store
120
+ */
121
+ start() {
122
+ // Subscribe to the mode changes of the Store
123
+ this.unsubscribe = this.store.subscribe((changes) => {
124
+ if (changes.mode) {
125
+ this.handleModeChange(changes.mode.mode);
126
+ }
127
+ });
128
+ // Start the handler of the initial mode
129
+ const currentMode = this.store.getMode();
130
+ const factory = this.factories.get(currentMode);
131
+ if (factory) {
132
+ this.currentHandler = factory();
133
+ if (this.context) {
134
+ this.currentHandler.onStart?.(this.context);
135
+ }
136
+ }
137
+ }
138
+ /**
139
+ * Stops the current mode and unsubscribes
140
+ */
141
+ stop() {
142
+ if (this.currentHandler) {
143
+ this.currentHandler.onStop?.();
144
+ }
145
+ this.currentHandler = null;
146
+ if (this.unsubscribe) {
147
+ this.unsubscribe();
148
+ this.unsubscribe = null;
149
+ }
150
+ }
151
+ /**
152
+ * Handles a mode change notification from the Store
153
+ */
154
+ handleModeChange(mode) {
155
+ const factory = this.factories.get(mode);
156
+ if (!factory) {
157
+ console.warn(`Mode "${mode}" is not registered`);
158
+ return;
159
+ }
160
+ // End the current mode
161
+ if (this.currentHandler) {
162
+ this.currentHandler.onStop?.();
163
+ }
164
+ // Start the new mode (the handler that setMode created for canEnter, when there is one)
165
+ const pending = this.pending;
166
+ this.pending = null;
167
+ this.currentHandler = pending?.mode === mode ? pending.handler : factory();
168
+ if (this.context) {
169
+ this.currentHandler.onStart?.(this.context);
170
+ }
171
+ }
172
+ /**
173
+ * Notifies the current mode handler of an external state change
174
+ */
175
+ notifyStateReset() {
176
+ this.currentHandler?.onExternalStateChange?.();
177
+ }
178
+ /**
179
+ * Notifies the current mode handler of a selection change
180
+ */
181
+ notifySelectionChange() {
182
+ this.currentHandler?.onSelectionChange?.();
183
+ }
184
+ /**
185
+ * Undoes a vertex while drawing
186
+ */
187
+ undoVertex() {
188
+ return this.currentHandler?.undoVertex?.() ?? false;
189
+ }
190
+ /**
191
+ * Redoes a vertex that was undone
192
+ */
193
+ redoVertex() {
194
+ return this.currentHandler?.redoVertex?.() ?? false;
195
+ }
196
+ }
@@ -0,0 +1,52 @@
1
+ import type { BoxSelection, Coordinate, Feature } from '../../store/types.js';
2
+ import type { ModeContext } from '../handler.js';
3
+ /**
4
+ * Detect the features inside the box
5
+ *
6
+ * First the candidates are obtained quickly through the SpatialIndex (rbush),
7
+ * and then a precise inside-the-box test is performed.
8
+ */
9
+ export declare function queryFeaturesInBox(boxSelection: BoxSelection, context: ModeContext): string[];
10
+ type Rect = {
11
+ minX: number;
12
+ minY: number;
13
+ maxX: number;
14
+ maxY: number;
15
+ };
16
+ /**
17
+ * The rectangles, in longitudes within [-180, 180], that a box drawn on the screen covers
18
+ *
19
+ * The corners come from the map unprojected as they are, so a box drawn across the
20
+ * antimeridian has a longitude beyond ±180 at one side. It is brought back into [-180, 180]
21
+ * and split at the line into two rectangles, and the box as drawn is kept as well; a box as
22
+ * wide as the world covers every longitude.
23
+ */
24
+ export declare function boxRects(start: Coordinate, end: Coordinate): Rect[];
25
+ /**
26
+ * Decide whether a feature is inside the box
27
+ *
28
+ * Uses BoxSelectionStrategyRegistry to perform the appropriate test per feature type.
29
+ * - Point: whether the center coordinate is inside the box
30
+ * - LineString: intersection test between the geometry and the box
31
+ * - Polygon: intersection test between the geometry and the box
32
+ * - Text/Image: intersection test between the OBB (the bounding box that accounts for rotation)
33
+ * and the box
34
+ */
35
+ export declare function isFeatureInBox(feature: Feature, rect: {
36
+ minX: number;
37
+ minY: number;
38
+ maxX: number;
39
+ maxY: number;
40
+ }, boxSelectionRegistry: ModeContext['boxSelectionRegistry']): boolean;
41
+ /**
42
+ * The fallback box selection test
43
+ *
44
+ * Performs a simple coordinate-based test for feature types that are not registered.
45
+ */
46
+ export declare function fallbackBoxSelection(feature: Feature, rect: {
47
+ minX: number;
48
+ minY: number;
49
+ maxX: number;
50
+ maxY: number;
51
+ }): boolean;
52
+ export {};