{"version":3,"file":"BasemapControl-DgR3c4ci.cjs","sources":["../src/lib/core/catalog.ts","../src/lib/core/BasemapControl.ts"],"sourcesContent":["import type {\n  BasemapDefinition,\n  BasemapProvider,\n  GoogleSessionConfig,\n} from \"./types\";\n\nexport const DEFAULT_BASEMAP_PROVIDERS: BasemapProvider[] = [\n  { id: \"amap\", name: \"Amap\", category: \"Regional\" },\n  { id: \"amazon\", name: \"Amazon Location\", category: \"General\" },\n  { id: \"carto\", name: \"Carto\", category: \"General\" },\n  { id: \"cyclosm\", name: \"CyclOSM\", category: \"Cycling\" },\n  { id: \"eox\", name: \"EOX\", category: \"Imagery\" },\n  { id: \"esri\", name: \"ESRI\", category: \"Imagery\" },\n  { id: \"google\", name: \"Google\", category: \"General\" },\n  { id: \"here\", name: \"HERE\", category: \"Traffic\" },\n  { id: \"mapbox\", name: \"Mapbox\", category: \"General\" },\n  { id: \"maptiler\", name: \"MapTiler\", category: \"General\" },\n  { id: \"maptoolkit\", name: \"Maptoolkit\", category: \"Outdoor\" },\n  { id: \"nasa-gibs\", name: \"NASA GIBS\", category: \"Imagery\" },\n  { id: \"openbasiskaart\", name: \"Openbasiskaart\", category: \"Regional\" },\n  { id: \"openfreemap\", name: \"OpenFreeMap\", category: \"Vector Styles\" },\n  { id: \"openrailwaymap\", name: \"OpenRailwayMap\", category: \"Transport\" },\n  { id: \"openstreetmap\", name: \"OpenStreetMap\", category: \"Community\" },\n  { id: \"opentopomap\", name: \"OpenTopoMap\", category: \"Terrain\" },\n  { id: \"protomaps\", name: \"Protomaps\", category: \"Vector Styles\" },\n  { id: \"stadia\", name: \"Stadia Maps\", category: \"General\" },\n  { id: \"swisstopo\", name: \"Swiss Federal Geoportal\", category: \"Regional\" },\n  { id: \"tencent\", name: \"Tencent Maps\", category: \"Regional\" },\n  { id: \"tianditu\", name: \"Tianditu\", category: \"Regional\" },\n  { id: \"tomtom\", name: \"TomTom\", category: \"Traffic\" },\n  { id: \"topplusopen\", name: \"TopPlusOpen\", category: \"Regional\" },\n  { id: \"usgs\", name: \"USGS\", category: \"United States\" },\n  { id: \"waymarkedtrails\", name: \"Waymarked Trails\", category: \"Outdoor\" },\n];\n\nfunction rasterBasemap({\n  id,\n  name,\n  provider,\n  category,\n  description,\n  attribution,\n  tiles,\n  maxzoom = 19,\n  scheme,\n  tags = [],\n}: Omit<BasemapDefinition, \"type\" | \"source\"> & {\n  tiles: string[];\n  maxzoom?: number;\n  scheme?: \"xyz\" | \"tms\";\n}): BasemapDefinition {\n  return {\n    id,\n    name,\n    provider,\n    type: \"raster\",\n    category,\n    description,\n    attribution,\n    source: {\n      type: \"raster\",\n      tiles,\n      tileSize: 256,\n      maxzoom,\n      scheme,\n    },\n    tags,\n  };\n}\n\nfunction styleBasemap({\n  id,\n  name,\n  provider,\n  category,\n  description,\n  attribution,\n  url,\n  view,\n  tags = [],\n}: Omit<BasemapDefinition, \"type\" | \"source\"> & {\n  url: string;\n}): BasemapDefinition {\n  return {\n    id,\n    name,\n    provider,\n    type: \"style\",\n    category,\n    description,\n    attribution,\n    source: {\n      type: \"style\",\n      url,\n    },\n    view,\n    tags,\n  };\n}\n\nfunction mapTilerStyleBasemap({\n  id,\n  name,\n  mapId,\n  category,\n  description,\n  url,\n  tags = [],\n}: {\n  id: string;\n  name: string;\n  mapId: string;\n  category: string;\n  description: string;\n  url?: string;\n  tags?: string[];\n}): BasemapDefinition {\n  return styleBasemap({\n    id,\n    name,\n    provider: \"maptiler\",\n    category,\n    description,\n    attribution: MAPTILER_ATTRIBUTION,\n    url:\n      url ?? `https://api.maptiler.com/maps/${mapId}/style.json?key={api-key}`,\n    tags: [\"maptiler\", \"vector\", \"style\", ...tags],\n  });\n}\n\nfunction amazonStyleBasemap({\n  id,\n  name,\n  mapStyle,\n  category,\n  description,\n  tags = [],\n}: {\n  id: string;\n  name: string;\n  mapStyle: string;\n  category: string;\n  description: string;\n  tags?: string[];\n}): BasemapDefinition {\n  return styleBasemap({\n    id,\n    name,\n    provider: \"amazon\",\n    category,\n    description,\n    attribution: AMAZON_ATTRIBUTION,\n    url: `https://maps.geo.{aws-region}.amazonaws.com/v2/styles/${mapStyle}/descriptor?key={api-key}`,\n    tags: [\"amazon\", \"aws\", \"location\", \"style\", ...tags],\n  });\n}\n\nfunction mapboxStyleBasemap({\n  id,\n  name,\n  styleId,\n  category,\n  description,\n  tags = [],\n}: {\n  id: string;\n  name: string;\n  styleId: string;\n  category: string;\n  description: string;\n  tags?: string[];\n}): BasemapDefinition {\n  return styleBasemap({\n    id,\n    name,\n    provider: \"mapbox\",\n    category,\n    description,\n    attribution: MAPBOX_ATTRIBUTION,\n    url: `https://api.mapbox.com/styles/v1/mapbox/${styleId}?access_token={api-key}`,\n    tags: [\"mapbox\", \"vector\", \"style\", ...tags],\n  });\n}\n\nfunction mapToolkitStyleBasemap({\n  id,\n  name,\n  styleId,\n  category,\n  description,\n  tags = [],\n}: {\n  id: string;\n  name: string;\n  styleId: string;\n  category: string;\n  description: string;\n  tags?: string[];\n}): BasemapDefinition {\n  return styleBasemap({\n    id,\n    name,\n    provider: \"maptoolkit\",\n    category,\n    description,\n    attribution: MAPTOOLKIT_ATTRIBUTION,\n    url: `https://styles.maptoolkit.org/${styleId}.json`,\n    tags: [\"maptoolkit\", \"vector\", \"style\", ...tags],\n  });\n}\n\nfunction protomapsStyleBasemap({\n  id,\n  name,\n  styleId,\n  category,\n  description,\n  tags = [],\n}: {\n  id: string;\n  name: string;\n  styleId: string;\n  category: string;\n  description: string;\n  tags?: string[];\n}): BasemapDefinition {\n  return styleBasemap({\n    id,\n    name,\n    provider: \"protomaps\",\n    category,\n    description,\n    attribution: PROTOMAPS_ATTRIBUTION,\n    url: `https://api.protomaps.com/styles/v5/${styleId}/en.json?key={api-key}`,\n    tags: [\"protomaps\", \"vector\", \"style\", ...tags],\n  });\n}\n\n// Stadia Maps raster tiles. The key rides on each tile URL as `?api_key=`, so\n// the standard `{api-key}` raster substitution covers it (like TomTom/HERE).\n// The Stamen styles carry an extra Stamen Design credit.\nfunction stadiaRasterBasemap({\n  id,\n  name,\n  slug,\n  category,\n  description,\n  extension = \"png\",\n  maxzoom = 20,\n  stamen = false,\n  tags = [],\n}: {\n  id: string;\n  name: string;\n  slug: string;\n  category: string;\n  description: string;\n  extension?: \"png\" | \"jpg\";\n  maxzoom?: number;\n  stamen?: boolean;\n  tags?: string[];\n}): BasemapDefinition {\n  return rasterBasemap({\n    id,\n    name,\n    provider: \"stadia\",\n    category,\n    description,\n    attribution: stamen ? STADIA_STAMEN_ATTRIBUTION : STADIA_ATTRIBUTION,\n    tiles: [\n      `https://tiles.stadiamaps.com/tiles/${slug}/{z}/{x}/{y}.${extension}?api_key={api-key}`,\n    ],\n    maxzoom,\n    tags: [\"stadia\", ...(stamen ? [\"stamen\"] : []), ...tags],\n  });\n}\n\n// Tianditu serves the same tiles from t0..t7. Browsers multiplex over HTTP/2 so\n// the sharding no longer buys throughput, but spreading requests keeps any one\n// host from tripping the per-host rate limit on a free key.\nconst TIANDITU_HOSTS = [0, 1, 2, 3, 4, 5, 6, 7];\n\n// Tianditu's DataServer endpoint, the xyz-shaped form of its WMTS services.\n// `T` names the layer (`vec_w` vector, `img_w` imagery, `ter_w` terrain, and the\n// `c*_w` annotation overlays that carry their labels), and `tk` is the free API\n// key from tianditu.gov.cn, which rides on the URL like TomTom's and HERE's, so\n// the standard `{api-key}` raster substitution covers it. The layers are\n// published in CGCS2000 on the Web Mercator grid, so `{z}/{x}/{y}` maps\n// directly onto `l`/`x`/`y`.\nfunction tiandituRasterBasemap({\n  id,\n  name,\n  layer,\n  category,\n  description,\n  maxzoom = 18,\n  tags = [],\n}: {\n  id: string;\n  name: string;\n  layer: string;\n  category: string;\n  description: string;\n  maxzoom?: number;\n  tags?: string[];\n}): BasemapDefinition {\n  return rasterBasemap({\n    id,\n    name,\n    provider: \"tianditu\",\n    category,\n    description,\n    attribution: TIANDITU_ATTRIBUTION,\n    tiles: TIANDITU_HOSTS.map(\n      (host) =>\n        `https://t${host}.tianditu.gov.cn/DataServer?T=${layer}&x={x}&y={y}&l={z}&tk={api-key}`,\n    ),\n    maxzoom,\n    tags: [\"tianditu\", \"china\", \"天地图\", ...tags],\n  });\n}\n\n// Amap serves each product from four numbered hosts (`wprd01`..`wprd04` for the\n// street map, `webst01`..`webst04` for imagery and the label overlay). `style`\n// selects the product: 7 street, 6 imagery, 8 roads-and-labels.\nfunction amapTiles(host: \"wprd\" | \"webst\", query: string): string[] {\n  return [1, 2, 3, 4].map(\n    (index) =>\n      `https://${host}0${index}.is.autonavi.com/appmaptile?${query}&x={x}&y={y}&z={z}`,\n  );\n}\n\nfunction sortProviders(providers: BasemapProvider[]): BasemapProvider[] {\n  return [...providers].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nconst AMAZON_ATTRIBUTION = \"&copy; Amazon Location Service\";\nconst CARTO_ATTRIBUTION = \"&copy; OpenStreetMap contributors &copy; CARTO\";\nconst ESRI_ATTRIBUTION = \"Tiles &copy; Esri and the GIS User Community\";\nconst MAPBOX_ATTRIBUTION = \"&copy; Mapbox &copy; OpenStreetMap contributors\";\nconst MAPTILER_ATTRIBUTION =\n  \"&copy; MapTiler &copy; OpenStreetMap contributors\";\nconst OSM_ATTRIBUTION = \"&copy; OpenStreetMap contributors\";\n// The Maptoolkit style JSONs ship no `attribution` on their sources, and\n// Maptoolkit requires the \"© Maptoolkit © OSM\" credit as clickable links, so the\n// catalog supplies it.\nconst MAPTOOLKIT_ATTRIBUTION =\n  '<a href=\"https://www.maptoolkit.org\" target=\"_blank\" rel=\"noopener\">&copy; Maptoolkit</a> <a href=\"https://www.openstreetmap.org/copyright\" target=\"_blank\" rel=\"noopener\">&copy; OSM</a>';\nconst STADIA_ATTRIBUTION =\n  '&copy; <a href=\"https://stadiamaps.com/\" target=\"_blank\" rel=\"noopener\">Stadia Maps</a> &copy; <a href=\"https://openmaptiles.org/\" target=\"_blank\" rel=\"noopener\">OpenMapTiles</a> &copy; OpenStreetMap contributors';\nconst STADIA_STAMEN_ATTRIBUTION =\n  '&copy; <a href=\"https://stadiamaps.com/\" target=\"_blank\" rel=\"noopener\">Stadia Maps</a> &copy; <a href=\"https://stamen.com/\" target=\"_blank\" rel=\"noopener\">Stamen Design</a> &copy; <a href=\"https://openmaptiles.org/\" target=\"_blank\" rel=\"noopener\">OpenMapTiles</a> &copy; OpenStreetMap contributors';\nconst PROTOMAPS_ATTRIBUTION =\n  '<a href=\"https://protomaps.com\" target=\"_blank\" rel=\"noopener\">Protomaps</a> &copy; <a href=\"https://openstreetmap.org\" target=\"_blank\" rel=\"noopener\">OpenStreetMap</a>';\nconst OPENFREEMAP_ATTRIBUTION =\n  \"OpenFreeMap &copy; OpenMapTiles Data from OpenStreetMap\";\nconst TIANDITU_ATTRIBUTION =\n  '&copy; <a href=\"https://www.tianditu.gov.cn\" target=\"_blank\" rel=\"noopener\">天地图 Tianditu</a> (National Platform for Common Geospatial Information Services)';\nconst AMAP_ATTRIBUTION =\n  '&copy; <a href=\"https://www.amap.com\" target=\"_blank\" rel=\"noopener\">高德地图 Amap</a>';\nconst TENCENT_ATTRIBUTION =\n  '&copy; <a href=\"https://map.qq.com\" target=\"_blank\" rel=\"noopener\">腾讯地图 Tencent Maps</a>';\n\n// Amap and Tencent tiles are drawn in GCJ-02 (\"Mars coordinates\"), the offset\n// datum Chinese law mandates for public map services. WGS84 data overlaid on\n// them lands roughly 100-700 m off, and neither this control nor MapLibre\n// applies the shift, so every affected basemap says so in its description.\n// Tianditu is the exception: it publishes in CGCS2000, which is close enough to\n// WGS84 for web mapping, so ordinary data aligns without conversion.\nconst GCJ02_WARNING =\n  \"Tiles are in the GCJ-02 datum, so WGS84 data overlaid on them appears offset by roughly 100-700 m.\";\n\nconst TOMTOM_ATTRIBUTION = \"&copy; TomTom\";\nconst HERE_ATTRIBUTION = \"&copy; HERE\";\nconst GOOGLE_ATTRIBUTION = \"&copy; Google\";\n// Authorized Google Map Tiles API 2D tile endpoint. `{session}` is replaced\n// with a token minted from `createSession` and `{api-key}` with the configured\n// Google Maps API key.\nconst GOOGLE_2DTILES_URL =\n  \"https://tile.googleapis.com/v1/2dtiles/{z}/{x}/{y}?session={session}&key={api-key}\";\n\n// Google base raster basemaps default to the keyless QGIS-style xyz tiles from\n// mt1.google.com, so `tiles` is directly usable with no credentials. When a\n// Google Maps API key is configured they upgrade to `sessionTiles`, the official\n// Map Tiles API endpoint (like the Google Traffic overlay), minting a session\n// token so tiles come from Google's authorized endpoint.\nfunction googleRasterBasemap({\n  id,\n  name,\n  category,\n  description,\n  publicLyrs,\n  session,\n  tags,\n}: {\n  id: string;\n  name: string;\n  category: string;\n  description: string;\n  publicLyrs: string;\n  session: GoogleSessionConfig;\n  tags: string[];\n}): BasemapDefinition {\n  return {\n    id,\n    name,\n    provider: \"google\",\n    type: \"raster\",\n    category,\n    description,\n    attribution: GOOGLE_ATTRIBUTION,\n    source: {\n      type: \"raster\",\n      tiles: [`https://mt1.google.com/vt/lyrs=${publicLyrs}&x={x}&y={y}&z={z}`],\n      sessionTiles: [GOOGLE_2DTILES_URL],\n      tileSize: 256,\n      maxzoom: 20,\n      googleSession: session,\n    },\n    tags,\n  };\n}\nconst eoxS2CloudlessAttribution = (year: number): string =>\n  `Sentinel-2 cloudless <a href=\"https://cloudless.eox.at\" target=\"_blank\" rel=\"noopener\">EOxCloudless</a> by EOX IT Services GmbH (Contains modified Copernicus Sentinel data ${year})`;\n// Annual EOX Sentinel-2 cloudless mosaics published as WMTS layers\n// (s2cloudless-<year>_3857). EOX offers yearly mosaics from 2017 onward; the\n// catalog exposes one basemap per year so users can pick a specific vintage.\nconst EOX_S2CLOUDLESS_YEARS = [\n  2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025,\n] as const;\n\nfunction eoxS2CloudlessBasemap(year: number): BasemapDefinition {\n  return rasterBasemap({\n    id: `eox-s2cloudless-${year}`,\n    name: `EOX Sentinel-2 cloudless ${year}`,\n    provider: \"eox\",\n    category: \"Imagery\",\n    description: `Cloudless Sentinel-2 satellite mosaic for ${year} (non-commercial use).`,\n    attribution: eoxS2CloudlessAttribution(year),\n    tiles: [\n      `https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-${year}_3857/default/GoogleMapsCompatible/{z}/{y}/{x}.jpg`,\n    ],\n    maxzoom: 16,\n    tags: [\n      \"eox\",\n      \"sentinel\",\n      \"satellite\",\n      \"imagery\",\n      \"cloudless\",\n      \"copernicus\",\n      String(year),\n    ],\n  });\n}\nconst EOX_TERRAIN_LIGHT_ATTRIBUTION =\n  'Terrain Light <a href=\"https://maps.eox.at\" target=\"_blank\" rel=\"noopener\">EOX</a> (Data &copy; OpenStreetMap contributors and others, Rendering &copy; EOX)';\nconst EOX_TERRAIN_ATTRIBUTION =\n  'Terrain <a href=\"https://maps.eox.at\" target=\"_blank\" rel=\"noopener\">EOX</a> (Data &copy; OpenStreetMap contributors and others, Rendering &copy; EOX)';\nconst EOX_OVERLAY_ATTRIBUTION =\n  'Overlay <a href=\"https://maps.eox.at\" target=\"_blank\" rel=\"noopener\">EOX</a> (Data &copy; OpenStreetMap contributors and others, Rendering &copy; EOX)';\n\n// Congestion color ramp shared by the Mapbox Traffic vector overlay. Mapbox\n// Traffic v1 encodes each road segment's level in a `congestion` property, so a\n// single line layer can color the whole network with a data-driven `match`.\nconst MAPBOX_TRAFFIC_CONGESTION_COLORS = [\n  \"match\",\n  [\"get\", \"congestion\"],\n  \"low\",\n  \"#4caf50\",\n  \"moderate\",\n  \"#ffc107\",\n  \"heavy\",\n  \"#ff5722\",\n  \"severe\",\n  \"#b71c1c\",\n  \"#9e9e9e\",\n];\n\nfunction rasterTrafficBasemap({\n  id,\n  name,\n  provider,\n  description,\n  attribution,\n  tiles,\n  maxzoom = 22,\n  tags = [],\n}: {\n  id: string;\n  name: string;\n  provider: string;\n  description: string;\n  attribution: string;\n  tiles: string[];\n  maxzoom?: number;\n  tags?: string[];\n}): BasemapDefinition {\n  return rasterBasemap({\n    id,\n    name,\n    provider,\n    category: \"Traffic\",\n    description,\n    attribution,\n    tiles,\n    maxzoom,\n    tags: [\"traffic\", \"overlay\", ...tags],\n  });\n}\n\nexport const DEFAULT_BASEMAPS: BasemapDefinition[] = [\n  rasterBasemap({\n    id: \"osm-standard\",\n    name: \"OpenStreetMap Standard\",\n    provider: \"openstreetmap\",\n    category: \"Street\",\n    description: \"Community-maintained street map.\",\n    attribution: OSM_ATTRIBUTION,\n    tiles: [\n      \"https://a.tile.openstreetmap.org/{z}/{x}/{y}.png\",\n      \"https://b.tile.openstreetmap.org/{z}/{x}/{y}.png\",\n      \"https://c.tile.openstreetmap.org/{z}/{x}/{y}.png\",\n    ],\n    tags: [\"osm\", \"street\", \"standard\"],\n  }),\n  rasterBasemap({\n    id: \"osm-hot\",\n    name: \"OpenStreetMap HOT\",\n    provider: \"openstreetmap\",\n    category: \"Street\",\n    description: \"Humanitarian OpenStreetMap Team style.\",\n    attribution: `${OSM_ATTRIBUTION}, Tiles style by Humanitarian OpenStreetMap Team`,\n    tiles: [\"https://a.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\"],\n    tags: [\"osm\", \"hot\", \"humanitarian\"],\n  }),\n  rasterBasemap({\n    id: \"osm-de\",\n    name: \"OpenStreetMap DE\",\n    provider: \"openstreetmap\",\n    category: \"Regional\",\n    description: \"German OpenStreetMap tile style.\",\n    attribution: OSM_ATTRIBUTION,\n    tiles: [\"https://tile.openstreetmap.de/{z}/{x}/{y}.png\"],\n    tags: [\"osm\", \"germany\", \"regional\"],\n  }),\n  rasterBasemap({\n    id: \"osm-ch\",\n    name: \"OpenStreetMap CH\",\n    provider: \"openstreetmap\",\n    category: \"Regional\",\n    description: \"Swiss OpenStreetMap tile style.\",\n    attribution: OSM_ATTRIBUTION,\n    tiles: [\"https://tile.osm.ch/switzerland/{z}/{x}/{y}.png\"],\n    tags: [\"osm\", \"switzerland\", \"regional\"],\n  }),\n  googleRasterBasemap({\n    id: \"google-maps\",\n    name: \"Google Maps\",\n    category: \"Street\",\n    description:\n      \"Google road map tiles. Uses the Map Tiles API when a Google Maps API key is set, otherwise keyless xyz tiles.\",\n    publicLyrs: \"m\",\n    session: { mapType: \"roadmap\" },\n    tags: [\"google\", \"street\"],\n  }),\n  googleRasterBasemap({\n    id: \"google-satellite\",\n    name: \"Google Satellite\",\n    category: \"Imagery\",\n    description:\n      \"Google satellite tiles. Uses the Map Tiles API when a Google Maps API key is set, otherwise keyless xyz tiles.\",\n    publicLyrs: \"s\",\n    session: { mapType: \"satellite\" },\n    tags: [\"google\", \"satellite\", \"imagery\"],\n  }),\n  googleRasterBasemap({\n    id: \"google-terrain\",\n    name: \"Google Terrain\",\n    category: \"Terrain\",\n    description:\n      \"Google terrain tiles. Uses the Map Tiles API when a Google Maps API key is set, otherwise keyless xyz tiles.\",\n    publicLyrs: \"p\",\n    // The Map Tiles API requires `layerRoadmap` alongside the terrain map type\n    // for the terrain tiles to render.\n    session: { mapType: \"terrain\", layerTypes: [\"layerRoadmap\"] },\n    tags: [\"google\", \"terrain\"],\n  }),\n  googleRasterBasemap({\n    id: \"google-hybrid\",\n    name: \"Google Hybrid\",\n    category: \"Imagery\",\n    description:\n      \"Google hybrid imagery tiles. Uses the Map Tiles API when a Google Maps API key is set, otherwise keyless xyz tiles.\",\n    publicLyrs: \"y\",\n    // Hybrid is satellite imagery with the roadmap layer (roads and labels)\n    // painted on top, matching the classic Google \"hybrid\" map type.\n    session: { mapType: \"satellite\", layerTypes: [\"layerRoadmap\"] },\n    tags: [\"google\", \"hybrid\", \"imagery\"],\n  }),\n  amazonStyleBasemap({\n    id: \"amazon-standard\",\n    name: \"Amazon Standard\",\n    mapStyle: \"Standard\",\n    category: \"Street\",\n    description: \"Amazon Location general-purpose vector map style.\",\n    tags: [\"standard\", \"street\"],\n  }),\n  amazonStyleBasemap({\n    id: \"amazon-monochrome\",\n    name: \"Amazon Monochrome\",\n    mapStyle: \"Monochrome\",\n    category: \"Light\",\n    description: \"Amazon Location grey scale map style for overlays.\",\n    tags: [\"monochrome\", \"light\", \"dataviz\"],\n  }),\n  amazonStyleBasemap({\n    id: \"amazon-hybrid\",\n    name: \"Amazon Hybrid\",\n    mapStyle: \"Hybrid\",\n    category: \"Imagery\",\n    description:\n      \"Amazon Location satellite imagery with road and label overlay.\",\n    tags: [\"hybrid\", \"satellite\", \"imagery\", \"labels\"],\n  }),\n  amazonStyleBasemap({\n    id: \"amazon-satellite\",\n    name: \"Amazon Satellite\",\n    mapStyle: \"Satellite\",\n    category: \"Imagery\",\n    description: \"Amazon Location satellite imagery map style.\",\n    tags: [\"satellite\", \"imagery\"],\n  }),\n  mapboxStyleBasemap({\n    id: \"mapbox-streets\",\n    name: \"Mapbox Streets\",\n    styleId: \"streets-v12\",\n    category: \"Street\",\n    description: \"Mapbox general-purpose street map style.\",\n    tags: [\"streets\", \"street\"],\n  }),\n  mapboxStyleBasemap({\n    id: \"mapbox-outdoors\",\n    name: \"Mapbox Outdoors\",\n    styleId: \"outdoors-v12\",\n    category: \"Outdoor\",\n    description: \"Mapbox outdoor recreation and terrain style.\",\n    tags: [\"outdoors\", \"terrain\", \"recreation\"],\n  }),\n  mapboxStyleBasemap({\n    id: \"mapbox-light\",\n    name: \"Mapbox Light\",\n    styleId: \"light-v11\",\n    category: \"Light\",\n    description: \"Light Mapbox style for data overlays.\",\n    tags: [\"light\", \"dataviz\"],\n  }),\n  mapboxStyleBasemap({\n    id: \"mapbox-dark\",\n    name: \"Mapbox Dark\",\n    styleId: \"dark-v11\",\n    category: \"Dark\",\n    description: \"Dark Mapbox style for high-contrast overlays.\",\n    tags: [\"dark\"],\n  }),\n  mapboxStyleBasemap({\n    id: \"mapbox-satellite\",\n    name: \"Mapbox Satellite\",\n    styleId: \"satellite-v9\",\n    category: \"Imagery\",\n    description: \"Mapbox satellite imagery style.\",\n    tags: [\"satellite\", \"imagery\"],\n  }),\n  mapboxStyleBasemap({\n    id: \"mapbox-satellite-streets\",\n    name: \"Mapbox Satellite Streets\",\n    styleId: \"satellite-streets-v12\",\n    category: \"Imagery\",\n    description: \"Mapbox satellite imagery with streets and labels.\",\n    tags: [\"satellite\", \"streets\", \"imagery\", \"labels\"],\n  }),\n  mapboxStyleBasemap({\n    id: \"mapbox-navigation-day\",\n    name: \"Mapbox Navigation Day\",\n    styleId: \"navigation-day-v1\",\n    category: \"Navigation\",\n    description: \"Mapbox daytime navigation style.\",\n    tags: [\"navigation\", \"day\"],\n  }),\n  mapboxStyleBasemap({\n    id: \"mapbox-navigation-night\",\n    name: \"Mapbox Navigation Night\",\n    styleId: \"navigation-night-v1\",\n    category: \"Navigation\",\n    description: \"Mapbox nighttime navigation style.\",\n    tags: [\"navigation\", \"night\", \"dark\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-aquarelle\",\n    name: \"MapTiler Aquarelle\",\n    mapId: \"aquarelle-v4\",\n    category: \"Artistic\",\n    description: \"Watercolor-style vector basemap.\",\n    tags: [\"aquarelle\", \"watercolor\", \"artistic\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-backdrop\",\n    name: \"MapTiler Backdrop\",\n    mapId: \"backdrop-v4\",\n    category: \"Light\",\n    description: \"Subtle monochrome context map.\",\n    tags: [\"backdrop\", \"monochrome\", \"context\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-base\",\n    name: \"MapTiler Base\",\n    mapId: \"base-v4\",\n    category: \"Street\",\n    description: \"General-purpose vector basemap.\",\n    tags: [\"base\", \"street\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-dataviz\",\n    name: \"MapTiler Dataviz\",\n    mapId: \"dataviz-v4\",\n    category: \"Light\",\n    description: \"Minimal basemap for data visualization and overlays.\",\n    tags: [\"dataviz\", \"data\", \"light\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-landscape\",\n    name: \"MapTiler Landscape\",\n    mapId: \"landscape-v4\",\n    category: \"Terrain\",\n    description: \"Light terrain and hillshade map.\",\n    tags: [\"landscape\", \"terrain\", \"hillshade\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-ocean\",\n    name: \"MapTiler Ocean\",\n    mapId: \"ocean-v4\",\n    category: \"Marine\",\n    description: \"Ocean bathymetry and marine-focused basemap.\",\n    tags: [\"ocean\", \"marine\", \"bathymetry\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-openstreetmap\",\n    name: \"MapTiler OpenStreetMap\",\n    mapId: \"openstreetmap\",\n    category: \"Street\",\n    description: \"OpenStreetMap style hosted by MapTiler.\",\n    url: \"https://api.maptiler.com/maps/openstreetmap/style.json?key\",\n    tags: [\"openstreetmap\", \"osm\", \"street\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-outdoor\",\n    name: \"MapTiler Outdoor\",\n    mapId: \"outdoor-v4\",\n    category: \"Outdoor\",\n    description: \"Outdoor recreation basemap with terrain detail.\",\n    tags: [\"outdoor\", \"terrain\", \"recreation\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-satellite-hybrid\",\n    name: \"MapTiler Satellite Hybrid\",\n    mapId: \"hybrid-v4\",\n    category: \"Imagery\",\n    description: \"Satellite imagery with labels, roads, and borders.\",\n    tags: [\"satellite\", \"hybrid\", \"imagery\", \"labels\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-satellite-plain\",\n    name: \"MapTiler Satellite Plain\",\n    mapId: \"satellite-v4\",\n    category: \"Imagery\",\n    description: \"Satellite imagery without the hybrid reference overlay.\",\n    tags: [\"satellite\", \"imagery\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-streets\",\n    name: \"MapTiler Streets\",\n    mapId: \"streets-v4\",\n    category: \"Street\",\n    description: \"Detailed street map for general navigation.\",\n    tags: [\"streets\", \"street\", \"navigation\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-toner\",\n    name: \"MapTiler Toner\",\n    mapId: \"toner-v2\",\n    category: \"Dark\",\n    description: \"High-contrast monochrome basemap.\",\n    url: \"https://api.maptiler.com/maps/toner-v2/style.json?key=\",\n    tags: [\"toner\", \"monochrome\", \"contrast\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-topo\",\n    name: \"MapTiler Topo\",\n    mapId: \"topo-v4\",\n    category: \"Terrain\",\n    description: \"Topographic basemap with contours and terrain context.\",\n    tags: [\"topo\", \"topographic\", \"terrain\"],\n  }),\n  mapTilerStyleBasemap({\n    id: \"maptiler-winter\",\n    name: \"MapTiler Winter\",\n    mapId: \"winter-v4\",\n    category: \"Outdoor\",\n    description: \"Winter sports and mountain activity basemap.\",\n    tags: [\"winter\", \"skiing\", \"outdoor\"],\n  }),\n  rasterBasemap({\n    id: \"carto-positron\",\n    name: \"Carto Positron\",\n    provider: \"carto\",\n    category: \"Light\",\n    description: \"Light basemap for data overlays.\",\n    attribution: CARTO_ATTRIBUTION,\n    tiles: [\n      \"https://a.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n      \"https://b.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n      \"https://c.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n      \"https://d.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n    ],\n    maxzoom: 20,\n    tags: [\"carto\", \"light\", \"positron\"],\n  }),\n  rasterBasemap({\n    id: \"carto-positron-no-labels\",\n    name: \"Carto Positron No Labels\",\n    provider: \"carto\",\n    category: \"Light\",\n    description: \"Light basemap without labels.\",\n    attribution: CARTO_ATTRIBUTION,\n    tiles: [\"https://a.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\"],\n    maxzoom: 20,\n    tags: [\"carto\", \"light\", \"no labels\"],\n  }),\n  rasterBasemap({\n    id: \"carto-positron-only-labels\",\n    name: \"Carto Positron Only Labels\",\n    provider: \"carto\",\n    category: \"Labels\",\n    description: \"Carto Positron labels layer.\",\n    attribution: CARTO_ATTRIBUTION,\n    tiles: [\n      \"https://a.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png\",\n    ],\n    maxzoom: 20,\n    tags: [\"carto\", \"labels\"],\n  }),\n  rasterBasemap({\n    id: \"carto-dark-matter\",\n    name: \"Carto Dark Matter\",\n    provider: \"carto\",\n    category: \"Dark\",\n    description: \"Dark basemap for high-contrast overlays.\",\n    attribution: CARTO_ATTRIBUTION,\n    tiles: [\n      \"https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n      \"https://b.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n      \"https://c.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n      \"https://d.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n    ],\n    maxzoom: 20,\n    tags: [\"carto\", \"dark\", \"matter\"],\n  }),\n  rasterBasemap({\n    id: \"carto-dark-matter-no-labels\",\n    name: \"Carto Dark Matter No Labels\",\n    provider: \"carto\",\n    category: \"Dark\",\n    description: \"Dark basemap without labels.\",\n    attribution: CARTO_ATTRIBUTION,\n    tiles: [\"https://a.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\"],\n    maxzoom: 20,\n    tags: [\"carto\", \"dark\", \"no labels\"],\n  }),\n  rasterBasemap({\n    id: \"carto-dark-matter-only-labels\",\n    name: \"Carto Dark Matter Only Labels\",\n    provider: \"carto\",\n    category: \"Labels\",\n    description: \"Carto Dark Matter labels layer.\",\n    attribution: CARTO_ATTRIBUTION,\n    tiles: [\"https://a.basemaps.cartocdn.com/dark_only_labels/{z}/{x}/{y}.png\"],\n    maxzoom: 20,\n    tags: [\"carto\", \"dark\", \"labels\"],\n  }),\n  rasterBasemap({\n    id: \"carto-voyager\",\n    name: \"Carto Voyager\",\n    provider: \"carto\",\n    category: \"Street\",\n    description: \"Detailed street basemap with subtle styling.\",\n    attribution: CARTO_ATTRIBUTION,\n    tiles: [\n      \"https://a.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n      \"https://b.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n      \"https://c.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n      \"https://d.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n    ],\n    maxzoom: 20,\n    tags: [\"carto\", \"street\", \"voyager\"],\n  }),\n  rasterBasemap({\n    id: \"carto-voyager-no-labels\",\n    name: \"Carto Voyager No Labels\",\n    provider: \"carto\",\n    category: \"Street\",\n    description: \"Carto Voyager without labels.\",\n    attribution: CARTO_ATTRIBUTION,\n    tiles: [\n      \"https://a.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n    ],\n    maxzoom: 20,\n    tags: [\"carto\", \"voyager\", \"no labels\"],\n  }),\n  rasterBasemap({\n    id: \"carto-voyager-only-labels\",\n    name: \"Carto Voyager Only Labels\",\n    provider: \"carto\",\n    category: \"Labels\",\n    description: \"Carto Voyager labels layer.\",\n    attribution: CARTO_ATTRIBUTION,\n    tiles: [\n      \"https://a.basemaps.cartocdn.com/rastertiles/voyager_only_labels/{z}/{x}/{y}.png\",\n    ],\n    maxzoom: 20,\n    tags: [\"carto\", \"voyager\", \"labels\"],\n  }),\n  rasterBasemap({\n    id: \"carto-voyager-labels-under\",\n    name: \"Carto Voyager Labels Under\",\n    provider: \"carto\",\n    category: \"Street\",\n    description: \"Carto Voyager labels-under variant.\",\n    attribution: CARTO_ATTRIBUTION,\n    tiles: [\n      \"https://a.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\",\n    ],\n    maxzoom: 20,\n    tags: [\"carto\", \"voyager\", \"labels\"],\n  }),\n  rasterBasemap({\n    id: \"cyclosm\",\n    name: \"CyclOSM\",\n    provider: \"cyclosm\",\n    category: \"Cycling\",\n    description: \"Cycling-focused OpenStreetMap style.\",\n    attribution: \"CyclOSM | Map data: &copy; OpenStreetMap contributors\",\n    tiles: [\"https://a.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png\"],\n    tags: [\"cycling\", \"osm\"],\n  }),\n  rasterBasemap({\n    id: \"esri-world-imagery\",\n    name: \"World Imagery\",\n    provider: \"esri\",\n    category: \"Imagery\",\n    description: \"Satellite and aerial imagery.\",\n    attribution:\n      \"Tiles &copy; Esri, Maxar, Earthstar Geographics, and the GIS User Community\",\n    tiles: [\n      \"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"esri\", \"satellite\", \"imagery\"],\n  }),\n  rasterBasemap({\n    id: \"esri-world-topo\",\n    name: \"World Topographic\",\n    provider: \"esri\",\n    category: \"Terrain\",\n    description: \"Reference topographic map.\",\n    attribution: ESRI_ATTRIBUTION,\n    tiles: [\n      \"https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"esri\", \"topographic\", \"terrain\"],\n  }),\n  rasterBasemap({\n    id: \"esri-world-street-map\",\n    name: \"World Street Map\",\n    provider: \"esri\",\n    category: \"Street\",\n    description: \"ESRI street reference basemap.\",\n    attribution: ESRI_ATTRIBUTION,\n    tiles: [\n      \"https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"esri\", \"street\"],\n  }),\n  rasterBasemap({\n    id: \"esri-world-gray-canvas\",\n    name: \"World Gray Canvas\",\n    provider: \"esri\",\n    category: \"Light\",\n    description: \"Light gray canvas basemap.\",\n    attribution: ESRI_ATTRIBUTION,\n    tiles: [\n      \"https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"esri\", \"gray\", \"canvas\"],\n  }),\n  rasterBasemap({\n    id: \"esri-world-dark-gray-canvas\",\n    name: \"World Dark Gray Canvas\",\n    provider: \"esri\",\n    category: \"Dark\",\n    description: \"Dark gray canvas basemap for high-contrast overlays.\",\n    attribution: ESRI_ATTRIBUTION,\n    tiles: [\n      \"https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"esri\", \"dark\", \"gray\", \"canvas\"],\n  }),\n  rasterBasemap({\n    id: \"esri-world-light-gray-reference\",\n    name: \"World Light Gray Reference\",\n    provider: \"esri\",\n    category: \"Labels\",\n    description:\n      \"Boundary and place label overlay matching the Light Gray Canvas basemap.\",\n    attribution: ESRI_ATTRIBUTION,\n    tiles: [\n      \"https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Reference/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"esri\", \"labels\", \"reference\", \"gray\", \"overlay\"],\n  }),\n  rasterBasemap({\n    id: \"esri-world-dark-gray-reference\",\n    name: \"World Dark Gray Reference\",\n    provider: \"esri\",\n    category: \"Labels\",\n    description:\n      \"Boundary and place label overlay matching the Dark Gray Canvas basemap.\",\n    attribution: ESRI_ATTRIBUTION,\n    tiles: [\n      \"https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Reference/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"esri\", \"labels\", \"reference\", \"dark\", \"gray\", \"overlay\"],\n  }),\n  rasterBasemap({\n    id: \"esri-natgeo-world-map\",\n    name: \"NatGeo World Map\",\n    provider: \"esri\",\n    category: \"Street\",\n    description: \"National Geographic style world map.\",\n    attribution: ESRI_ATTRIBUTION,\n    tiles: [\n      \"https://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"esri\", \"natgeo\"],\n  }),\n  rasterBasemap({\n    id: \"esri-ocean-basemap\",\n    name: \"Ocean Basemap\",\n    provider: \"esri\",\n    category: \"Marine\",\n    description: \"Ocean reference basemap.\",\n    attribution: ESRI_ATTRIBUTION,\n    tiles: [\n      \"https://server.arcgisonline.com/ArcGIS/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"esri\", \"ocean\", \"marine\"],\n  }),\n  rasterBasemap({\n    id: \"esri-world-physical\",\n    name: \"World Physical\",\n    provider: \"esri\",\n    category: \"Terrain\",\n    description: \"Physical world map.\",\n    attribution: ESRI_ATTRIBUTION,\n    tiles: [\n      \"https://server.arcgisonline.com/ArcGIS/rest/services/World_Physical_Map/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"esri\", \"physical\", \"terrain\"],\n  }),\n  rasterBasemap({\n    id: \"esri-world-shaded-relief\",\n    name: \"World Shaded Relief\",\n    provider: \"esri\",\n    category: \"Terrain\",\n    description: \"Shaded relief world map.\",\n    attribution: ESRI_ATTRIBUTION,\n    tiles: [\n      \"https://server.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"esri\", \"relief\", \"terrain\"],\n  }),\n  rasterBasemap({\n    id: \"esri-world-terrain\",\n    name: \"World Terrain\",\n    provider: \"esri\",\n    category: \"Terrain\",\n    description: \"ESRI terrain base.\",\n    attribution: ESRI_ATTRIBUTION,\n    tiles: [\n      \"https://server.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"esri\", \"terrain\"],\n  }),\n  ...EOX_S2CLOUDLESS_YEARS.map(eoxS2CloudlessBasemap),\n  rasterBasemap({\n    id: \"eox-terrain-light\",\n    name: \"EOX Terrain Light\",\n    provider: \"eox\",\n    category: \"Terrain\",\n    description: \"Light terrain basemap from EOX Maps (non-commercial use).\",\n    attribution: EOX_TERRAIN_LIGHT_ATTRIBUTION,\n    tiles: [\n      \"https://tiles.maps.eox.at/wmts/1.0.0/terrain-light_3857/default/GoogleMapsCompatible/{z}/{y}/{x}.jpg\",\n    ],\n    maxzoom: 14,\n    tags: [\"eox\", \"terrain\", \"light\", \"hillshade\"],\n  }),\n  rasterBasemap({\n    id: \"eox-terrain\",\n    name: \"EOX Terrain\",\n    provider: \"eox\",\n    category: \"Terrain\",\n    description:\n      \"Natural-like terrain basemap from EOX Maps (non-commercial use).\",\n    attribution: EOX_TERRAIN_ATTRIBUTION,\n    // terrain_3857 is only published on EOX's \"g\" tile matrix set, which is the\n    // Web Mercator (GoogleMapsCompatible) grid under a different identifier.\n    tiles: [\n      \"https://tiles.maps.eox.at/wmts/1.0.0/terrain_3857/default/g/{z}/{y}/{x}.jpg\",\n    ],\n    maxzoom: 14,\n    tags: [\"eox\", \"terrain\", \"hillshade\"],\n  }),\n  rasterBasemap({\n    id: \"eox-overlay\",\n    name: \"EOX Overlay\",\n    provider: \"eox\",\n    category: \"Labels\",\n    description:\n      \"Transparent overlay with borders and points of interest from EOX Maps (non-commercial use).\",\n    attribution: EOX_OVERLAY_ATTRIBUTION,\n    tiles: [\n      \"https://tiles.maps.eox.at/wmts/1.0.0/overlay_3857/default/GoogleMapsCompatible/{z}/{y}/{x}.png\",\n    ],\n    maxzoom: 14,\n    tags: [\"eox\", \"overlay\", \"labels\", \"borders\", \"reference\"],\n  }),\n  rasterBasemap({\n    id: \"eox-overlay-bright\",\n    name: \"EOX Overlay Bright\",\n    provider: \"eox\",\n    category: \"Labels\",\n    description:\n      \"Bright transparent overlay with borders and points of interest from EOX Maps (non-commercial use).\",\n    attribution: EOX_OVERLAY_ATTRIBUTION,\n    tiles: [\n      \"https://tiles.maps.eox.at/wmts/1.0.0/overlay_bright_3857/default/GoogleMapsCompatible/{z}/{y}/{x}.png\",\n    ],\n    maxzoom: 14,\n    tags: [\"eox\", \"overlay\", \"labels\", \"borders\", \"reference\", \"bright\"],\n  }),\n  rasterBasemap({\n    id: \"nasa-gibs-blue-marble\",\n    name: \"Blue Marble\",\n    provider: \"nasa-gibs\",\n    category: \"Imagery\",\n    description: \"NASA Blue Marble Next Generation imagery.\",\n    attribution: \"Imagery provided by NASA Global Imagery Browse Services\",\n    tiles: [\n      \"https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/BlueMarble_NextGeneration/default/GoogleMapsCompatible_Level8/{z}/{y}/{x}.jpeg\",\n    ],\n    maxzoom: 8,\n    tags: [\"nasa\", \"gibs\", \"blue marble\"],\n  }),\n  rasterBasemap({\n    id: \"nasa-gibs-aster-gdem-shaded-relief\",\n    name: \"ASTER GDEM Shaded Relief\",\n    provider: \"nasa-gibs\",\n    category: \"Terrain\",\n    description: \"NASA ASTER GDEM greyscale shaded relief.\",\n    attribution: \"Imagery provided by NASA Global Imagery Browse Services\",\n    tiles: [\n      \"https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/ASTER_GDEM_Greyscale_Shaded_Relief/default/GoogleMapsCompatible_Level12/{z}/{y}/{x}.jpg\",\n    ],\n    maxzoom: 12,\n    tags: [\"nasa\", \"gibs\", \"relief\", \"terrain\"],\n  }),\n  rasterBasemap({\n    id: \"nasa-gibs-modis-terra-true-color\",\n    name: \"MODIS Terra True Color\",\n    provider: \"nasa-gibs\",\n    category: \"Imagery\",\n    description: \"NASA MODIS Terra corrected reflectance true color.\",\n    attribution: \"Imagery provided by NASA Global Imagery Browse Services\",\n    tiles: [\n      \"https://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_CorrectedReflectance_TrueColor/default//GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg\",\n    ],\n    maxzoom: 9,\n    tags: [\"nasa\", \"gibs\", \"modis\", \"true color\"],\n  }),\n  rasterBasemap({\n    id: \"nasa-gibs-viirs-earth-at-night\",\n    name: \"VIIRS Earth At Night 2012\",\n    provider: \"nasa-gibs\",\n    category: \"Imagery\",\n    description: \"NASA VIIRS city lights imagery.\",\n    attribution: \"Imagery provided by NASA Global Imagery Browse Services\",\n    tiles: [\n      \"https://map1.vis.earthdata.nasa.gov/wmts-webmerc/VIIRS_CityLights_2012/default//GoogleMapsCompatible_Level8/{z}/{y}/{x}.jpg\",\n    ],\n    maxzoom: 8,\n    tags: [\"nasa\", \"gibs\", \"night\", \"viirs\"],\n  }),\n  rasterBasemap({\n    id: \"openrailwaymap\",\n    name: \"OpenRailwayMap\",\n    provider: \"openrailwaymap\",\n    category: \"Transport\",\n    description: \"Railway infrastructure map.\",\n    attribution:\n      \"Map data: &copy; OpenStreetMap contributors | Map style: OpenRailwayMap\",\n    tiles: [\"https://a.tiles.openrailwaymap.org/standard/{z}/{x}/{y}.png\"],\n    tags: [\"rail\", \"transport\", \"osm\"],\n  }),\n  rasterBasemap({\n    id: \"openrailwaymap-maxspeed\",\n    name: \"OpenRailwayMap Maxspeed\",\n    provider: \"openrailwaymap\",\n    category: \"Transport\",\n    description: \"Railway line speed limits as a transparent overlay.\",\n    attribution:\n      \"Map data: &copy; OpenStreetMap contributors | Map style: OpenRailwayMap\",\n    tiles: [\"https://a.tiles.openrailwaymap.org/maxspeed/{z}/{x}/{y}.png\"],\n    tags: [\"rail\", \"transport\", \"osm\", \"maxspeed\", \"speed\", \"overlay\"],\n  }),\n  rasterBasemap({\n    id: \"openrailwaymap-electrification\",\n    name: \"OpenRailwayMap Electrification\",\n    provider: \"openrailwaymap\",\n    category: \"Transport\",\n    description:\n      \"Railway electrification systems and voltages as a transparent overlay.\",\n    attribution:\n      \"Map data: &copy; OpenStreetMap contributors | Map style: OpenRailwayMap\",\n    tiles: [\n      \"https://a.tiles.openrailwaymap.org/electrification/{z}/{x}/{y}.png\",\n    ],\n    tags: [\"rail\", \"transport\", \"osm\", \"electrification\", \"voltage\", \"overlay\"],\n  }),\n  rasterBasemap({\n    id: \"openrailwaymap-signals\",\n    name: \"OpenRailwayMap Signals\",\n    provider: \"openrailwaymap\",\n    category: \"Transport\",\n    description: \"Railway signalling infrastructure as a transparent overlay.\",\n    attribution:\n      \"Map data: &copy; OpenStreetMap contributors | Map style: OpenRailwayMap\",\n    tiles: [\"https://a.tiles.openrailwaymap.org/signals/{z}/{x}/{y}.png\"],\n    tags: [\"rail\", \"transport\", \"osm\", \"signals\", \"signalling\", \"overlay\"],\n  }),\n  rasterBasemap({\n    id: \"opentopomap\",\n    name: \"OpenTopoMap\",\n    provider: \"opentopomap\",\n    category: \"Terrain\",\n    description: \"Topographic map with relief and contour styling.\",\n    attribution:\n      \"Map data &copy; OpenStreetMap contributors, SRTM | Map style &copy; OpenTopoMap\",\n    tiles: [\"https://a.tile.opentopomap.org/{z}/{x}/{y}.png\"],\n    maxzoom: 17,\n    tags: [\"terrain\", \"topo\", \"relief\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-alidade-smooth\",\n    name: \"Stadia Alidade Smooth\",\n    slug: \"alidade_smooth\",\n    category: \"Light\",\n    description: \"Muted light basemap with few POIs, designed for overlays.\",\n    tags: [\"alidade\", \"smooth\", \"light\", \"dataviz\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-alidade-smooth-dark\",\n    name: \"Stadia Alidade Smooth Dark\",\n    slug: \"alidade_smooth_dark\",\n    category: \"Dark\",\n    description: \"Dark counterpart to Alidade Smooth for overlays.\",\n    tags: [\"alidade\", \"smooth\", \"dark\", \"dataviz\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-alidade-satellite\",\n    name: \"Stadia Alidade Satellite\",\n    slug: \"alidade_satellite\",\n    category: \"Imagery\",\n    description: \"Satellite imagery with Alidade labels and roads.\",\n    extension: \"jpg\",\n    tags: [\"alidade\", \"satellite\", \"imagery\", \"labels\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-outdoors\",\n    name: \"Stadia Outdoors\",\n    slug: \"outdoors\",\n    category: \"Outdoor\",\n    description: \"Outdoor basemap highlighting trails, parks, and ski slopes.\",\n    tags: [\"outdoors\", \"trails\", \"hiking\", \"recreation\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-osm-bright\",\n    name: \"Stadia OSM Bright\",\n    slug: \"osm_bright\",\n    category: \"Street\",\n    description: \"General-purpose OpenStreetMap street basemap.\",\n    tags: [\"osm\", \"bright\", \"street\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-stamen-toner\",\n    name: \"Stamen Toner\",\n    slug: \"stamen_toner\",\n    category: \"Dark\",\n    description: \"High-contrast black and white Stamen basemap.\",\n    stamen: true,\n    tags: [\"toner\", \"dark\", \"contrast\", \"monochrome\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-stamen-toner-lite\",\n    name: \"Stamen Toner Lite\",\n    slug: \"stamen_toner_lite\",\n    category: \"Light\",\n    description: \"Lighter, lower-contrast variant of Stamen Toner.\",\n    stamen: true,\n    tags: [\"toner\", \"lite\", \"light\", \"monochrome\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-stamen-toner-background\",\n    name: \"Stamen Toner Background\",\n    slug: \"stamen_toner_background\",\n    category: \"Dark\",\n    description: \"Stamen Toner without labels, for use under your own data.\",\n    stamen: true,\n    tags: [\"toner\", \"background\", \"no labels\", \"monochrome\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-stamen-toner-labels\",\n    name: \"Stamen Toner Labels\",\n    slug: \"stamen_toner_labels\",\n    category: \"Labels\",\n    description: \"Stamen Toner label overlay.\",\n    stamen: true,\n    tags: [\"toner\", \"labels\", \"overlay\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-stamen-terrain\",\n    name: \"Stamen Terrain\",\n    slug: \"stamen_terrain\",\n    category: \"Terrain\",\n    description: \"Stamen terrain basemap with hill shading and vegetation.\",\n    stamen: true,\n    tags: [\"terrain\", \"hillshade\", \"relief\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-stamen-terrain-background\",\n    name: \"Stamen Terrain Background\",\n    slug: \"stamen_terrain_background\",\n    category: \"Terrain\",\n    description: \"Stamen Terrain without labels or roads.\",\n    stamen: true,\n    tags: [\"terrain\", \"background\", \"hillshade\", \"no labels\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-stamen-terrain-labels\",\n    name: \"Stamen Terrain Labels\",\n    slug: \"stamen_terrain_labels\",\n    category: \"Labels\",\n    description: \"Stamen Terrain label overlay.\",\n    stamen: true,\n    tags: [\"terrain\", \"labels\", \"overlay\"],\n  }),\n  stadiaRasterBasemap({\n    id: \"stadia-stamen-watercolor\",\n    name: \"Stamen Watercolor\",\n    slug: \"stamen_watercolor\",\n    category: \"Artistic\",\n    description: \"Hand-painted watercolor basemap from Stamen Design.\",\n    extension: \"jpg\",\n    maxzoom: 16,\n    stamen: true,\n    tags: [\"watercolor\", \"artistic\", \"painted\"],\n  }),\n  rasterBasemap({\n    id: \"swisstopo-national-map-color\",\n    name: \"Swiss National Map Color\",\n    provider: \"swisstopo\",\n    category: \"Regional\",\n    description: \"Swiss federal color national map.\",\n    attribution: \"&copy; swisstopo\",\n    tiles: [\n      \"https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.pixelkarte-farbe/default/current/3857/{z}/{x}/{y}.jpeg\",\n    ],\n    maxzoom: 18,\n    tags: [\"switzerland\", \"regional\"],\n  }),\n  rasterBasemap({\n    id: \"swisstopo-national-map-grey\",\n    name: \"Swiss National Map Grey\",\n    provider: \"swisstopo\",\n    category: \"Regional\",\n    description: \"Swiss federal grey national map.\",\n    attribution: \"&copy; swisstopo\",\n    tiles: [\n      \"https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.pixelkarte-grau/default/current/3857/{z}/{x}/{y}.jpeg\",\n    ],\n    maxzoom: 18,\n    tags: [\"switzerland\", \"regional\", \"grey\"],\n  }),\n  rasterBasemap({\n    id: \"swisstopo-swissimage\",\n    name: \"SWISSIMAGE\",\n    provider: \"swisstopo\",\n    category: \"Imagery\",\n    description: \"Swiss federal aerial imagery.\",\n    attribution: \"&copy; swisstopo\",\n    tiles: [\n      \"https://wmts.geo.admin.ch/1.0.0/ch.swisstopo.swissimage/default/current/3857/{z}/{x}/{y}.jpeg\",\n    ],\n    maxzoom: 18,\n    tags: [\"switzerland\", \"imagery\"],\n  }),\n  tiandituRasterBasemap({\n    id: \"tianditu-vector\",\n    name: \"Tianditu Vector\",\n    layer: \"vec_w\",\n    category: \"Regional\",\n    description:\n      \"China's official street map, reachable from mainland China. Published in CGCS2000, so WGS84 data overlays without a datum shift. Pair with Tianditu Vector Labels. Requires a free Tianditu API key.\",\n    tags: [\"vector\", \"street\", \"vec\"],\n  }),\n  tiandituRasterBasemap({\n    id: \"tianditu-vector-labels\",\n    name: \"Tianditu Vector Labels\",\n    layer: \"cva_w\",\n    category: \"Labels\",\n    description:\n      \"Place name and road label overlay for Tianditu Vector. Requires a free Tianditu API key.\",\n    tags: [\"labels\", \"annotation\", \"overlay\", \"cva\"],\n  }),\n  tiandituRasterBasemap({\n    id: \"tianditu-imagery\",\n    name: \"Tianditu Imagery\",\n    layer: \"img_w\",\n    category: \"Imagery\",\n    description:\n      \"China's official satellite imagery, reachable from mainland China. Pair with Tianditu Imagery Labels. Requires a free Tianditu API key.\",\n    tags: [\"imagery\", \"satellite\", \"img\"],\n  }),\n  tiandituRasterBasemap({\n    id: \"tianditu-imagery-labels\",\n    name: \"Tianditu Imagery Labels\",\n    layer: \"cia_w\",\n    category: \"Labels\",\n    description:\n      \"Place name and road label overlay for Tianditu Imagery. Requires a free Tianditu API key.\",\n    tags: [\"labels\", \"annotation\", \"overlay\", \"cia\"],\n  }),\n  tiandituRasterBasemap({\n    id: \"tianditu-terrain\",\n    name: \"Tianditu Terrain\",\n    layer: \"ter_w\",\n    category: \"Terrain\",\n    description:\n      \"China's official shaded relief terrain map. Pair with Tianditu Terrain Labels. Requires a free Tianditu API key.\",\n    // The terrain pair is only published to zoom 14, unlike the vector and\n    // imagery layers, which reach 18.\n    maxzoom: 14,\n    tags: [\"terrain\", \"relief\", \"hillshade\", \"ter\"],\n  }),\n  tiandituRasterBasemap({\n    id: \"tianditu-terrain-labels\",\n    name: \"Tianditu Terrain Labels\",\n    layer: \"cta_w\",\n    category: \"Labels\",\n    description:\n      \"Place name label overlay for Tianditu Terrain. Requires a free Tianditu API key.\",\n    maxzoom: 14,\n    tags: [\"labels\", \"annotation\", \"overlay\", \"cta\"],\n  }),\n  rasterBasemap({\n    id: \"amap-street\",\n    name: \"Amap Street\",\n    provider: \"amap\",\n    category: \"Regional\",\n    description: `Amap street map of China, reachable from mainland China. ${GCJ02_WARNING}`,\n    attribution: AMAP_ATTRIBUTION,\n    tiles: amapTiles(\"wprd\", \"lang=zh_cn&size=1&scl=1&style=7\"),\n    tags: [\"amap\", \"gaode\", \"高德\", \"china\", \"street\", \"gcj02\"],\n  }),\n  rasterBasemap({\n    id: \"amap-satellite\",\n    name: \"Amap Satellite\",\n    provider: \"amap\",\n    category: \"Imagery\",\n    description: `Amap satellite imagery, reachable from mainland China. Pair with Amap Labels. ${GCJ02_WARNING}`,\n    attribution: AMAP_ATTRIBUTION,\n    tiles: amapTiles(\"webst\", \"style=6\"),\n    // Past zoom 18 Amap returns a \"no imagery\" placeholder tile rather than a\n    // 404, so cap here and let MapLibre overzoom instead.\n    maxzoom: 18,\n    tags: [\"amap\", \"gaode\", \"高德\", \"china\", \"satellite\", \"imagery\", \"gcj02\"],\n  }),\n  rasterBasemap({\n    id: \"amap-labels\",\n    name: \"Amap Labels\",\n    provider: \"amap\",\n    category: \"Labels\",\n    description: `Transparent Amap road and label overlay, for use over Amap Satellite. ${GCJ02_WARNING}`,\n    attribution: AMAP_ATTRIBUTION,\n    tiles: amapTiles(\"webst\", \"style=8\"),\n    tags: [\n      \"amap\",\n      \"gaode\",\n      \"高德\",\n      \"china\",\n      \"labels\",\n      \"roads\",\n      \"overlay\",\n      \"gcj02\",\n    ],\n  }),\n  rasterBasemap({\n    id: \"tencent-street\",\n    name: \"Tencent Street\",\n    provider: \"tencent\",\n    category: \"Regional\",\n    description: `Tencent street map of China, reachable from mainland China. ${GCJ02_WARNING}`,\n    attribution: TENCENT_ATTRIBUTION,\n    // Tencent numbers tile rows from the bottom, so the source is TMS rather\n    // than xyz; MapLibre flips `{y}` when `scheme` says so.\n    tiles: [0, 1, 2, 3].map(\n      (host) =>\n        `https://rt${host}.map.gtimg.com/tile?z={z}&x={x}&y={y}&styleid=1&scene=0`,\n    ),\n    maxzoom: 18,\n    scheme: \"tms\",\n    tags: [\"tencent\", \"qq\", \"腾讯\", \"china\", \"street\", \"gcj02\"],\n  }),\n  rasterBasemap({\n    id: \"tencent-dark\",\n    name: \"Tencent Dark\",\n    provider: \"tencent\",\n    category: \"Dark\",\n    description: `Dark Tencent street map for high-contrast overlays, reachable from mainland China. ${GCJ02_WARNING}`,\n    attribution: TENCENT_ATTRIBUTION,\n    tiles: [0, 1, 2, 3].map(\n      (host) =>\n        `https://rt${host}.map.gtimg.com/tile?z={z}&x={x}&y={y}&styleid=4&scene=0`,\n    ),\n    maxzoom: 18,\n    scheme: \"tms\",\n    tags: [\"tencent\", \"qq\", \"腾讯\", \"china\", \"dark\", \"gcj02\"],\n  }),\n  rasterBasemap({\n    id: \"topplusopen-color\",\n    name: \"TopPlusOpen Color\",\n    provider: \"topplusopen\",\n    category: \"Regional\",\n    description: \"German TopPlusOpen color basemap.\",\n    attribution: \"Map data: &copy; dl-de/by-2-0\",\n    tiles: [\n      \"https://sgx.geodatenzentrum.de/wmts_topplus_open/tile/1.0.0/web/default/WEBMERCATOR/{z}/{y}/{x}.png\",\n    ],\n    maxzoom: 18,\n    tags: [\"germany\", \"regional\"],\n  }),\n  rasterBasemap({\n    id: \"topplusopen-grey\",\n    name: \"TopPlusOpen Grey\",\n    provider: \"topplusopen\",\n    category: \"Regional\",\n    description: \"German TopPlusOpen grey basemap.\",\n    attribution: \"Map data: &copy; dl-de/by-2-0\",\n    tiles: [\n      \"https://sgx.geodatenzentrum.de/wmts_topplus_open/tile/1.0.0/web_grau/default/WEBMERCATOR/{z}/{y}/{x}.png\",\n    ],\n    maxzoom: 18,\n    tags: [\"germany\", \"regional\", \"grey\"],\n  }),\n  rasterBasemap({\n    id: \"usgs-us-imagery\",\n    name: \"USGS US Imagery\",\n    provider: \"usgs\",\n    category: \"Imagery\",\n    description: \"USGS imagery-only basemap.\",\n    attribution: \"Tiles courtesy of the U.S. Geological Survey\",\n    tiles: [\n      \"https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryOnly/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"usgs\", \"imagery\", \"united states\"],\n  }),\n  rasterBasemap({\n    id: \"usgs-us-imagery-topo\",\n    name: \"USGS US Imagery Topo\",\n    provider: \"usgs\",\n    category: \"Imagery\",\n    description: \"USGS imagery with topographic reference.\",\n    attribution: \"Tiles courtesy of the U.S. Geological Survey\",\n    tiles: [\n      \"https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryTopo/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"usgs\", \"imagery\", \"topo\", \"united states\"],\n  }),\n  rasterBasemap({\n    id: \"usgs-us-topo\",\n    name: \"USGS US Topo\",\n    provider: \"usgs\",\n    category: \"Terrain\",\n    description: \"USGS topographic basemap.\",\n    attribution: \"Tiles courtesy of the U.S. Geological Survey\",\n    tiles: [\n      \"https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"usgs\", \"topo\", \"united states\"],\n  }),\n  rasterBasemap({\n    id: \"usgs-us-hydro\",\n    name: \"USGS US Hydrography\",\n    provider: \"usgs\",\n    category: \"Labels\",\n    description:\n      \"USGS National Hydrography reference overlay of rivers, streams, and waterbodies.\",\n    attribution: \"Tiles courtesy of the U.S. Geological Survey\",\n    tiles: [\n      \"https://basemap.nationalmap.gov/arcgis/rest/services/USGSHydroCached/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"usgs\", \"hydrography\", \"water\", \"overlay\", \"united states\"],\n  }),\n  rasterBasemap({\n    id: \"usgs-us-shaded-relief\",\n    name: \"USGS US Shaded Relief\",\n    provider: \"usgs\",\n    category: \"Terrain\",\n    description: \"USGS shaded relief basemap without other reference content.\",\n    attribution: \"Tiles courtesy of the U.S. Geological Survey\",\n    tiles: [\n      \"https://basemap.nationalmap.gov/arcgis/rest/services/USGSShadedReliefOnly/MapServer/tile/{z}/{y}/{x}\",\n    ],\n    tags: [\"usgs\", \"relief\", \"hillshade\", \"terrain\", \"united states\"],\n  }),\n  rasterBasemap({\n    id: \"waymarkedtrails-hiking\",\n    name: \"Waymarked Trails Hiking\",\n    provider: \"waymarkedtrails\",\n    category: \"Outdoor\",\n    description: \"Hiking routes from Waymarked Trails.\",\n    attribution:\n      \"Map data: &copy; OpenStreetMap contributors | Map style: Waymarked Trails\",\n    tiles: [\"https://tile.waymarkedtrails.org/hiking/{z}/{x}/{y}.png\"],\n    tags: [\"hiking\", \"outdoor\", \"trails\"],\n  }),\n  rasterBasemap({\n    id: \"waymarkedtrails-cycling\",\n    name: \"Waymarked Trails Cycling\",\n    provider: \"waymarkedtrails\",\n    category: \"Cycling\",\n    description: \"Cycling routes from Waymarked Trails.\",\n    attribution:\n      \"Map data: &copy; OpenStreetMap contributors | Map style: Waymarked Trails\",\n    tiles: [\"https://tile.waymarkedtrails.org/cycling/{z}/{x}/{y}.png\"],\n    tags: [\"cycling\", \"outdoor\", \"trails\"],\n  }),\n  rasterBasemap({\n    id: \"waymarkedtrails-mtb\",\n    name: \"Waymarked Trails MTB\",\n    provider: \"waymarkedtrails\",\n    category: \"Cycling\",\n    description: \"Mountain biking routes from Waymarked Trails.\",\n    attribution:\n      \"Map data: &copy; OpenStreetMap contributors | Map style: Waymarked Trails\",\n    tiles: [\"https://tile.waymarkedtrails.org/mtb/{z}/{x}/{y}.png\"],\n    tags: [\"mtb\", \"outdoor\", \"trails\"],\n  }),\n  rasterBasemap({\n    id: \"waymarkedtrails-slopes\",\n    name: \"Waymarked Trails Slopes\",\n    provider: \"waymarkedtrails\",\n    category: \"Outdoor\",\n    description: \"Slope routes from Waymarked Trails.\",\n    attribution:\n      \"Map data: &copy; OpenStreetMap contributors | Map style: Waymarked Trails\",\n    tiles: [\"https://tile.waymarkedtrails.org/slopes/{z}/{x}/{y}.png\"],\n    tags: [\"slopes\", \"outdoor\", \"trails\"],\n  }),\n  rasterBasemap({\n    id: \"openbasiskaart\",\n    name: \"Openbasiskaart\",\n    provider: \"openbasiskaart\",\n    category: \"Regional\",\n    description:\n      \"Netherlands topographic background map based on OpenStreetMap data.\",\n    attribution: \"Map data &copy; OpenStreetMap contributors | Openbasiskaart\",\n    // The Google Maps Compatible (osm-g) layer uses the standard Web Mercator\n    // grid, so its WMTS {TileMatrix}/{TileRow}/{TileCol} maps directly to xyz.\n    tiles: [\n      \"https://www.openbasiskaart.nl/mapcache/wmts/1.0.0/osm-g/default/g/{z}/{y}/{x}.png\",\n    ],\n    maxzoom: 18,\n    tags: [\"netherlands\", \"regional\", \"topographic\", \"osm\", \"openbasiskaart\"],\n  }),\n  {\n    id: \"openfreemap-positron\",\n    name: \"OpenFreeMap Positron\",\n    provider: \"openfreemap\",\n    type: \"style\",\n    category: \"Light\",\n    description: \"Light, minimal OpenFreeMap vector style for data overlays.\",\n    attribution: OPENFREEMAP_ATTRIBUTION,\n    source: {\n      type: \"style\",\n      url: \"https://tiles.openfreemap.org/styles/positron\",\n    },\n    tags: [\"openfreemap\", \"vector\", \"style\", \"positron\", \"light\"],\n  },\n  {\n    id: \"openfreemap-bright\",\n    name: \"OpenFreeMap Bright\",\n    provider: \"openfreemap\",\n    type: \"style\",\n    category: \"Street\",\n    description: \"Colorful OpenFreeMap vector street style.\",\n    attribution: OPENFREEMAP_ATTRIBUTION,\n    source: {\n      type: \"style\",\n      url: \"https://tiles.openfreemap.org/styles/bright\",\n    },\n    tags: [\"openfreemap\", \"vector\", \"style\", \"bright\", \"street\"],\n  },\n  {\n    id: \"openfreemap-liberty\",\n    name: \"OpenFreeMap Liberty\",\n    provider: \"openfreemap\",\n    type: \"style\",\n    category: \"Vector\",\n    description: \"Open vector style loaded as a full MapLibre style.\",\n    attribution: OPENFREEMAP_ATTRIBUTION,\n    source: {\n      type: \"style\",\n      url: \"https://tiles.openfreemap.org/styles/liberty\",\n    },\n    tags: [\"openfreemap\", \"vector\", \"style\"],\n  },\n  {\n    id: \"openfreemap-dark\",\n    name: \"OpenFreeMap Dark\",\n    provider: \"openfreemap\",\n    type: \"style\",\n    category: \"Dark\",\n    description: \"Dark OpenFreeMap vector style.\",\n    attribution: OPENFREEMAP_ATTRIBUTION,\n    source: {\n      type: \"style\",\n      url: \"https://tiles.openfreemap.org/styles/dark\",\n    },\n    tags: [\"openfreemap\", \"vector\", \"style\", \"dark\"],\n  },\n  {\n    id: \"openfreemap-fiord\",\n    name: \"OpenFreeMap Fiord\",\n    provider: \"openfreemap\",\n    type: \"style\",\n    category: \"Dark\",\n    description: \"Blue-toned dark OpenFreeMap vector style.\",\n    attribution: OPENFREEMAP_ATTRIBUTION,\n    source: {\n      type: \"style\",\n      url: \"https://tiles.openfreemap.org/styles/fiord\",\n    },\n    tags: [\"openfreemap\", \"vector\", \"style\", \"fiord\", \"dark\"],\n  },\n  {\n    id: \"openfreemap-3d\",\n    name: \"OpenFreeMap 3D\",\n    provider: \"openfreemap\",\n    type: \"style\",\n    category: \"3D\",\n    description: \"OpenFreeMap Liberty style with a pitched 3D camera view.\",\n    attribution: OPENFREEMAP_ATTRIBUTION,\n    source: {\n      type: \"style\",\n      url: \"https://tiles.openfreemap.org/styles/liberty\",\n    },\n    view: {\n      center: [-0.114, 51.506],\n      zoom: 14.2,\n      bearing: 55.2,\n      pitch: 60,\n    },\n    tags: [\"openfreemap\", \"vector\", \"style\", \"3d\", \"liberty\"],\n  },\n  protomapsStyleBasemap({\n    id: \"protomaps-light\",\n    name: \"Protomaps Light\",\n    styleId: \"light\",\n    category: \"Light\",\n    description: \"Light Protomaps vector basemap.\",\n    tags: [\"light\"],\n  }),\n  protomapsStyleBasemap({\n    id: \"protomaps-dark\",\n    name: \"Protomaps Dark\",\n    styleId: \"dark\",\n    category: \"Dark\",\n    description: \"Dark Protomaps vector basemap.\",\n    tags: [\"dark\"],\n  }),\n  protomapsStyleBasemap({\n    id: \"protomaps-white\",\n    name: \"Protomaps White\",\n    styleId: \"white\",\n    category: \"Light\",\n    description: \"Minimal white Protomaps basemap for data overlays.\",\n    tags: [\"white\", \"minimal\", \"dataviz\"],\n  }),\n  protomapsStyleBasemap({\n    id: \"protomaps-black\",\n    name: \"Protomaps Black\",\n    styleId: \"black\",\n    category: \"Dark\",\n    description: \"Minimal black Protomaps basemap for data overlays.\",\n    tags: [\"black\", \"minimal\", \"dataviz\"],\n  }),\n  protomapsStyleBasemap({\n    id: \"protomaps-grayscale\",\n    name: \"Protomaps Grayscale\",\n    styleId: \"grayscale\",\n    category: \"Light\",\n    description: \"Monochrome Protomaps basemap for data overlays.\",\n    tags: [\"grayscale\", \"monochrome\", \"dataviz\"],\n  }),\n  protomapsStyleBasemap({\n    id: \"protomaps-contrast\",\n    name: \"Protomaps Contrast\",\n    styleId: \"contrast\",\n    category: \"Light\",\n    description: \"High-contrast Protomaps basemap.\",\n    tags: [\"contrast\", \"accessibility\"],\n  }),\n  mapToolkitStyleBasemap({\n    id: \"maptoolkit-summer\",\n    name: \"Maptoolkit Summer\",\n    styleId: \"summer\",\n    category: \"Outdoor\",\n    description:\n      \"Maptoolkit outdoor summer style with hillshading and terrain detail.\",\n    tags: [\"summer\", \"outdoor\", \"terrain\", \"hillshade\"],\n  }),\n  mapToolkitStyleBasemap({\n    id: \"maptoolkit-light\",\n    name: \"Maptoolkit Light\",\n    styleId: \"light\",\n    category: \"Light\",\n    description: \"Light Maptoolkit style for data overlays.\",\n    tags: [\"light\", \"dataviz\"],\n  }),\n  mapToolkitStyleBasemap({\n    id: \"maptoolkit-hiking\",\n    name: \"Maptoolkit Hiking\",\n    styleId: \"hiking\",\n    category: \"Outdoor\",\n    description:\n      \"Maptoolkit hiking style with trails, rock drawing, and terrain.\",\n    tags: [\"hiking\", \"outdoor\", \"trails\", \"terrain\"],\n  }),\n  mapToolkitStyleBasemap({\n    id: \"maptoolkit-cycling\",\n    name: \"Maptoolkit Cycling\",\n    styleId: \"cycling\",\n    category: \"Cycling\",\n    description: \"Maptoolkit cycling style with bike routes and terrain.\",\n    tags: [\"cycling\", \"outdoor\", \"routes\"],\n  }),\n  mapToolkitStyleBasemap({\n    id: \"maptoolkit-winter\",\n    name: \"Maptoolkit Winter\",\n    styleId: \"winter\",\n    category: \"Outdoor\",\n    description:\n      \"Maptoolkit winter sports style with slopes and mountain terrain.\",\n    tags: [\"winter\", \"skiing\", \"slopes\", \"outdoor\"],\n  }),\n  mapToolkitStyleBasemap({\n    id: \"maptoolkit-dark\",\n    name: \"Maptoolkit Dark\",\n    styleId: \"dark\",\n    category: \"Dark\",\n    description: \"Dark Maptoolkit style for high-contrast overlays.\",\n    tags: [\"dark\"],\n  }),\n  mapToolkitStyleBasemap({\n    id: \"maptoolkit-street\",\n    name: \"Maptoolkit Street\",\n    styleId: \"street\",\n    category: \"Street\",\n    description: \"Maptoolkit general-purpose street style.\",\n    tags: [\"street\", \"streets\", \"navigation\"],\n  }),\n  rasterTrafficBasemap({\n    id: \"tomtom-traffic-flow-relative\",\n    name: \"TomTom Traffic Flow\",\n    provider: \"tomtom\",\n    description:\n      \"TomTom traffic speeds relative to free-flow speed. Requires a TomTom API key.\",\n    attribution: TOMTOM_ATTRIBUTION,\n    tiles: [\n      \"https://api.tomtom.com/traffic/map/4/tile/flow/relative0/{z}/{x}/{y}.png?key={api-key}\",\n    ],\n    tags: [\"tomtom\", \"flow\", \"relative\"],\n  }),\n  rasterTrafficBasemap({\n    id: \"tomtom-traffic-flow-absolute\",\n    name: \"TomTom Traffic Flow Absolute\",\n    provider: \"tomtom\",\n    description:\n      \"TomTom traffic colored by absolute speed. Requires a TomTom API key.\",\n    attribution: TOMTOM_ATTRIBUTION,\n    tiles: [\n      \"https://api.tomtom.com/traffic/map/4/tile/flow/absolute/{z}/{x}/{y}.png?key={api-key}\",\n    ],\n    tags: [\"tomtom\", \"flow\", \"absolute\"],\n  }),\n  rasterTrafficBasemap({\n    id: \"tomtom-traffic-flow-relative-delay\",\n    name: \"TomTom Traffic Flow Delay\",\n    provider: \"tomtom\",\n    description:\n      \"TomTom traffic highlighting only roads delayed below free-flow speed. Requires a TomTom API key.\",\n    attribution: TOMTOM_ATTRIBUTION,\n    tiles: [\n      \"https://api.tomtom.com/traffic/map/4/tile/flow/relative-delay/{z}/{x}/{y}.png?key={api-key}\",\n    ],\n    tags: [\"tomtom\", \"flow\", \"delay\"],\n  }),\n  rasterTrafficBasemap({\n    id: \"here-traffic-flow\",\n    name: \"HERE Traffic Flow\",\n    provider: \"here\",\n    description:\n      \"HERE real-time traffic flow overlay. Requires a HERE API key.\",\n    attribution: HERE_ATTRIBUTION,\n    tiles: [\n      \"https://traffic.maps.hereapi.com/v3/flow/mc/{z}/{x}/{y}/png?apiKey={api-key}\",\n    ],\n    tags: [\"here\", \"flow\"],\n  }),\n  {\n    id: \"mapbox-traffic\",\n    name: \"Mapbox Traffic\",\n    provider: \"mapbox\",\n    type: \"vector-overlay\",\n    category: \"Traffic\",\n    description:\n      \"Mapbox real-time traffic congestion overlay. Requires a Mapbox access token.\",\n    attribution: MAPBOX_ATTRIBUTION,\n    source: {\n      type: \"vector-overlay\",\n      url: \"mapbox://mapbox.mapbox-traffic-v1\",\n      sourceLayer: \"traffic\",\n      layerType: \"line\",\n      layout: {\n        \"line-join\": \"round\",\n        \"line-cap\": \"round\",\n      },\n      paint: {\n        \"line-width\": [\n          \"interpolate\",\n          [\"linear\"],\n          [\"zoom\"],\n          6,\n          1.5,\n          14,\n          4,\n          18,\n          8,\n        ],\n        \"line-color\": MAPBOX_TRAFFIC_CONGESTION_COLORS,\n      },\n    },\n    tags: [\"mapbox\", \"traffic\", \"overlay\", \"congestion\"],\n  },\n  {\n    id: \"google-traffic\",\n    name: \"Google Traffic\",\n    provider: \"google\",\n    type: \"raster\",\n    category: \"Traffic\",\n    description:\n      \"Google real-time traffic overlay via the Map Tiles API. Requires a Google Maps API key.\",\n    attribution: GOOGLE_ATTRIBUTION,\n    source: {\n      type: \"raster\",\n      tiles: [\n        \"https://tile.googleapis.com/v1/2dtiles/{z}/{x}/{y}?session={session}&key={api-key}\",\n      ],\n      tileSize: 256,\n      maxzoom: 22,\n      googleSession: {\n        mapType: \"roadmap\",\n        layerTypes: [\"layerTraffic\"],\n        overlay: true,\n      },\n    },\n    tags: [\"google\", \"traffic\", \"overlay\"],\n  },\n];\n\nexport function combineProviders(\n  defaults: BasemapProvider[],\n  custom: BasemapProvider[] = [],\n): BasemapProvider[] {\n  const byId = new Map<string, BasemapProvider>();\n  defaults.forEach((provider) => byId.set(provider.id, provider));\n  custom.forEach((provider) => byId.set(provider.id, provider));\n  return sortProviders([...byId.values()]);\n}\n\nexport function resolveBasemapProviders(\n  basemaps: BasemapDefinition[],\n  customProviders: BasemapProvider[] = [],\n  includeDefaultProviders = true,\n): BasemapProvider[] {\n  const byId = new Map<string, BasemapProvider>();\n  if (includeDefaultProviders) {\n    DEFAULT_BASEMAP_PROVIDERS.forEach((provider) =>\n      byId.set(provider.id, provider),\n    );\n  }\n  customProviders.forEach((provider) => byId.set(provider.id, provider));\n  // Derive any provider referenced by the catalog but not yet listed so the\n  // filter never omits a custom provider or shows defaults with no results.\n  basemaps.forEach((basemap) => {\n    if (basemap.provider && !byId.has(basemap.provider)) {\n      byId.set(basemap.provider, {\n        id: basemap.provider,\n        name: basemap.provider,\n      });\n    }\n  });\n  return sortProviders([...byId.values()]);\n}\n\nexport function createBasemapCatalog(\n  customBasemaps: BasemapDefinition[] = [],\n  includeDefaultBasemaps = true,\n): BasemapDefinition[] {\n  const basemaps = includeDefaultBasemaps\n    ? [...DEFAULT_BASEMAPS, ...customBasemaps]\n    : [...customBasemaps];\n  const byId = new Map<string, BasemapDefinition>();\n  basemaps.forEach((basemap) => byId.set(basemap.id, basemap));\n  return [...byId.values()];\n}\n\nexport interface BasemapFilter {\n  query?: string;\n  provider?: string;\n  category?: string;\n}\n\nexport function filterBasemaps(\n  basemaps: BasemapDefinition[],\n  filter: BasemapFilter,\n): BasemapDefinition[] {\n  const query = filter.query?.trim().toLowerCase() ?? \"\";\n\n  return basemaps.filter((basemap) => {\n    if (filter.provider && basemap.provider !== filter.provider) return false;\n    if (filter.category && basemap.category !== filter.category) return false;\n    if (!query) return true;\n\n    const haystack = [\n      basemap.name,\n      basemap.provider,\n      basemap.category,\n      basemap.description,\n      ...(basemap.tags ?? []),\n    ]\n      .filter(Boolean)\n      .join(\" \")\n      .toLowerCase();\n\n    return haystack.includes(query);\n  });\n}\n\nexport function getBasemapCategories(basemaps: BasemapDefinition[]): string[] {\n  return [\n    ...new Set(\n      basemaps.map((basemap) => basemap.category).filter(Boolean) as string[],\n    ),\n  ].sort();\n}\n","import type {\n  IControl,\n  LayerSpecification,\n  Map as MapLibreMap,\n  SourceSpecification,\n  StyleSpecification,\n} from 'maplibre-gl';\nimport {\n  createBasemapCatalog,\n  filterBasemaps,\n  getBasemapCategories,\n  resolveBasemapProviders,\n} from './catalog';\nimport type {\n  BasemapControlEvent,\n  BasemapControlEventHandler,\n  BasemapControlOptions,\n  BasemapControlPosition,\n  BasemapControlState,\n  BasemapDefinition,\n  BasemapProvider,\n  GoogleSessionConfig,\n  ManagedRasterBasemap,\n  VectorOverlayBasemapSource,\n} from './types';\n\nconst DEFAULT_OPTIONS: Required<\n  Pick<\n    BasemapControlOptions,\n    | 'collapsed'\n    | 'position'\n    | 'title'\n    | 'panelWidth'\n    | 'className'\n    | 'includeDefaultBasemaps'\n    | 'allowMultiple'\n    | 'showMultipleToggle'\n    | 'resizable'\n  >\n> = {\n  collapsed: true,\n  position: 'top-right',\n  title: 'Basemaps',\n  panelWidth: 340,\n  className: '',\n  includeDefaultBasemaps: true,\n  allowMultiple: false,\n  showMultipleToggle: true,\n  resizable: true,\n};\n\nconst CONTROL_SOURCE_PREFIX = 'maplibre-basemap-control-source';\nconst CONTROL_LAYER_PREFIX = '';\nconst API_KEY_PLACEHOLDER = '{api-key}';\nconst MAPTILER_API_KEY_EXAMPLE = 'YOUR_MAPTILER_API_KEY';\nconst MAPTILER_API_KEY_QUERY = '?key';\nconst MAPTILER_API_KEY_EMPTY_QUERY = '?key=';\nconst AWS_REGION_PLACEHOLDER = '{aws-region}';\n\n// Where users can obtain the credentials each provider requires. Surfaced as a\n// \"Get a ...\" link beside a missing-credential error so the message points at a\n// concrete next step instead of dead-ending.\nconst PROVIDER_CREDENTIAL_HELP: Record<string, { url: string; label: string }> = {\n  amazon: {\n    url: 'https://docs.aws.amazon.com/location/latest/developerguide/using-apikeys.html',\n    label: 'Get an Amazon API key',\n  },\n  maptiler: {\n    url: 'https://cloud.maptiler.com/account/keys/',\n    label: 'Get a MapTiler API key',\n  },\n  mapbox: {\n    url: 'https://docs.mapbox.com/help/getting-started/access-tokens/',\n    label: 'Get a Mapbox access token',\n  },\n  protomaps: {\n    url: 'https://protomaps.com/account',\n    label: 'Get a Protomaps API key',\n  },\n  stadia: {\n    url: 'https://client.stadiamaps.com/signup/',\n    label: 'Get a Stadia Maps API key',\n  },\n  tianditu: {\n    url: 'https://console.tianditu.gov.cn/api/key',\n    label: 'Get a Tianditu API key',\n  },\n  tomtom: {\n    url: 'https://developer.tomtom.com/how-to-get-tomtom-api-key',\n    label: 'Get a TomTom API key',\n  },\n  here: {\n    url: 'https://www.here.com/get-started/pricing',\n    label: 'Get a HERE API key',\n  },\n  google: {\n    url: 'https://developers.google.com/maps/documentation/tile/get-api-key',\n    label: 'Get a Google Maps API key',\n  },\n};\n\n// What to call each provider's credential in the \"Enter a ... before applying\n// this layer.\" message raised when a raster basemap's `{api-key}` cannot be\n// substituted. Providers absent here fall back to a generic \"API key\".\nconst RASTER_KEY_LABELS: Record<string, string> = {\n  google: 'Google Maps API key',\n  here: 'HERE API key',\n  stadia: 'Stadia Maps API key',\n  tianditu: 'Tianditu API key',\n  tomtom: 'TomTom API key',\n};\n\n// How long after a credentialed provider's style descriptor loads the control\n// keeps watching for an unauthorized (401/403) tile request before considering\n// the basemap healthy. The first tiles are fetched immediately once the style\n// is live, so this only needs to cover that initial burst.\nconst STYLE_AUTH_GRACE_MS = 2500;\n\nconst MIN_PANEL_WIDTH = 240;\nconst MIN_PANEL_HEIGHT = 200;\nconst PANEL_VIEWPORT_MARGIN = 12;\n\n// Thrown when a style basemap cannot be applied because the provider's\n// credentials are missing. Carries the provider id so the panel can show the\n// matching \"Get a ...\" link and reveal the provider settings input.\nclass MissingCredentialError extends Error {\n  readonly provider: string;\n\n  constructor(message: string, provider: string) {\n    super(message);\n    this.name = 'MissingCredentialError';\n    this.provider = provider;\n  }\n}\n\n// Thrown when a style basemap's descriptor request fails *after* it was applied\n// (e.g. an invalid provider API key returns 401/403, or the host is\n// unreachable). Carries the provider and the HTTP status, when known, so hosts\n// can surface a precise message. Unlike MissingCredentialError this is reported\n// asynchronously, once MapLibre reports the failed style request.\nclass BasemapLoadError extends Error {\n  readonly provider: string;\n  readonly status?: number;\n\n  constructor(message: string, provider: string, status?: number) {\n    super(message);\n    this.name = 'BasemapLoadError';\n    this.provider = provider;\n    this.status = status;\n  }\n}\n\n// MapLibre reports failed network requests (including a style descriptor that\n// 401/403s) as `error` events whose `error` is an AJAXError carrying the\n// request URL. Pull it out defensively so a style-load failure can be matched\n// to the exact style URL the control applied.\nfunction extractErrorUrl(error: unknown): string | undefined {\n  if (error && typeof error === 'object' && 'url' in error) {\n    const url = (error as { url?: unknown }).url;\n    if (typeof url === 'string') return url;\n  }\n  return undefined;\n}\n\nfunction extractErrorStatus(error: unknown): number | undefined {\n  if (error && typeof error === 'object' && 'status' in error) {\n    const status = (error as { status?: unknown }).status;\n    if (typeof status === 'number' && status > 0) return status;\n  }\n  return undefined;\n}\n\ninterface ResizeAnchor {\n  x: number;\n  y: number;\n  isLeft: boolean;\n  isTop: boolean;\n}\n\ntype EventHandlersMap = globalThis.Map<BasemapControlEvent, Set<BasemapControlEventHandler>>;\ntype SetStyleOptions = NonNullable<Parameters<MapLibreMap['setStyle']>[1]>;\n\n// The shape of a single provider credential input, shared by the centralized\n// settings view and the inline field shown beside a missing-credential error.\ninterface ProviderInputConfig {\n  className: string;\n  type: string;\n  placeholder: string;\n  ariaLabel: string;\n  value: string;\n  onInput: (value: string) => void;\n}\n\nexport class BasemapControl implements IControl {\n  private _map?: MapLibreMap;\n  private _mapContainer?: HTMLElement;\n  private _container?: HTMLElement;\n  private _panel?: HTMLElement;\n  private _content?: HTMLElement;\n  private _options: Required<\n    Pick<\n      BasemapControlOptions,\n      | 'collapsed'\n      | 'position'\n      | 'title'\n      | 'panelWidth'\n      | 'className'\n      | 'includeDefaultBasemaps'\n      | 'allowMultiple'\n      | 'showMultipleToggle'\n      | 'resizable'\n    >\n  > &\n    Omit<\n      BasemapControlOptions,\n      | 'collapsed'\n      | 'position'\n      | 'title'\n      | 'panelWidth'\n      | 'className'\n      | 'includeDefaultBasemaps'\n      | 'allowMultiple'\n      | 'showMultipleToggle'\n      | 'resizable'\n    >;\n  private _state: BasemapControlState;\n  private _basemaps: BasemapDefinition[];\n  private _providers: BasemapProvider[];\n  private _eventHandlers: EventHandlersMap = new globalThis.Map();\n  // Active managed raster basemaps keyed by basemap id, in insertion order. In\n  // single mode this holds at most one entry; in multiple mode it tracks every\n  // stacked raster overlay so each can be added or removed independently.\n  private _managedRasters: globalThis.Map<string, ManagedRasterBasemap> = new globalThis.Map();\n  private _mapTilerApiKey = '';\n  private _amazonApiKey = '';\n  private _awsRegion = '';\n  private _mapboxAccessToken = '';\n  private _protomapsApiKey = '';\n  private _stadiaApiKey = '';\n  private _tiandituApiKey = '';\n  private _tomtomApiKey = '';\n  private _hereApiKey = '';\n  private _googleMapsApiKey = '';\n  // Cached Google Map Tiles API session tokens keyed by their session config, so\n  // a traffic overlay reuses a token until it expires instead of creating a new\n  // session on every add. Keyed by the serialized config + API key.\n  private _googleSessions: globalThis.Map<string, { token: string; expiry: number }> =\n    new globalThis.Map();\n  // Which sub-view the panel content shows: the basemap list, or the dedicated\n  // API-keys settings view opened from the header key button (#837).\n  private _activeView: 'basemaps' | 'settings' = 'basemaps';\n  private _settingsButton?: HTMLButtonElement;\n  // Provider of the most recent missing-credential error, used to pick the\n  // matching help link and the inline credential field beside the error. Kept\n  // in sync with `_state.error` (both are cleared together) so it is never\n  // stale when consulted.\n  private _missingCredentialProvider?: keyof typeof PROVIDER_CREDENTIAL_HELP;\n  // The basemap whose application last failed for a missing credential, so the\n  // inline credential field's Enter key can re-attempt it (#837).\n  private _lastFailedBasemapId?: string;\n  // The id of a just-applied basemap that is showing its keyless public tiles\n  // because no API key is set (currently the Google Maps/Satellite/Terrain/\n  // Hybrid basemaps). The panel offers an optional inline key input that\n  // upgrades it to the authorized tiles; leaving it blank keeps the fallback.\n  private _optionalKeyBasemapId?: string;\n  // Detaches the listeners watching the in-flight style load (see\n  // _watchStyleLoad). Set while a style swap is settling, cleared once it\n  // succeeds, fails, or is superseded by a newer swap.\n  private _cancelStyleWatch?: () => void;\n  private _resizeHandler: (() => void) | null = null;\n  private _mapResizeHandler: (() => void) | null = null;\n  private _resizeAnchor: ResizeAnchor | null = null;\n  private _resizeHandleEl: HTMLElement | null = null;\n\n  constructor(options?: BasemapControlOptions) {\n    this._options = { ...DEFAULT_OPTIONS, ...options };\n    this._mapTilerApiKey = options?.mapTilerApiKey ?? '';\n    this._amazonApiKey = options?.amazonApiKey ?? '';\n    this._awsRegion = options?.awsRegion ?? 'us-east-1';\n    this._mapboxAccessToken = options?.mapboxAccessToken ?? '';\n    this._protomapsApiKey = options?.protomapsApiKey ?? '';\n    this._stadiaApiKey = options?.stadiaApiKey ?? '';\n    this._tiandituApiKey = options?.tiandituApiKey ?? '';\n    this._tomtomApiKey = options?.tomtomApiKey ?? '';\n    this._hereApiKey = options?.hereApiKey ?? '';\n    this._googleMapsApiKey = options?.googleMapsApiKey ?? '';\n    this._basemaps = createBasemapCatalog(\n      options?.basemaps,\n      this._options.includeDefaultBasemaps,\n    );\n    this._providers = resolveBasemapProviders(\n      this._basemaps,\n      options?.providers,\n      this._options.includeDefaultBasemaps,\n    );\n    this._state = {\n      collapsed: this._options.collapsed,\n      panelWidth: this._options.panelWidth,\n      activeBasemapId: this._options.defaultBasemapId,\n      activeBasemapIds: this._options.defaultBasemapId ? [this._options.defaultBasemapId] : [],\n      allowMultiple: this._options.allowMultiple,\n      query: '',\n      providerFilter: '',\n      categoryFilter: '',\n      beforeId: '',\n      loading: false,\n    };\n  }\n\n  onAdd(map: MapLibreMap): HTMLElement {\n    this._map = map;\n    this._mapContainer = map.getContainer();\n    this._container = this._createContainer();\n    this._panel = this._createPanel();\n    this._mapContainer.appendChild(this._panel);\n    this._setupEventListeners();\n\n    if (!this._state.collapsed) {\n      this._panel.classList.add('expanded');\n      requestAnimationFrame(() => this._updatePanelPosition());\n    }\n\n    this._renderContent();\n\n    if (this._state.activeBasemapId) {\n      // Apply the configured default basemap. This always sets it (rather than\n      // routing through the panel's toggle handler) so multiple mode does not\n      // immediately toggle the pre-seeded default basemap back off.\n      this.setBasemap(this._state.activeBasemapId).catch(() => {});\n    }\n\n    return this._container;\n  }\n\n  onRemove(): void {\n    if (this._resizeHandler) {\n      window.removeEventListener('resize', this._resizeHandler);\n      this._resizeHandler = null;\n    }\n    if (this._mapResizeHandler && this._map) {\n      this._map.off('resize', this._mapResizeHandler);\n      this._mapResizeHandler = null;\n    }\n    window.removeEventListener('pointermove', this._onResizeMove);\n    window.removeEventListener('pointerup', this._onResizeEnd);\n    window.removeEventListener('pointercancel', this._onResizeEnd);\n    // Detach any in-flight style-load watcher before the map reference is\n    // dropped so its listeners cannot fire after removal.\n    this._cancelStyleWatch?.();\n    this._resizeAnchor = null;\n    this._resizeHandleEl = null;\n    this._panel?.parentNode?.removeChild(this._panel);\n    this._container?.parentNode?.removeChild(this._container);\n\n    this._map = undefined;\n    this._mapContainer = undefined;\n    this._container = undefined;\n    this._panel = undefined;\n    this._content = undefined;\n    this._eventHandlers.clear();\n  }\n\n  getState(): BasemapControlState {\n    return { ...this._state };\n  }\n\n  setState(newState: Partial<BasemapControlState>): void {\n    this._state = { ...this._state, ...newState };\n    this._syncActiveBasemapState(newState);\n    this._renderContent();\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  // Keeps `activeBasemapId` and `activeBasemapIds` consistent when a caller\n  // updates only one of them through setState (the React wrapper and external\n  // consumers commonly set just `activeBasemapId`).\n  private _syncActiveBasemapState(applied: Partial<BasemapControlState>): void {\n    const hasId = 'activeBasemapId' in applied;\n    const hasIds = 'activeBasemapIds' in applied;\n    if (hasId && !hasIds) {\n      const id = this._state.activeBasemapId;\n      this._state = { ...this._state, activeBasemapIds: id ? [id] : [] };\n    } else if (hasIds && !hasId) {\n      const ids = this._state.activeBasemapIds;\n      this._state = { ...this._state, activeBasemapId: ids[ids.length - 1] };\n    }\n  }\n\n  getBasemaps(): BasemapDefinition[] {\n    return [...this._basemaps];\n  }\n\n  setBasemaps(basemaps: BasemapDefinition[]): void {\n    this._basemaps = [...basemaps];\n    this._providers = resolveBasemapProviders(\n      this._basemaps,\n      this._options.providers,\n      this._options.includeDefaultBasemaps,\n    );\n    const activeBasemapIds = this._state.activeBasemapIds.filter((id) =>\n      this._basemaps.some((basemap) => basemap.id === id),\n    );\n    this._state = {\n      ...this._state,\n      activeBasemapIds,\n      activeBasemapId:\n        this._state.activeBasemapId && activeBasemapIds.includes(this._state.activeBasemapId)\n          ? this._state.activeBasemapId\n          : activeBasemapIds[activeBasemapIds.length - 1],\n    };\n    this._renderContent();\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  setMapTilerApiKey(apiKey: string): void {\n    this._mapTilerApiKey = apiKey;\n    this._clearError();\n    this._renderContent();\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  setAmazonCredentials(apiKey: string, awsRegion = this._awsRegion): void {\n    this._amazonApiKey = apiKey;\n    this._awsRegion = awsRegion;\n    this._clearError();\n    this._renderContent();\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  setMapboxAccessToken(accessToken: string): void {\n    this._mapboxAccessToken = accessToken;\n    this._clearError();\n    this._renderContent();\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  setProtomapsApiKey(apiKey: string): void {\n    this._protomapsApiKey = apiKey;\n    this._clearError();\n    this._renderContent();\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  setStadiaApiKey(apiKey: string): void {\n    this._stadiaApiKey = apiKey;\n    this._clearError();\n    this._renderContent();\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  setTiandituApiKey(apiKey: string): void {\n    this._tiandituApiKey = apiKey;\n    this._clearError();\n    this._renderContent();\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  setTomTomApiKey(apiKey: string): void {\n    this._tomtomApiKey = apiKey;\n    this._clearError();\n    this._renderContent();\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  setHereApiKey(apiKey: string): void {\n    this._hereApiKey = apiKey;\n    this._clearError();\n    this._renderContent();\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  setGoogleMapsApiKey(apiKey: string): void {\n    this._googleMapsApiKey = apiKey;\n    // A new key invalidates any session tokens minted with the previous one.\n    this._googleSessions.clear();\n    this._clearError();\n    this._renderContent();\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  getActiveBasemap(): BasemapDefinition | undefined {\n    return this._basemaps.find((basemap) => basemap.id === this._state.activeBasemapId);\n  }\n\n  getActiveBasemaps(): BasemapDefinition[] {\n    return this._state.activeBasemapIds\n      .map((id) => this._basemaps.find((basemap) => basemap.id === id))\n      .filter((basemap): basemap is BasemapDefinition => Boolean(basemap));\n  }\n\n  isBasemapActive(id: string): boolean {\n    return this._state.activeBasemapIds.includes(id);\n  }\n\n  // Apply a basemap, replacing any previously active basemaps.\n  async setBasemap(id: string): Promise<void> {\n    return this._applyBasemapChange(id, 'replace');\n  }\n\n  // Add a raster basemap as an additional overlay without removing the active\n  // ones. Style basemaps cannot stack, so they always replace the map style.\n  async addBasemap(id: string): Promise<void> {\n    return this._applyBasemapChange(id, 'add');\n  }\n\n  // Remove a previously added managed raster basemap from the map.\n  async removeBasemap(id: string): Promise<void> {\n    const basemap = this._basemaps.find((candidate) => candidate.id === id);\n    if (!basemap) {\n      const error = new Error(`Basemap \"${id}\" was not found.`);\n      this._handleError(error);\n      throw error;\n    }\n    if (!this._map) {\n      const error = new Error('BasemapControl must be added to a map before removing a basemap.');\n      this._handleError(error, basemap);\n      throw error;\n    }\n\n    const managedRaster = this._removeManagedRaster(id);\n    const activeBasemapIds = this._state.activeBasemapIds.filter((value) => value !== id);\n    this._state = {\n      ...this._state,\n      activeBasemapIds,\n      activeBasemapId: activeBasemapIds[activeBasemapIds.length - 1],\n      error: undefined,\n    };\n    this._renderContent(true);\n    this._emit({ type: 'basemapremove', state: this.getState(), basemap, managedRaster });\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  // Add the basemap if it is not active, otherwise remove it.\n  async toggleBasemap(id: string): Promise<void> {\n    if (this.isBasemapActive(id)) {\n      return this.removeBasemap(id);\n    }\n    return this.addBasemap(id);\n  }\n\n  private async _applyBasemapChange(id: string, mode: 'replace' | 'add'): Promise<void> {\n    const basemap = this._basemaps.find((candidate) => candidate.id === id);\n    if (!basemap) {\n      const error = new Error(`Basemap \"${id}\" was not found.`);\n      this._handleError(error);\n      throw error;\n    }\n    if (!this._map) {\n      const error = new Error('BasemapControl must be added to a map before setting a basemap.');\n      this._handleError(error, basemap);\n      throw error;\n    }\n\n    // Raster and vector overlays stack on top of the active basemap; style\n    // basemaps replace the entire map style and cannot be stacked.\n    const isOverlay =\n      basemap.source.type === 'raster' || basemap.source.type === 'vector-overlay';\n    const effectiveMode: 'replace' | 'add' = isOverlay ? mode : 'replace';\n\n    // Validate provider credentials for a style basemap up-front, before the\n    // destructive confirm prompt below. A style swap discards stacked rasters,\n    // so a missing key must surface the inline credential field instead of\n    // asking the user to approve clearing their basemap stack only to then hit\n    // a hard \"enter an API key\" error (#837). Overlays stack non-destructively\n    // and resolve their credentials lazily, so they are not pre-checked here.\n    if (!isOverlay) {\n      try {\n        this._resolveStyleUrl(basemap);\n      } catch (cause) {\n        if (cause instanceof MissingCredentialError) {\n          this._enterCredentialError(cause, basemap);\n          throw cause;\n        }\n        // Non-credential resolution errors fall through to the apply path\n        // below, which reports them with full loading/error handling.\n      }\n    }\n\n    // A style basemap swaps the whole map style, discarding every stacked\n    // raster overlay. In stack mode that is a destructive, easy-to-trigger\n    // surprise, so give the host a chance to confirm before the rasters are\n    // lost. Skipped in single mode, where replacing the one active basemap is\n    // expected, and when no host confirm hook is provided.\n    if (\n      !isOverlay &&\n      this._state.allowMultiple &&\n      this._managedRasters.size > 0 &&\n      this._options.confirmStyleReplace\n    ) {\n      const replacedBasemapIds = [...this._managedRasters.keys()];\n      let confirmed = false;\n      try {\n        confirmed = await this._options.confirmStyleReplace({ basemap, replacedBasemapIds });\n      } catch {\n        confirmed = false;\n      }\n      if (!confirmed) return;\n    }\n\n    this._state = { ...this._state, loading: true, error: undefined };\n    this._renderContent(true);\n    this._emit({ type: 'statechange', state: this.getState() });\n\n    // The basemap that was active before this swap, captured before the state\n    // update below so a failed style load can roll back to it.\n    const previousActiveBasemapId = this._state.activeBasemapId;\n\n    try {\n      let managedRaster: ManagedRasterBasemap | undefined;\n      let resolvedStyleUrl: string | undefined;\n      if (isOverlay) {\n        await this._waitForStyleReady();\n        if (effectiveMode === 'replace') {\n          this._removeManagedBasemap();\n        } else {\n          // Re-selecting an already-managed overlay re-adds it on top using the\n          // current before_id, so drop the previous instance first.\n          this._removeManagedRaster(basemap.id);\n        }\n        managedRaster = await this._addOverlay(basemap);\n      } else {\n        const styleUrl = this._resolveStyleUrl(basemap);\n        resolvedStyleUrl = styleUrl;\n        const styleOptions = this._getStyleOptions(basemap);\n        // A full style swap discards every managed raster overlay, so forget\n        // the ones we were tracking.\n        this._removeManagedBasemap();\n        if (styleOptions) {\n          this._map.setStyle(styleUrl, styleOptions);\n        } else {\n          this._map.setStyle(styleUrl);\n        }\n        // setStyle fetches the descriptor asynchronously. If that request fails\n        // (e.g. an invalid provider API key returns 401/403) MapLibre is left\n        // without a style and the map goes blank. Watch the load so the\n        // previous basemap is restored and the failure reported, instead of\n        // silently clearing the map.\n        this._watchStyleLoad(styleUrl, basemap, previousActiveBasemapId);\n      }\n\n      this._applyBasemapView(basemap);\n\n      const activeBasemapIds =\n        effectiveMode === 'add'\n          ? [...this._state.activeBasemapIds.filter((value) => value !== basemap.id), basemap.id]\n          : [basemap.id];\n\n      this._state = {\n        ...this._state,\n        activeBasemapId: basemap.id,\n        activeBasemapIds,\n        loading: false,\n        error: undefined,\n      };\n      // Offer the optional key input when this basemap fell back to its keyless\n      // public tiles (no API key configured); clear it otherwise so the prompt\n      // does not linger on a keyed or non-fallback basemap.\n      this._optionalKeyBasemapId = this._basemapUsesKeylessFallback(basemap)\n        ? basemap.id\n        : undefined;\n      this._renderContent(true);\n      this._emit({\n        type: 'basemapchange',\n        state: this.getState(),\n        basemap,\n        managedRaster,\n        resolvedStyleUrl,\n        mode: effectiveMode,\n      });\n      this._emit({ type: 'statechange', state: this.getState() });\n    } catch (cause) {\n      const error = cause instanceof Error ? cause : new Error(String(cause));\n      if (error instanceof MissingCredentialError) {\n        // Surface the inline credential field beside the error so a missing\n        // key has an obvious next step instead of dead-ending (#837).\n        this._enterCredentialError(error, basemap);\n      } else {\n        this._state = { ...this._state, loading: false, error: error.message };\n        this._missingCredentialProvider = undefined;\n        this._renderContent(true);\n        this._handleError(error, basemap);\n      }\n      throw error;\n    }\n  }\n\n  // Watches the asynchronous style load that `setStyle` kicked off for a style\n  // basemap, and rolls back to the previous basemap (reporting the failure\n  // through the `error` event) when the new style cannot actually render. Two\n  // failure modes are caught so a broken provider basemap never leaves a blank\n  // map:\n  //\n  //   1. The style *document* request fails outright (matched by URL), e.g. an\n  //      unreachable host or a descriptor that 404s. Detected whether or not\n  //      `style.load` ever fires.\n  //   2. The descriptor loads but the provider rejects the credentials when the\n  //      first tiles are fetched (401/403). Amazon Location, for instance,\n  //      serves the style JSON publicly but 403s every tile for a bad API key,\n  //      so the descriptor \"loads\" while the map stays empty. This is only\n  //      treated as fatal for credentialed providers, and only briefly after\n  //      the descriptor loads, so an isolated transient tile error on a healthy\n  //      basemap is ignored.\n  private _watchStyleLoad(\n    styleUrl: string,\n    basemap: BasemapDefinition,\n    previousActiveBasemapId: string | undefined,\n  ): void {\n    const map = this._map;\n    if (!map) return;\n\n    // Supersede any still-pending watcher from a faster previous switch so its\n    // listeners cannot fire against this newer style.\n    this._cancelStyleWatch?.();\n\n    const isCredentialed = basemap.provider in PROVIDER_CREDENTIAL_HELP;\n    let settled = false;\n    let graceTimer: ReturnType<typeof setTimeout> | undefined;\n    const cleanup = () => {\n      if (settled) return;\n      settled = true;\n      if (graceTimer !== undefined) clearTimeout(graceTimer);\n      map.off('style.load', onLoad);\n      map.off('error', onError);\n      if (this._cancelStyleWatch === cleanup) this._cancelStyleWatch = undefined;\n    };\n\n    const fail = (cause: unknown) => {\n      cleanup();\n      this._handleStyleLoadFailure(basemap, previousActiveBasemapId, cause);\n    };\n\n    const onLoad = () => {\n      // The descriptor loaded. For a keyless style that is success. For a\n      // credentialed provider keep listening briefly so the first unauthorized\n      // tile request (which only happens once the style is live) can still roll\n      // back a credential-rejected basemap.\n      if (!isCredentialed) {\n        cleanup();\n      } else if (graceTimer === undefined) {\n        graceTimer = setTimeout(cleanup, STYLE_AUTH_GRACE_MS);\n      }\n    };\n\n    const onError = (event: { error?: unknown }) => {\n      const error = event?.error;\n      // The style document itself failed to load.\n      if (extractErrorUrl(error) === styleUrl) {\n        fail(error);\n        return;\n      }\n      // A provider rejecting the just-applied style's resources (401/403) means\n      // the basemap cannot render; the URL match above already handled a failed\n      // descriptor, so this catches unauthorized tiles/sprites/glyphs.\n      if (isCredentialed) {\n        const status = extractErrorStatus(error);\n        if (status === 401 || status === 403) fail(error);\n      }\n    };\n\n    this._cancelStyleWatch = cleanup;\n    map.once('style.load', onLoad);\n    map.on('error', onError);\n  }\n\n  // Rolls back a failed style swap: restores the previously active basemap (when\n  // it is a style basemap the control owns), then reports the failure inline and\n  // through the `error` event. When the failing provider needs an API key, the\n  // inline credential field is revealed so the user can correct the key and\n  // retry without losing their map.\n  private _handleStyleLoadFailure(\n    failedBasemap: BasemapDefinition,\n    previousActiveBasemapId: string | undefined,\n    cause: unknown,\n  ): void {\n    this._restorePreviousBasemap(previousActiveBasemapId, failedBasemap.id);\n\n    const status = extractErrorStatus(cause);\n    const credentialProvider =\n      failedBasemap.provider in PROVIDER_CREDENTIAL_HELP\n        ? (failedBasemap.provider as keyof typeof PROVIDER_CREDENTIAL_HELP)\n        : undefined;\n    const hint = credentialProvider\n      ? ' Check the API key and try again.'\n      : ' Check your connection and try again.';\n    const error = new BasemapLoadError(\n      `Could not load the \"${failedBasemap.name}\" basemap${status ? ` (HTTP ${status})` : ''}.${hint}`,\n      failedBasemap.provider,\n      status,\n    );\n\n    this._state = { ...this._state, loading: false, error: error.message };\n    this._missingCredentialProvider = credentialProvider;\n    // Only offer an inline retry for a credentialed provider, where re-entering\n    // the key and pressing Enter can reasonably succeed.\n    this._lastFailedBasemapId = credentialProvider ? failedBasemap.id : undefined;\n    this._activeView = 'basemaps';\n    this._renderContent(true);\n    this._handleError(error, failedBasemap);\n  }\n\n  // Reapplies the previously active style basemap after a failed swap. Only a\n  // control-owned style/vector-style basemap can be reapplied; when the previous\n  // basemap is unknown, a raster overlay, or a style the host owns, the panel\n  // state is pointed back at it (so the failed basemap is not highlighted) and\n  // the host is left to restore its own style from the emitted `error` event.\n  private _restorePreviousBasemap(\n    previousActiveBasemapId: string | undefined,\n    failedBasemapId: string,\n  ): void {\n    const map = this._map;\n    const previous =\n      previousActiveBasemapId && previousActiveBasemapId !== failedBasemapId\n        ? this._basemaps.find((candidate) => candidate.id === previousActiveBasemapId)\n        : undefined;\n\n    const pointStateAtPrevious = () => {\n      this._state = {\n        ...this._state,\n        activeBasemapId: previousActiveBasemapId,\n        activeBasemapIds: previousActiveBasemapId ? [previousActiveBasemapId] : [],\n      };\n    };\n\n    if (\n      !map ||\n      !previous ||\n      (previous.source.type !== 'style' && previous.source.type !== 'vector-style')\n    ) {\n      pointStateAtPrevious();\n      return;\n    }\n\n    try {\n      const styleUrl = this._resolveStyleUrl(previous);\n      const styleOptions = this._getStyleOptions(previous);\n      this._removeManagedBasemap();\n      if (styleOptions) {\n        map.setStyle(styleUrl, styleOptions);\n      } else {\n        map.setStyle(styleUrl);\n      }\n      this._state = {\n        ...this._state,\n        activeBasemapId: previous.id,\n        activeBasemapIds: [previous.id],\n      };\n      this._emit({\n        type: 'basemapchange',\n        state: this.getState(),\n        basemap: previous,\n        resolvedStyleUrl: styleUrl,\n        restored: true,\n        mode: 'replace',\n      });\n    } catch {\n      // If even the restore fails (e.g. the previous basemap now needs a key),\n      // leave the panel pointing at the previous id rather than the broken one.\n      pointStateAtPrevious();\n    }\n  }\n\n  // The public mutators rethrow after emitting the error event so callers that\n  // await them can react. The panel's click handler uses this instead to avoid\n  // unhandled promise rejections; the failure is still reported via `error`.\n  // In multiple mode a raster basemap click toggles the overlay on or off.\n  private _selectBasemap(id: string): void {\n    const basemap = this._basemaps.find((candidate) => candidate.id === id);\n    const isOverlay =\n      basemap?.source.type === 'raster' || basemap?.source.type === 'vector-overlay';\n    if (this._state.allowMultiple && isOverlay) {\n      this.toggleBasemap(id).catch(() => {});\n      return;\n    }\n    this.setBasemap(id).catch(() => {});\n  }\n\n  toggle(): void {\n    this._state = { ...this._state, collapsed: !this._state.collapsed };\n\n    if (this._panel) {\n      if (this._state.collapsed) {\n        this._panel.classList.remove('expanded');\n        this._emit({ type: 'collapse', state: this.getState() });\n      } else {\n        this._panel.classList.add('expanded');\n        this._updatePanelPosition();\n        this._emit({ type: 'expand', state: this.getState() });\n      }\n    }\n\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  expand(): void {\n    if (this._state.collapsed) this.toggle();\n  }\n\n  collapse(): void {\n    if (!this._state.collapsed) this.toggle();\n  }\n\n  on(event: BasemapControlEvent, handler: BasemapControlEventHandler): void {\n    if (!this._eventHandlers.has(event)) {\n      this._eventHandlers.set(event, new Set());\n    }\n    this._eventHandlers.get(event)!.add(handler);\n  }\n\n  off(event: BasemapControlEvent, handler: BasemapControlEventHandler): void {\n    this._eventHandlers.get(event)?.delete(handler);\n  }\n\n  getMap(): MapLibreMap | undefined {\n    return this._map;\n  }\n\n  getContainer(): HTMLElement | undefined {\n    return this._container;\n  }\n\n  private _emit(event: Parameters<BasemapControlEventHandler>[0]): void {\n    this._eventHandlers.get(event.type)?.forEach((handler) => handler(event));\n  }\n\n  private _handleError(error: Error, basemap?: BasemapDefinition): void {\n    this._emit({ type: 'error', state: this.getState(), error, basemap });\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  // Clears the current error and its associated missing-credential provider so\n  // the inline credential field and help link disappear together.\n  private _clearError(): void {\n    if (\n      this._state.error === undefined &&\n      this._missingCredentialProvider === undefined &&\n      this._lastFailedBasemapId === undefined\n    ) {\n      return;\n    }\n    this._state = { ...this._state, error: undefined };\n    this._missingCredentialProvider = undefined;\n    this._lastFailedBasemapId = undefined;\n  }\n\n  // Records a missing-credential failure: stores the error, remembers the\n  // provider (for the help link and inline field) and the basemap to retry, and\n  // surfaces the basemaps view so the inline credential field beside the error\n  // is visible (#837).\n  private _enterCredentialError(error: MissingCredentialError, basemap: BasemapDefinition): void {\n    this._state = { ...this._state, loading: false, error: error.message };\n    this._missingCredentialProvider = error.provider as keyof typeof PROVIDER_CREDENTIAL_HELP;\n    this._lastFailedBasemapId = basemap.id;\n    this._activeView = 'basemaps';\n    this._renderContent(true);\n    this._handleError(error, basemap);\n  }\n\n  private _createContainer(): HTMLElement {\n    const container = document.createElement('div');\n    container.className = `maplibregl-ctrl maplibregl-ctrl-group basemap-control${\n      this._options.className ? ` ${this._options.className}` : ''\n    }`;\n\n    const toggleBtn = document.createElement('button');\n    toggleBtn.className = 'basemap-control-toggle';\n    toggleBtn.type = 'button';\n    toggleBtn.title = this._options.title;\n    toggleBtn.setAttribute('aria-label', this._options.title);\n    toggleBtn.innerHTML = `\n      <span class=\"basemap-control-icon\" aria-hidden=\"true\">\n        <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n          <path d=\"m3 6 6-3 6 3 6-3v15l-6 3-6-3-6 3V6Z\"/>\n          <path d=\"M9 3v15\"/>\n          <path d=\"M15 6v15\"/>\n        </svg>\n      </span>\n    `;\n    toggleBtn.addEventListener('click', () => this.toggle());\n    container.appendChild(toggleBtn);\n\n    return container;\n  }\n\n  private _createPanel(): HTMLElement {\n    const panel = document.createElement('div');\n    panel.className = 'basemap-control-panel';\n    panel.style.width = `${this._state.panelWidth}px`;\n    if (this._state.panelHeight !== undefined) {\n      panel.style.height = `${this._state.panelHeight}px`;\n      panel.classList.add('is-resized');\n    }\n\n    const header = document.createElement('div');\n    header.className = 'basemap-control-header';\n\n    const title = document.createElement('span');\n    title.className = 'basemap-control-title';\n    title.textContent = this._options.title;\n\n    // Key button: opens the dedicated API-keys settings view. Only meaningful\n    // when at least one catalog basemap needs a provider credential, so its\n    // visibility is reconciled in `_renderContent`.\n    const settingsBtn = document.createElement('button');\n    settingsBtn.className = 'basemap-control-settings-toggle';\n    settingsBtn.type = 'button';\n    settingsBtn.setAttribute('aria-label', 'API keys');\n    settingsBtn.title = 'API keys';\n    settingsBtn.innerHTML = `\n      <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n        <path d=\"m21 2-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0 3 3L22 7l-3-3m-3.5 3.5L19 4\"/>\n      </svg>\n    `;\n    settingsBtn.addEventListener('click', () => this._toggleSettingsView());\n    this._settingsButton = settingsBtn;\n\n    const closeBtn = document.createElement('button');\n    closeBtn.className = 'basemap-control-close';\n    closeBtn.type = 'button';\n    closeBtn.setAttribute('aria-label', 'Close basemap panel');\n    closeBtn.innerHTML = '&times;';\n    closeBtn.addEventListener('click', () => this.collapse());\n\n    header.appendChild(title);\n    header.appendChild(settingsBtn);\n    header.appendChild(closeBtn);\n\n    this._content = document.createElement('div');\n    this._content.className = 'basemap-control-content';\n\n    panel.appendChild(header);\n    panel.appendChild(this._content);\n\n    if (this._options.resizable) {\n      panel.appendChild(this._createResizeHandle('bottom-left'));\n      panel.appendChild(this._createResizeHandle('bottom-right'));\n    }\n\n    return panel;\n  }\n\n  private _createResizeHandle(corner: 'bottom-left' | 'bottom-right'): HTMLElement {\n    const handle = document.createElement('div');\n    handle.className = `basemap-control-resize-handle basemap-control-resize-${corner}`;\n    handle.setAttribute('aria-hidden', 'true');\n    handle.addEventListener('pointerdown', (event) => this._startResize(event));\n    return handle;\n  }\n\n  private _renderContent(preserveResultsScroll = false): void {\n    if (!this._content) return;\n\n    this._reconcileSettingsButton();\n\n    // The settings view replaces the whole content area; never show it when the\n    // catalog has no keyed providers (the button is hidden in that case too).\n    if (this._activeView === 'settings' && this._hasProviderSettings()) {\n      this._content.replaceChildren(this._createSettingsView());\n      return;\n    }\n\n    const categories = getBasemapCategories(this._basemaps);\n    const results = this._getFilteredBasemaps();\n    const previousResultsScrollTop = preserveResultsScroll\n      ? this._content.querySelector('.basemap-control-results')?.scrollTop\n      : undefined;\n\n    this._content.replaceChildren(\n      this._createSearchRow(),\n      ...(this._options.showMultipleToggle ? [this._createMultipleToggleRow()] : []),\n      this._createFilterRow(this._providers, categories),\n      this._createStatus(results.length),\n      this._createResults(results),\n    );\n\n    if (previousResultsScrollTop !== undefined) {\n      const resultsElement = this._content.querySelector('.basemap-control-results');\n      if (resultsElement) resultsElement.scrollTop = previousResultsScrollTop;\n    }\n  }\n\n  // Show the key button only when the catalog actually needs a provider\n  // credential, and reflect whether the settings view is currently open.\n  private _reconcileSettingsButton(): void {\n    if (!this._settingsButton) return;\n    const hasSettings = this._hasProviderSettings();\n    this._settingsButton.hidden = !hasSettings;\n    this._settingsButton.classList.toggle(\n      'is-active',\n      hasSettings && this._activeView === 'settings',\n    );\n  }\n\n  private _toggleSettingsView(): void {\n    if (!this._hasProviderSettings()) return;\n    this._activeView = this._activeView === 'settings' ? 'basemaps' : 'settings';\n    this._renderContent();\n    this._emit({ type: 'statechange', state: this.getState() });\n  }\n\n  private _renderFilteredResults(): void {\n    if (!this._content) return;\n\n    const results = this._getFilteredBasemaps();\n    this._content.querySelector('.basemap-control-status')?.replaceWith(\n      this._createStatus(results.length),\n    );\n    this._content.querySelector('.basemap-control-results')?.replaceWith(\n      this._createResults(results),\n    );\n  }\n\n  private _getFilteredBasemaps(): BasemapDefinition[] {\n    return filterBasemaps(this._basemaps, {\n      query: this._state.query,\n      provider: this._state.providerFilter,\n      category: this._state.categoryFilter,\n    });\n  }\n\n  private _createSearchRow(): HTMLElement {\n    const row = document.createElement('div');\n    row.className = 'basemap-control-search-row';\n    row.appendChild(this._createSearchInput());\n    row.appendChild(this._createBeforeIdInput());\n    return row;\n  }\n\n  private _createMultipleToggleRow(): HTMLElement {\n    const label = document.createElement('label');\n    label.className = 'basemap-control-multiple-toggle';\n\n    const checkbox = document.createElement('input');\n    checkbox.type = 'checkbox';\n    checkbox.className = 'basemap-control-multiple-checkbox';\n    checkbox.checked = this._state.allowMultiple;\n    checkbox.setAttribute('aria-label', 'Add basemaps instead of replacing');\n    checkbox.addEventListener('change', () => {\n      this._state = { ...this._state, allowMultiple: checkbox.checked };\n      this._emit({ type: 'statechange', state: this.getState() });\n    });\n\n    const text = document.createElement('span');\n    text.className = 'basemap-control-multiple-toggle-text';\n    text.textContent = 'Add basemaps (stack instead of replace)';\n\n    label.appendChild(checkbox);\n    label.appendChild(text);\n    return label;\n  }\n\n  private _createSearchInput(): HTMLElement {\n    const wrapper = document.createElement('div');\n    wrapper.className = 'basemap-control-search';\n\n    const input = document.createElement('input');\n    input.className = 'basemap-control-input';\n    input.type = 'search';\n    input.placeholder = 'Search basemaps';\n    input.value = this._state.query;\n    input.setAttribute('aria-label', 'Search basemaps');\n    input.addEventListener('input', () => {\n      // Browsing for an alternative basemap dismisses a stale credential error\n      // so it stops obscuring the list (#837). Re-render fully (not just the\n      // results) so the error banner is removed.\n      const hadError = this._state.error !== undefined;\n      this._state = { ...this._state, query: input.value };\n      this._clearError();\n      if (hadError) {\n        this._renderContent();\n        input.focus();\n        const end = input.value.length;\n        input.setSelectionRange?.(end, end);\n      } else {\n        this._renderFilteredResults();\n      }\n      this._emit({ type: 'statechange', state: this.getState() });\n    });\n\n    wrapper.appendChild(input);\n    return wrapper;\n  }\n\n  private _createBeforeIdInput(): HTMLElement {\n    const wrapper = document.createElement('div');\n    wrapper.className = 'basemap-control-before-id';\n\n    const input = document.createElement('input');\n    input.className = 'basemap-control-input';\n    input.type = 'text';\n    input.placeholder = 'before_id: none';\n    input.value = this._state.beforeId;\n    input.setAttribute('aria-label', 'before_id');\n    input.addEventListener('input', () => {\n      this._state = { ...this._state, beforeId: input.value };\n      this._emit({ type: 'statechange', state: this.getState() });\n    });\n\n    wrapper.appendChild(input);\n    return wrapper;\n  }\n\n  // The ordered set of provider credential fields, gated by whether the catalog\n  // actually contains basemaps for each provider. A single source of truth for\n  // both the centralized settings view and the inline field shown beside a\n  // missing-credential error, so the two never drift (#837).\n  private _providerFieldDefs(): Array<{\n    provider: keyof typeof PROVIDER_CREDENTIAL_HELP;\n    label: string;\n    has: boolean;\n    fields: ProviderInputConfig[];\n  }> {\n    return [\n      {\n        provider: 'maptiler',\n        label: 'MapTiler',\n        has: this._hasMapTilerBasemaps(),\n        fields: [\n          {\n            className: 'basemap-control-maptiler-key',\n            type: 'password',\n            placeholder: 'MapTiler API key',\n            ariaLabel: 'MapTiler API key',\n            value: this._mapTilerApiKey,\n            onInput: (value) => {\n              this._mapTilerApiKey = value;\n            },\n          },\n        ],\n      },\n      {\n        provider: 'mapbox',\n        label: 'Mapbox',\n        has: this._hasMapboxBasemaps(),\n        fields: [\n          {\n            className: 'basemap-control-mapbox-token',\n            type: 'password',\n            placeholder: 'Mapbox access token',\n            ariaLabel: 'Mapbox access token',\n            value: this._mapboxAccessToken,\n            onInput: (value) => {\n              this._mapboxAccessToken = value;\n            },\n          },\n        ],\n      },\n      {\n        provider: 'protomaps',\n        label: 'Protomaps',\n        has: this._hasProtomapsBasemaps(),\n        fields: [\n          {\n            className: 'basemap-control-protomaps-key',\n            type: 'password',\n            placeholder: 'Protomaps API key',\n            ariaLabel: 'Protomaps API key',\n            value: this._protomapsApiKey,\n            onInput: (value) => {\n              this._protomapsApiKey = value;\n            },\n          },\n        ],\n      },\n      {\n        provider: 'stadia',\n        label: 'Stadia Maps',\n        has: this._hasStadiaBasemaps(),\n        fields: [\n          {\n            className: 'basemap-control-stadia-key',\n            type: 'password',\n            placeholder: 'Stadia Maps API key',\n            ariaLabel: 'Stadia Maps API key',\n            value: this._stadiaApiKey,\n            onInput: (value) => {\n              this._stadiaApiKey = value;\n            },\n          },\n        ],\n      },\n      {\n        provider: 'tianditu',\n        label: 'Tianditu',\n        has: this._hasTiandituBasemaps(),\n        fields: [\n          {\n            className: 'basemap-control-tianditu-key',\n            type: 'password',\n            placeholder: 'Tianditu API key',\n            ariaLabel: 'Tianditu API key',\n            value: this._tiandituApiKey,\n            onInput: (value) => {\n              this._tiandituApiKey = value;\n            },\n          },\n        ],\n      },\n      {\n        provider: 'tomtom',\n        label: 'TomTom',\n        has: this._hasTomTomBasemaps(),\n        fields: [\n          {\n            className: 'basemap-control-tomtom-key',\n            type: 'password',\n            placeholder: 'TomTom API key',\n            ariaLabel: 'TomTom API key',\n            value: this._tomtomApiKey,\n            onInput: (value) => {\n              this._tomtomApiKey = value;\n            },\n          },\n        ],\n      },\n      {\n        provider: 'here',\n        label: 'HERE',\n        has: this._hasHereBasemaps(),\n        fields: [\n          {\n            className: 'basemap-control-here-key',\n            type: 'password',\n            placeholder: 'HERE API key',\n            ariaLabel: 'HERE API key',\n            value: this._hereApiKey,\n            onInput: (value) => {\n              this._hereApiKey = value;\n            },\n          },\n        ],\n      },\n      {\n        provider: 'google',\n        label: 'Google',\n        has: this._hasGoogleApiKeyBasemaps(),\n        fields: [\n          {\n            className: 'basemap-control-google-key',\n            type: 'password',\n            placeholder: 'Google Maps API key',\n            ariaLabel: 'Google Maps API key',\n            value: this._googleMapsApiKey,\n            onInput: (value) => {\n              this._googleMapsApiKey = value;\n              // Changing the key invalidates cached session tokens.\n              this._googleSessions.clear();\n            },\n          },\n        ],\n      },\n      {\n        provider: 'amazon',\n        label: 'Amazon',\n        has: this._hasAmazonBasemaps(),\n        fields: [\n          {\n            className: 'basemap-control-amazon-key',\n            type: 'password',\n            placeholder: 'Amazon API key',\n            ariaLabel: 'Amazon API key',\n            value: this._amazonApiKey,\n            onInput: (value) => {\n              this._amazonApiKey = value;\n            },\n          },\n          {\n            className: 'basemap-control-aws-region',\n            type: 'text',\n            placeholder: 'AWS region',\n            ariaLabel: 'AWS region',\n            value: this._awsRegion,\n            onInput: (value) => {\n              this._awsRegion = value;\n            },\n          },\n        ],\n      },\n    ];\n  }\n\n  // The dedicated API-keys view, opened from the header key button. It collects\n  // every provider credential in one place, separate from the basemap list, so\n  // the list itself stays free of input clutter (#837, Bug 5).\n  private _createSettingsView(): HTMLElement {\n    const view = document.createElement('div');\n    view.className = 'basemap-control-settings-view';\n\n    const head = document.createElement('div');\n    head.className = 'basemap-control-settings-head';\n\n    const back = document.createElement('button');\n    back.type = 'button';\n    back.className = 'basemap-control-settings-back';\n    back.setAttribute('aria-label', 'Back to basemaps');\n    back.innerHTML = `\n      <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n        <path d=\"m15 18-6-6 6-6\"/>\n      </svg>\n      <span>Basemaps</span>\n    `;\n    back.addEventListener('click', () => this._toggleSettingsView());\n\n    const heading = document.createElement('span');\n    heading.className = 'basemap-control-settings-heading';\n    heading.textContent = 'API keys';\n\n    head.appendChild(back);\n    head.appendChild(heading);\n    view.appendChild(head);\n\n    const intro = document.createElement('p');\n    intro.className = 'basemap-control-settings-intro';\n    intro.textContent = 'Add the credentials each provider requires to use its basemaps.';\n    view.appendChild(intro);\n\n    const fields = document.createElement('div');\n    fields.className = 'basemap-control-provider-settings-fields';\n    for (const def of this._providerFieldDefs()) {\n      if (def.has) fields.appendChild(this._createProviderFieldGroup(def));\n    }\n    view.appendChild(fields);\n\n    return view;\n  }\n\n  private _createProviderFieldGroup(def: {\n    provider: keyof typeof PROVIDER_CREDENTIAL_HELP;\n    label: string;\n    fields: ProviderInputConfig[];\n  }): HTMLElement {\n    const group = document.createElement('div');\n    group.className = `basemap-control-provider-group basemap-control-provider-group-${def.provider}`;\n\n    const label = document.createElement('span');\n    label.className = 'basemap-control-provider-group-label';\n    label.textContent = def.label;\n    group.appendChild(label);\n\n    for (const field of def.fields) {\n      group.appendChild(this._createProviderSettingsInput(field));\n    }\n    return group;\n  }\n\n  // Renders the credential field(s) for the provider of the active\n  // missing-credential error, inline beside the error message. Only that one\n  // provider is shown, so the user is not asked to wade through every other\n  // provider's inputs (#837, Bug 3). Returns null when no such error is active.\n  private _createInlineCredentialFields(): HTMLElement | null {\n    if (!this._state.error || !this._missingCredentialProvider) return null;\n    const def = this._providerFieldDefs().find(\n      (candidate) => candidate.provider === this._missingCredentialProvider && candidate.has,\n    );\n    if (!def) return null;\n\n    const wrapper = document.createElement('div');\n    wrapper.className = 'basemap-control-status-fields';\n    for (const field of def.fields) {\n      wrapper.appendChild(\n        this._createProviderSettingsInput({\n          ...field,\n          // Keep the error (and this field) on screen while the user types, and\n          // let Enter re-attempt the basemap that failed, so the field is not\n          // yanked out from under the cursor on the first keystroke.\n          rerenderOnInput: false,\n          clearErrorOnInput: false,\n          onEnter: () => this._retryLastFailedBasemap(),\n        }),\n      );\n    }\n    return wrapper;\n  }\n\n  private _retryLastFailedBasemap(): void {\n    if (this._lastFailedBasemapId) this._selectBasemap(this._lastFailedBasemapId);\n  }\n\n  // Renders the optional API key input shown after a basemap falls back to its\n  // keyless public tiles, so the user can enter a key to upgrade to the\n  // authorized provider tiles (or leave it blank to keep the public ones).\n  // Returns null unless such a basemap is the active selection and still keyless.\n  private _createOptionalKeyPrompt(): HTMLElement | null {\n    const id = this._optionalKeyBasemapId;\n    if (!id) return null;\n    const basemap = this._basemaps.find((candidate) => candidate.id === id);\n    if (\n      !basemap ||\n      !this._state.activeBasemapIds.includes(id) ||\n      !this._basemapUsesKeylessFallback(basemap)\n    ) {\n      return null;\n    }\n\n    const def = this._providerFieldDefs().find(\n      (candidate) => candidate.provider === basemap.provider && candidate.has,\n    );\n    if (!def) return null;\n\n    const wrapper = document.createElement('div');\n    wrapper.className = 'basemap-control-optional-key';\n\n    const message = document.createElement('span');\n    message.className = 'basemap-control-optional-key-message';\n    message.textContent = `Enter a ${def.fields[0].placeholder} to load the official ${def.label} tiles.`;\n\n    const help = PROVIDER_CREDENTIAL_HELP[def.provider];\n    if (help) {\n      message.appendChild(document.createTextNode(' '));\n      const link = document.createElement('a');\n      link.className = 'basemap-control-status-link';\n      link.href = help.url;\n      link.target = '_blank';\n      link.rel = 'noopener noreferrer';\n      link.textContent = help.label;\n      message.appendChild(link);\n    }\n    wrapper.appendChild(message);\n\n    const fields = document.createElement('div');\n    fields.className = 'basemap-control-status-fields';\n    for (const field of def.fields) {\n      fields.appendChild(\n        this._createProviderSettingsInput({\n          ...field,\n          // Keep the field on screen while typing; Enter re-applies the basemap\n          // so the freshly entered key takes effect immediately.\n          rerenderOnInput: false,\n          clearErrorOnInput: false,\n          onEnter: () => this._reapplyBasemap(id),\n        }),\n      );\n    }\n    wrapper.appendChild(fields);\n    return wrapper;\n  }\n\n  private _createProviderSettingsInput({\n    className,\n    type,\n    placeholder,\n    ariaLabel,\n    value,\n    onInput,\n    rerenderOnInput = true,\n    clearErrorOnInput = true,\n    onEnter,\n  }: ProviderInputConfig & {\n    rerenderOnInput?: boolean;\n    clearErrorOnInput?: boolean;\n    onEnter?: () => void;\n  }): HTMLElement {\n    const wrapper = document.createElement('div');\n    wrapper.className = className;\n\n    const input = document.createElement('input');\n    input.className = 'basemap-control-input';\n    input.type = type;\n    input.placeholder = placeholder;\n    input.value = value;\n    input.name = ariaLabel.toLowerCase().replace(/\\s+/g, '-');\n    input.autocomplete = 'new-password';\n    input.autocapitalize = 'none';\n    input.spellcheck = false;\n    input.setAttribute('autocorrect', 'off');\n    input.setAttribute('aria-label', ariaLabel);\n    input.addEventListener('input', () => {\n      onInput(input.value);\n      if (clearErrorOnInput) this._clearError();\n      if (rerenderOnInput) this._renderFilteredResults();\n      this._emit({ type: 'statechange', state: this.getState() });\n    });\n    if (onEnter) {\n      input.addEventListener('keydown', (event) => {\n        if (event.key === 'Enter') {\n          event.preventDefault();\n          onEnter();\n        }\n      });\n    }\n\n    wrapper.appendChild(input);\n    return wrapper;\n  }\n\n  private _createFilterRow(providers: BasemapProvider[], categories: string[]): HTMLElement {\n    const row = document.createElement('div');\n    row.className = 'basemap-control-filters';\n    row.appendChild(\n      this._createSelect(\n        'Provider',\n        this._state.providerFilter,\n        providers.map((provider) => ({ value: provider.id, label: provider.name })),\n        (value) => {\n          this._state = { ...this._state, providerFilter: value };\n          // Filtering to browse other basemaps clears a stale error (#837).\n          this._clearError();\n          this._renderContent();\n          this._emit({ type: 'statechange', state: this.getState() });\n        },\n      ),\n    );\n    row.appendChild(\n      this._createSelect(\n        'Category',\n        this._state.categoryFilter,\n        categories.map((category) => ({ value: category, label: category })),\n        (value) => {\n          this._state = { ...this._state, categoryFilter: value };\n          this._clearError();\n          this._renderContent();\n          this._emit({ type: 'statechange', state: this.getState() });\n        },\n      ),\n    );\n    return row;\n  }\n\n  private _createSelect(\n    label: string,\n    value: string,\n    options: Array<{ value: string; label: string }>,\n    onChange: (value: string) => void,\n  ): HTMLElement {\n    const select = document.createElement('select');\n    select.className = 'basemap-control-select';\n    select.setAttribute('aria-label', label);\n\n    const all = document.createElement('option');\n    all.value = '';\n    all.textContent = `All ${label.toLowerCase()}s`;\n    select.appendChild(all);\n\n    options.forEach((option) => {\n      const element = document.createElement('option');\n      element.value = option.value;\n      element.textContent = option.label;\n      select.appendChild(element);\n    });\n\n    select.value = value;\n    select.addEventListener('change', () => onChange(select.value));\n    return select;\n  }\n\n  private _createStatus(resultCount: number): HTMLElement {\n    const status = document.createElement('div');\n    status.className = 'basemap-control-status';\n    if (this._state.loading) {\n      status.textContent = 'Applying basemap...';\n    } else if (this._state.error) {\n      status.classList.add('is-error');\n      const message = document.createElement('span');\n      message.className = 'basemap-control-status-message';\n      message.textContent = this._state.error;\n      status.appendChild(message);\n\n      // A missing-credential error is otherwise a dead end: append a link to\n      // where the credential is issued and point at the Provider settings\n      // inputs (which the error also auto-expands).\n      const help = this._credentialHelpForError(this._missingCredentialProvider);\n      if (help) {\n        const actions = document.createElement('span');\n        actions.className = 'basemap-control-status-actions';\n\n        const link = document.createElement('a');\n        link.className = 'basemap-control-status-link';\n        link.href = help.url;\n        link.target = '_blank';\n        link.rel = 'noopener noreferrer';\n        link.textContent = help.label;\n        actions.appendChild(link);\n\n        const hint = document.createElement('span');\n        hint.className = 'basemap-control-status-hint';\n        hint.textContent = ', then enter it below and press Enter.';\n        actions.appendChild(hint);\n\n        status.appendChild(actions);\n      }\n\n      // Show only the failing provider's credential field, right beside the\n      // error, so the fix is one input away instead of buried among every\n      // provider's settings (#837).\n      const inlineFields = this._createInlineCredentialFields();\n      if (inlineFields) status.appendChild(inlineFields);\n    } else {\n      const count = document.createElement('span');\n      count.className = 'basemap-control-status-message';\n      count.textContent = `${resultCount} basemap${resultCount === 1 ? '' : 's'}`;\n      status.appendChild(count);\n\n      // After a basemap falls back to keyless public tiles, offer an optional\n      // key input right here so upgrading to the authorized tiles is one field\n      // away, without hunting for the provider settings view.\n      const optionalKey = this._createOptionalKeyPrompt();\n      if (optionalKey) {\n        status.classList.add('has-optional-key');\n        status.appendChild(optionalKey);\n      }\n    }\n    return status;\n  }\n\n  // Resolves the help link for a missing-credential provider, so the status can\n  // offer a concrete next step. Returns undefined when there is no such error.\n  private _credentialHelpForError(\n    provider?: keyof typeof PROVIDER_CREDENTIAL_HELP,\n  ): { url: string; label: string } | undefined {\n    return provider ? PROVIDER_CREDENTIAL_HELP[provider] : undefined;\n  }\n\n  private _createResults(results: BasemapDefinition[]): HTMLElement {\n    const list = document.createElement('div');\n    list.className = 'basemap-control-results';\n\n    if (results.length === 0) {\n      const empty = document.createElement('div');\n      empty.className = 'basemap-control-empty';\n      empty.textContent = 'No basemaps match your search.';\n      list.appendChild(empty);\n      return list;\n    }\n\n    results.forEach((basemap) => {\n      const row = document.createElement('button');\n      row.type = 'button';\n      row.className = 'basemap-control-result';\n      row.dataset.basemapId = basemap.id;\n      if (this._state.activeBasemapIds.includes(basemap.id)) {\n        row.classList.add('is-active');\n        row.setAttribute('aria-current', 'true');\n      }\n      row.disabled = this._state.loading;\n      row.addEventListener('click', () => {\n        this._selectBasemap(basemap.id);\n      });\n\n      const main = document.createElement('span');\n      main.className = 'basemap-control-result-main';\n\n      const name = document.createElement('span');\n      name.className = 'basemap-control-result-name';\n      name.textContent = basemap.name;\n\n      const meta = document.createElement('span');\n      meta.className = 'basemap-control-result-meta';\n      meta.textContent = this._formatBasemapMeta(basemap);\n\n      main.appendChild(name);\n      main.appendChild(meta);\n\n      const type = document.createElement('span');\n      type.className = 'basemap-control-result-type';\n      type.textContent =\n        basemap.type === 'raster'\n          ? 'Raster'\n          : basemap.type === 'vector-overlay'\n            ? 'Overlay'\n            : 'Style';\n\n      row.appendChild(main);\n      row.appendChild(type);\n\n      if (basemap.attribution) {\n        const attribution = document.createElement('span');\n        attribution.className = 'basemap-control-result-attribution';\n        attribution.textContent = this._stripHtml(basemap.attribution);\n        row.appendChild(attribution);\n      }\n\n      list.appendChild(row);\n    });\n\n    return list;\n  }\n\n  private _formatBasemapMeta(basemap: BasemapDefinition): string {\n    const provider = this._providers.find((candidate) => candidate.id === basemap.provider);\n    return [provider?.name ?? basemap.provider, basemap.category].filter(Boolean).join(' / ');\n  }\n\n  private _stripHtml(value: string): string {\n    const template = document.createElement('template');\n    template.innerHTML = value;\n    return template.content.textContent ?? value;\n  }\n\n  private _hasMapTilerBasemaps(): boolean {\n    return this._basemaps.some((basemap) => basemap.provider === 'maptiler');\n  }\n\n  private _hasAmazonBasemaps(): boolean {\n    return this._basemaps.some((basemap) => basemap.provider === 'amazon');\n  }\n\n  private _hasMapboxBasemaps(): boolean {\n    return this._basemaps.some((basemap) => basemap.provider === 'mapbox');\n  }\n\n  private _hasProtomapsBasemaps(): boolean {\n    return this._basemaps.some((basemap) => basemap.provider === 'protomaps');\n  }\n\n  private _hasStadiaBasemaps(): boolean {\n    return this._basemaps.some((basemap) => basemap.provider === 'stadia');\n  }\n\n  private _hasTiandituBasemaps(): boolean {\n    return this._basemaps.some((basemap) => basemap.provider === 'tianditu');\n  }\n\n  private _hasTomTomBasemaps(): boolean {\n    return this._basemaps.some((basemap) => basemap.provider === 'tomtom');\n  }\n\n  private _hasHereBasemaps(): boolean {\n    return this._basemaps.some((basemap) => basemap.provider === 'here');\n  }\n\n  // True when a Google basemap can use a Map Tiles API key. Session-based Google\n  // layers (Google Traffic, plus the base Maps/Satellite/Terrain/Hybrid layers\n  // that upgrade to the authorized Map Tiles API when a key is present) and any\n  // api-key based Google tiles reveal the key input.\n  private _hasGoogleApiKeyBasemaps(): boolean {\n    return this._basemaps.some(\n      (basemap) =>\n        basemap.provider === 'google' &&\n        basemap.source.type === 'raster' &&\n        (Boolean(basemap.source.googleSession) ||\n          basemap.source.tiles.some((tile) => tile.includes(API_KEY_PLACEHOLDER))),\n    );\n  }\n\n  private _hasProviderSettings(): boolean {\n    return (\n      this._hasMapTilerBasemaps() ||\n      this._hasAmazonBasemaps() ||\n      this._hasMapboxBasemaps() ||\n      this._hasProtomapsBasemaps() ||\n      this._hasStadiaBasemaps() ||\n      this._hasTiandituBasemaps() ||\n      this._hasTomTomBasemaps() ||\n      this._hasHereBasemaps() ||\n      this._hasGoogleApiKeyBasemaps()\n    );\n  }\n\n  private _resolveStyleUrl(basemap: BasemapDefinition): string {\n    if (basemap.source.type !== 'style' && basemap.source.type !== 'vector-style') {\n      throw new Error(`Basemap \"${basemap.id}\" is not a style basemap.`);\n    }\n\n    const url = basemap.source.url;\n    if (basemap.provider === 'amazon') {\n      return this._resolveAmazonStyleUrl(url);\n    }\n\n    if (basemap.provider === 'maptiler') {\n      return this._resolveMapTilerStyleUrl(url);\n    }\n\n    if (basemap.provider === 'mapbox') {\n      return this._resolveMapboxStyleUrl(url);\n    }\n\n    if (basemap.provider === 'protomaps') {\n      return this._resolveProtomapsStyleUrl(url);\n    }\n\n    return url;\n  }\n\n  private _resolveProtomapsStyleUrl(url: string): string {\n    if (!url.includes(API_KEY_PLACEHOLDER)) return url;\n\n    const apiKey = this._protomapsApiKey.trim();\n    if (!apiKey) {\n      throw new MissingCredentialError(\n        'Enter a Protomaps API key before applying this basemap.',\n        'protomaps',\n      );\n    }\n\n    return url.split(API_KEY_PLACEHOLDER).join(encodeURIComponent(apiKey));\n  }\n\n  private _getStyleOptions(basemap: BasemapDefinition): SetStyleOptions | undefined {\n    if (basemap.provider === 'mapbox') {\n      return {\n        validate: false,\n        transformStyle: (_previousStyle, nextStyle) =>\n          this._transformMapboxStyle(nextStyle, this._mapboxAccessToken.trim()),\n      };\n    }\n    return undefined;\n  }\n\n  private _transformMapboxStyle(style: StyleSpecification, accessToken: string): StyleSpecification {\n    const encodedAccessToken = encodeURIComponent(accessToken);\n    const sources = Object.fromEntries(\n      Object.entries(style.sources).map(([id, source]) => {\n        if ('url' in source && typeof source.url === 'string') {\n          return [id, { ...source, url: this._resolveMapboxInternalUrl(source.url, encodedAccessToken) }];\n        }\n        return [id, source];\n      }),\n    );\n\n    return {\n      ...style,\n      glyphs:\n        typeof style.glyphs === 'string'\n          ? this._resolveMapboxInternalUrl(style.glyphs, encodedAccessToken)\n          : style.glyphs,\n      sprite: this._resolveMapboxSprite(style.sprite, encodedAccessToken),\n      projection: { type: 'mercator' },\n      sources,\n    };\n  }\n\n  private _resolveMapboxSprite(\n    sprite: StyleSpecification['sprite'],\n    encodedAccessToken: string,\n  ): StyleSpecification['sprite'] {\n    if (typeof sprite === 'string') {\n      return this._resolveMapboxInternalUrl(sprite, encodedAccessToken);\n    }\n\n    if (Array.isArray(sprite)) {\n      return sprite.map((item) => ({\n        ...item,\n        url: this._resolveMapboxInternalUrl(item.url, encodedAccessToken),\n      }));\n    }\n\n    return sprite;\n  }\n\n  private _resolveMapboxInternalUrl(url: string, encodedAccessToken: string): string {\n    if (url.startsWith('mapbox://sprites/')) {\n      const [, owner, styleId] = /^mapbox:\\/\\/sprites\\/([^/]+)\\/(.+)$/.exec(url) ?? [];\n      if (owner && styleId) {\n        return `https://api.mapbox.com/styles/v1/${owner}/${styleId}/sprite?access_token=${encodedAccessToken}`;\n      }\n    }\n\n    if (url.startsWith('mapbox://fonts/')) {\n      const [, owner, fontPath] = /^mapbox:\\/\\/fonts\\/([^/]+)\\/(.+)$/.exec(url) ?? [];\n      if (owner && fontPath) {\n        return `https://api.mapbox.com/fonts/v1/${owner}/${fontPath}?access_token=${encodedAccessToken}`;\n      }\n    }\n\n    if (url.startsWith('mapbox://')) {\n      const tileset = url.replace(/^mapbox:\\/\\//, '');\n      return `https://api.mapbox.com/v4/${tileset}.json?secure&access_token=${encodedAccessToken}`;\n    }\n\n    return url;\n  }\n\n  private _resolveMapTilerStyleUrl(url: string): string {\n    const needsMapTilerKey =\n      url.includes(API_KEY_PLACEHOLDER) ||\n      url.includes(MAPTILER_API_KEY_EXAMPLE) ||\n      url.endsWith(MAPTILER_API_KEY_QUERY) ||\n      url.endsWith(MAPTILER_API_KEY_EMPTY_QUERY);\n\n    if (!needsMapTilerKey) return url;\n\n    const apiKey = this._mapTilerApiKey.trim();\n    if (!apiKey) {\n      throw new MissingCredentialError(\n        'Enter a MapTiler API key before applying this basemap.',\n        'maptiler',\n      );\n    }\n\n    const encodedApiKey = encodeURIComponent(apiKey);\n    if (url.endsWith(MAPTILER_API_KEY_QUERY)) {\n      return `${url}=${encodedApiKey}`;\n    }\n    if (url.endsWith(MAPTILER_API_KEY_EMPTY_QUERY)) {\n      return `${url}${encodedApiKey}`;\n    }\n\n    return url\n      .split(API_KEY_PLACEHOLDER)\n      .join(encodedApiKey)\n      .split(MAPTILER_API_KEY_EXAMPLE)\n      .join(encodedApiKey);\n  }\n\n  private _resolveAmazonStyleUrl(url: string): string {\n    const apiKey = this._amazonApiKey.trim();\n    const awsRegion = this._awsRegion.trim();\n\n    if (url.includes(API_KEY_PLACEHOLDER) && !apiKey) {\n      throw new MissingCredentialError(\n        'Enter an Amazon API key before applying this basemap.',\n        'amazon',\n      );\n    }\n    if (url.includes(AWS_REGION_PLACEHOLDER) && !awsRegion) {\n      throw new MissingCredentialError(\n        'Enter an AWS region before applying this basemap.',\n        'amazon',\n      );\n    }\n\n    return url\n      .split(AWS_REGION_PLACEHOLDER)\n      .join(awsRegion)\n      .split(API_KEY_PLACEHOLDER)\n      .join(encodeURIComponent(apiKey));\n  }\n\n  private _resolveMapboxStyleUrl(url: string): string {\n    const accessToken = this._mapboxAccessToken.trim();\n\n    if (url.includes(API_KEY_PLACEHOLDER) && !accessToken) {\n      throw new MissingCredentialError(\n        'Enter a Mapbox access token before applying this basemap.',\n        'mapbox',\n      );\n    }\n    if (this._isUrlLikeCredential(accessToken)) {\n      throw new MissingCredentialError(\n        'Enter a valid Mapbox access token, not a URL.',\n        'mapbox',\n      );\n    }\n\n    return url.split(API_KEY_PLACEHOLDER).join(encodeURIComponent(accessToken));\n  }\n\n  private _isUrlLikeCredential(value: string): boolean {\n    return /^https?:\\/\\//i.test(value);\n  }\n\n  // Add a stackable overlay (raster tiles or a vector overlay) to the map,\n  // resolving any provider credentials first.\n  private async _addOverlay(\n    basemap: BasemapDefinition,\n  ): Promise<ManagedRasterBasemap | undefined> {\n    if (basemap.source.type === 'vector-overlay') {\n      return this._addVectorOverlay(basemap, basemap.source);\n    }\n    return this._addRasterBasemap(basemap);\n  }\n\n  private async _addRasterBasemap(\n    basemap: BasemapDefinition,\n  ): Promise<ManagedRasterBasemap | undefined> {\n    if (!this._map || basemap.source.type !== 'raster') return undefined;\n\n    const tiles = await this._resolveRasterTiles(basemap);\n\n    const sourceId = `${CONTROL_SOURCE_PREFIX}-${basemap.id}`;\n    const layerId = [CONTROL_LAYER_PREFIX, basemap.id].filter(Boolean).join('-');\n    const beforeId = this._getBasemapInsertBeforeId();\n    const source: SourceSpecification = {\n      type: 'raster',\n      tiles,\n      tileSize: basemap.source.tileSize ?? 256,\n      minzoom: basemap.source.minzoom,\n      maxzoom: basemap.source.maxzoom,\n      scheme: basemap.source.scheme,\n      attribution: basemap.attribution,\n    };\n    const layer: LayerSpecification = {\n      id: layerId,\n      type: 'raster',\n      source: sourceId,\n    };\n\n    this._map.addSource(sourceId, source);\n    this._map.addLayer(layer, beforeId);\n    const managed: ManagedRasterBasemap = { sourceId, layerId, beforeId };\n    this._managedRasters.set(basemap.id, managed);\n\n    return managed;\n  }\n\n  private _addVectorOverlay(\n    basemap: BasemapDefinition,\n    overlay: VectorOverlayBasemapSource,\n  ): ManagedRasterBasemap | undefined {\n    if (!this._map) return undefined;\n\n    const sourceId = `${CONTROL_SOURCE_PREFIX}-${basemap.id}`;\n    const layerId = [CONTROL_LAYER_PREFIX, basemap.id].filter(Boolean).join('-');\n    const beforeId = this._getBasemapInsertBeforeId();\n\n    const source = {\n      type: 'vector',\n      ...this._resolveVectorOverlaySource(basemap, overlay),\n      minzoom: overlay.minzoom,\n      maxzoom: overlay.maxzoom,\n      attribution: basemap.attribution,\n    } as SourceSpecification;\n\n    const layer = {\n      id: layerId,\n      type: overlay.layerType ?? 'line',\n      source: sourceId,\n      'source-layer': overlay.sourceLayer,\n      ...(overlay.layout ? { layout: overlay.layout } : {}),\n      ...(overlay.paint ? { paint: overlay.paint } : {}),\n    } as LayerSpecification;\n\n    this._map.addSource(sourceId, source);\n    this._map.addLayer(layer, beforeId);\n    const managed: ManagedRasterBasemap = { sourceId, layerId, beforeId };\n    this._managedRasters.set(basemap.id, managed);\n\n    return managed;\n  }\n\n  // Resolves the `{url}` or `{tiles}` of a vector overlay, substituting provider\n  // credentials. Mapbox vector overlays are pointed at the v4 TileJSON endpoint\n  // with the access token, reusing the same resolver as Mapbox style sources.\n  private _resolveVectorOverlaySource(\n    basemap: BasemapDefinition,\n    overlay: VectorOverlayBasemapSource,\n  ): { url: string } | { tiles: string[] } {\n    if (basemap.provider === 'mapbox') {\n      const accessToken = this._mapboxAccessToken.trim();\n      if (!accessToken) {\n        throw new MissingCredentialError(\n          'Enter a Mapbox access token before applying this overlay.',\n          'mapbox',\n        );\n      }\n      if (this._isUrlLikeCredential(accessToken)) {\n        throw new MissingCredentialError(\n          'Enter a valid Mapbox access token, not a URL.',\n          'mapbox',\n        );\n      }\n      const encoded = encodeURIComponent(accessToken);\n      if (overlay.url) {\n        return { url: this._resolveMapboxInternalUrl(overlay.url, encoded) };\n      }\n    }\n\n    if (overlay.url) return { url: overlay.url };\n    if (overlay.tiles) return { tiles: overlay.tiles };\n    throw new Error(`Vector overlay \"${basemap.id}\" has no url or tiles.`);\n  }\n\n  // Resolves the tile templates of a raster basemap, substituting provider\n  // credentials (and, for Google, a Map Tiles API session token). Throws a\n  // MissingCredentialError when a required key is absent so the panel can\n  // surface a \"Get a ...\" link and reveal the credential inputs.\n  private async _resolveRasterTiles(basemap: BasemapDefinition): Promise<string[]> {\n    if (basemap.source.type !== 'raster') return [];\n    const { tiles, googleSession, sessionTiles } = basemap.source;\n\n    if (googleSession) {\n      // `tiles` holds the public keyless templates for the base Maps/Satellite/\n      // Terrain/Hybrid layers, so with no Google Maps API key they are used\n      // as-is and nothing touches the Map Tiles API. With a key they upgrade to\n      // `sessionTiles`. Sources that cannot work keylessly (e.g. Google Traffic)\n      // have no `sessionTiles` and keep the session template in `tiles`; those\n      // still go through the session resolver, which surfaces the missing\n      // credential error when no key is set.\n      const templates = sessionTiles?.length ? sessionTiles : tiles;\n      if (this._googleMapsApiKey.trim() || !sessionTiles?.length) {\n        return this._resolveGoogleSessionTiles(templates, googleSession);\n      }\n      return tiles;\n    }\n\n    if (!tiles.some((tile) => tile.includes(API_KEY_PLACEHOLDER))) {\n      return tiles;\n    }\n\n    const apiKey = this._rasterApiKeyFor(basemap.provider);\n    if (!apiKey) {\n      throw this._missingRasterKeyError(basemap.provider);\n    }\n    const encoded = encodeURIComponent(apiKey);\n    return tiles.map((tile) => tile.split(API_KEY_PLACEHOLDER).join(encoded));\n  }\n\n  private _rasterApiKeyFor(provider: string): string {\n    if (provider === 'tomtom') return this._tomtomApiKey.trim();\n    if (provider === 'here') return this._hereApiKey.trim();\n    if (provider === 'stadia') return this._stadiaApiKey.trim();\n    if (provider === 'tianditu') return this._tiandituApiKey.trim();\n    if (provider === 'google') return this._googleMapsApiKey.trim();\n    return '';\n  }\n\n  // True when a basemap is (or would be) served from its public keyless `tiles`\n  // because its provider API key is not set. Drives the optional key prompt:\n  // these basemaps work without a key but can upgrade to the authorized\n  // provider tiles (`sessionTiles`) once one is entered.\n  private _basemapUsesKeylessFallback(basemap: BasemapDefinition): boolean {\n    return (\n      basemap.source.type === 'raster' &&\n      Boolean(basemap.source.googleSession) &&\n      (basemap.source.sessionTiles?.length ?? 0) > 0 &&\n      !this._rasterApiKeyFor(basemap.provider)\n    );\n  }\n\n  // Re-applies an already-active basemap so a newly entered key takes effect.\n  // Unlike `_selectBasemap`, this never toggles the basemap off in multiple\n  // mode: a stacked raster is re-added on top (replacing its prior instance),\n  // and a single-mode basemap is simply re-set.\n  private _reapplyBasemap(id: string): void {\n    const basemap = this._basemaps.find((candidate) => candidate.id === id);\n    const isOverlay =\n      basemap?.source.type === 'raster' || basemap?.source.type === 'vector-overlay';\n    if (this._state.allowMultiple && isOverlay) {\n      this.addBasemap(id).catch(() => {});\n    } else {\n      this.setBasemap(id).catch(() => {});\n    }\n  }\n\n  private _missingRasterKeyError(provider: string): MissingCredentialError {\n    const label = RASTER_KEY_LABELS[provider] ?? 'API key';\n    const helpProvider = (\n      provider in PROVIDER_CREDENTIAL_HELP ? provider : 'maptiler'\n    ) as keyof typeof PROVIDER_CREDENTIAL_HELP;\n    return new MissingCredentialError(`Enter a ${label} before applying this layer.`, helpProvider);\n  }\n\n  // Resolves Google tile templates by minting (or reusing) a Map Tiles API\n  // session token, then substituting both `{session}` and `{api-key}`.\n  private async _resolveGoogleSessionTiles(\n    tiles: string[],\n    config: GoogleSessionConfig,\n  ): Promise<string[]> {\n    const apiKey = this._googleMapsApiKey.trim();\n    if (!apiKey) {\n      throw new MissingCredentialError(\n        'Enter a Google Maps API key before applying this layer.',\n        'google',\n      );\n    }\n\n    const token = await this._getGoogleSessionToken(apiKey, config);\n    const encodedKey = encodeURIComponent(apiKey);\n    const encodedSession = encodeURIComponent(token);\n    return tiles.map((tile) =>\n      tile.split('{session}').join(encodedSession).split(API_KEY_PLACEHOLDER).join(encodedKey),\n    );\n  }\n\n  private async _getGoogleSessionToken(\n    apiKey: string,\n    config: GoogleSessionConfig,\n  ): Promise<string> {\n    const cacheKey = `${apiKey}:${JSON.stringify(config)}`;\n    const cached = this._googleSessions.get(cacheKey);\n    // Treat the token as expired a minute early to avoid a tile request racing\n    // the expiry boundary.\n    if (cached && cached.expiry - 60_000 > Date.now()) {\n      return cached.token;\n    }\n\n    const response = await fetch(\n      `https://tile.googleapis.com/v1/createSession?key=${encodeURIComponent(apiKey)}`,\n      {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({\n          mapType: config.mapType,\n          language: config.language ?? 'en-US',\n          region: config.region ?? 'US',\n          layerTypes: config.layerTypes,\n          overlay: config.overlay,\n        }),\n      },\n    );\n\n    if (!response.ok) {\n      const detail = await response.text().catch(() => '');\n      throw new MissingCredentialError(\n        `Google could not create a tile session (HTTP ${response.status}). ${this._summarizeGoogleError(\n          detail,\n        )}`.trim(),\n        'google',\n      );\n    }\n\n    const data = (await response.json()) as { session?: string; expiry?: string };\n    if (!data.session) {\n      throw new MissingCredentialError(\n        'Google did not return a tile session token. Check that the Map Tiles API is enabled for your key.',\n        'google',\n      );\n    }\n\n    // `expiry` is a Unix timestamp in seconds (as a string); fall back to a\n    // conservative 1-hour lifetime if it is missing or unparsable.\n    const expirySeconds = data.expiry ? Number(data.expiry) : NaN;\n    const expiry = Number.isFinite(expirySeconds)\n      ? expirySeconds * 1000\n      : Date.now() + 60 * 60 * 1000;\n    this._googleSessions.set(cacheKey, { token: data.session, expiry });\n    return data.session;\n  }\n\n  private _summarizeGoogleError(detail: string): string {\n    if (!detail) return '';\n    try {\n      const parsed = JSON.parse(detail) as { error?: { message?: string } };\n      return parsed.error?.message ?? '';\n    } catch {\n      return detail.slice(0, 200);\n    }\n  }\n\n  private _waitForStyleReady(): Promise<void> {\n    if (!this._map) return Promise.resolve();\n    if (typeof this._map.isStyleLoaded !== 'function' || this._map.isStyleLoaded()) {\n      return Promise.resolve();\n    }\n\n    return new Promise((resolve) => {\n      let settled = false;\n      let timer: ReturnType<typeof setTimeout> | undefined;\n      const done = () => {\n        if (settled) return;\n        settled = true;\n        if (timer !== undefined) clearTimeout(timer);\n        this._map?.off('load', done);\n        this._map?.off('style.load', done);\n        resolve();\n      };\n      // Fall back after a short wait so a missed `load`/`style.load` event\n      // (e.g. when basemaps are switched faster than styles settle) can never\n      // leave the control stuck in its loading state with a wait cursor.\n      timer = setTimeout(done, 1500);\n      this._map?.once('load', done);\n      this._map?.once('style.load', done);\n    });\n  }\n\n  // Remove every managed raster basemap from the map.\n  private _removeManagedBasemap(): void {\n    if (!this._map) return;\n    for (const id of [...this._managedRasters.keys()]) {\n      this._removeManagedRaster(id);\n    }\n  }\n\n  // Remove a single managed raster basemap by its basemap id, returning the\n  // managed source/layer record that was removed (if any).\n  private _removeManagedRaster(id: string): ManagedRasterBasemap | undefined {\n    const managed = this._managedRasters.get(id);\n    if (!managed) return undefined;\n\n    if (this._map?.getLayer(managed.layerId)) {\n      this._map.removeLayer(managed.layerId);\n    }\n    if (this._map?.getSource(managed.sourceId)) {\n      this._map.removeSource(managed.sourceId);\n    }\n    this._managedRasters.delete(id);\n    return managed;\n  }\n\n  private _applyBasemapView(basemap: BasemapDefinition): void {\n    if (!this._map || !basemap.view) return;\n\n    this._map.jumpTo({\n      center: basemap.view.center,\n      zoom: basemap.view.zoom,\n      bearing: basemap.view.bearing,\n      pitch: basemap.view.pitch,\n    });\n  }\n\n  private _getBasemapInsertBeforeId(): string | undefined {\n    const beforeId = this._state.beforeId.trim();\n    if (!beforeId || beforeId.toLowerCase() === 'none') return undefined;\n    return beforeId;\n  }\n\n  private _setupEventListeners(): void {\n    this._resizeHandler = () => {\n      if (!this._state.collapsed) this._updatePanelPosition();\n    };\n    window.addEventListener('resize', this._resizeHandler);\n\n    this._mapResizeHandler = () => {\n      if (!this._state.collapsed) this._updatePanelPosition();\n    };\n    this._map?.on('resize', this._mapResizeHandler);\n  }\n\n  private _getControlPosition(): BasemapControlPosition {\n    const parent = this._container?.parentElement;\n    if (!parent) return this._options.position;\n\n    if (parent.classList.contains('maplibregl-ctrl-top-left')) return 'top-left';\n    if (parent.classList.contains('maplibregl-ctrl-top-right')) return 'top-right';\n    if (parent.classList.contains('maplibregl-ctrl-bottom-left')) return 'bottom-left';\n    if (parent.classList.contains('maplibregl-ctrl-bottom-right')) return 'bottom-right';\n\n    return this._options.position;\n  }\n\n  private _updatePanelPosition(): void {\n    if (!this._container || !this._panel || !this._mapContainer) return;\n\n    const button = this._container.querySelector('.basemap-control-toggle');\n    if (!button) return;\n\n    const buttonRect = button.getBoundingClientRect();\n    const mapRect = this._mapContainer.getBoundingClientRect();\n    const position = this._getControlPosition();\n    const buttonTop = buttonRect.top - mapRect.top;\n    const buttonBottom = mapRect.bottom - buttonRect.bottom;\n    const buttonLeft = buttonRect.left - mapRect.left;\n    const buttonRight = mapRect.right - buttonRect.right;\n    const panelGap = 5;\n\n    this._panel.style.top = '';\n    this._panel.style.bottom = '';\n    this._panel.style.left = '';\n    this._panel.style.right = '';\n\n    switch (position) {\n      case 'top-left':\n        this._panel.style.top = `${buttonTop + buttonRect.height + panelGap}px`;\n        this._panel.style.left = `${buttonLeft}px`;\n        break;\n      case 'top-right':\n        this._panel.style.top = `${buttonTop + buttonRect.height + panelGap}px`;\n        this._panel.style.right = `${buttonRight}px`;\n        break;\n      case 'bottom-left':\n        this._panel.style.bottom = `${buttonBottom + buttonRect.height + panelGap}px`;\n        this._panel.style.left = `${buttonLeft}px`;\n        break;\n      case 'bottom-right':\n        this._panel.style.bottom = `${buttonBottom + buttonRect.height + panelGap}px`;\n        this._panel.style.right = `${buttonRight}px`;\n        break;\n    }\n  }\n\n  // Begin a panel resize from a bottom corner. The panel stays pinned to its\n  // toggle button, so resizing is measured from the button-anchored corner:\n  // dragging either bottom handle grows or shrinks the panel away from it.\n  private _startResize(event: PointerEvent): void {\n    if (!this._panel) return;\n    event.preventDefault();\n    event.stopPropagation();\n\n    const position = this._getControlPosition();\n    const isLeft = position === 'top-left' || position === 'bottom-left';\n    const isTop = position === 'top-left' || position === 'top-right';\n    const rect = this._panel.getBoundingClientRect();\n    this._resizeAnchor = {\n      x: isLeft ? rect.left : rect.right,\n      y: isTop ? rect.top : rect.bottom,\n      isLeft,\n      isTop,\n    };\n\n    // Listen on the window so the drag keeps tracking even when the pointer\n    // moves off the small handle; pointer capture is a best-effort nicety.\n    const handle = event.currentTarget as HTMLElement;\n    this._resizeHandleEl = handle;\n    handle.setPointerCapture?.(event.pointerId);\n    window.addEventListener('pointermove', this._onResizeMove);\n    window.addEventListener('pointerup', this._onResizeEnd);\n    window.addEventListener('pointercancel', this._onResizeEnd);\n  }\n\n  private _onResizeMove = (event: PointerEvent): void => {\n    if (!this._panel || !this._resizeAnchor) return;\n    const { x, y, isLeft, isTop } = this._resizeAnchor;\n    const bounds = this._getResizeBounds();\n    const rawWidth = isLeft ? event.clientX - x : x - event.clientX;\n    const rawHeight = isTop ? event.clientY - y : y - event.clientY;\n    const width = this._clampSize(rawWidth, MIN_PANEL_WIDTH, bounds.maxWidth);\n    const height = this._clampSize(rawHeight, MIN_PANEL_HEIGHT, bounds.maxHeight);\n\n    this._panel.style.width = `${width}px`;\n    this._panel.style.height = `${height}px`;\n    this._panel.classList.add('is-resized');\n    this._state = { ...this._state, panelWidth: width, panelHeight: height };\n    this._updatePanelPosition();\n  };\n\n  private _onResizeEnd = (event: PointerEvent): void => {\n    window.removeEventListener('pointermove', this._onResizeMove);\n    window.removeEventListener('pointerup', this._onResizeEnd);\n    window.removeEventListener('pointercancel', this._onResizeEnd);\n    this._resizeHandleEl?.releasePointerCapture?.(event.pointerId);\n    this._resizeHandleEl = null;\n    if (!this._resizeAnchor) return;\n    this._resizeAnchor = null;\n    this._emit({ type: 'statechange', state: this.getState() });\n  };\n\n  private _getResizeBounds(): { maxWidth: number; maxHeight: number } {\n    const mapRect = this._mapContainer?.getBoundingClientRect();\n    const availableWidth = (mapRect?.width ?? window.innerWidth) - PANEL_VIEWPORT_MARGIN * 2;\n    const availableHeight = (mapRect?.height ?? window.innerHeight) - PANEL_VIEWPORT_MARGIN * 2;\n    return {\n      maxWidth: Math.max(MIN_PANEL_WIDTH, availableWidth),\n      maxHeight: Math.max(MIN_PANEL_HEIGHT, availableHeight),\n    };\n  }\n\n  private _clampSize(value: number, min: number, max: number): number {\n    return Math.round(Math.min(Math.max(value, min), max));\n  }\n}\n"],"names":["_a","_b"],"mappings":"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"}