@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,101 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Feature API
5
+ *
6
+ * Provides the Feature CRUD operations of MapLibreGLDraw.
7
+ * It is composed into createDrawAPI by spreading.
8
+ */
9
+ import { isFeatureLocked } from '../store/lock.js';
10
+ export function createFeatureApi(deps) {
11
+ const { store, generateFeatureId, getActiveLayerId } = deps;
12
+ return {
13
+ addFeature(input) {
14
+ const feature = {
15
+ id: input.id ?? generateFeatureId(),
16
+ type: input.type,
17
+ coordinates: input.coordinates,
18
+ layerId: input.layerId ?? getActiveLayerId(),
19
+ properties: input.properties ?? {},
20
+ style: input.style,
21
+ locked: input.locked ?? false,
22
+ visible: input.visible ?? true,
23
+ };
24
+ // A write refused because the Store is read-only returns null
25
+ return store.createFeature(feature) ? feature.id : null;
26
+ },
27
+ getFeature(id) {
28
+ return store.getFeature(id);
29
+ },
30
+ getAllFeatures() {
31
+ return featuresInDisplayOrder(store);
32
+ },
33
+ getVisibleFeatures() {
34
+ return store.getOrderedFeatures();
35
+ },
36
+ updateFeature(id, updates) {
37
+ // While locked (either itself, its group or its layer), reject changes to any
38
+ // attribute other than locked/visible (Miro-style full protection). locked/visible are
39
+ // allowed so that it can be unlocked and its visibility toggled.
40
+ const feature = store.getFeature(id);
41
+ if (feature && isFeatureLocked(feature, store) && !onlyLockOrVisibility(updates)) {
42
+ return false;
43
+ }
44
+ // An id that does not exist throws in the Store (unless it is read-only)
45
+ return store.updateFeature(id, updates);
46
+ },
47
+ deleteFeature(id) {
48
+ return store.deleteFeature(id);
49
+ },
50
+ deleteAllFeatures() {
51
+ const features = store.getAllFeatures();
52
+ return store.transact(() => {
53
+ let applied = true;
54
+ for (const feature of features) {
55
+ if (!store.getFeature(feature.id))
56
+ continue;
57
+ applied = store.deleteFeature(feature.id) && applied;
58
+ }
59
+ return applied;
60
+ });
61
+ },
62
+ };
63
+ }
64
+ /** Whether an update changes nothing but `locked` / `visible` (what a lock still allows) */
65
+ export function onlyLockOrVisibility(updates) {
66
+ return Object.keys(updates).every((key) => key === 'locked' || key === 'visible');
67
+ }
68
+ /**
69
+ * Every feature in display order (layer order -> order within the layer -> order within the
70
+ * group), whatever the visible flags say. A feature that no container lists (which the
71
+ * Store's containment invariant rules out) is appended at the end.
72
+ */
73
+ function featuresInDisplayOrder(store) {
74
+ const result = [];
75
+ const seen = new Set();
76
+ const push = (id) => {
77
+ const feature = store.getFeature(id);
78
+ if (feature && !seen.has(id)) {
79
+ seen.add(id);
80
+ result.push(feature);
81
+ }
82
+ };
83
+ for (const layerId of store.getLayerOrder()) {
84
+ const layer = store.getLayer(layerId);
85
+ if (!layer)
86
+ continue;
87
+ for (const itemId of layer.order) {
88
+ const group = store.getGroup(itemId);
89
+ if (group) {
90
+ for (const featureId of group.featureIds)
91
+ push(featureId);
92
+ }
93
+ else {
94
+ push(itemId);
95
+ }
96
+ }
97
+ }
98
+ for (const feature of store.getAllFeatures())
99
+ push(feature.id);
100
+ return result;
101
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * The common part of the geometry operations: placing a result where its input was, and
3
+ * announcing what an operation did
4
+ *
5
+ * applyResult creates one result, deletes the inputs and places it (outside a transaction)
6
+ * commitResult wraps applyResult in one transaction and moves the selection
7
+ * emitApplied emits draw.geometry.applied
8
+ */
9
+ import type { EventEmitter, GeometryAppliedPayload } from '../../shared/utils/event-emitter.js';
10
+ import type { Feature, FeatureCoordinates, FeatureType } from '../../store/types.js';
11
+ import type { GeometryApiDeps } from './types.js';
12
+ export interface CommitParams {
13
+ /**
14
+ * The input whose style, properties and placement are inherited (in a boolean operation, the
15
+ * frontmost in z order)
16
+ */
17
+ anchor: Feature;
18
+ /**
19
+ * The IDs of the inputs to delete. Left empty in an operation that keeps the inputs, such as
20
+ * the buffer
21
+ */
22
+ removedIds: string[];
23
+ geometry: {
24
+ type: FeatureType;
25
+ coordinates: FeatureCoordinates;
26
+ };
27
+ /**
28
+ * The properties of the result. When omitted, they are inherited from the anchor with the
29
+ * Circle-specific properties removed.
30
+ * It is given explicitly only when the result stays a Circle (the Circle special case of the
31
+ * buffer).
32
+ */
33
+ properties?: Record<string, unknown>;
34
+ }
35
+ /**
36
+ * Creates one result feature, deletes the inputs and places it.
37
+ *
38
+ * It does not open a transaction. Because the caller wraps it in store.transact, even a case
39
+ * with several results, such as the buffer, is gathered into one StateChanges.
40
+ */
41
+ export declare function applyResult(deps: GeometryApiDeps, params: CommitParams): string;
42
+ /**
43
+ * Creates the result feature and deletes the inputs in one transaction, and moves the
44
+ * selection to the result.
45
+ *
46
+ * A subscriber receives it as one StateChanges, which is what makes it one step for anything
47
+ * that records changes.
48
+ */
49
+ export declare function commitResult(deps: GeometryApiDeps, params: CommitParams): string;
50
+ /** Emits draw.geometry.applied. */
51
+ export declare function emitApplied(eventEmitter: EventEmitter, payload: GeometryAppliedPayload): void;
@@ -0,0 +1,114 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * The parametric properties of Circle. They are not inherited by a result that has been
5
+ * reduced to a polygon (because a Circle becomes a polygon of 64 segments and loses the
6
+ * notion of a radius).
7
+ */
8
+ const CIRCLE_ONLY_PROPERTIES = ['radiusMeters', 'radiusHandleAngle'];
9
+ /**
10
+ * Decides the placement that puts the result at "the place where the input it inherits from
11
+ * was".
12
+ *
13
+ * When the input was a member of a group, the result is put into the same group. The position
14
+ * is the position that the input it inherits from occupied in the order after the inputs have
15
+ * been removed. In an operation where the input it inherits from remains (the buffer), the
16
+ * result is put just in front of that input.
17
+ */
18
+ function planPlacement(store, anchor, removedIds) {
19
+ const group = anchor.groupId ? store.getGroup(anchor.groupId) : undefined;
20
+ const container = group ? group.featureIds : (store.getLayer(anchor.layerId)?.order ?? []);
21
+ const anchorIndex = container.indexOf(anchor.id);
22
+ const precedingIds = anchorIndex < 0 ? container : container.slice(0, anchorIndex);
23
+ const precedingCount = precedingIds.filter((id) => !removedIds.has(id)).length;
24
+ return {
25
+ layerId: anchor.layerId,
26
+ groupId: group?.id,
27
+ // One further back when the input it inherits from remains (= just in front of it).
28
+ // When it is deleted, that place is used as is.
29
+ index: removedIds.has(anchor.id) ? precedingCount : precedingCount + 1,
30
+ };
31
+ }
32
+ /**
33
+ * Moves the result that createFeature stacked at the tail (the frontmost) to the z position of
34
+ * its placement.
35
+ */
36
+ function moveToPlacement(store, resultId, placement) {
37
+ if (placement.groupId) {
38
+ const group = store.getGroup(placement.groupId);
39
+ if (!group)
40
+ return;
41
+ const featureIds = group.featureIds.filter((id) => id !== resultId);
42
+ featureIds.splice(placement.index, 0, resultId);
43
+ store.updateGroup(placement.groupId, { featureIds });
44
+ return;
45
+ }
46
+ const layer = store.getLayer(placement.layerId);
47
+ if (!layer)
48
+ return;
49
+ const order = layer.order.filter((id) => id !== resultId);
50
+ order.splice(placement.index, 0, resultId);
51
+ store.updateLayer(placement.layerId, { order });
52
+ }
53
+ /**
54
+ * Inherits the style and the properties from the input it inherits from.
55
+ */
56
+ function inheritProperties(anchor) {
57
+ const properties = { ...anchor.properties };
58
+ for (const key of CIRCLE_ONLY_PROPERTIES) {
59
+ delete properties[key];
60
+ }
61
+ return properties;
62
+ }
63
+ /**
64
+ * Creates one result feature, deletes the inputs and places it.
65
+ *
66
+ * It does not open a transaction. Because the caller wraps it in store.transact, even a case
67
+ * with several results, such as the buffer, is gathered into one StateChanges.
68
+ */
69
+ export function applyResult(deps, params) {
70
+ const { store, generateFeatureId } = deps;
71
+ const { anchor, removedIds, geometry } = params;
72
+ const placement = planPlacement(store, anchor, new Set(removedIds));
73
+ const result = {
74
+ id: generateFeatureId(),
75
+ type: geometry.type,
76
+ coordinates: geometry.coordinates,
77
+ layerId: placement.layerId,
78
+ groupId: placement.groupId,
79
+ properties: params.properties ?? inheritProperties(anchor),
80
+ style: anchor.style ? { ...anchor.style } : undefined,
81
+ locked: false,
82
+ visible: true,
83
+ };
84
+ // Create the result first, then delete the inputs. In the reverse order, a group made up of
85
+ // the inputs alone would be removed by "the automatic deletion of empty groups", and the
86
+ // place to put the result would be lost.
87
+ store.createFeature(result);
88
+ for (const id of removedIds) {
89
+ if (!store.getFeature(id))
90
+ continue;
91
+ store.deleteFeature(id);
92
+ }
93
+ moveToPlacement(store, result.id, placement);
94
+ return result.id;
95
+ }
96
+ /**
97
+ * Creates the result feature and deletes the inputs in one transaction, and moves the
98
+ * selection to the result.
99
+ *
100
+ * A subscriber receives it as one StateChanges, which is what makes it one step for anything
101
+ * that records changes.
102
+ */
103
+ export function commitResult(deps, params) {
104
+ const { store } = deps;
105
+ return store.transact(() => {
106
+ const resultId = applyResult(deps, params);
107
+ store.setSelection('feature', [resultId]);
108
+ return resultId;
109
+ });
110
+ }
111
+ /** Emits draw.geometry.applied. */
112
+ export function emitApplied(eventEmitter, payload) {
113
+ eventEmitter.emit('geometry.applied', payload);
114
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The boolean editing operations (union / subtract / intersect) on the area types
3
+ */
4
+ import type { AreaCoordinates, MultiPolygonCoordinates } from '../../geometry/index.js';
5
+ import type { GeometryOperationName } from '../../shared/utils/event-emitter.js';
6
+ import type { Store } from '../../store/store.js';
7
+ import type { Feature } from '../../store/types.js';
8
+ import type { GeometryApiDeps } from './types.js';
9
+ /**
10
+ * The common path that runs an operation on the area types and replaces the inputs with the
11
+ * result.
12
+ *
13
+ * @param inputs The targets ordered in z order (the tail is the frontmost)
14
+ * @param compute The geometric operation that receives the area coordinates in the same order
15
+ * as inputs and returns the result
16
+ */
17
+ export declare function runAreaOperation(deps: GeometryApiDeps, operation: GeometryOperationName, inputs: Feature[], compute: (areas: AreaCoordinates[]) => MultiPolygonCoordinates): string | null;
18
+ /**
19
+ * Resolves the targets of subtract.
20
+ *
21
+ * When targetId is omitted, it is "subtract the group of frontmost features from the backmost
22
+ * one". When it is given explicitly, that feature is added to the targets even if it is not
23
+ * included in the list of targets (ids / the selection).
24
+ */
25
+ export declare function resolveSubtractInputs(store: Store, targetId: string | undefined, ids: string[] | undefined): {
26
+ inputs: Feature[];
27
+ targetIndex: number;
28
+ } | null;
@@ -0,0 +1,65 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { commitResult, emitApplied } from './apply.js';
4
+ import { currentSelectionIds, isAreaFeature, resolveTargetFeatures, toAreaCoordinates, toResultGeometry, } from './targets.js';
5
+ /**
6
+ * The common path that runs an operation on the area types and replaces the inputs with the
7
+ * result.
8
+ *
9
+ * @param inputs The targets ordered in z order (the tail is the frontmost)
10
+ * @param compute The geometric operation that receives the area coordinates in the same order
11
+ * as inputs and returns the result
12
+ */
13
+ export function runAreaOperation(deps, operation, inputs, compute) {
14
+ const inputIds = inputs.map((feature) => feature.id);
15
+ const areas = [];
16
+ for (const feature of inputs) {
17
+ const area = toAreaCoordinates(feature);
18
+ if (area === null)
19
+ return null;
20
+ areas.push(area);
21
+ }
22
+ const geometry = toResultGeometry(compute(areas));
23
+ if (geometry === null) {
24
+ // An empty result (an intersection that does not overlap, a punch-out where everything was
25
+ // subtracted). The inputs are not changed at all; only the notification is emitted.
26
+ emitApplied(deps.eventEmitter, {
27
+ operation,
28
+ inputIds,
29
+ resultId: null,
30
+ resultIds: [],
31
+ status: 'empty',
32
+ });
33
+ return null;
34
+ }
35
+ // The style, the properties and the placement are inherited from the frontmost input.
36
+ const anchor = inputs[inputs.length - 1];
37
+ const resultId = commitResult(deps, { anchor, removedIds: inputIds, geometry });
38
+ emitApplied(deps.eventEmitter, {
39
+ operation,
40
+ inputIds,
41
+ resultId,
42
+ resultIds: [resultId],
43
+ status: 'applied',
44
+ });
45
+ return resultId;
46
+ }
47
+ /**
48
+ * Resolves the targets of subtract.
49
+ *
50
+ * When targetId is omitted, it is "subtract the group of frontmost features from the backmost
51
+ * one". When it is given explicitly, that feature is added to the targets even if it is not
52
+ * included in the list of targets (ids / the selection).
53
+ */
54
+ export function resolveSubtractInputs(store, targetId, ids) {
55
+ const baseIds = ids ?? currentSelectionIds(store);
56
+ const wanted = targetId === undefined ? baseIds : [...new Set([targetId, ...baseIds])];
57
+ const inputs = resolveTargetFeatures(store, wanted, isAreaFeature);
58
+ if (inputs.length < 2)
59
+ return null;
60
+ // By default the backmost in z order is the side that is subtracted from.
61
+ const targetIndex = targetId === undefined ? 0 : inputs.findIndex((feature) => feature.id === targetId);
62
+ if (targetIndex < 0)
63
+ return null;
64
+ return { inputs, targetIndex };
65
+ }
@@ -0,0 +1,11 @@
1
+ import type { Feature } from '../../store/types.js';
2
+ import type { GeometryApiDeps, GeometryBufferOptions } from './types.js';
3
+ /**
4
+ * Runs the buffer and creates the result features.
5
+ *
6
+ * The inputs remain, and one result is created per input. The creation of all the results is
7
+ * gathered into one store.transact, so a single undo removes all of them.
8
+ *
9
+ * @param inputs The targets ordered in z order (the tail is the frontmost)
10
+ */
11
+ export declare function runBuffer(deps: GeometryApiDeps, inputs: Feature[], options: GeometryBufferOptions): string[];
@@ -0,0 +1,105 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * The buffer: the area within a distance of each input, created as new features
5
+ *
6
+ * It differs from the boolean operations only in that it "keeps the inputs and adds the
7
+ * results", so it takes the same path with the removedIds of applyResult left empty. Since it
8
+ * creates one result per input, several applyResult calls are gathered into one
9
+ * store.transact, and all the results are selected at the end.
10
+ */
11
+ // buffer is imported under an alias so that the name reads as the geometry module's function.
12
+ import { buffer as computeBuffer } from '../../geometry/index.js';
13
+ import { getCircleRadius } from '../../shared/utils/property.js';
14
+ import { applyResult, emitApplied } from './apply.js';
15
+ import { toBufferGeometry, toResultGeometry } from './targets.js';
16
+ /**
17
+ * Plans the buffer of a Circle input.
18
+ *
19
+ * To keep it parametric, it returns a Circle whose radiusMeters has been grown or shrunk,
20
+ * without reducing it to a polygon. A shrink that makes the radius 0 or less has an empty
21
+ * result, so null is returned.
22
+ */
23
+ function planCircleBuffer(input, distanceMeters) {
24
+ const radiusMeters = getCircleRadius(input);
25
+ if (radiusMeters === undefined || radiusMeters <= 0)
26
+ return null;
27
+ const nextRadius = radiusMeters + distanceMeters;
28
+ if (nextRadius <= 0)
29
+ return null;
30
+ return {
31
+ input,
32
+ geometry: { type: 'Circle', coordinates: input.coordinates },
33
+ // It stays a Circle, so the properties including radiusHandleAngle are inherited and only
34
+ // the radius is replaced.
35
+ properties: { ...input.properties, radiusMeters: nextRadius },
36
+ };
37
+ }
38
+ /**
39
+ * Plans the buffer of one input. null when the result is empty or the operation is not
40
+ * defined.
41
+ */
42
+ function planBuffer(input, options) {
43
+ const { distanceMeters, segments } = options;
44
+ if (input.type === 'Circle')
45
+ return planCircleBuffer(input, distanceMeters);
46
+ const geometryInput = toBufferGeometry(input);
47
+ if (geometryInput === null)
48
+ return null;
49
+ // null means "the operation is not defined for that input" (a negative value on a point or
50
+ // a line), [] means the result is empty.
51
+ const parts = computeBuffer(geometryInput, distanceMeters, { segments });
52
+ if (parts === null)
53
+ return null;
54
+ const geometry = toResultGeometry(parts);
55
+ if (geometry === null)
56
+ return null;
57
+ return { input, geometry };
58
+ }
59
+ /**
60
+ * Runs the buffer and creates the result features.
61
+ *
62
+ * The inputs remain, and one result is created per input. The creation of all the results is
63
+ * gathered into one store.transact, so a single undo removes all of them.
64
+ *
65
+ * @param inputs The targets ordered in z order (the tail is the frontmost)
66
+ */
67
+ export function runBuffer(deps, inputs, options) {
68
+ const { store } = deps;
69
+ const plans = [];
70
+ for (const input of inputs) {
71
+ const plan = planBuffer(input, options);
72
+ if (plan !== null)
73
+ plans.push(plan);
74
+ }
75
+ if (plans.length === 0) {
76
+ // Every input was skipped or had an empty result. The Store is not changed at all; only
77
+ // the notification is emitted.
78
+ emitApplied(deps.eventEmitter, {
79
+ operation: 'buffer',
80
+ inputIds: inputs.map((input) => input.id),
81
+ resultId: null,
82
+ resultIds: [],
83
+ status: 'empty',
84
+ });
85
+ return [];
86
+ }
87
+ const resultIds = store.transact(() => {
88
+ const ids = plans.map((plan) => applyResult(deps, {
89
+ anchor: plan.input,
90
+ removedIds: [],
91
+ geometry: plan.geometry,
92
+ properties: plan.properties,
93
+ }));
94
+ store.setSelection('feature', ids);
95
+ return ids;
96
+ });
97
+ emitApplied(deps.eventEmitter, {
98
+ operation: 'buffer',
99
+ inputIds: plans.map((plan) => plan.input.id),
100
+ resultId: resultIds[0],
101
+ resultIds,
102
+ status: 'applied',
103
+ });
104
+ return resultIds;
105
+ }
@@ -0,0 +1,16 @@
1
+ import type { Feature } from '../../store/types.js';
2
+ import type { GeometryApiDeps } from './types.js';
3
+ /**
4
+ * Runs the split and replaces the polygon with the group of features that result from the
5
+ * split.
6
+ *
7
+ * All the results are gathered into one store.transact (a single undo goes back to the
8
+ * original polygon). Only the first result deletes the original polygon, and the results that
9
+ * follow are stacked just in front of the previous result. The previous result has inherited
10
+ * both the style and the properties from the original polygon, so using it as the one to
11
+ * inherit from does not change the content.
12
+ *
13
+ * @param area The polygon to be cut
14
+ * @param line The cutting line (it is not deleted and remains)
15
+ */
16
+ export declare function runSplit(deps: GeometryApiDeps, area: Feature, line: Feature): string[];
@@ -0,0 +1,75 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { splitArea } from '../../geometry/index.js';
4
+ import { applyResult, emitApplied } from './apply.js';
5
+ import { toAreaCoordinates, toResultGeometry, toSplitPaths } from './targets.js';
6
+ /**
7
+ * Runs the split and replaces the polygon with the group of features that result from the
8
+ * split.
9
+ *
10
+ * All the results are gathered into one store.transact (a single undo goes back to the
11
+ * original polygon). Only the first result deletes the original polygon, and the results that
12
+ * follow are stacked just in front of the previous result. The previous result has inherited
13
+ * both the style and the properties from the original polygon, so using it as the one to
14
+ * inherit from does not change the content.
15
+ *
16
+ * @param area The polygon to be cut
17
+ * @param line The cutting line (it is not deleted and remains)
18
+ */
19
+ export function runSplit(deps, area, line) {
20
+ const { store } = deps;
21
+ const inputIds = [area.id, line.id];
22
+ const source = toAreaCoordinates(area);
23
+ const paths = toSplitPaths(line);
24
+ const parts = [];
25
+ if (source !== null && paths.length > 0) {
26
+ // A MultiLineString cuts one line at a time in order (it cuts the previous result further)
27
+ let current = splitArea(source, paths[0]);
28
+ for (let i = 1; i < paths.length; i++) {
29
+ current = current.flatMap((part) => splitArea(part, paths[i]));
30
+ }
31
+ parts.push(...current);
32
+ }
33
+ const geometries = [];
34
+ for (const part of parts) {
35
+ const geometry = toResultGeometry(part);
36
+ if (geometry !== null)
37
+ geometries.push(geometry);
38
+ }
39
+ if (geometries.length < 2) {
40
+ // The line did not divide the polygon. The inputs are not changed at all; only the
41
+ // notification is emitted.
42
+ emitApplied(deps.eventEmitter, {
43
+ operation: 'split',
44
+ inputIds,
45
+ resultId: null,
46
+ resultIds: [],
47
+ status: 'empty',
48
+ });
49
+ return [];
50
+ }
51
+ const resultIds = store.transact(() => {
52
+ const ids = [];
53
+ let anchor = area;
54
+ for (const geometry of geometries) {
55
+ const id = applyResult(deps, {
56
+ anchor,
57
+ // The original polygon is deleted only on the first pass
58
+ removedIds: ids.length === 0 ? [area.id] : [],
59
+ geometry,
60
+ });
61
+ ids.push(id);
62
+ anchor = store.getFeature(id) ?? anchor;
63
+ }
64
+ store.setSelection('feature', ids);
65
+ return ids;
66
+ });
67
+ emitApplied(deps.eventEmitter, {
68
+ operation: 'split',
69
+ inputIds,
70
+ resultId: resultIds[0],
71
+ resultIds,
72
+ status: 'applied',
73
+ });
74
+ return resultIds;
75
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * The targets of the geometry operations: which features each operation accepts, how a
3
+ * feature is read as the input of the geometry module, and how the result is read back
4
+ */
5
+ import type { AreaCoordinates, GeometryInput, MultiPolygonCoordinates } from '../../geometry/index.js';
6
+ import type { Store } from '../../store/store.js';
7
+ import type { Coordinate, Feature, FeatureCoordinates, FeatureType } from '../../store/types.js';
8
+ /**
9
+ * Whether the feature can be a target of a boolean operation.
10
+ *
11
+ * The area types (Polygon / MultiPolygon / Circle) only. A Circle without a radius has no
12
+ * area, so it is excluded from the targets.
13
+ */
14
+ export declare function isAreaFeature(feature: Feature): boolean;
15
+ /**
16
+ * Converts a feature into the area coordinates of the geometry module.
17
+ *
18
+ * A Circle is reduced to a ring with the default number of segments (64) of
19
+ * generateCirclePolygon, the same as in the rendering (view/renderers/drawer.ts). An input
20
+ * that has no area returns null.
21
+ */
22
+ export declare function toAreaCoordinates(feature: Feature): AreaCoordinates | null;
23
+ /**
24
+ * Whether the feature can be the cutting side of a split.
25
+ */
26
+ export declare function isSplitLineFeature(feature: Feature): boolean;
27
+ /**
28
+ * Reduces a line feature to an array of polylines.
29
+ *
30
+ * A MultiLineString becomes one polyline per part. A type that cannot be the cutting side
31
+ * returns an empty array.
32
+ */
33
+ export declare function toSplitPaths(feature: Feature): Coordinate[][];
34
+ /**
35
+ * Whether the feature can be a target of the buffer.
36
+ *
37
+ * Only a Circle that has a radius is a target (a Circle without a radius has no starting
38
+ * point to grow or shrink from).
39
+ */
40
+ export declare function isBufferableFeature(feature: Feature): boolean;
41
+ /**
42
+ * Converts a feature into the GeometryInput of the geometry module.
43
+ *
44
+ * The shape of the coordinates matches the shape of the core Feature coordinates and is
45
+ * GeoJSON compatible, so it can be passed by only re-typing it. A Circle is handled as a
46
+ * special case (growing or shrinking the radius), so it is not converted here.
47
+ */
48
+ export declare function toBufferGeometry(feature: Feature): GeometryInput | null;
49
+ /**
50
+ * Builds the type and coordinates of the feature to create from the MultiPolygon coordinates
51
+ * returned by the geometry module.
52
+ *
53
+ * Polygon when there is one part, MultiPolygon when there are several. An empty array (no
54
+ * area) returns null.
55
+ */
56
+ export declare function toResultGeometry(parts: MultiPolygonCoordinates): {
57
+ type: FeatureType;
58
+ coordinates: FeatureCoordinates;
59
+ } | null;
60
+ /** The IDs of the current feature selection (empty on a group or layer selection). */
61
+ export declare function currentSelectionIds(store: Store): string[];
62
+ /**
63
+ * Resolves the targets of an operation in z order (the head is the backmost, the tail is the
64
+ * frontmost).
65
+ *
66
+ * The order follows getDisplayFeatures (= getOrderedFeatures with the locally hidden features
67
+ * removed). That is "the order between the layers -> the order within a layer -> the
68
+ * featureIds within a group", which is the draw order of core itself. Hidden features (both
69
+ * the shared visible and the local hidden) do not appear in this list, so they are
70
+ * automatically excluded from the targets here.
71
+ * Locked features (the effective lock) are excluded explicitly.
72
+ *
73
+ * @param ids The target IDs. When undefined, the current selection
74
+ * @param accept The acceptance test, on the type and so on
75
+ */
76
+ export declare function resolveTargetFeatures(store: Store, ids: string[] | undefined, accept: (feature: Feature) => boolean): Feature[];