@scoova/mgl 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 (565) hide show
  1. package/LICENSE.txt +116 -0
  2. package/README.md +174 -0
  3. package/build/banner.ts +12 -0
  4. package/build/bump-version-changelog.js +26 -0
  5. package/build/check-bundle-size.js +77 -0
  6. package/build/generate-dist-package.js +26 -0
  7. package/build/generate-doc-images.ts +78 -0
  8. package/build/generate-docs.ts +190 -0
  9. package/build/generate-shaders.ts +68 -0
  10. package/build/generate-struct-arrays.ts +438 -0
  11. package/build/generate-style-code.ts +283 -0
  12. package/build/readme.md +56 -0
  13. package/build/release-notes.js +45 -0
  14. package/build/rollup/bundle_prelude.js +29 -0
  15. package/build/rollup/maplibregl.js +22 -0
  16. package/build/rollup_plugins.ts +58 -0
  17. package/dist/LICENSE.txt +116 -0
  18. package/dist/maplibre-gl.css +1 -0
  19. package/dist/maplibre-gl.d.ts +13304 -0
  20. package/dist/maplibre-gl.js +59 -0
  21. package/dist/maplibre-gl.js.map +1 -0
  22. package/dist/package.json +1 -0
  23. package/package.json +192 -0
  24. package/src/css/maplibre-gl.css +854 -0
  25. package/src/css/svg/maplibregl-ctrl-attrib.svg +3 -0
  26. package/src/css/svg/maplibregl-ctrl-compass.svg +4 -0
  27. package/src/css/svg/maplibregl-ctrl-fullscreen.svg +3 -0
  28. package/src/css/svg/maplibregl-ctrl-geolocate.svg +5 -0
  29. package/src/css/svg/maplibregl-ctrl-logo.svg +11 -0
  30. package/src/css/svg/maplibregl-ctrl-shrink.svg +3 -0
  31. package/src/css/svg/maplibregl-ctrl-terrain.svg +3 -0
  32. package/src/css/svg/maplibregl-ctrl-zoom-in.svg +3 -0
  33. package/src/css/svg/maplibregl-ctrl-zoom-out.svg +3 -0
  34. package/src/data/array_types.g.ts +1130 -0
  35. package/src/data/bucket/circle_attributes.ts +8 -0
  36. package/src/data/bucket/circle_bucket.ts +197 -0
  37. package/src/data/bucket/fill_attributes.ts +8 -0
  38. package/src/data/bucket/fill_bucket.test.ts +95 -0
  39. package/src/data/bucket/fill_bucket.ts +228 -0
  40. package/src/data/bucket/fill_extrusion_attributes.ts +13 -0
  41. package/src/data/bucket/fill_extrusion_bucket.ts +305 -0
  42. package/src/data/bucket/heatmap_bucket.ts +12 -0
  43. package/src/data/bucket/line_attributes.ts +8 -0
  44. package/src/data/bucket/line_attributes_ext.ts +8 -0
  45. package/src/data/bucket/line_bucket.test.ts +142 -0
  46. package/src/data/bucket/line_bucket.ts +592 -0
  47. package/src/data/bucket/pattern_attributes.ts +9 -0
  48. package/src/data/bucket/pattern_bucket_features.ts +57 -0
  49. package/src/data/bucket/symbol_attributes.ts +122 -0
  50. package/src/data/bucket/symbol_bucket.test.ts +243 -0
  51. package/src/data/bucket/symbol_bucket.ts +975 -0
  52. package/src/data/bucket.ts +123 -0
  53. package/src/data/dem_data.test.ts +237 -0
  54. package/src/data/dem_data.ts +171 -0
  55. package/src/data/evaluation_feature.ts +18 -0
  56. package/src/data/extent.ts +13 -0
  57. package/src/data/feature_index.ts +337 -0
  58. package/src/data/feature_position_map.test.ts +33 -0
  59. package/src/data/feature_position_map.ts +126 -0
  60. package/src/data/index_array_type.ts +9 -0
  61. package/src/data/load_geometry.test.ts +49 -0
  62. package/src/data/load_geometry.ts +44 -0
  63. package/src/data/pos3d_attributes.ts +5 -0
  64. package/src/data/pos_attributes.ts +5 -0
  65. package/src/data/program_configuration.ts +735 -0
  66. package/src/data/raster_bounds_attributes.ts +6 -0
  67. package/src/data/segment.ts +89 -0
  68. package/src/geo/edge_insets.test.ts +83 -0
  69. package/src/geo/edge_insets.ts +146 -0
  70. package/src/geo/lng_lat.test.ts +65 -0
  71. package/src/geo/lng_lat.ts +169 -0
  72. package/src/geo/lng_lat_bounds.test.ts +357 -0
  73. package/src/geo/lng_lat_bounds.ts +356 -0
  74. package/src/geo/mercator_coordinate.test.ts +34 -0
  75. package/src/geo/mercator_coordinate.ts +157 -0
  76. package/src/geo/projection/projection.ts +72 -0
  77. package/src/geo/transform.test.ts +509 -0
  78. package/src/geo/transform.ts +1072 -0
  79. package/src/gl/color_mode.ts +31 -0
  80. package/src/gl/context.ts +321 -0
  81. package/src/gl/cull_face_mode.ts +22 -0
  82. package/src/gl/depth_mode.ts +26 -0
  83. package/src/gl/framebuffer.ts +48 -0
  84. package/src/gl/index_buffer.ts +55 -0
  85. package/src/gl/render_pool.test.ts +69 -0
  86. package/src/gl/render_pool.ts +93 -0
  87. package/src/gl/state.test.ts +125 -0
  88. package/src/gl/stencil_mode.ts +27 -0
  89. package/src/gl/types.ts +59 -0
  90. package/src/gl/value.ts +534 -0
  91. package/src/gl/vertex_buffer.test.ts +57 -0
  92. package/src/gl/vertex_buffer.ts +111 -0
  93. package/src/gl/webgl2.ts +12 -0
  94. package/src/index.test.ts +121 -0
  95. package/src/index.ts +250 -0
  96. package/src/render/draw_background.ts +53 -0
  97. package/src/render/draw_circle.ts +113 -0
  98. package/src/render/draw_collision_debug.ts +168 -0
  99. package/src/render/draw_custom.test.ts +73 -0
  100. package/src/render/draw_custom.ts +45 -0
  101. package/src/render/draw_debug.test.ts +122 -0
  102. package/src/render/draw_debug.ts +148 -0
  103. package/src/render/draw_fill.test.ts +137 -0
  104. package/src/render/draw_fill.ts +128 -0
  105. package/src/render/draw_fill_extrusion.ts +97 -0
  106. package/src/render/draw_heatmap.ts +228 -0
  107. package/src/render/draw_hillshade.ts +119 -0
  108. package/src/render/draw_line.ts +125 -0
  109. package/src/render/draw_raster.ts +133 -0
  110. package/src/render/draw_sky.ts +44 -0
  111. package/src/render/draw_symbol.test.ts +223 -0
  112. package/src/render/draw_symbol.ts +499 -0
  113. package/src/render/draw_terrain.ts +99 -0
  114. package/src/render/glyph_atlas.ts +83 -0
  115. package/src/render/glyph_manager.test.ts +147 -0
  116. package/src/render/glyph_manager.ts +198 -0
  117. package/src/render/image_atlas.ts +159 -0
  118. package/src/render/image_manager.ts +337 -0
  119. package/src/render/line_atlas.test.ts +38 -0
  120. package/src/render/line_atlas.ts +214 -0
  121. package/src/render/mesh.ts +25 -0
  122. package/src/render/painter.test.ts +51 -0
  123. package/src/render/painter.ts +666 -0
  124. package/src/render/program/background_program.ts +100 -0
  125. package/src/render/program/circle_program.ts +61 -0
  126. package/src/render/program/clipping_mask_program.ts +19 -0
  127. package/src/render/program/collision_program.ts +47 -0
  128. package/src/render/program/debug_program.ts +29 -0
  129. package/src/render/program/fill_extrusion_program.ts +120 -0
  130. package/src/render/program/fill_program.ts +121 -0
  131. package/src/render/program/heatmap_program.ts +76 -0
  132. package/src/render/program/hillshade_program.ts +116 -0
  133. package/src/render/program/line_program.ts +207 -0
  134. package/src/render/program/pattern.ts +102 -0
  135. package/src/render/program/program_uniforms.ts +46 -0
  136. package/src/render/program/raster_program.ts +88 -0
  137. package/src/render/program/sky_program.ts +28 -0
  138. package/src/render/program/symbol_program.ts +266 -0
  139. package/src/render/program/terrain_program.ts +116 -0
  140. package/src/render/program.ts +233 -0
  141. package/src/render/render_to_texture.test.ts +151 -0
  142. package/src/render/render_to_texture.ts +197 -0
  143. package/src/render/terrain.test.ts +322 -0
  144. package/src/render/terrain.ts +464 -0
  145. package/src/render/texture.ts +114 -0
  146. package/src/render/uniform_binding.test.ts +122 -0
  147. package/src/render/uniform_binding.ts +157 -0
  148. package/src/render/update_pattern_positions_in_program.test.ts +74 -0
  149. package/src/render/update_pattern_positions_in_program.ts +50 -0
  150. package/src/render/vertex_array_object.ts +163 -0
  151. package/src/shaders/README.md +42 -0
  152. package/src/shaders/_prelude.fragment.glsl +19 -0
  153. package/src/shaders/_prelude.fragment.glsl.g.ts +2 -0
  154. package/src/shaders/_prelude.vertex.glsl +148 -0
  155. package/src/shaders/_prelude.vertex.glsl.g.ts +2 -0
  156. package/src/shaders/background.fragment.glsl +10 -0
  157. package/src/shaders/background.fragment.glsl.g.ts +2 -0
  158. package/src/shaders/background.vertex.glsl +7 -0
  159. package/src/shaders/background.vertex.glsl.g.ts +2 -0
  160. package/src/shaders/background_pattern.fragment.glsl +28 -0
  161. package/src/shaders/background_pattern.fragment.glsl.g.ts +2 -0
  162. package/src/shaders/background_pattern.vertex.glsl +19 -0
  163. package/src/shaders/background_pattern.vertex.glsl.g.ts +2 -0
  164. package/src/shaders/circle.fragment.glsl +34 -0
  165. package/src/shaders/circle.fragment.glsl.g.ts +2 -0
  166. package/src/shaders/circle.vertex.glsl +68 -0
  167. package/src/shaders/circle.vertex.glsl.g.ts +2 -0
  168. package/src/shaders/clipping_mask.fragment.glsl +3 -0
  169. package/src/shaders/clipping_mask.fragment.glsl.g.ts +2 -0
  170. package/src/shaders/clipping_mask.vertex.glsl +7 -0
  171. package/src/shaders/clipping_mask.vertex.glsl.g.ts +2 -0
  172. package/src/shaders/collision_box.fragment.glsl +20 -0
  173. package/src/shaders/collision_box.fragment.glsl.g.ts +2 -0
  174. package/src/shaders/collision_box.vertex.glsl +27 -0
  175. package/src/shaders/collision_box.vertex.glsl.g.ts +2 -0
  176. package/src/shaders/collision_circle.fragment.glsl +17 -0
  177. package/src/shaders/collision_circle.fragment.glsl.g.ts +2 -0
  178. package/src/shaders/collision_circle.vertex.glsl +59 -0
  179. package/src/shaders/collision_circle.vertex.glsl.g.ts +2 -0
  180. package/src/shaders/debug.fragment.glsl +9 -0
  181. package/src/shaders/debug.fragment.glsl.g.ts +2 -0
  182. package/src/shaders/debug.vertex.glsl +12 -0
  183. package/src/shaders/debug.vertex.glsl.g.ts +2 -0
  184. package/src/shaders/encode_attribute.test.ts +11 -0
  185. package/src/shaders/encode_attribute.ts +13 -0
  186. package/src/shaders/fill.fragment.glsl +13 -0
  187. package/src/shaders/fill.fragment.glsl.g.ts +2 -0
  188. package/src/shaders/fill.vertex.glsl +13 -0
  189. package/src/shaders/fill.vertex.glsl.g.ts +2 -0
  190. package/src/shaders/fill_extrusion.fragment.glsl +9 -0
  191. package/src/shaders/fill_extrusion.fragment.glsl.g.ts +2 -0
  192. package/src/shaders/fill_extrusion.vertex.glsl +84 -0
  193. package/src/shaders/fill_extrusion.vertex.glsl.g.ts +2 -0
  194. package/src/shaders/fill_extrusion_pattern.fragment.glsl +47 -0
  195. package/src/shaders/fill_extrusion_pattern.fragment.glsl.g.ts +2 -0
  196. package/src/shaders/fill_extrusion_pattern.vertex.glsl +96 -0
  197. package/src/shaders/fill_extrusion_pattern.vertex.glsl.g.ts +2 -0
  198. package/src/shaders/fill_outline.fragment.glsl +17 -0
  199. package/src/shaders/fill_outline.fragment.glsl.g.ts +2 -0
  200. package/src/shaders/fill_outline.vertex.glsl +17 -0
  201. package/src/shaders/fill_outline.vertex.glsl.g.ts +2 -0
  202. package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
  203. package/src/shaders/fill_outline_pattern.fragment.glsl.g.ts +2 -0
  204. package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
  205. package/src/shaders/fill_outline_pattern.vertex.glsl.g.ts +2 -0
  206. package/src/shaders/fill_pattern.fragment.glsl +39 -0
  207. package/src/shaders/fill_pattern.fragment.glsl.g.ts +2 -0
  208. package/src/shaders/fill_pattern.vertex.glsl +39 -0
  209. package/src/shaders/fill_pattern.vertex.glsl.g.ts +2 -0
  210. package/src/shaders/heatmap.fragment.glsl +22 -0
  211. package/src/shaders/heatmap.fragment.glsl.g.ts +2 -0
  212. package/src/shaders/heatmap.vertex.glsl +54 -0
  213. package/src/shaders/heatmap.vertex.glsl.g.ts +2 -0
  214. package/src/shaders/heatmap_texture.fragment.glsl +15 -0
  215. package/src/shaders/heatmap_texture.fragment.glsl.g.ts +2 -0
  216. package/src/shaders/heatmap_texture.vertex.glsl +11 -0
  217. package/src/shaders/heatmap_texture.vertex.glsl.g.ts +2 -0
  218. package/src/shaders/hillshade.fragment.glsl +52 -0
  219. package/src/shaders/hillshade.fragment.glsl.g.ts +2 -0
  220. package/src/shaders/hillshade.vertex.glsl +11 -0
  221. package/src/shaders/hillshade.vertex.glsl.g.ts +2 -0
  222. package/src/shaders/hillshade_prepare.fragment.glsl +77 -0
  223. package/src/shaders/hillshade_prepare.fragment.glsl.g.ts +2 -0
  224. package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
  225. package/src/shaders/hillshade_prepare.vertex.glsl.g.ts +2 -0
  226. package/src/shaders/line.fragment.glsl +30 -0
  227. package/src/shaders/line.fragment.glsl.g.ts +2 -0
  228. package/src/shaders/line.vertex.glsl +89 -0
  229. package/src/shaders/line.vertex.glsl.g.ts +2 -0
  230. package/src/shaders/line_gradient.fragment.glsl +34 -0
  231. package/src/shaders/line_gradient.fragment.glsl.g.ts +2 -0
  232. package/src/shaders/line_gradient.vertex.glsl +92 -0
  233. package/src/shaders/line_gradient.vertex.glsl.g.ts +2 -0
  234. package/src/shaders/line_pattern.fragment.glsl +77 -0
  235. package/src/shaders/line_pattern.fragment.glsl.g.ts +2 -0
  236. package/src/shaders/line_pattern.vertex.glsl +103 -0
  237. package/src/shaders/line_pattern.vertex.glsl.g.ts +2 -0
  238. package/src/shaders/line_sdf.fragment.glsl +45 -0
  239. package/src/shaders/line_sdf.fragment.glsl.g.ts +2 -0
  240. package/src/shaders/line_sdf.vertex.glsl +101 -0
  241. package/src/shaders/line_sdf.vertex.glsl.g.ts +2 -0
  242. package/src/shaders/raster.fragment.glsl +53 -0
  243. package/src/shaders/raster.fragment.glsl.g.ts +2 -0
  244. package/src/shaders/raster.vertex.glsl +21 -0
  245. package/src/shaders/raster.vertex.glsl.g.ts +2 -0
  246. package/src/shaders/shaders.ts +197 -0
  247. package/src/shaders/sky.fragment.glsl +17 -0
  248. package/src/shaders/sky.fragment.glsl.g.ts +2 -0
  249. package/src/shaders/sky.vertex.glsl +5 -0
  250. package/src/shaders/sky.vertex.glsl.g.ts +2 -0
  251. package/src/shaders/symbol_icon.fragment.glsl +17 -0
  252. package/src/shaders/symbol_icon.fragment.glsl.g.ts +2 -0
  253. package/src/shaders/symbol_icon.vertex.glsl +117 -0
  254. package/src/shaders/symbol_icon.vertex.glsl.g.ts +2 -0
  255. package/src/shaders/symbol_sdf.fragment.glsl +58 -0
  256. package/src/shaders/symbol_sdf.fragment.glsl.g.ts +2 -0
  257. package/src/shaders/symbol_sdf.vertex.glsl +142 -0
  258. package/src/shaders/symbol_sdf.vertex.glsl.g.ts +2 -0
  259. package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
  260. package/src/shaders/symbol_text_and_icon.fragment.glsl.g.ts +2 -0
  261. package/src/shaders/symbol_text_and_icon.vertex.glsl +140 -0
  262. package/src/shaders/symbol_text_and_icon.vertex.glsl.g.ts +2 -0
  263. package/src/shaders/terrain.fragment.glsl +32 -0
  264. package/src/shaders/terrain.fragment.glsl.g.ts +2 -0
  265. package/src/shaders/terrain.vertex.glsl +17 -0
  266. package/src/shaders/terrain.vertex.glsl.g.ts +2 -0
  267. package/src/shaders/terrain_coords.fragment.glsl +11 -0
  268. package/src/shaders/terrain_coords.fragment.glsl.g.ts +2 -0
  269. package/src/shaders/terrain_coords.vertex.glsl +13 -0
  270. package/src/shaders/terrain_coords.vertex.glsl.g.ts +2 -0
  271. package/src/shaders/terrain_depth.fragment.glsl +15 -0
  272. package/src/shaders/terrain_depth.fragment.glsl.g.ts +2 -0
  273. package/src/shaders/terrain_depth.vertex.glsl +13 -0
  274. package/src/shaders/terrain_depth.vertex.glsl.g.ts +2 -0
  275. package/src/source/canvas_source.test.ts +210 -0
  276. package/src/source/canvas_source.ts +227 -0
  277. package/src/source/geojson_source.test.ts +492 -0
  278. package/src/source/geojson_source.ts +431 -0
  279. package/src/source/geojson_source_diff.test.ts +364 -0
  280. package/src/source/geojson_source_diff.ts +172 -0
  281. package/src/source/geojson_worker_source.test.ts +399 -0
  282. package/src/source/geojson_worker_source.ts +303 -0
  283. package/src/source/geojson_wrapper.test.ts +32 -0
  284. package/src/source/geojson_wrapper.ts +81 -0
  285. package/src/source/image_source.test.ts +235 -0
  286. package/src/source/image_source.ts +338 -0
  287. package/src/source/load_tilejson.ts +47 -0
  288. package/src/source/pixels_to_tile_units.ts +25 -0
  289. package/src/source/protocol_crud.ts +48 -0
  290. package/src/source/query_features.test.ts +31 -0
  291. package/src/source/query_features.ts +252 -0
  292. package/src/source/raster_dem_tile_source.test.ts +158 -0
  293. package/src/source/raster_dem_tile_source.ts +166 -0
  294. package/src/source/raster_dem_tile_worker_source.test.ts +36 -0
  295. package/src/source/raster_dem_tile_worker_source.ts +38 -0
  296. package/src/source/raster_tile_source.test.ts +206 -0
  297. package/src/source/raster_tile_source.ts +227 -0
  298. package/src/source/rtl_text_plugin_main_thread.test.ts +170 -0
  299. package/src/source/rtl_text_plugin_main_thread.ts +89 -0
  300. package/src/source/rtl_text_plugin_status.ts +33 -0
  301. package/src/source/rtl_text_plugin_worker.ts +49 -0
  302. package/src/source/source.test.ts +41 -0
  303. package/src/source/source.ts +186 -0
  304. package/src/source/source_cache.test.ts +2069 -0
  305. package/src/source/source_cache.ts +1102 -0
  306. package/src/source/source_state.ts +157 -0
  307. package/src/source/terrain_source_cache.test.ts +105 -0
  308. package/src/source/terrain_source_cache.ts +204 -0
  309. package/src/source/tile.test.ts +290 -0
  310. package/src/source/tile.ts +478 -0
  311. package/src/source/tile_bounds.ts +34 -0
  312. package/src/source/tile_cache.test.ts +130 -0
  313. package/src/source/tile_cache.ts +208 -0
  314. package/src/source/tile_id.test.ts +112 -0
  315. package/src/source/tile_id.ts +221 -0
  316. package/src/source/vector_tile_source.test.ts +401 -0
  317. package/src/source/vector_tile_source.ts +283 -0
  318. package/src/source/vector_tile_worker_source.test.ts +396 -0
  319. package/src/source/vector_tile_worker_source.ts +199 -0
  320. package/src/source/video_source.test.ts +124 -0
  321. package/src/source/video_source.ts +204 -0
  322. package/src/source/worker.test.ts +233 -0
  323. package/src/source/worker.ts +301 -0
  324. package/src/source/worker_source.ts +117 -0
  325. package/src/source/worker_tile.test.ts +226 -0
  326. package/src/source/worker_tile.ts +208 -0
  327. package/src/style/create_style_layer.ts +39 -0
  328. package/src/style/evaluation_parameters.ts +62 -0
  329. package/src/style/format_section_override.test.ts +62 -0
  330. package/src/style/format_section_override.ts +50 -0
  331. package/src/style/light.test.ts +86 -0
  332. package/src/style/light.ts +135 -0
  333. package/src/style/load_glyph_range.test.ts +40 -0
  334. package/src/style/load_glyph_range.ts +32 -0
  335. package/src/style/load_sprite.test.ts +227 -0
  336. package/src/style/load_sprite.ts +71 -0
  337. package/src/style/parse_glyph_pbf.ts +42 -0
  338. package/src/style/pauseable_placement.ts +138 -0
  339. package/src/style/properties.ts +726 -0
  340. package/src/style/query_utils.test.ts +107 -0
  341. package/src/style/query_utils.ts +70 -0
  342. package/src/style/sky.ts +127 -0
  343. package/src/style/style.test.ts +2654 -0
  344. package/src/style/style.ts +1814 -0
  345. package/src/style/style_glyph.ts +25 -0
  346. package/src/style/style_image.ts +188 -0
  347. package/src/style/style_layer/background_style_layer.ts +17 -0
  348. package/src/style/style_layer/background_style_layer_properties.g.ts +40 -0
  349. package/src/style/style_layer/circle_style_layer.ts +98 -0
  350. package/src/style/style_layer/circle_style_layer_properties.g.ts +76 -0
  351. package/src/style/style_layer/custom_style_layer.ts +233 -0
  352. package/src/style/style_layer/fill_extrusion_style_layer.ts +224 -0
  353. package/src/style/style_layer/fill_extrusion_style_layer_properties.g.ts +55 -0
  354. package/src/style/style_layer/fill_style_layer.test.ts +37 -0
  355. package/src/style/style_layer/fill_style_layer.ts +65 -0
  356. package/src/style/style_layer/fill_style_layer_properties.g.ts +64 -0
  357. package/src/style/style_layer/heatmap_style_layer.ts +74 -0
  358. package/src/style/style_layer/heatmap_style_layer_properties.g.ts +46 -0
  359. package/src/style/style_layer/hillshade_style_layer.ts +21 -0
  360. package/src/style/style_layer/hillshade_style_layer_properties.g.ts +49 -0
  361. package/src/style/style_layer/line_style_layer.test.ts +50 -0
  362. package/src/style/style_layer/line_style_layer.ts +131 -0
  363. package/src/style/style_layer/line_style_layer_properties.g.ts +88 -0
  364. package/src/style/style_layer/overlap_mode.test.ts +57 -0
  365. package/src/style/style_layer/overlap_mode.ts +25 -0
  366. package/src/style/style_layer/raster_style_layer.ts +17 -0
  367. package/src/style/style_layer/raster_style_layer_properties.g.ts +55 -0
  368. package/src/style/style_layer/symbol_style_layer.ts +195 -0
  369. package/src/style/style_layer/symbol_style_layer_properties.g.ts +218 -0
  370. package/src/style/style_layer/typed_style_layer.ts +9 -0
  371. package/src/style/style_layer/variable_text_anchor.test.ts +117 -0
  372. package/src/style/style_layer/variable_text_anchor.ts +163 -0
  373. package/src/style/style_layer.test.ts +372 -0
  374. package/src/style/style_layer.ts +287 -0
  375. package/src/style/style_layer_index.test.ts +99 -0
  376. package/src/style/style_layer_index.ts +78 -0
  377. package/src/style/validate_style.ts +53 -0
  378. package/src/style/zoom_history.ts +40 -0
  379. package/src/symbol/anchor.test.ts +14 -0
  380. package/src/symbol/anchor.ts +22 -0
  381. package/src/symbol/check_max_angle.test.ts +54 -0
  382. package/src/symbol/check_max_angle.ts +76 -0
  383. package/src/symbol/clip_line.test.ts +154 -0
  384. package/src/symbol/clip_line.ts +66 -0
  385. package/src/symbol/collision_feature.test.ts +98 -0
  386. package/src/symbol/collision_feature.ts +114 -0
  387. package/src/symbol/collision_index.test.ts +19 -0
  388. package/src/symbol/collision_index.ts +618 -0
  389. package/src/symbol/cross_tile_symbol_index.test.ts +260 -0
  390. package/src/symbol/cross_tile_symbol_index.ts +367 -0
  391. package/src/symbol/get_anchors.test.ts +113 -0
  392. package/src/symbol/get_anchors.ts +167 -0
  393. package/src/symbol/grid_index.test.ts +75 -0
  394. package/src/symbol/grid_index.ts +414 -0
  395. package/src/symbol/merge_lines.test.ts +30 -0
  396. package/src/symbol/merge_lines.ts +80 -0
  397. package/src/symbol/one_em.ts +3 -0
  398. package/src/symbol/opacity_state.ts +23 -0
  399. package/src/symbol/path_interpolator.test.ts +134 -0
  400. package/src/symbol/path_interpolator.ts +55 -0
  401. package/src/symbol/placement.ts +1371 -0
  402. package/src/symbol/projection.test.ts +171 -0
  403. package/src/symbol/projection.ts +833 -0
  404. package/src/symbol/quads.test.ts +157 -0
  405. package/src/symbol/quads.ts +349 -0
  406. package/src/symbol/shaping.test.ts +360 -0
  407. package/src/symbol/shaping.ts +911 -0
  408. package/src/symbol/symbol_layout.ts +739 -0
  409. package/src/symbol/symbol_size.ts +129 -0
  410. package/src/symbol/symbol_style_layer.test.ts +103 -0
  411. package/src/symbol/transform_text.ts +27 -0
  412. package/src/ui/anchor.ts +27 -0
  413. package/src/ui/camera.test.ts +2301 -0
  414. package/src/ui/camera.ts +1520 -0
  415. package/src/ui/control/attribution_control.test.ts +543 -0
  416. package/src/ui/control/attribution_control.ts +209 -0
  417. package/src/ui/control/control.ts +67 -0
  418. package/src/ui/control/fullscreen_control.test.ts +114 -0
  419. package/src/ui/control/fullscreen_control.ts +189 -0
  420. package/src/ui/control/geolocate_control.test.ts +619 -0
  421. package/src/ui/control/geolocate_control.ts +725 -0
  422. package/src/ui/control/logo_control.test.ts +88 -0
  423. package/src/ui/control/logo_control.ts +86 -0
  424. package/src/ui/control/navigation_control.test.ts +238 -0
  425. package/src/ui/control/navigation_control.ts +294 -0
  426. package/src/ui/control/scale_control.test.ts +52 -0
  427. package/src/ui/control/scale_control.ts +152 -0
  428. package/src/ui/control/terrain_control.test.ts +58 -0
  429. package/src/ui/control/terrain_control.ts +74 -0
  430. package/src/ui/default_locale.ts +25 -0
  431. package/src/ui/events.ts +758 -0
  432. package/src/ui/handler/box_zoom.test.ts +163 -0
  433. package/src/ui/handler/box_zoom.ts +171 -0
  434. package/src/ui/handler/click_zoom.ts +55 -0
  435. package/src/ui/handler/cooperative_gestures.test.ts +338 -0
  436. package/src/ui/handler/cooperative_gestures.ts +111 -0
  437. package/src/ui/handler/dblclick_zoom.test.ts +151 -0
  438. package/src/ui/handler/drag_handler.ts +174 -0
  439. package/src/ui/handler/drag_move_state_manager.ts +115 -0
  440. package/src/ui/handler/drag_pan.test.ts +487 -0
  441. package/src/ui/handler/drag_rotate.test.ts +859 -0
  442. package/src/ui/handler/handler_util.ts +10 -0
  443. package/src/ui/handler/keyboard.test.ts +235 -0
  444. package/src/ui/handler/keyboard.ts +212 -0
  445. package/src/ui/handler/map_event.test.ts +158 -0
  446. package/src/ui/handler/map_event.ts +161 -0
  447. package/src/ui/handler/mouse.ts +92 -0
  448. package/src/ui/handler/mouse_handler_interface.test.ts +111 -0
  449. package/src/ui/handler/mouse_rotate.test.ts +62 -0
  450. package/src/ui/handler/one_finger_touch_drag.ts +45 -0
  451. package/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts +77 -0
  452. package/src/ui/handler/scroll_zoom.test.ts +382 -0
  453. package/src/ui/handler/scroll_zoom.ts +379 -0
  454. package/src/ui/handler/shim/dblclick_zoom.ts +64 -0
  455. package/src/ui/handler/shim/drag_pan.ts +104 -0
  456. package/src/ui/handler/shim/drag_rotate.ts +76 -0
  457. package/src/ui/handler/shim/two_fingers_touch.ts +112 -0
  458. package/src/ui/handler/tap_drag_zoom.test.ts +113 -0
  459. package/src/ui/handler/tap_drag_zoom.ts +112 -0
  460. package/src/ui/handler/tap_recognizer.ts +138 -0
  461. package/src/ui/handler/tap_zoom.ts +98 -0
  462. package/src/ui/handler/touch_pan.ts +115 -0
  463. package/src/ui/handler/transform-provider.ts +44 -0
  464. package/src/ui/handler/two_fingers_touch.test.ts +283 -0
  465. package/src/ui/handler/two_fingers_touch.ts +336 -0
  466. package/src/ui/handler_inertia.ts +157 -0
  467. package/src/ui/handler_manager.ts +637 -0
  468. package/src/ui/hash.test.ts +404 -0
  469. package/src/ui/hash.ts +153 -0
  470. package/src/ui/map.ts +3393 -0
  471. package/src/ui/map_tests/map_animation.test.ts +61 -0
  472. package/src/ui/map_tests/map_basic.test.ts +223 -0
  473. package/src/ui/map_tests/map_bounds.test.ts +123 -0
  474. package/src/ui/map_tests/map_calculate_camera_options.test.ts +113 -0
  475. package/src/ui/map_tests/map_canvas.test.ts +59 -0
  476. package/src/ui/map_tests/map_control.test.ts +61 -0
  477. package/src/ui/map_tests/map_disable_handlers.test.ts +38 -0
  478. package/src/ui/map_tests/map_events.test.ts +1001 -0
  479. package/src/ui/map_tests/map_feature_state.test.ts +421 -0
  480. package/src/ui/map_tests/map_images.test.ts +175 -0
  481. package/src/ui/map_tests/map_is_moving.test.ts +164 -0
  482. package/src/ui/map_tests/map_is_rotating.test.ts +62 -0
  483. package/src/ui/map_tests/map_is_zooming.test.ts +86 -0
  484. package/src/ui/map_tests/map_layer.test.ts +457 -0
  485. package/src/ui/map_tests/map_options.test.ts +64 -0
  486. package/src/ui/map_tests/map_pitch.test.ts +90 -0
  487. package/src/ui/map_tests/map_pixel_ratio.test.ts +75 -0
  488. package/src/ui/map_tests/map_query_rendered_features.test.ts +93 -0
  489. package/src/ui/map_tests/map_render.test.ts +90 -0
  490. package/src/ui/map_tests/map_request_render_frame.test.ts +51 -0
  491. package/src/ui/map_tests/map_resize.test.ts +120 -0
  492. package/src/ui/map_tests/map_style.test.ts +541 -0
  493. package/src/ui/map_tests/map_terrian.test.ts +104 -0
  494. package/src/ui/map_tests/map_webgl.test.ts +72 -0
  495. package/src/ui/map_tests/map_world_copies.test.ts +103 -0
  496. package/src/ui/map_tests/map_zoom.test.ts +95 -0
  497. package/src/ui/marker.test.ts +1149 -0
  498. package/src/ui/marker.ts +880 -0
  499. package/src/ui/popup.test.ts +827 -0
  500. package/src/ui/popup.ts +717 -0
  501. package/src/util/abort_error.ts +21 -0
  502. package/src/util/actor.test.ts +218 -0
  503. package/src/util/actor.ts +241 -0
  504. package/src/util/actor_messages.ts +149 -0
  505. package/src/util/ajax.test.ts +237 -0
  506. package/src/util/ajax.ts +297 -0
  507. package/src/util/browser.test.ts +23 -0
  508. package/src/util/browser.ts +63 -0
  509. package/src/util/color_ramp.test.ts +105 -0
  510. package/src/util/color_ramp.ts +56 -0
  511. package/src/util/config.ts +29 -0
  512. package/src/util/dictionary_coder.ts +23 -0
  513. package/src/util/dispatcher.test.ts +76 -0
  514. package/src/util/dispatcher.ts +78 -0
  515. package/src/util/dom.ts +135 -0
  516. package/src/util/evented.test.ts +231 -0
  517. package/src/util/evented.ts +178 -0
  518. package/src/util/find_pole_of_inaccessibility.test.ts +21 -0
  519. package/src/util/find_pole_of_inaccessibility.ts +130 -0
  520. package/src/util/geolocation_support.test.ts +43 -0
  521. package/src/util/geolocation_support.ts +23 -0
  522. package/src/util/global_worker_pool.ts +65 -0
  523. package/src/util/image.ts +150 -0
  524. package/src/util/image_request.test.ts +408 -0
  525. package/src/util/image_request.ts +246 -0
  526. package/src/util/intersection_tests.ts +206 -0
  527. package/src/util/is_char_in_unicode_block.test.ts +15 -0
  528. package/src/util/is_char_in_unicode_block.ts +345 -0
  529. package/src/util/offscreen_canvas_distorted.test.ts +13 -0
  530. package/src/util/offscreen_canvas_distorted.ts +39 -0
  531. package/src/util/offscreen_canvas_supported.ts +11 -0
  532. package/src/util/performance.ts +117 -0
  533. package/src/util/primitives.test.ts +140 -0
  534. package/src/util/primitives.ts +143 -0
  535. package/src/util/request_manager.ts +42 -0
  536. package/src/util/resolve_tokens.test.ts +45 -0
  537. package/src/util/resolve_tokens.ts +17 -0
  538. package/src/util/script_detection.test.ts +138 -0
  539. package/src/util/script_detection.ts +376 -0
  540. package/src/util/smart_wrap.test.ts +97 -0
  541. package/src/util/smart_wrap.ts +58 -0
  542. package/src/util/struct_array.test.ts +101 -0
  543. package/src/util/struct_array.ts +246 -0
  544. package/src/util/style.test.ts +34 -0
  545. package/src/util/style.ts +28 -0
  546. package/src/util/task_queue.test.ts +114 -0
  547. package/src/util/task_queue.ts +64 -0
  548. package/src/util/test/util.ts +185 -0
  549. package/src/util/throttle.test.ts +42 -0
  550. package/src/util/throttle.ts +28 -0
  551. package/src/util/throttled_invoker.ts +41 -0
  552. package/src/util/transferable_grid_index.test.ts +56 -0
  553. package/src/util/transferable_grid_index.ts +214 -0
  554. package/src/util/util.test.ts +414 -0
  555. package/src/util/util.ts +724 -0
  556. package/src/util/vectortile_to_geojson.ts +72 -0
  557. package/src/util/verticalize_punctuation.ts +110 -0
  558. package/src/util/web_worker.ts +16 -0
  559. package/src/util/web_worker_transfer.test.ts +153 -0
  560. package/src/util/web_worker_transfer.ts +254 -0
  561. package/src/util/webp_supported.ts +63 -0
  562. package/src/util/worker_pool.test.ts +43 -0
  563. package/src/util/worker_pool.ts +58 -0
  564. package/src/util/world_bounds.test.ts +59 -0
  565. package/src/util/world_bounds.ts +46 -0
@@ -0,0 +1,717 @@
1
+ import {extend} from '../util/util';
2
+ import {Event, Evented} from '../util/evented';
3
+ import {MapMouseEvent} from '../ui/events';
4
+ import {DOM} from '../util/dom';
5
+ import {LngLat} from '../geo/lng_lat';
6
+ import Point from '@mapbox/point-geometry';
7
+ import {smartWrap} from '../util/smart_wrap';
8
+ import {anchorTranslate, applyAnchorClass} from './anchor';
9
+
10
+ import type {PositionAnchor} from './anchor';
11
+ import type {Map} from './map';
12
+ import type {LngLatLike} from '../geo/lng_lat';
13
+ import type {PointLike} from './camera';
14
+
15
+ const defaultOptions = {
16
+ closeButton: true,
17
+ closeOnClick: true,
18
+ focusAfterOpen: true,
19
+ className: '',
20
+ maxWidth: '240px',
21
+ subpixelPositioning: false
22
+ };
23
+
24
+ /**
25
+ * A pixel offset specified as:
26
+ *
27
+ * - a single number specifying a distance from the location
28
+ * - a {@link PointLike} specifying a constant offset
29
+ * - an object of {@link Point}s specifying an offset for each anchor position
30
+ *
31
+ * Negative offsets indicate left and up.
32
+ */
33
+ export type Offset = number | PointLike | {
34
+ [_ in PositionAnchor]: PointLike;
35
+ };
36
+
37
+ /**
38
+ * The {@link Popup} options object
39
+ */
40
+ export type PopupOptions = {
41
+ /**
42
+ * If `true`, a close button will appear in the top right corner of the popup.
43
+ * @defaultValue true
44
+ */
45
+ closeButton?: boolean;
46
+ /**
47
+ * If `true`, the popup will closed when the map is clicked.
48
+ * @defaultValue true
49
+ */
50
+ closeOnClick?: boolean;
51
+ /**
52
+ * If `true`, the popup will closed when the map moves.
53
+ * @defaultValue false
54
+ */
55
+ closeOnMove?: boolean;
56
+ /**
57
+ * If `true`, the popup will try to focus the first focusable element inside the popup.
58
+ * @defaultValue true
59
+ */
60
+ focusAfterOpen?: boolean;
61
+ /**
62
+ * A string indicating the part of the Popup that should
63
+ * be positioned closest to the coordinate set via {@link Popup#setLngLat}.
64
+ * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`,
65
+ * `'top-right'`, `'bottom-left'`, and `'bottom-right'`. If unset the anchor will be
66
+ * dynamically set to ensure the popup falls within the map container with a preference
67
+ * for `'bottom'`.
68
+ */
69
+ anchor?: PositionAnchor;
70
+ /**
71
+ * A pixel offset applied to the popup's location
72
+ */
73
+ offset?: Offset;
74
+ /**
75
+ * Space-separated CSS class names to add to popup container
76
+ */
77
+ className?: string;
78
+ /**
79
+ * A string that sets the CSS property of the popup's maximum width, eg `'300px'`.
80
+ * To ensure the popup resizes to fit its content, set this property to `'none'`.
81
+ * Available values can be found here: https://developer.mozilla.org/en-US/docs/Web/CSS/max-width
82
+ * @defaultValue '240px'
83
+ */
84
+ maxWidth?: string;
85
+ /**
86
+ * If `true`, rounding is disabled for placement of the popup, allowing for
87
+ * subpixel positioning and smoother movement when the popup is translated.
88
+ * @defaultValue false
89
+ */
90
+ subpixelPositioning?: boolean;
91
+ };
92
+
93
+ const focusQuerySelector = [
94
+ 'a[href]',
95
+ '[tabindex]:not([tabindex=\'-1\'])',
96
+ '[contenteditable]:not([contenteditable=\'false\'])',
97
+ 'button:not([disabled])',
98
+ 'input:not([disabled])',
99
+ 'select:not([disabled])',
100
+ 'textarea:not([disabled])',
101
+ ].join(', ');
102
+
103
+ /**
104
+ * A popup component.
105
+ *
106
+ * @group Markers and Controls
107
+ *
108
+ *
109
+ * @example
110
+ * Create a popup
111
+ * ```ts
112
+ * let popup = new Popup();
113
+ * // Set an event listener that will fire
114
+ * // any time the popup is opened
115
+ * popup.on('open', () => {
116
+ * console.log('popup was opened');
117
+ * });
118
+ * ```
119
+ *
120
+ * @example
121
+ * Create a popup
122
+ * ```ts
123
+ * let popup = new Popup();
124
+ * // Set an event listener that will fire
125
+ * // any time the popup is closed
126
+ * popup.on('close', () => {
127
+ * console.log('popup was closed');
128
+ * });
129
+ * ```
130
+ *
131
+ * @example
132
+ * ```ts
133
+ * let markerHeight = 50, markerRadius = 10, linearOffset = 25;
134
+ * let popupOffsets = {
135
+ * 'top': [0, 0],
136
+ * 'top-left': [0,0],
137
+ * 'top-right': [0,0],
138
+ * 'bottom': [0, -markerHeight],
139
+ * 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1],
140
+ * 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1],
141
+ * 'left': [markerRadius, (markerHeight - markerRadius) * -1],
142
+ * 'right': [-markerRadius, (markerHeight - markerRadius) * -1]
143
+ * };
144
+ * let popup = new Popup({offset: popupOffsets, className: 'my-class'})
145
+ * .setLngLat(e.lngLat)
146
+ * .setHTML("<h1>Hello World!</h1>")
147
+ * .setMaxWidth("300px")
148
+ * .addTo(map);
149
+ * ```
150
+ * @see [Display a popup](https://maplibre.org/maplibre-gl-js/docs/examples/popup/)
151
+ * @see [Display a popup on hover](https://maplibre.org/maplibre-gl-js/docs/examples/popup-on-hover/)
152
+ * @see [Display a popup on click](https://maplibre.org/maplibre-gl-js/docs/examples/popup-on-click/)
153
+ * @see [Attach a popup to a marker instance](https://maplibre.org/maplibre-gl-js/docs/examples/set-popup/)
154
+ *
155
+ * ## Events
156
+ *
157
+ * **Event** `open` of type {@link Event} will be fired when the popup is opened manually or programmatically.
158
+ *
159
+ * **Event** `close` of type {@link Event} will be fired when the popup is closed manually or programmatically.
160
+ */
161
+ export class Popup extends Evented {
162
+ _map: Map;
163
+ options: PopupOptions;
164
+ _content: HTMLElement;
165
+ _container: HTMLElement;
166
+ _closeButton: HTMLButtonElement;
167
+ _tip: HTMLElement;
168
+ _lngLat: LngLat;
169
+ _trackPointer: boolean;
170
+ _pos: Point;
171
+ _flatPos: Point;
172
+
173
+ /**
174
+ * @param options - the options
175
+ */
176
+ constructor(options?: PopupOptions) {
177
+ super();
178
+ this.options = extend(Object.create(defaultOptions), options);
179
+ }
180
+
181
+ /**
182
+ * Adds the popup to a map.
183
+ *
184
+ * @param map - The MapLibre GL JS map to add the popup to.
185
+ * @example
186
+ * ```ts
187
+ * new Popup()
188
+ * .setLngLat([0, 0])
189
+ * .setHTML("<h1>Null Island</h1>")
190
+ * .addTo(map);
191
+ * ```
192
+ * @see [Display a popup](https://maplibre.org/maplibre-gl-js/docs/examples/popup/)
193
+ * @see [Display a popup on hover](https://maplibre.org/maplibre-gl-js/docs/examples/popup-on-hover/)
194
+ * @see [Display a popup on click](https://maplibre.org/maplibre-gl-js/docs/examples/popup-on-click/)
195
+ * @see [Show polygon information on click](https://maplibre.org/maplibre-gl-js/docs/examples/polygon-popup-on-click/)
196
+ */
197
+ addTo(map: Map): this {
198
+ if (this._map) this.remove();
199
+
200
+ this._map = map;
201
+ if (this.options.closeOnClick) {
202
+ this._map.on('click', this._onClose);
203
+ }
204
+
205
+ if (this.options.closeOnMove) {
206
+ this._map.on('move', this._onClose);
207
+ }
208
+
209
+ this._map.on('remove', this.remove);
210
+ this._update();
211
+ this._focusFirstElement();
212
+
213
+ if (this._trackPointer) {
214
+ this._map.on('mousemove', this._onMouseMove);
215
+ this._map.on('mouseup', this._onMouseUp);
216
+ if (this._container) {
217
+ this._container.classList.add('maplibregl-popup-track-pointer');
218
+ }
219
+ this._map._canvasContainer.classList.add('maplibregl-track-pointer');
220
+ } else {
221
+ this._map.on('move', this._update);
222
+ }
223
+
224
+ this.fire(new Event('open'));
225
+
226
+ return this;
227
+ }
228
+
229
+ /**
230
+ * @returns `true` if the popup is open, `false` if it is closed.
231
+ */
232
+ isOpen() {
233
+ return !!this._map;
234
+ }
235
+
236
+ /**
237
+ * Removes the popup from the map it has been added to.
238
+ *
239
+ * @example
240
+ * ```ts
241
+ * let popup = new Popup().addTo(map);
242
+ * popup.remove();
243
+ * ```
244
+ */
245
+ remove = (): this => {
246
+ if (this._content) {
247
+ DOM.remove(this._content);
248
+ }
249
+
250
+ if (this._container) {
251
+ DOM.remove(this._container);
252
+ delete this._container;
253
+ }
254
+
255
+ if (this._map) {
256
+ this._map.off('move', this._update);
257
+ this._map.off('move', this._onClose);
258
+ this._map.off('click', this._onClose);
259
+ this._map.off('remove', this.remove);
260
+ this._map.off('mousemove', this._onMouseMove);
261
+ this._map.off('mouseup', this._onMouseUp);
262
+ this._map.off('drag', this._onDrag);
263
+ this._map._canvasContainer.classList.remove('maplibregl-track-pointer');
264
+ delete this._map;
265
+ this.fire(new Event('close'));
266
+ }
267
+
268
+ return this;
269
+ };
270
+
271
+ /**
272
+ * Returns the geographical location of the popup's anchor.
273
+ *
274
+ * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously
275
+ * set by `setLngLat` because `Popup` wraps the anchor longitude across copies of the world to keep
276
+ * the popup on screen.
277
+ *
278
+ * @returns The geographical location of the popup's anchor.
279
+ */
280
+ getLngLat(): LngLat {
281
+ return this._lngLat;
282
+ }
283
+
284
+ /**
285
+ * Sets the geographical location of the popup's anchor, and moves the popup to it. Replaces trackPointer() behavior.
286
+ *
287
+ * @param lnglat - The geographical location to set as the popup's anchor.
288
+ */
289
+ setLngLat(lnglat: LngLatLike): this {
290
+ this._lngLat = LngLat.convert(lnglat);
291
+ this._pos = null;
292
+ this._flatPos = null;
293
+
294
+ this._trackPointer = false;
295
+
296
+ this._update();
297
+
298
+ if (this._map) {
299
+ this._map.on('move', this._update);
300
+ this._map.off('mousemove', this._onMouseMove);
301
+ if (this._container) {
302
+ this._container.classList.remove('maplibregl-popup-track-pointer');
303
+ }
304
+ this._map._canvasContainer.classList.remove('maplibregl-track-pointer');
305
+ }
306
+
307
+ return this;
308
+ }
309
+
310
+ /**
311
+ * Tracks the popup anchor to the cursor position on screens with a pointer device (it will be hidden on touchscreens). Replaces the `setLngLat` behavior.
312
+ * For most use cases, set `closeOnClick` and `closeButton` to `false`.
313
+ * @example
314
+ * ```ts
315
+ * let popup = new Popup({ closeOnClick: false, closeButton: false })
316
+ * .setHTML("<h1>Hello World!</h1>")
317
+ * .trackPointer()
318
+ * .addTo(map);
319
+ * ```
320
+ */
321
+ trackPointer(): this {
322
+ this._trackPointer = true;
323
+ this._pos = null;
324
+ this._flatPos = null;
325
+ this._update();
326
+ if (this._map) {
327
+ this._map.off('move', this._update);
328
+ this._map.on('mousemove', this._onMouseMove);
329
+ this._map.on('drag', this._onDrag);
330
+ if (this._container) {
331
+ this._container.classList.add('maplibregl-popup-track-pointer');
332
+ }
333
+ this._map._canvasContainer.classList.add('maplibregl-track-pointer');
334
+ }
335
+
336
+ return this;
337
+
338
+ }
339
+
340
+ /**
341
+ * Returns the `Popup`'s HTML element.
342
+ * @example
343
+ * Change the `Popup` element's font size
344
+ * ```ts
345
+ * let popup = new Popup()
346
+ * .setLngLat([-96, 37.8])
347
+ * .setHTML("<p>Hello World!</p>")
348
+ * .addTo(map);
349
+ * let popupElem = popup.getElement();
350
+ * popupElem.style.fontSize = "25px";
351
+ * ```
352
+ * @returns element
353
+ */
354
+ getElement(): HTMLElement {
355
+ return this._container;
356
+ }
357
+
358
+ /**
359
+ * Sets the popup's content to a string of text.
360
+ *
361
+ * This function creates a [Text](https://developer.mozilla.org/en-US/docs/Web/API/Text) node in the DOM,
362
+ * so it cannot insert raw HTML. Use this method for security against XSS
363
+ * if the popup content is user-provided.
364
+ *
365
+ * @param text - Textual content for the popup.
366
+ * @example
367
+ * ```ts
368
+ * let popup = new Popup()
369
+ * .setLngLat(e.lngLat)
370
+ * .setText('Hello, world!')
371
+ * .addTo(map);
372
+ * ```
373
+ */
374
+ setText(text: string): this {
375
+ return this.setDOMContent(document.createTextNode(text));
376
+ }
377
+
378
+ /**
379
+ * Sets the popup's content to the HTML provided as a string.
380
+ *
381
+ * This method does not perform HTML filtering or sanitization, and must be
382
+ * used only with trusted content. Consider {@link Popup#setText} if
383
+ * the content is an untrusted text string.
384
+ *
385
+ * @param html - A string representing HTML content for the popup.
386
+ * @example
387
+ * ```ts
388
+ * let popup = new Popup()
389
+ * .setLngLat(e.lngLat)
390
+ * .setHTML("<h1>Hello World!</h1>")
391
+ * .addTo(map);
392
+ * ```
393
+ * @see [Display a popup](https://maplibre.org/maplibre-gl-js/docs/examples/popup/)
394
+ * @see [Display a popup on hover](https://maplibre.org/maplibre-gl-js/docs/examples/popup-on-hover/)
395
+ * @see [Display a popup on click](https://maplibre.org/maplibre-gl-js/docs/examples/popup-on-click/)
396
+ * @see [Attach a popup to a marker instance](https://maplibre.org/maplibre-gl-js/docs/examples/set-popup/)
397
+ */
398
+ setHTML(html: string): this {
399
+ const frag = document.createDocumentFragment();
400
+ const temp = document.createElement('body');
401
+ let child;
402
+ temp.innerHTML = html;
403
+ while (true) {
404
+ child = temp.firstChild;
405
+ if (!child) break;
406
+ frag.appendChild(child);
407
+ }
408
+
409
+ return this.setDOMContent(frag);
410
+ }
411
+
412
+ /**
413
+ * Returns the popup's maximum width.
414
+ *
415
+ * @returns The maximum width of the popup.
416
+ */
417
+ getMaxWidth(): string {
418
+ return this._container?.style.maxWidth;
419
+ }
420
+
421
+ /**
422
+ * Sets the popup's maximum width. This is setting the CSS property `max-width`.
423
+ * Available values can be found here: https://developer.mozilla.org/en-US/docs/Web/CSS/max-width
424
+ *
425
+ * @param maxWidth - A string representing the value for the maximum width.
426
+ */
427
+ setMaxWidth(maxWidth: string): this {
428
+ this.options.maxWidth = maxWidth;
429
+ this._update();
430
+ return this;
431
+ }
432
+
433
+ /**
434
+ * Sets the popup's content to the element provided as a DOM node.
435
+ *
436
+ * @param htmlNode - A DOM node to be used as content for the popup.
437
+ * @example
438
+ * Create an element with the popup content
439
+ * ```ts
440
+ * let div = document.createElement('div');
441
+ * div.innerHTML = 'Hello, world!';
442
+ * let popup = new Popup()
443
+ * .setLngLat(e.lngLat)
444
+ * .setDOMContent(div)
445
+ * .addTo(map);
446
+ * ```
447
+ */
448
+ setDOMContent(htmlNode: Node): this {
449
+ if (this._content) {
450
+ // Clear out children first.
451
+ while (this._content.hasChildNodes()) {
452
+ if (this._content.firstChild) {
453
+ this._content.removeChild(this._content.firstChild);
454
+ }
455
+ }
456
+ } else {
457
+ this._content = DOM.create('div', 'maplibregl-popup-content', this._container);
458
+ }
459
+
460
+ // The close button should be the last tabbable element inside the popup for a good keyboard UX.
461
+ this._content.appendChild(htmlNode);
462
+ this._createCloseButton();
463
+ this._update();
464
+ this._focusFirstElement();
465
+ return this;
466
+ }
467
+
468
+ /**
469
+ * Adds a CSS class to the popup container element.
470
+ *
471
+ * @param className - Non-empty string with CSS class name to add to popup container
472
+ *
473
+ * @example
474
+ * ```ts
475
+ * let popup = new Popup()
476
+ * popup.addClassName('some-class')
477
+ * ```
478
+ */
479
+ addClassName(className: string) {
480
+ if (this._container) {
481
+ this._container.classList.add(className);
482
+ }
483
+ return this;
484
+ }
485
+
486
+ /**
487
+ * Removes a CSS class from the popup container element.
488
+ *
489
+ * @param className - Non-empty string with CSS class name to remove from popup container
490
+ *
491
+ * @example
492
+ * ```ts
493
+ * let popup = new Popup()
494
+ * popup.removeClassName('some-class')
495
+ * ```
496
+ */
497
+ removeClassName(className: string) {
498
+ if (this._container) {
499
+ this._container.classList.remove(className);
500
+ }
501
+ return this;
502
+ }
503
+
504
+ /**
505
+ * Sets the popup's offset.
506
+ *
507
+ * @param offset - Sets the popup's offset.
508
+ */
509
+ setOffset (offset?: Offset): this {
510
+ this.options.offset = offset;
511
+ this._update();
512
+ return this;
513
+ }
514
+
515
+ /**
516
+ * Add or remove the given CSS class on the popup container, depending on whether the container currently has that class.
517
+ *
518
+ * @param className - Non-empty string with CSS class name to add/remove
519
+ *
520
+ * @returns if the class was removed return false, if class was added, then return true, undefined if there is no container
521
+ *
522
+ * @example
523
+ * ```ts
524
+ * let popup = new Popup()
525
+ * popup.toggleClassName('toggleClass')
526
+ * ```
527
+ */
528
+ toggleClassName(className: string): boolean | undefined {
529
+ if (this._container) {
530
+ return this._container.classList.toggle(className);
531
+ }
532
+ }
533
+
534
+ /**
535
+ * Set the option to allow subpixel positioning of the popup by passing a boolean
536
+ *
537
+ * @param value - When boolean is true, subpixel positioning is enabled for the popup.
538
+ *
539
+ * @example
540
+ * ```ts
541
+ * let popup = new Popup()
542
+ * popup.setSubpixelPositioning(true);
543
+ * ```
544
+ */
545
+ setSubpixelPositioning(value: boolean) {
546
+ this.options.subpixelPositioning = value;
547
+ }
548
+
549
+ _createCloseButton() {
550
+ if (this.options.closeButton) {
551
+ this._closeButton = DOM.create('button', 'maplibregl-popup-close-button', this._content);
552
+ this._closeButton.type = 'button';
553
+ this._closeButton.innerHTML = '&#215;';
554
+ this._closeButton.addEventListener('click', this._onClose);
555
+ }
556
+ }
557
+
558
+ _onMouseUp = (event: MapMouseEvent) => {
559
+ this._update(event.point);
560
+ };
561
+
562
+ _onMouseMove = (event: MapMouseEvent) => {
563
+ this._update(event.point);
564
+ };
565
+
566
+ _onDrag = (event: MapMouseEvent) => {
567
+ this._update(event.point);
568
+ };
569
+
570
+ _update = (cursor?: Point) => {
571
+ const hasPosition = this._lngLat || this._trackPointer;
572
+
573
+ if (!this._map || !hasPosition || !this._content) { return; }
574
+
575
+ if (!this._container) {
576
+ this._container = DOM.create('div', 'maplibregl-popup', this._map.getContainer());
577
+ // Same fix as Marker: positioned via a raw pixel translate() in
578
+ // _update() below, which assumes LTR. Pin direction so an RTL
579
+ // page doesn't mirror the popup's placement. — Scoova fix,
580
+ // upstream MapLibre GL JS v4.7.1 base.
581
+ this._container.style.direction = 'ltr';
582
+ this._tip = DOM.create('div', 'maplibregl-popup-tip', this._container);
583
+ this._container.appendChild(this._content);
584
+ if (this.options.className) {
585
+ for (const name of this.options.className.split(' ')) {
586
+ this._container.classList.add(name);
587
+ }
588
+ }
589
+
590
+ if (this._closeButton) {
591
+ this._closeButton.setAttribute('aria-label', this._map._getUIString('Popup.Close'));
592
+ }
593
+
594
+ if (this._trackPointer) {
595
+ this._container.classList.add('maplibregl-popup-track-pointer');
596
+ }
597
+ }
598
+
599
+ if (this.options.maxWidth && this._container.style.maxWidth !== this.options.maxWidth) {
600
+ this._container.style.maxWidth = this.options.maxWidth;
601
+ }
602
+
603
+ if (this._map.transform.renderWorldCopies && !this._trackPointer) {
604
+ this._lngLat = smartWrap(this._lngLat, this._flatPos, this._map.transform);
605
+ } else {
606
+ this._lngLat = this._lngLat?.wrap();
607
+ }
608
+
609
+ if (this._trackPointer && !cursor) return;
610
+
611
+ const pos = this._flatPos = this._pos = this._trackPointer && cursor ? cursor : this._map.project(this._lngLat);
612
+ if (this._map.terrain) {
613
+ // flat position is saved because smartWrap needs non-elevated points
614
+ this._flatPos = this._trackPointer && cursor ? cursor : this._map.transform.locationPoint(this._lngLat);
615
+ }
616
+
617
+ let anchor = this.options.anchor;
618
+ const offset = normalizeOffset(this.options.offset);
619
+
620
+ if (!anchor) {
621
+ const width = this._container.offsetWidth;
622
+ const height = this._container.offsetHeight;
623
+ let anchorComponents;
624
+
625
+ if (pos.y + offset.bottom.y < height) {
626
+ anchorComponents = ['top'];
627
+ } else if (pos.y > this._map.transform.height - height) {
628
+ anchorComponents = ['bottom'];
629
+ } else {
630
+ anchorComponents = [];
631
+ }
632
+
633
+ if (pos.x < width / 2) {
634
+ anchorComponents.push('left');
635
+ } else if (pos.x > this._map.transform.width - width / 2) {
636
+ anchorComponents.push('right');
637
+ }
638
+
639
+ if (anchorComponents.length === 0) {
640
+ anchor = 'bottom';
641
+ } else {
642
+ anchor = (anchorComponents.join('-') as any);
643
+ }
644
+ }
645
+
646
+ let offsetedPos = pos.add(offset[anchor]);
647
+
648
+ if (!this.options.subpixelPositioning) {
649
+ offsetedPos = offsetedPos.round();
650
+ }
651
+
652
+ DOM.setTransform(this._container, `${anchorTranslate[anchor]} translate(${offsetedPos.x}px,${offsetedPos.y}px)`);
653
+ applyAnchorClass(this._container, anchor, 'popup');
654
+ };
655
+
656
+ _focusFirstElement() {
657
+ if (!this.options.focusAfterOpen || !this._container) return;
658
+
659
+ const firstFocusable = this._container.querySelector(focusQuerySelector) as HTMLElement;
660
+
661
+ if (firstFocusable) firstFocusable.focus();
662
+ }
663
+
664
+ _onClose = () => {
665
+ this.remove();
666
+ };
667
+ }
668
+
669
+ function normalizeOffset(offset?: Offset | null) {
670
+ if (!offset) {
671
+ return normalizeOffset(new Point(0, 0));
672
+
673
+ } else if (typeof offset === 'number') {
674
+ // input specifies a radius from which to calculate offsets at all positions
675
+ const cornerOffset = Math.round(Math.abs(offset) / Math.SQRT2);
676
+ return {
677
+ 'center': new Point(0, 0),
678
+ 'top': new Point(0, offset),
679
+ 'top-left': new Point(cornerOffset, cornerOffset),
680
+ 'top-right': new Point(-cornerOffset, cornerOffset),
681
+ 'bottom': new Point(0, -offset),
682
+ 'bottom-left': new Point(cornerOffset, -cornerOffset),
683
+ 'bottom-right': new Point(-cornerOffset, -cornerOffset),
684
+ 'left': new Point(offset, 0),
685
+ 'right': new Point(-offset, 0)
686
+ };
687
+
688
+ } else if (offset instanceof Point || Array.isArray(offset)) {
689
+ // input specifies a single offset to be applied to all positions
690
+ const convertedOffset = Point.convert(offset);
691
+ return {
692
+ 'center': convertedOffset,
693
+ 'top': convertedOffset,
694
+ 'top-left': convertedOffset,
695
+ 'top-right': convertedOffset,
696
+ 'bottom': convertedOffset,
697
+ 'bottom-left': convertedOffset,
698
+ 'bottom-right': convertedOffset,
699
+ 'left': convertedOffset,
700
+ 'right': convertedOffset
701
+ };
702
+
703
+ } else {
704
+ // input specifies an offset per position
705
+ return {
706
+ 'center': Point.convert(offset['center'] || [0, 0]),
707
+ 'top': Point.convert(offset['top'] || [0, 0]),
708
+ 'top-left': Point.convert(offset['top-left'] || [0, 0]),
709
+ 'top-right': Point.convert(offset['top-right'] || [0, 0]),
710
+ 'bottom': Point.convert(offset['bottom'] || [0, 0]),
711
+ 'bottom-left': Point.convert(offset['bottom-left'] || [0, 0]),
712
+ 'bottom-right': Point.convert(offset['bottom-right'] || [0, 0]),
713
+ 'left': Point.convert(offset['left'] || [0, 0]),
714
+ 'right': Point.convert(offset['right'] || [0, 0])
715
+ };
716
+ }
717
+ }