@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,179 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * The edges of a feature
5
+ *
6
+ * Lists the edges (and the parts) of a feature with their vertex references. The snapping
7
+ * providers and the tracing graph (operations/trace-graph.ts) both enumerate edges this way,
8
+ * so the listing sits in shared/. It is pure: it reads only the coordinates of the feature.
9
+ */
10
+ import { getSegmentGrid, querySegmentIndicesInBBox, SEGMENT_INDEX_THRESHOLD, } from '../math/segment-grid.js';
11
+ /**
12
+ * Whether the feature type has edges (whether it is a target of edge snapping)
13
+ *
14
+ * It is aligned with the types that support vertex editing. Point has vertices only,
15
+ * and Circle / Image / Freehand are out of scope.
16
+ */
17
+ export function hasSnapEdges(type) {
18
+ return (type === 'LineString' ||
19
+ type === 'Polygon' ||
20
+ type === 'MultiLineString' ||
21
+ type === 'MultiPolygon');
22
+ }
23
+ /**
24
+ * Whether the segment overlaps the bbox (a cheap preliminary test)
25
+ *
26
+ * The real test against the tolerance is done by SnapService using the distance to
27
+ * the nearest point, so all this guarantees is that nothing is missed.
28
+ */
29
+ export function segmentIntersectsBBox(start, end, bbox) {
30
+ const minX = Math.min(start[0], end[0]);
31
+ const maxX = Math.max(start[0], end[0]);
32
+ const minY = Math.min(start[1], end[1]);
33
+ const maxY = Math.max(start[1], end[1]);
34
+ return minX <= bbox.maxX && maxX >= bbox.minX && minY <= bbox.maxY && maxY >= bbox.minY;
35
+ }
36
+ /**
37
+ * Whether the point is inside the bbox (the boundary included)
38
+ *
39
+ * @internal
40
+ */
41
+ export function isInBBox(position, bbox) {
42
+ return (position[0] >= bbox.minX &&
43
+ position[0] <= bbox.maxX &&
44
+ position[1] >= bbox.minY &&
45
+ position[1] <= bbox.maxY);
46
+ }
47
+ /**
48
+ * Lists the parts of a feature per type
49
+ *
50
+ * A helper that lets the listing of edges and the listing of vertices share the
51
+ * branching on type. Types without edges (Point / MultiPoint / custom types) call
52
+ * nothing.
53
+ *
54
+ * @internal
55
+ */
56
+ export function forEachPart(feature, visit) {
57
+ switch (feature.type) {
58
+ case 'LineString':
59
+ visit(feature.coordinates, 0, undefined, false);
60
+ break;
61
+ case 'Polygon': {
62
+ const rings = feature.coordinates;
63
+ for (let ring = 0; ring < rings.length; ring++) {
64
+ visit(rings[ring], ring, undefined, true);
65
+ }
66
+ break;
67
+ }
68
+ case 'MultiLineString': {
69
+ const parts = feature.coordinates;
70
+ for (let part = 0; part < parts.length; part++) {
71
+ visit(parts[part], 0, part, false);
72
+ }
73
+ break;
74
+ }
75
+ case 'MultiPolygon': {
76
+ const parts = feature.coordinates;
77
+ for (let part = 0; part < parts.length; part++) {
78
+ const rings = parts[part];
79
+ for (let ring = 0; ring < rings.length; ring++) {
80
+ visit(rings[ring], ring, part, true);
81
+ }
82
+ }
83
+ break;
84
+ }
85
+ }
86
+ }
87
+ /**
88
+ * Builds a function that builds vertex references
89
+ *
90
+ * @internal
91
+ */
92
+ export function makeRefFactory(ring, part) {
93
+ return (index) => part === undefined ? { ring, index } : { part, ring, index };
94
+ }
95
+ /**
96
+ * Whether the coordinate sequence is closed (whether the last item is a copy of the
97
+ * first one)
98
+ *
99
+ * @internal
100
+ */
101
+ export function isClosedCoords(coords) {
102
+ if (coords.length === 0)
103
+ return false;
104
+ const first = coords[0];
105
+ const last = coords[coords.length - 1];
106
+ return first[0] === last[0] && first[1] === last[1];
107
+ }
108
+ /**
109
+ * Gathers the edges of one coordinate sequence (a line / a ring)
110
+ *
111
+ * In a ring where closed is true, the last item is a copy of the first one, so the
112
+ * vertex reference of the last item is normalized to index 0 (to make the test for
113
+ * exclusion match the vertex handles).
114
+ */
115
+ function collectSegments(coords, ring, part, visit) {
116
+ if (coords.length < 2)
117
+ return;
118
+ const closed = isClosedCoords(coords);
119
+ const vertexCount = closed ? coords.length - 1 : coords.length;
120
+ const toRef = makeRefFactory(ring, part);
121
+ for (let i = 0; i < coords.length - 1; i++) {
122
+ const endIndex = closed && i + 1 === vertexCount ? 0 : i + 1;
123
+ visit(coords[i], coords[i + 1], toRef(i), toRef(endIndex));
124
+ }
125
+ }
126
+ /**
127
+ * Gathers only the edges of one coordinate sequence (a line / a ring) that fall
128
+ * within the bbox
129
+ *
130
+ * For a part whose vertex count is at or above the threshold, the candidates are
131
+ * narrowed down with a segment grid index. The values passed to visit are exactly the
132
+ * same as in collectSegments (the last item of a closed ring is normalized to index
133
+ * 0).
134
+ */
135
+ function collectSegmentsInBBox(coords, ring, part, bbox, visit) {
136
+ if (coords.length < 2)
137
+ return;
138
+ const closed = isClosedCoords(coords);
139
+ const vertexCount = closed ? coords.length - 1 : coords.length;
140
+ const toRef = makeRefFactory(ring, part);
141
+ const visitSegment = (i) => {
142
+ if (!segmentIntersectsBBox(coords[i], coords[i + 1], bbox))
143
+ return;
144
+ const endIndex = closed && i + 1 === vertexCount ? 0 : i + 1;
145
+ visit(coords[i], coords[i + 1], toRef(i), toRef(endIndex));
146
+ };
147
+ // For a small part, building an index costs more, so it is scanned as it is
148
+ if (coords.length < SEGMENT_INDEX_THRESHOLD) {
149
+ for (let i = 0; i < coords.length - 1; i++) {
150
+ visitSegment(i);
151
+ }
152
+ return;
153
+ }
154
+ for (const i of querySegmentIndicesInBBox(getSegmentGrid(coords), bbox)) {
155
+ visitSegment(i);
156
+ }
157
+ }
158
+ /**
159
+ * Gathers the edges of a feature
160
+ *
161
+ * @internal
162
+ */
163
+ export function collectFeatureSegments(feature, visit) {
164
+ forEachPart(feature, (coords, ring, part) => {
165
+ collectSegments(coords, ring, part, visit);
166
+ });
167
+ }
168
+ /**
169
+ * Gathers only the edges of a feature that fall within the bbox
170
+ *
171
+ * The result is the same as applying a preliminary bbox filter to
172
+ * collectFeatureSegments; only for a huge part is the listing narrowed down with a
173
+ * segment grid index.
174
+ */
175
+ export function collectFeatureSegmentsInBBox(feature, bbox, visit) {
176
+ forEachPart(feature, (coords, ring, part) => {
177
+ collectSegmentsInBBox(coords, ring, part, bbox, visit);
178
+ });
179
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * The generation of the ids of features, groups, layers and files
5
+ *
6
+ * An id is a ULID (the time in milliseconds followed by 80 random bits, in Crockford's Base32), so
7
+ * ids of later milliseconds sort after earlier ones. The `ulid` package encodes it; the random
8
+ * bytes are taken from `crypto.getRandomValues` in batches and handed out one by one, where the
9
+ * package alone asks the crypto source once per character (16 calls per id, the larger part of
10
+ * the time of a large import).
11
+ */
12
+ import { ulid } from 'ulid';
13
+ /** The number of random bytes taken at once (256 ids) */
14
+ const POOL_SIZE = 4096;
15
+ let pool = new Uint8Array(POOL_SIZE);
16
+ let cursor = POOL_SIZE;
17
+ /**
18
+ * A random fraction in [0, 1) from the pool, of the same distribution as the source of the
19
+ * package (one byte divided by 256)
20
+ */
21
+ function pooledRandom() {
22
+ if (cursor >= POOL_SIZE) {
23
+ pool = globalThis.crypto.getRandomValues(new Uint8Array(POOL_SIZE));
24
+ cursor = 0;
25
+ }
26
+ return pool[cursor++] / 256;
27
+ }
28
+ /**
29
+ * Creates a new ULID
30
+ *
31
+ * @internal
32
+ */
33
+ export function createId() {
34
+ return ulid(undefined, pooledRandom);
35
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Image processing utilities
3
+ *
4
+ * Converts an image file into the WebP format, resizing it when necessary.
5
+ */
6
+ export interface ProcessedImage {
7
+ dataUrl: string;
8
+ width: number;
9
+ height: number;
10
+ mimeType: string;
11
+ }
12
+ /**
13
+ * Maximum size of an image
14
+ * A value that accounts for the WebGL texture limit (modern GPUs support 4096 or more)
15
+ */
16
+ export declare const MAX_IMAGE_SIZE = 4096;
17
+ /**
18
+ * Converts a file into a DataURL in the WebP format
19
+ * A large image is resized automatically
20
+ */
21
+ export declare function processImageFile(file: File): Promise<ProcessedImage>;
22
+ /**
23
+ * Whether an image of this size has to be scaled down before it is used as a texture
24
+ */
25
+ export declare function exceedsMaxImageSize(width: number, height: number): boolean;
26
+ /**
27
+ * Converts an image DataURL into a DataURL in the WebP format
28
+ * A large image is resized automatically
29
+ */
30
+ export declare function processImageDataUrl(originalDataUrl: string): Promise<ProcessedImage>;
31
+ /**
32
+ * Tests whether it is an image file
33
+ */
34
+ export declare function isImageFile(file: File): boolean;
@@ -0,0 +1,106 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ const WEBP_QUALITY = 0.95;
4
+ /**
5
+ * Maximum size of an image
6
+ * A value that accounts for the WebGL texture limit (modern GPUs support 4096 or more)
7
+ */
8
+ export const MAX_IMAGE_SIZE = 4096;
9
+ /**
10
+ * Tests whether the image needs to be resized and, when it does, computes the new size
11
+ */
12
+ function calculateResizedDimensions(width, height, maxSize) {
13
+ if (width <= maxSize && height <= maxSize) {
14
+ return { width, height, needsResize: false };
15
+ }
16
+ const aspectRatio = width / height;
17
+ let newWidth;
18
+ let newHeight;
19
+ if (width > height) {
20
+ newWidth = maxSize;
21
+ newHeight = Math.round(maxSize / aspectRatio);
22
+ }
23
+ else {
24
+ newHeight = maxSize;
25
+ newWidth = Math.round(maxSize * aspectRatio);
26
+ }
27
+ return { width: newWidth, height: newHeight, needsResize: true };
28
+ }
29
+ /**
30
+ * Converts a file into a DataURL in the WebP format
31
+ * A large image is resized automatically
32
+ */
33
+ export async function processImageFile(file) {
34
+ return processImageDataUrl(await fileToDataUrl(file));
35
+ }
36
+ /**
37
+ * Whether an image of this size has to be scaled down before it is used as a texture
38
+ */
39
+ export function exceedsMaxImageSize(width, height) {
40
+ return width > MAX_IMAGE_SIZE || height > MAX_IMAGE_SIZE;
41
+ }
42
+ /**
43
+ * Converts an image DataURL into a DataURL in the WebP format
44
+ * A large image is resized automatically
45
+ */
46
+ export async function processImageDataUrl(originalDataUrl) {
47
+ // 1. Load it as an Image (to get the dimensions)
48
+ const img = await loadImage(originalDataUrl);
49
+ // 2. Decide whether it needs to be resized
50
+ const { width, height } = calculateResizedDimensions(img.naturalWidth, img.naturalHeight, MAX_IMAGE_SIZE);
51
+ // 3. Draw it onto a Canvas and convert it into WebP
52
+ const canvas = document.createElement('canvas');
53
+ canvas.width = width;
54
+ canvas.height = height;
55
+ const ctx = canvas.getContext('2d');
56
+ if (!ctx) {
57
+ throw new Error('Failed to get canvas 2d context');
58
+ }
59
+ // Settings for a high-quality resize
60
+ ctx.imageSmoothingEnabled = true;
61
+ ctx.imageSmoothingQuality = 'high';
62
+ ctx.drawImage(img, 0, 0, width, height);
63
+ // 4. Convert into WebP
64
+ const webpDataUrl = canvas.toDataURL('image/webp', WEBP_QUALITY);
65
+ return {
66
+ dataUrl: webpDataUrl,
67
+ width,
68
+ height,
69
+ mimeType: 'image/webp',
70
+ };
71
+ }
72
+ /**
73
+ * Converts a File into a DataURL
74
+ */
75
+ function fileToDataUrl(file) {
76
+ return new Promise((resolve, reject) => {
77
+ const reader = new FileReader();
78
+ reader.onload = () => {
79
+ if (typeof reader.result === 'string') {
80
+ resolve(reader.result);
81
+ }
82
+ else {
83
+ reject(new Error('Failed to read file as data URL'));
84
+ }
85
+ };
86
+ reader.onerror = () => reject(reader.error);
87
+ reader.readAsDataURL(file);
88
+ });
89
+ }
90
+ /**
91
+ * Loads an image from a DataURL
92
+ */
93
+ function loadImage(dataUrl) {
94
+ return new Promise((resolve, reject) => {
95
+ const img = new Image();
96
+ img.onload = () => resolve(img);
97
+ img.onerror = () => reject(new Error('Failed to load image'));
98
+ img.src = dataUrl;
99
+ });
100
+ }
101
+ /**
102
+ * Tests whether it is an image file
103
+ */
104
+ export function isImageFile(file) {
105
+ return file.type.startsWith('image/');
106
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Utilities module
3
+ *
4
+ * Shared utility functions and helpers.
5
+ */
6
+ export { getContrastColor, hexToColor, interpolateHexColor } from './color.js';
7
+ export { flattenCoordinatesDeep, forEachCoordinateDeep, isCoordinate, isMultiFeatureType, MULTI_FEATURE_TYPES, mapCoordinatesDeep, } from './coordinates.js';
8
+ export type { EventEmitter, EventListener, EventMap, FeaturesChangePayload, GeometryAppliedPayload, GeometryOperationName, LoadErrorPayload, } from './event-emitter.js';
9
+ export { EventEmitterImpl } from './event-emitter.js';
10
+ export { isImageFile, type ProcessedImage, processImageFile } from './image.js';
11
+ export { getTileSize } from './map.js';
12
+ export { type AutoNameConfig, AutoNameGenerator, type AutoNameType, normalizeAutoNameConfig, } from './name-generator.js';
13
+ export { createPixelRatioSource, type PixelRatioInput, type PixelRatioProvider, type PixelRatioSource, resolveContentPixelRatio, resolvePixelRatio, } from './pixel-ratio.js';
14
+ export { getCircleRadius, getCreatedZoom, getFeatureDescription, getFeatureName, getImageProperties, getRadiusHandleAngle, getRotation, getScale, setCreatedZoom, setFeatureDescription, setFeatureName, setRotation, setScale, } from './property.js';
15
+ export { getVertexPart, hasVertexRef, isSameVertexRef } from './vertex-ref.js';
@@ -0,0 +1,24 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Utilities module
5
+ *
6
+ * Shared utility functions and helpers.
7
+ */
8
+ // Color conversion
9
+ export { getContrastColor, hexToColor, interpolateHexColor } from './color.js';
10
+ // Coordinate traversal
11
+ export { flattenCoordinatesDeep, forEachCoordinateDeep, isCoordinate, isMultiFeatureType, MULTI_FEATURE_TYPES, mapCoordinatesDeep, } from './coordinates.js';
12
+ export { EventEmitterImpl } from './event-emitter.js';
13
+ // Image processing
14
+ export { isImageFile, processImageFile } from './image.js';
15
+ // Map utilities
16
+ export { getTileSize } from './map.js';
17
+ // Automatic name generation
18
+ export { AutoNameGenerator, normalizeAutoNameConfig, } from './name-generator.js';
19
+ // Resolution of the rendering pixel ratio
20
+ export { createPixelRatioSource, resolveContentPixelRatio, resolvePixelRatio, } from './pixel-ratio.js';
21
+ // Property manipulation
22
+ export { getCircleRadius, getCreatedZoom, getFeatureDescription, getFeatureName, getImageProperties, getRadiusHandleAngle, getRotation, getScale, setCreatedZoom, setFeatureDescription, setFeatureName, setRotation, setScale, } from './property.js';
23
+ // Comparison of vertex references
24
+ export { getVertexPart, hasVertexRef, isSameVertexRef } from './vertex-ref.js';
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Map utilities
3
+ *
4
+ * Utility functions related to the MapLibre GL JS map instance.
5
+ */
6
+ import type { Map as MapLibreMap } from 'maplibre-gl';
7
+ /**
8
+ * Gets the tile size of the map
9
+ *
10
+ * Accesses an internal property of MapLibre GL JS to get the tile size.
11
+ * Returns the default value (512) when it cannot be obtained.
12
+ *
13
+ * @param map MapLibre map instance
14
+ * @returns Tile size (pixels)
15
+ */
16
+ export declare function getTileSize(map: MapLibreMap): number;
17
+ /**
18
+ * Whether the map is set to a projection other than Web Mercator (the globe)
19
+ *
20
+ * The globe projection switches to Mercator as the map zooms in, but the setting stays, so
21
+ * this is true at every zoom of a globe map. A map whose style is not loaded yet counts as
22
+ * Mercator.
23
+ *
24
+ * @param map MapLibre map instance
25
+ */
26
+ export declare function isGlobeProjection(map: MapLibreMap): boolean;
@@ -0,0 +1,35 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { DEFAULT_TILE_SIZE } from '../math/index.js';
4
+ /**
5
+ * Gets the tile size of the map
6
+ *
7
+ * Accesses an internal property of MapLibre GL JS to get the tile size.
8
+ * Returns the default value (512) when it cannot be obtained.
9
+ *
10
+ * @param map MapLibre map instance
11
+ * @returns Tile size (pixels)
12
+ */
13
+ export function getTileSize(map) {
14
+ return (map.transform?.tileSize ??
15
+ DEFAULT_TILE_SIZE);
16
+ }
17
+ /**
18
+ * Whether the map is set to a projection other than Web Mercator (the globe)
19
+ *
20
+ * The globe projection switches to Mercator as the map zooms in, but the setting stays, so
21
+ * this is true at every zoom of a globe map. A map whose style is not loaded yet counts as
22
+ * Mercator.
23
+ *
24
+ * @param map MapLibre map instance
25
+ */
26
+ export function isGlobeProjection(map) {
27
+ let type;
28
+ try {
29
+ type = map.getProjection?.()?.type;
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ return type !== undefined && type !== 'mercator';
35
+ }
@@ -0,0 +1,197 @@
1
+ /**
2
+ * AutoNameGenerator
3
+ *
4
+ * A utility that automatically generates a name with a sequential number when a Feature is
5
+ * newly created.
6
+ *
7
+ * Every word of a name the library gives a feature, a layer or a group comes from here: from
8
+ * the host's `typeNames`, or from the English defaults below. Nothing else in the library
9
+ * writes such a word inline.
10
+ */
11
+ import type { Feature, FeatureType, Group, Layer, StateChanges } from '../types/model.js';
12
+ /**
13
+ * What automatic naming names: a feature type, a layer or a group
14
+ */
15
+ export type AutoNameType = FeatureType | 'Layer' | 'Group';
16
+ /**
17
+ * How new features, layers and groups are named automatically ("Point 1", "Layer 2")
18
+ *
19
+ * Give it through the `autoName` option of `createMapLibreGLDraw` (`true`, the default, turns
20
+ * it on with these defaults, and `false` turns it off). Each type counts on its own, and a
21
+ * number is never reused: after "Point 1" and "Point 2" are created and "Point 2" is deleted,
22
+ * the next point is "Point 3". Existing names of the form "<word> <number>" move the count on
23
+ * as well, however they arrived (a load, an import).
24
+ *
25
+ * This is the one place the words of generated names come from, and the words are the host's
26
+ * to translate: the defaults are English, so a host that shows another language passes a
27
+ * word for each type it uses in `typeNames`. The keys are the type ids: the built-in feature
28
+ * types (`Point`, `LineString`, `Polygon`, `Circle`, `Freehand`, `Image`), `Layer`, `Group`,
29
+ * and the type id of every custom feature type an extension draws (a type without a word is
30
+ * named with its id).
31
+ *
32
+ * A layer or a group always has a name. When one is created without a name while `enabled`
33
+ * is false, it gets the word of its type alone, without a number ("Layer", or the
34
+ * `typeNames.Layer` of the host); features get no name then.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const draw = createMapLibreGLDraw(map, {
39
+ * autoName: {
40
+ * enabled: true,
41
+ * typeNames: { Point: 'Pin', Layer: 'Sheet' },
42
+ * formatter: (typeName, n) => `${typeName} #${n}`,
43
+ * },
44
+ * });
45
+ * // The first point is named "Pin #1"
46
+ * ```
47
+ */
48
+ export interface AutoNameConfig {
49
+ /**
50
+ * Whether names are generated. When false, features get no name, and a layer or a group
51
+ * created without a name gets the word of its type alone
52
+ *
53
+ * @defaultValue `true`
54
+ */
55
+ enabled: boolean;
56
+ /**
57
+ * The word used for each type in the name, keyed by the type id (a built-in feature type,
58
+ * `Layer`, `Group`, or a custom feature type)
59
+ *
60
+ * @defaultValue English: `'Point'`, `'LineString'`, `'Polygon'`, `'Circle'`, `'Freehand'`,
61
+ * `'Image'`, `'Layer'`, `'Group'`, and the id itself for any other type
62
+ */
63
+ typeNames?: Partial<Record<AutoNameType, string>>;
64
+ /**
65
+ * Builds the name from the word of the type and the number
66
+ *
67
+ * @defaultValue `` (typeName, number) => `${typeName} ${number}` ``
68
+ */
69
+ formatter?: (typeName: string, number: number) => string;
70
+ }
71
+ /**
72
+ * Normalizes an AutoNameConfig
73
+ */
74
+ export declare function normalizeAutoNameConfig(config: AutoNameConfig | boolean | undefined): AutoNameConfig;
75
+ /**
76
+ * AutoNameGenerator
77
+ *
78
+ * A class that generates sequential numbers per Feature type.
79
+ * It accounts for the numbers of existing Features and starts from the next number.
80
+ * A number that has been used once is not reused even after deletion (it leaves gaps).
81
+ *
82
+ * The existing numbers are taken in with a single full scan per type, and after that only the
83
+ * increments are taken in by subscribing to the Store. Scanning everything on every call would
84
+ * make the case of generating one at a time, as in a bulk import, O(n^2).
85
+ *
86
+ * With this incremental approach, the number of a name that was added and then deleted before
87
+ * any generation happened is also recorded (with the old approach it could be reused after the
88
+ * deletion). This is an extension of the "a number used once is not reused" policy, and it can
89
+ * only work in the direction of increasing the gaps.
90
+ */
91
+ export declare class AutoNameGenerator {
92
+ private readonly store;
93
+ private readonly config;
94
+ /** Counter that remembers the largest number already generated per type */
95
+ private readonly counters;
96
+ /** Counter keys whose full scan is done (Layer/Group go into the same Set) */
97
+ private readonly scannedTypes;
98
+ /** Unsubscribe function of the Store subscription (null when not subscribed) */
99
+ private unsubscribe;
100
+ constructor(store: {
101
+ getAllFeatures(): Feature[];
102
+ getAllLayers(): Layer[];
103
+ getAllGroups(): Group[];
104
+ subscribe(listener: (changes: StateChanges) => void): () => void;
105
+ }, config?: AutoNameConfig | boolean);
106
+ /**
107
+ * Returns whether it is enabled
108
+ */
109
+ isEnabled(): boolean;
110
+ /**
111
+ * Unsubscribes from the Store
112
+ */
113
+ dispose(): void;
114
+ /**
115
+ * Generates an automatic name for the given type
116
+ *
117
+ * @returns The generated name, or undefined when it is disabled
118
+ */
119
+ generateName(featureType: FeatureType): string | undefined;
120
+ /**
121
+ * Gets the type name
122
+ */
123
+ private getTypeName;
124
+ /**
125
+ * Gets the next number
126
+ *
127
+ * Increments the counter by 1 and returns it. The counter holds the largest existing number
128
+ * (the first full scan plus the increments after it), so the number of a deleted Feature is
129
+ * not reused and a gap appears.
130
+ */
131
+ private findNextNumber;
132
+ /**
133
+ * Takes in the largest existing number only the first time a generation happens for that
134
+ * counter key
135
+ *
136
+ * From the second time onward the counter is maintained incrementally, so it does not scan.
137
+ */
138
+ private scanOnce;
139
+ /**
140
+ * Raises the counter up to number (a smaller value does not lower it)
141
+ */
142
+ private recordNumber;
143
+ /**
144
+ * Takes in the numbers of names from the changes of the Store
145
+ *
146
+ * The path that keeps the cost proportional to the number of changes and avoids scanning
147
+ * everything on every generation.
148
+ * Deletions are ignored (because a number used once is not reused).
149
+ */
150
+ private observeChanges;
151
+ /**
152
+ * Takes in the number from the name of a Feature
153
+ */
154
+ private observeFeatureName;
155
+ /**
156
+ * Extracts the number from a name and takes it into the counter
157
+ */
158
+ private observeName;
159
+ /**
160
+ * Gets the type name of Layer
161
+ */
162
+ private getLayerTypeName;
163
+ /**
164
+ * Gets the type name of Group
165
+ */
166
+ private getGroupTypeName;
167
+ /**
168
+ * Gets the largest number from the existing Features
169
+ */
170
+ private getMaxNumberFromFeatures;
171
+ /**
172
+ * Generates the name of a new Layer
173
+ *
174
+ * A layer always has a name, so this never gives up: when naming is disabled it returns the
175
+ * word of Layer alone, without a number.
176
+ *
177
+ * @returns The generated name ("Layer 2"), or the word of Layer when it is disabled
178
+ */
179
+ generateLayerName(): string;
180
+ /**
181
+ * Gets the next Layer number
182
+ */
183
+ private findNextLayerNumber;
184
+ /**
185
+ * Generates the name of a new Group
186
+ *
187
+ * A group always has a name, so this never gives up: when naming is disabled it returns the
188
+ * word of Group alone, without a number.
189
+ *
190
+ * @returns The generated name ("Group 2"), or the word of Group when it is disabled
191
+ */
192
+ generateGroupName(): string;
193
+ /**
194
+ * Gets the next Group number
195
+ */
196
+ private findNextGroupNumber;
197
+ }