@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,673 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { destinationPoint } from '../../geometry/index.js';
4
+ import { mercatorMidpoint } from '../../shared/math/globe-subdivision.js';
5
+ import { applyMarginToBoundingBox, clampLatitude } from '../../shared/math/index.js';
6
+ import { getCircleRadius, getRadiusHandleAngle } from '../../shared/utils/property.js';
7
+ import { hasVertexRef, isSameVertexRef } from '../../shared/utils/vertex-ref.js';
8
+ import { includeRequiredVertexRefs, resolveMidpointCoordinate, resolveVertexCoordinate, } from './handle-thinning.js';
9
+ // supportsVertexEditing is a predicate on the feature type, defined in shared/ (the handle
10
+ // thinning and the modes read it too); re-exported here for the existing imports
11
+ export { supportsVertexEditing } from '../../shared/utils/coordinates.js';
12
+ /**
13
+ * Computes the positions of the resize handles
14
+ * Specification: show resize handles only at the four corners of the bounding box
15
+ *
16
+ * @param bbox Bounding box
17
+ * @param additionalHandles Additional handles (edge-center handles and the like)
18
+ *
19
+ * @internal
20
+ */
21
+ export function computeResizeHandles(bbox, additionalHandles) {
22
+ const { topLeft, topRight, bottomRight, bottomLeft } = bbox;
23
+ const handles = [
24
+ { type: 'resize-nw', position: topLeft },
25
+ { type: 'resize-ne', position: topRight },
26
+ { type: 'resize-se', position: bottomRight },
27
+ { type: 'resize-sw', position: bottomLeft },
28
+ ];
29
+ // Append the additional handles if there are any
30
+ if (additionalHandles && additionalHandles.length > 0) {
31
+ handles.push(...additionalHandles);
32
+ }
33
+ return handles;
34
+ }
35
+ /**
36
+ * Computes the position of the rotate handle
37
+ *
38
+ * Supports an OBB (rotated bounding box).
39
+ * Offsets in the direction perpendicular to the top edge.
40
+ *
41
+ * @internal
42
+ */
43
+ export function computeRotateHandle(bbox, distancePixels, zoom) {
44
+ // Midpoint of the top edge, on the edge as drawn (a plain average on a parallel)
45
+ const topCenter = mercatorMidpoint(bbox.topLeft, bbox.topRight);
46
+ // Convert the pixel distance to degrees (approximation)
47
+ const pixelsPerDegree = (256 * 2 ** zoom) / 360;
48
+ const degreesOffset = distancePixels / pixelsPerDegree;
49
+ // Edge vector of the top edge (topLeft -> topRight)
50
+ const edgeDx = bbox.topRight[0] - bbox.topLeft[0];
51
+ const edgeDy = bbox.topRight[1] - bbox.topLeft[1];
52
+ // Latitude correction: in geographic coordinates longitude and latitude have different
53
+ // scales, so a latitude correction is required to compute the correct perpendicular vector
54
+ const latRad = (topCenter[1] * Math.PI) / 180;
55
+ const latCos = Math.cos(latRad);
56
+ // Edge vector in the normalized space (latCos applied along the longitude axis)
57
+ const normEdgeDx = edgeDx * latCos;
58
+ const normEdgeDy = edgeDy;
59
+ // Length of the edge in the normalized space
60
+ const normEdgeLength = Math.sqrt(normEdgeDx * normEdgeDx + normEdgeDy * normEdgeDy);
61
+ // When the edge is 0 (a single point and the like), default to the upward direction
62
+ if (normEdgeLength === 0) {
63
+ return {
64
+ type: 'rotate',
65
+ // Clamped because at low zoom levels the latitude can fall outside the valid range
66
+ position: [topCenter[0], clampLatitude(topCenter[1] + degreesOffset)],
67
+ };
68
+ }
69
+ // Unit edge vector in the normalized space
70
+ const normUnitDx = normEdgeDx / normEdgeLength;
71
+ const normUnitDy = normEdgeDy / normEdgeLength;
72
+ // Perpendicular vector in the normalized space (90 degrees counterclockwise = upward)
73
+ // In 2D the perpendicular of (dx, dy) is (-dy, dx)
74
+ const normPerpX = -normUnitDy;
75
+ const normPerpY = normUnitDx;
76
+ // Convert back to geographic coordinates (divide by latCos along the longitude axis)
77
+ const perpX = normPerpX / latCos;
78
+ const perpY = normPerpY;
79
+ return {
80
+ type: 'rotate',
81
+ // Clamped because at low zoom levels the latitude can fall outside the valid range
82
+ position: [
83
+ topCenter[0] + perpX * degreesOffset,
84
+ clampLatitude(topCenter[1] + perpY * degreesOffset),
85
+ ],
86
+ };
87
+ }
88
+ /**
89
+ * Collects the vertex handles of a line (a single coordinate sequence)
90
+ *
91
+ * Passing part includes the part number in the VertexRef (for the Multi types).
92
+ * For single geometries part is omitted and `{ ring, index }` is returned as before.
93
+ */
94
+ function collectLineVertexHandles(coords, handles, part) {
95
+ for (let i = 0; i < coords.length; i++) {
96
+ handles.push({
97
+ type: 'vertex',
98
+ position: coords[i],
99
+ vertexRef: part === undefined ? { ring: 0, index: i } : { part, ring: 0, index: i },
100
+ });
101
+ }
102
+ }
103
+ /**
104
+ * Collects the vertex handles of a polygon (an array of rings)
105
+ *
106
+ * The last entry of a closed ring is a duplicate of the first one (the closing point),
107
+ * so no handle is emitted for it.
108
+ */
109
+ function collectPolygonVertexHandles(rings, handles, part) {
110
+ for (let ringIndex = 0; ringIndex < rings.length; ringIndex++) {
111
+ const ring = rings[ringIndex];
112
+ if (ring.length === 0)
113
+ continue;
114
+ // The last point is the same as the first one, so it is excluded
115
+ const length = ring[0][0] === ring[ring.length - 1][0] && ring[0][1] === ring[ring.length - 1][1]
116
+ ? ring.length - 1
117
+ : ring.length;
118
+ for (let i = 0; i < length; i++) {
119
+ handles.push({
120
+ type: 'vertex',
121
+ position: ring[i],
122
+ vertexRef: part === undefined ? { ring: ringIndex, index: i } : { part, ring: ringIndex, index: i },
123
+ });
124
+ }
125
+ }
126
+ }
127
+ /**
128
+ * Builds handle information from the set of handles to display (vertex references)
129
+ *
130
+ * The path used while thinning. Because the positions are looked up again from a set that
131
+ * holds no coordinates, the same set can be reused even after the vertices move. References
132
+ * that cannot be resolved (the coordinate is gone and the like) are discarded.
133
+ */
134
+ function buildHandlesFromRefs(feature, refs, type, resolve) {
135
+ const handles = [];
136
+ for (const ref of refs) {
137
+ const position = resolve(feature, ref);
138
+ if (!position)
139
+ continue;
140
+ handles.push({ type, position, vertexRef: ref });
141
+ }
142
+ return handles;
143
+ }
144
+ /**
145
+ * Computes the positions of the vertex handles
146
+ *
147
+ * For a Polygon, not only the outer ring (ring 0) but also the vertices of the inner rings
148
+ * (holes) are covered.
149
+ *
150
+ * The Multi types (MultiPoint / MultiLineString / MultiPolygon) are scanned across all
151
+ * parts and returned with the part number included in the VertexRef. For a MultiPoint each
152
+ * coordinate is one part, so the vertex reference becomes `{ part: i, ring: 0, index: 0 }`.
153
+ *
154
+ * @param visibleSet The display set thinned by screen density. When passed, not all vertices
155
+ * are enumerated; only the vertices contained in the set are returned (when omitted, all
156
+ * vertices are returned as before)
157
+ *
158
+ * @internal
159
+ */
160
+ export function computeVertexHandles(feature, visibleSet) {
161
+ if (visibleSet) {
162
+ return buildHandlesFromRefs(feature, visibleSet.vertexRefs, 'vertex', resolveVertexCoordinate);
163
+ }
164
+ const handles = [];
165
+ if (feature.type === 'Point') {
166
+ // A Point is a single vertex
167
+ const coord = feature.coordinates;
168
+ handles.push({ type: 'vertex', position: coord, vertexRef: { ring: 0, index: 0 } });
169
+ }
170
+ else if (feature.type === 'LineString') {
171
+ collectLineVertexHandles(feature.coordinates, handles);
172
+ }
173
+ else if (feature.type === 'Polygon') {
174
+ collectPolygonVertexHandles(feature.coordinates, handles);
175
+ }
176
+ else if (feature.type === 'MultiPoint') {
177
+ // Each coordinate is one part. ring / index are always 0
178
+ const points = feature.coordinates;
179
+ for (let part = 0; part < points.length; part++) {
180
+ handles.push({
181
+ type: 'vertex',
182
+ position: points[part],
183
+ vertexRef: { part, ring: 0, index: 0 },
184
+ });
185
+ }
186
+ }
187
+ else if (feature.type === 'MultiLineString') {
188
+ const parts = feature.coordinates;
189
+ for (let part = 0; part < parts.length; part++) {
190
+ collectLineVertexHandles(parts[part], handles, part);
191
+ }
192
+ }
193
+ else if (feature.type === 'MultiPolygon') {
194
+ const parts = feature.coordinates;
195
+ for (let part = 0; part < parts.length; part++) {
196
+ collectPolygonVertexHandles(parts[part], handles, part);
197
+ }
198
+ }
199
+ return handles;
200
+ }
201
+ /**
202
+ * Computes the position of the radius handle for a Circle
203
+ *
204
+ * The handle is laid out with the same geodesic direct problem as the circle's outline, so it
205
+ * sits on the outline at any latitude and radius.
206
+ */
207
+ export function computeCircleRadiusHandle(feature) {
208
+ if (feature.type !== 'Circle') {
209
+ return null;
210
+ }
211
+ const center = feature.coordinates;
212
+ const radiusMeters = getCircleRadius(feature);
213
+ const radiusHandleAngle = getRadiusHandleAngle(feature);
214
+ if (!radiusMeters || radiusMeters <= 0) {
215
+ return null;
216
+ }
217
+ const handlePosition = destinationPoint(center, radiusMeters, radiusHandleAngle);
218
+ return {
219
+ type: 'radius',
220
+ position: handlePosition,
221
+ };
222
+ }
223
+ /**
224
+ * Computes the position of the center marker for a Circle
225
+ */
226
+ export function computeCircleCenterHandle(feature) {
227
+ if (feature.type !== 'Circle') {
228
+ return null;
229
+ }
230
+ const center = feature.coordinates;
231
+ return {
232
+ type: 'center',
233
+ position: center,
234
+ };
235
+ }
236
+ /**
237
+ * Collects the midpoint handles of a line (a single coordinate sequence)
238
+ */
239
+ function collectLineMidpointHandles(coords, handles, part) {
240
+ for (let i = 0; i < coords.length - 1; i++) {
241
+ const midpoint = mercatorMidpoint(coords[i], coords[i + 1]);
242
+ handles.push({
243
+ type: 'midpoint',
244
+ position: midpoint,
245
+ vertexRef: part === undefined ? { ring: 0, index: i } : { part, ring: 0, index: i },
246
+ });
247
+ }
248
+ }
249
+ /**
250
+ * Collects the midpoint handles of a polygon (an array of rings)
251
+ */
252
+ function collectPolygonMidpointHandles(rings, handles, part) {
253
+ for (let ringIndex = 0; ringIndex < rings.length; ringIndex++) {
254
+ const ring = rings[ringIndex];
255
+ for (let i = 0; i < ring.length - 1; i++) {
256
+ const midpoint = mercatorMidpoint(ring[i], ring[i + 1]);
257
+ handles.push({
258
+ type: 'midpoint',
259
+ position: midpoint,
260
+ vertexRef: part === undefined ? { ring: ringIndex, index: i } : { part, ring: ringIndex, index: i },
261
+ });
262
+ }
263
+ }
264
+ }
265
+ /**
266
+ * Computes the positions of the midpoint handles
267
+ *
268
+ * For a Polygon, not only the outer ring (ring 0) but also the edges of the inner rings
269
+ * (holes) are covered.
270
+ *
271
+ * The Multi types are scanned across all parts. A MultiPoint has no edges, so no midpoint
272
+ * handles are emitted for it (vertex handles only).
273
+ *
274
+ * @param visibleSet The display set thinned by screen density. When passed, not all edges
275
+ * are enumerated; only the edges contained in the set are returned (when omitted, all
276
+ * edges are returned as before)
277
+ *
278
+ * @internal
279
+ */
280
+ export function computeMidpointHandles(feature, visibleSet) {
281
+ if (visibleSet) {
282
+ return buildHandlesFromRefs(feature, visibleSet.midpointRefs, 'midpoint', resolveMidpointCoordinate);
283
+ }
284
+ const handles = [];
285
+ if (feature.type === 'LineString') {
286
+ collectLineMidpointHandles(feature.coordinates, handles);
287
+ }
288
+ else if (feature.type === 'Polygon') {
289
+ collectPolygonMidpointHandles(feature.coordinates, handles);
290
+ }
291
+ else if (feature.type === 'MultiLineString') {
292
+ const parts = feature.coordinates;
293
+ for (let part = 0; part < parts.length; part++) {
294
+ collectLineMidpointHandles(parts[part], handles, part);
295
+ }
296
+ }
297
+ else if (feature.type === 'MultiPolygon') {
298
+ const parts = feature.coordinates;
299
+ for (let part = 0; part < parts.length; part++) {
300
+ collectPolygonMidpointHandles(parts[part], handles, part);
301
+ }
302
+ }
303
+ return handles;
304
+ }
305
+ /**
306
+ * SelectionHandlesRenderer
307
+ *
308
+ * The renderer that draws the selection handles
309
+ *
310
+ * @internal
311
+ */
312
+ export class SelectionHandlesRenderer {
313
+ constructor(strokeRenderer, pointRenderer, config) {
314
+ Object.defineProperty(this, "strokeRenderer", {
315
+ enumerable: true,
316
+ configurable: true,
317
+ writable: true,
318
+ value: void 0
319
+ });
320
+ Object.defineProperty(this, "pointRenderer", {
321
+ enumerable: true,
322
+ configurable: true,
323
+ writable: true,
324
+ value: void 0
325
+ });
326
+ Object.defineProperty(this, "config", {
327
+ enumerable: true,
328
+ configurable: true,
329
+ writable: true,
330
+ value: void 0
331
+ });
332
+ Object.defineProperty(this, "transform", {
333
+ enumerable: true,
334
+ configurable: true,
335
+ writable: true,
336
+ value: null
337
+ });
338
+ Object.defineProperty(this, "projectionData", {
339
+ enumerable: true,
340
+ configurable: true,
341
+ writable: true,
342
+ value: null
343
+ });
344
+ Object.defineProperty(this, "pointInstanceRenderer", {
345
+ enumerable: true,
346
+ configurable: true,
347
+ writable: true,
348
+ value: null
349
+ });
350
+ this.strokeRenderer = strokeRenderer;
351
+ this.pointRenderer = pointRenderer;
352
+ this.config = config;
353
+ }
354
+ /**
355
+ * Sets the coordinate transform
356
+ */
357
+ setTransform(transform) {
358
+ this.transform = transform;
359
+ }
360
+ /**
361
+ * Sets the ProjectionData
362
+ */
363
+ setProjectionData(projectionData) {
364
+ this.projectionData = projectionData;
365
+ }
366
+ /**
367
+ * Sets the PointInstanceRenderer
368
+ */
369
+ setPointInstanceRenderer(renderer) {
370
+ this.pointInstanceRenderer = renderer;
371
+ }
372
+ /**
373
+ * Draws the resize handles
374
+ * Draws them at the four corners of the bbox after the margin is applied (additional
375
+ * handles can also be drawn)
376
+ *
377
+ * @param bbox Bounding box
378
+ * @param zoom Zoom level
379
+ * @param getAdditionalHandles Callback that computes the additional handles (it receives
380
+ * the bbox after the margin is applied)
381
+ */
382
+ drawResizeHandles(bbox, zoom, getAdditionalHandles) {
383
+ // Compute the bbox with the margin applied
384
+ let marginedBbox = bbox;
385
+ if (this.transform) {
386
+ const margin = this.config.boundingBox.margin;
387
+ marginedBbox = {
388
+ ...applyMarginToBoundingBox(bbox, margin, this.transform, zoom),
389
+ center: bbox.center,
390
+ };
391
+ }
392
+ // If a callback is given, call it with the bbox after the margin is applied
393
+ const additionalHandles = getAdditionalHandles?.(marginedBbox);
394
+ const handles = computeResizeHandles(marginedBbox, additionalHandles);
395
+ // Each handle sits on the ground elevation of its own point. Hit testing (anchor
396
+ // projection) uses the same elevation, so the drawn position and the grabbable position
397
+ // match structurally. Putting them all at a single height to match the selection box
398
+ // would shift only the rendering and make them ungrabbable
399
+ for (const handle of handles) {
400
+ this.pointRenderer.draw(handle.position, this.config.resizeHandle.point, zoom);
401
+ }
402
+ }
403
+ /**
404
+ * Draws the rotate handle
405
+ * Draws it at a position offset upward from the midpoint of the top edge of the bbox
406
+ * after the margin is applied
407
+ */
408
+ drawRotateHandle(bbox, zoom) {
409
+ // Compute the bbox with the margin applied
410
+ let marginedBbox = bbox;
411
+ if (this.transform) {
412
+ const margin = this.config.boundingBox.margin;
413
+ marginedBbox = {
414
+ ...applyMarginToBoundingBox(bbox, margin, this.transform, zoom),
415
+ center: bbox.center,
416
+ };
417
+ }
418
+ const handle = computeRotateHandle(marginedBbox, this.config.rotateHandle.distance, zoom);
419
+ // Draw the connector line (from the midpoint of the top edge after the margin is applied)
420
+ const topCenter = mercatorMidpoint(marginedBbox.topLeft, marginedBbox.topRight);
421
+ this.strokeRenderer.draw([topCenter, handle.position], this.config.rotateHandle.connector,
422
+ // The connector line follows the ground as well (same elevation source as the box
423
+ // and the handles)
424
+ { widthUnit: 'pixels', closed: false, followTerrain: true }, zoom, this.projectionData ?? undefined);
425
+ // Draw the handle (put on the ground elevation of each point so that it matches the
426
+ // grabbable position)
427
+ this.pointRenderer.draw(handle.position, this.config.rotateHandle.point, zoom);
428
+ }
429
+ /**
430
+ * Draws the vertex handles
431
+ * @param feature Target feature
432
+ * @param zoom Zoom level
433
+ * @param options Options
434
+ * - activeVertex: when specified, only that vertex and the selected vertices are drawn
435
+ * - selectedVertices: references of the selected vertices (for highlighting)
436
+ * - visibleSet: the display set thinned by screen density (when omitted, all vertices)
437
+ */
438
+ drawVertexHandles(feature, zoom, options) {
439
+ const activeVertex = options?.activeVertex;
440
+ const selectedVertices = options?.selectedVertices ?? [];
441
+ // Even while thinning, the selected and the in-operation vertices are always drawn
442
+ // (if a recomputation hid such a vertex it would look like "it disappeared even though
443
+ // I selected it")
444
+ const visibleSet = options?.visibleSet
445
+ ? includeRequiredVertexRefs(options.visibleSet, activeVertex ? [...selectedVertices, activeVertex] : selectedVertices)
446
+ : options?.visibleSet;
447
+ const handles = computeVertexHandles(feature, visibleSet);
448
+ // Draw individually when activeVertex is specified or when instancing is unavailable
449
+ if (activeVertex !== undefined || !this.pointInstanceRenderer || handles.length < 2) {
450
+ for (const handle of handles) {
451
+ const isSelected = hasVertexRef(selectedVertices, handle.vertexRef);
452
+ // When activeVertex is specified, draw only that vertex and the selected vertices
453
+ if (activeVertex !== undefined) {
454
+ const isActive = isSameVertexRef(handle.vertexRef, activeVertex);
455
+ if (!isActive && !isSelected) {
456
+ continue;
457
+ }
458
+ }
459
+ const style = isSelected
460
+ ? this.config.vertexHandle.selected
461
+ : this.config.vertexHandle.point;
462
+ this.pointRenderer.draw(handle.position, style, zoom);
463
+ }
464
+ return;
465
+ }
466
+ // Separate the unselected vertices from the selected ones
467
+ const normalHandles = handles.filter((h) => !hasVertexRef(selectedVertices, h.vertexRef));
468
+ const selectedHandles = handles.filter((h) => hasVertexRef(selectedVertices, h.vertexRef));
469
+ // Draw the normal vertices
470
+ if (normalHandles.length > 0) {
471
+ const style = this.config.vertexHandle.point;
472
+ const points = normalHandles.map((h) => ({
473
+ coord: h.position,
474
+ fillColor: [
475
+ style.fillColor[0],
476
+ style.fillColor[1],
477
+ style.fillColor[2],
478
+ style.fillColor[3] * style.fillOpacity,
479
+ ],
480
+ fillSize: style.size / 2, // diameter -> radius
481
+ strokeColor: [
482
+ style.strokeColor[0],
483
+ style.strokeColor[1],
484
+ style.strokeColor[2],
485
+ style.strokeColor[3] * style.strokeOpacity,
486
+ ],
487
+ strokeWidth: style.strokeWidth,
488
+ }));
489
+ this.pointInstanceRenderer.drawAll(points, 'circle', zoom);
490
+ }
491
+ // Draw the selected vertices (highlight style)
492
+ if (selectedHandles.length > 0) {
493
+ const style = this.config.vertexHandle.selected;
494
+ const points = selectedHandles.map((h) => ({
495
+ coord: h.position,
496
+ fillColor: [
497
+ style.fillColor[0],
498
+ style.fillColor[1],
499
+ style.fillColor[2],
500
+ style.fillColor[3] * style.fillOpacity,
501
+ ],
502
+ fillSize: style.size / 2, // diameter -> radius
503
+ strokeColor: [
504
+ style.strokeColor[0],
505
+ style.strokeColor[1],
506
+ style.strokeColor[2],
507
+ style.strokeColor[3] * style.strokeOpacity,
508
+ ],
509
+ strokeWidth: style.strokeWidth,
510
+ }));
511
+ this.pointInstanceRenderer.drawAll(points, 'circle', zoom);
512
+ }
513
+ }
514
+ /**
515
+ * Draws the vertices that follow along when shared vertices are moved together
516
+ *
517
+ * The target is another feature that is not necessarily selected, so this has an entry
518
+ * point independent of the selection UI (drawAllHandles). Only the passed vertex
519
+ * references are drawn in the following style; no other vertices are drawn.
520
+ *
521
+ * computeVertexHandles emits no handle for the closing point (the last entry) of a closed
522
+ * ring, so even when it is included in the references only one handle is drawn, as the
523
+ * first vertex.
524
+ */
525
+ drawFollowedVertexHandles(feature, followedVertices, zoom) {
526
+ if (followedVertices.length === 0)
527
+ return;
528
+ const handles = computeVertexHandles(feature).filter((h) => hasVertexRef(followedVertices, h.vertexRef));
529
+ this.drawHandlesWithStyle(handles, this.config.vertexHandle.followed, zoom);
530
+ }
531
+ /**
532
+ * Draws a group of handles with a single style
533
+ *
534
+ * When there are two or more of them and instancing is available, they are drawn together.
535
+ */
536
+ drawHandlesWithStyle(handles, style, zoom) {
537
+ if (handles.length === 0)
538
+ return;
539
+ if (!this.pointInstanceRenderer || handles.length < 2) {
540
+ for (const handle of handles) {
541
+ this.pointRenderer.draw(handle.position, style, zoom);
542
+ }
543
+ return;
544
+ }
545
+ const points = handles.map((h) => ({
546
+ coord: h.position,
547
+ fillColor: [
548
+ style.fillColor[0],
549
+ style.fillColor[1],
550
+ style.fillColor[2],
551
+ style.fillColor[3] * style.fillOpacity,
552
+ ],
553
+ fillSize: style.size / 2, // diameter -> radius
554
+ strokeColor: [
555
+ style.strokeColor[0],
556
+ style.strokeColor[1],
557
+ style.strokeColor[2],
558
+ style.strokeColor[3] * style.strokeOpacity,
559
+ ],
560
+ strokeWidth: style.strokeWidth,
561
+ }));
562
+ this.pointInstanceRenderer.drawAll(points, 'circle', zoom);
563
+ }
564
+ /**
565
+ * Draws the midpoint handles
566
+ *
567
+ * @param visibleSet The display set thinned by screen density (when omitted, all edges)
568
+ */
569
+ drawMidpointHandles(feature, zoom, visibleSet) {
570
+ const handles = computeMidpointHandles(feature, visibleSet);
571
+ // Draw individually when instancing is unavailable
572
+ if (!this.pointInstanceRenderer || handles.length < 2) {
573
+ for (const handle of handles) {
574
+ this.pointRenderer.draw(handle.position, this.config.midpointHandle.point, zoom);
575
+ }
576
+ return;
577
+ }
578
+ // Use instanced rendering
579
+ const style = this.config.midpointHandle.point;
580
+ const points = handles.map((h) => ({
581
+ coord: h.position,
582
+ fillColor: [
583
+ style.fillColor[0],
584
+ style.fillColor[1],
585
+ style.fillColor[2],
586
+ style.fillColor[3] * style.fillOpacity,
587
+ ],
588
+ fillSize: style.size / 2, // diameter -> radius
589
+ strokeColor: [
590
+ style.strokeColor[0],
591
+ style.strokeColor[1],
592
+ style.strokeColor[2],
593
+ style.strokeColor[3] * style.strokeOpacity,
594
+ ],
595
+ strokeWidth: style.strokeWidth,
596
+ }));
597
+ this.pointInstanceRenderer.drawAll(points, 'circle', zoom);
598
+ }
599
+ /**
600
+ * Draws all handles
601
+ */
602
+ drawAllHandles(feature, bbox, options, zoom) {
603
+ if (options.showResize) {
604
+ this.drawResizeHandles(bbox, zoom, options.getAdditionalResizeHandles);
605
+ }
606
+ if (options.showRotate) {
607
+ this.drawRotateHandle(bbox, zoom);
608
+ }
609
+ if (options.showVertex) {
610
+ this.drawVertexHandles(feature, zoom, {
611
+ activeVertex: options.activeVertex,
612
+ selectedVertices: options.selectedVertices,
613
+ visibleSet: options.visibleSet,
614
+ });
615
+ }
616
+ if (options.showMidpoint) {
617
+ this.drawMidpointHandles(feature, zoom, options.visibleSet);
618
+ }
619
+ }
620
+ /**
621
+ * Draws the radius handle for a Circle
622
+ */
623
+ drawCircleRadiusHandle(feature, zoom) {
624
+ const handle = computeCircleRadiusHandle(feature);
625
+ if (!handle)
626
+ return;
627
+ this.pointRenderer.draw(handle.position, this.config.radiusHandle.point, zoom);
628
+ }
629
+ /**
630
+ * Draws the center marker for a Circle
631
+ */
632
+ drawCircleCenterMarker(feature, zoom) {
633
+ const handle = computeCircleCenterHandle(feature);
634
+ if (!handle)
635
+ return;
636
+ this.pointRenderer.draw(handle.position, this.config.centerMarker.point, zoom);
637
+ }
638
+ /**
639
+ * Draws the radius line for a Circle (the dotted line from the center to the radius handle)
640
+ */
641
+ drawCircleRadiusLine(feature, zoom) {
642
+ const centerHandle = computeCircleCenterHandle(feature);
643
+ const radiusHandle = computeCircleRadiusHandle(feature);
644
+ if (!centerHandle || !radiusHandle)
645
+ return;
646
+ this.strokeRenderer.draw([centerHandle.position, radiusHandle.position], this.config.radiusLine.stroke, { widthUnit: 'pixels', closed: false }, zoom, this.projectionData ?? undefined);
647
+ }
648
+ /**
649
+ * Draws all selection handles for a Circle
650
+ * (the radius handle, the center marker and the radius line)
651
+ */
652
+ drawCircleHandles(feature, bbox, options, zoom) {
653
+ if (options.showResize) {
654
+ this.drawResizeHandles(bbox, zoom);
655
+ }
656
+ // Draw the radius line first (so that it goes under the handles)
657
+ if (options.showRadiusLine) {
658
+ this.drawCircleRadiusLine(feature, zoom);
659
+ }
660
+ if (options.showCenterMarker) {
661
+ this.drawCircleCenterMarker(feature, zoom);
662
+ }
663
+ if (options.showRadiusHandle) {
664
+ this.drawCircleRadiusHandle(feature, zoom);
665
+ }
666
+ }
667
+ /**
668
+ * Updates the configuration
669
+ */
670
+ updateConfig(config) {
671
+ this.config = config;
672
+ }
673
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * SelectionHelper
3
+ *
4
+ * Helper functions for obtaining the selected features and computing the bounding box.
5
+ */
6
+ import type { Store } from '../../store/store.js';
7
+ /**
8
+ * Returns the ids of the features the current selection covers, resolving a group or layer
9
+ * selection into its member features.
10
+ *
11
+ * The SSoT of the selection carries a kind (feature / group / layer). Selection display and
12
+ * manipulation on the map happen per feature, so a group / layer selection is resolved into
13
+ * the feature IDs of its members. This makes it "the SSoT holds a group/layer selection ->
14
+ * the map selects those members", so the display follows the SSoT (feature stays as is).
15
+ *
16
+ * @param store The Store to read the selection from
17
+ * @returns The feature ids. An empty array when nothing is selected
18
+ */
19
+ export declare function getSelectedFeatureIds(store: Store): string[];