import type Basemap from "./Basemap.js";
import type Ground from "./Ground.js";
import type Layer from "./layers/Layer.js";
import type FocusAreas from "./effects/FocusAreas.js";
import type { BasemapProperties } from "./Basemap.js";
import type { GroundProperties } from "./Ground.js";
import type { ReadonlyCollection } from "./core/Collection.js";
import type { EventedAccessor } from "./core/Evented.js";
import type { EditableLayerUnion } from "./layers/types.js";
import type { LayersMixin, LayersMixinProperties } from "./support/LayersMixin.js";
import type { TablesMixin, TablesMixinProperties } from "./support/TablesMixin.js";
import type { FocusAreasProperties } from "./effects/FocusAreas.js";

export interface MapProperties extends LayersMixinProperties, TablesMixinProperties {
  /**
   * Specifies a basemap for the map. The basemap is a set of layers that give
   * geographic context to the [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/) or
   * [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/) and the other [operational layers](https://developers.arcgis.com/javascript/latest/references/core/Map/#layers)
   * in the map.
   *
   * The basemap can be created in a variety of ways:
   * 1. From the **[basemap styles service (v2)](https://developers.arcgis.com/javascript/latest/references/core/support/BasemapStyle/)**
   * 2. From an instance of the **[Basemap](https://developers.arcgis.com/javascript/latest/references/core/Basemap/) class**
   * 3. From a **[basemap id](https://developers.arcgis.com/javascript/latest/references/core/Map/#basemap-id)**
   *
   * > [!WARNING]
   * >
   * > Use of these basemaps requires either an [ArcGIS Location Platform](https://location.arcgis.com/) account, [ArcGIS Online organizational](https://doc.arcgis.com/en/arcgis-online/get-started/create-account.htm#ESRI_SECTION1_24871ED982AC41ED86FF1937E7604CDE) subscription, or an [ArcGIS Enterprise license](https://enterprise.arcgis.com/en/).
   * >
   * > To authenticate basemap requests, you may need an access token. You can use an [API key](https://developers.arcgis.com/documentation/mapping-apis-and-services/security/api-keys/) or [OAuth 2.0](https://developers.arcgis.com/documentation/mapping-apis-and-services/security/oauth-2/). When using an API key, the key must have [privileges](https://developers.arcgis.com/documentation/mapping-apis-and-services/security/api-keys/#available-services) to access the appropriate location service.
   *
   * <span id="basemap-id"></span>
   * #### Basemap Id
   *
   * ##### Basemap Styles
   *
   * _Since version 4.28_
   *
   * Basemaps from the Basemap Styles service can be accessed using the id of the basemap style, in form of `{provider}/{style}`, for example `arcgis/navigation`. See [Basemap styles -> Requests](https://developers.arcgis.com/rest/basemap-styles/#requests) for the full list of available styles.
   *
   * ```js
   * map.basemap = "arcgis/topographic"; // sets the basemap to the ArcGIS topographic style
   * ```
   *
   * ##### 3D Basemaps
   *
   * _Since version 4.28_
   *
   * The 3D Basemaps can be accessed using the basemap id in the table below. They are designed to be used as basemaps in [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * Value | Source |
   * ------|------- |
   * `topo-3d` | [Topographic](https://www.arcgis.com/home/item.html?id=0560e29930dc4d5ebeb58c635c0909c9) |
   * `navigation-3d` | [Navigation](https://www.arcgis.com/home/item.html?id=00a5f468dda941d7bf0b51c144aae3f0) |
   * `navigation-dark-3d` | [Navigation (Dark)](https://www.arcgis.com/home/item.html?id=5a1365328b4943f09a54cf5fd1205707) |
   * `osm-3d` | [OpenStreetMap](https://www.arcgis.com/home/item.html?id=1c071fcf8ff2448599b0547116e2de55) |
   * `gray-3d` | [Light Gray Canvas](https://www.arcgis.com/home/item.html?id=35cdf329d663403b99df27d6ca5fa38d) |
   * `dark-gray-3d` | [Dark Gray Canvas](https://www.arcgis.com/home/item.html?id=a8b7322a5fe94002bb0f5e0eeb0c5c18) |
   * `streets-3d` | [Streets](https://www.arcgis.com/home/item.html?id=1754f80e7e6644e28ce0c4d35066e392) |
   * `streets-dark-3d` | [Streets (Dark)](https://www.arcgis.com/home/item.html?id=8a4efa2c20484ec9b4557895e65736ff) |
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > 3D Basemaps can only be used in [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * ##### 2D (legacy)
   *
   * _Since version 4.0_
   *
   * The legacy basemaps can be accessed using the basemap id in the table below. These are references to [enhanced](https://developers.arcgis.com/documentation/mapping-apis-and-services/service-endpoints/#2-enhanced-endpoint) basemap endpoints.
   *
   * <details>
   * <summary>Read More</summary>
   *
   * Value | Source |
   * ------|------- |
   * `satellite` | [World Imagery](https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer) |
   * `hybrid` | [Hybrid Reference Layer](https://www.arcgis.com/home/item.html?id=30d6b8271e1849cd9c3042060001f425) and [World Imagery](https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer) |
   * `oceans` | [World Ocean Reference](https://services.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer) and [World Ocean Base](https://services.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer) |
   * `osm` | [OpenStreetMapLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/OpenStreetMapLayer/) |
   * `terrain` | [World Reference Overlay](https://services.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer) and [World Hillshade](https://services.arcgisonline.com/ArcGIS/rest/services/Elevation/World_Hillshade/MapServer) |
   * `dark-gray` / `dark-gray-vector` | [Dark Gray Canvas](https://www.arcgis.com/home/item.html?id=c11ce4f7801740b2905eb03ddc963ac8)         |
   * `gray` / `gray-vector` | [Light Gray Canvas](https://www.arcgis.com/home/item.html?id=8a2cba3b0ebf4140b7c0dc5ee149549a)        |
   * `streets` / `streets-vector` | [World Street Map](https://www.arcgis.com/home/item.html?id=de26a3cf4cc9451298ea173c4b324736)         |
   * `streets-night-vector` | [World Street Map (Night)](https://www.arcgis.com/home/item.html?id=86f556a2d1fd468181855a35e344567f) |
   * `streets-navigation-vector` | [World Navigation Map](https://www.arcgis.com/home/item.html?id=63c47b7177f946b49902c24129b87252)     |
   * `topo` / `topo-vector` | [World Hillshade](https://services.arcgisonline.com/arcgis/rest/services/Elevation/World_Hillshade/MapServer) and [World Topographic Map](https://www.arcgis.com/home/item.html?id=7dc6cea0b1764a1f9af2e679f642f0f5) |
   * `streets-relief-vector` | [World Hillshade](https://services.arcgisonline.com/arcgis/rest/services/Elevation/World_Hillshade/MapServer) and [World Street Map (with Relief)](https://www.arcgis.com/home/item.html?id=b266e6d17fc345b498345613930fbd76) |
   *
   * </details>
   *
   * @example
   * // create the basemap from a string id representing the basemap style
   * const map = new Map({
   *   basemap: "arcgis/topographic"
   * });
   *
   * // create the basemap from a BasemapStyle object
   * const map = new Map({
   *  basemap: {
   *   style: {
   *    id:  "arcgis/outdoor",
   *    language: "es" // place labels will be displayed in spanish
   *   }
   *  }
   * });
   * @example
   * // Set the basemap from a string ID in the constructor
   * const map = new Map({
   *   basemap: "dark-gray-3d"
   * });
   *
   * // Set the basemap after the map instance is created
   * map.basemap = "topo-3d";
   * @example
   * // Create a VectorTileLayer from a style URL
   * const mapBaseLayer = new VectorTileLayer({
   *   url: "https://arcgis.com/sharing/rest/content/items/b5676525747f499687f12746441101ef/resources/styles/root.json"
   * });
   *
   * // Create a Basemap with the VectorTileLayer
   * const customBasemap = new Basemap({
   *   baseLayers: [mapBaseLayer],
   *   title: "Terrain"
   * });
   *
   * // Set the basemap to the customBasemap
   * const map = new Map({
   *   basemap: customBasemap
   * });
   */
  basemap?: BasemapProperties | string | null;
  /**
   * A container of all [focus areas](https://developers.arcgis.com/javascript/latest/references/core/effects/FocusAreas/) present in the map.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > Focus areas are only supported in [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * @see [FocusAreas](https://developers.arcgis.com/javascript/latest/references/core/effects/FocusAreas/)
   * @see [Sample - Focus Area](https://developers.arcgis.com/javascript/latest/sample-code/focus-area/)
   */
  focusAreas?: FocusAreasProperties;
  /**
   * Specifies the surface properties for the map. In MapView, this property is used by the
   * [ElevationProfileAnalysis](https://developers.arcgis.com/javascript/latest/references/core/analysis/ElevationProfileAnalysis/) when the
   * [profile](https://developers.arcgis.com/javascript/latest/references/core/analysis/ElevationProfileAnalysis/#profiles) contains an
   * [ElevationProfileLineGround](https://developers.arcgis.com/javascript/latest/references/core/analysis/ElevationProfile/ElevationProfileLineGround/).
   * In 3D [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/), it renders the
   * terrain or topographical variations in the real world on the map's surface
   * with a collection of [ElevationLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/ElevationLayer/).
   *
   * This value can be an instance of [Ground](https://developers.arcgis.com/javascript/latest/references/core/Ground/), or one of the following strings:
   * - `world-elevation` for a default instance of ground using the
   *   [Terrain3D Service](https://www.arcgis.com/home/item.html?id=7029fb60158543ad845c7e1527af11e4).
   * - `world-topobathymetry` for an instance of ground that combines surface elevation and bathymetry using the
   *   [TopoBathy3D Service](https://www.arcgis.com/home/item.html?id=0c69ba5a5d254118841d43f03aa3e97d).
   *
   * The ground may not be set to `null` or `undefined`, it is guaranteed to always
   * contain an instance of type [Ground](https://developers.arcgis.com/javascript/latest/references/core/Ground/). The elevation can be removed from the ground
   * by setting the ground property to a new empty [Ground](https://developers.arcgis.com/javascript/latest/references/core/Ground/) instance or by removing all
   * the ground layers.
   *
   * @see [ElevationLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/ElevationLayer/)
   * @see [Ground](https://developers.arcgis.com/javascript/latest/references/core/Ground/)
   * @example
   * // Use the world elevation service
   * const map = new Map({
   *   basemap: "topo-vector",
   *   ground: "world-elevation"
   * });
   * @example
   * // Create a map with the world elevation layer overlaid by a custom elevation layer
   * const worldElevation = new ElevationLayer({
   *   url: "//elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer"
   * });
   * const customElevation = new ElevationLayer({
   *   url: "https://my.server.com/arcgis/rest/service/MyElevationService/ImageServer"
   * });
   * const map = new Map({
   *   basemap: "topo-vector",
   *   ground: new Ground({
   *    layers: [ worldElevation, customElevation ]
   *   })
   * });
   */
  ground?: GroundProperties | string | null;
}

/**
 * The Map class contains properties and methods for storing, managing, and overlaying [layers](https://developers.arcgis.com/javascript/latest/references/core/Map/#layers)
 * common to both 2D and 3D viewing.
 * Layers can be added and removed from the map, but are rendered via a
 * [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/) (for viewing data in 2D) or a
 * [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/) (for viewing data in 3D). Thus a map instance is a simple container
 * that holds the layers, while the [View](https://developers.arcgis.com/javascript/latest/references/core/views/View/) is the means of displaying and
 * interacting with a map's layers and basemap.
 *
 * A single map may be referenced by multiple views. [This sample](https://developers.arcgis.com/javascript/latest/sample-code/views-synchronize/)
 * for example, contains a single Map that is visible in two separate views - one in [2D](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/)
 * and the other in [3D](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/). Because one map may be accessed by multiple views
 * in the same application, all user interaction with a map's layers is handled on the
 * [View](https://developers.arcgis.com/javascript/latest/references/core/views/View/), not the Map.
 *
 * An instance of Map is an essential component of the [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/)
 * and [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/). A Map object should be created prior to a
 * view so it can be passed into the `map` property of that view
 * (e.g. [MapView.map](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/#map), [SceneView.map](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/#map)).
 *
 * ```js
 * // Load the Map and MapView modules
 * const [Map, MapView] = await $arcgis.import(["@arcgis/core/Map.js", "@arcgis/core/views/MapView.js"]);
 * // Create a Map instance
 * const myMap = new Map({
 *   basemap: "streets-vector"
 * });
 * // Create a MapView instance (for 2D viewing) and reference the map instance
 * const view = new MapView({
 *   map: myMap
 * });
 * ```
 *
 * @since 4.0
 * @see [Sample - Intro to MapView](https://developers.arcgis.com/javascript/latest/sample-code/intro-mapview/)
 * @see [Sample - Intro to SceneView](https://developers.arcgis.com/javascript/latest/sample-code/intro-sceneview/)
 * @see [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/)
 * @see [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/)
 */
export default class Map extends MapSuperclass {
  /**
   * @example
   * // Typical usage
   * const map = new Map({
   *   basemap: "topo-vector"
   * });
   */
  constructor(properties?: MapProperties);
  /**
   * A flattened collection of all [layers](https://developers.arcgis.com/javascript/latest/references/core/layers/Layer/) in the map.
   * This collection contains [basemap layers](https://developers.arcgis.com/javascript/latest/references/core/Map/#basemap), [operational layers](https://developers.arcgis.com/javascript/latest/references/core/Map/#layers)
   * and [ground layers](https://developers.arcgis.com/javascript/latest/references/core/Map/#ground). [Group Layers](https://developers.arcgis.com/javascript/latest/references/core/layers/GroupLayer/) and their
   * [children layers](https://developers.arcgis.com/javascript/latest/references/core/layers/GroupLayer/#layers) are also
   * part of this collection. Reference layers in the basemap will always be included
   * at the end of the collection.
   *
   * Layers should not be added directly to this collection. They must only be added via the
   * [layers](https://developers.arcgis.com/javascript/latest/references/core/Map/#layers), [basemap](https://developers.arcgis.com/javascript/latest/references/core/Map/#basemap) or [ground](https://developers.arcgis.com/javascript/latest/references/core/Map/#ground) properties.
   *
   * > [!WARNING]
   * >
   * > To access a flattened collection of tables, use the [allTables](https://developers.arcgis.com/javascript/latest/references/core/Map/#allTables) property instead.
   *
   * @example
   * // Find a layer with title "US Counties"
   * const foundLayer = map.allLayers.find(function(layer) {
   *  return layer.title === "US Counties";
   * });
   *
   * // Create a filtered collection of the non-group layers
   * const nonGroupLayers = map.allLayers.filter(function(layer) {
   *  return !foundLayer.layers;
   * });
   *
   * // Listen for any layer being added or removed in the Map
   * map.allLayers.on("change", function(event) {
   *  console.log("Layer added: ", event.added);
   *  console.log("Layer removed: ", event.removed);
   *  console.log("Layer moved: ", event.moved);
   * });
   *
   * // Watching for changes to the visible layers in the Map
   * reactiveUtils.watch(
   *   () => view.map.allLayers.filter((layer) => layer.visible),
   *   (newVisibleLayers, oldVisibleLayers) => {
   *     const added = newVisibleLayers.filter(
   *       (layer) => !oldVisibleLayers.includes(layer)
   *     );
   *     const removed = oldVisibleLayers.filter(
   *       (layer) => !newVisibleLayers.includes(layer)
   *     );
   *     added.forEach((layer) => console.log(layer.title, "is visible"));
   *     removed.forEach((layer) => console.log(layer.title, "is not visible"));
   *   }
   * );
   */
  get allLayers(): ReadonlyCollection<Layer>;
  /**
   * A flattened collection of tables anywhere in the map's hierarchy. This will contain
   * individual tables within the map's [tables](https://developers.arcgis.com/javascript/latest/references/core/Map/#tables), in addition to any
   * [group layer tables](https://developers.arcgis.com/javascript/latest/references/core/layers/GroupLayer/#tables). In order for the
   * table(s) to be recognized as such, the [FeatureLayer.isTable](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/#isTable) property
   * must return `true`.
   *
   * > [!WARNING]
   * >
   * > Currently, only [feature layer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/) tables are recognized.
   * > To access spatial layers, use the [allLayers](https://developers.arcgis.com/javascript/latest/references/core/Map/#allLayers) property instead.
   *
   * @since 4.17
   * @example
   * // A feature layer where isTable = true.
   * const foundTable = map.allTables.find(function(table) {
   *   // Find a table with title "US Counties"
   *   return table.title === "US Counties";
   * });
   */
  get allTables(): ReadonlyCollection<Layer>;
  /**
   * Specifies a basemap for the map. The basemap is a set of layers that give
   * geographic context to the [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/) or
   * [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/) and the other [operational layers](https://developers.arcgis.com/javascript/latest/references/core/Map/#layers)
   * in the map.
   *
   * The basemap can be created in a variety of ways:
   * 1. From the **[basemap styles service (v2)](https://developers.arcgis.com/javascript/latest/references/core/support/BasemapStyle/)**
   * 2. From an instance of the **[Basemap](https://developers.arcgis.com/javascript/latest/references/core/Basemap/) class**
   * 3. From a **[basemap id](https://developers.arcgis.com/javascript/latest/references/core/Map/#basemap-id)**
   *
   * > [!WARNING]
   * >
   * > Use of these basemaps requires either an [ArcGIS Location Platform](https://location.arcgis.com/) account, [ArcGIS Online organizational](https://doc.arcgis.com/en/arcgis-online/get-started/create-account.htm#ESRI_SECTION1_24871ED982AC41ED86FF1937E7604CDE) subscription, or an [ArcGIS Enterprise license](https://enterprise.arcgis.com/en/).
   * >
   * > To authenticate basemap requests, you may need an access token. You can use an [API key](https://developers.arcgis.com/documentation/mapping-apis-and-services/security/api-keys/) or [OAuth 2.0](https://developers.arcgis.com/documentation/mapping-apis-and-services/security/oauth-2/). When using an API key, the key must have [privileges](https://developers.arcgis.com/documentation/mapping-apis-and-services/security/api-keys/#available-services) to access the appropriate location service.
   *
   * <span id="basemap-id"></span>
   * #### Basemap Id
   *
   * ##### Basemap Styles
   *
   * _Since version 4.28_
   *
   * Basemaps from the Basemap Styles service can be accessed using the id of the basemap style, in form of `{provider}/{style}`, for example `arcgis/navigation`. See [Basemap styles -> Requests](https://developers.arcgis.com/rest/basemap-styles/#requests) for the full list of available styles.
   *
   * ```js
   * map.basemap = "arcgis/topographic"; // sets the basemap to the ArcGIS topographic style
   * ```
   *
   * ##### 3D Basemaps
   *
   * _Since version 4.28_
   *
   * The 3D Basemaps can be accessed using the basemap id in the table below. They are designed to be used as basemaps in [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * Value | Source |
   * ------|------- |
   * `topo-3d` | [Topographic](https://www.arcgis.com/home/item.html?id=0560e29930dc4d5ebeb58c635c0909c9) |
   * `navigation-3d` | [Navigation](https://www.arcgis.com/home/item.html?id=00a5f468dda941d7bf0b51c144aae3f0) |
   * `navigation-dark-3d` | [Navigation (Dark)](https://www.arcgis.com/home/item.html?id=5a1365328b4943f09a54cf5fd1205707) |
   * `osm-3d` | [OpenStreetMap](https://www.arcgis.com/home/item.html?id=1c071fcf8ff2448599b0547116e2de55) |
   * `gray-3d` | [Light Gray Canvas](https://www.arcgis.com/home/item.html?id=35cdf329d663403b99df27d6ca5fa38d) |
   * `dark-gray-3d` | [Dark Gray Canvas](https://www.arcgis.com/home/item.html?id=a8b7322a5fe94002bb0f5e0eeb0c5c18) |
   * `streets-3d` | [Streets](https://www.arcgis.com/home/item.html?id=1754f80e7e6644e28ce0c4d35066e392) |
   * `streets-dark-3d` | [Streets (Dark)](https://www.arcgis.com/home/item.html?id=8a4efa2c20484ec9b4557895e65736ff) |
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > 3D Basemaps can only be used in [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * ##### 2D (legacy)
   *
   * _Since version 4.0_
   *
   * The legacy basemaps can be accessed using the basemap id in the table below. These are references to [enhanced](https://developers.arcgis.com/documentation/mapping-apis-and-services/service-endpoints/#2-enhanced-endpoint) basemap endpoints.
   *
   * <details>
   * <summary>Read More</summary>
   *
   * Value | Source |
   * ------|------- |
   * `satellite` | [World Imagery](https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer) |
   * `hybrid` | [Hybrid Reference Layer](https://www.arcgis.com/home/item.html?id=30d6b8271e1849cd9c3042060001f425) and [World Imagery](https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer) |
   * `oceans` | [World Ocean Reference](https://services.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Reference/MapServer) and [World Ocean Base](https://services.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer) |
   * `osm` | [OpenStreetMapLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/OpenStreetMapLayer/) |
   * `terrain` | [World Reference Overlay](https://services.arcgisonline.com/ArcGIS/rest/services/Reference/World_Reference_Overlay/MapServer) and [World Hillshade](https://services.arcgisonline.com/ArcGIS/rest/services/Elevation/World_Hillshade/MapServer) |
   * `dark-gray` / `dark-gray-vector` | [Dark Gray Canvas](https://www.arcgis.com/home/item.html?id=c11ce4f7801740b2905eb03ddc963ac8)         |
   * `gray` / `gray-vector` | [Light Gray Canvas](https://www.arcgis.com/home/item.html?id=8a2cba3b0ebf4140b7c0dc5ee149549a)        |
   * `streets` / `streets-vector` | [World Street Map](https://www.arcgis.com/home/item.html?id=de26a3cf4cc9451298ea173c4b324736)         |
   * `streets-night-vector` | [World Street Map (Night)](https://www.arcgis.com/home/item.html?id=86f556a2d1fd468181855a35e344567f) |
   * `streets-navigation-vector` | [World Navigation Map](https://www.arcgis.com/home/item.html?id=63c47b7177f946b49902c24129b87252)     |
   * `topo` / `topo-vector` | [World Hillshade](https://services.arcgisonline.com/arcgis/rest/services/Elevation/World_Hillshade/MapServer) and [World Topographic Map](https://www.arcgis.com/home/item.html?id=7dc6cea0b1764a1f9af2e679f642f0f5) |
   * `streets-relief-vector` | [World Hillshade](https://services.arcgisonline.com/arcgis/rest/services/Elevation/World_Hillshade/MapServer) and [World Street Map (with Relief)](https://www.arcgis.com/home/item.html?id=b266e6d17fc345b498345613930fbd76) |
   *
   * </details>
   *
   * @example
   * // create the basemap from a string id representing the basemap style
   * const map = new Map({
   *   basemap: "arcgis/topographic"
   * });
   *
   * // create the basemap from a BasemapStyle object
   * const map = new Map({
   *  basemap: {
   *   style: {
   *    id:  "arcgis/outdoor",
   *    language: "es" // place labels will be displayed in spanish
   *   }
   *  }
   * });
   * @example
   * // Set the basemap from a string ID in the constructor
   * const map = new Map({
   *   basemap: "dark-gray-3d"
   * });
   *
   * // Set the basemap after the map instance is created
   * map.basemap = "topo-3d";
   * @example
   * // Create a VectorTileLayer from a style URL
   * const mapBaseLayer = new VectorTileLayer({
   *   url: "https://arcgis.com/sharing/rest/content/items/b5676525747f499687f12746441101ef/resources/styles/root.json"
   * });
   *
   * // Create a Basemap with the VectorTileLayer
   * const customBasemap = new Basemap({
   *   baseLayers: [mapBaseLayer],
   *   title: "Terrain"
   * });
   *
   * // Set the basemap to the customBasemap
   * const map = new Map({
   *   basemap: customBasemap
   * });
   */
  get basemap(): Basemap | null | undefined;
  set basemap(value: BasemapProperties | string | null | undefined);
  /**
   * 
   * A collection of editable layers. Layers are considered editable if they have editing capabilities, and if the authenticated user has the
   * necessary privileges needed to edit the layers.
   *
   * @since 4.20
   * @see [Editor component](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-editor/)
   * @see [Sample - Edit features with the Editor component](https://developers.arcgis.com/javascript/latest/sample-code/editor-basic/)
   */
  get editableLayers(): ReadonlyCollection<EditableLayerUnion>;
  /**
   * A container of all [focus areas](https://developers.arcgis.com/javascript/latest/references/core/effects/FocusAreas/) present in the map.
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > Focus areas are only supported in [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * @see [FocusAreas](https://developers.arcgis.com/javascript/latest/references/core/effects/FocusAreas/)
   * @see [Sample - Focus Area](https://developers.arcgis.com/javascript/latest/sample-code/focus-area/)
   */
  get focusAreas(): FocusAreas;
  set focusAreas(value: FocusAreasProperties);
  /**
   * Specifies the surface properties for the map. In MapView, this property is used by the
   * [ElevationProfileAnalysis](https://developers.arcgis.com/javascript/latest/references/core/analysis/ElevationProfileAnalysis/) when the
   * [profile](https://developers.arcgis.com/javascript/latest/references/core/analysis/ElevationProfileAnalysis/#profiles) contains an
   * [ElevationProfileLineGround](https://developers.arcgis.com/javascript/latest/references/core/analysis/ElevationProfile/ElevationProfileLineGround/).
   * In 3D [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/), it renders the
   * terrain or topographical variations in the real world on the map's surface
   * with a collection of [ElevationLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/ElevationLayer/).
   *
   * This value can be an instance of [Ground](https://developers.arcgis.com/javascript/latest/references/core/Ground/), or one of the following strings:
   * - `world-elevation` for a default instance of ground using the
   *   [Terrain3D Service](https://www.arcgis.com/home/item.html?id=7029fb60158543ad845c7e1527af11e4).
   * - `world-topobathymetry` for an instance of ground that combines surface elevation and bathymetry using the
   *   [TopoBathy3D Service](https://www.arcgis.com/home/item.html?id=0c69ba5a5d254118841d43f03aa3e97d).
   *
   * The ground may not be set to `null` or `undefined`, it is guaranteed to always
   * contain an instance of type [Ground](https://developers.arcgis.com/javascript/latest/references/core/Ground/). The elevation can be removed from the ground
   * by setting the ground property to a new empty [Ground](https://developers.arcgis.com/javascript/latest/references/core/Ground/) instance or by removing all
   * the ground layers.
   *
   * @see [ElevationLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/ElevationLayer/)
   * @see [Ground](https://developers.arcgis.com/javascript/latest/references/core/Ground/)
   * @example
   * // Use the world elevation service
   * const map = new Map({
   *   basemap: "topo-vector",
   *   ground: "world-elevation"
   * });
   * @example
   * // Create a map with the world elevation layer overlaid by a custom elevation layer
   * const worldElevation = new ElevationLayer({
   *   url: "//elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer"
   * });
   * const customElevation = new ElevationLayer({
   *   url: "https://my.server.com/arcgis/rest/service/MyElevationService/ImageServer"
   * });
   * const map = new Map({
   *   basemap: "topo-vector",
   *   ground: new Ground({
   *    layers: [ worldElevation, customElevation ]
   *   })
   * });
   */
  get ground(): Ground;
  set ground(value: GroundProperties | string | null | undefined);
  /**
   * Destroys the map, and any associated resources, including its [layers](https://developers.arcgis.com/javascript/latest/references/core/Map/#layers), [basemap](https://developers.arcgis.com/javascript/latest/references/core/Map/#basemap), [tables](https://developers.arcgis.com/javascript/latest/references/core/Map/#tables),  and [ground](https://developers.arcgis.com/javascript/latest/references/core/Map/#ground).
   * These can no longer be used once the map has been destroyed. To prevent these objects from being destroyed,
   * remove them from the map before calling `destroy()`.
   *
   * ```
   * // prevent the layers from being destroyed by removing them from the map
   * const layers = map.layers.removeAll();
   *
   * // prevent the tables from being destroyed by removing them from the map
   * const tables = map.tables.removeAll();
   *
   * // unset basemap from the map so that it is not destroyed
   * const basemap = map.basemap;
   * map.basemap = null;
   *
   * // remove ground layers from the map so that they aren't destroyed
   * const groundLayers = map.ground.removeAll();
   *
   * // destroy the map and any remaining associated resources
   * map.destroy();
   * ```
   *
   * @since 4.17
   * @see [WebMap.destroy()](https://developers.arcgis.com/javascript/latest/references/core/WebMap/#destroy)
   * @see [WebScene.destroy()](https://developers.arcgis.com/javascript/latest/references/core/WebScene/#destroy)
   * @see [Basemap.destroy()](https://developers.arcgis.com/javascript/latest/references/core/Basemap/#destroy)
   * @see [Ground.destroy()](https://developers.arcgis.com/javascript/latest/references/core/Ground/#destroy)
   * @see [Layer.destroy()](https://developers.arcgis.com/javascript/latest/references/core/layers/Layer/#destroy)
   * @see [PortalItem.destroy()](https://developers.arcgis.com/javascript/latest/references/core/portal/PortalItem/#destroy)
   */
  destroy(): void;
}
declare const MapSuperclass: typeof EventedAccessor & typeof LayersMixin & typeof TablesMixin