@sakuzu/maplibre-gl-draw 1.0.0 → 2.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 (540) hide show
  1. package/CHANGELOG.md +1016 -2
  2. package/README.ja.md +39 -19
  3. package/README.md +41 -21
  4. package/dist/api/datasets.d.ts +258 -0
  5. package/dist/api/document.d.ts +66 -0
  6. package/dist/api/draw.d.ts +135 -0
  7. package/dist/api/draw.js +18 -0
  8. package/dist/api/drawing.d.ts +87 -0
  9. package/dist/api/errors.d.ts +35 -0
  10. package/dist/api/errors.js +35 -0
  11. package/dist/api/events.d.ts +306 -0
  12. package/dist/api/extension/context.d.ts +247 -0
  13. package/dist/api/extension/feature-type.d.ts +129 -0
  14. package/dist/api/extension/mode.d.ts +123 -0
  15. package/dist/api/extension/plugin.d.ts +51 -0
  16. package/dist/api/extension/plugin.js +3 -0
  17. package/dist/api/extension/provider.d.ts +119 -0
  18. package/dist/api/extension/provider.js +3 -0
  19. package/dist/api/extension/render.d.ts +176 -0
  20. package/dist/api/extension/render.js +3 -0
  21. package/dist/api/extension/store.d.ts +190 -0
  22. package/dist/api/extension/store.js +3 -0
  23. package/dist/api/extensions.d.ts +306 -0
  24. package/dist/api/extensions.js +3 -0
  25. package/dist/api/features.d.ts +188 -0
  26. package/dist/api/features.js +3 -0
  27. package/dist/api/groups.d.ts +111 -0
  28. package/dist/api/groups.js +3 -0
  29. package/dist/api/hidden.d.ts +45 -0
  30. package/dist/api/hidden.js +3 -0
  31. package/dist/api/impl/adapters.js +463 -0
  32. package/dist/api/impl/contexts.js +466 -0
  33. package/dist/api/impl/create-draw.js +124 -0
  34. package/dist/api/impl/datasets.js +404 -0
  35. package/dist/api/impl/destroy-guard.js +74 -0
  36. package/dist/api/impl/document.js +280 -0
  37. package/dist/api/impl/drawing.js +180 -0
  38. package/dist/api/impl/engine-context.d.ts +7 -0
  39. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  40. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  41. package/dist/api/impl/events.js +422 -0
  42. package/dist/api/impl/extension-host.js +361 -0
  43. package/dist/api/impl/extensions.js +229 -0
  44. package/dist/api/impl/features.js +445 -0
  45. package/dist/api/impl/geometry/apply.d.ts +32 -0
  46. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  47. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  48. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  49. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  50. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  51. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  52. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  53. package/dist/api/impl/geometry/types.js +3 -0
  54. package/dist/api/impl/groups.d.ts +3 -0
  55. package/dist/api/impl/groups.js +268 -0
  56. package/dist/api/impl/hidden.js +60 -0
  57. package/dist/api/impl/import-export/constants.d.ts +22 -0
  58. package/dist/api/impl/import-export/constants.js +24 -0
  59. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  60. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  61. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  62. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  63. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  64. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  66. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  68. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  69. package/dist/api/impl/import-export/image-import.js +73 -0
  70. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  71. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  72. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  73. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  74. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  75. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  76. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  77. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  78. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  79. package/dist/api/impl/import-export/style-validation.js +86 -0
  80. package/dist/api/impl/import-export/types.d.ts +52 -0
  81. package/dist/api/impl/import-export/types.js +3 -0
  82. package/dist/api/impl/input.js +180 -0
  83. package/dist/api/impl/layers.js +307 -0
  84. package/dist/api/impl/metadata.d.ts +1 -0
  85. package/dist/api/impl/metadata.js +22 -0
  86. package/dist/api/impl/options.d.ts +1 -0
  87. package/dist/api/impl/options.js +822 -0
  88. package/dist/api/impl/placement.d.ts +1 -0
  89. package/dist/api/impl/placement.js +138 -0
  90. package/dist/api/impl/render-context.d.ts +13 -0
  91. package/dist/api/impl/render-context.js +272 -0
  92. package/dist/api/impl/rows.d.ts +1 -0
  93. package/dist/api/impl/rows.js +46 -0
  94. package/dist/api/impl/selection.d.ts +1 -0
  95. package/dist/api/impl/selection.js +186 -0
  96. package/dist/api/impl/shared.d.ts +64 -0
  97. package/dist/api/impl/shared.js +178 -0
  98. package/dist/api/impl/validate-extension.d.ts +1 -0
  99. package/dist/api/impl/validate-extension.js +159 -0
  100. package/dist/api/layers.d.ts +130 -0
  101. package/dist/api/layers.js +3 -0
  102. package/dist/api/metadata.d.ts +18 -0
  103. package/dist/api/metadata.js +3 -0
  104. package/dist/api/model.d.ts +487 -0
  105. package/dist/api/model.js +47 -0
  106. package/dist/api/options.d.ts +466 -0
  107. package/dist/api/options.js +3 -0
  108. package/dist/api/selection.d.ts +94 -0
  109. package/dist/api/selection.js +3 -0
  110. package/dist/api/state.d.ts +155 -0
  111. package/dist/api/state.js +12 -0
  112. package/dist/{display → dataset}/chunk.d.ts +1 -1
  113. package/dist/{display → dataset}/chunk.js +4 -3
  114. package/dist/{display → dataset}/dataset.js +18 -21
  115. package/dist/dataset/interaction.d.ts +1 -0
  116. package/dist/{display → dataset}/interaction.js +18 -6
  117. package/dist/dataset/manager.d.ts +1 -0
  118. package/dist/dataset/provider.d.ts +1 -0
  119. package/dist/{display → dataset}/retained.d.ts +1 -1
  120. package/dist/{display → dataset}/retained.js +8 -7
  121. package/dist/dataset/source.d.ts +1 -0
  122. package/dist/{display → dataset}/source.js +17 -4
  123. package/dist/dataset/spatial.d.ts +1 -0
  124. package/dist/{display → dataset}/spatial.js +1 -1
  125. package/dist/dataset/style.d.ts +1 -0
  126. package/dist/{display → dataset}/style.js +1 -1
  127. package/dist/dataset/table-source.d.ts +1 -0
  128. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  129. package/dist/{display → dataset}/thinning.d.ts +0 -10
  130. package/dist/{display → dataset}/thinning.js +3 -2
  131. package/dist/dataset/triangulation.d.ts +1 -0
  132. package/dist/{display → dataset}/triangulation.js +0 -0
  133. package/dist/{display → dataset}/types.d.ts +82 -121
  134. package/dist/dataset/types.js +61 -0
  135. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  136. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  137. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  138. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  139. package/dist/dispatcher/hit-test/service.js +80 -16
  140. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  141. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  142. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  143. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  144. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  145. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  146. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  147. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  148. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  149. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  150. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  151. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  152. package/dist/dispatcher/input-router.js +152 -69
  153. package/dist/dispatcher/normalizer.js +6 -2
  154. package/dist/dispatcher/types.d.ts +6 -1
  155. package/dist/extension/feature-handler.d.ts +1 -182
  156. package/dist/extension/index.d.ts +4 -7
  157. package/dist/extension/renderers.d.ts +1 -208
  158. package/dist/geometry/angle.d.ts +0 -8
  159. package/dist/geometry/angle.js +0 -8
  160. package/dist/geometry/bbox.d.ts +4 -12
  161. package/dist/geometry/bbox.js +4 -12
  162. package/dist/geometry/boolean.d.ts +0 -51
  163. package/dist/geometry/boolean.js +0 -51
  164. package/dist/geometry/buffer.d.ts +0 -26
  165. package/dist/geometry/buffer.js +0 -26
  166. package/dist/geometry/circle.d.ts +0 -9
  167. package/dist/geometry/circle.js +0 -9
  168. package/dist/geometry/coords.d.ts +0 -16
  169. package/dist/geometry/coords.js +0 -16
  170. package/dist/geometry/distance.d.ts +0 -24
  171. package/dist/geometry/distance.js +0 -24
  172. package/dist/geometry/errors.d.ts +21 -36
  173. package/dist/geometry/errors.js +49 -29
  174. package/dist/geometry/geojson.d.ts +81 -0
  175. package/dist/geometry/geojson.js +164 -0
  176. package/dist/geometry/index.d.ts +38 -23
  177. package/dist/geometry/index.js +43 -31
  178. package/dist/geometry/measure.d.ts +0 -27
  179. package/dist/geometry/measure.js +0 -27
  180. package/dist/geometry/predicates.d.ts +0 -9
  181. package/dist/geometry/predicates.js +0 -9
  182. package/dist/geometry/public-bounds.d.ts +26 -0
  183. package/dist/geometry/public-bounds.js +30 -0
  184. package/dist/geometry/public-combine.d.ts +78 -0
  185. package/dist/geometry/public-combine.js +82 -0
  186. package/dist/geometry/public-create.d.ts +54 -0
  187. package/dist/geometry/public-create.js +70 -0
  188. package/dist/geometry/public-measure.d.ts +170 -0
  189. package/dist/geometry/public-measure.js +283 -0
  190. package/dist/geometry/public-predicates.d.ts +54 -0
  191. package/dist/geometry/public-predicates.js +144 -0
  192. package/dist/geometry/public-repair.d.ts +75 -0
  193. package/dist/geometry/public-repair.js +77 -0
  194. package/dist/geometry/simplify.d.ts +0 -7
  195. package/dist/geometry/simplify.js +0 -7
  196. package/dist/geometry/split.d.ts +0 -20
  197. package/dist/geometry/split.js +0 -20
  198. package/dist/geometry/units.d.ts +20 -12
  199. package/dist/geometry/units.js +20 -12
  200. package/dist/index.d.ts +52 -66
  201. package/dist/index.js +6 -18
  202. package/dist/messages.d.ts +7 -7
  203. package/dist/modes/draw/circle.js +83 -207
  204. package/dist/modes/draw/commit-layer.d.ts +5 -16
  205. package/dist/modes/draw/commit-layer.js +2 -13
  206. package/dist/modes/draw/freehand.js +108 -246
  207. package/dist/modes/draw/image.js +4 -2
  208. package/dist/modes/draw/index.d.ts +5 -5
  209. package/dist/modes/draw/index.js +5 -5
  210. package/dist/modes/draw/line.js +18 -354
  211. package/dist/modes/draw/point.js +29 -78
  212. package/dist/modes/draw/polygon.js +23 -368
  213. package/dist/modes/draw/trace-support.d.ts +43 -36
  214. package/dist/modes/draw/trace-support.js +95 -98
  215. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  216. package/dist/modes/draw/vertex-drawing.js +176 -0
  217. package/dist/modes/handler.d.ts +1 -285
  218. package/dist/modes/manager.d.ts +2 -2
  219. package/dist/modes/manager.js +3 -0
  220. package/dist/modes/select/box-selection.d.ts +3 -3
  221. package/dist/modes/select/box-selection.js +2 -1
  222. package/dist/modes/select/click-handler.d.ts +5 -5
  223. package/dist/modes/select/click-handler.js +22 -20
  224. package/dist/modes/select/cursor-handler.d.ts +2 -2
  225. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  226. package/dist/modes/select/drag/move.js +3 -3
  227. package/dist/modes/select/drag/operation.d.ts +3 -3
  228. package/dist/modes/select/drag/radius.js +5 -4
  229. package/dist/modes/select/drag/transform.d.ts +2 -2
  230. package/dist/modes/select/drag/transform.js +11 -5
  231. package/dist/modes/select/drag/vertex.d.ts +2 -2
  232. package/dist/modes/select/drag/vertex.js +13 -8
  233. package/dist/modes/select/drag-handler.js +44 -25
  234. package/dist/modes/select/mode.js +17 -17
  235. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  236. package/dist/modes/select/shortcut-handler.js +9 -7
  237. package/dist/operations/layer-operations.js +29 -168
  238. package/dist/operations/resize.d.ts +2 -2
  239. package/dist/operations/resize.js +5 -5
  240. package/dist/operations/rotate.js +5 -5
  241. package/dist/operations/selection-operations.d.ts +16 -1
  242. package/dist/operations/selection-operations.js +28 -13
  243. package/dist/operations/shared-vertex.js +4 -2
  244. package/dist/operations/trace-graph.d.ts +0 -18
  245. package/dist/operations/trace-graph.js +0 -18
  246. package/dist/operations/vertex.js +36 -35
  247. package/dist/shared/color.d.ts +1 -0
  248. package/dist/shared/color.js +245 -0
  249. package/dist/shared/config/constants.d.ts +1 -54
  250. package/dist/shared/config/constants.js +1 -58
  251. package/dist/shared/config/feature-style.d.ts +16 -13
  252. package/dist/shared/config/feature-style.js +9 -0
  253. package/dist/shared/config/rendering.d.ts +3 -3
  254. package/dist/shared/config/selection-highlight.d.ts +0 -15
  255. package/dist/shared/config/selection-highlight.js +4 -7
  256. package/dist/shared/config/selection.d.ts +2 -32
  257. package/dist/shared/config/selection.js +0 -18
  258. package/dist/shared/config/topology.d.ts +2 -2
  259. package/dist/shared/config/trace.d.ts +4 -4
  260. package/dist/shared/math/angle.d.ts +1 -1
  261. package/dist/shared/math/angle.js +1 -1
  262. package/dist/shared/math/circle.d.ts +1 -1
  263. package/dist/shared/math/circle.js +1 -1
  264. package/dist/shared/math/distance.d.ts +2 -1
  265. package/dist/shared/math/distance.js +3 -2
  266. package/dist/shared/math/index.d.ts +1 -1
  267. package/dist/shared/math/index.js +1 -1
  268. package/dist/shared/math/transform.d.ts +23 -0
  269. package/dist/shared/math/transform.js +47 -28
  270. package/dist/shared/properties.d.ts +18 -0
  271. package/dist/shared/properties.js +129 -0
  272. package/dist/shared/types/events.d.ts +15 -7
  273. package/dist/shared/types/model.d.ts +109 -159
  274. package/dist/shared/types/style.d.ts +1 -1
  275. package/dist/shared/utils/color.d.ts +2 -36
  276. package/dist/shared/utils/color.js +13 -70
  277. package/dist/shared/utils/coordinates.d.ts +30 -4
  278. package/dist/shared/utils/coordinates.js +56 -10
  279. package/dist/shared/utils/event-emitter.d.ts +1 -262
  280. package/dist/shared/utils/event-emitter.js +4 -3
  281. package/dist/shared/utils/feature-bbox.js +8 -7
  282. package/dist/shared/utils/feature-segments.js +5 -4
  283. package/dist/shared/utils/image.d.ts +0 -4
  284. package/dist/shared/utils/image.js +0 -6
  285. package/dist/shared/utils/name-generator.d.ts +14 -20
  286. package/dist/shared/utils/name-generator.js +20 -3
  287. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  288. package/dist/shared/utils/pixel-ratio.js +13 -4
  289. package/dist/shared/utils/property.d.ts +7 -50
  290. package/dist/shared/utils/property.js +22 -87
  291. package/dist/snapping/custom-targets.js +21 -4
  292. package/dist/snapping/indicator.js +20 -11
  293. package/dist/snapping/providers/display.d.ts +6 -1
  294. package/dist/snapping/providers/display.js +2 -1
  295. package/dist/snapping/providers/guide.d.ts +3 -43
  296. package/dist/snapping/providers/guide.js +1 -44
  297. package/dist/snapping/providers/intersection.js +1 -1
  298. package/dist/snapping/providers/store.js +3 -3
  299. package/dist/snapping/service.js +18 -7
  300. package/dist/snapping/types.d.ts +9 -35
  301. package/dist/store/draw-store.js +233 -142
  302. package/dist/store/local-visibility.d.ts +11 -6
  303. package/dist/store/local-visibility.js +38 -7
  304. package/dist/store/lock.d.ts +0 -6
  305. package/dist/store/lock.js +0 -6
  306. package/dist/store/memory/change-bus.d.ts +3 -3
  307. package/dist/store/memory/change-bus.js +12 -0
  308. package/dist/store/memory/file-store.d.ts +2 -2
  309. package/dist/store/memory/ui-state.d.ts +1 -51
  310. package/dist/store/memory/ui-state.js +122 -134
  311. package/dist/store/memory.d.ts +1 -8
  312. package/dist/store/memory.js +249 -45
  313. package/dist/store/ordering.d.ts +9 -0
  314. package/dist/store/ordering.js +17 -0
  315. package/dist/store/spatial/spatial-index.d.ts +1 -1
  316. package/dist/store/spatial/spatial-index.js +1 -1
  317. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  318. package/dist/store/spatial/store-spatial-index.js +9 -3
  319. package/dist/store/store.d.ts +66 -107
  320. package/dist/store/types.d.ts +1 -1
  321. package/dist/store/writable-layer.d.ts +1 -1
  322. package/dist/store/writable-layer.js +2 -2
  323. package/dist/table/builder.d.ts +83 -0
  324. package/dist/table/builder.js +381 -0
  325. package/dist/table/index.d.ts +37 -0
  326. package/dist/table/index.js +5 -0
  327. package/dist/table/packed-rtree.d.ts +1 -0
  328. package/dist/{display → table}/packed-rtree.js +1 -1
  329. package/dist/table/partition.d.ts +1 -0
  330. package/dist/{display → table}/partition.js +3 -3
  331. package/dist/table/prepare.d.ts +44 -0
  332. package/dist/table/prepare.js +136 -0
  333. package/dist/table/table.d.ts +1 -0
  334. package/dist/{display/columnar → table}/table.js +29 -25
  335. package/dist/{display/columnar → table}/types.d.ts +68 -72
  336. package/dist/table/types.js +3 -0
  337. package/dist/view/coordinator.js +4 -3
  338. package/dist/view/feature-companion.d.ts +13 -7
  339. package/dist/view/feature-companion.js +11 -3
  340. package/dist/view/globe-subdivision.js +3 -3
  341. package/dist/view/layer/attach.d.ts +1 -1
  342. package/dist/view/layer/attach.js +1 -1
  343. package/dist/view/layer/custom-layer.js +40 -11
  344. package/dist/view/layer/display-list.js +2 -1
  345. package/dist/view/layer/drape-planner.d.ts +2 -2
  346. package/dist/view/layer/frame-render.d.ts +3 -3
  347. package/dist/view/layer/frame-render.js +7 -2
  348. package/dist/view/layer/frame-state.d.ts +6 -6
  349. package/dist/view/layer/index.d.ts +2 -2
  350. package/dist/view/layer/index.js +1 -1
  351. package/dist/view/layer/render.d.ts +4 -4
  352. package/dist/view/layer/render.js +3 -8
  353. package/dist/view/layer/renderers.d.ts +2 -2
  354. package/dist/view/layer/renderers.js +1 -1
  355. package/dist/view/layer/slot-manager.d.ts +2 -2
  356. package/dist/view/layer/slot-manager.js +4 -4
  357. package/dist/view/layer/slots.d.ts +2 -2
  358. package/dist/view/layer/slots.js +1 -1
  359. package/dist/view/layer/store-retained-bbox.js +3 -2
  360. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  361. package/dist/view/layer/store-retained-classify.js +19 -7
  362. package/dist/view/layer/store-retained-collect.js +8 -7
  363. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  364. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  365. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  366. package/dist/view/layer/store-retained-immediate.js +3 -8
  367. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  368. package/dist/view/layer/store-retained.d.ts +2 -2
  369. package/dist/view/layer/store-retained.js +1 -1
  370. package/dist/view/renderers/batch-manager.js +8 -7
  371. package/dist/view/renderers/drawer.js +21 -15
  372. package/dist/view/renderers/image.js +13 -39
  373. package/dist/view/renderers/line/line-types.d.ts +3 -3
  374. package/dist/view/renderers/line/sdf-line.js +3 -1
  375. package/dist/view/renderers/point/billboard-depth.js +1 -1
  376. package/dist/view/renderers/point/point-instance.js +1 -1
  377. package/dist/view/renderers/point/point-shape.js +2 -2
  378. package/dist/view/renderers/point/point-style.js +48 -4
  379. package/dist/view/renderers/polygon/batch.js +1 -2
  380. package/dist/view/renderers/polygon/fill.js +3 -1
  381. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  382. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  383. package/dist/view/renderers/stroke.js +3 -1
  384. package/dist/view/shaders/helpers.d.ts +2 -42
  385. package/dist/view/shaders/helpers.js +0 -6
  386. package/dist/view/shaders/projection.d.ts +15 -7
  387. package/dist/view/shaders/projection.js +23 -6
  388. package/dist/view/shaders/quad.d.ts +16 -12
  389. package/dist/view/shaders/quad.js +34 -13
  390. package/dist/view/style-rule.d.ts +5 -42
  391. package/dist/view/style-rule.js +20 -44
  392. package/dist/view/terrain/binding.d.ts +1 -0
  393. package/dist/view/terrain/binding.js +29 -0
  394. package/dist/view/terrain/context.d.ts +3 -4
  395. package/dist/view/terrain/context.js +4 -5
  396. package/dist/view/terrain/drape/geometry.js +1 -1
  397. package/dist/view/terrain/drape/pass.d.ts +1 -1
  398. package/dist/view/terrain/drape/pass.js +8 -7
  399. package/dist/view/terrain/polygon.d.ts +9 -5
  400. package/dist/view/terrain/polygon.js +16 -2
  401. package/dist/view/terrain/state.d.ts +1 -1
  402. package/dist/view/terrain/state.js +1 -1
  403. package/dist/view/terrain/tessellation.d.ts +2 -2
  404. package/dist/view/terrain/tessellation.js +1 -1
  405. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  406. package/dist/view/ui/bounds.js +8 -12
  407. package/dist/view/ui/handle-test.js +2 -2
  408. package/dist/view/ui/handle-thinning.js +17 -17
  409. package/dist/view/ui/handles.js +21 -13
  410. package/dist/view/ui/helper.d.ts +1 -1
  411. package/dist/view/ui/helper.js +1 -1
  412. package/dist/view/ui/index.d.ts +1 -1
  413. package/dist/view/ui/selection-scope.js +4 -2
  414. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  415. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  416. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  417. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  418. package/dist/view/ui/selection-ui/index.js +1 -1
  419. package/dist/view/ui/selection-ui/renderer.js +15 -38
  420. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  421. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  422. package/dist/view/ui/selection-ui-drawer.js +63 -2
  423. package/dist/view/ui/tentative.js +1 -1
  424. package/dist/webgl/index.d.ts +65 -0
  425. package/dist/webgl/index.js +62 -0
  426. package/package.json +20 -9
  427. package/dist/api/api.d.ts +0 -1259
  428. package/dist/api/api.js +0 -86
  429. package/dist/api/context.d.ts +0 -173
  430. package/dist/api/display-api.js +0 -23
  431. package/dist/api/event-api.d.ts +0 -13
  432. package/dist/api/event-api.js +0 -17
  433. package/dist/api/extension-api.d.ts +0 -46
  434. package/dist/api/extension-api.js +0 -85
  435. package/dist/api/feature-api.d.ts +0 -11
  436. package/dist/api/feature-api.js +0 -101
  437. package/dist/api/geometry/apply.d.ts +0 -51
  438. package/dist/api/geometry/boolean.d.ts +0 -28
  439. package/dist/api/geometry/boolean.js +0 -65
  440. package/dist/api/geometry/types.d.ts +0 -31
  441. package/dist/api/geometry-operations.d.ts +0 -162
  442. package/dist/api/geometry-operations.js +0 -94
  443. package/dist/api/group-api.d.ts +0 -10
  444. package/dist/api/group-api.js +0 -78
  445. package/dist/api/import-export/constants.d.ts +0 -29
  446. package/dist/api/import-export/constants.js +0 -40
  447. package/dist/api/import-export/file-name.d.ts +0 -10
  448. package/dist/api/import-export/file-name.js +0 -20
  449. package/dist/api/import-export/geojson-export.d.ts +0 -19
  450. package/dist/api/import-export/image-import.d.ts +0 -12
  451. package/dist/api/import-export/image-import.js +0 -53
  452. package/dist/api/import-export/index.d.ts +0 -9
  453. package/dist/api/import-export/index.js +0 -107
  454. package/dist/api/import-export/native-format.d.ts +0 -15
  455. package/dist/api/import-export/style-validation.d.ts +0 -27
  456. package/dist/api/import-export/style-validation.js +0 -49
  457. package/dist/api/import-export/types.d.ts +0 -26
  458. package/dist/api/index.d.ts +0 -15
  459. package/dist/api/index.js +0 -3
  460. package/dist/api/input-api.d.ts +0 -158
  461. package/dist/api/input-api.js +0 -144
  462. package/dist/api/instance-api.d.ts +0 -38
  463. package/dist/api/instance-api.js +0 -136
  464. package/dist/api/layer-api.d.ts +0 -12
  465. package/dist/api/layer-api.js +0 -62
  466. package/dist/api/selection-api.d.ts +0 -7
  467. package/dist/api/selection-api.js +0 -78
  468. package/dist/api/snapping-api.d.ts +0 -125
  469. package/dist/api/snapping-api.js +0 -50
  470. package/dist/api/topology-api.d.ts +0 -30
  471. package/dist/api/topology-api.js +0 -16
  472. package/dist/api/tracing-api.d.ts +0 -31
  473. package/dist/api/tracing-api.js +0 -16
  474. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  475. package/dist/dispatcher/hit-test/index.js +0 -9
  476. package/dist/dispatcher/index.d.ts +0 -15
  477. package/dist/dispatcher/index.js +0 -3
  478. package/dist/display/columnar/index.d.ts +0 -12
  479. package/dist/display/columnar/index.js +0 -13
  480. package/dist/display/columnar/prepare.d.ts +0 -42
  481. package/dist/display/columnar/prepare.js +0 -116
  482. package/dist/display/index.d.ts +0 -13
  483. package/dist/display/types.js +0 -43
  484. package/dist/maplibre-gl-draw.d.ts +0 -47
  485. package/dist/modes/cursor.js +0 -72
  486. package/dist/modes/index.d.ts +0 -7
  487. package/dist/operations/index.d.ts +0 -9
  488. package/dist/operations/index.js +0 -3
  489. package/dist/plugins/index.d.ts +0 -10
  490. package/dist/plugins/mutation-hooks.d.ts +0 -28
  491. package/dist/plugins/mutation-hooks.js +0 -84
  492. package/dist/plugins/plugin-context.js +0 -367
  493. package/dist/plugins/plugin-manager.d.ts +0 -103
  494. package/dist/plugins/plugin-manager.js +0 -316
  495. package/dist/plugins/plugin.d.ts +0 -529
  496. package/dist/shared/config/index.d.ts +0 -17
  497. package/dist/shared/config/index.js +0 -8
  498. package/dist/shared/utils/index.d.ts +0 -15
  499. package/dist/shared/utils/index.js +0 -24
  500. package/dist/snapping/index.d.ts +0 -14
  501. package/dist/snapping/index.js +0 -4
  502. package/dist/store/change-merger.js +0 -102
  503. package/dist/store/event-bridge.js +0 -161
  504. package/dist/store/index.d.ts +0 -12
  505. package/dist/store/index.js +0 -4
  506. package/dist/view/index.d.ts +0 -47
  507. package/dist/view/index.js +0 -20
  508. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  509. /package/dist/api/{import-export/types.js → document.js} +0 -0
  510. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  511. /package/dist/{display/index.js → api/events.js} +0 -0
  512. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  513. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  514. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  515. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  516. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  517. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  518. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  519. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  520. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  521. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  522. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  523. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  524. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  525. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  526. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  527. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  528. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  529. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  532. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  533. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  534. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  535. /package/dist/{display → dataset}/chunk-set.js +0 -0
  536. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  537. /package/dist/{display → dataset}/manager.js +0 -0
  538. /package/dist/{display → dataset}/provider.js +0 -0
  539. /package/dist/{display → dataset}/selection.d.ts +0 -0
  540. /package/dist/{display → dataset}/selection.js +0 -0
@@ -0,0 +1,466 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { formatColor } from '../../shared/color.js';
4
+ import { DRAW_PROPERTY_KEYS, getDrawProperty } from '../../shared/properties.js';
5
+ import { coordinatesOf } from '../../shared/utils/coordinates.js';
6
+ import { isWritableLayer } from '../../store/writable-layer.js';
7
+ import { anchorElevationMeters, getAnchorElevationGeneration, projectAnchor, } from '../../view/terrain/anchor.js';
8
+ import { bindTerrainState } from '../../view/terrain/binding.js';
9
+ import { anchorGhostOpacity } from '../../view/terrain/occlusion.js';
10
+ import { computeBoundingBox, hasZeroArea } from '../../view/ui/selection-ui/index.js';
11
+ import { mergeOptions } from './options.js';
12
+ import { toDatasetRow } from './rows.js';
13
+ // ============================================================================
14
+ // Conversions
15
+ // ============================================================================
16
+ /**
17
+ * A point on the screen as the contract gives it
18
+ *
19
+ * @internal
20
+ */
21
+ export function toScreenPoint(point) {
22
+ return [point.x, point.y];
23
+ }
24
+ /**
25
+ * A position as the contract gives it
26
+ *
27
+ * @internal
28
+ */
29
+ export function toPosition(lngLat) {
30
+ return [lngLat.lng, lngLat.lat];
31
+ }
32
+ /**
33
+ * A snapping result of the engine in the shape of the contract
34
+ *
35
+ * @internal
36
+ */
37
+ export function toSnapResult(result, fallback) {
38
+ if (!result)
39
+ return { lngLat: fallback };
40
+ const out = { lngLat: toPosition(result.lngLat) };
41
+ const target = result.target;
42
+ if (target) {
43
+ out.target = { kind: target.kind };
44
+ if (target.featureId !== undefined)
45
+ out.target.featureId = target.featureId;
46
+ if (target.datasetId !== undefined)
47
+ out.target.datasetId = target.datasetId;
48
+ if (target.description !== undefined)
49
+ out.target.description = target.description;
50
+ if (target.vertex !== undefined)
51
+ out.target.vertex = target.vertex;
52
+ if (target.segment !== undefined) {
53
+ out.target.segment = { start: target.segment.start, end: target.segment.end };
54
+ }
55
+ }
56
+ return out;
57
+ }
58
+ /** A value of an RGBA color from 0 to 1, as the internal styles hold them */
59
+ function isRgba(value) {
60
+ return Array.isArray(value) && value.length === 4 && value.every((v) => typeof v === 'number');
61
+ }
62
+ /** The internal look of the selection with its colors written as CSS colors */
63
+ function withCssColors(value) {
64
+ if (isRgba(value))
65
+ return formatColor(value);
66
+ if (Array.isArray(value))
67
+ return value.map(withCssColors);
68
+ if (typeof value === 'object' && value !== null) {
69
+ return Object.fromEntries(Object.entries(value).map(([key, v]) => [key, withCssColors(v)]));
70
+ }
71
+ return value;
72
+ }
73
+ /**
74
+ * The look of the selection in the shape of the contract: what the options give, over the
75
+ * look the engine resolved from the defaults
76
+ *
77
+ * @param config - The look of the selection the engine draws with
78
+ * @param box - The look of the box selection the engine draws with
79
+ * @param given - The look of the selection the options give
80
+ * @internal
81
+ */
82
+ export function toSelectionStyle(config, box, given) {
83
+ const resolved = {
84
+ ...withCssColors(config),
85
+ boxSelection: {
86
+ fillColor: formatColor([box.fillColor[0], box.fillColor[1], box.fillColor[2], 1]),
87
+ fillOpacity: box.fillColor[3],
88
+ strokeColor: formatColor(box.strokeColor),
89
+ strokeWidth: box.strokeWidth,
90
+ },
91
+ };
92
+ return mergeOptions(resolved, (given ?? {}));
93
+ }
94
+ /**
95
+ * The shape being drawn, as the engine keeps it, for a feature input of the contract
96
+ *
97
+ * @internal
98
+ */
99
+ export function toTentative(input, layerId, pendingFeatureId) {
100
+ const state = {
101
+ type: input.type,
102
+ coordinates: coordinatesOf(input),
103
+ layerId,
104
+ };
105
+ if (pendingFeatureId !== undefined)
106
+ state.pendingFeatureId = pendingFeatureId;
107
+ const properties = input.properties ?? {};
108
+ const radius = properties[DRAW_PROPERTY_KEYS.radiusMeters];
109
+ const angle = properties[DRAW_PROPERTY_KEYS.radiusHandleAngle];
110
+ if (typeof radius === 'number')
111
+ state.radiusMeters = radius;
112
+ if (typeof angle === 'number')
113
+ state.radiusHandleAngle = angle;
114
+ return state;
115
+ }
116
+ /**
117
+ * The terrain anchors over the terrain state of an instance
118
+ *
119
+ * @internal
120
+ */
121
+ export function createTerrainAnchors(terrain) {
122
+ const anchors = {
123
+ project(lngLat) {
124
+ const point = projectAnchor(terrain, lngLat[0], lngLat[1]);
125
+ return point ? [point.x, point.y] : null;
126
+ },
127
+ elevation: (lngLat) => anchorElevationMeters(terrain, lngLat[0], lngLat[1]),
128
+ ghostOpacity: (lngLat) => anchorGhostOpacity(terrain, lngLat[0], lngLat[1]),
129
+ generation: () => getAnchorElevationGeneration(terrain),
130
+ };
131
+ // The building blocks of the second entry find the state behind the anchors
132
+ bindTerrainState(anchors, terrain);
133
+ return anchors;
134
+ }
135
+ /**
136
+ * The automatic names over the name generator of an instance
137
+ *
138
+ * @internal
139
+ */
140
+ export function createNameGenerator(generator) {
141
+ return {
142
+ next(type) {
143
+ if (type === 'Layer')
144
+ return generator.generateLayerName();
145
+ if (type === 'Group')
146
+ return generator.generateGroupName();
147
+ return generator.generateName(type);
148
+ },
149
+ };
150
+ }
151
+ /**
152
+ * The conversion between the map and the screen of an instance
153
+ *
154
+ * @internal
155
+ */
156
+ export function createScreenContext(services, boundsOf) {
157
+ const { map } = services;
158
+ const project = (lngLat) => toScreenPoint(map.project([lngLat[0], lngLat[1]]));
159
+ return {
160
+ project,
161
+ unproject: (point) => toPosition(map.unproject(point)),
162
+ bounds(feature) {
163
+ const own = boundsOf?.(feature);
164
+ if (own !== undefined)
165
+ return own;
166
+ const box = computeBoundingBox(feature, services.selectionExtensions);
167
+ if (!box)
168
+ return null;
169
+ const corners = [box.topLeft, box.topRight, box.bottomRight, box.bottomLeft].map(project);
170
+ return {
171
+ min: [Math.min(...corners.map((c) => c[0])), Math.min(...corners.map((c) => c[1]))],
172
+ max: [Math.max(...corners.map((c) => c[0])), Math.max(...corners.map((c) => c[1]))],
173
+ };
174
+ },
175
+ outline(feature) {
176
+ const extensions = services.selectionExtensions;
177
+ const box = computeBoundingBox(feature, extensions);
178
+ if (!box)
179
+ return [];
180
+ if (hasZeroArea(box)) {
181
+ // A feature with no area has the frame of a point: its outline, or its extent, in
182
+ // pixels around its position
183
+ const [x, y] = project(box.center);
184
+ return extensions
185
+ .resolvePointFrameCorners(feature, { x, y }, 0)
186
+ .map((corner) => [corner.x, corner.y]);
187
+ }
188
+ return [box.topLeft, box.topRight, box.bottomRight, box.bottomLeft].map(project);
189
+ },
190
+ get zoom() {
191
+ return map.getZoom();
192
+ },
193
+ get pixelRatio() {
194
+ return services.pixelRatio.resolve();
195
+ },
196
+ };
197
+ }
198
+ /** @internal */
199
+ export function createSubscriptions() {
200
+ const all = new Set();
201
+ return {
202
+ track(unsubscribe) {
203
+ let done = false;
204
+ const end = () => {
205
+ if (done)
206
+ return;
207
+ done = true;
208
+ all.delete(end);
209
+ unsubscribe();
210
+ };
211
+ all.add(end);
212
+ return end;
213
+ },
214
+ endAll() {
215
+ for (const end of [...all])
216
+ end();
217
+ },
218
+ };
219
+ }
220
+ /**
221
+ * Builds the part every context of an extension has
222
+ *
223
+ * @param subscriptions - Where the subscriptions of the extension are kept
224
+ * @internal
225
+ */
226
+ export function createExtensionContext(services, screen, subscriptions) {
227
+ const { store, spatialIndex, map } = services;
228
+ const listeners = new Map();
229
+ const forget = (event, listener) => {
230
+ const byEvent = listeners.get(listener);
231
+ byEvent?.delete(event);
232
+ if (byEvent?.size === 0)
233
+ listeners.delete(listener);
234
+ };
235
+ const subscribe = (event, listener, once) => {
236
+ const draw = services.getDraw();
237
+ const wrapped = once
238
+ ? (payload) => {
239
+ end();
240
+ listener(payload);
241
+ }
242
+ : listener;
243
+ const end = subscriptions.track(() => {
244
+ forget(event, listener);
245
+ draw.off(event, wrapped);
246
+ });
247
+ draw.on(event, wrapped);
248
+ let byEvent = listeners.get(listener);
249
+ if (!byEvent) {
250
+ byEvent = new Map();
251
+ listeners.set(listener, byEvent);
252
+ }
253
+ byEvent.get(event)?.();
254
+ byEvent.set(event, end);
255
+ return end;
256
+ };
257
+ return {
258
+ get draw() {
259
+ return services.getDraw();
260
+ },
261
+ store: services.store,
262
+ on: (event, listener) => subscribe(event, listener, false),
263
+ off(event, listener) {
264
+ listeners.get(listener)?.get(event)?.();
265
+ },
266
+ once: (event, listener) => subscribe(event, listener, true),
267
+ terrain: createTerrainAnchors(services.terrain),
268
+ names: createNameGenerator(services.autoNameGenerator),
269
+ screen,
270
+ invalidate(filter) {
271
+ if (filter?.type !== undefined)
272
+ spatialIndex.invalidateType(filter.type);
273
+ if (filter?.ids !== undefined)
274
+ spatialIndex.invalidate(filter.ids);
275
+ if (filter?.type === undefined && filter?.ids === undefined) {
276
+ spatialIndex.invalidate(store.listFeatures().map((feature) => feature.id));
277
+ }
278
+ map.triggerRepaint();
279
+ },
280
+ // The same object as draw.drawing, read when it is asked for: the draw instance is attached
281
+ // after the host is built
282
+ get drawing() {
283
+ return services.getDraw().drawing;
284
+ },
285
+ };
286
+ }
287
+ /**
288
+ * A topmost hit of the engine in the shape of the contract
289
+ *
290
+ * @internal
291
+ */
292
+ export function toHit(top, distanceToFeaturePx) {
293
+ if (!top)
294
+ return null;
295
+ switch (top.kind) {
296
+ case 'store':
297
+ return {
298
+ kind: 'feature',
299
+ id: top.feature.id,
300
+ featureId: top.feature.id,
301
+ distancePx: distanceToFeaturePx(top.feature),
302
+ };
303
+ case 'dataset':
304
+ if (!top.feature)
305
+ return null;
306
+ return {
307
+ kind: 'dataset',
308
+ id: top.feature.id,
309
+ datasetId: top.dataset.id,
310
+ distancePx: 0,
311
+ };
312
+ case 'companion': {
313
+ const own = top.companion.hit.contractHit;
314
+ return (own ?? {
315
+ kind: 'companion',
316
+ id: top.companion.hit.id,
317
+ featureId: top.companion.featureId,
318
+ distancePx: 0,
319
+ });
320
+ }
321
+ }
322
+ }
323
+ /**
324
+ * Builds the context of a mode: the common part, and the hit testing, the snapping, the
325
+ * committing of features by the rules of the built-in modes, the preview and the cursor
326
+ *
327
+ * @internal
328
+ */
329
+ export function createModeContext(services, screen) {
330
+ const { store, map } = services;
331
+ const subscriptions = createSubscriptions();
332
+ const base = createExtensionContext(services, screen, subscriptions);
333
+ /** The ID the shape being drawn will have once it is committed */
334
+ let pendingId = null;
335
+ /** The cursor the mode set while it was entered, which `cursor.reset` goes back to */
336
+ let modeCursor = '';
337
+ let entering = false;
338
+ /** Whether the mode has set a cursor, which is taken back when it is left */
339
+ let cursorSet = false;
340
+ const clearPreview = () => {
341
+ pendingId = null;
342
+ if (store.getTentative() !== null)
343
+ store.setTentative(null);
344
+ };
345
+ const context = {
346
+ get draw() {
347
+ return services.getDraw();
348
+ },
349
+ store: base.store,
350
+ on: base.on,
351
+ off: base.off,
352
+ once: base.once,
353
+ terrain: base.terrain,
354
+ names: base.names,
355
+ screen: base.screen,
356
+ invalidate: base.invalidate,
357
+ get drawing() {
358
+ return base.drawing;
359
+ },
360
+ setMode: (mode) => services.modeManager.setMode(mode),
361
+ hitTest(point, options) {
362
+ const at = { x: point[0], y: point[1] };
363
+ return toHit(services.hitTestTopmost(at, options?.tolerancePx), (feature) => services.distanceToFeaturePx(feature, at));
364
+ },
365
+ snap(point) {
366
+ const result = services.snapPoint({ x: point[0], y: point[1] });
367
+ return toSnapResult(result, toPosition(result.lngLat));
368
+ },
369
+ commitFeature(input) {
370
+ if (store.isReadOnly() || store.isInteractionLocked())
371
+ return null;
372
+ const layerId = input.layerId ?? services.getWritableLayerId();
373
+ if (layerId === '' || !isWritableLayer(store.getLayer(layerId), store)) {
374
+ // The layer went away, or was locked or hidden, while drawing: the drawing is dropped
375
+ clearPreview();
376
+ services.modeManager.setMode('select');
377
+ return null;
378
+ }
379
+ const properties = { ...(input.properties ?? {}) };
380
+ if (properties.name === undefined) {
381
+ const name = services.autoNameGenerator.generateName(input.type);
382
+ if (name !== undefined)
383
+ properties.name = name;
384
+ }
385
+ if (services.scaleWithZoom &&
386
+ getDrawProperty({ properties }, 'createdZoom') === undefined) {
387
+ properties[DRAW_PROPERTY_KEYS.createdZoom] = map.getZoom();
388
+ }
389
+ const id = input.id ?? pendingId ?? undefined;
390
+ const feature = store.transact(() => {
391
+ const created = services.getDraw().features.create({
392
+ ...input,
393
+ ...(id !== undefined && { id }),
394
+ layerId,
395
+ properties: properties,
396
+ });
397
+ clearPreview();
398
+ return created;
399
+ });
400
+ if (feature)
401
+ services.notifyDrawCommit(feature);
402
+ return feature;
403
+ },
404
+ preview: {
405
+ set(feature, options) {
406
+ if (feature.id !== undefined)
407
+ pendingId = feature.id;
408
+ pendingId ?? (pendingId = services.generateId());
409
+ const layerId = feature.layerId ?? services.getWritableLayerId();
410
+ const state = toTentative(feature, layerId, pendingId);
411
+ if (options?.confirmedVertices !== undefined) {
412
+ state.confirmedCount = options.confirmedVertices;
413
+ }
414
+ if (options?.highlightVertex !== undefined) {
415
+ state.highlightedVertexIndex = options.highlightVertex;
416
+ }
417
+ store.setTentative(state);
418
+ },
419
+ clear: clearPreview,
420
+ },
421
+ cursor: {
422
+ set(cursor) {
423
+ if (entering)
424
+ modeCursor = cursor;
425
+ cursorSet = true;
426
+ map.getCanvas().style.cursor = cursor;
427
+ },
428
+ reset() {
429
+ map.getCanvas().style.cursor = modeCursor;
430
+ },
431
+ },
432
+ get selectionStyle() {
433
+ return toSelectionStyle(services.selectionStyle, services.boxSelectionStyle, services.getDraw().options.get().selectionStyle);
434
+ },
435
+ listTraceRows: (bbox) => services
436
+ .listTraceRows(bbox)
437
+ .filter((entry) => entry.rowIndex >= 0)
438
+ .map(({ datasetId, rowIndex, feature }) => ({
439
+ datasetId,
440
+ rowIndex,
441
+ row: toDatasetRow(feature),
442
+ })),
443
+ writableLayer() {
444
+ const id = services.getWritableLayerId();
445
+ return id === '' ? null : (store.getLayer(id) ?? null);
446
+ },
447
+ };
448
+ return {
449
+ context,
450
+ entering(run) {
451
+ entering = true;
452
+ try {
453
+ run();
454
+ }
455
+ finally {
456
+ entering = false;
457
+ }
458
+ },
459
+ dispose() {
460
+ subscriptions.endAll();
461
+ if (cursorSet)
462
+ map.getCanvas().style.cursor = '';
463
+ cursorSet = false;
464
+ },
465
+ };
466
+ }
@@ -0,0 +1,124 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { createDatasets } from './datasets.js';
4
+ import { guardAfterDestroy } from './destroy-guard.js';
5
+ import { createDocument } from './document.js';
6
+ import { createDrawing, createDrawingResource } from './drawing.js';
7
+ import { createEngine } from './engine.js';
8
+ import { createFeatures } from './features.js';
9
+ import { createGroups } from './groups.js';
10
+ import { createHidden } from './hidden.js';
11
+ import { createLayers } from './layers.js';
12
+ import { createMetadata } from './metadata.js';
13
+ import { checkDrawOptions, createOptions, toEngineOptions } from './options.js';
14
+ import { createSelection, createVertexSelection } from './selection.js';
15
+ import { invalidInput, notFound, requireRecord, withLocksIgnored } from './shared.js';
16
+ /** The methods of the instance that return a promise: after destroy they reject */
17
+ const ASYNC_MEMBERS = new Set(['document.load', 'document.loadMany']);
18
+ /**
19
+ * Builds the draw instance on an engine and hands it to the extensions of the engine
20
+ *
21
+ * @param options - The options the instance was created with
22
+ * @param setExternalEntry - Replaces the function that tells the entries from outside the
23
+ * document, which the engine asks
24
+ * @internal
25
+ */
26
+ export function createDrawOnEngine(engine, options = {}, setExternalEntry = () => { }) {
27
+ const drawOptions = createOptions(engine, options, setExternalEntry);
28
+ drawOptions.applyCreation();
29
+ const { context, modeManager, events, map } = engine;
30
+ const { store } = context;
31
+ const view = store;
32
+ const deps = {
33
+ store,
34
+ generateId: context.generateFeatureId,
35
+ autoNameGenerator: context.autoNameGenerator,
36
+ getActiveLayerId: context.getActiveLayerId,
37
+ setActiveLayerId: context.setActiveLayerId,
38
+ getStyleOptions: drawOptions.getStyle,
39
+ spatialIndex: context.spatialIndex,
40
+ };
41
+ const features = createFeatures(deps);
42
+ const groups = createGroups(deps);
43
+ // Set once destroy has run to the end, so that the extensions removed by it can still read
44
+ // the instance
45
+ let destroyed = false;
46
+ const members = {
47
+ features,
48
+ layers: createLayers(deps, (id) => engine.datasets.get(id)?.order === 'layer-order' || context.isExternalEntry?.(id) === true),
49
+ groups,
50
+ datasets: createDatasets(engine.datasets, events, context.eventEmitter),
51
+ hidden: createHidden(deps),
52
+ selection: createSelection(deps, { features, groups }),
53
+ vertexSelection: createVertexSelection(deps),
54
+ drawing: createDrawingResource(engine),
55
+ metadata: createMetadata(deps),
56
+ options: { get: drawOptions.get, update: drawOptions.update },
57
+ document: createDocument(deps, (result, source) => events.emit('document.loaded', { result, source })),
58
+ extensions: engine.extensions.collections,
59
+ getMap: () => map,
60
+ getStore: () => view,
61
+ getMode: () => modeManager.getMode(),
62
+ setMode(mode) {
63
+ if (typeof mode !== 'string')
64
+ throw invalidInput('The mode must be a string');
65
+ if (!modeManager.hasMode(mode))
66
+ throw notFound('mode', mode);
67
+ return modeManager.setMode(mode);
68
+ },
69
+ isReadOnly: () => store.isReadOnly(),
70
+ setReadOnly(value) {
71
+ store.setReadOnly(value === true);
72
+ },
73
+ isInteractionLocked: () => store.isInteractionLocked(),
74
+ setInteractionLocked(value) {
75
+ store.setInteractionLock(value === true);
76
+ // A drawing mode cannot run under the lock
77
+ if (value === true && modeManager.getMode() !== 'select')
78
+ modeManager.setMode('select');
79
+ },
80
+ transact(fn, transactOptions) {
81
+ if (transactOptions !== undefined)
82
+ requireRecord(transactOptions, 'The options');
83
+ const run = () => store.transact(fn, transactOptions?.source);
84
+ return transactOptions?.ignoreLocks === true ? withLocksIgnored(store, run) : run();
85
+ },
86
+ on: (event, listener) => events.on(event, listener),
87
+ off: (event, listener) => events.off(event, listener),
88
+ once: (event, listener) => events.once(event, listener),
89
+ ...createDrawing(engine),
90
+ destroy() {
91
+ if (destroyed)
92
+ return;
93
+ try {
94
+ engine.destroy();
95
+ }
96
+ finally {
97
+ destroyed = true;
98
+ }
99
+ },
100
+ };
101
+ // After destroy, every method but destroy throws invalid-state
102
+ const draw = guardAfterDestroy(members, () => destroyed, {
103
+ asyncMembers: ASYNC_MEMBERS,
104
+ skip: new Set(['destroy']),
105
+ });
106
+ engine.extensions.attach(draw, options.store);
107
+ return draw;
108
+ }
109
+ /**
110
+ * Puts a draw instance on a map and returns it.
111
+ *
112
+ * @internal
113
+ */
114
+ export function createDraw(map, options = {}) {
115
+ checkDrawOptions(options);
116
+ // The engine asks this function, so that the option can change while the instance runs
117
+ let isExternalEntry = options.isExternalEntry;
118
+ const engine = createEngine(map, toEngineOptions(options, (id) => isExternalEntry?.(id) === true), { deferDefaultMode: true });
119
+ const draw = createDrawOnEngine(engine, options, (fn) => {
120
+ isExternalEntry = fn;
121
+ });
122
+ engine.enterDefaultMode();
123
+ return draw;
124
+ }