@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,227 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
4
+ if (kind === "m") throw new TypeError("Private method is not writable");
5
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
6
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
7
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
8
+ };
9
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
10
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
11
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
12
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
13
+ };
14
+ var _SelectionUIRenderer_instances, _SelectionUIRenderer_strokeRenderer, _SelectionUIRenderer_extensions, _SelectionUIRenderer_config, _SelectionUIRenderer_transform, _SelectionUIRenderer_projectionData, _SelectionUIRenderer_drawRotatingBoundingBox, _SelectionUIRenderer_drawIndividualBoundingBox, _SelectionUIRenderer_drawCombinedBoundingBox, _SelectionUIRenderer_drawBoundingBoxWithMargin, _SelectionUIRenderer_drawPointBoundingBox, _SelectionUIRenderer_applyMargin, _SelectionUIRenderer_strokeBoundingBox, _SelectionUIRenderer_strokePath;
15
+ import { applyMarginToBoundingBox } from '../../../shared/math/index.js';
16
+ import { computeBoundingBox, computeCombinedBoundingBox, hasZeroArea, rotateBoundingBox, } from './bounding-box.js';
17
+ export class SelectionUIRenderer {
18
+ constructor(strokeRenderer, config, extensions) {
19
+ _SelectionUIRenderer_instances.add(this);
20
+ _SelectionUIRenderer_strokeRenderer.set(this, void 0);
21
+ /** The Selection UI extension points of the draw instance this renderer belongs to */
22
+ _SelectionUIRenderer_extensions.set(this, void 0);
23
+ _SelectionUIRenderer_config.set(this, void 0);
24
+ _SelectionUIRenderer_transform.set(this, null);
25
+ _SelectionUIRenderer_projectionData.set(this, null);
26
+ __classPrivateFieldSet(this, _SelectionUIRenderer_strokeRenderer, strokeRenderer, "f");
27
+ __classPrivateFieldSet(this, _SelectionUIRenderer_config, config, "f");
28
+ __classPrivateFieldSet(this, _SelectionUIRenderer_extensions, extensions, "f");
29
+ }
30
+ /** Compute the BoundingBox of a feature (also usable from outside) */
31
+ computeFeatureBoundingBox(feature) {
32
+ return computeBoundingBox(feature, __classPrivateFieldGet(this, _SelectionUIRenderer_extensions, "f"));
33
+ }
34
+ /** Compute the combined BoundingBox of several features (also usable from outside) */
35
+ computeCombinedFeatureBoundingBox(features) {
36
+ return computeCombinedBoundingBox(features, __classPrivateFieldGet(this, _SelectionUIRenderer_extensions, "f"));
37
+ }
38
+ setTransform(transform) {
39
+ __classPrivateFieldSet(this, _SelectionUIRenderer_transform, transform, "f");
40
+ }
41
+ setProjectionData(projectionData) {
42
+ __classPrivateFieldSet(this, _SelectionUIRenderer_projectionData, projectionData, "f");
43
+ }
44
+ updateConfig(config) {
45
+ __classPrivateFieldSet(this, _SelectionUIRenderer_config, config, "f");
46
+ }
47
+ /**
48
+ * Draw the UI of the selected features
49
+ */
50
+ draw(features, zoom, dragState) {
51
+ if (features.length === 0)
52
+ return;
53
+ // While rotating, the rotated BoundingBox is drawn
54
+ if (dragState?.operation === 'rotate' && dragState.rotateInfo) {
55
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_drawRotatingBoundingBox).call(this, features, zoom, dragState);
56
+ return;
57
+ }
58
+ // A single selection
59
+ if (features.length === 1) {
60
+ const feature = features[0];
61
+ const bbox = computeBoundingBox(feature, __classPrivateFieldGet(this, _SelectionUIRenderer_extensions, "f"));
62
+ if (bbox && hasZeroArea(bbox)) {
63
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_drawPointBoundingBox).call(this, feature, bbox.center, zoom);
64
+ }
65
+ else {
66
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_drawBoundingBoxWithMargin).call(this, [feature], zoom);
67
+ }
68
+ return;
69
+ }
70
+ // A multi-selection: the individual bboxes + the combined bbox
71
+ for (const feature of features) {
72
+ const bbox = computeBoundingBox(feature, __classPrivateFieldGet(this, _SelectionUIRenderer_extensions, "f"));
73
+ if (bbox && hasZeroArea(bbox)) {
74
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_drawPointBoundingBox).call(this, feature, bbox.center, zoom);
75
+ }
76
+ else {
77
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_drawIndividualBoundingBox).call(this, feature, zoom);
78
+ }
79
+ }
80
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_drawCombinedBoundingBox).call(this, features, zoom);
81
+ }
82
+ }
83
+ _SelectionUIRenderer_strokeRenderer = new WeakMap(), _SelectionUIRenderer_extensions = new WeakMap(), _SelectionUIRenderer_config = new WeakMap(), _SelectionUIRenderer_transform = new WeakMap(), _SelectionUIRenderer_projectionData = new WeakMap(), _SelectionUIRenderer_instances = new WeakSet(), _SelectionUIRenderer_drawRotatingBoundingBox = function _SelectionUIRenderer_drawRotatingBoundingBox(features, zoom, dragState) {
84
+ // When dragState.operation === 'rotate', rotateInfo always exists
85
+ const rotateInfo = dragState.rotateInfo;
86
+ if (!rotateInfo)
87
+ return;
88
+ const { initialBbox, initialFeatureBboxes, currentAngle } = rotateInfo;
89
+ const rotationCenter = initialBbox.center;
90
+ if (features.length > 1 && initialFeatureBboxes) {
91
+ for (const feature of features) {
92
+ const featureInitialBbox = initialFeatureBboxes.get(feature.id);
93
+ if (!featureInitialBbox)
94
+ continue;
95
+ const rotatedFeatureBbox = rotateBoundingBox(featureInitialBbox, currentAngle, rotationCenter);
96
+ const marginedBbox = __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_applyMargin).call(this, rotatedFeatureBbox, zoom);
97
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_strokeBoundingBox).call(this, marginedBbox, zoom);
98
+ }
99
+ }
100
+ const rotatedBbox = rotateBoundingBox(initialBbox, currentAngle);
101
+ const marginedBbox = __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_applyMargin).call(this, rotatedBbox, zoom);
102
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_strokeBoundingBox).call(this, marginedBbox, zoom);
103
+ }, _SelectionUIRenderer_drawIndividualBoundingBox = function _SelectionUIRenderer_drawIndividualBoundingBox(feature, zoom) {
104
+ const bbox = computeBoundingBox(feature, __classPrivateFieldGet(this, _SelectionUIRenderer_extensions, "f"));
105
+ if (!bbox)
106
+ return;
107
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_strokeBoundingBox).call(this, __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_applyMargin).call(this, bbox, zoom), zoom);
108
+ }, _SelectionUIRenderer_drawCombinedBoundingBox = function _SelectionUIRenderer_drawCombinedBoundingBox(features, zoom) {
109
+ if (!__classPrivateFieldGet(this, _SelectionUIRenderer_transform, "f")) {
110
+ // The fallback when there is no transform (without a margin)
111
+ const bbox = computeCombinedBoundingBox(features, __classPrivateFieldGet(this, _SelectionUIRenderer_extensions, "f"));
112
+ if (bbox)
113
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_strokeBoundingBox).call(this, bbox, zoom);
114
+ return;
115
+ }
116
+ const margin = __classPrivateFieldGet(this, _SelectionUIRenderer_config, "f").boundingBox.margin;
117
+ const transform = __classPrivateFieldGet(this, _SelectionUIRenderer_transform, "f");
118
+ let minLng = Number.POSITIVE_INFINITY;
119
+ let maxLng = Number.NEGATIVE_INFINITY;
120
+ let minLat = Number.POSITIVE_INFINITY;
121
+ let maxLat = Number.NEGATIVE_INFINITY;
122
+ for (const feature of features) {
123
+ const bbox = computeBoundingBox(feature, __classPrivateFieldGet(this, _SelectionUIRenderer_extensions, "f"));
124
+ if (!bbox)
125
+ continue;
126
+ // A single-coordinate feature (such as Point) is computed from the extent of the
127
+ // point frame + the margin. The coordinate used is the center of the bbox (features
128
+ // other than Point can be zero-area too, e.g. a MultiPoint with a single point, so
129
+ // coordinates must not be treated as a Coordinate)
130
+ if (hasZeroArea(bbox)) {
131
+ const center = transform.project(bbox.center);
132
+ const extent = __classPrivateFieldGet(this, _SelectionUIRenderer_extensions, "f").resolvePointFrameExtent(feature);
133
+ const halfWidth = extent.halfWidth + margin;
134
+ const halfHeight = extent.halfHeight + margin;
135
+ const topLeft = transform.unproject({ x: center.x - halfWidth, y: center.y - halfHeight });
136
+ const bottomRight = transform.unproject({
137
+ x: center.x + halfWidth,
138
+ y: center.y + halfHeight,
139
+ });
140
+ minLng = Math.min(minLng, topLeft.lng, bottomRight.lng);
141
+ maxLng = Math.max(maxLng, topLeft.lng, bottomRight.lng);
142
+ minLat = Math.min(minLat, topLeft.lat, bottomRight.lat);
143
+ maxLat = Math.max(maxLat, topLeft.lat, bottomRight.lat);
144
+ continue;
145
+ }
146
+ const marginedBbox = applyMarginToBoundingBox(bbox, margin, transform, zoom);
147
+ const corners = [
148
+ marginedBbox.topLeft,
149
+ marginedBbox.topRight,
150
+ marginedBbox.bottomRight,
151
+ marginedBbox.bottomLeft,
152
+ ];
153
+ for (const corner of corners) {
154
+ minLng = Math.min(minLng, corner[0]);
155
+ maxLng = Math.max(maxLng, corner[0]);
156
+ minLat = Math.min(minLat, corner[1]);
157
+ maxLat = Math.max(maxLat, corner[1]);
158
+ }
159
+ }
160
+ if (!Number.isFinite(minLng))
161
+ return;
162
+ const coords = [
163
+ [minLng, maxLat],
164
+ [maxLng, maxLat],
165
+ [maxLng, minLat],
166
+ [minLng, minLat],
167
+ [minLng, maxLat],
168
+ ];
169
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_strokePath).call(this, coords, zoom);
170
+ }, _SelectionUIRenderer_drawBoundingBoxWithMargin = function _SelectionUIRenderer_drawBoundingBoxWithMargin(features, zoom) {
171
+ const bbox = computeCombinedBoundingBox(features, __classPrivateFieldGet(this, _SelectionUIRenderer_extensions, "f"));
172
+ if (!bbox)
173
+ return;
174
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_strokeBoundingBox).call(this, __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_applyMargin).call(this, bbox, zoom), zoom);
175
+ }, _SelectionUIRenderer_drawPointBoundingBox = function _SelectionUIRenderer_drawPointBoundingBox(feature, coord, zoom) {
176
+ if (!__classPrivateFieldGet(this, _SelectionUIRenderer_transform, "f"))
177
+ return;
178
+ const center = __classPrivateFieldGet(this, _SelectionUIRenderer_transform, "f").project(coord);
179
+ const margin = __classPrivateFieldGet(this, _SelectionUIRenderer_config, "f").boundingBox.margin;
180
+ const extent = __classPrivateFieldGet(this, _SelectionUIRenderer_extensions, "f").resolvePointFrameExtent(feature);
181
+ const halfWidth = extent.halfWidth + margin;
182
+ const halfHeight = extent.halfHeight + margin;
183
+ const topLeft = __classPrivateFieldGet(this, _SelectionUIRenderer_transform, "f").unproject({
184
+ x: center.x - halfWidth,
185
+ y: center.y - halfHeight,
186
+ });
187
+ const topRight = __classPrivateFieldGet(this, _SelectionUIRenderer_transform, "f").unproject({
188
+ x: center.x + halfWidth,
189
+ y: center.y - halfHeight,
190
+ });
191
+ const bottomRight = __classPrivateFieldGet(this, _SelectionUIRenderer_transform, "f").unproject({
192
+ x: center.x + halfWidth,
193
+ y: center.y + halfHeight,
194
+ });
195
+ const bottomLeft = __classPrivateFieldGet(this, _SelectionUIRenderer_transform, "f").unproject({
196
+ x: center.x - halfWidth,
197
+ y: center.y + halfHeight,
198
+ });
199
+ const coords = [
200
+ [topLeft.lng, topLeft.lat],
201
+ [topRight.lng, topRight.lat],
202
+ [bottomRight.lng, bottomRight.lat],
203
+ [bottomLeft.lng, bottomLeft.lat],
204
+ [topLeft.lng, topLeft.lat],
205
+ ];
206
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_strokePath).call(this, coords, zoom);
207
+ }, _SelectionUIRenderer_applyMargin = function _SelectionUIRenderer_applyMargin(bbox, zoom) {
208
+ if (!__classPrivateFieldGet(this, _SelectionUIRenderer_transform, "f"))
209
+ return bbox;
210
+ const margin = __classPrivateFieldGet(this, _SelectionUIRenderer_config, "f").boundingBox.margin;
211
+ return {
212
+ ...applyMarginToBoundingBox(bbox, margin, __classPrivateFieldGet(this, _SelectionUIRenderer_transform, "f"), zoom),
213
+ center: bbox.center,
214
+ };
215
+ }, _SelectionUIRenderer_strokeBoundingBox = function _SelectionUIRenderer_strokeBoundingBox(bbox, zoom) {
216
+ const corners = [bbox.topLeft, bbox.topRight, bbox.bottomRight, bbox.bottomLeft];
217
+ __classPrivateFieldGet(this, _SelectionUIRenderer_instances, "m", _SelectionUIRenderer_strokePath).call(this, [...corners, bbox.topLeft], zoom);
218
+ }, _SelectionUIRenderer_strokePath = function _SelectionUIRenderer_strokePath(coords, zoom) {
219
+ __classPrivateFieldGet(this, _SelectionUIRenderer_strokeRenderer, "f").draw(coords, __classPrivateFieldGet(this, _SelectionUIRenderer_config, "f").boundingBox.stroke, {
220
+ widthUnit: 'pixels',
221
+ closed: true,
222
+ // The frame follows the ground. The elevation comes from the same function as the
223
+ // handles, so the corners of the frame always match the corner handles and never
224
+ // drift from the position that can be grabbed
225
+ followTerrain: true,
226
+ }, zoom, __classPrivateFieldGet(this, _SelectionUIRenderer_projectionData, "f") ?? undefined);
227
+ };
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Type definitions related to the selection UI
3
+ *
4
+ * Gathers the types of BoundingBox, resize computation and the custom feature extension points.
5
+ */
6
+ import type { BoundingBoxCoords } from '../../../shared/types/selection-box.js';
7
+ import type { Coordinate, Feature } from '../../../store/types.js';
8
+ export type { CustomResizeCalculator } from '../../../extension/index.js';
9
+ export type { BoundingBoxCoords } from '../../../shared/types/selection-box.js';
10
+ /**
11
+ * Computes the selection box of a feature of a custom type.
12
+ *
13
+ * `tileSize` is the tile size in px of the map, for types whose size is given in pixels.
14
+ * The box is returned as its four corners and its center in degrees.
15
+ */
16
+ export type CustomBoundingBoxCalculator = (feature: Feature, tileSize: number) => BoundingBoxCoords;
17
+ /**
18
+ * The half width and half height of the selection frame of a point, in CSS px.
19
+ *
20
+ * A point stays zero-area and keeps the branch of "the look of a point" (the frame only,
21
+ * no resize / rotate handles, move inside the frame). It changes only the frame dimensions.
22
+ */
23
+ export interface PointFrameExtent {
24
+ /** The half width from the center (CSS pixels) */
25
+ halfWidth: number;
26
+ /** The half height from the center (CSS pixels) */
27
+ halfHeight: number;
28
+ }
29
+ /**
30
+ * Returns the size of the selection frame of a point-like feature.
31
+ *
32
+ * Returning null gives the default dimensions (the square of DEFAULT_POINT_FRAME_SIZE).
33
+ */
34
+ export type PointFrameExtentProvider = (feature: Feature) => PointFrameExtent | null;
35
+ /**
36
+ * A resize handle a custom feature type adds to the built-in ones (the same shape as
37
+ * {@link HandleInfo}).
38
+ */
39
+ export interface AdditionalHandleInfo {
40
+ /** The handle kind, passed back to the resize computation when it is dragged */
41
+ type: string;
42
+ /** The position of the handle, `[lng, lat]` in degrees */
43
+ position: Coordinate;
44
+ }
45
+ /**
46
+ * Returns the resize handles a feature of a custom type adds, given its selection box.
47
+ */
48
+ export type AdditionalResizeHandlesCalculator = (feature: Feature, bbox: BoundingBoxCoords) => AdditionalHandleInfo[];
49
+ /**
50
+ * How a feature type is resized.
51
+ *
52
+ * - scale : changes the scale property (as with Text and Image)
53
+ * - coordinates : changes the coordinates directly (as with Polygon and LineString)
54
+ */
55
+ export type ResizeStrategy = 'scale' | 'coordinates';
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Selection UI rendering
3
+ *
4
+ * Responsible for drawing the selection UI (the bounding box and the handles) for the
5
+ * selected features.
6
+ */
7
+ import type { CustomRenderMethodInput, Map as MapLibreMap } from 'maplibre-gl';
8
+ import { type LocalHiddenStore } from '../../store/local-visibility.js';
9
+ import type { DragState, Feature, VertexSelection } from '../../store/types.js';
10
+ import type { PointInstanceRenderer } from '../renderers/point/point-instance.js';
11
+ import type { SelectionHandlesRenderer, SelectionUIRenderer } from './index.js';
12
+ import type { SelectionScope } from './selection-scope.js';
13
+ /**
14
+ * The dependencies needed to draw the selection UI
15
+ */
16
+ export interface SelectionUIDrawerDeps {
17
+ selectionUIRenderer: SelectionUIRenderer | null;
18
+ selectionHandlesRenderer: SelectionHandlesRenderer | null;
19
+ pointInstanceRenderer: PointInstanceRenderer | null;
20
+ map: MapLibreMap;
21
+ /** The selection scope of the draw instance (extension points and thinned handle sets) */
22
+ scope: SelectionScope;
23
+ }
24
+ /**
25
+ * Draw the selection UI
26
+ */
27
+ export declare function renderSelectionUI(selectedFeatures: Feature[], zoom: number, projectionData: CustomRenderMethodInput['defaultProjectionData'], deps: SelectionUIDrawerDeps, dragState: DragState | null, selectedVertices?: VertexSelection | null,
28
+ /**
29
+ * Whether the selection cannot be edited (effective lock / read-only / interaction lock).
30
+ * When true, no manipulation handles are drawn. The selection box is still drawn (feedback
31
+ * about "what is selected" is needed in read-only too, and a frame without handles does
32
+ * not suggest editing).
33
+ */
34
+ isLocked?: boolean): void;
35
+ /**
36
+ * The minimal interface of the Store that drawing the following vertices needs
37
+ *
38
+ * It is enough to be able to look up a feature by id and to decide local visibility.
39
+ */
40
+ export interface FollowedVertexStore extends LocalHiddenStore {
41
+ getFeature(id: string): Feature | undefined;
42
+ }
43
+ /**
44
+ * Draw the vertices that follow along when a shared vertex is moved
45
+ *
46
+ * The following features are not selected, so they do not take the path of the selection UI.
47
+ * The UI state raised only during a drag (store.getFollowedVertices) is read and they are
48
+ * drawn in a different style from the selected vertices.
49
+ * Calling it after the selection UI puts the following vertices in front of the selection
50
+ * box and the handles.
51
+ */
52
+ export declare function renderFollowedVertices(followedVertices: VertexSelection[] | null, store: FollowedVertexStore, zoom: number, projectionData: CustomRenderMethodInput['defaultProjectionData'], deps: SelectionUIDrawerDeps): void;
@@ -0,0 +1,329 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { THINNING_VIEWPORT_MARGIN_PX } from '../../shared/config/selection.js';
4
+ import { supportsVertexEditing } from '../../shared/utils/coordinates.js';
5
+ import { isGlobeProjection } from '../../shared/utils/map.js';
6
+ import { isLocallyHidden } from '../../store/local-visibility.js';
7
+ import { computeVisibleHandleSet, shouldThinHandles } from './handle-thinning.js';
8
+ import { computeBoundingBox, hasZeroArea, rotateBoundingBox, } from './selection-ui/index.js';
9
+ /**
10
+ * Draw the selection UI
11
+ */
12
+ export function renderSelectionUI(selectedFeatures, zoom, projectionData, deps, dragState, selectedVertices,
13
+ /**
14
+ * Whether the selection cannot be edited (effective lock / read-only / interaction lock).
15
+ * When true, no manipulation handles are drawn. The selection box is still drawn (feedback
16
+ * about "what is selected" is needed in read-only too, and a frame without handles does
17
+ * not suggest editing).
18
+ */
19
+ isLocked = false) {
20
+ const { selectionUIRenderer, selectionHandlesRenderer, pointInstanceRenderer, map, scope } = deps;
21
+ if (selectedFeatures.length === 0 || !selectionUIRenderer || !selectionHandlesRenderer) {
22
+ return;
23
+ }
24
+ // Set the ProjectionData of PointInstanceRenderer
25
+ if (pointInstanceRenderer) {
26
+ pointInstanceRenderer.setProjectionData(projectionData);
27
+ }
28
+ // Set the coordinate transform
29
+ const coordinateTransform = {
30
+ project: (lngLat) => map.project([lngLat[0], lngLat[1]]),
31
+ unproject: (point) => {
32
+ const ll = map.unproject([point.x, point.y]);
33
+ return { lng: ll.lng, lat: ll.lat };
34
+ },
35
+ };
36
+ selectionUIRenderer.setTransform(coordinateTransform);
37
+ selectionUIRenderer.setProjectionData(projectionData);
38
+ selectionHandlesRenderer.setTransform(coordinateTransform);
39
+ selectionHandlesRenderer.setProjectionData(projectionData);
40
+ selectionUIRenderer.draw(selectedFeatures, zoom, dragState);
41
+ // When it is locked, only the selection box is shown and the manipulation handles
42
+ // (resize/rotate/vertex) are not drawn. This shows visually that it can be selected but
43
+ // not manipulated.
44
+ if (isLocked)
45
+ return;
46
+ // Support for custom features: uses the combined bounding box computation of selectionUIRenderer
47
+ let bbox = selectionUIRenderer.computeCombinedFeatureBoundingBox(selectedFeatures);
48
+ if (!bbox)
49
+ return;
50
+ // Control the display of the handles based on the drag state
51
+ const operation = dragState?.operation ?? null;
52
+ // While rotating, the rotated bbox is used for drawing the handles
53
+ const rotateInfo = dragState?.rotateInfo;
54
+ if (operation === 'rotate' && rotateInfo) {
55
+ bbox = rotateBoundingBox(rotateInfo.initialBbox, rotateInfo.currentAngle);
56
+ }
57
+ if (selectedFeatures.length === 1) {
58
+ // Get the selected vertex reference (only for the target feature)
59
+ const selectedVertexRefs = selectedVertices?.featureId === selectedFeatures[0].id
60
+ ? selectedVertices.vertexIndices
61
+ : undefined;
62
+ renderSingleSelectionHandles(selectedFeatures[0], zoom, selectionUIRenderer, selectionHandlesRenderer, operation, dragState, selectedVertexRefs, prepareVisibleHandleSet(selectedFeatures[0], map, scope), scope);
63
+ }
64
+ else {
65
+ renderMultiSelectionHandles(selectedFeatures, bbox, zoom, selectionHandlesRenderer, operation, scope);
66
+ }
67
+ }
68
+ /**
69
+ * Prepare the thinning set
70
+ *
71
+ * The set is built only for a feature whose total number of handles exceeds the threshold.
72
+ * For a feature at or below the threshold, undefined is returned and exactly the same path
73
+ * as before is taken, including the thinning computation.
74
+ */
75
+ function prepareVisibleHandleSet(feature, map, scope) {
76
+ if (!supportsVertexEditing(feature.type) || !shouldThinHandles(feature))
77
+ return undefined;
78
+ const viewport = computeThinningViewport(map);
79
+ return scope.thinning.ensureSet(feature, buildCameraSignature(map), performance.now(), () => computeVisibleHandleSet(feature, (coord) => map.project([coord[0], coord[1]]), viewport),
80
+ // Make sure the recomputation runs even if no rendering frame arrives after the camera stops
81
+ () => map.triggerRepaint());
82
+ }
83
+ /**
84
+ * Build the camera signature
85
+ *
86
+ * Only exact equality is looked at, so nothing is rounded. Any movement at all changes the
87
+ * signature, and the recomputation after the camera stops runs on a debounce.
88
+ */
89
+ function buildCameraSignature(map) {
90
+ const center = map.getCenter();
91
+ return `${center.lng},${center.lat},${map.getZoom()},${map.getBearing()},${map.getPitch()}`;
92
+ }
93
+ /**
94
+ * Obtain the viewport rectangle used for the preliminary narrowing
95
+ *
96
+ * Adds a margin to the bounding rectangle of the screen (including bearing / pitch). The
97
+ * pixel-to-degree conversion of the margin is obtained from the difference of two unproject
98
+ * calls. When it crosses longitude ±180 the narrowing is given up (every vertex becomes
99
+ * a candidate).
100
+ */
101
+ function computeThinningViewport(map) {
102
+ // On the globe the bounds maplibre reports fall short of the edge of the sphere, and the
103
+ // corners of the screen can lie off it, so nothing is narrowed there
104
+ if (isGlobeProjection(map))
105
+ return { bounds: null };
106
+ const bounds = map.getBounds();
107
+ const origin = map.unproject([0, 0]);
108
+ const lngMargin = Math.abs(map.unproject([THINNING_VIEWPORT_MARGIN_PX, 0]).lng - origin.lng);
109
+ const latMargin = Math.abs(map.unproject([0, THINNING_VIEWPORT_MARGIN_PX]).lat - origin.lat);
110
+ const minLng = bounds.getWest() - lngMargin;
111
+ const maxLng = bounds.getEast() + lngMargin;
112
+ if (minLng > maxLng || minLng < -180 || maxLng > 180) {
113
+ return { bounds: null };
114
+ }
115
+ return {
116
+ bounds: {
117
+ minLng,
118
+ maxLng,
119
+ minLat: bounds.getSouth() - latMargin,
120
+ maxLat: bounds.getNorth() + latMargin,
121
+ },
122
+ };
123
+ }
124
+ /**
125
+ * Draw the vertices that follow along when a shared vertex is moved
126
+ *
127
+ * The following features are not selected, so they do not take the path of the selection UI.
128
+ * The UI state raised only during a drag (store.getFollowedVertices) is read and they are
129
+ * drawn in a different style from the selected vertices.
130
+ * Calling it after the selection UI puts the following vertices in front of the selection
131
+ * box and the handles.
132
+ */
133
+ export function renderFollowedVertices(followedVertices, store, zoom, projectionData, deps) {
134
+ if (!followedVertices || followedVertices.length === 0)
135
+ return;
136
+ const { selectionHandlesRenderer, pointInstanceRenderer, map } = deps;
137
+ if (!selectionHandlesRenderer)
138
+ return;
139
+ if (pointInstanceRenderer) {
140
+ pointInstanceRenderer.setProjectionData(projectionData);
141
+ }
142
+ const coordinateTransform = {
143
+ project: (lngLat) => map.project([lngLat[0], lngLat[1]]),
144
+ unproject: (point) => {
145
+ const ll = map.unproject([point.x, point.y]);
146
+ return { lng: ll.lng, lat: ll.lat };
147
+ },
148
+ };
149
+ selectionHandlesRenderer.setTransform(coordinateTransform);
150
+ selectionHandlesRenderer.setProjectionData(projectionData);
151
+ for (const followed of followedVertices) {
152
+ const feature = store.getFeature(followed.featureId);
153
+ // The handles of features that disappeared or were hidden during the drag are not drawn
154
+ if (!feature?.visible || isLocallyHidden(feature, store))
155
+ continue;
156
+ selectionHandlesRenderer.drawFollowedVertexHandles(feature, followed.vertexIndices, zoom);
157
+ }
158
+ }
159
+ /**
160
+ * Draw the handles for a single selection
161
+ */
162
+ function renderSingleSelectionHandles(feature, zoom, selectionUIRenderer, selectionHandlesRenderer, operation, dragState, selectedVertexRefs, visibleSet, scope) {
163
+ // Zero area (a single-coordinate feature) has no resize or rotate handles.
164
+ // But a vertex-editable type (such as a MultiPoint with a single point) still gets its
165
+ // vertex handles drawn. Hit testing (hitTestVertexHandles) can grab a vertex even at zero
166
+ // area, so without drawing them the state would be "grabbable although invisible".
167
+ const featureBbox = computeBoundingBox(feature, scope.extensions);
168
+ if (featureBbox && hasZeroArea(featureBbox)) {
169
+ if (supportsVertexEditing(feature.type) && operation !== 'move') {
170
+ selectionHandlesRenderer.drawAllHandles(feature, featureBbox, {
171
+ showResize: false,
172
+ showRotate: false,
173
+ showVertex: true,
174
+ showMidpoint: false,
175
+ activeVertex: operation === 'vertex' ? dragState?.activeVertex : undefined,
176
+ selectedVertices: selectedVertexRefs,
177
+ visibleSet,
178
+ }, zoom);
179
+ }
180
+ return;
181
+ }
182
+ // Support for custom features: uses computeFeatureBoundingBox of selectionUIRenderer
183
+ let singleBbox = selectionUIRenderer.computeFeatureBoundingBox(feature);
184
+ if (!singleBbox)
185
+ return;
186
+ // While rotating, the rotated bbox is used
187
+ const rotateInfo = dragState?.rotateInfo;
188
+ if (operation === 'rotate' && rotateInfo) {
189
+ singleBbox = rotateBoundingBox(rotateInfo.initialBbox, rotateInfo.currentAngle);
190
+ }
191
+ // The special handle rendering for Circle
192
+ if (feature.type === 'Circle') {
193
+ renderCircleHandles(feature, singleBbox, zoom, selectionHandlesRenderer, operation);
194
+ }
195
+ else {
196
+ renderNonCircleHandles(feature, singleBbox, zoom, selectionHandlesRenderer, operation, dragState, selectedVertexRefs, visibleSet, scope);
197
+ }
198
+ }
199
+ /**
200
+ * Draw the handles of a Circle
201
+ */
202
+ function renderCircleHandles(feature, bbox, zoom, selectionHandlesRenderer, operation) {
203
+ let showResize = true;
204
+ let showRadiusHandle = true;
205
+ let showCenterMarker = true;
206
+ let showRadiusLine = true;
207
+ if (operation === 'move') {
208
+ // While moving: all handles are hidden
209
+ showResize = false;
210
+ showRadiusHandle = false;
211
+ showCenterMarker = false;
212
+ showRadiusLine = false;
213
+ }
214
+ else if (operation === 'resize') {
215
+ // While resizing: only the resize handles are shown
216
+ showRadiusHandle = false;
217
+ showCenterMarker = false;
218
+ showRadiusLine = false;
219
+ }
220
+ else if (operation === 'radius') {
221
+ // While changing the radius: only the radius-related ones are shown
222
+ showResize = false;
223
+ }
224
+ selectionHandlesRenderer.drawCircleHandles(feature, bbox, {
225
+ showResize,
226
+ showRadiusHandle,
227
+ showCenterMarker,
228
+ showRadiusLine,
229
+ }, zoom);
230
+ }
231
+ /**
232
+ * Draw the handles of features other than Circle
233
+ */
234
+ function renderNonCircleHandles(feature, bbox, zoom, selectionHandlesRenderer, operation, dragState, selectedVertexRefs, visibleSet, scope) {
235
+ // The rules for showing handles in a single selection
236
+ // (LineString, Polygon, the Multi kinds, Image, Freehand, custom features)
237
+ // The Multi kinds are treated the same as LineString / Polygon (with vertex handles).
238
+ // MultiPoint has no edges, so the midpoint handles come out empty.
239
+ const isVertexEditable = supportsVertexEditing(feature.type);
240
+ const isImage = feature.type === 'Image';
241
+ const isFreehand = feature.type === 'Freehand';
242
+ // Custom features: anything other than the types Core knows is treated like Image
243
+ const isCustomFeature = !isVertexEditable && !isImage && !isFreehand && feature.type !== 'Circle';
244
+ let showResize = true;
245
+ let showRotate = true;
246
+ // Freehand and custom features do not show vertex handles
247
+ let showVertex = isVertexEditable;
248
+ let showMidpoint = isVertexEditable;
249
+ let activeVertex;
250
+ if (operation === 'move') {
251
+ // While moving: vertex-editable types/Text/Image/Freehand/custom features hide all handles
252
+ if (isVertexEditable || isImage || isFreehand || isCustomFeature) {
253
+ showResize = false;
254
+ showRotate = false;
255
+ showVertex = false;
256
+ showMidpoint = false;
257
+ }
258
+ }
259
+ else if (operation === 'resize') {
260
+ // While resizing: only the resize handles are shown
261
+ showRotate = false;
262
+ showVertex = false;
263
+ showMidpoint = false;
264
+ }
265
+ else if (operation === 'rotate') {
266
+ // While rotating: only the rotate handles are shown
267
+ showResize = false;
268
+ showVertex = false;
269
+ showMidpoint = false;
270
+ }
271
+ else if (operation === 'vertex' || operation === 'midpoint') {
272
+ // While editing a vertex / adding a vertex: only the vertex being manipulated is shown
273
+ showResize = false;
274
+ showRotate = false;
275
+ showMidpoint = false;
276
+ activeVertex = dragState?.activeVertex;
277
+ }
278
+ // Create the callback that computes the additional handles of a custom feature
279
+ // Get the calculator from the draw instance's registry
280
+ let getAdditionalResizeHandles;
281
+ const calculator = scope.extensions.getAdditionalResizeHandlesCalculator(feature.type);
282
+ if (calculator) {
283
+ // Create the callback that receives the bbox after the margin is applied
284
+ getAdditionalResizeHandles = (marginedBbox) => calculator(feature, marginedBbox);
285
+ }
286
+ selectionHandlesRenderer.drawAllHandles(feature, bbox, {
287
+ showResize,
288
+ showRotate,
289
+ showVertex,
290
+ showMidpoint,
291
+ activeVertex,
292
+ selectedVertices: selectedVertexRefs,
293
+ getAdditionalResizeHandles,
294
+ visibleSet,
295
+ }, zoom);
296
+ }
297
+ /**
298
+ * Draw the handles for a multi-selection
299
+ */
300
+ function renderMultiSelectionHandles(selectedFeatures, bbox, zoom, selectionHandlesRenderer, operation, scope) {
301
+ const hasNonPoint = selectedFeatures.some((f) => {
302
+ const bbox = computeBoundingBox(f, scope.extensions);
303
+ return bbox !== null && !hasZeroArea(bbox);
304
+ });
305
+ if (!hasNonPoint) {
306
+ return;
307
+ }
308
+ let showResize = true;
309
+ let showRotate = true;
310
+ if (operation === 'move') {
311
+ // While moving: the resize and rotate handles are hidden
312
+ showResize = false;
313
+ showRotate = false;
314
+ }
315
+ else if (operation === 'resize') {
316
+ // While resizing: the rotate handles are hidden
317
+ showRotate = false;
318
+ }
319
+ else if (operation === 'rotate') {
320
+ // While rotating: the resize handles are hidden
321
+ showResize = false;
322
+ }
323
+ if (showResize) {
324
+ selectionHandlesRenderer.drawResizeHandles(bbox, zoom);
325
+ }
326
+ if (showRotate) {
327
+ selectionHandlesRenderer.drawRotateHandle(bbox, zoom);
328
+ }
329
+ }
@@ -0,0 +1 @@
1
+ export {};