@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,67 @@
1
+ /**
2
+ * Derivation of the locked state
3
+ *
4
+ * Determines the "effective lock" of a feature. A lock is inherited top-down: if the
5
+ * feature itself, the group it belongs to, or the layer it belongs to is locked, then
6
+ * that feature is regarded as not operable (move/resize/rotate/vertex editing/delete).
7
+ *
8
+ * A lock is "forbidding operations", not "forbidding selection or display". Selection is
9
+ * allowed, and the operation side (drag/delete/handle display) uses this predicate to
10
+ * reject the operation.
11
+ */
12
+ import type { Feature, Group, Layer } from './types.js';
13
+ /**
14
+ * What {@link isFeatureLocked} reads: the groups and the layers
15
+ *
16
+ * {@link StoreView}, {@link Store} and {@link PluginContext} all satisfy it, so the lock
17
+ * decision can be made from the host and from plugins as well.
18
+ */
19
+ export interface FeatureLockStore {
20
+ /** Returns the group with this ID, or undefined */
21
+ getGroup(id: string): Group | undefined;
22
+ /** Returns the layer with this ID, or undefined */
23
+ getLayer(id: string): Layer | undefined;
24
+ }
25
+ /**
26
+ * Whether the feature is effectively locked: by itself, by its group or by its layer
27
+ *
28
+ * A lock is inherited top-down. A locked feature can still be selected; it cannot be moved,
29
+ * resized, rotated, reshaped or deleted by the user.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const feature = draw.getFeature(id);
34
+ * if (feature && !isFeatureLocked(feature, draw.getStore())) draw.deleteFeature(id);
35
+ * ```
36
+ */
37
+ export declare function isFeatureLocked(feature: Feature, store: FeatureLockStore): boolean;
38
+ /**
39
+ * What {@link isInteractionBlocked} reads: {@link FeatureLockStore} plus read-only and the
40
+ * interaction lock
41
+ */
42
+ export interface InteractionGateStore extends FeatureLockStore {
43
+ /** Whether the Store is read-only */
44
+ isReadOnly(): boolean;
45
+ /** Whether the interaction lock is on */
46
+ isInteractionLocked(): boolean;
47
+ }
48
+ /**
49
+ * Whether the "start" of an editing interaction on this feature should be suppressed.
50
+ *
51
+ * True if any of readOnly, the interaction lock or the effective lock is set.
52
+ * readOnly means "an operation whose start is meaningless because writing is a no-op",
53
+ * the interaction lock means "suppressing operations in a read-only state", and feature
54
+ * locked means "the lock of that individual feature".
55
+ * All of them are suppression decisions at the starting point, orthogonal to the Store's
56
+ * write gate (which readOnly is responsible for).
57
+ * This predicate is used to reject at the origin of user input, such as the start of a
58
+ * drag or the display of selection handles.
59
+ */
60
+ export declare function isInteractionBlocked(feature: Feature, store: InteractionGateStore): boolean;
61
+ /**
62
+ * Whether the group is effectively locked: by itself or by the layer it belongs to
63
+ *
64
+ * @param findLayerOfGroup A function that returns the layer the group belongs to
65
+ * (because groups are stored in layer.order, the caller resolves it and passes it in)
66
+ */
67
+ export declare function isGroupLocked(group: Group, findLayerOfGroup: (groupId: string) => Layer | undefined): boolean;
@@ -0,0 +1,54 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Whether the feature is effectively locked: by itself, by its group or by its layer
5
+ *
6
+ * A lock is inherited top-down. A locked feature can still be selected; it cannot be moved,
7
+ * resized, rotated, reshaped or deleted by the user.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const feature = draw.getFeature(id);
12
+ * if (feature && !isFeatureLocked(feature, draw.getStore())) draw.deleteFeature(id);
13
+ * ```
14
+ */
15
+ export function isFeatureLocked(feature, store) {
16
+ if (feature.locked)
17
+ return true;
18
+ if (feature.groupId) {
19
+ const group = store.getGroup(feature.groupId);
20
+ if (group?.locked)
21
+ return true;
22
+ }
23
+ const layer = store.getLayer(feature.layerId);
24
+ if (layer?.locked)
25
+ return true;
26
+ return false;
27
+ }
28
+ /**
29
+ * Whether the "start" of an editing interaction on this feature should be suppressed.
30
+ *
31
+ * True if any of readOnly, the interaction lock or the effective lock is set.
32
+ * readOnly means "an operation whose start is meaningless because writing is a no-op",
33
+ * the interaction lock means "suppressing operations in a read-only state", and feature
34
+ * locked means "the lock of that individual feature".
35
+ * All of them are suppression decisions at the starting point, orthogonal to the Store's
36
+ * write gate (which readOnly is responsible for).
37
+ * This predicate is used to reject at the origin of user input, such as the start of a
38
+ * drag or the display of selection handles.
39
+ */
40
+ export function isInteractionBlocked(feature, store) {
41
+ return store.isReadOnly() || store.isInteractionLocked() || isFeatureLocked(feature, store);
42
+ }
43
+ /**
44
+ * Whether the group is effectively locked: by itself or by the layer it belongs to
45
+ *
46
+ * @param findLayerOfGroup A function that returns the layer the group belongs to
47
+ * (because groups are stored in layer.order, the caller resolves it and passes it in)
48
+ */
49
+ export function isGroupLocked(group, findLayerOfGroup) {
50
+ if (group.locked)
51
+ return true;
52
+ const layer = findLayerOfGroup(group.id);
53
+ return layer?.locked ?? false;
54
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * ChangeBus
3
+ *
4
+ * Responsible for the Store's change notification and transactions. It holds pendingChanges
5
+ * and flushes them to the listeners only at the outermost transaction. MemoryStore (and
6
+ * future Store implementations) holds one internally and delegates the transaction /
7
+ * listener mechanism to it.
8
+ *
9
+ * Accumulation is done by destructive appending (appendChanges). pendingChanges during a
10
+ * transaction is exposed only inside ChangeBus and is always recreated after a flush, so there
11
+ * is no need for an immutable merge (mergeChanges) that copies the arrays every time. With
12
+ * immutable copies, stacking N changes in one transaction costs O(N^2) in total, which made
13
+ * bulk import (draw.load) quadratic. Destructive appending costs an amortized O(1) per entry,
14
+ * so the whole accumulation stays within O(N).
15
+ *
16
+ * layers.updated / groups.updated are folded into one entry per identical ID. Updates to the
17
+ * same container happen many times within a single flush (layer.order changes every time one
18
+ * feature is created), while each entry holds a full-length snapshot of order / featureIds.
19
+ * Without folding, the amount retained in one transaction becomes O(N^2) and a bulk import
20
+ * reaches the heap limit. A folded entry keeps previous as the first state and layer/group as
21
+ * the last state, so as the diff of a single flush it means the same as before folding.
22
+ */
23
+ import type { Group, Layer, StateChanges, UpdateSource } from '../types.js';
24
+ export type StoreListener = (changes: StateChanges) => void;
25
+ export declare class ChangeBus {
26
+ #private;
27
+ /**
28
+ * @param beforeFlush Called when the outermost operation is about to notify, before the
29
+ * listeners (MemoryStore freezes the objects it built during the flush here)
30
+ */
31
+ constructor(beforeFlush?: () => void);
32
+ subscribe(listener: StoreListener): () => void;
33
+ /**
34
+ * Runs fn inside a transaction. Nesting is supported, and pendingChanges is flushed to the
35
+ * listeners at the moment the outermost transact finishes.
36
+ *
37
+ * Not atomic: when fn throws, what it changed before the throw is flushed like any other
38
+ * change and the exception propagates.
39
+ */
40
+ transact<T>(fn: () => T, source?: UpdateSource): T;
41
+ /**
42
+ * Merges the changes into pendingChanges. Flushes immediately if outside a transaction.
43
+ */
44
+ merge(changes: StateChanges): void;
45
+ /** Whether an update entry for this layer is already stacked within the same flush */
46
+ hasPendingLayerUpdate(id: string): boolean;
47
+ /** Whether an update entry for this group is already stacked within the same flush */
48
+ hasPendingGroupUpdate(id: string): boolean;
49
+ /**
50
+ * Stacks one layers.updated entry.
51
+ *
52
+ * Since folding leaves only the "first state" as previous, when hasPendingLayerUpdate is
53
+ * true the caller may pass undefined instead of building one (the existing entry's previous
54
+ * is used as is). When there is no entry, undefined means the state before and after the
55
+ * change is the same, so layer itself is used.
56
+ */
57
+ mergeLayerUpdate(layer: Layer, previous: Layer | undefined): void;
58
+ /** Stacks one groups.updated entry (previous is handled as in mergeLayerUpdate) */
59
+ mergeGroupUpdate(group: Group, previous: Group | undefined): void;
60
+ }
@@ -0,0 +1,232 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
4
+ if (kind === "m") throw new TypeError("Private method is not writable");
5
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
6
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
7
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
8
+ };
9
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
10
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
11
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
12
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
13
+ };
14
+ var _ChangeBus_instances, _ChangeBus_listeners, _ChangeBus_beforeFlush, _ChangeBus_transactionDepth, _ChangeBus_pendingChanges, _ChangeBus_currentSource, _ChangeBus_updateIndex, _ChangeBus_flushChanges;
15
+ /**
16
+ * Appends changes destructively to target. Array categories (created/updated/deleted, etc.)
17
+ * are concatenated with push, and single-value categories (orderChanged/selection/mode, etc.)
18
+ * are overwritten. The final result matches mergeChanges (the immutable version), but target
19
+ * is not recreated every time.
20
+ */
21
+ // If an existing array is given, push into it destructively; otherwise create and return a new
22
+ // array. The caller only assigns the result (avoiding nested assignment expressions for lint).
23
+ function appendField(existing, items) {
24
+ if (existing) {
25
+ existing.push(...items);
26
+ return existing;
27
+ }
28
+ return [...items];
29
+ }
30
+ /**
31
+ * Appends update entries while folding those with the same ID into one entry. If an entry
32
+ * already exists, only the current value is replaced while previous (the first state) is kept.
33
+ */
34
+ function appendLayerUpdates(existing, items, index) {
35
+ const list = existing ?? [];
36
+ for (const item of items) {
37
+ const at = index.get(item.id);
38
+ if (at === undefined) {
39
+ index.set(item.id, list.length);
40
+ list.push(item);
41
+ }
42
+ else {
43
+ list[at] = { id: item.id, layer: item.layer, previous: list[at].previous };
44
+ }
45
+ }
46
+ return list;
47
+ }
48
+ function appendGroupUpdates(existing, items, index) {
49
+ const list = existing ?? [];
50
+ for (const item of items) {
51
+ const at = index.get(item.id);
52
+ if (at === undefined) {
53
+ index.set(item.id, list.length);
54
+ list.push(item);
55
+ }
56
+ else {
57
+ list[at] = { id: item.id, group: item.group, previous: list[at].previous };
58
+ }
59
+ }
60
+ return list;
61
+ }
62
+ function appendChanges(target, changes, index) {
63
+ // features
64
+ if (changes.features) {
65
+ if (!target.features)
66
+ target.features = {};
67
+ const t = target.features;
68
+ if (changes.features.created)
69
+ t.created = appendField(t.created, changes.features.created);
70
+ if (changes.features.updated)
71
+ t.updated = appendField(t.updated, changes.features.updated);
72
+ if (changes.features.deleted)
73
+ t.deleted = appendField(t.deleted, changes.features.deleted);
74
+ }
75
+ // layers
76
+ if (changes.layers) {
77
+ if (!target.layers)
78
+ target.layers = {};
79
+ const t = target.layers;
80
+ if (changes.layers.created)
81
+ t.created = appendField(t.created, changes.layers.created);
82
+ if (changes.layers.updated) {
83
+ t.updated = appendLayerUpdates(t.updated, changes.layers.updated, index.layers);
84
+ }
85
+ if (changes.layers.deleted)
86
+ t.deleted = appendField(t.deleted, changes.layers.deleted);
87
+ if (changes.layers.orderChanged)
88
+ t.orderChanged = changes.layers.orderChanged;
89
+ }
90
+ // groups
91
+ if (changes.groups) {
92
+ if (!target.groups)
93
+ target.groups = {};
94
+ const t = target.groups;
95
+ if (changes.groups.created)
96
+ t.created = appendField(t.created, changes.groups.created);
97
+ if (changes.groups.updated) {
98
+ t.updated = appendGroupUpdates(t.updated, changes.groups.updated, index.groups);
99
+ }
100
+ if (changes.groups.deleted)
101
+ t.deleted = appendField(t.deleted, changes.groups.deleted);
102
+ }
103
+ // layerReorder / groupReorder (dedicated, overwritten)
104
+ if (changes.layerReorder)
105
+ target.layerReorder = changes.layerReorder;
106
+ if (changes.groupReorder)
107
+ target.groupReorder = changes.groupReorder;
108
+ // selection (overwritten)
109
+ if (changes.selection)
110
+ target.selection = changes.selection;
111
+ // editing
112
+ if (changes.editing) {
113
+ if (!target.editing)
114
+ target.editing = {};
115
+ const t = target.editing;
116
+ if (changes.editing.started)
117
+ t.started = appendField(t.started, changes.editing.started);
118
+ if (changes.editing.ended)
119
+ t.ended = appendField(t.ended, changes.editing.ended);
120
+ }
121
+ // tentative / mode / metadata (overwritten)
122
+ if (changes.tentative)
123
+ target.tentative = changes.tentative;
124
+ if (changes.mode)
125
+ target.mode = changes.mode;
126
+ if (changes.uiStateChanged)
127
+ target.uiStateChanged = true;
128
+ if (changes.metadata)
129
+ target.metadata = changes.metadata;
130
+ }
131
+ export class ChangeBus {
132
+ /**
133
+ * @param beforeFlush Called when the outermost operation is about to notify, before the
134
+ * listeners (MemoryStore freezes the objects it built during the flush here)
135
+ */
136
+ constructor(beforeFlush) {
137
+ _ChangeBus_instances.add(this);
138
+ _ChangeBus_listeners.set(this, new Set());
139
+ _ChangeBus_beforeFlush.set(this, void 0);
140
+ _ChangeBus_transactionDepth.set(this, 0);
141
+ _ChangeBus_pendingChanges.set(this, {});
142
+ _ChangeBus_currentSource.set(this, 'local');
143
+ _ChangeBus_updateIndex.set(this, { layers: new Map(), groups: new Map() });
144
+ __classPrivateFieldSet(this, _ChangeBus_beforeFlush, beforeFlush, "f");
145
+ }
146
+ subscribe(listener) {
147
+ __classPrivateFieldGet(this, _ChangeBus_listeners, "f").add(listener);
148
+ return () => {
149
+ __classPrivateFieldGet(this, _ChangeBus_listeners, "f").delete(listener);
150
+ };
151
+ }
152
+ /**
153
+ * Runs fn inside a transaction. Nesting is supported, and pendingChanges is flushed to the
154
+ * listeners at the moment the outermost transact finishes.
155
+ *
156
+ * Not atomic: when fn throws, what it changed before the throw is flushed like any other
157
+ * change and the exception propagates.
158
+ */
159
+ transact(fn, source = 'local') {
160
+ var _a, _b;
161
+ const wasInTransaction = __classPrivateFieldGet(this, _ChangeBus_transactionDepth, "f") > 0;
162
+ __classPrivateFieldSet(this, _ChangeBus_transactionDepth, (_a = __classPrivateFieldGet(this, _ChangeBus_transactionDepth, "f"), _a++, _a), "f");
163
+ // Set source only for the outermost transaction
164
+ if (!wasInTransaction) {
165
+ __classPrivateFieldSet(this, _ChangeBus_currentSource, source, "f");
166
+ }
167
+ try {
168
+ return fn();
169
+ }
170
+ finally {
171
+ __classPrivateFieldSet(this, _ChangeBus_transactionDepth, (_b = __classPrivateFieldGet(this, _ChangeBus_transactionDepth, "f"), _b--, _b), "f");
172
+ if (__classPrivateFieldGet(this, _ChangeBus_transactionDepth, "f") === 0) {
173
+ __classPrivateFieldGet(this, _ChangeBus_instances, "m", _ChangeBus_flushChanges).call(this);
174
+ __classPrivateFieldSet(this, _ChangeBus_currentSource, 'local', "f");
175
+ }
176
+ }
177
+ }
178
+ /**
179
+ * Merges the changes into pendingChanges. Flushes immediately if outside a transaction.
180
+ */
181
+ merge(changes) {
182
+ appendChanges(__classPrivateFieldGet(this, _ChangeBus_pendingChanges, "f"), changes, __classPrivateFieldGet(this, _ChangeBus_updateIndex, "f"));
183
+ if (__classPrivateFieldGet(this, _ChangeBus_transactionDepth, "f") === 0) {
184
+ __classPrivateFieldGet(this, _ChangeBus_instances, "m", _ChangeBus_flushChanges).call(this);
185
+ }
186
+ }
187
+ /** Whether an update entry for this layer is already stacked within the same flush */
188
+ hasPendingLayerUpdate(id) {
189
+ return __classPrivateFieldGet(this, _ChangeBus_updateIndex, "f").layers.has(id);
190
+ }
191
+ /** Whether an update entry for this group is already stacked within the same flush */
192
+ hasPendingGroupUpdate(id) {
193
+ return __classPrivateFieldGet(this, _ChangeBus_updateIndex, "f").groups.has(id);
194
+ }
195
+ /**
196
+ * Stacks one layers.updated entry.
197
+ *
198
+ * Since folding leaves only the "first state" as previous, when hasPendingLayerUpdate is
199
+ * true the caller may pass undefined instead of building one (the existing entry's previous
200
+ * is used as is). When there is no entry, undefined means the state before and after the
201
+ * change is the same, so layer itself is used.
202
+ */
203
+ mergeLayerUpdate(layer, previous) {
204
+ this.merge({ layers: { updated: [{ id: layer.id, layer, previous: previous ?? layer }] } });
205
+ }
206
+ /** Stacks one groups.updated entry (previous is handled as in mergeLayerUpdate) */
207
+ mergeGroupUpdate(group, previous) {
208
+ this.merge({ groups: { updated: [{ id: group.id, group, previous: previous ?? group }] } });
209
+ }
210
+ }
211
+ _ChangeBus_listeners = new WeakMap(), _ChangeBus_beforeFlush = new WeakMap(), _ChangeBus_transactionDepth = new WeakMap(), _ChangeBus_pendingChanges = new WeakMap(), _ChangeBus_currentSource = new WeakMap(), _ChangeBus_updateIndex = new WeakMap(), _ChangeBus_instances = new WeakSet(), _ChangeBus_flushChanges = function _ChangeBus_flushChanges() {
212
+ __classPrivateFieldGet(this, _ChangeBus_beforeFlush, "f")?.call(this);
213
+ if (Object.keys(__classPrivateFieldGet(this, _ChangeBus_pendingChanges, "f")).length === 0)
214
+ return;
215
+ const changes = __classPrivateFieldGet(this, _ChangeBus_pendingChanges, "f");
216
+ changes.source = __classPrivateFieldGet(this, _ChangeBus_currentSource, "f");
217
+ // Swap in a new container for the next accumulation (the flushed object is retained by the
218
+ // listeners, so always recreate it so that appends do not pollute it).
219
+ __classPrivateFieldSet(this, _ChangeBus_pendingChanges, {}, "f");
220
+ __classPrivateFieldSet(this, _ChangeBus_updateIndex, { layers: new Map(), groups: new Map() }, "f");
221
+ // Every listener gets the notification: one that throws is reported and the others still
222
+ // run, so the Store and its subscribers (rendering, the mode manager, the spatial index, a
223
+ // history) never drift apart because of another subscriber's bug.
224
+ for (const listener of [...__classPrivateFieldGet(this, _ChangeBus_listeners, "f")]) {
225
+ try {
226
+ listener(changes);
227
+ }
228
+ catch (error) {
229
+ console.error('Error in a store listener:', error);
230
+ }
231
+ }
232
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * FileStore
3
+ *
4
+ * A Map wrapper for embedded files (FileData) such as images. It provides only CRUD,
5
+ * independently of Feature / Layer / Group. Change notification is unnecessary (because the
6
+ * rendering pipeline references the binary data directly).
7
+ */
8
+ import type { FileData } from '../types.js';
9
+ export declare class FileStore {
10
+ #private;
11
+ create(file: FileData): void;
12
+ get(id: string): FileData | undefined;
13
+ getAll(): FileData[];
14
+ delete(id: string): void;
15
+ }
@@ -0,0 +1,33 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
6
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
7
+ };
8
+ var _FileStore_files;
9
+ import { frozenCopy } from './frozen.js';
10
+ export class FileStore {
11
+ constructor() {
12
+ _FileStore_files.set(this, new Map());
13
+ }
14
+ create(file) {
15
+ if (__classPrivateFieldGet(this, _FileStore_files, "f").has(file.id)) {
16
+ throw new Error(`File with id "${file.id}" already exists`);
17
+ }
18
+ __classPrivateFieldGet(this, _FileStore_files, "f").set(file.id, frozenCopy({ ...file }));
19
+ }
20
+ get(id) {
21
+ return __classPrivateFieldGet(this, _FileStore_files, "f").get(id);
22
+ }
23
+ getAll() {
24
+ return Array.from(__classPrivateFieldGet(this, _FileStore_files, "f").values());
25
+ }
26
+ delete(id) {
27
+ if (!__classPrivateFieldGet(this, _FileStore_files, "f").has(id)) {
28
+ throw new Error(`File with id "${id}" not found`);
29
+ }
30
+ __classPrivateFieldGet(this, _FileStore_files, "f").delete(id);
31
+ }
32
+ }
33
+ _FileStore_files = new WeakMap();
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Frozen copies for the in-memory document
3
+ *
4
+ * MemoryStore keeps its own copy of what it is given and freezes it, so that a caller's
5
+ * array is never shared with the store and a write into a returned object throws instead of
6
+ * changing the store behind its notifications and its derived index.
7
+ */
8
+ import type { Feature } from '../types.js';
9
+ /**
10
+ * Returns a deeply frozen copy of a JSON-like value
11
+ *
12
+ * Arrays and plain objects are copied and frozen. A value that is already frozen is taken
13
+ * as it is (the store's own objects, passed back in an update). Other objects (a Date, a
14
+ * typed array, a class instance) are kept as they are.
15
+ */
16
+ export declare function frozenCopy<T>(value: T): T;
17
+ /**
18
+ * Returns a frozen feature built from a base and a set of changes, copying only the fields
19
+ * the changes carry (the base is already the store's frozen feature)
20
+ */
21
+ export declare function frozenFeature(base: Feature | undefined, changes: Partial<Feature>): Feature;
@@ -0,0 +1,51 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Returns a deeply frozen copy of a JSON-like value
5
+ *
6
+ * Arrays and plain objects are copied and frozen. A value that is already frozen is taken
7
+ * as it is (the store's own objects, passed back in an update). Other objects (a Date, a
8
+ * typed array, a class instance) are kept as they are.
9
+ */
10
+ export function frozenCopy(value) {
11
+ if (value === null || typeof value !== 'object' || Object.isFrozen(value))
12
+ return value;
13
+ if (Array.isArray(value)) {
14
+ const copy = new Array(value.length);
15
+ for (let i = 0; i < value.length; i++)
16
+ copy[i] = frozenCopy(value[i]);
17
+ return Object.freeze(copy);
18
+ }
19
+ const prototype = Object.getPrototypeOf(value);
20
+ if (prototype !== Object.prototype && prototype !== null)
21
+ return value;
22
+ const copy = prototype === null ? Object.create(null) : {};
23
+ for (const key of Object.keys(value)) {
24
+ const item = frozenCopy(value[key]);
25
+ if (key === '__proto__') {
26
+ // An own key named __proto__ stays an ordinary key (an assignment would replace the
27
+ // prototype of the copy)
28
+ Object.defineProperty(copy, key, {
29
+ value: item,
30
+ enumerable: true,
31
+ writable: true,
32
+ configurable: true,
33
+ });
34
+ }
35
+ else {
36
+ copy[key] = item;
37
+ }
38
+ }
39
+ return Object.freeze(copy);
40
+ }
41
+ /**
42
+ * Returns a frozen feature built from a base and a set of changes, copying only the fields
43
+ * the changes carry (the base is already the store's frozen feature)
44
+ */
45
+ export function frozenFeature(base, changes) {
46
+ const feature = { ...base };
47
+ for (const key of Object.keys(changes)) {
48
+ feature[key] = frozenCopy(changes[key]);
49
+ }
50
+ return Object.freeze(feature);
51
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * MemoryUiState
3
+ *
4
+ * The in-memory UiState core holds for every Store (selection / editing / tentative /
5
+ * boxSelection / dragState / vertexSelection / mode / read-only / interaction lock / local
6
+ * visibility). Each setter merges its change into the ChangeBus of the Store.
7
+ *
8
+ * - Selection / mode / features being edited / Tentative are included in data change
9
+ * notifications
10
+ * - BoxSelection / DragState / VertexSelection are UI-only state, so they only raise the
11
+ * uiStateChanged flag
12
+ */
13
+ import type { UiState } from '../store.js';
14
+ import type { BoxSelection, DragState, Mode, Selection, SelectionType, TentativeState, VertexSelection } from '../types.js';
15
+ import type { ChangeBus } from './change-bus.js';
16
+ export declare class MemoryUiState implements UiState {
17
+ #private;
18
+ constructor(bus: ChangeBus);
19
+ getSelection(): Selection;
20
+ setSelection(type: SelectionType | null, ids: string[]): void;
21
+ /**
22
+ * Removes a deleted feature, group or layer from the selection (internal use)
23
+ */
24
+ removeFromSelection(id: string): void;
25
+ getEditingIds(): readonly string[];
26
+ startEditing(ids: string[]): void;
27
+ endEditing(ids: string[]): void;
28
+ /** Removal from editing that accompanies a feature deletion (internal use) */
29
+ removeFromEditing(featureId: string): void;
30
+ getTentative(): TentativeState | null;
31
+ setTentative(state: TentativeState | null): void;
32
+ getBoxSelection(): BoxSelection | null;
33
+ setBoxSelection(box: BoxSelection | null): void;
34
+ getDragState(): DragState | null;
35
+ setDragState(state: DragState | null): void;
36
+ getSelectedVertices(): VertexSelection | null;
37
+ setSelectedVertices(selection: VertexSelection | null): void;
38
+ getFollowedVertices(): VertexSelection[] | null;
39
+ setFollowedVertices(selections: VertexSelection[] | null): void;
40
+ getMode(): Mode;
41
+ setMode(mode: Mode): void;
42
+ isReadOnly(): boolean;
43
+ setReadOnly(value: boolean): void;
44
+ isInteractionLocked(): boolean;
45
+ setInteractionLock(value: boolean): void;
46
+ isLocallyHidden(id: string): boolean;
47
+ getLocallyHidden(): ReadonlySet<string>;
48
+ setLocallyHidden(id: string, hidden: boolean): void;
49
+ /** Removes a deleted feature / group / layer from the hidden set (internal use). */
50
+ removeFromLocallyHidden(id: string): void;
51
+ }