@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,72 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { getCursorForHandle, hitTestHandles, } from '../view/ui/handle-test.js';
4
+ /**
5
+ * Cursor management class
6
+ *
7
+ * @internal
8
+ */
9
+ export class CursorManager {
10
+ constructor(canvas, defaultCursor = 'default') {
11
+ Object.defineProperty(this, "canvas", {
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ value: void 0
16
+ });
17
+ Object.defineProperty(this, "defaultCursor", {
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ value: void 0
22
+ });
23
+ this.canvas = canvas;
24
+ this.defaultCursor = defaultCursor;
25
+ }
26
+ /**
27
+ * Sets the default cursor
28
+ */
29
+ setDefault() {
30
+ this.canvas.style.cursor = this.defaultCursor;
31
+ }
32
+ /**
33
+ * Sets the cursor
34
+ */
35
+ set(cursor) {
36
+ this.canvas.style.cursor = cursor;
37
+ }
38
+ /**
39
+ * Sets the cursor based on the handle hit result
40
+ */
41
+ setForHandle(handleHit) {
42
+ this.canvas.style.cursor = getCursorForHandle(handleHit);
43
+ }
44
+ /**
45
+ * Sets the pointer cursor
46
+ */
47
+ setPointer() {
48
+ this.canvas.style.cursor = 'pointer';
49
+ }
50
+ /**
51
+ * Sets the text cursor
52
+ */
53
+ setText() {
54
+ this.canvas.style.cursor = 'text';
55
+ }
56
+ /**
57
+ * Updates the cursor based on the selected features and the mouse position
58
+ *
59
+ * @returns true if a handle was hit
60
+ */
61
+ updateForSelection(screenPoint, selectedFeatures, bbox, transform, config, zoom, scope) {
62
+ if (!bbox || selectedFeatures.length === 0) {
63
+ return false;
64
+ }
65
+ const handleHit = hitTestHandles(screenPoint, selectedFeatures, transform, config, zoom, scope);
66
+ if (handleHit) {
67
+ this.setForHandle(handleHit);
68
+ return true;
69
+ }
70
+ return false;
71
+ }
72
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,222 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { haversineDistanceMeters, initialBearingDegrees } from '../../geometry/index.js';
4
+ import { createdZoomProperty, resolveCommitLayer } from './commit-layer.js';
5
+ /** Default angle of the radius handle (toward the lower right) */
6
+ const DEFAULT_RADIUS_HANDLE_ANGLE = 135;
7
+ /** Minimum radius (in meters) */
8
+ const MIN_RADIUS_METERS = 1;
9
+ /**
10
+ * DrawCircleMode implementation
11
+ *
12
+ * @internal
13
+ */
14
+ export class DrawCircleMode {
15
+ constructor() {
16
+ Object.defineProperty(this, "modeName", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: 'draw_circle'
21
+ });
22
+ Object.defineProperty(this, "writesFeatures", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: true
27
+ });
28
+ Object.defineProperty(this, "context", {
29
+ enumerable: true,
30
+ configurable: true,
31
+ writable: true,
32
+ value: void 0
33
+ });
34
+ /** Center coordinate of the circle */
35
+ Object.defineProperty(this, "center", {
36
+ enumerable: true,
37
+ configurable: true,
38
+ writable: true,
39
+ value: null
40
+ });
41
+ /** Radius (in meters) */
42
+ Object.defineProperty(this, "radiusMeters", {
43
+ enumerable: true,
44
+ configurable: true,
45
+ writable: true,
46
+ value: 0
47
+ });
48
+ /** Angle of the radius handle (in degrees) */
49
+ Object.defineProperty(this, "radiusHandleAngle", {
50
+ enumerable: true,
51
+ configurable: true,
52
+ writable: true,
53
+ value: DEFAULT_RADIUS_HANDLE_ANGLE
54
+ });
55
+ /** Drawing phase: 'waiting' = the center is not set yet, 'adjusting' = adjusting the radius */
56
+ Object.defineProperty(this, "phase", {
57
+ enumerable: true,
58
+ configurable: true,
59
+ writable: true,
60
+ value: 'waiting'
61
+ });
62
+ /** The Feature ID that is going to be created */
63
+ Object.defineProperty(this, "pendingFeatureId", {
64
+ enumerable: true,
65
+ configurable: true,
66
+ writable: true,
67
+ value: null
68
+ });
69
+ }
70
+ onStart(context) {
71
+ this.context = context;
72
+ // Change the cursor to a crosshair
73
+ this.context.map.getCanvas().style.cursor = 'crosshair';
74
+ // Clear the selection (not notified as a change)
75
+ this.context.store.transact(() => {
76
+ this.context.store.setSelection(null, []);
77
+ }, 'silent');
78
+ // Reset the state
79
+ this.reset();
80
+ // Generate the Feature ID in advance
81
+ this.pendingFeatureId = this.context.generateFeatureId();
82
+ }
83
+ onStop() {
84
+ // Restore the cursor
85
+ this.context.map.getCanvas().style.cursor = '';
86
+ // Clear the tentative state
87
+ this.context.store.setTentative(null);
88
+ this.reset();
89
+ }
90
+ /**
91
+ * A double click while drawing is two clicks of the drawing; it never zooms the map
92
+ * (consumed by preventing its default action)
93
+ */
94
+ onDoubleClick(event) {
95
+ event.originalEvent.preventDefault();
96
+ }
97
+ onClick(event) {
98
+ const coord = [event.lngLat.lng, event.lngLat.lat];
99
+ if (this.phase === 'waiting') {
100
+ // Set the center
101
+ this.center = coord;
102
+ this.phase = 'adjusting';
103
+ this.radiusMeters = 0;
104
+ // Update the tentative state
105
+ this.updateTentative();
106
+ }
107
+ else if (this.phase === 'adjusting') {
108
+ // Confirm if the radius is at least the minimum value
109
+ if (this.radiusMeters >= MIN_RADIUS_METERS) {
110
+ this.finishCircle();
111
+ }
112
+ }
113
+ }
114
+ onMouseMove(event) {
115
+ if (this.phase === 'adjusting' && this.center) {
116
+ // Compute the distance from the center to the mouse position
117
+ const mouseCoord = [event.lngLat.lng, event.lngLat.lat];
118
+ this.radiusMeters = haversineDistanceMeters(this.center, mouseCoord);
119
+ // The great-circle bearing from the center to the mouse position. The handle is placed
120
+ // with destinationPoint, the inverse of this bearing, so it lands on the pointer
121
+ this.radiusHandleAngle = initialBearingDegrees(this.center, mouseCoord);
122
+ // Update the tentative state
123
+ this.updateTentative();
124
+ }
125
+ }
126
+ onKeyDown(event) {
127
+ if (event.key === 'Escape') {
128
+ if (this.phase === 'adjusting') {
129
+ // Cancel if drawing is in progress
130
+ this.reset();
131
+ this.context.store.setTentative(null);
132
+ }
133
+ else {
134
+ // Return to the select mode if drawing is not in progress
135
+ this.context.setMode('select');
136
+ }
137
+ }
138
+ }
139
+ /**
140
+ * Called after an external state change
141
+ *
142
+ * Resets the state of the drawing in progress so that the next drawing operation can start
143
+ * normally.
144
+ */
145
+ onExternalStateChange() {
146
+ this.reset();
147
+ this.context.store.setTentative(null);
148
+ }
149
+ /**
150
+ * Confirms the circle
151
+ */
152
+ finishCircle() {
153
+ if (!this.center || this.radiusMeters < MIN_RADIUS_METERS) {
154
+ return;
155
+ }
156
+ const { store, autoNameGenerator } = this.context;
157
+ // Discard the drawing when no layer can be written any more
158
+ const layerId = resolveCommitLayer(this.context);
159
+ if (layerId === null)
160
+ return;
161
+ // Generate the automatic name
162
+ const autoName = autoNameGenerator.generateName('Circle');
163
+ // Use the ID generated in advance (generate a new one if there is none)
164
+ const featureId = this.pendingFeatureId ?? this.context.generateFeatureId();
165
+ // Create a new circle feature
166
+ const feature = {
167
+ id: featureId,
168
+ type: 'Circle',
169
+ coordinates: this.center,
170
+ layerId,
171
+ properties: {
172
+ radiusMeters: this.radiusMeters,
173
+ radiusHandleAngle: this.radiusHandleAngle,
174
+ ...createdZoomProperty(this.context),
175
+ // The polygon coordinates for rendering are computed at render time, so they are not saved
176
+ ...(autoName !== undefined && { name: autoName }),
177
+ },
178
+ locked: false,
179
+ visible: true,
180
+ };
181
+ // Bundle the feature creation and the selection into a single transaction
182
+ // (so that both are undone at once on undo)
183
+ store.transact(() => {
184
+ store.createFeature(feature);
185
+ // Clear the tentative state
186
+ store.setTentative(null);
187
+ // Select the created feature
188
+ store.setSelection('feature', [feature.id]);
189
+ });
190
+ // Reset the state
191
+ this.reset();
192
+ // Return to the select mode
193
+ this.context.setMode('select');
194
+ }
195
+ /**
196
+ * Updates the tentative state
197
+ */
198
+ updateTentative() {
199
+ if (!this.center) {
200
+ this.context.store.setTentative(null);
201
+ return;
202
+ }
203
+ this.context.store.setTentative({
204
+ type: 'Circle',
205
+ coordinates: this.center,
206
+ layerId: this.context.getCurrentLayerId(),
207
+ radiusMeters: this.radiusMeters,
208
+ radiusHandleAngle: this.radiusHandleAngle,
209
+ pendingFeatureId: this.pendingFeatureId ?? undefined,
210
+ });
211
+ }
212
+ /**
213
+ * Resets the state
214
+ */
215
+ reset() {
216
+ this.center = null;
217
+ this.radiusMeters = 0;
218
+ this.radiusHandleAngle = DEFAULT_RADIUS_HANDLE_ANGLE;
219
+ this.phase = 'waiting';
220
+ this.pendingFeatureId = null;
221
+ }
222
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * What a drawing mode writes when it commits: the layer, and the created zoom
3
+ */
4
+ import type { ModeContext } from '../handler.js';
5
+ /**
6
+ * Resolves the layer a drawing mode commits a new feature into
7
+ *
8
+ * Applies the commit rule of `ModeContext.getCurrentLayerId`: it returns the writable layer,
9
+ * and when no layer can be written any more (the layer was deleted, locked or hidden while
10
+ * drawing), the drawing is discarded instead: the tentative state is cleared and the mode
11
+ * returns to select, which stops the current handler. The caller then returns without
12
+ * creating anything, so no exception reaches the input handling. A plugin mode follows the
13
+ * same rule through the ModeContext.
14
+ */
15
+ export declare function resolveCommitLayer(context: ModeContext): string | null;
16
+ /**
17
+ * The created zoom a drawing mode writes into the properties of a new feature
18
+ *
19
+ * When the instance lets line widths follow the zoom (`ModeContext.scaleWithZoom`), it is the
20
+ * zoom at the time of the commit, from which the widths grow and shrink with the map. Otherwise
21
+ * nothing is written, and the feature keeps its widths on the screen like one added through
22
+ * the API.
23
+ */
24
+ export declare function createdZoomProperty(context: ModeContext): {
25
+ createdZoom?: number;
26
+ };
@@ -0,0 +1,31 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Resolves the layer a drawing mode commits a new feature into
5
+ *
6
+ * Applies the commit rule of `ModeContext.getCurrentLayerId`: it returns the writable layer,
7
+ * and when no layer can be written any more (the layer was deleted, locked or hidden while
8
+ * drawing), the drawing is discarded instead: the tentative state is cleared and the mode
9
+ * returns to select, which stops the current handler. The caller then returns without
10
+ * creating anything, so no exception reaches the input handling. A plugin mode follows the
11
+ * same rule through the ModeContext.
12
+ */
13
+ export function resolveCommitLayer(context) {
14
+ const layerId = context.getCurrentLayerId();
15
+ if (layerId !== '')
16
+ return layerId;
17
+ context.store.setTentative(null);
18
+ context.setMode('select');
19
+ return null;
20
+ }
21
+ /**
22
+ * The created zoom a drawing mode writes into the properties of a new feature
23
+ *
24
+ * When the instance lets line widths follow the zoom (`ModeContext.scaleWithZoom`), it is the
25
+ * zoom at the time of the commit, from which the widths grow and shrink with the map. Otherwise
26
+ * nothing is written, and the feature keeps its widths on the screen like one added through
27
+ * the API.
28
+ */
29
+ export function createdZoomProperty(context) {
30
+ return context.scaleWithZoom ? { createdZoom: context.map.getZoom() } : {};
31
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,264 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { createdZoomProperty, resolveCommitLayer } from './commit-layer.js';
4
+ /** Minimum distance for adding a coordinate (in degrees) */
5
+ const MIN_DISTANCE_DEGREES = 0.00001;
6
+ /**
7
+ * The input types that are not passed through snapping (the points inside a stroke)
8
+ *
9
+ * The snapping tolerance is a value premised on "once per click", so applying it to dragmove,
10
+ * which passes several hundred points in a single stroke, pulls the intermediate sample points
11
+ * one after another to nearby vertices and edges, and a line the user meant to draw straight
12
+ * ends up bent (this is conspicuous when dense administrative boundaries and the like are
13
+ * displayed). Furthermore, when snapping collapses consecutive samples onto the same point,
14
+ * they are discarded by the MIN_DISTANCE_DEGREES sieve, and the line jumps all at once the
15
+ * moment it leaves the tolerance.
16
+ *
17
+ * The start and the end of the drag remain snapped, which keeps "start drawing exactly from a
18
+ * corner of a boundary and end at a corner".
19
+ */
20
+ const UNSNAPPED_INPUT_TYPES = new Set(['dragmove']);
21
+ /**
22
+ * DrawFreehandMode implementation
23
+ *
24
+ * @internal
25
+ */
26
+ export class DrawFreehandMode {
27
+ constructor() {
28
+ Object.defineProperty(this, "modeName", {
29
+ enumerable: true,
30
+ configurable: true,
31
+ writable: true,
32
+ value: 'draw_freehand'
33
+ });
34
+ Object.defineProperty(this, "writesFeatures", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: true
39
+ });
40
+ Object.defineProperty(this, "context", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: void 0
45
+ });
46
+ /** Whether a drag is in progress */
47
+ Object.defineProperty(this, "isDrawing", {
48
+ enumerable: true,
49
+ configurable: true,
50
+ writable: true,
51
+ value: false
52
+ });
53
+ /** Coordinates of the current stroke */
54
+ Object.defineProperty(this, "currentCoordinates", {
55
+ enumerable: true,
56
+ configurable: true,
57
+ writable: true,
58
+ value: []
59
+ });
60
+ /** The Feature ID that is going to be created */
61
+ Object.defineProperty(this, "pendingFeatureId", {
62
+ enumerable: true,
63
+ configurable: true,
64
+ writable: true,
65
+ value: null
66
+ });
67
+ }
68
+ /**
69
+ * Whether snapping is to be applied, per input type
70
+ *
71
+ * Snapping is refused only inside a stroke (dragmove); the start point (dragstart) and the
72
+ * end point (dragend) are snapped.
73
+ */
74
+ isSnapEnabledFor(inputType) {
75
+ return !UNSNAPPED_INPUT_TYPES.has(inputType);
76
+ }
77
+ onStart(context) {
78
+ this.context = context;
79
+ // Change the cursor to a crosshair
80
+ this.context.map.getCanvas().style.cursor = 'crosshair';
81
+ // Clear the selection (not notified as a change)
82
+ this.context.store.transact(() => {
83
+ this.context.store.setSelection(null, []);
84
+ }, 'silent');
85
+ // Reset the state
86
+ this.reset();
87
+ }
88
+ onStop() {
89
+ // Restore the cursor
90
+ this.context.map.getCanvas().style.cursor = '';
91
+ // Clear the tentative state
92
+ this.context.store.setTentative(null);
93
+ this.reset();
94
+ // Re-enable the dragPan of MapLibre
95
+ if (!this.context.map.dragPan.isEnabled()) {
96
+ this.context.map.dragPan.enable();
97
+ }
98
+ }
99
+ /**
100
+ * Called after an external state change
101
+ *
102
+ * Resets the state of the drawing in progress so that the next drawing operation can start
103
+ * normally.
104
+ */
105
+ onExternalStateChange() {
106
+ this.reset();
107
+ this.context.store.setTentative(null);
108
+ }
109
+ /**
110
+ * Disables dragPan on a mouse down
111
+ * @returns true consumes the event (blocks the subsequent processing)
112
+ */
113
+ onMouseDown() {
114
+ // Disable the dragPan of MapLibre so that dragging is enabled
115
+ this.context.map.dragPan.disable();
116
+ return false;
117
+ }
118
+ onDragStart(event) {
119
+ // Start drawing
120
+ this.isDrawing = true;
121
+ this.currentCoordinates = [[event.lngLat.lng, event.lngLat.lat]];
122
+ // Generate the Feature ID in advance (for each stroke)
123
+ this.pendingFeatureId = this.context.generateFeatureId();
124
+ // Update the tentative state
125
+ this.updateTentative();
126
+ }
127
+ onDragMove(event) {
128
+ if (!this.isDrawing)
129
+ return;
130
+ const newCoord = [event.lngLat.lng, event.lngLat.lat];
131
+ // Check the distance from the last coordinate
132
+ if (this.currentCoordinates.length > 0) {
133
+ const lastCoord = this.currentCoordinates[this.currentCoordinates.length - 1];
134
+ const dx = newCoord[0] - lastCoord[0];
135
+ const dy = newCoord[1] - lastCoord[1];
136
+ const distance = Math.sqrt(dx * dx + dy * dy);
137
+ // Do not add it if it is below the minimum distance
138
+ if (distance < MIN_DISTANCE_DEGREES) {
139
+ return;
140
+ }
141
+ }
142
+ // Add the coordinate
143
+ this.currentCoordinates.push(newCoord);
144
+ // Update the tentative state
145
+ this.updateTentative();
146
+ }
147
+ onDragEnd(event) {
148
+ if (!this.isDrawing)
149
+ return;
150
+ // Add the last coordinate
151
+ const endCoord = [event.lngLat.lng, event.lngLat.lat];
152
+ if (this.currentCoordinates.length > 0) {
153
+ const lastCoord = this.currentCoordinates[this.currentCoordinates.length - 1];
154
+ const dx = endCoord[0] - lastCoord[0];
155
+ const dy = endCoord[1] - lastCoord[1];
156
+ const distance = Math.sqrt(dx * dx + dy * dy);
157
+ if (distance >= MIN_DISTANCE_DEGREES) {
158
+ this.currentCoordinates.push(endCoord);
159
+ }
160
+ }
161
+ // Confirm the stroke
162
+ this.finishStroke();
163
+ // End the drawing (the mode is kept active)
164
+ this.isDrawing = false;
165
+ this.currentCoordinates = [];
166
+ this.context.store.setTentative(null);
167
+ // Re-enable the dragPan of MapLibre (until the next drag)
168
+ this.context.map.dragPan.enable();
169
+ }
170
+ /**
171
+ * The press ended without a release (a second finger, or the browser cancelled the touch)
172
+ *
173
+ * The stroke in progress is discarded, and the pan goes back to MapLibre.
174
+ */
175
+ onDragCancel() {
176
+ if (this.isDrawing) {
177
+ this.reset();
178
+ this.context.store.setTentative(null);
179
+ }
180
+ if (!this.context.map.dragPan.isEnabled()) {
181
+ this.context.map.dragPan.enable();
182
+ }
183
+ }
184
+ onKeyDown(event) {
185
+ if (event.key === 'Escape') {
186
+ if (this.isDrawing) {
187
+ // Cancel if drawing is in progress
188
+ this.isDrawing = false;
189
+ this.currentCoordinates = [];
190
+ this.context.store.setTentative(null);
191
+ }
192
+ else {
193
+ // Return to the select mode if drawing is not in progress
194
+ this.context.setMode('select');
195
+ }
196
+ }
197
+ }
198
+ /**
199
+ * Confirms the stroke and creates the feature
200
+ */
201
+ finishStroke() {
202
+ // At least two points are required
203
+ if (this.currentCoordinates.length < 2) {
204
+ return;
205
+ }
206
+ const { store, autoNameGenerator } = this.context;
207
+ // Discard the drawing when no layer can be written any more
208
+ const layerId = resolveCommitLayer(this.context);
209
+ if (layerId === null)
210
+ return;
211
+ // Generate the automatic name
212
+ const autoName = autoNameGenerator.generateName('Freehand');
213
+ // Use the ID generated in advance (generate a new one if there is none)
214
+ const featureId = this.pendingFeatureId ?? this.context.generateFeatureId();
215
+ // Create a new freehand feature
216
+ const feature = {
217
+ id: featureId,
218
+ type: 'Freehand',
219
+ coordinates: [...this.currentCoordinates],
220
+ layerId,
221
+ properties: {
222
+ ...createdZoomProperty(this.context),
223
+ ...(autoName !== undefined && { name: autoName }),
224
+ },
225
+ style: {
226
+ // Uses the same default color as LineString
227
+ // (lineString.stroke.color of feature-style-config)
228
+ strokeWidth: 3,
229
+ },
230
+ locked: false,
231
+ visible: true,
232
+ };
233
+ // Create the feature inside a transaction (notified as a single change)
234
+ store.transact(() => {
235
+ store.createFeature(feature);
236
+ });
237
+ // Clear pendingFeatureId
238
+ this.pendingFeatureId = null;
239
+ // Note: the feature is not selected after creation (so that drawing can continue)
240
+ }
241
+ /**
242
+ * Updates the tentative state
243
+ */
244
+ updateTentative() {
245
+ if (this.currentCoordinates.length === 0) {
246
+ this.context.store.setTentative(null);
247
+ return;
248
+ }
249
+ this.context.store.setTentative({
250
+ type: 'Freehand',
251
+ coordinates: [...this.currentCoordinates],
252
+ layerId: this.context.getCurrentLayerId(),
253
+ pendingFeatureId: this.pendingFeatureId ?? undefined,
254
+ });
255
+ }
256
+ /**
257
+ * Resets the state
258
+ */
259
+ reset() {
260
+ this.isDrawing = false;
261
+ this.currentCoordinates = [];
262
+ this.pendingFeatureId = null;
263
+ }
264
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { resolveCommitLayer } from './commit-layer.js';
4
+ /**
5
+ * DrawImageMode implementation
6
+ *
7
+ * @internal
8
+ */
9
+ export class DrawImageMode {
10
+ constructor() {
11
+ Object.defineProperty(this, "modeName", {
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ value: 'draw_image'
16
+ });
17
+ Object.defineProperty(this, "writesFeatures", {
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ value: true
22
+ });
23
+ Object.defineProperty(this, "context", {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: void 0
28
+ });
29
+ }
30
+ onStart(context) {
31
+ this.context = context;
32
+ const { map, store, eventEmitter } = this.context;
33
+ // Set the cursor to the default
34
+ map.getCanvas().style.cursor = 'default';
35
+ // Clear the selection (not notified as a change)
36
+ store.transact(() => {
37
+ store.setSelection(null, []);
38
+ }, 'silent');
39
+ // Get the center coordinate and the zoom of the map
40
+ const center = map.getCenter();
41
+ const coordinate = [center.lng, center.lat];
42
+ const zoom = map.getZoom();
43
+ // Nothing is requested when no layer can be written (the mode returns to select)
44
+ const layerId = resolveCommitLayer(this.context);
45
+ if (layerId === null)
46
+ return;
47
+ // Emit the event and delegate the file selection to the demo side
48
+ eventEmitter.emit('image.request', { coordinate, zoom, layerId });
49
+ // Return to the select mode
50
+ this.context.setMode('select');
51
+ }
52
+ onStop() {
53
+ this.context.map.getCanvas().style.cursor = '';
54
+ }
55
+ onKeyDown(event) {
56
+ if (event.key === 'Escape') {
57
+ this.context.setMode('select');
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Draw Modes module
3
+ */
4
+ export { DrawCircleMode } from './circle.js';
5
+ export { DrawFreehandMode } from './freehand.js';
6
+ export { DrawImageMode } from './image.js';
7
+ export { DrawLineMode } from './line.js';
8
+ export { DrawPointMode } from './point.js';
9
+ export { DrawPolygonMode } from './polygon.js';