@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.
- package/LICENSE.txt +116 -0
- package/README.md +174 -0
- package/build/banner.ts +12 -0
- package/build/bump-version-changelog.js +26 -0
- package/build/check-bundle-size.js +77 -0
- package/build/generate-dist-package.js +26 -0
- package/build/generate-doc-images.ts +78 -0
- package/build/generate-docs.ts +190 -0
- package/build/generate-shaders.ts +68 -0
- package/build/generate-struct-arrays.ts +438 -0
- package/build/generate-style-code.ts +283 -0
- package/build/readme.md +56 -0
- package/build/release-notes.js +45 -0
- package/build/rollup/bundle_prelude.js +29 -0
- package/build/rollup/maplibregl.js +22 -0
- package/build/rollup_plugins.ts +58 -0
- package/dist/LICENSE.txt +116 -0
- package/dist/maplibre-gl.css +1 -0
- package/dist/maplibre-gl.d.ts +13304 -0
- package/dist/maplibre-gl.js +59 -0
- package/dist/maplibre-gl.js.map +1 -0
- package/dist/package.json +1 -0
- package/package.json +192 -0
- package/src/css/maplibre-gl.css +854 -0
- package/src/css/svg/maplibregl-ctrl-attrib.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-compass.svg +4 -0
- package/src/css/svg/maplibregl-ctrl-fullscreen.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-geolocate.svg +5 -0
- package/src/css/svg/maplibregl-ctrl-logo.svg +11 -0
- package/src/css/svg/maplibregl-ctrl-shrink.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-terrain.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-zoom-in.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-zoom-out.svg +3 -0
- package/src/data/array_types.g.ts +1130 -0
- package/src/data/bucket/circle_attributes.ts +8 -0
- package/src/data/bucket/circle_bucket.ts +197 -0
- package/src/data/bucket/fill_attributes.ts +8 -0
- package/src/data/bucket/fill_bucket.test.ts +95 -0
- package/src/data/bucket/fill_bucket.ts +228 -0
- package/src/data/bucket/fill_extrusion_attributes.ts +13 -0
- package/src/data/bucket/fill_extrusion_bucket.ts +305 -0
- package/src/data/bucket/heatmap_bucket.ts +12 -0
- package/src/data/bucket/line_attributes.ts +8 -0
- package/src/data/bucket/line_attributes_ext.ts +8 -0
- package/src/data/bucket/line_bucket.test.ts +142 -0
- package/src/data/bucket/line_bucket.ts +592 -0
- package/src/data/bucket/pattern_attributes.ts +9 -0
- package/src/data/bucket/pattern_bucket_features.ts +57 -0
- package/src/data/bucket/symbol_attributes.ts +122 -0
- package/src/data/bucket/symbol_bucket.test.ts +243 -0
- package/src/data/bucket/symbol_bucket.ts +975 -0
- package/src/data/bucket.ts +123 -0
- package/src/data/dem_data.test.ts +237 -0
- package/src/data/dem_data.ts +171 -0
- package/src/data/evaluation_feature.ts +18 -0
- package/src/data/extent.ts +13 -0
- package/src/data/feature_index.ts +337 -0
- package/src/data/feature_position_map.test.ts +33 -0
- package/src/data/feature_position_map.ts +126 -0
- package/src/data/index_array_type.ts +9 -0
- package/src/data/load_geometry.test.ts +49 -0
- package/src/data/load_geometry.ts +44 -0
- package/src/data/pos3d_attributes.ts +5 -0
- package/src/data/pos_attributes.ts +5 -0
- package/src/data/program_configuration.ts +735 -0
- package/src/data/raster_bounds_attributes.ts +6 -0
- package/src/data/segment.ts +89 -0
- package/src/geo/edge_insets.test.ts +83 -0
- package/src/geo/edge_insets.ts +146 -0
- package/src/geo/lng_lat.test.ts +65 -0
- package/src/geo/lng_lat.ts +169 -0
- package/src/geo/lng_lat_bounds.test.ts +357 -0
- package/src/geo/lng_lat_bounds.ts +356 -0
- package/src/geo/mercator_coordinate.test.ts +34 -0
- package/src/geo/mercator_coordinate.ts +157 -0
- package/src/geo/projection/projection.ts +72 -0
- package/src/geo/transform.test.ts +509 -0
- package/src/geo/transform.ts +1072 -0
- package/src/gl/color_mode.ts +31 -0
- package/src/gl/context.ts +321 -0
- package/src/gl/cull_face_mode.ts +22 -0
- package/src/gl/depth_mode.ts +26 -0
- package/src/gl/framebuffer.ts +48 -0
- package/src/gl/index_buffer.ts +55 -0
- package/src/gl/render_pool.test.ts +69 -0
- package/src/gl/render_pool.ts +93 -0
- package/src/gl/state.test.ts +125 -0
- package/src/gl/stencil_mode.ts +27 -0
- package/src/gl/types.ts +59 -0
- package/src/gl/value.ts +534 -0
- package/src/gl/vertex_buffer.test.ts +57 -0
- package/src/gl/vertex_buffer.ts +111 -0
- package/src/gl/webgl2.ts +12 -0
- package/src/index.test.ts +121 -0
- package/src/index.ts +250 -0
- package/src/render/draw_background.ts +53 -0
- package/src/render/draw_circle.ts +113 -0
- package/src/render/draw_collision_debug.ts +168 -0
- package/src/render/draw_custom.test.ts +73 -0
- package/src/render/draw_custom.ts +45 -0
- package/src/render/draw_debug.test.ts +122 -0
- package/src/render/draw_debug.ts +148 -0
- package/src/render/draw_fill.test.ts +137 -0
- package/src/render/draw_fill.ts +128 -0
- package/src/render/draw_fill_extrusion.ts +97 -0
- package/src/render/draw_heatmap.ts +228 -0
- package/src/render/draw_hillshade.ts +119 -0
- package/src/render/draw_line.ts +125 -0
- package/src/render/draw_raster.ts +133 -0
- package/src/render/draw_sky.ts +44 -0
- package/src/render/draw_symbol.test.ts +223 -0
- package/src/render/draw_symbol.ts +499 -0
- package/src/render/draw_terrain.ts +99 -0
- package/src/render/glyph_atlas.ts +83 -0
- package/src/render/glyph_manager.test.ts +147 -0
- package/src/render/glyph_manager.ts +198 -0
- package/src/render/image_atlas.ts +159 -0
- package/src/render/image_manager.ts +337 -0
- package/src/render/line_atlas.test.ts +38 -0
- package/src/render/line_atlas.ts +214 -0
- package/src/render/mesh.ts +25 -0
- package/src/render/painter.test.ts +51 -0
- package/src/render/painter.ts +666 -0
- package/src/render/program/background_program.ts +100 -0
- package/src/render/program/circle_program.ts +61 -0
- package/src/render/program/clipping_mask_program.ts +19 -0
- package/src/render/program/collision_program.ts +47 -0
- package/src/render/program/debug_program.ts +29 -0
- package/src/render/program/fill_extrusion_program.ts +120 -0
- package/src/render/program/fill_program.ts +121 -0
- package/src/render/program/heatmap_program.ts +76 -0
- package/src/render/program/hillshade_program.ts +116 -0
- package/src/render/program/line_program.ts +207 -0
- package/src/render/program/pattern.ts +102 -0
- package/src/render/program/program_uniforms.ts +46 -0
- package/src/render/program/raster_program.ts +88 -0
- package/src/render/program/sky_program.ts +28 -0
- package/src/render/program/symbol_program.ts +266 -0
- package/src/render/program/terrain_program.ts +116 -0
- package/src/render/program.ts +233 -0
- package/src/render/render_to_texture.test.ts +151 -0
- package/src/render/render_to_texture.ts +197 -0
- package/src/render/terrain.test.ts +322 -0
- package/src/render/terrain.ts +464 -0
- package/src/render/texture.ts +114 -0
- package/src/render/uniform_binding.test.ts +122 -0
- package/src/render/uniform_binding.ts +157 -0
- package/src/render/update_pattern_positions_in_program.test.ts +74 -0
- package/src/render/update_pattern_positions_in_program.ts +50 -0
- package/src/render/vertex_array_object.ts +163 -0
- package/src/shaders/README.md +42 -0
- package/src/shaders/_prelude.fragment.glsl +19 -0
- package/src/shaders/_prelude.fragment.glsl.g.ts +2 -0
- package/src/shaders/_prelude.vertex.glsl +148 -0
- package/src/shaders/_prelude.vertex.glsl.g.ts +2 -0
- package/src/shaders/background.fragment.glsl +10 -0
- package/src/shaders/background.fragment.glsl.g.ts +2 -0
- package/src/shaders/background.vertex.glsl +7 -0
- package/src/shaders/background.vertex.glsl.g.ts +2 -0
- package/src/shaders/background_pattern.fragment.glsl +28 -0
- package/src/shaders/background_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/background_pattern.vertex.glsl +19 -0
- package/src/shaders/background_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/circle.fragment.glsl +34 -0
- package/src/shaders/circle.fragment.glsl.g.ts +2 -0
- package/src/shaders/circle.vertex.glsl +68 -0
- package/src/shaders/circle.vertex.glsl.g.ts +2 -0
- package/src/shaders/clipping_mask.fragment.glsl +3 -0
- package/src/shaders/clipping_mask.fragment.glsl.g.ts +2 -0
- package/src/shaders/clipping_mask.vertex.glsl +7 -0
- package/src/shaders/clipping_mask.vertex.glsl.g.ts +2 -0
- package/src/shaders/collision_box.fragment.glsl +20 -0
- package/src/shaders/collision_box.fragment.glsl.g.ts +2 -0
- package/src/shaders/collision_box.vertex.glsl +27 -0
- package/src/shaders/collision_box.vertex.glsl.g.ts +2 -0
- package/src/shaders/collision_circle.fragment.glsl +17 -0
- package/src/shaders/collision_circle.fragment.glsl.g.ts +2 -0
- package/src/shaders/collision_circle.vertex.glsl +59 -0
- package/src/shaders/collision_circle.vertex.glsl.g.ts +2 -0
- package/src/shaders/debug.fragment.glsl +9 -0
- package/src/shaders/debug.fragment.glsl.g.ts +2 -0
- package/src/shaders/debug.vertex.glsl +12 -0
- package/src/shaders/debug.vertex.glsl.g.ts +2 -0
- package/src/shaders/encode_attribute.test.ts +11 -0
- package/src/shaders/encode_attribute.ts +13 -0
- package/src/shaders/fill.fragment.glsl +13 -0
- package/src/shaders/fill.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill.vertex.glsl +13 -0
- package/src/shaders/fill.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion.fragment.glsl +9 -0
- package/src/shaders/fill_extrusion.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion.vertex.glsl +84 -0
- package/src/shaders/fill_extrusion.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion_pattern.fragment.glsl +47 -0
- package/src/shaders/fill_extrusion_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion_pattern.vertex.glsl +96 -0
- package/src/shaders/fill_extrusion_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_outline.fragment.glsl +17 -0
- package/src/shaders/fill_outline.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_outline.vertex.glsl +17 -0
- package/src/shaders/fill_outline.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
- package/src/shaders/fill_outline_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
- package/src/shaders/fill_outline_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_pattern.fragment.glsl +39 -0
- package/src/shaders/fill_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_pattern.vertex.glsl +39 -0
- package/src/shaders/fill_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/heatmap.fragment.glsl +22 -0
- package/src/shaders/heatmap.fragment.glsl.g.ts +2 -0
- package/src/shaders/heatmap.vertex.glsl +54 -0
- package/src/shaders/heatmap.vertex.glsl.g.ts +2 -0
- package/src/shaders/heatmap_texture.fragment.glsl +15 -0
- package/src/shaders/heatmap_texture.fragment.glsl.g.ts +2 -0
- package/src/shaders/heatmap_texture.vertex.glsl +11 -0
- package/src/shaders/heatmap_texture.vertex.glsl.g.ts +2 -0
- package/src/shaders/hillshade.fragment.glsl +52 -0
- package/src/shaders/hillshade.fragment.glsl.g.ts +2 -0
- package/src/shaders/hillshade.vertex.glsl +11 -0
- package/src/shaders/hillshade.vertex.glsl.g.ts +2 -0
- package/src/shaders/hillshade_prepare.fragment.glsl +77 -0
- package/src/shaders/hillshade_prepare.fragment.glsl.g.ts +2 -0
- package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
- package/src/shaders/hillshade_prepare.vertex.glsl.g.ts +2 -0
- package/src/shaders/line.fragment.glsl +30 -0
- package/src/shaders/line.fragment.glsl.g.ts +2 -0
- package/src/shaders/line.vertex.glsl +89 -0
- package/src/shaders/line.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_gradient.fragment.glsl +34 -0
- package/src/shaders/line_gradient.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_gradient.vertex.glsl +92 -0
- package/src/shaders/line_gradient.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_pattern.fragment.glsl +77 -0
- package/src/shaders/line_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_pattern.vertex.glsl +103 -0
- package/src/shaders/line_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_sdf.fragment.glsl +45 -0
- package/src/shaders/line_sdf.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_sdf.vertex.glsl +101 -0
- package/src/shaders/line_sdf.vertex.glsl.g.ts +2 -0
- package/src/shaders/raster.fragment.glsl +53 -0
- package/src/shaders/raster.fragment.glsl.g.ts +2 -0
- package/src/shaders/raster.vertex.glsl +21 -0
- package/src/shaders/raster.vertex.glsl.g.ts +2 -0
- package/src/shaders/shaders.ts +197 -0
- package/src/shaders/sky.fragment.glsl +17 -0
- package/src/shaders/sky.fragment.glsl.g.ts +2 -0
- package/src/shaders/sky.vertex.glsl +5 -0
- package/src/shaders/sky.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_icon.fragment.glsl +17 -0
- package/src/shaders/symbol_icon.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_icon.vertex.glsl +117 -0
- package/src/shaders/symbol_icon.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_sdf.fragment.glsl +58 -0
- package/src/shaders/symbol_sdf.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_sdf.vertex.glsl +142 -0
- package/src/shaders/symbol_sdf.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
- package/src/shaders/symbol_text_and_icon.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_text_and_icon.vertex.glsl +140 -0
- package/src/shaders/symbol_text_and_icon.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain.fragment.glsl +32 -0
- package/src/shaders/terrain.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain.vertex.glsl +17 -0
- package/src/shaders/terrain.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain_coords.fragment.glsl +11 -0
- package/src/shaders/terrain_coords.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain_coords.vertex.glsl +13 -0
- package/src/shaders/terrain_coords.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain_depth.fragment.glsl +15 -0
- package/src/shaders/terrain_depth.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain_depth.vertex.glsl +13 -0
- package/src/shaders/terrain_depth.vertex.glsl.g.ts +2 -0
- package/src/source/canvas_source.test.ts +210 -0
- package/src/source/canvas_source.ts +227 -0
- package/src/source/geojson_source.test.ts +492 -0
- package/src/source/geojson_source.ts +431 -0
- package/src/source/geojson_source_diff.test.ts +364 -0
- package/src/source/geojson_source_diff.ts +172 -0
- package/src/source/geojson_worker_source.test.ts +399 -0
- package/src/source/geojson_worker_source.ts +303 -0
- package/src/source/geojson_wrapper.test.ts +32 -0
- package/src/source/geojson_wrapper.ts +81 -0
- package/src/source/image_source.test.ts +235 -0
- package/src/source/image_source.ts +338 -0
- package/src/source/load_tilejson.ts +47 -0
- package/src/source/pixels_to_tile_units.ts +25 -0
- package/src/source/protocol_crud.ts +48 -0
- package/src/source/query_features.test.ts +31 -0
- package/src/source/query_features.ts +252 -0
- package/src/source/raster_dem_tile_source.test.ts +158 -0
- package/src/source/raster_dem_tile_source.ts +166 -0
- package/src/source/raster_dem_tile_worker_source.test.ts +36 -0
- package/src/source/raster_dem_tile_worker_source.ts +38 -0
- package/src/source/raster_tile_source.test.ts +206 -0
- package/src/source/raster_tile_source.ts +227 -0
- package/src/source/rtl_text_plugin_main_thread.test.ts +170 -0
- package/src/source/rtl_text_plugin_main_thread.ts +89 -0
- package/src/source/rtl_text_plugin_status.ts +33 -0
- package/src/source/rtl_text_plugin_worker.ts +49 -0
- package/src/source/source.test.ts +41 -0
- package/src/source/source.ts +186 -0
- package/src/source/source_cache.test.ts +2069 -0
- package/src/source/source_cache.ts +1102 -0
- package/src/source/source_state.ts +157 -0
- package/src/source/terrain_source_cache.test.ts +105 -0
- package/src/source/terrain_source_cache.ts +204 -0
- package/src/source/tile.test.ts +290 -0
- package/src/source/tile.ts +478 -0
- package/src/source/tile_bounds.ts +34 -0
- package/src/source/tile_cache.test.ts +130 -0
- package/src/source/tile_cache.ts +208 -0
- package/src/source/tile_id.test.ts +112 -0
- package/src/source/tile_id.ts +221 -0
- package/src/source/vector_tile_source.test.ts +401 -0
- package/src/source/vector_tile_source.ts +283 -0
- package/src/source/vector_tile_worker_source.test.ts +396 -0
- package/src/source/vector_tile_worker_source.ts +199 -0
- package/src/source/video_source.test.ts +124 -0
- package/src/source/video_source.ts +204 -0
- package/src/source/worker.test.ts +233 -0
- package/src/source/worker.ts +301 -0
- package/src/source/worker_source.ts +117 -0
- package/src/source/worker_tile.test.ts +226 -0
- package/src/source/worker_tile.ts +208 -0
- package/src/style/create_style_layer.ts +39 -0
- package/src/style/evaluation_parameters.ts +62 -0
- package/src/style/format_section_override.test.ts +62 -0
- package/src/style/format_section_override.ts +50 -0
- package/src/style/light.test.ts +86 -0
- package/src/style/light.ts +135 -0
- package/src/style/load_glyph_range.test.ts +40 -0
- package/src/style/load_glyph_range.ts +32 -0
- package/src/style/load_sprite.test.ts +227 -0
- package/src/style/load_sprite.ts +71 -0
- package/src/style/parse_glyph_pbf.ts +42 -0
- package/src/style/pauseable_placement.ts +138 -0
- package/src/style/properties.ts +726 -0
- package/src/style/query_utils.test.ts +107 -0
- package/src/style/query_utils.ts +70 -0
- package/src/style/sky.ts +127 -0
- package/src/style/style.test.ts +2654 -0
- package/src/style/style.ts +1814 -0
- package/src/style/style_glyph.ts +25 -0
- package/src/style/style_image.ts +188 -0
- package/src/style/style_layer/background_style_layer.ts +17 -0
- package/src/style/style_layer/background_style_layer_properties.g.ts +40 -0
- package/src/style/style_layer/circle_style_layer.ts +98 -0
- package/src/style/style_layer/circle_style_layer_properties.g.ts +76 -0
- package/src/style/style_layer/custom_style_layer.ts +233 -0
- package/src/style/style_layer/fill_extrusion_style_layer.ts +224 -0
- package/src/style/style_layer/fill_extrusion_style_layer_properties.g.ts +55 -0
- package/src/style/style_layer/fill_style_layer.test.ts +37 -0
- package/src/style/style_layer/fill_style_layer.ts +65 -0
- package/src/style/style_layer/fill_style_layer_properties.g.ts +64 -0
- package/src/style/style_layer/heatmap_style_layer.ts +74 -0
- package/src/style/style_layer/heatmap_style_layer_properties.g.ts +46 -0
- package/src/style/style_layer/hillshade_style_layer.ts +21 -0
- package/src/style/style_layer/hillshade_style_layer_properties.g.ts +49 -0
- package/src/style/style_layer/line_style_layer.test.ts +50 -0
- package/src/style/style_layer/line_style_layer.ts +131 -0
- package/src/style/style_layer/line_style_layer_properties.g.ts +88 -0
- package/src/style/style_layer/overlap_mode.test.ts +57 -0
- package/src/style/style_layer/overlap_mode.ts +25 -0
- package/src/style/style_layer/raster_style_layer.ts +17 -0
- package/src/style/style_layer/raster_style_layer_properties.g.ts +55 -0
- package/src/style/style_layer/symbol_style_layer.ts +195 -0
- package/src/style/style_layer/symbol_style_layer_properties.g.ts +218 -0
- package/src/style/style_layer/typed_style_layer.ts +9 -0
- package/src/style/style_layer/variable_text_anchor.test.ts +117 -0
- package/src/style/style_layer/variable_text_anchor.ts +163 -0
- package/src/style/style_layer.test.ts +372 -0
- package/src/style/style_layer.ts +287 -0
- package/src/style/style_layer_index.test.ts +99 -0
- package/src/style/style_layer_index.ts +78 -0
- package/src/style/validate_style.ts +53 -0
- package/src/style/zoom_history.ts +40 -0
- package/src/symbol/anchor.test.ts +14 -0
- package/src/symbol/anchor.ts +22 -0
- package/src/symbol/check_max_angle.test.ts +54 -0
- package/src/symbol/check_max_angle.ts +76 -0
- package/src/symbol/clip_line.test.ts +154 -0
- package/src/symbol/clip_line.ts +66 -0
- package/src/symbol/collision_feature.test.ts +98 -0
- package/src/symbol/collision_feature.ts +114 -0
- package/src/symbol/collision_index.test.ts +19 -0
- package/src/symbol/collision_index.ts +618 -0
- package/src/symbol/cross_tile_symbol_index.test.ts +260 -0
- package/src/symbol/cross_tile_symbol_index.ts +367 -0
- package/src/symbol/get_anchors.test.ts +113 -0
- package/src/symbol/get_anchors.ts +167 -0
- package/src/symbol/grid_index.test.ts +75 -0
- package/src/symbol/grid_index.ts +414 -0
- package/src/symbol/merge_lines.test.ts +30 -0
- package/src/symbol/merge_lines.ts +80 -0
- package/src/symbol/one_em.ts +3 -0
- package/src/symbol/opacity_state.ts +23 -0
- package/src/symbol/path_interpolator.test.ts +134 -0
- package/src/symbol/path_interpolator.ts +55 -0
- package/src/symbol/placement.ts +1371 -0
- package/src/symbol/projection.test.ts +171 -0
- package/src/symbol/projection.ts +833 -0
- package/src/symbol/quads.test.ts +157 -0
- package/src/symbol/quads.ts +349 -0
- package/src/symbol/shaping.test.ts +360 -0
- package/src/symbol/shaping.ts +911 -0
- package/src/symbol/symbol_layout.ts +739 -0
- package/src/symbol/symbol_size.ts +129 -0
- package/src/symbol/symbol_style_layer.test.ts +103 -0
- package/src/symbol/transform_text.ts +27 -0
- package/src/ui/anchor.ts +27 -0
- package/src/ui/camera.test.ts +2301 -0
- package/src/ui/camera.ts +1520 -0
- package/src/ui/control/attribution_control.test.ts +543 -0
- package/src/ui/control/attribution_control.ts +209 -0
- package/src/ui/control/control.ts +67 -0
- package/src/ui/control/fullscreen_control.test.ts +114 -0
- package/src/ui/control/fullscreen_control.ts +189 -0
- package/src/ui/control/geolocate_control.test.ts +619 -0
- package/src/ui/control/geolocate_control.ts +725 -0
- package/src/ui/control/logo_control.test.ts +88 -0
- package/src/ui/control/logo_control.ts +86 -0
- package/src/ui/control/navigation_control.test.ts +238 -0
- package/src/ui/control/navigation_control.ts +294 -0
- package/src/ui/control/scale_control.test.ts +52 -0
- package/src/ui/control/scale_control.ts +152 -0
- package/src/ui/control/terrain_control.test.ts +58 -0
- package/src/ui/control/terrain_control.ts +74 -0
- package/src/ui/default_locale.ts +25 -0
- package/src/ui/events.ts +758 -0
- package/src/ui/handler/box_zoom.test.ts +163 -0
- package/src/ui/handler/box_zoom.ts +171 -0
- package/src/ui/handler/click_zoom.ts +55 -0
- package/src/ui/handler/cooperative_gestures.test.ts +338 -0
- package/src/ui/handler/cooperative_gestures.ts +111 -0
- package/src/ui/handler/dblclick_zoom.test.ts +151 -0
- package/src/ui/handler/drag_handler.ts +174 -0
- package/src/ui/handler/drag_move_state_manager.ts +115 -0
- package/src/ui/handler/drag_pan.test.ts +487 -0
- package/src/ui/handler/drag_rotate.test.ts +859 -0
- package/src/ui/handler/handler_util.ts +10 -0
- package/src/ui/handler/keyboard.test.ts +235 -0
- package/src/ui/handler/keyboard.ts +212 -0
- package/src/ui/handler/map_event.test.ts +158 -0
- package/src/ui/handler/map_event.ts +161 -0
- package/src/ui/handler/mouse.ts +92 -0
- package/src/ui/handler/mouse_handler_interface.test.ts +111 -0
- package/src/ui/handler/mouse_rotate.test.ts +62 -0
- package/src/ui/handler/one_finger_touch_drag.ts +45 -0
- package/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts +77 -0
- package/src/ui/handler/scroll_zoom.test.ts +382 -0
- package/src/ui/handler/scroll_zoom.ts +379 -0
- package/src/ui/handler/shim/dblclick_zoom.ts +64 -0
- package/src/ui/handler/shim/drag_pan.ts +104 -0
- package/src/ui/handler/shim/drag_rotate.ts +76 -0
- package/src/ui/handler/shim/two_fingers_touch.ts +112 -0
- package/src/ui/handler/tap_drag_zoom.test.ts +113 -0
- package/src/ui/handler/tap_drag_zoom.ts +112 -0
- package/src/ui/handler/tap_recognizer.ts +138 -0
- package/src/ui/handler/tap_zoom.ts +98 -0
- package/src/ui/handler/touch_pan.ts +115 -0
- package/src/ui/handler/transform-provider.ts +44 -0
- package/src/ui/handler/two_fingers_touch.test.ts +283 -0
- package/src/ui/handler/two_fingers_touch.ts +336 -0
- package/src/ui/handler_inertia.ts +157 -0
- package/src/ui/handler_manager.ts +637 -0
- package/src/ui/hash.test.ts +404 -0
- package/src/ui/hash.ts +153 -0
- package/src/ui/map.ts +3393 -0
- package/src/ui/map_tests/map_animation.test.ts +61 -0
- package/src/ui/map_tests/map_basic.test.ts +223 -0
- package/src/ui/map_tests/map_bounds.test.ts +123 -0
- package/src/ui/map_tests/map_calculate_camera_options.test.ts +113 -0
- package/src/ui/map_tests/map_canvas.test.ts +59 -0
- package/src/ui/map_tests/map_control.test.ts +61 -0
- package/src/ui/map_tests/map_disable_handlers.test.ts +38 -0
- package/src/ui/map_tests/map_events.test.ts +1001 -0
- package/src/ui/map_tests/map_feature_state.test.ts +421 -0
- package/src/ui/map_tests/map_images.test.ts +175 -0
- package/src/ui/map_tests/map_is_moving.test.ts +164 -0
- package/src/ui/map_tests/map_is_rotating.test.ts +62 -0
- package/src/ui/map_tests/map_is_zooming.test.ts +86 -0
- package/src/ui/map_tests/map_layer.test.ts +457 -0
- package/src/ui/map_tests/map_options.test.ts +64 -0
- package/src/ui/map_tests/map_pitch.test.ts +90 -0
- package/src/ui/map_tests/map_pixel_ratio.test.ts +75 -0
- package/src/ui/map_tests/map_query_rendered_features.test.ts +93 -0
- package/src/ui/map_tests/map_render.test.ts +90 -0
- package/src/ui/map_tests/map_request_render_frame.test.ts +51 -0
- package/src/ui/map_tests/map_resize.test.ts +120 -0
- package/src/ui/map_tests/map_style.test.ts +541 -0
- package/src/ui/map_tests/map_terrian.test.ts +104 -0
- package/src/ui/map_tests/map_webgl.test.ts +72 -0
- package/src/ui/map_tests/map_world_copies.test.ts +103 -0
- package/src/ui/map_tests/map_zoom.test.ts +95 -0
- package/src/ui/marker.test.ts +1149 -0
- package/src/ui/marker.ts +880 -0
- package/src/ui/popup.test.ts +827 -0
- package/src/ui/popup.ts +717 -0
- package/src/util/abort_error.ts +21 -0
- package/src/util/actor.test.ts +218 -0
- package/src/util/actor.ts +241 -0
- package/src/util/actor_messages.ts +149 -0
- package/src/util/ajax.test.ts +237 -0
- package/src/util/ajax.ts +297 -0
- package/src/util/browser.test.ts +23 -0
- package/src/util/browser.ts +63 -0
- package/src/util/color_ramp.test.ts +105 -0
- package/src/util/color_ramp.ts +56 -0
- package/src/util/config.ts +29 -0
- package/src/util/dictionary_coder.ts +23 -0
- package/src/util/dispatcher.test.ts +76 -0
- package/src/util/dispatcher.ts +78 -0
- package/src/util/dom.ts +135 -0
- package/src/util/evented.test.ts +231 -0
- package/src/util/evented.ts +178 -0
- package/src/util/find_pole_of_inaccessibility.test.ts +21 -0
- package/src/util/find_pole_of_inaccessibility.ts +130 -0
- package/src/util/geolocation_support.test.ts +43 -0
- package/src/util/geolocation_support.ts +23 -0
- package/src/util/global_worker_pool.ts +65 -0
- package/src/util/image.ts +150 -0
- package/src/util/image_request.test.ts +408 -0
- package/src/util/image_request.ts +246 -0
- package/src/util/intersection_tests.ts +206 -0
- package/src/util/is_char_in_unicode_block.test.ts +15 -0
- package/src/util/is_char_in_unicode_block.ts +345 -0
- package/src/util/offscreen_canvas_distorted.test.ts +13 -0
- package/src/util/offscreen_canvas_distorted.ts +39 -0
- package/src/util/offscreen_canvas_supported.ts +11 -0
- package/src/util/performance.ts +117 -0
- package/src/util/primitives.test.ts +140 -0
- package/src/util/primitives.ts +143 -0
- package/src/util/request_manager.ts +42 -0
- package/src/util/resolve_tokens.test.ts +45 -0
- package/src/util/resolve_tokens.ts +17 -0
- package/src/util/script_detection.test.ts +138 -0
- package/src/util/script_detection.ts +376 -0
- package/src/util/smart_wrap.test.ts +97 -0
- package/src/util/smart_wrap.ts +58 -0
- package/src/util/struct_array.test.ts +101 -0
- package/src/util/struct_array.ts +246 -0
- package/src/util/style.test.ts +34 -0
- package/src/util/style.ts +28 -0
- package/src/util/task_queue.test.ts +114 -0
- package/src/util/task_queue.ts +64 -0
- package/src/util/test/util.ts +185 -0
- package/src/util/throttle.test.ts +42 -0
- package/src/util/throttle.ts +28 -0
- package/src/util/throttled_invoker.ts +41 -0
- package/src/util/transferable_grid_index.test.ts +56 -0
- package/src/util/transferable_grid_index.ts +214 -0
- package/src/util/util.test.ts +414 -0
- package/src/util/util.ts +724 -0
- package/src/util/vectortile_to_geojson.ts +72 -0
- package/src/util/verticalize_punctuation.ts +110 -0
- package/src/util/web_worker.ts +16 -0
- package/src/util/web_worker_transfer.test.ts +153 -0
- package/src/util/web_worker_transfer.ts +254 -0
- package/src/util/webp_supported.ts +63 -0
- package/src/util/worker_pool.test.ts +43 -0
- package/src/util/worker_pool.ts +58 -0
- package/src/util/world_bounds.test.ts +59 -0
- package/src/util/world_bounds.ts +46 -0
|
@@ -0,0 +1,1149 @@
|
|
|
1
|
+
import {createMap as globalCreateMap, beforeMapTest, sleep} from '../util/test/util';
|
|
2
|
+
import {Marker} from './marker';
|
|
3
|
+
import {Popup} from './popup';
|
|
4
|
+
import {LngLat} from '../geo/lng_lat';
|
|
5
|
+
import Point from '@mapbox/point-geometry';
|
|
6
|
+
import simulate from '../../test/unit/lib/simulate_interaction';
|
|
7
|
+
import type {Terrain} from '../render/terrain';
|
|
8
|
+
import type {defaultLocale} from './default_locale';
|
|
9
|
+
|
|
10
|
+
type MapOptions = {
|
|
11
|
+
locale?: Partial<typeof defaultLocale>;
|
|
12
|
+
width?: number;
|
|
13
|
+
renderWorldCopies?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function createMap(options: MapOptions = {}) {
|
|
17
|
+
const container = window.document.createElement('div');
|
|
18
|
+
window.document.body.appendChild(container);
|
|
19
|
+
Object.defineProperty(container, 'clientWidth', {value: options.width || 512});
|
|
20
|
+
Object.defineProperty(container, 'clientHeight', {value: 512});
|
|
21
|
+
return globalCreateMap({container, ...options});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
beforeMapTest();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
describe('marker', () => {
|
|
29
|
+
test('Marker uses a default marker element with an appropriate offset', () => {
|
|
30
|
+
const marker = new Marker();
|
|
31
|
+
expect(marker.getElement()).toBeTruthy();
|
|
32
|
+
expect(marker.getOffset().equals(new Point(0, -14))).toBeTruthy();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('Marker uses a default marker element with custom color', () => {
|
|
36
|
+
const marker = new Marker({color: '#123456'});
|
|
37
|
+
expect(marker.getElement().innerHTML.includes('#123456')).toBeTruthy();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('Marker uses a default marker element with custom scale', () => {
|
|
41
|
+
const map = createMap();
|
|
42
|
+
const defaultMarker = new Marker()
|
|
43
|
+
.setLngLat([0, 0])
|
|
44
|
+
.addTo(map);
|
|
45
|
+
// scale smaller than default
|
|
46
|
+
const smallerMarker = new Marker({scale: 0.8})
|
|
47
|
+
.setLngLat([0, 0])
|
|
48
|
+
.addTo(map);
|
|
49
|
+
// scale larger than default
|
|
50
|
+
const largerMarker = new Marker({scale: 2})
|
|
51
|
+
.setLngLat([0, 0])
|
|
52
|
+
.addTo(map);
|
|
53
|
+
|
|
54
|
+
// initial dimensions of svg element
|
|
55
|
+
expect(
|
|
56
|
+
defaultMarker.getElement().children[0].getAttribute('height').includes('41')
|
|
57
|
+
).toBeTruthy();
|
|
58
|
+
expect(defaultMarker.getElement().children[0].getAttribute('width').includes('27')).toBeTruthy();
|
|
59
|
+
|
|
60
|
+
// (41 * 0.8) = 32.8, (27 * 0.8) = 21.6
|
|
61
|
+
expect(
|
|
62
|
+
smallerMarker.getElement().children[0].getAttribute('height').includes('32.8')
|
|
63
|
+
).toBeTruthy();
|
|
64
|
+
expect(
|
|
65
|
+
smallerMarker.getElement().children[0].getAttribute('width').includes('21.6')
|
|
66
|
+
).toBeTruthy();
|
|
67
|
+
|
|
68
|
+
// (41 * 2) = 82, (27 * 2) = 54
|
|
69
|
+
expect(largerMarker.getElement().children[0].getAttribute('height').includes('82')).toBeTruthy();
|
|
70
|
+
expect(largerMarker.getElement().children[0].getAttribute('width').includes('54')).toBeTruthy();
|
|
71
|
+
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('Marker uses a default marker with custom offset', () => {
|
|
75
|
+
const marker = new Marker({offset: [1, 2]});
|
|
76
|
+
expect(marker.getElement()).toBeTruthy();
|
|
77
|
+
expect(marker.getOffset().equals(new Point(1, 2))).toBeTruthy();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('Marker uses the provided element', () => {
|
|
81
|
+
const element = window.document.createElement('div');
|
|
82
|
+
const marker = new Marker({element});
|
|
83
|
+
expect(marker.getElement()).toBe(element);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('Marker#addTo adds the marker element to the canvas container', () => {
|
|
87
|
+
const map = createMap();
|
|
88
|
+
new Marker()
|
|
89
|
+
.setLngLat([-77.01866, 38.888])
|
|
90
|
+
.addTo(map);
|
|
91
|
+
|
|
92
|
+
expect(map.getCanvasContainer().querySelectorAll('.maplibregl-marker')).toHaveLength(1);
|
|
93
|
+
|
|
94
|
+
map.remove();
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test('Marker adds classes from className option, methods for class manipulations works properly', () => {
|
|
98
|
+
const map = createMap();
|
|
99
|
+
const marker = new Marker({className: 'some classes'})
|
|
100
|
+
.setLngLat([0, 0])
|
|
101
|
+
.addTo(map);
|
|
102
|
+
|
|
103
|
+
const markerElement = marker.getElement();
|
|
104
|
+
expect(markerElement.classList.contains('some')).toBeTruthy();
|
|
105
|
+
expect(markerElement.classList.contains('classes')).toBeTruthy();
|
|
106
|
+
|
|
107
|
+
marker.addClassName('addedClass');
|
|
108
|
+
expect(markerElement.classList.contains('addedClass')).toBeTruthy();
|
|
109
|
+
|
|
110
|
+
marker.removeClassName('addedClass');
|
|
111
|
+
expect(!markerElement.classList.contains('addedClass')).toBeTruthy();
|
|
112
|
+
|
|
113
|
+
marker.toggleClassName('toggle');
|
|
114
|
+
expect(markerElement.classList.contains('toggle')).toBeTruthy();
|
|
115
|
+
|
|
116
|
+
marker.toggleClassName('toggle');
|
|
117
|
+
expect(!markerElement.classList.contains('toggle')).toBeTruthy();
|
|
118
|
+
|
|
119
|
+
expect(() => marker.addClassName('should throw exception')).toThrow(window.DOMException);
|
|
120
|
+
expect(() => marker.removeClassName('should throw exception')).toThrow(window.DOMException);
|
|
121
|
+
expect(() => marker.toggleClassName('should throw exception')).toThrow(window.DOMException);
|
|
122
|
+
|
|
123
|
+
expect(() => marker.addClassName('')).toThrow(window.DOMException);
|
|
124
|
+
expect(() => marker.removeClassName('')).toThrow(window.DOMException);
|
|
125
|
+
expect(() => marker.toggleClassName('')).toThrow(window.DOMException);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test('Marker provides LngLat accessors', () => {
|
|
129
|
+
expect(new Marker().getLngLat()).toBeUndefined();
|
|
130
|
+
|
|
131
|
+
expect(new Marker().setLngLat([1, 2]).getLngLat() instanceof LngLat).toBeTruthy();
|
|
132
|
+
expect(new Marker().setLngLat([1, 2]).getLngLat()).toEqual(new LngLat(1, 2));
|
|
133
|
+
|
|
134
|
+
expect(new Marker().setLngLat(new LngLat(1, 2)).getLngLat() instanceof LngLat).toBeTruthy();
|
|
135
|
+
expect(new Marker().setLngLat(new LngLat(1, 2)).getLngLat()).toEqual(new LngLat(1, 2));
|
|
136
|
+
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test('Marker provides offset accessors', () => {
|
|
140
|
+
expect(new Marker().setOffset([1, 2]).getOffset() instanceof Point).toBeTruthy();
|
|
141
|
+
expect(new Marker().setOffset([1, 2]).getOffset()).toEqual(new Point(1, 2));
|
|
142
|
+
|
|
143
|
+
expect(new Marker().setOffset(new Point(1, 2)).getOffset() instanceof Point).toBeTruthy();
|
|
144
|
+
expect(new Marker().setOffset(new Point(1, 2)).getOffset()).toEqual(new Point(1, 2));
|
|
145
|
+
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('Marker#setPopup binds a popup', () => {
|
|
149
|
+
const popup = new Popup();
|
|
150
|
+
const marker = new Marker()
|
|
151
|
+
.setPopup(popup);
|
|
152
|
+
expect(marker.getPopup()).toBe(popup);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test('Marker#setPopup unbinds a popup', () => {
|
|
156
|
+
const marker = new Marker()
|
|
157
|
+
.setPopup(new Popup())
|
|
158
|
+
.setPopup();
|
|
159
|
+
expect(!marker.getPopup()).toBeTruthy();
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test('Marker#togglePopup opens a popup that was closed', async () => {
|
|
163
|
+
const map = createMap();
|
|
164
|
+
const marker = new Marker()
|
|
165
|
+
.setLngLat([0, 0])
|
|
166
|
+
.addTo(map)
|
|
167
|
+
.setPopup(new Popup());
|
|
168
|
+
|
|
169
|
+
await sleep(100);
|
|
170
|
+
marker.togglePopup();
|
|
171
|
+
|
|
172
|
+
expect(marker.getPopup().isOpen()).toBeTruthy();
|
|
173
|
+
|
|
174
|
+
map.remove();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test('Marker#togglePopup closes a popup that was open', () => {
|
|
178
|
+
const map = createMap();
|
|
179
|
+
const marker = new Marker()
|
|
180
|
+
.setLngLat([0, 0])
|
|
181
|
+
.addTo(map)
|
|
182
|
+
.setPopup(new Popup())
|
|
183
|
+
.togglePopup()
|
|
184
|
+
.togglePopup();
|
|
185
|
+
|
|
186
|
+
expect(!marker.getPopup().isOpen()).toBeTruthy();
|
|
187
|
+
|
|
188
|
+
map.remove();
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
test('Enter key on Marker opens a popup that was closed', async () => {
|
|
192
|
+
const map = createMap();
|
|
193
|
+
const marker = new Marker()
|
|
194
|
+
.setLngLat([0, 0])
|
|
195
|
+
.addTo(map)
|
|
196
|
+
.setPopup(new Popup());
|
|
197
|
+
|
|
198
|
+
await sleep(100);
|
|
199
|
+
|
|
200
|
+
// popup not initially open
|
|
201
|
+
expect(marker.getPopup().isOpen()).toBeFalsy();
|
|
202
|
+
|
|
203
|
+
simulate.keypress(marker.getElement(), {code: 'Enter'});
|
|
204
|
+
|
|
205
|
+
// popup open after Enter keypress
|
|
206
|
+
expect(marker.getPopup().isOpen()).toBeTruthy();
|
|
207
|
+
|
|
208
|
+
map.remove();
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
test('Space key on Marker opens a popup that was closed', async () => {
|
|
212
|
+
const map = createMap();
|
|
213
|
+
const marker = new Marker()
|
|
214
|
+
.setLngLat([0, 0])
|
|
215
|
+
.addTo(map)
|
|
216
|
+
.setPopup(new Popup());
|
|
217
|
+
|
|
218
|
+
await sleep(100);
|
|
219
|
+
|
|
220
|
+
// popup not initially open
|
|
221
|
+
expect(marker.getPopup().isOpen()).toBeFalsy();
|
|
222
|
+
|
|
223
|
+
simulate.keypress(marker.getElement(), {code: 'Space'});
|
|
224
|
+
|
|
225
|
+
// popup open after Enter keypress
|
|
226
|
+
expect(marker.getPopup().isOpen()).toBeTruthy();
|
|
227
|
+
|
|
228
|
+
map.remove();
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test('Marker#setPopup sets a tabindex', () => {
|
|
232
|
+
const popup = new Popup();
|
|
233
|
+
const marker = new Marker()
|
|
234
|
+
.setPopup(popup);
|
|
235
|
+
expect(marker.getElement().getAttribute('tabindex')).toBe('0');
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
test('Marker#setPopup removes tabindex when unset', () => {
|
|
239
|
+
const popup = new Popup();
|
|
240
|
+
const marker = new Marker()
|
|
241
|
+
.setPopup(popup)
|
|
242
|
+
.setPopup();
|
|
243
|
+
expect(marker.getElement().getAttribute('tabindex')).toBeFalsy();
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
test('Marker#setPopup does not replace existing tabindex', () => {
|
|
247
|
+
const element = window.document.createElement('div');
|
|
248
|
+
element.setAttribute('tabindex', '5');
|
|
249
|
+
const popup = new Popup();
|
|
250
|
+
const marker = new Marker({element})
|
|
251
|
+
.setPopup(popup);
|
|
252
|
+
expect(marker.getElement().getAttribute('tabindex')).toBe('5');
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
test('Marker aria-label is set accordingly to its label value', () => {
|
|
256
|
+
const map = createMap({locale: {'Marker.Title': 'alt title'}});
|
|
257
|
+
const marker = new Marker().setLngLat([0, 0]).addTo(map);
|
|
258
|
+
|
|
259
|
+
expect(marker.getElement().getAttribute('aria-label')).toBe('alt title');
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test('Marker anchor defaults to center', () => {
|
|
263
|
+
const map = createMap();
|
|
264
|
+
const marker = new Marker()
|
|
265
|
+
.setLngLat([0, 0])
|
|
266
|
+
.addTo(map);
|
|
267
|
+
|
|
268
|
+
expect(marker.getElement().classList.contains('maplibregl-marker-anchor-center')).toBeTruthy();
|
|
269
|
+
expect(marker.getElement().style.transform).toMatch(/translate\(-50%,-50%\)/);
|
|
270
|
+
|
|
271
|
+
map.remove();
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
test('Marker anchors as specified by the anchor option', () => {
|
|
275
|
+
const map = createMap();
|
|
276
|
+
const marker = new Marker({anchor: 'top'})
|
|
277
|
+
.setLngLat([0, 0])
|
|
278
|
+
.addTo(map);
|
|
279
|
+
|
|
280
|
+
expect(marker.getElement().classList.contains('maplibregl-marker-anchor-top')).toBeTruthy();
|
|
281
|
+
expect(marker.getElement().style.transform).toMatch(/translate\(-50%,0\)/);
|
|
282
|
+
|
|
283
|
+
map.remove();
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
test('Popup offsets around default Marker', () => {
|
|
287
|
+
const map = createMap();
|
|
288
|
+
|
|
289
|
+
const marker = new Marker()
|
|
290
|
+
.setLngLat([0, 0])
|
|
291
|
+
.setPopup(new Popup().setText('Test'))
|
|
292
|
+
.addTo(map);
|
|
293
|
+
|
|
294
|
+
expect(marker.getPopup().options.offset['bottom'][1] < 0).toBeTruthy();
|
|
295
|
+
expect(marker.getPopup().options.offset['top'][1] === 0).toBeTruthy();
|
|
296
|
+
expect(marker.getPopup().options.offset['left'][0] > 0).toBeTruthy();
|
|
297
|
+
expect(marker.getPopup().options.offset['right'][0] < 0).toBeTruthy();
|
|
298
|
+
|
|
299
|
+
expect(marker.getPopup().options.offset['bottom-left'][0] > 0).toBeTruthy();
|
|
300
|
+
expect(marker.getPopup().options.offset['bottom-left'][1] < 0).toBeTruthy();
|
|
301
|
+
expect(marker.getPopup().options.offset['bottom-right'][0] < 0).toBeTruthy();
|
|
302
|
+
expect(marker.getPopup().options.offset['bottom-right'][1] < 0).toBeTruthy();
|
|
303
|
+
|
|
304
|
+
expect(marker.getPopup().options.offset['top-left']).toEqual([0, 0]);
|
|
305
|
+
expect(marker.getPopup().options.offset['top-right']).toEqual([0, 0]);
|
|
306
|
+
|
|
307
|
+
map.remove();
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
test('Popup anchors around default Marker', async () => {
|
|
311
|
+
const map = createMap();
|
|
312
|
+
|
|
313
|
+
const marker = new Marker()
|
|
314
|
+
.setLngLat([0, 0])
|
|
315
|
+
.setPopup(new Popup().setText('Test'))
|
|
316
|
+
.addTo(map);
|
|
317
|
+
|
|
318
|
+
await sleep(100);
|
|
319
|
+
|
|
320
|
+
// open the popup
|
|
321
|
+
marker.togglePopup();
|
|
322
|
+
|
|
323
|
+
const mapHeight = map.getContainer().clientHeight;
|
|
324
|
+
const markerTop = -marker.getPopup().options.offset['bottom'][1]; // vertical distance from tip of marker to the top in pixels
|
|
325
|
+
const markerRight = -marker.getPopup().options.offset['right'][0]; // horizontal distance from the tip of the marker to the right in pixels
|
|
326
|
+
|
|
327
|
+
// give the popup some height
|
|
328
|
+
Object.defineProperty(marker.getPopup()._container, 'offsetWidth', {value: 100});
|
|
329
|
+
Object.defineProperty(marker.getPopup()._container, 'offsetHeight', {value: 100});
|
|
330
|
+
|
|
331
|
+
// marker should default to above since it has enough space
|
|
332
|
+
expect(
|
|
333
|
+
marker.getPopup()._container.classList.contains('maplibregl-popup-anchor-bottom')
|
|
334
|
+
).toBeTruthy();
|
|
335
|
+
|
|
336
|
+
// move marker to the top forcing the popup to below
|
|
337
|
+
marker.setLngLat(map.unproject([mapHeight / 2, markerTop]));
|
|
338
|
+
expect(
|
|
339
|
+
marker.getPopup()._container.classList.contains('maplibregl-popup-anchor-top')
|
|
340
|
+
).toBeTruthy();
|
|
341
|
+
|
|
342
|
+
// move marker to the right forcing the popup to the left
|
|
343
|
+
marker.setLngLat(map.unproject([mapHeight - markerRight, mapHeight / 2]));
|
|
344
|
+
expect(
|
|
345
|
+
marker.getPopup()._container.classList.contains('maplibregl-popup-anchor-right')
|
|
346
|
+
).toBeTruthy();
|
|
347
|
+
|
|
348
|
+
// move marker to the left forcing the popup to the right
|
|
349
|
+
marker.setLngLat(map.unproject([markerRight, mapHeight / 2]));
|
|
350
|
+
expect(
|
|
351
|
+
marker.getPopup()._container.classList.contains('maplibregl-popup-anchor-left')
|
|
352
|
+
).toBeTruthy();
|
|
353
|
+
|
|
354
|
+
// move marker to the top left forcing the popup to the bottom right
|
|
355
|
+
marker.setLngLat(map.unproject([markerRight, markerTop]));
|
|
356
|
+
expect(
|
|
357
|
+
marker.getPopup()._container.classList.contains('maplibregl-popup-anchor-top-left')
|
|
358
|
+
).toBeTruthy();
|
|
359
|
+
|
|
360
|
+
// move marker to the top right forcing the popup to the bottom left
|
|
361
|
+
marker.setLngLat(map.unproject([mapHeight - markerRight, markerTop]));
|
|
362
|
+
expect(
|
|
363
|
+
marker.getPopup()._container.classList.contains('maplibregl-popup-anchor-top-right')
|
|
364
|
+
).toBeTruthy();
|
|
365
|
+
|
|
366
|
+
// move marker to the bottom left forcing the popup to the top right
|
|
367
|
+
marker.setLngLat(map.unproject([markerRight, mapHeight]));
|
|
368
|
+
expect(
|
|
369
|
+
marker.getPopup()._container.classList.contains('maplibregl-popup-anchor-bottom-left')
|
|
370
|
+
).toBeTruthy();
|
|
371
|
+
|
|
372
|
+
// move marker to the bottom right forcing the popup to the top left
|
|
373
|
+
marker.setLngLat(map.unproject([mapHeight - markerRight, mapHeight]));
|
|
374
|
+
expect(
|
|
375
|
+
marker.getPopup()._container.classList.contains('maplibregl-popup-anchor-bottom-right')
|
|
376
|
+
).toBeTruthy();
|
|
377
|
+
|
|
378
|
+
map.remove();
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
test('Popup is opened at its marker position after marker is moved to another globe', async () => {
|
|
382
|
+
const map = createMap({width: 3000});
|
|
383
|
+
|
|
384
|
+
const marker = new Marker()
|
|
385
|
+
.setLngLat([0, 0])
|
|
386
|
+
.setPopup(new Popup().setText('Test'))
|
|
387
|
+
.addTo(map);
|
|
388
|
+
|
|
389
|
+
await sleep(100);
|
|
390
|
+
|
|
391
|
+
marker._pos = new Point(2999, 242);
|
|
392
|
+
marker._lngLat = map.unproject(marker._pos);
|
|
393
|
+
marker.togglePopup();
|
|
394
|
+
|
|
395
|
+
expect(marker.getPopup()._pos.x).toBeCloseTo(marker._pos.x, 0);
|
|
396
|
+
map.remove();
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
test('Popup is re-opened at its marker position after marker is moved to another globe', async () => {
|
|
400
|
+
const map = createMap({width: 3000});
|
|
401
|
+
|
|
402
|
+
const marker = new Marker()
|
|
403
|
+
.setLngLat([0, 0])
|
|
404
|
+
.setPopup(new Popup().setText('Test'))
|
|
405
|
+
.addTo(map)
|
|
406
|
+
.togglePopup()
|
|
407
|
+
.togglePopup();
|
|
408
|
+
|
|
409
|
+
await sleep(100);
|
|
410
|
+
marker._pos = new Point(2999, 242);
|
|
411
|
+
marker._lngLat = map.unproject(marker._pos);
|
|
412
|
+
marker.togglePopup();
|
|
413
|
+
|
|
414
|
+
expect(marker.getPopup()._pos.x).toBeCloseTo(marker._pos.x, 0);
|
|
415
|
+
map.remove();
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
test('Marker drag functionality can be added with drag option', () => {
|
|
419
|
+
const map = createMap();
|
|
420
|
+
const marker = new Marker({draggable: true})
|
|
421
|
+
.setLngLat([0, 0])
|
|
422
|
+
.addTo(map);
|
|
423
|
+
|
|
424
|
+
expect(marker.isDraggable()).toBe(true);
|
|
425
|
+
|
|
426
|
+
map.remove();
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
test('Marker#setDraggable adds drag functionality', () => {
|
|
430
|
+
const map = createMap();
|
|
431
|
+
const marker = new Marker()
|
|
432
|
+
.setLngLat([0, 0])
|
|
433
|
+
.setDraggable(true)
|
|
434
|
+
.addTo(map);
|
|
435
|
+
|
|
436
|
+
expect(marker.isDraggable()).toBe(true);
|
|
437
|
+
|
|
438
|
+
map.remove();
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
test('Marker#setDraggable turns off drag functionality', () => {
|
|
442
|
+
const map = createMap();
|
|
443
|
+
const marker = new Marker({draggable: true})
|
|
444
|
+
.setLngLat([0, 0])
|
|
445
|
+
.addTo(map);
|
|
446
|
+
|
|
447
|
+
expect(marker.isDraggable()).toBe(true);
|
|
448
|
+
|
|
449
|
+
marker.setDraggable(false);
|
|
450
|
+
|
|
451
|
+
expect(marker.isDraggable()).toBe(false);
|
|
452
|
+
|
|
453
|
+
map.remove();
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
test('Marker with draggable:true fires dragstart, drag, and dragend events at appropriate times in response to mouse-triggered drag with map-inherited clickTolerance', () => {
|
|
457
|
+
const map = createMap();
|
|
458
|
+
const marker = new Marker({draggable: true})
|
|
459
|
+
.setLngLat([0, 0])
|
|
460
|
+
.addTo(map);
|
|
461
|
+
const el = marker.getElement();
|
|
462
|
+
|
|
463
|
+
const dragstart = jest.fn();
|
|
464
|
+
const drag = jest.fn();
|
|
465
|
+
const dragend = jest.fn();
|
|
466
|
+
|
|
467
|
+
marker.on('dragstart', dragstart);
|
|
468
|
+
marker.on('drag', drag);
|
|
469
|
+
marker.on('dragend', dragend);
|
|
470
|
+
|
|
471
|
+
simulate.mousedown(el, {clientX: 0, clientY: 0});
|
|
472
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
473
|
+
expect(drag).not.toHaveBeenCalled();
|
|
474
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
475
|
+
expect(el.style.pointerEvents).toBe('');
|
|
476
|
+
|
|
477
|
+
simulate.mousemove(el, {clientX: 2.9, clientY: 0});
|
|
478
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
479
|
+
expect(drag).not.toHaveBeenCalled();
|
|
480
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
481
|
+
expect(el.style.pointerEvents).toBe('');
|
|
482
|
+
|
|
483
|
+
// above map's click tolerance
|
|
484
|
+
simulate.mousemove(el, {clientX: 3.1, clientY: 0});
|
|
485
|
+
expect(dragstart).toHaveBeenCalledTimes(1);
|
|
486
|
+
expect(drag).toHaveBeenCalledTimes(1);
|
|
487
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
488
|
+
expect(el.style.pointerEvents).toBe('none');
|
|
489
|
+
|
|
490
|
+
simulate.mousemove(el, {clientX: 0, clientY: 0});
|
|
491
|
+
expect(dragstart).toHaveBeenCalledTimes(1);
|
|
492
|
+
expect(drag).toHaveBeenCalledTimes(2);
|
|
493
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
494
|
+
expect(el.style.pointerEvents).toBe('none');
|
|
495
|
+
|
|
496
|
+
simulate.mouseup(el);
|
|
497
|
+
expect(dragstart).toHaveBeenCalledTimes(1);
|
|
498
|
+
expect(drag).toHaveBeenCalledTimes(2);
|
|
499
|
+
expect(dragend).toHaveBeenCalledTimes(1);
|
|
500
|
+
expect(el.style.pointerEvents).toBe('auto');
|
|
501
|
+
|
|
502
|
+
map.remove();
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
test('Marker with draggable:true fires dragstart, drag, and dragend events at appropriate times in response to mouse-triggered drag with marker-specific clickTolerance', () => {
|
|
506
|
+
const map = createMap();
|
|
507
|
+
const marker = new Marker({draggable: true, clickTolerance: 4})
|
|
508
|
+
.setLngLat([0, 0])
|
|
509
|
+
.addTo(map);
|
|
510
|
+
const el = marker.getElement();
|
|
511
|
+
|
|
512
|
+
const dragstart = jest.fn();
|
|
513
|
+
const drag = jest.fn();
|
|
514
|
+
const dragend = jest.fn();
|
|
515
|
+
|
|
516
|
+
marker.on('dragstart', dragstart);
|
|
517
|
+
marker.on('drag', drag);
|
|
518
|
+
marker.on('dragend', dragend);
|
|
519
|
+
|
|
520
|
+
simulate.mousedown(el, {clientX: 0, clientY: 0});
|
|
521
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
522
|
+
expect(drag).not.toHaveBeenCalled();
|
|
523
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
524
|
+
expect(el.style.pointerEvents).toBe('');
|
|
525
|
+
|
|
526
|
+
simulate.mousemove(el, {clientX: 3.9, clientY: 0});
|
|
527
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
528
|
+
expect(drag).not.toHaveBeenCalled();
|
|
529
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
530
|
+
expect(el.style.pointerEvents).toBe('');
|
|
531
|
+
|
|
532
|
+
// above map's click tolerance
|
|
533
|
+
simulate.mousemove(el, {clientX: 4.1, clientY: 0});
|
|
534
|
+
expect(dragstart).toHaveBeenCalledTimes(1);
|
|
535
|
+
expect(drag).toHaveBeenCalledTimes(1);
|
|
536
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
537
|
+
expect(el.style.pointerEvents).toBe('none');
|
|
538
|
+
|
|
539
|
+
simulate.mousemove(el, {clientX: 0, clientY: 0});
|
|
540
|
+
expect(dragstart).toHaveBeenCalledTimes(1);
|
|
541
|
+
expect(drag).toHaveBeenCalledTimes(2);
|
|
542
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
543
|
+
expect(el.style.pointerEvents).toBe('none');
|
|
544
|
+
|
|
545
|
+
simulate.mouseup(el);
|
|
546
|
+
expect(dragstart).toHaveBeenCalledTimes(1);
|
|
547
|
+
expect(drag).toHaveBeenCalledTimes(2);
|
|
548
|
+
expect(dragend).toHaveBeenCalledTimes(1);
|
|
549
|
+
expect(el.style.pointerEvents).toBe('auto');
|
|
550
|
+
|
|
551
|
+
map.remove();
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
test('Marker with draggable:false does not fire dragstart, drag, and dragend events in response to a mouse-triggered drag', () => {
|
|
555
|
+
const map = createMap();
|
|
556
|
+
const marker = new Marker({})
|
|
557
|
+
.setLngLat([0, 0])
|
|
558
|
+
.addTo(map);
|
|
559
|
+
const el = marker.getElement();
|
|
560
|
+
|
|
561
|
+
const dragstart = jest.fn();
|
|
562
|
+
const drag = jest.fn();
|
|
563
|
+
const dragend = jest.fn();
|
|
564
|
+
|
|
565
|
+
marker.on('dragstart', dragstart);
|
|
566
|
+
marker.on('drag', drag);
|
|
567
|
+
marker.on('dragend', dragend);
|
|
568
|
+
|
|
569
|
+
simulate.mousedown(el, {clientX: 0, clientY: 0});
|
|
570
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
571
|
+
expect(drag).not.toHaveBeenCalled();
|
|
572
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
573
|
+
|
|
574
|
+
simulate.mousemove(el, {clientX: 3, clientY: 1});
|
|
575
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
576
|
+
expect(drag).not.toHaveBeenCalled();
|
|
577
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
578
|
+
|
|
579
|
+
simulate.mouseup(el);
|
|
580
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
581
|
+
expect(drag).not.toHaveBeenCalled();
|
|
582
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
583
|
+
|
|
584
|
+
map.remove();
|
|
585
|
+
});
|
|
586
|
+
|
|
587
|
+
test('Marker with draggable:true fires dragstart, drag, and dragend events at appropriate times in response to a touch-triggered drag with map-inherited clickTolerance', () => {
|
|
588
|
+
const map = createMap();
|
|
589
|
+
const marker = new Marker({draggable: true})
|
|
590
|
+
.setLngLat([0, 0])
|
|
591
|
+
.addTo(map);
|
|
592
|
+
const el = marker.getElement();
|
|
593
|
+
|
|
594
|
+
const dragstart = jest.fn();
|
|
595
|
+
const drag = jest.fn();
|
|
596
|
+
const dragend = jest.fn();
|
|
597
|
+
|
|
598
|
+
marker.on('dragstart', dragstart);
|
|
599
|
+
marker.on('drag', drag);
|
|
600
|
+
marker.on('dragend', dragend);
|
|
601
|
+
|
|
602
|
+
simulate.touchstart(el, {touches: [{clientX: 0, clientY: 0}]});
|
|
603
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
604
|
+
expect(drag).not.toHaveBeenCalled();
|
|
605
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
606
|
+
expect(el.style.pointerEvents).toBe('');
|
|
607
|
+
|
|
608
|
+
simulate.touchmove(el, {touches: [{clientX: 2.9, clientY: 0}]});
|
|
609
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
610
|
+
expect(drag).not.toHaveBeenCalled();
|
|
611
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
612
|
+
expect(el.style.pointerEvents).toBe('');
|
|
613
|
+
|
|
614
|
+
// above map's click tolerance
|
|
615
|
+
simulate.touchmove(el, {touches: [{clientX: 3.1, clientY: 0}]});
|
|
616
|
+
expect(dragstart).toHaveBeenCalledTimes(1);
|
|
617
|
+
expect(drag).toHaveBeenCalledTimes(1);
|
|
618
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
619
|
+
expect(el.style.pointerEvents).toBe('none');
|
|
620
|
+
|
|
621
|
+
simulate.touchmove(el, {touches: [{clientX: 0, clientY: 0}]});
|
|
622
|
+
expect(dragstart).toHaveBeenCalledTimes(1);
|
|
623
|
+
expect(drag).toHaveBeenCalledTimes(2);
|
|
624
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
625
|
+
expect(el.style.pointerEvents).toBe('none');
|
|
626
|
+
|
|
627
|
+
simulate.touchend(el);
|
|
628
|
+
expect(dragstart).toHaveBeenCalledTimes(1);
|
|
629
|
+
expect(drag).toHaveBeenCalledTimes(2);
|
|
630
|
+
expect(dragend).toHaveBeenCalledTimes(1);
|
|
631
|
+
expect(el.style.pointerEvents).toBe('auto');
|
|
632
|
+
|
|
633
|
+
map.remove();
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
test('Marker with draggable:true fires dragstart, drag, and dragend events at appropriate times in response to a touch-triggered drag with marker-specific clickTolerance', () => {
|
|
637
|
+
const map = createMap();
|
|
638
|
+
const marker = new Marker({draggable: true, clickTolerance: 4})
|
|
639
|
+
.setLngLat([0, 0])
|
|
640
|
+
.addTo(map);
|
|
641
|
+
const el = marker.getElement();
|
|
642
|
+
|
|
643
|
+
const dragstart = jest.fn();
|
|
644
|
+
const drag = jest.fn();
|
|
645
|
+
const dragend = jest.fn();
|
|
646
|
+
|
|
647
|
+
marker.on('dragstart', dragstart);
|
|
648
|
+
marker.on('drag', drag);
|
|
649
|
+
marker.on('dragend', dragend);
|
|
650
|
+
|
|
651
|
+
simulate.touchstart(el, {touches: [{clientX: 0, clientY: 0}]});
|
|
652
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
653
|
+
expect(drag).not.toHaveBeenCalled();
|
|
654
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
655
|
+
expect(el.style.pointerEvents).toBe('');
|
|
656
|
+
|
|
657
|
+
simulate.touchmove(el, {touches: [{clientX: 3.9, clientY: 0}]});
|
|
658
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
659
|
+
expect(drag).not.toHaveBeenCalled();
|
|
660
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
661
|
+
expect(el.style.pointerEvents).toBe('');
|
|
662
|
+
|
|
663
|
+
// above map's click tolerance
|
|
664
|
+
simulate.touchmove(el, {touches: [{clientX: 4.1, clientY: 0}]});
|
|
665
|
+
expect(dragstart).toHaveBeenCalledTimes(1);
|
|
666
|
+
expect(drag).toHaveBeenCalledTimes(1);
|
|
667
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
668
|
+
expect(el.style.pointerEvents).toBe('none');
|
|
669
|
+
|
|
670
|
+
simulate.touchmove(el, {touches: [{clientX: 0, clientY: 0}]});
|
|
671
|
+
expect(dragstart).toHaveBeenCalledTimes(1);
|
|
672
|
+
expect(drag).toHaveBeenCalledTimes(2);
|
|
673
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
674
|
+
expect(el.style.pointerEvents).toBe('none');
|
|
675
|
+
|
|
676
|
+
simulate.touchend(el);
|
|
677
|
+
expect(dragstart).toHaveBeenCalledTimes(1);
|
|
678
|
+
expect(drag).toHaveBeenCalledTimes(2);
|
|
679
|
+
expect(dragend).toHaveBeenCalledTimes(1);
|
|
680
|
+
expect(el.style.pointerEvents).toBe('auto');
|
|
681
|
+
|
|
682
|
+
map.remove();
|
|
683
|
+
});
|
|
684
|
+
|
|
685
|
+
test('Marker with draggable:false does not fire dragstart, drag, and dragend events in response to a touch-triggered drag', () => {
|
|
686
|
+
const map = createMap();
|
|
687
|
+
const marker = new Marker({})
|
|
688
|
+
.setLngLat([0, 0])
|
|
689
|
+
.addTo(map);
|
|
690
|
+
const el = marker.getElement();
|
|
691
|
+
|
|
692
|
+
const dragstart = jest.fn();
|
|
693
|
+
const drag = jest.fn();
|
|
694
|
+
const dragend = jest.fn();
|
|
695
|
+
|
|
696
|
+
marker.on('dragstart', dragstart);
|
|
697
|
+
marker.on('drag', drag);
|
|
698
|
+
marker.on('dragend', dragend);
|
|
699
|
+
|
|
700
|
+
simulate.touchstart(el, {touches: [{clientX: 0, clientY: 0}]});
|
|
701
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
702
|
+
expect(drag).not.toHaveBeenCalled();
|
|
703
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
704
|
+
|
|
705
|
+
simulate.touchmove(el, {touches: [{clientX: 0, clientY: 0}]});
|
|
706
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
707
|
+
expect(drag).not.toHaveBeenCalled();
|
|
708
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
709
|
+
|
|
710
|
+
simulate.touchend(el);
|
|
711
|
+
expect(dragstart).not.toHaveBeenCalled();
|
|
712
|
+
expect(drag).not.toHaveBeenCalled();
|
|
713
|
+
expect(dragend).not.toHaveBeenCalled();
|
|
714
|
+
|
|
715
|
+
map.remove();
|
|
716
|
+
});
|
|
717
|
+
|
|
718
|
+
test('Marker with draggable:true moves to new position in response to a mouse-triggered drag', () => {
|
|
719
|
+
const map = createMap();
|
|
720
|
+
const marker = new Marker({draggable: true})
|
|
721
|
+
.setLngLat([0, 0])
|
|
722
|
+
.addTo(map);
|
|
723
|
+
const el = marker.getElement();
|
|
724
|
+
const startPos = map.project(marker.getLngLat());
|
|
725
|
+
simulate.mousedown(el);
|
|
726
|
+
simulate.mousemove(el, {clientX: 10, clientY: 10});
|
|
727
|
+
simulate.mouseup(el);
|
|
728
|
+
|
|
729
|
+
const endPos = map.project(marker.getLngLat());
|
|
730
|
+
expect(Math.round(endPos.x)).toBe(startPos.x + 10);
|
|
731
|
+
expect(Math.round(endPos.y)).toBe(startPos.y + 10);
|
|
732
|
+
|
|
733
|
+
map.remove();
|
|
734
|
+
});
|
|
735
|
+
|
|
736
|
+
test('Marker with draggable:false does not move to new position in response to a mouse-triggered drag', () => {
|
|
737
|
+
const map = createMap();
|
|
738
|
+
const marker = new Marker({})
|
|
739
|
+
.setLngLat([0, 0])
|
|
740
|
+
.addTo(map);
|
|
741
|
+
const el = marker.getElement();
|
|
742
|
+
const startPos = map.project(marker.getLngLat());
|
|
743
|
+
|
|
744
|
+
simulate.mousedown(el);
|
|
745
|
+
simulate.mousemove(el);
|
|
746
|
+
simulate.mouseup(el);
|
|
747
|
+
|
|
748
|
+
const endPos = map.project(marker.getLngLat());
|
|
749
|
+
|
|
750
|
+
expect(startPos.x).toBe(endPos.x);
|
|
751
|
+
expect(startPos.y).toBe(endPos.y);
|
|
752
|
+
|
|
753
|
+
map.remove();
|
|
754
|
+
});
|
|
755
|
+
|
|
756
|
+
test('Marker with draggable:true does not error if removed on mousedown', () => {
|
|
757
|
+
const map = createMap();
|
|
758
|
+
const marker = new Marker({draggable: true})
|
|
759
|
+
.setLngLat([0, 0])
|
|
760
|
+
.addTo(map);
|
|
761
|
+
const el = marker.getElement();
|
|
762
|
+
simulate.mousedown(el);
|
|
763
|
+
simulate.mousemove(el, {clientX: 10, clientY: 10});
|
|
764
|
+
|
|
765
|
+
marker.remove();
|
|
766
|
+
expect(map.fire('mouseup')).toBeTruthy();
|
|
767
|
+
});
|
|
768
|
+
|
|
769
|
+
test('Marker can set rotationAlignment and pitchAlignment', () => {
|
|
770
|
+
const map = createMap();
|
|
771
|
+
const marker = new Marker({rotationAlignment: 'map', pitchAlignment: 'map'})
|
|
772
|
+
.setLngLat([0, 0])
|
|
773
|
+
.addTo(map);
|
|
774
|
+
|
|
775
|
+
expect(marker.getRotationAlignment()).toBe('map');
|
|
776
|
+
expect(marker.getPitchAlignment()).toBe('map');
|
|
777
|
+
|
|
778
|
+
map.remove();
|
|
779
|
+
});
|
|
780
|
+
|
|
781
|
+
test('Marker can set and update rotation', () => {
|
|
782
|
+
const map = createMap();
|
|
783
|
+
const marker = new Marker({rotation: 45})
|
|
784
|
+
.setLngLat([0, 0])
|
|
785
|
+
.addTo(map);
|
|
786
|
+
|
|
787
|
+
expect(marker.getRotation()).toBe(45);
|
|
788
|
+
|
|
789
|
+
marker.setRotation(90);
|
|
790
|
+
expect(marker.getRotation()).toBe(90);
|
|
791
|
+
|
|
792
|
+
map.remove();
|
|
793
|
+
});
|
|
794
|
+
|
|
795
|
+
test('Marker transforms rotation with the map', () => {
|
|
796
|
+
const map = createMap();
|
|
797
|
+
const marker = new Marker({rotationAlignment: 'map'})
|
|
798
|
+
.setLngLat([0, 0])
|
|
799
|
+
.addTo(map);
|
|
800
|
+
|
|
801
|
+
const rotationRegex = /rotateZ\(-?([0-9]+)deg\)/;
|
|
802
|
+
const initialRotation = marker.getElement().style.transform.match(rotationRegex)[1];
|
|
803
|
+
|
|
804
|
+
map.setBearing(map.getBearing() + 180);
|
|
805
|
+
|
|
806
|
+
const finalRotation = marker.getElement().style.transform.match(rotationRegex)[1];
|
|
807
|
+
expect(initialRotation).not.toBe(finalRotation);
|
|
808
|
+
|
|
809
|
+
map.remove();
|
|
810
|
+
});
|
|
811
|
+
|
|
812
|
+
test('Marker transforms pitch with the map', () => {
|
|
813
|
+
const map = createMap();
|
|
814
|
+
const marker = new Marker({pitchAlignment: 'map'})
|
|
815
|
+
.setLngLat([0, 0])
|
|
816
|
+
.addTo(map);
|
|
817
|
+
|
|
818
|
+
map.setPitch(0);
|
|
819
|
+
|
|
820
|
+
const rotationRegex = /rotateX\(-?([0-9]+)deg\)/;
|
|
821
|
+
const initialPitch = marker.getElement().style.transform.match(rotationRegex)[1];
|
|
822
|
+
|
|
823
|
+
map.setPitch(45);
|
|
824
|
+
|
|
825
|
+
const finalPitch = marker.getElement().style.transform.match(rotationRegex)[1];
|
|
826
|
+
expect(initialPitch).not.toBe(finalPitch);
|
|
827
|
+
|
|
828
|
+
map.remove();
|
|
829
|
+
});
|
|
830
|
+
|
|
831
|
+
test('Marker pitchAlignment when set to auto defaults to rotationAlignment', () => {
|
|
832
|
+
const map = createMap();
|
|
833
|
+
const marker = new Marker({rotationAlignment: 'map', pitchAlignment: 'auto'})
|
|
834
|
+
.setLngLat([0, 0])
|
|
835
|
+
.addTo(map);
|
|
836
|
+
|
|
837
|
+
expect(marker.getRotationAlignment()).toBe(marker.getPitchAlignment());
|
|
838
|
+
|
|
839
|
+
map.remove();
|
|
840
|
+
});
|
|
841
|
+
|
|
842
|
+
test('Marker pitchAlignment when set to auto defaults to rotationAlignment (setter/getter)', () => {
|
|
843
|
+
const map = createMap();
|
|
844
|
+
const marker = new Marker({pitchAlignment: 'map'})
|
|
845
|
+
.setLngLat([0, 0])
|
|
846
|
+
.addTo(map);
|
|
847
|
+
|
|
848
|
+
expect(marker.getPitchAlignment()).toBe('map');
|
|
849
|
+
marker.setRotationAlignment('viewport');
|
|
850
|
+
marker.setPitchAlignment('auto');
|
|
851
|
+
expect(marker.getRotationAlignment()).toBe(marker.getPitchAlignment());
|
|
852
|
+
|
|
853
|
+
map.remove();
|
|
854
|
+
});
|
|
855
|
+
|
|
856
|
+
test('Marker removed after update when terrain is on should clear timeout', async () => {
|
|
857
|
+
jest.spyOn(global, 'setTimeout');
|
|
858
|
+
jest.spyOn(global, 'clearTimeout');
|
|
859
|
+
const map = createMap();
|
|
860
|
+
const marker = new Marker()
|
|
861
|
+
.setLngLat([0, 0])
|
|
862
|
+
.addTo(map);
|
|
863
|
+
map.terrain = {
|
|
864
|
+
getElevationForLngLatZoom: () => 0,
|
|
865
|
+
depthAtPoint: () => .9
|
|
866
|
+
} as any as Terrain;
|
|
867
|
+
map.transform.lngLatToCameraDepth = () => .95;
|
|
868
|
+
|
|
869
|
+
marker.setOffset([10, 10]);
|
|
870
|
+
await sleep(100);
|
|
871
|
+
|
|
872
|
+
expect(setTimeout).toHaveBeenCalled();
|
|
873
|
+
marker.remove();
|
|
874
|
+
expect(clearTimeout).toHaveBeenCalled();
|
|
875
|
+
|
|
876
|
+
map.remove();
|
|
877
|
+
});
|
|
878
|
+
|
|
879
|
+
test('Marker after the terrain event must listen to the render event till is fully loaded', async () => {
|
|
880
|
+
const map = createMap();
|
|
881
|
+
|
|
882
|
+
new Marker()
|
|
883
|
+
.setLngLat([1, 1])
|
|
884
|
+
.addTo(map);
|
|
885
|
+
|
|
886
|
+
expect(map._oneTimeListeners.render).toBeUndefined();
|
|
887
|
+
|
|
888
|
+
map.fire('terrain');
|
|
889
|
+
expect(map._oneTimeListeners.render).toHaveLength(1);
|
|
890
|
+
|
|
891
|
+
map.fire('render');
|
|
892
|
+
expect(map._oneTimeListeners.render).toHaveLength(1);
|
|
893
|
+
|
|
894
|
+
map.fire('render');
|
|
895
|
+
expect(map._oneTimeListeners.render).toHaveLength(1);
|
|
896
|
+
|
|
897
|
+
// await idle to be fully loaded
|
|
898
|
+
await map.once('idle');
|
|
899
|
+
map.fire('render');
|
|
900
|
+
expect(map._oneTimeListeners.render).toHaveLength(0);
|
|
901
|
+
map.remove();
|
|
902
|
+
});
|
|
903
|
+
|
|
904
|
+
test('Sets default opacity if it\'s not provided as option', async () => {
|
|
905
|
+
const map = createMap();
|
|
906
|
+
const marker = new Marker()
|
|
907
|
+
.setLngLat([0, 0])
|
|
908
|
+
.addTo(map);
|
|
909
|
+
await sleep(100);
|
|
910
|
+
expect(marker.getElement().style.opacity).toMatch('1');
|
|
911
|
+
map.remove();
|
|
912
|
+
});
|
|
913
|
+
|
|
914
|
+
test('Sets opacity according to options.opacity', async () => {
|
|
915
|
+
const map = createMap();
|
|
916
|
+
const marker = new Marker({opacity: '0.7'})
|
|
917
|
+
.setLngLat([0, 0])
|
|
918
|
+
.addTo(map);
|
|
919
|
+
await sleep(100);
|
|
920
|
+
expect(marker.getElement().style.opacity).toMatch('.7');
|
|
921
|
+
map.remove();
|
|
922
|
+
});
|
|
923
|
+
|
|
924
|
+
test('Changes opacity to a new value provided by setOpacity', () => {
|
|
925
|
+
const map = createMap();
|
|
926
|
+
const marker = new Marker({opacity: '0.7'})
|
|
927
|
+
.setLngLat([0, 0])
|
|
928
|
+
.addTo(map);
|
|
929
|
+
marker.setOpacity('0.6');
|
|
930
|
+
expect(marker.getElement().style.opacity).toMatch('.6');
|
|
931
|
+
map.remove();
|
|
932
|
+
});
|
|
933
|
+
|
|
934
|
+
test('Resets opacity to default when setOpacity is called without arguments', () => {
|
|
935
|
+
const map = createMap();
|
|
936
|
+
const marker = new Marker({opacity: '0.7'})
|
|
937
|
+
.setLngLat([0, 0])
|
|
938
|
+
.addTo(map);
|
|
939
|
+
marker.setOpacity();
|
|
940
|
+
expect(marker.getElement().style.opacity).toBe('1');
|
|
941
|
+
map.remove();
|
|
942
|
+
});
|
|
943
|
+
|
|
944
|
+
test('Marker changes opacity behind terrain and when terrain is removed', async () => {
|
|
945
|
+
const map = createMap();
|
|
946
|
+
map.transform.lngLatToCameraDepth = () => .95; // Mocking distance to marker
|
|
947
|
+
const marker = new Marker()
|
|
948
|
+
.setLngLat([0, 0])
|
|
949
|
+
.addTo(map);
|
|
950
|
+
|
|
951
|
+
expect(marker.getElement().style.opacity).toMatch('');
|
|
952
|
+
|
|
953
|
+
// Add terrain, not blocking marker
|
|
954
|
+
map.terrain = {
|
|
955
|
+
getElevationForLngLatZoom: () => 0,
|
|
956
|
+
depthAtPoint: () => .95 // Mocking distance to terrain
|
|
957
|
+
} as any as Terrain;
|
|
958
|
+
map.fire('terrain');
|
|
959
|
+
await sleep(100);
|
|
960
|
+
|
|
961
|
+
expect(marker.getElement().style.opacity).toMatch('1');
|
|
962
|
+
|
|
963
|
+
// Terrain blocks marker
|
|
964
|
+
map.terrain.depthAtPoint = () => .92; // Mocking terrain blocking marker
|
|
965
|
+
map.fire('moveend');
|
|
966
|
+
await sleep(100);
|
|
967
|
+
|
|
968
|
+
expect(marker.getElement().style.opacity).toMatch('.2');
|
|
969
|
+
|
|
970
|
+
// Remove terrain
|
|
971
|
+
map.terrain = null;
|
|
972
|
+
map.fire('terrain');
|
|
973
|
+
await sleep(100);
|
|
974
|
+
expect(marker.getElement().style.opacity).toMatch('1');
|
|
975
|
+
|
|
976
|
+
map.remove();
|
|
977
|
+
});
|
|
978
|
+
|
|
979
|
+
test('Applies options.opacity when 3d terrain is enabled and marker is in clear view', async () => {
|
|
980
|
+
const map = createMap();
|
|
981
|
+
map.transform.lngLatToCameraDepth = () => .95; // Mocking distance to marker
|
|
982
|
+
const marker = new Marker({opacity: '0.7'})
|
|
983
|
+
.setLngLat([0, 0])
|
|
984
|
+
.addTo(map);
|
|
985
|
+
|
|
986
|
+
map.terrain = {
|
|
987
|
+
getElevationForLngLatZoom: () => 0,
|
|
988
|
+
depthAtPoint: () => .95
|
|
989
|
+
} as any as Terrain;
|
|
990
|
+
await sleep(100);
|
|
991
|
+
map.fire('terrain');
|
|
992
|
+
|
|
993
|
+
expect(marker.getElement().style.opacity).toMatch('.7');
|
|
994
|
+
map.remove();
|
|
995
|
+
});
|
|
996
|
+
|
|
997
|
+
test('Applies options.opacity when marker\'s base is hidden by 3d terrain but its center is visible', async () => {
|
|
998
|
+
const map = createMap();
|
|
999
|
+
map.transform.lngLatToCameraDepth = () => .95; // Mocking distance to marker
|
|
1000
|
+
const marker = new Marker({opacity: '0.7'})
|
|
1001
|
+
.setLngLat([0, 0])
|
|
1002
|
+
.addTo(map);
|
|
1003
|
+
|
|
1004
|
+
map.terrain = {
|
|
1005
|
+
getElevationForLngLatZoom: () => 0,
|
|
1006
|
+
depthAtPoint: (p) => p.y === 256 ? .95 : .92 // return "far" given the marker's center coord; return "near" otherwise
|
|
1007
|
+
} as any as Terrain;
|
|
1008
|
+
await sleep(100);
|
|
1009
|
+
map.fire('terrain');
|
|
1010
|
+
|
|
1011
|
+
expect(marker.getElement().style.opacity).toMatch('.7');
|
|
1012
|
+
map.remove();
|
|
1013
|
+
});
|
|
1014
|
+
|
|
1015
|
+
test('Applies options.opacityWhenCovered when marker is hidden by 3d terrain', async () => {
|
|
1016
|
+
const map = createMap();
|
|
1017
|
+
map.transform.lngLatToCameraDepth = () => .95; // Mocking distance to marker
|
|
1018
|
+
const marker = new Marker({opacity: '0.7', opacityWhenCovered: '0.3'})
|
|
1019
|
+
.setLngLat([0, 0])
|
|
1020
|
+
.addTo(map);
|
|
1021
|
+
|
|
1022
|
+
map.terrain = {
|
|
1023
|
+
getElevationForLngLatZoom: () => 0,
|
|
1024
|
+
depthAtPoint: () => .92
|
|
1025
|
+
} as any as Terrain;
|
|
1026
|
+
await sleep(100);
|
|
1027
|
+
map.fire('terrain');
|
|
1028
|
+
|
|
1029
|
+
expect(marker.getElement().style.opacity).toMatch('0.3');
|
|
1030
|
+
map.remove();
|
|
1031
|
+
});
|
|
1032
|
+
|
|
1033
|
+
test('Applies new "opacityWhenCovered" provided by setOpacity when marker is hidden by 3d terrain', () => {
|
|
1034
|
+
const map = createMap();
|
|
1035
|
+
map.transform.lngLatToCameraDepth = () => .95; // Mocking distance to marker
|
|
1036
|
+
const marker = new Marker({opacityWhenCovered: '0.15'})
|
|
1037
|
+
.setLngLat([0, 0])
|
|
1038
|
+
.addTo(map);
|
|
1039
|
+
|
|
1040
|
+
map.terrain = {
|
|
1041
|
+
getElevationForLngLatZoom: () => 0,
|
|
1042
|
+
depthAtPoint: () => .92
|
|
1043
|
+
} as any as Terrain;
|
|
1044
|
+
map.fire('terrain');
|
|
1045
|
+
|
|
1046
|
+
marker.setOpacity(undefined, '0.35');
|
|
1047
|
+
|
|
1048
|
+
expect(marker.getElement().style.opacity).toMatch('0.35');
|
|
1049
|
+
map.remove();
|
|
1050
|
+
});
|
|
1051
|
+
|
|
1052
|
+
test('Removes an open popup when going behind 3d terrain', async () => {
|
|
1053
|
+
const map = createMap();
|
|
1054
|
+
const marker = new Marker()
|
|
1055
|
+
.setLngLat([0, 0])
|
|
1056
|
+
.addTo(map)
|
|
1057
|
+
.setPopup(new Popup());
|
|
1058
|
+
|
|
1059
|
+
await sleep(100);
|
|
1060
|
+
marker.togglePopup();
|
|
1061
|
+
|
|
1062
|
+
expect(marker._popup.isOpen()).toBeTruthy();
|
|
1063
|
+
|
|
1064
|
+
map.transform.lngLatToCameraDepth = () => .95; // Mocking distance to marker
|
|
1065
|
+
|
|
1066
|
+
map.terrain = {
|
|
1067
|
+
getElevationForLngLatZoom: () => 0,
|
|
1068
|
+
depthAtPoint: () => .92
|
|
1069
|
+
} as any as Terrain;
|
|
1070
|
+
map.fire('terrain');
|
|
1071
|
+
|
|
1072
|
+
await sleep(100);
|
|
1073
|
+
|
|
1074
|
+
expect(marker._popup?.isOpen()).toBeFalsy();
|
|
1075
|
+
map.remove();
|
|
1076
|
+
});
|
|
1077
|
+
|
|
1078
|
+
test('Does not open a popup when behind 3d terrain', async () => {
|
|
1079
|
+
const map = createMap();
|
|
1080
|
+
const marker = new Marker()
|
|
1081
|
+
.setLngLat([0, 0])
|
|
1082
|
+
.addTo(map)
|
|
1083
|
+
.setPopup(new Popup());
|
|
1084
|
+
|
|
1085
|
+
map.transform.lngLatToCameraDepth = () => .95;
|
|
1086
|
+
|
|
1087
|
+
map.terrain = {
|
|
1088
|
+
getElevationForLngLatZoom: () => 0,
|
|
1089
|
+
depthAtPoint: () => .92
|
|
1090
|
+
} as any as Terrain;
|
|
1091
|
+
map.fire('terrain');
|
|
1092
|
+
|
|
1093
|
+
await sleep(100);
|
|
1094
|
+
|
|
1095
|
+
marker.togglePopup();
|
|
1096
|
+
|
|
1097
|
+
expect(marker._popup.isOpen()).toBeFalsy();
|
|
1098
|
+
|
|
1099
|
+
map.remove();
|
|
1100
|
+
});
|
|
1101
|
+
|
|
1102
|
+
test('Marker\'s lng is wrapped when slightly crossing 180 with {renderWorldCopies: false}', () => {
|
|
1103
|
+
const map = createMap({width: 1024, renderWorldCopies: false});
|
|
1104
|
+
const marker = new Marker()
|
|
1105
|
+
.setLngLat([179, 0])
|
|
1106
|
+
.addTo(map);
|
|
1107
|
+
|
|
1108
|
+
marker.setLngLat([181, 0]);
|
|
1109
|
+
|
|
1110
|
+
expect(marker._lngLat.lng).toBe(-179);
|
|
1111
|
+
});
|
|
1112
|
+
|
|
1113
|
+
test('should round the marker transform position to whole pixels when subpixel positioning is disabled', () => {
|
|
1114
|
+
const map = createMap();
|
|
1115
|
+
const marker = new Marker()
|
|
1116
|
+
.setLngLat([0, 0])
|
|
1117
|
+
.addTo(map);
|
|
1118
|
+
|
|
1119
|
+
const transform = marker.getElement().style.transform;
|
|
1120
|
+
expect(transform)
|
|
1121
|
+
.toContain('translate(256px, 242px)');
|
|
1122
|
+
|
|
1123
|
+
marker.setLngLat([4.5, 4.5]);
|
|
1124
|
+
|
|
1125
|
+
const adjustedTransform = marker.getElement().style.transform;
|
|
1126
|
+
expect(adjustedTransform)
|
|
1127
|
+
.toContain('translate(262px, 236px)');
|
|
1128
|
+
|
|
1129
|
+
});
|
|
1130
|
+
|
|
1131
|
+
test('should round the marker transform position to sub pixels when subpixel positioning is enabled', () => {
|
|
1132
|
+
const map = createMap();
|
|
1133
|
+
const marker = new Marker()
|
|
1134
|
+
.setLngLat([0, 0])
|
|
1135
|
+
.setSubpixelPositioning(true)
|
|
1136
|
+
.addTo(map);
|
|
1137
|
+
|
|
1138
|
+
const transform = marker.getElement().style.transform;
|
|
1139
|
+
|
|
1140
|
+
expect(transform)
|
|
1141
|
+
.toContain('translate(256px, 242px)');
|
|
1142
|
+
|
|
1143
|
+
marker.setLngLat([4.5, 4.5]);
|
|
1144
|
+
|
|
1145
|
+
const adjustedTransform = marker.getElement().style.transform;
|
|
1146
|
+
expect(adjustedTransform)
|
|
1147
|
+
.toContain('translate(262.4px, 235.5934100987358px)');
|
|
1148
|
+
});
|
|
1149
|
+
});
|