maplibre-gl-basemap-control 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -922,10 +922,11 @@ class BasemapControl {
922
922
  this._renderContent();
923
923
  this._emit({ type: "statechange", state: this.getState() });
924
924
  try {
925
+ let managedRaster;
925
926
  if (basemap.source.type === "raster") {
926
927
  await this._waitForStyleReady();
927
928
  this._removeManagedBasemap();
928
- this._addRasterBasemap(basemap);
929
+ managedRaster = this._addRasterBasemap(basemap);
929
930
  } else {
930
931
  this._removeManagedBasemap();
931
932
  this._map.setStyle(basemap.source.url);
@@ -938,7 +939,12 @@ class BasemapControl {
938
939
  error: void 0
939
940
  };
940
941
  this._renderContent();
941
- this._emit({ type: "basemapchange", state: this.getState(), basemap });
942
+ this._emit({
943
+ type: "basemapchange",
944
+ state: this.getState(),
945
+ basemap,
946
+ managedRaster
947
+ });
942
948
  this._emit({ type: "statechange", state: this.getState() });
943
949
  } catch (cause) {
944
950
  const error = cause instanceof Error ? cause : new Error(String(cause));
@@ -1230,9 +1236,10 @@ class BasemapControl {
1230
1236
  return template.content.textContent ?? value;
1231
1237
  }
1232
1238
  _addRasterBasemap(basemap) {
1233
- if (!this._map || basemap.source.type !== "raster") return;
1239
+ if (!this._map || basemap.source.type !== "raster") return void 0;
1234
1240
  const sourceId = `${CONTROL_SOURCE_PREFIX}-${basemap.id}`;
1235
1241
  const layerId = [CONTROL_LAYER_PREFIX, basemap.id].filter(Boolean).join("-");
1242
+ const beforeId = this._getBasemapInsertBeforeId();
1236
1243
  const source = {
1237
1244
  type: "raster",
1238
1245
  tiles: basemap.source.tiles,
@@ -1248,9 +1255,14 @@ class BasemapControl {
1248
1255
  source: sourceId
1249
1256
  };
1250
1257
  this._map.addSource(sourceId, source);
1251
- this._map.addLayer(layer, this._getBasemapInsertBeforeId());
1258
+ this._map.addLayer(layer, beforeId);
1252
1259
  this._managedSourceIds = [sourceId];
1253
1260
  this._managedLayerIds = [layerId];
1261
+ return {
1262
+ sourceId,
1263
+ layerId,
1264
+ beforeId
1265
+ };
1254
1266
  }
1255
1267
  _waitForStyleReady() {
1256
1268
  if (!this._map) return Promise.resolve();
@@ -1374,4 +1386,4 @@ export {
1374
1386
  getBasemapCategories as g,
1375
1387
  resolveBasemapProviders as r
1376
1388
  };
1377
- //# sourceMappingURL=BasemapControl-Bgd4nl0C.js.map
1389
+ //# sourceMappingURL=BasemapControl-BBPUTp-_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BasemapControl-BBPUTp-_.js","sources":["../src/lib/core/catalog.ts","../src/lib/core/BasemapControl.ts"],"sourcesContent":["import type { BasemapDefinition, BasemapProvider } from './types';\n\nexport const DEFAULT_BASEMAP_PROVIDERS: BasemapProvider[] = [\n { id: 'openstreetmap', name: 'OpenStreetMap', category: 'Community' },\n { id: 'google', name: 'Google', category: 'General' },\n { id: 'carto', name: 'Carto', category: 'General' },\n { id: 'cyclosm', name: 'CyclOSM', category: 'Cycling' },\n { id: 'esri', name: 'ESRI', category: 'Imagery' },\n { id: 'nasa-gibs', name: 'NASA GIBS', category: 'Imagery' },\n { id: 'openrailwaymap', name: 'OpenRailwayMap', category: 'Transport' },\n { id: 'opentopomap', name: 'OpenTopoMap', category: 'Terrain' },\n { id: 'openfreemap', name: 'OpenFreeMap', category: 'Vector Styles' },\n { id: 'swisstopo', name: 'Swiss Federal Geoportal', category: 'Regional' },\n { id: 'topplusopen', name: 'TopPlusOpen', category: 'Regional' },\n { id: 'usgs', name: 'USGS', category: 'United States' },\n { id: 'waymarkedtrails', name: 'Waymarked Trails', category: 'Outdoor' },\n { id: 'nlmaps', name: 'nlmaps', category: 'Regional' },\n];\n\nfunction rasterBasemap({\n id,\n name,\n provider,\n category,\n description,\n attribution,\n tiles,\n maxzoom = 19,\n tags = [],\n}: Omit<BasemapDefinition, 'type' | 'source'> & {\n tiles: string[];\n maxzoom?: number;\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 },\n tags,\n };\n}\n\nconst CARTO_ATTRIBUTION = '&copy; OpenStreetMap contributors &copy; CARTO';\nconst ESRI_ATTRIBUTION = 'Tiles &copy; Esri and the GIS User Community';\nconst OSM_ATTRIBUTION = '&copy; OpenStreetMap contributors';\nconst OPENFREEMAP_ATTRIBUTION = 'OpenFreeMap &copy; OpenMapTiles Data from OpenStreetMap';\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 rasterBasemap({\n id: 'google-maps',\n name: 'Google Maps',\n provider: 'google',\n category: 'Street',\n description: 'Google road map tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'street'],\n }),\n rasterBasemap({\n id: 'google-satellite',\n name: 'Google Satellite',\n provider: 'google',\n category: 'Imagery',\n description: 'Google satellite tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'satellite', 'imagery'],\n }),\n rasterBasemap({\n id: 'google-terrain',\n name: 'Google Terrain',\n provider: 'google',\n category: 'Terrain',\n description: 'Google terrain tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=p&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'terrain'],\n }),\n rasterBasemap({\n id: 'google-hybrid',\n name: 'Google Hybrid',\n provider: 'google',\n category: 'Imagery',\n description: 'Google hybrid imagery tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'hybrid', 'imagery'],\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: ['https://a.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png'],\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: ['https://a.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png'],\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: ['https://a.basemaps.cartocdn.com/rastertiles/voyager_only_labels/{z}/{x}/{y}.png'],\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: ['https://a.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png'],\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: '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-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 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: '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: 'opentopomap',\n name: 'OpenTopoMap',\n provider: 'opentopomap',\n category: 'Terrain',\n description: 'Topographic map with relief and contour styling.',\n attribution: '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 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 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: 'waymarkedtrails-hiking',\n name: 'Waymarked Trails Hiking',\n provider: 'waymarkedtrails',\n category: 'Outdoor',\n description: 'Hiking routes from Waymarked Trails.',\n attribution: '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: '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: '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: '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: 'nlmaps-standaard',\n name: 'nlmaps Standaard',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands standard background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/standaard/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional'],\n }),\n rasterBasemap({\n id: 'nlmaps-grijs',\n name: 'nlmaps Grijs',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands grey background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/grijs/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional', 'grey'],\n }),\n rasterBasemap({\n id: 'nlmaps-pastel',\n name: 'nlmaps Pastel',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands pastel background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/pastel/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional', 'pastel'],\n }),\n rasterBasemap({\n id: 'nlmaps-water',\n name: 'nlmaps Water',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands water-focused background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/water/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional', 'water'],\n }),\n rasterBasemap({\n id: 'nlmaps-luchtfoto',\n name: 'nlmaps Luchtfoto',\n provider: 'nlmaps',\n category: 'Imagery',\n description: 'Netherlands aerial photography.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/hwh/luchtfotorgb/wmts/v1_0/Actueel_ortho25/EPSG:3857/{z}/{x}/{y}.jpeg',\n ],\n tags: ['netherlands', 'imagery', 'aerial'],\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];\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 [...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) => byId.set(provider.id, provider));\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, { id: basemap.provider, name: basemap.provider });\n }\n });\n return [...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 [...new Set(basemaps.map((basemap) => basemap.category).filter(Boolean) as string[])].sort();\n}\n","import type {\n IControl,\n LayerSpecification,\n Map as MapLibreMap,\n SourceSpecification,\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 ManagedRasterBasemap,\n} from './types';\n\nconst DEFAULT_OPTIONS: Required<\n Pick<\n BasemapControlOptions,\n 'collapsed' | 'position' | 'title' | 'panelWidth' | 'className' | 'includeDefaultBasemaps'\n >\n> = {\n collapsed: true,\n position: 'top-right',\n title: 'Basemaps',\n panelWidth: 340,\n className: '',\n includeDefaultBasemaps: true,\n};\n\nconst CONTROL_SOURCE_PREFIX = 'maplibre-basemap-control-source';\nconst CONTROL_LAYER_PREFIX = '';\n\ntype EventHandlersMap = globalThis.Map<BasemapControlEvent, Set<BasemapControlEventHandler>>;\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' | 'position' | 'title' | 'panelWidth' | 'className' | 'includeDefaultBasemaps'\n >\n > &\n Omit<\n BasemapControlOptions,\n 'collapsed' | 'position' | 'title' | 'panelWidth' | 'className' | 'includeDefaultBasemaps'\n >;\n private _state: BasemapControlState;\n private _basemaps: BasemapDefinition[];\n private _providers: BasemapProvider[];\n private _eventHandlers: EventHandlersMap = new globalThis.Map();\n private _managedSourceIds: string[] = [];\n private _managedLayerIds: string[] = [];\n private _resizeHandler: (() => void) | null = null;\n private _mapResizeHandler: (() => void) | null = null;\n private _clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(options?: BasemapControlOptions) {\n this._options = { ...DEFAULT_OPTIONS, ...options };\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 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 this._selectBasemap(this._state.activeBasemapId);\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 if (this._clickOutsideHandler) {\n document.removeEventListener('click', this._clickOutsideHandler);\n this._clickOutsideHandler = null;\n }\n\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._renderContent();\n this._emit({ type: 'statechange', state: this.getState() });\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 if (\n this._state.activeBasemapId &&\n !this._basemaps.some((basemap) => basemap.id === this._state.activeBasemapId)\n ) {\n this._state = { ...this._state, activeBasemapId: undefined };\n }\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 async setBasemap(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 setting a basemap.');\n this._handleError(error, basemap);\n throw error;\n }\n\n this._state = { ...this._state, loading: true, error: undefined };\n this._renderContent();\n this._emit({ type: 'statechange', state: this.getState() });\n\n try {\n let managedRaster: ManagedRasterBasemap | undefined;\n if (basemap.source.type === 'raster') {\n await this._waitForStyleReady();\n this._removeManagedBasemap();\n managedRaster = this._addRasterBasemap(basemap);\n } else {\n this._removeManagedBasemap();\n this._map.setStyle(basemap.source.url);\n }\n\n this._applyBasemapView(basemap);\n\n this._state = {\n ...this._state,\n activeBasemapId: basemap.id,\n loading: false,\n error: undefined,\n };\n this._renderContent();\n this._emit({\n type: 'basemapchange',\n state: this.getState(),\n basemap,\n managedRaster,\n });\n this._emit({ type: 'statechange', state: this.getState() });\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n this._state = { ...this._state, loading: false, error: error.message };\n this._renderContent();\n this._handleError(error, basemap);\n throw error;\n }\n }\n\n // setBasemap rethrows after emitting the error event so callers that await\n // it can react. Internal fire-and-forget callers use this instead to avoid\n // unhandled promise rejections; the failure is still reported via `error`.\n private _selectBasemap(id: string): void {\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 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._options.panelWidth}px`;\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 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(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 return panel;\n }\n\n private _renderContent(): void {\n if (!this._content) return;\n\n const categories = getBasemapCategories(this._basemaps);\n const results = this._getFilteredBasemaps();\n\n this._content.replaceChildren(\n this._createSearchRow(),\n this._createFilterRow(this._providers, categories),\n this._createStatus(results.length),\n this._createResults(results),\n );\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 _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 this._state = { ...this._state, query: input.value };\n this._renderFilteredResults();\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 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 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._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.textContent = this._state.error;\n status.classList.add('is-error');\n } else {\n status.textContent = `${resultCount} basemap${resultCount === 1 ? '' : 's'}`;\n }\n return status;\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 (basemap.id === this._state.activeBasemapId) {\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 = basemap.type === 'raster' ? 'Raster' : '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 _addRasterBasemap(basemap: BasemapDefinition): ManagedRasterBasemap | undefined {\n if (!this._map || basemap.source.type !== 'raster') 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 const source: SourceSpecification = {\n type: 'raster',\n tiles: basemap.source.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 this._managedSourceIds = [sourceId];\n this._managedLayerIds = [layerId];\n\n return {\n sourceId,\n layerId,\n beforeId,\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 const done = () => {\n this._map?.off('load', done);\n this._map?.off('style.load', done);\n resolve();\n };\n this._map?.once('load', done);\n this._map?.once('style.load', done);\n });\n }\n\n private _removeManagedBasemap(): void {\n if (!this._map) return;\n\n [...this._managedLayerIds].reverse().forEach((layerId) => {\n if (this._map?.getLayer(layerId)) {\n this._map.removeLayer(layerId);\n }\n });\n [...this._managedSourceIds].reverse().forEach((sourceId) => {\n if (this._map?.getSource(sourceId)) {\n this._map.removeSource(sourceId);\n }\n });\n this._managedLayerIds = [];\n this._managedSourceIds = [];\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._clickOutsideHandler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n this._container &&\n this._panel &&\n !this._container.contains(target) &&\n !this._panel.contains(target)\n ) {\n this.collapse();\n }\n };\n document.addEventListener('click', this._clickOutsideHandler);\n\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"],"names":["_a","_b"],"mappings":";;;AAEO,MAAM,4BAA+C;AAAA,EAC1D,EAAE,IAAI,iBAAiB,MAAM,iBAAiB,UAAU,YAAA;AAAA,EACxD,EAAE,IAAI,UAAU,MAAM,UAAU,UAAU,UAAA;AAAA,EAC1C,EAAE,IAAI,SAAS,MAAM,SAAS,UAAU,UAAA;AAAA,EACxC,EAAE,IAAI,WAAW,MAAM,WAAW,UAAU,UAAA;AAAA,EAC5C,EAAE,IAAI,QAAQ,MAAM,QAAQ,UAAU,UAAA;AAAA,EACtC,EAAE,IAAI,aAAa,MAAM,aAAa,UAAU,UAAA;AAAA,EAChD,EAAE,IAAI,kBAAkB,MAAM,kBAAkB,UAAU,YAAA;AAAA,EAC1D,EAAE,IAAI,eAAe,MAAM,eAAe,UAAU,UAAA;AAAA,EACpD,EAAE,IAAI,eAAe,MAAM,eAAe,UAAU,gBAAA;AAAA,EACpD,EAAE,IAAI,aAAa,MAAM,2BAA2B,UAAU,WAAA;AAAA,EAC9D,EAAE,IAAI,eAAe,MAAM,eAAe,UAAU,WAAA;AAAA,EACpD,EAAE,IAAI,QAAQ,MAAM,QAAQ,UAAU,gBAAA;AAAA,EACtC,EAAE,IAAI,mBAAmB,MAAM,oBAAoB,UAAU,UAAA;AAAA,EAC7D,EAAE,IAAI,UAAU,MAAM,UAAU,UAAU,WAAA;AAC5C;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO,CAAA;AACT,GAGsB;AACpB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IAAA;AAAA,IAEF;AAAA,EAAA;AAEJ;AAEA,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACxB,MAAM,0BAA0B;AAEzB,MAAM,mBAAwC;AAAA,EACnD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,OAAO,UAAU,UAAU;AAAA,EAAA,CACnC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa,GAAG,eAAe;AAAA,IAC/B,OAAO,CAAC,qDAAqD;AAAA,IAC7D,MAAM,CAAC,OAAO,OAAO,cAAc;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,+CAA+C;AAAA,IACvD,MAAM,CAAC,OAAO,WAAW,UAAU;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,iDAAiD;AAAA,IACzD,MAAM,CAAC,OAAO,eAAe,UAAU;AAAA,EAAA,CACxC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,oDAAoD;AAAA,IAC5D,SAAS;AAAA,IACT,MAAM,CAAC,UAAU,QAAQ;AAAA,EAAA,CAC1B;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,oDAAoD;AAAA,IAC5D,SAAS;AAAA,IACT,MAAM,CAAC,UAAU,aAAa,SAAS;AAAA,EAAA,CACxC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,oDAAoD;AAAA,IAC5D,SAAS;AAAA,IACT,MAAM,CAAC,UAAU,SAAS;AAAA,EAAA,CAC3B;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,oDAAoD;AAAA,IAC5D,SAAS;AAAA,IACT,MAAM,CAAC,UAAU,UAAU,SAAS;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,SAAS,UAAU;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,gEAAgE;AAAA,IACxE,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,SAAS,WAAW;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,mEAAmE;AAAA,IAC3E,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,QAAQ;AAAA,EAAA,CACzB;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,QAAQ,QAAQ;AAAA,EAAA,CACjC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,+DAA+D;AAAA,IACvE,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,QAAQ,WAAW;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,kEAAkE;AAAA,IAC1E,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,QAAQ,QAAQ;AAAA,EAAA,CACjC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,UAAU,SAAS;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,8EAA8E;AAAA,IACtF,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,WAAW,WAAW;AAAA,EAAA,CACvC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,iFAAiF;AAAA,IACzF,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,WAAW,QAAQ;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,kFAAkF;AAAA,IAC1F,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,WAAW,QAAQ;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,iEAAiE;AAAA,IACzE,MAAM,CAAC,WAAW,KAAK;AAAA,EAAA,CACxB;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,aAAa,SAAS;AAAA,EAAA,CACtC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,eAAe,SAAS;AAAA,EAAA,CACxC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,QAAQ;AAAA,EAAA,CACxB;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,QAAQ,QAAQ;AAAA,EAAA,CAChC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,QAAQ;AAAA,EAAA,CACxB;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,SAAS,QAAQ;AAAA,EAAA,CACjC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,YAAY,SAAS;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,UAAU,SAAS;AAAA,EAAA,CACnC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,SAAS;AAAA,EAAA,CACzB;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,QAAQ,aAAa;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,QAAQ,UAAU,SAAS;AAAA,EAAA,CAC3C;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,QAAQ,SAAS,YAAY;AAAA,EAAA,CAC7C;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,QAAQ,SAAS,OAAO;AAAA,EAAA,CACxC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,6DAA6D;AAAA,IACrE,MAAM,CAAC,QAAQ,aAAa,KAAK;AAAA,EAAA,CAClC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,gDAAgD;AAAA,IACxD,SAAS;AAAA,IACT,MAAM,CAAC,WAAW,QAAQ,QAAQ;AAAA,EAAA,CACnC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,eAAe,UAAU;AAAA,EAAA,CACjC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,eAAe,YAAY,MAAM;AAAA,EAAA,CACzC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,eAAe,SAAS;AAAA,EAAA,CAChC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,WAAW,UAAU;AAAA,EAAA,CAC7B;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,WAAW,YAAY,MAAM;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,WAAW,eAAe;AAAA,EAAA,CAC1C;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,WAAW,QAAQ,eAAe;AAAA,EAAA,CAClD;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,QAAQ,eAAe;AAAA,EAAA,CACvC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,yDAAyD;AAAA,IACjE,MAAM,CAAC,UAAU,WAAW,QAAQ;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,0DAA0D;AAAA,IAClE,MAAM,CAAC,WAAW,WAAW,QAAQ;AAAA,EAAA,CACtC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,sDAAsD;AAAA,IAC9D,MAAM,CAAC,OAAO,WAAW,QAAQ;AAAA,EAAA,CAClC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,yDAAyD;AAAA,IACjE,MAAM,CAAC,UAAU,WAAW,QAAQ;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,eAAe,UAAU;AAAA,EAAA,CACjC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,eAAe,YAAY,MAAM;AAAA,EAAA,CACzC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,eAAe,YAAY,QAAQ;AAAA,EAAA,CAC3C;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,eAAe,YAAY,OAAO;AAAA,EAAA,CAC1C;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,eAAe,WAAW,QAAQ;AAAA,EAAA,CAC1C;AAAA,EACD;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM,CAAC,eAAe,UAAU,SAAS,YAAY,OAAO;AAAA,EAAA;AAAA,EAE9D;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM,CAAC,eAAe,UAAU,SAAS,UAAU,QAAQ;AAAA,EAAA;AAAA,EAE7D;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM,CAAC,eAAe,UAAU,OAAO;AAAA,EAAA;AAAA,EAEzC;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM,CAAC,eAAe,UAAU,SAAS,MAAM;AAAA,EAAA;AAAA,EAEjD;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM,CAAC,eAAe,UAAU,SAAS,SAAS,MAAM;AAAA,EAAA;AAAA,EAE1D;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM;AAAA,MACJ,QAAQ,CAAC,QAAQ,MAAM;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,IAET,MAAM,CAAC,eAAe,UAAU,SAAS,MAAM,SAAS;AAAA,EAAA;AAE5D;AAEO,SAAS,iBACd,UACA,SAA4B,IACT;AACnB,QAAM,2BAAW,IAAA;AACjB,WAAS,QAAQ,CAAC,aAAa,KAAK,IAAI,SAAS,IAAI,QAAQ,CAAC;AAC9D,SAAO,QAAQ,CAAC,aAAa,KAAK,IAAI,SAAS,IAAI,QAAQ,CAAC;AAC5D,SAAO,CAAC,GAAG,KAAK,QAAQ;AAC1B;AAEO,SAAS,wBACd,UACA,kBAAqC,CAAA,GACrC,0BAA0B,MACP;AACnB,QAAM,2BAAW,IAAA;AACjB,MAAI,yBAAyB;AAC3B,8BAA0B,QAAQ,CAAC,aAAa,KAAK,IAAI,SAAS,IAAI,QAAQ,CAAC;AAAA,EACjF;AACA,kBAAgB,QAAQ,CAAC,aAAa,KAAK,IAAI,SAAS,IAAI,QAAQ,CAAC;AAGrE,WAAS,QAAQ,CAAC,YAAY;AAC5B,QAAI,QAAQ,YAAY,CAAC,KAAK,IAAI,QAAQ,QAAQ,GAAG;AACnD,WAAK,IAAI,QAAQ,UAAU,EAAE,IAAI,QAAQ,UAAU,MAAM,QAAQ,SAAA,CAAU;AAAA,IAC7E;AAAA,EACF,CAAC;AACD,SAAO,CAAC,GAAG,KAAK,QAAQ;AAC1B;AAEO,SAAS,qBACd,iBAAsC,IACtC,yBAAyB,MACJ;AACrB,QAAM,WAAW,yBACb,CAAC,GAAG,kBAAkB,GAAG,cAAc,IACvC,CAAC,GAAG,cAAc;AACtB,QAAM,2BAAW,IAAA;AACjB,WAAS,QAAQ,CAAC,YAAY,KAAK,IAAI,QAAQ,IAAI,OAAO,CAAC;AAC3D,SAAO,CAAC,GAAG,KAAK,QAAQ;AAC1B;AAQO,SAAS,eACd,UACA,QACqB;AAnyBhB;AAoyBL,QAAM,UAAQ,YAAO,UAAP,mBAAc,OAAO,kBAAiB;AAEpD,SAAO,SAAS,OAAO,CAAC,YAAY;AAClC,QAAI,OAAO,YAAY,QAAQ,aAAa,OAAO,SAAU,QAAO;AACpE,QAAI,OAAO,YAAY,QAAQ,aAAa,OAAO,SAAU,QAAO;AACpE,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,WAAW;AAAA,MACf,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,GAAI,QAAQ,QAAQ,CAAA;AAAA,IAAC,EAEpB,OAAO,OAAO,EACd,KAAK,GAAG,EACR,YAAA;AAEH,WAAO,SAAS,SAAS,KAAK;AAAA,EAChC,CAAC;AACH;AAEO,SAAS,qBAAqB,UAAyC;AAC5E,SAAO,CAAC,GAAG,IAAI,IAAI,SAAS,IAAI,CAAC,YAAY,QAAQ,QAAQ,EAAE,OAAO,OAAO,CAAa,CAAC,EAAE,KAAA;AAC/F;ACvyBA,MAAM,kBAKF;AAAA,EACF,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,wBAAwB;AAC1B;AAEA,MAAM,wBAAwB;AAC9B,MAAM,uBAAuB;AAItB,MAAM,eAAmC;AAAA,EA0B9C,YAAY,SAAiC;AAzBrC;AACA;AACA;AACA;AACA;AACA;AAUA;AACA;AACA;AACA,0CAAmC,IAAI,WAAW,IAAA;AAClD,6CAA8B,CAAA;AAC9B,4CAA6B,CAAA;AAC7B,0CAAsC;AACtC,6CAAyC;AACzC,gDAAyD;AAG/D,SAAK,WAAW,EAAE,GAAG,iBAAiB,GAAG,QAAA;AACzC,SAAK,YAAY;AAAA,MACf,mCAAS;AAAA,MACT,KAAK,SAAS;AAAA,IAAA;AAEhB,SAAK,aAAa;AAAA,MAChB,KAAK;AAAA,MACL,mCAAS;AAAA,MACT,KAAK,SAAS;AAAA,IAAA;AAEhB,SAAK,SAAS;AAAA,MACZ,WAAW,KAAK,SAAS;AAAA,MACzB,YAAY,KAAK,SAAS;AAAA,MAC1B,iBAAiB,KAAK,SAAS;AAAA,MAC/B,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,UAAU;AAAA,MACV,SAAS;AAAA,IAAA;AAAA,EAEb;AAAA,EAEA,MAAM,KAA+B;AACnC,SAAK,OAAO;AACZ,SAAK,gBAAgB,IAAI,aAAA;AACzB,SAAK,aAAa,KAAK,iBAAA;AACvB,SAAK,SAAS,KAAK,aAAA;AACnB,SAAK,cAAc,YAAY,KAAK,MAAM;AAC1C,SAAK,qBAAA;AAEL,QAAI,CAAC,KAAK,OAAO,WAAW;AAC1B,WAAK,OAAO,UAAU,IAAI,UAAU;AACpC,4BAAsB,MAAM,KAAK,sBAAsB;AAAA,IACzD;AAEA,SAAK,eAAA;AAEL,QAAI,KAAK,OAAO,iBAAiB;AAC/B,WAAK,eAAe,KAAK,OAAO,eAAe;AAAA,IACjD;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAiB;AD/GZ;ACgHH,QAAI,KAAK,gBAAgB;AACvB,aAAO,oBAAoB,UAAU,KAAK,cAAc;AACxD,WAAK,iBAAiB;AAAA,IACxB;AACA,QAAI,KAAK,qBAAqB,KAAK,MAAM;AACvC,WAAK,KAAK,IAAI,UAAU,KAAK,iBAAiB;AAC9C,WAAK,oBAAoB;AAAA,IAC3B;AACA,QAAI,KAAK,sBAAsB;AAC7B,eAAS,oBAAoB,SAAS,KAAK,oBAAoB;AAC/D,WAAK,uBAAuB;AAAA,IAC9B;AAEA,qBAAK,WAAL,mBAAa,eAAb,mBAAyB,YAAY,KAAK;AAC1C,qBAAK,eAAL,mBAAiB,eAAjB,mBAA6B,YAAY,KAAK;AAE9C,SAAK,OAAO;AACZ,SAAK,gBAAgB;AACrB,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,eAAe,MAAA;AAAA,EACtB;AAAA,EAEA,WAAgC;AAC9B,WAAO,EAAE,GAAG,KAAK,OAAA;AAAA,EACnB;AAAA,EAEA,SAAS,UAA8C;AACrD,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,SAAA;AACnC,SAAK,eAAA;AACL,SAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,EAC5D;AAAA,EAEA,cAAmC;AACjC,WAAO,CAAC,GAAG,KAAK,SAAS;AAAA,EAC3B;AAAA,EAEA,YAAY,UAAqC;AAC/C,SAAK,YAAY,CAAC,GAAG,QAAQ;AAC7B,SAAK,aAAa;AAAA,MAChB,KAAK;AAAA,MACL,KAAK,SAAS;AAAA,MACd,KAAK,SAAS;AAAA,IAAA;AAEhB,QACE,KAAK,OAAO,mBACZ,CAAC,KAAK,UAAU,KAAK,CAAC,YAAY,QAAQ,OAAO,KAAK,OAAO,eAAe,GAC5E;AACA,WAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,iBAAiB,OAAA;AAAA,IACnD;AACA,SAAK,eAAA;AACL,SAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,EAC5D;AAAA,EAEA,mBAAkD;AAChD,WAAO,KAAK,UAAU,KAAK,CAAC,YAAY,QAAQ,OAAO,KAAK,OAAO,eAAe;AAAA,EACpF;AAAA,EAEA,MAAM,WAAW,IAA2B;AAC1C,UAAM,UAAU,KAAK,UAAU,KAAK,CAAC,cAAc,UAAU,OAAO,EAAE;AACtE,QAAI,CAAC,SAAS;AACZ,YAAM,QAAQ,IAAI,MAAM,YAAY,EAAE,kBAAkB;AACxD,WAAK,aAAa,KAAK;AACvB,YAAM;AAAA,IACR;AACA,QAAI,CAAC,KAAK,MAAM;AACd,YAAM,QAAQ,IAAI,MAAM,iEAAiE;AACzF,WAAK,aAAa,OAAO,OAAO;AAChC,YAAM;AAAA,IACR;AAEA,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,SAAS,MAAM,OAAO,OAAA;AACtD,SAAK,eAAA;AACL,SAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAE1D,QAAI;AACF,UAAI;AACJ,UAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,cAAM,KAAK,mBAAA;AACX,aAAK,sBAAA;AACL,wBAAgB,KAAK,kBAAkB,OAAO;AAAA,MAChD,OAAO;AACL,aAAK,sBAAA;AACL,aAAK,KAAK,SAAS,QAAQ,OAAO,GAAG;AAAA,MACvC;AAEA,WAAK,kBAAkB,OAAO;AAE9B,WAAK,SAAS;AAAA,QACZ,GAAG,KAAK;AAAA,QACR,iBAAiB,QAAQ;AAAA,QACzB,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAET,WAAK,eAAA;AACL,WAAK,MAAM;AAAA,QACT,MAAM;AAAA,QACN,OAAO,KAAK,SAAA;AAAA,QACZ;AAAA,QACA;AAAA,MAAA,CACD;AACD,WAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,IAC5D,SAAS,OAAO;AACd,YAAM,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACtE,WAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,SAAS,OAAO,OAAO,MAAM,QAAA;AAC7D,WAAK,eAAA;AACL,WAAK,aAAa,OAAO,OAAO;AAChC,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,IAAkB;AACvC,SAAK,WAAW,EAAE,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACpC;AAAA,EAEA,SAAe;AACb,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,WAAW,CAAC,KAAK,OAAO,UAAA;AAExD,QAAI,KAAK,QAAQ;AACf,UAAI,KAAK,OAAO,WAAW;AACzB,aAAK,OAAO,UAAU,OAAO,UAAU;AACvC,aAAK,MAAM,EAAE,MAAM,YAAY,OAAO,KAAK,SAAA,GAAY;AAAA,MACzD,OAAO;AACL,aAAK,OAAO,UAAU,IAAI,UAAU;AACpC,aAAK,qBAAA;AACL,aAAK,MAAM,EAAE,MAAM,UAAU,OAAO,KAAK,SAAA,GAAY;AAAA,MACvD;AAAA,IACF;AAEA,SAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,EAC5D;AAAA,EAEA,SAAe;AACb,QAAI,KAAK,OAAO,UAAW,MAAK,OAAA;AAAA,EAClC;AAAA,EAEA,WAAiB;AACf,QAAI,CAAC,KAAK,OAAO,gBAAgB,OAAA;AAAA,EACnC;AAAA,EAEA,GAAG,OAA4B,SAA2C;AACxE,QAAI,CAAC,KAAK,eAAe,IAAI,KAAK,GAAG;AACnC,WAAK,eAAe,IAAI,OAAO,oBAAI,KAAK;AAAA,IAC1C;AACA,SAAK,eAAe,IAAI,KAAK,EAAG,IAAI,OAAO;AAAA,EAC7C;AAAA,EAEA,IAAI,OAA4B,SAA2C;ADvQtE;ACwQH,eAAK,eAAe,IAAI,KAAK,MAA7B,mBAAgC,OAAO;AAAA,EACzC;AAAA,EAEA,SAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAAwC;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,MAAM,OAAwD;ADnRjE;ACoRH,eAAK,eAAe,IAAI,MAAM,IAAI,MAAlC,mBAAqC,QAAQ,CAAC,YAAY,QAAQ,KAAK;AAAA,EACzE;AAAA,EAEQ,aAAa,OAAc,SAAmC;AACpE,SAAK,MAAM,EAAE,MAAM,SAAS,OAAO,KAAK,SAAA,GAAY,OAAO,SAAS;AACpE,SAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,EAC5D;AAAA,EAEQ,mBAAgC;AACtC,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,YAAY,wDACpB,KAAK,SAAS,YAAY,IAAI,KAAK,SAAS,SAAS,KAAK,EAC5D;AAEA,UAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,cAAU,YAAY;AACtB,cAAU,OAAO;AACjB,cAAU,QAAQ,KAAK,SAAS;AAChC,cAAU,aAAa,cAAc,KAAK,SAAS,KAAK;AACxD,cAAU,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAStB,cAAU,iBAAiB,SAAS,MAAM,KAAK,QAAQ;AACvD,cAAU,YAAY,SAAS;AAE/B,WAAO;AAAA,EACT;AAAA,EAEQ,eAA4B;AAClC,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,UAAM,MAAM,QAAQ,GAAG,KAAK,SAAS,UAAU;AAE/C,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AAEnB,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,YAAY;AAClB,UAAM,cAAc,KAAK,SAAS;AAElC,UAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,aAAS,YAAY;AACrB,aAAS,OAAO;AAChB,aAAS,aAAa,cAAc,qBAAqB;AACzD,aAAS,YAAY;AACrB,aAAS,iBAAiB,SAAS,MAAM,KAAK,UAAU;AAExD,WAAO,YAAY,KAAK;AACxB,WAAO,YAAY,QAAQ;AAE3B,SAAK,WAAW,SAAS,cAAc,KAAK;AAC5C,SAAK,SAAS,YAAY;AAE1B,UAAM,YAAY,MAAM;AACxB,UAAM,YAAY,KAAK,QAAQ;AAE/B,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,CAAC,KAAK,SAAU;AAEpB,UAAM,aAAa,qBAAqB,KAAK,SAAS;AACtD,UAAM,UAAU,KAAK,qBAAA;AAErB,SAAK,SAAS;AAAA,MACZ,KAAK,iBAAA;AAAA,MACL,KAAK,iBAAiB,KAAK,YAAY,UAAU;AAAA,MACjD,KAAK,cAAc,QAAQ,MAAM;AAAA,MACjC,KAAK,eAAe,OAAO;AAAA,IAAA;AAAA,EAE/B;AAAA,EAEQ,yBAA+B;ADnWlC;ACoWH,QAAI,CAAC,KAAK,SAAU;AAEpB,UAAM,UAAU,KAAK,qBAAA;AACrB,eAAK,SAAS,cAAc,yBAAyB,MAArD,mBAAwD;AAAA,MACtD,KAAK,cAAc,QAAQ,MAAM;AAAA;AAEnC,eAAK,SAAS,cAAc,0BAA0B,MAAtD,mBAAyD;AAAA,MACvD,KAAK,eAAe,OAAO;AAAA;AAAA,EAE/B;AAAA,EAEQ,uBAA4C;AAClD,WAAO,eAAe,KAAK,WAAW;AAAA,MACpC,OAAO,KAAK,OAAO;AAAA,MACnB,UAAU,KAAK,OAAO;AAAA,MACtB,UAAU,KAAK,OAAO;AAAA,IAAA,CACvB;AAAA,EACH;AAAA,EAEQ,mBAAgC;AACtC,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY;AAChB,QAAI,YAAY,KAAK,oBAAoB;AACzC,QAAI,YAAY,KAAK,sBAAsB;AAC3C,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAkC;AACxC,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AAEpB,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,YAAY;AAClB,UAAM,OAAO;AACb,UAAM,cAAc;AACpB,UAAM,QAAQ,KAAK,OAAO;AAC1B,UAAM,aAAa,cAAc,iBAAiB;AAClD,UAAM,iBAAiB,SAAS,MAAM;AACpC,WAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,OAAO,MAAM,MAAA;AAC7C,WAAK,uBAAA;AACL,WAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,IAC5D,CAAC;AAED,YAAQ,YAAY,KAAK;AACzB,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAoC;AAC1C,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AAEpB,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,YAAY;AAClB,UAAM,OAAO;AACb,UAAM,cAAc;AACpB,UAAM,QAAQ,KAAK,OAAO;AAC1B,UAAM,aAAa,cAAc,WAAW;AAC5C,UAAM,iBAAiB,SAAS,MAAM;AACpC,WAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,UAAU,MAAM,MAAA;AAChD,WAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,IAC5D,CAAC;AAED,YAAQ,YAAY,KAAK;AACzB,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,WAA8B,YAAmC;AACxF,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY;AAChB,QAAI;AAAA,MACF,KAAK;AAAA,QACH;AAAA,QACA,KAAK,OAAO;AAAA,QACZ,UAAU,IAAI,CAAC,cAAc,EAAE,OAAO,SAAS,IAAI,OAAO,SAAS,KAAA,EAAO;AAAA,QAC1E,CAAC,UAAU;AACT,eAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,gBAAgB,MAAA;AAChD,eAAK,eAAA;AACL,eAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,QAC5D;AAAA,MAAA;AAAA,IACF;AAEF,QAAI;AAAA,MACF,KAAK;AAAA,QACH;AAAA,QACA,KAAK,OAAO;AAAA,QACZ,WAAW,IAAI,CAAC,cAAc,EAAE,OAAO,UAAU,OAAO,SAAA,EAAW;AAAA,QACnE,CAAC,UAAU;AACT,eAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,gBAAgB,MAAA;AAChD,eAAK,eAAA;AACL,eAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,QAC5D;AAAA,MAAA;AAAA,IACF;AAEF,WAAO;AAAA,EACT;AAAA,EAEQ,cACN,OACA,OACA,SACA,UACa;AACb,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,YAAY;AACnB,WAAO,aAAa,cAAc,KAAK;AAEvC,UAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,QAAI,QAAQ;AACZ,QAAI,cAAc,OAAO,MAAM,YAAA,CAAa;AAC5C,WAAO,YAAY,GAAG;AAEtB,YAAQ,QAAQ,CAAC,WAAW;AAC1B,YAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,cAAQ,QAAQ,OAAO;AACvB,cAAQ,cAAc,OAAO;AAC7B,aAAO,YAAY,OAAO;AAAA,IAC5B,CAAC;AAED,WAAO,QAAQ;AACf,WAAO,iBAAiB,UAAU,MAAM,SAAS,OAAO,KAAK,CAAC;AAC9D,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,aAAkC;AACtD,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,QAAI,KAAK,OAAO,SAAS;AACvB,aAAO,cAAc;AAAA,IACvB,WAAW,KAAK,OAAO,OAAO;AAC5B,aAAO,cAAc,KAAK,OAAO;AACjC,aAAO,UAAU,IAAI,UAAU;AAAA,IACjC,OAAO;AACL,aAAO,cAAc,GAAG,WAAW,WAAW,gBAAgB,IAAI,KAAK,GAAG;AAAA,IAC5E;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,SAA2C;AAChE,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AAEjB,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,cAAc;AACpB,WAAK,YAAY,KAAK;AACtB,aAAO;AAAA,IACT;AAEA,YAAQ,QAAQ,CAAC,YAAY;AAC3B,YAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,UAAI,OAAO;AACX,UAAI,YAAY;AAChB,UAAI,QAAQ,YAAY,QAAQ;AAChC,UAAI,QAAQ,OAAO,KAAK,OAAO,iBAAiB;AAC9C,YAAI,UAAU,IAAI,WAAW;AAC7B,YAAI,aAAa,gBAAgB,MAAM;AAAA,MACzC;AACA,UAAI,WAAW,KAAK,OAAO;AAC3B,UAAI,iBAAiB,SAAS,MAAM;AAClC,aAAK,eAAe,QAAQ,EAAE;AAAA,MAChC,CAAC;AAED,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,YAAY;AAEjB,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,YAAY;AACjB,WAAK,cAAc,QAAQ;AAE3B,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,YAAY;AACjB,WAAK,cAAc,KAAK,mBAAmB,OAAO;AAElD,WAAK,YAAY,IAAI;AACrB,WAAK,YAAY,IAAI;AAErB,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,YAAY;AACjB,WAAK,cAAc,QAAQ,SAAS,WAAW,WAAW;AAE1D,UAAI,YAAY,IAAI;AACpB,UAAI,YAAY,IAAI;AAEpB,UAAI,QAAQ,aAAa;AACvB,cAAM,cAAc,SAAS,cAAc,MAAM;AACjD,oBAAY,YAAY;AACxB,oBAAY,cAAc,KAAK,WAAW,QAAQ,WAAW;AAC7D,YAAI,YAAY,WAAW;AAAA,MAC7B;AAEA,WAAK,YAAY,GAAG;AAAA,IACtB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,SAAoC;AAC7D,UAAM,WAAW,KAAK,WAAW,KAAK,CAAC,cAAc,UAAU,OAAO,QAAQ,QAAQ;AACtF,WAAO,EAAC,qCAAU,SAAQ,QAAQ,UAAU,QAAQ,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,EAC1F;AAAA,EAEQ,WAAW,OAAuB;AACxC,UAAM,WAAW,SAAS,cAAc,UAAU;AAClD,aAAS,YAAY;AACrB,WAAO,SAAS,QAAQ,eAAe;AAAA,EACzC;AAAA,EAEQ,kBAAkB,SAA8D;AACtF,QAAI,CAAC,KAAK,QAAQ,QAAQ,OAAO,SAAS,SAAU,QAAO;AAE3D,UAAM,WAAW,GAAG,qBAAqB,IAAI,QAAQ,EAAE;AACvD,UAAM,UAAU,CAAC,sBAAsB,QAAQ,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC3E,UAAM,WAAW,KAAK,0BAAA;AACtB,UAAM,SAA8B;AAAA,MAClC,MAAM;AAAA,MACN,OAAO,QAAQ,OAAO;AAAA,MACtB,UAAU,QAAQ,OAAO,YAAY;AAAA,MACrC,SAAS,QAAQ,OAAO;AAAA,MACxB,SAAS,QAAQ,OAAO;AAAA,MACxB,QAAQ,QAAQ,OAAO;AAAA,MACvB,aAAa,QAAQ;AAAA,IAAA;AAEvB,UAAM,QAA4B;AAAA,MAChC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ;AAAA,IAAA;AAGV,SAAK,KAAK,UAAU,UAAU,MAAM;AACpC,SAAK,KAAK,SAAS,OAAO,QAAQ;AAClC,SAAK,oBAAoB,CAAC,QAAQ;AAClC,SAAK,mBAAmB,CAAC,OAAO;AAEhC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,qBAAoC;AAC1C,QAAI,CAAC,KAAK,KAAM,QAAO,QAAQ,QAAA;AAC/B,QAAI,OAAO,KAAK,KAAK,kBAAkB,cAAc,KAAK,KAAK,iBAAiB;AAC9E,aAAO,QAAQ,QAAA;AAAA,IACjB;AAEA,WAAO,IAAI,QAAQ,CAAC,YAAY;AD3lB7B;AC4lBD,YAAM,OAAO,MAAM;AD5lBlB,YAAAA,KAAAC;AC6lBC,SAAAD,MAAA,KAAK,SAAL,gBAAAA,IAAW,IAAI,QAAQ;AACvB,SAAAC,MAAA,KAAK,SAAL,gBAAAA,IAAW,IAAI,cAAc;AAC7B,gBAAA;AAAA,MACF;AACA,iBAAK,SAAL,mBAAW,KAAK,QAAQ;AACxB,iBAAK,SAAL,mBAAW,KAAK,cAAc;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEQ,wBAA8B;AACpC,QAAI,CAAC,KAAK,KAAM;AAEhB,KAAC,GAAG,KAAK,gBAAgB,EAAE,UAAU,QAAQ,CAAC,YAAY;ADzmBvD;AC0mBD,WAAI,UAAK,SAAL,mBAAW,SAAS,UAAU;AAChC,aAAK,KAAK,YAAY,OAAO;AAAA,MAC/B;AAAA,IACF,CAAC;AACD,KAAC,GAAG,KAAK,iBAAiB,EAAE,UAAU,QAAQ,CAAC,aAAa;AD9mBzD;AC+mBD,WAAI,UAAK,SAAL,mBAAW,UAAU,WAAW;AAClC,aAAK,KAAK,aAAa,QAAQ;AAAA,MACjC;AAAA,IACF,CAAC;AACD,SAAK,mBAAmB,CAAA;AACxB,SAAK,oBAAoB,CAAA;AAAA,EAC3B;AAAA,EAEQ,kBAAkB,SAAkC;AAC1D,QAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,KAAM;AAEjC,SAAK,KAAK,OAAO;AAAA,MACf,QAAQ,QAAQ,KAAK;AAAA,MACrB,MAAM,QAAQ,KAAK;AAAA,MACnB,SAAS,QAAQ,KAAK;AAAA,MACtB,OAAO,QAAQ,KAAK;AAAA,IAAA,CACrB;AAAA,EACH;AAAA,EAEQ,4BAAgD;AACtD,UAAM,WAAW,KAAK,OAAO,SAAS,KAAA;AACtC,QAAI,CAAC,YAAY,SAAS,YAAA,MAAkB,OAAQ,QAAO;AAC3D,WAAO;AAAA,EACT;AAAA,EAEQ,uBAA6B;ADxoBhC;ACyoBH,SAAK,uBAAuB,CAAC,MAAkB;AAC7C,YAAM,SAAS,EAAE;AACjB,UACE,KAAK,cACL,KAAK,UACL,CAAC,KAAK,WAAW,SAAS,MAAM,KAChC,CAAC,KAAK,OAAO,SAAS,MAAM,GAC5B;AACA,aAAK,SAAA;AAAA,MACP;AAAA,IACF;AACA,aAAS,iBAAiB,SAAS,KAAK,oBAAoB;AAE5D,SAAK,iBAAiB,MAAM;AAC1B,UAAI,CAAC,KAAK,OAAO,gBAAgB,qBAAA;AAAA,IACnC;AACA,WAAO,iBAAiB,UAAU,KAAK,cAAc;AAErD,SAAK,oBAAoB,MAAM;AAC7B,UAAI,CAAC,KAAK,OAAO,gBAAgB,qBAAA;AAAA,IACnC;AACA,eAAK,SAAL,mBAAW,GAAG,UAAU,KAAK;AAAA,EAC/B;AAAA,EAEQ,sBAA8C;ADjqBjD;ACkqBH,UAAM,UAAS,UAAK,eAAL,mBAAiB;AAChC,QAAI,CAAC,OAAQ,QAAO,KAAK,SAAS;AAElC,QAAI,OAAO,UAAU,SAAS,0BAA0B,EAAG,QAAO;AAClE,QAAI,OAAO,UAAU,SAAS,2BAA2B,EAAG,QAAO;AACnE,QAAI,OAAO,UAAU,SAAS,6BAA6B,EAAG,QAAO;AACrE,QAAI,OAAO,UAAU,SAAS,8BAA8B,EAAG,QAAO;AAEtE,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEQ,uBAA6B;AACnC,QAAI,CAAC,KAAK,cAAc,CAAC,KAAK,UAAU,CAAC,KAAK,cAAe;AAE7D,UAAM,SAAS,KAAK,WAAW,cAAc,yBAAyB;AACtE,QAAI,CAAC,OAAQ;AAEb,UAAM,aAAa,OAAO,sBAAA;AAC1B,UAAM,UAAU,KAAK,cAAc,sBAAA;AACnC,UAAM,WAAW,KAAK,oBAAA;AACtB,UAAM,YAAY,WAAW,MAAM,QAAQ;AAC3C,UAAM,eAAe,QAAQ,SAAS,WAAW;AACjD,UAAM,aAAa,WAAW,OAAO,QAAQ;AAC7C,UAAM,cAAc,QAAQ,QAAQ,WAAW;AAC/C,UAAM,WAAW;AAEjB,SAAK,OAAO,MAAM,MAAM;AACxB,SAAK,OAAO,MAAM,SAAS;AAC3B,SAAK,OAAO,MAAM,OAAO;AACzB,SAAK,OAAO,MAAM,QAAQ;AAE1B,YAAQ,UAAA;AAAA,MACN,KAAK;AACH,aAAK,OAAO,MAAM,MAAM,GAAG,YAAY,WAAW,SAAS,QAAQ;AACnE,aAAK,OAAO,MAAM,OAAO,GAAG,UAAU;AACtC;AAAA,MACF,KAAK;AACH,aAAK,OAAO,MAAM,MAAM,GAAG,YAAY,WAAW,SAAS,QAAQ;AACnE,aAAK,OAAO,MAAM,QAAQ,GAAG,WAAW;AACxC;AAAA,MACF,KAAK;AACH,aAAK,OAAO,MAAM,SAAS,GAAG,eAAe,WAAW,SAAS,QAAQ;AACzE,aAAK,OAAO,MAAM,OAAO,GAAG,UAAU;AACtC;AAAA,MACF,KAAK;AACH,aAAK,OAAO,MAAM,SAAS,GAAG,eAAe,WAAW,SAAS,QAAQ;AACzE,aAAK,OAAO,MAAM,QAAQ,GAAG,WAAW;AACxC;AAAA,IAAA;AAAA,EAEN;AACF;"}
@@ -923,10 +923,11 @@ class BasemapControl {
923
923
  this._renderContent();
924
924
  this._emit({ type: "statechange", state: this.getState() });
925
925
  try {
926
+ let managedRaster;
926
927
  if (basemap.source.type === "raster") {
927
928
  await this._waitForStyleReady();
928
929
  this._removeManagedBasemap();
929
- this._addRasterBasemap(basemap);
930
+ managedRaster = this._addRasterBasemap(basemap);
930
931
  } else {
931
932
  this._removeManagedBasemap();
932
933
  this._map.setStyle(basemap.source.url);
@@ -939,7 +940,12 @@ class BasemapControl {
939
940
  error: void 0
940
941
  };
941
942
  this._renderContent();
942
- this._emit({ type: "basemapchange", state: this.getState(), basemap });
943
+ this._emit({
944
+ type: "basemapchange",
945
+ state: this.getState(),
946
+ basemap,
947
+ managedRaster
948
+ });
943
949
  this._emit({ type: "statechange", state: this.getState() });
944
950
  } catch (cause) {
945
951
  const error = cause instanceof Error ? cause : new Error(String(cause));
@@ -1231,9 +1237,10 @@ class BasemapControl {
1231
1237
  return template.content.textContent ?? value;
1232
1238
  }
1233
1239
  _addRasterBasemap(basemap) {
1234
- if (!this._map || basemap.source.type !== "raster") return;
1240
+ if (!this._map || basemap.source.type !== "raster") return void 0;
1235
1241
  const sourceId = `${CONTROL_SOURCE_PREFIX}-${basemap.id}`;
1236
1242
  const layerId = [CONTROL_LAYER_PREFIX, basemap.id].filter(Boolean).join("-");
1243
+ const beforeId = this._getBasemapInsertBeforeId();
1237
1244
  const source = {
1238
1245
  type: "raster",
1239
1246
  tiles: basemap.source.tiles,
@@ -1249,9 +1256,14 @@ class BasemapControl {
1249
1256
  source: sourceId
1250
1257
  };
1251
1258
  this._map.addSource(sourceId, source);
1252
- this._map.addLayer(layer, this._getBasemapInsertBeforeId());
1259
+ this._map.addLayer(layer, beforeId);
1253
1260
  this._managedSourceIds = [sourceId];
1254
1261
  this._managedLayerIds = [layerId];
1262
+ return {
1263
+ sourceId,
1264
+ layerId,
1265
+ beforeId
1266
+ };
1255
1267
  }
1256
1268
  _waitForStyleReady() {
1257
1269
  if (!this._map) return Promise.resolve();
@@ -1373,4 +1385,4 @@ exports.createBasemapCatalog = createBasemapCatalog;
1373
1385
  exports.filterBasemaps = filterBasemaps;
1374
1386
  exports.getBasemapCategories = getBasemapCategories;
1375
1387
  exports.resolveBasemapProviders = resolveBasemapProviders;
1376
- //# sourceMappingURL=BasemapControl-B6fW3kYQ.cjs.map
1388
+ //# sourceMappingURL=BasemapControl-CMZxjxEY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BasemapControl-CMZxjxEY.cjs","sources":["../src/lib/core/catalog.ts","../src/lib/core/BasemapControl.ts"],"sourcesContent":["import type { BasemapDefinition, BasemapProvider } from './types';\n\nexport const DEFAULT_BASEMAP_PROVIDERS: BasemapProvider[] = [\n { id: 'openstreetmap', name: 'OpenStreetMap', category: 'Community' },\n { id: 'google', name: 'Google', category: 'General' },\n { id: 'carto', name: 'Carto', category: 'General' },\n { id: 'cyclosm', name: 'CyclOSM', category: 'Cycling' },\n { id: 'esri', name: 'ESRI', category: 'Imagery' },\n { id: 'nasa-gibs', name: 'NASA GIBS', category: 'Imagery' },\n { id: 'openrailwaymap', name: 'OpenRailwayMap', category: 'Transport' },\n { id: 'opentopomap', name: 'OpenTopoMap', category: 'Terrain' },\n { id: 'openfreemap', name: 'OpenFreeMap', category: 'Vector Styles' },\n { id: 'swisstopo', name: 'Swiss Federal Geoportal', category: 'Regional' },\n { id: 'topplusopen', name: 'TopPlusOpen', category: 'Regional' },\n { id: 'usgs', name: 'USGS', category: 'United States' },\n { id: 'waymarkedtrails', name: 'Waymarked Trails', category: 'Outdoor' },\n { id: 'nlmaps', name: 'nlmaps', category: 'Regional' },\n];\n\nfunction rasterBasemap({\n id,\n name,\n provider,\n category,\n description,\n attribution,\n tiles,\n maxzoom = 19,\n tags = [],\n}: Omit<BasemapDefinition, 'type' | 'source'> & {\n tiles: string[];\n maxzoom?: number;\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 },\n tags,\n };\n}\n\nconst CARTO_ATTRIBUTION = '&copy; OpenStreetMap contributors &copy; CARTO';\nconst ESRI_ATTRIBUTION = 'Tiles &copy; Esri and the GIS User Community';\nconst OSM_ATTRIBUTION = '&copy; OpenStreetMap contributors';\nconst OPENFREEMAP_ATTRIBUTION = 'OpenFreeMap &copy; OpenMapTiles Data from OpenStreetMap';\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 rasterBasemap({\n id: 'google-maps',\n name: 'Google Maps',\n provider: 'google',\n category: 'Street',\n description: 'Google road map tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'street'],\n }),\n rasterBasemap({\n id: 'google-satellite',\n name: 'Google Satellite',\n provider: 'google',\n category: 'Imagery',\n description: 'Google satellite tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'satellite', 'imagery'],\n }),\n rasterBasemap({\n id: 'google-terrain',\n name: 'Google Terrain',\n provider: 'google',\n category: 'Terrain',\n description: 'Google terrain tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=p&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'terrain'],\n }),\n rasterBasemap({\n id: 'google-hybrid',\n name: 'Google Hybrid',\n provider: 'google',\n category: 'Imagery',\n description: 'Google hybrid imagery tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'hybrid', 'imagery'],\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: ['https://a.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png'],\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: ['https://a.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png'],\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: ['https://a.basemaps.cartocdn.com/rastertiles/voyager_only_labels/{z}/{x}/{y}.png'],\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: ['https://a.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png'],\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: '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-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 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: '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: 'opentopomap',\n name: 'OpenTopoMap',\n provider: 'opentopomap',\n category: 'Terrain',\n description: 'Topographic map with relief and contour styling.',\n attribution: '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 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 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: 'waymarkedtrails-hiking',\n name: 'Waymarked Trails Hiking',\n provider: 'waymarkedtrails',\n category: 'Outdoor',\n description: 'Hiking routes from Waymarked Trails.',\n attribution: '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: '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: '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: '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: 'nlmaps-standaard',\n name: 'nlmaps Standaard',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands standard background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/standaard/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional'],\n }),\n rasterBasemap({\n id: 'nlmaps-grijs',\n name: 'nlmaps Grijs',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands grey background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/grijs/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional', 'grey'],\n }),\n rasterBasemap({\n id: 'nlmaps-pastel',\n name: 'nlmaps Pastel',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands pastel background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/pastel/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional', 'pastel'],\n }),\n rasterBasemap({\n id: 'nlmaps-water',\n name: 'nlmaps Water',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands water-focused background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/water/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional', 'water'],\n }),\n rasterBasemap({\n id: 'nlmaps-luchtfoto',\n name: 'nlmaps Luchtfoto',\n provider: 'nlmaps',\n category: 'Imagery',\n description: 'Netherlands aerial photography.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/hwh/luchtfotorgb/wmts/v1_0/Actueel_ortho25/EPSG:3857/{z}/{x}/{y}.jpeg',\n ],\n tags: ['netherlands', 'imagery', 'aerial'],\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];\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 [...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) => byId.set(provider.id, provider));\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, { id: basemap.provider, name: basemap.provider });\n }\n });\n return [...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 [...new Set(basemaps.map((basemap) => basemap.category).filter(Boolean) as string[])].sort();\n}\n","import type {\n IControl,\n LayerSpecification,\n Map as MapLibreMap,\n SourceSpecification,\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 ManagedRasterBasemap,\n} from './types';\n\nconst DEFAULT_OPTIONS: Required<\n Pick<\n BasemapControlOptions,\n 'collapsed' | 'position' | 'title' | 'panelWidth' | 'className' | 'includeDefaultBasemaps'\n >\n> = {\n collapsed: true,\n position: 'top-right',\n title: 'Basemaps',\n panelWidth: 340,\n className: '',\n includeDefaultBasemaps: true,\n};\n\nconst CONTROL_SOURCE_PREFIX = 'maplibre-basemap-control-source';\nconst CONTROL_LAYER_PREFIX = '';\n\ntype EventHandlersMap = globalThis.Map<BasemapControlEvent, Set<BasemapControlEventHandler>>;\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' | 'position' | 'title' | 'panelWidth' | 'className' | 'includeDefaultBasemaps'\n >\n > &\n Omit<\n BasemapControlOptions,\n 'collapsed' | 'position' | 'title' | 'panelWidth' | 'className' | 'includeDefaultBasemaps'\n >;\n private _state: BasemapControlState;\n private _basemaps: BasemapDefinition[];\n private _providers: BasemapProvider[];\n private _eventHandlers: EventHandlersMap = new globalThis.Map();\n private _managedSourceIds: string[] = [];\n private _managedLayerIds: string[] = [];\n private _resizeHandler: (() => void) | null = null;\n private _mapResizeHandler: (() => void) | null = null;\n private _clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(options?: BasemapControlOptions) {\n this._options = { ...DEFAULT_OPTIONS, ...options };\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 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 this._selectBasemap(this._state.activeBasemapId);\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 if (this._clickOutsideHandler) {\n document.removeEventListener('click', this._clickOutsideHandler);\n this._clickOutsideHandler = null;\n }\n\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._renderContent();\n this._emit({ type: 'statechange', state: this.getState() });\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 if (\n this._state.activeBasemapId &&\n !this._basemaps.some((basemap) => basemap.id === this._state.activeBasemapId)\n ) {\n this._state = { ...this._state, activeBasemapId: undefined };\n }\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 async setBasemap(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 setting a basemap.');\n this._handleError(error, basemap);\n throw error;\n }\n\n this._state = { ...this._state, loading: true, error: undefined };\n this._renderContent();\n this._emit({ type: 'statechange', state: this.getState() });\n\n try {\n let managedRaster: ManagedRasterBasemap | undefined;\n if (basemap.source.type === 'raster') {\n await this._waitForStyleReady();\n this._removeManagedBasemap();\n managedRaster = this._addRasterBasemap(basemap);\n } else {\n this._removeManagedBasemap();\n this._map.setStyle(basemap.source.url);\n }\n\n this._applyBasemapView(basemap);\n\n this._state = {\n ...this._state,\n activeBasemapId: basemap.id,\n loading: false,\n error: undefined,\n };\n this._renderContent();\n this._emit({\n type: 'basemapchange',\n state: this.getState(),\n basemap,\n managedRaster,\n });\n this._emit({ type: 'statechange', state: this.getState() });\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n this._state = { ...this._state, loading: false, error: error.message };\n this._renderContent();\n this._handleError(error, basemap);\n throw error;\n }\n }\n\n // setBasemap rethrows after emitting the error event so callers that await\n // it can react. Internal fire-and-forget callers use this instead to avoid\n // unhandled promise rejections; the failure is still reported via `error`.\n private _selectBasemap(id: string): void {\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 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._options.panelWidth}px`;\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 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(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 return panel;\n }\n\n private _renderContent(): void {\n if (!this._content) return;\n\n const categories = getBasemapCategories(this._basemaps);\n const results = this._getFilteredBasemaps();\n\n this._content.replaceChildren(\n this._createSearchRow(),\n this._createFilterRow(this._providers, categories),\n this._createStatus(results.length),\n this._createResults(results),\n );\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 _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 this._state = { ...this._state, query: input.value };\n this._renderFilteredResults();\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 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 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._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.textContent = this._state.error;\n status.classList.add('is-error');\n } else {\n status.textContent = `${resultCount} basemap${resultCount === 1 ? '' : 's'}`;\n }\n return status;\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 (basemap.id === this._state.activeBasemapId) {\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 = basemap.type === 'raster' ? 'Raster' : '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 _addRasterBasemap(basemap: BasemapDefinition): ManagedRasterBasemap | undefined {\n if (!this._map || basemap.source.type !== 'raster') 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 const source: SourceSpecification = {\n type: 'raster',\n tiles: basemap.source.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 this._managedSourceIds = [sourceId];\n this._managedLayerIds = [layerId];\n\n return {\n sourceId,\n layerId,\n beforeId,\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 const done = () => {\n this._map?.off('load', done);\n this._map?.off('style.load', done);\n resolve();\n };\n this._map?.once('load', done);\n this._map?.once('style.load', done);\n });\n }\n\n private _removeManagedBasemap(): void {\n if (!this._map) return;\n\n [...this._managedLayerIds].reverse().forEach((layerId) => {\n if (this._map?.getLayer(layerId)) {\n this._map.removeLayer(layerId);\n }\n });\n [...this._managedSourceIds].reverse().forEach((sourceId) => {\n if (this._map?.getSource(sourceId)) {\n this._map.removeSource(sourceId);\n }\n });\n this._managedLayerIds = [];\n this._managedSourceIds = [];\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._clickOutsideHandler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n this._container &&\n this._panel &&\n !this._container.contains(target) &&\n !this._panel.contains(target)\n ) {\n this.collapse();\n }\n };\n document.addEventListener('click', this._clickOutsideHandler);\n\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"],"names":["_a","_b"],"mappings":";;;;AAEO,MAAM,4BAA+C;AAAA,EAC1D,EAAE,IAAI,iBAAiB,MAAM,iBAAiB,UAAU,YAAA;AAAA,EACxD,EAAE,IAAI,UAAU,MAAM,UAAU,UAAU,UAAA;AAAA,EAC1C,EAAE,IAAI,SAAS,MAAM,SAAS,UAAU,UAAA;AAAA,EACxC,EAAE,IAAI,WAAW,MAAM,WAAW,UAAU,UAAA;AAAA,EAC5C,EAAE,IAAI,QAAQ,MAAM,QAAQ,UAAU,UAAA;AAAA,EACtC,EAAE,IAAI,aAAa,MAAM,aAAa,UAAU,UAAA;AAAA,EAChD,EAAE,IAAI,kBAAkB,MAAM,kBAAkB,UAAU,YAAA;AAAA,EAC1D,EAAE,IAAI,eAAe,MAAM,eAAe,UAAU,UAAA;AAAA,EACpD,EAAE,IAAI,eAAe,MAAM,eAAe,UAAU,gBAAA;AAAA,EACpD,EAAE,IAAI,aAAa,MAAM,2BAA2B,UAAU,WAAA;AAAA,EAC9D,EAAE,IAAI,eAAe,MAAM,eAAe,UAAU,WAAA;AAAA,EACpD,EAAE,IAAI,QAAQ,MAAM,QAAQ,UAAU,gBAAA;AAAA,EACtC,EAAE,IAAI,mBAAmB,MAAM,oBAAoB,UAAU,UAAA;AAAA,EAC7D,EAAE,IAAI,UAAU,MAAM,UAAU,UAAU,WAAA;AAC5C;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO,CAAA;AACT,GAGsB;AACpB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IAAA;AAAA,IAEF;AAAA,EAAA;AAEJ;AAEA,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACxB,MAAM,0BAA0B;AAEzB,MAAM,mBAAwC;AAAA,EACnD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,OAAO,UAAU,UAAU;AAAA,EAAA,CACnC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa,GAAG,eAAe;AAAA,IAC/B,OAAO,CAAC,qDAAqD;AAAA,IAC7D,MAAM,CAAC,OAAO,OAAO,cAAc;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,+CAA+C;AAAA,IACvD,MAAM,CAAC,OAAO,WAAW,UAAU;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,iDAAiD;AAAA,IACzD,MAAM,CAAC,OAAO,eAAe,UAAU;AAAA,EAAA,CACxC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,oDAAoD;AAAA,IAC5D,SAAS;AAAA,IACT,MAAM,CAAC,UAAU,QAAQ;AAAA,EAAA,CAC1B;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,oDAAoD;AAAA,IAC5D,SAAS;AAAA,IACT,MAAM,CAAC,UAAU,aAAa,SAAS;AAAA,EAAA,CACxC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,oDAAoD;AAAA,IAC5D,SAAS;AAAA,IACT,MAAM,CAAC,UAAU,SAAS;AAAA,EAAA,CAC3B;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,oDAAoD;AAAA,IAC5D,SAAS;AAAA,IACT,MAAM,CAAC,UAAU,UAAU,SAAS;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,SAAS,UAAU;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,gEAAgE;AAAA,IACxE,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,SAAS,WAAW;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,mEAAmE;AAAA,IAC3E,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,QAAQ;AAAA,EAAA,CACzB;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,QAAQ,QAAQ;AAAA,EAAA,CACjC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,+DAA+D;AAAA,IACvE,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,QAAQ,WAAW;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,kEAAkE;AAAA,IAC1E,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,QAAQ,QAAQ;AAAA,EAAA,CACjC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,UAAU,SAAS;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,8EAA8E;AAAA,IACtF,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,WAAW,WAAW;AAAA,EAAA,CACvC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,iFAAiF;AAAA,IACzF,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,WAAW,QAAQ;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,kFAAkF;AAAA,IAC1F,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,WAAW,QAAQ;AAAA,EAAA,CACpC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,iEAAiE;AAAA,IACzE,MAAM,CAAC,WAAW,KAAK;AAAA,EAAA,CACxB;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,aAAa,SAAS;AAAA,EAAA,CACtC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,eAAe,SAAS;AAAA,EAAA,CACxC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,QAAQ;AAAA,EAAA,CACxB;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,QAAQ,QAAQ;AAAA,EAAA,CAChC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,QAAQ;AAAA,EAAA,CACxB;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,SAAS,QAAQ;AAAA,EAAA,CACjC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,YAAY,SAAS;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,UAAU,SAAS;AAAA,EAAA,CACnC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,SAAS;AAAA,EAAA,CACzB;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,QAAQ,aAAa;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,QAAQ,UAAU,SAAS;AAAA,EAAA,CAC3C;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,QAAQ,SAAS,YAAY;AAAA,EAAA,CAC7C;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,QAAQ,QAAQ,SAAS,OAAO;AAAA,EAAA,CACxC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,6DAA6D;AAAA,IACrE,MAAM,CAAC,QAAQ,aAAa,KAAK;AAAA,EAAA,CAClC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,gDAAgD;AAAA,IACxD,SAAS;AAAA,IACT,MAAM,CAAC,WAAW,QAAQ,QAAQ;AAAA,EAAA,CACnC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,eAAe,UAAU;AAAA,EAAA,CACjC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,eAAe,YAAY,MAAM;AAAA,EAAA,CACzC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,eAAe,SAAS;AAAA,EAAA,CAChC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,WAAW,UAAU;AAAA,EAAA,CAC7B;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,IACT,MAAM,CAAC,WAAW,YAAY,MAAM;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,WAAW,eAAe;AAAA,EAAA,CAC1C;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,WAAW,QAAQ,eAAe;AAAA,EAAA,CAClD;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,QAAQ,QAAQ,eAAe;AAAA,EAAA,CACvC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,yDAAyD;AAAA,IACjE,MAAM,CAAC,UAAU,WAAW,QAAQ;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,0DAA0D;AAAA,IAClE,MAAM,CAAC,WAAW,WAAW,QAAQ;AAAA,EAAA,CACtC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,sDAAsD;AAAA,IAC9D,MAAM,CAAC,OAAO,WAAW,QAAQ;AAAA,EAAA,CAClC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,CAAC,yDAAyD;AAAA,IACjE,MAAM,CAAC,UAAU,WAAW,QAAQ;AAAA,EAAA,CACrC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,eAAe,UAAU;AAAA,EAAA,CACjC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,eAAe,YAAY,MAAM;AAAA,EAAA,CACzC;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,eAAe,YAAY,QAAQ;AAAA,EAAA,CAC3C;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,eAAe,YAAY,OAAO;AAAA,EAAA,CAC1C;AAAA,EACD,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,MACL;AAAA,IAAA;AAAA,IAEF,MAAM,CAAC,eAAe,WAAW,QAAQ;AAAA,EAAA,CAC1C;AAAA,EACD;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM,CAAC,eAAe,UAAU,SAAS,YAAY,OAAO;AAAA,EAAA;AAAA,EAE9D;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM,CAAC,eAAe,UAAU,SAAS,UAAU,QAAQ;AAAA,EAAA;AAAA,EAE7D;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM,CAAC,eAAe,UAAU,OAAO;AAAA,EAAA;AAAA,EAEzC;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM,CAAC,eAAe,UAAU,SAAS,MAAM;AAAA,EAAA;AAAA,EAEjD;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM,CAAC,eAAe,UAAU,SAAS,SAAS,MAAM;AAAA,EAAA;AAAA,EAE1D;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,IAAA;AAAA,IAEP,MAAM;AAAA,MACJ,QAAQ,CAAC,QAAQ,MAAM;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,IAAA;AAAA,IAET,MAAM,CAAC,eAAe,UAAU,SAAS,MAAM,SAAS;AAAA,EAAA;AAE5D;AAEO,SAAS,iBACd,UACA,SAA4B,IACT;AACnB,QAAM,2BAAW,IAAA;AACjB,WAAS,QAAQ,CAAC,aAAa,KAAK,IAAI,SAAS,IAAI,QAAQ,CAAC;AAC9D,SAAO,QAAQ,CAAC,aAAa,KAAK,IAAI,SAAS,IAAI,QAAQ,CAAC;AAC5D,SAAO,CAAC,GAAG,KAAK,QAAQ;AAC1B;AAEO,SAAS,wBACd,UACA,kBAAqC,CAAA,GACrC,0BAA0B,MACP;AACnB,QAAM,2BAAW,IAAA;AACjB,MAAI,yBAAyB;AAC3B,8BAA0B,QAAQ,CAAC,aAAa,KAAK,IAAI,SAAS,IAAI,QAAQ,CAAC;AAAA,EACjF;AACA,kBAAgB,QAAQ,CAAC,aAAa,KAAK,IAAI,SAAS,IAAI,QAAQ,CAAC;AAGrE,WAAS,QAAQ,CAAC,YAAY;AAC5B,QAAI,QAAQ,YAAY,CAAC,KAAK,IAAI,QAAQ,QAAQ,GAAG;AACnD,WAAK,IAAI,QAAQ,UAAU,EAAE,IAAI,QAAQ,UAAU,MAAM,QAAQ,SAAA,CAAU;AAAA,IAC7E;AAAA,EACF,CAAC;AACD,SAAO,CAAC,GAAG,KAAK,QAAQ;AAC1B;AAEO,SAAS,qBACd,iBAAsC,IACtC,yBAAyB,MACJ;AACrB,QAAM,WAAW,yBACb,CAAC,GAAG,kBAAkB,GAAG,cAAc,IACvC,CAAC,GAAG,cAAc;AACtB,QAAM,2BAAW,IAAA;AACjB,WAAS,QAAQ,CAAC,YAAY,KAAK,IAAI,QAAQ,IAAI,OAAO,CAAC;AAC3D,SAAO,CAAC,GAAG,KAAK,QAAQ;AAC1B;AAQO,SAAS,eACd,UACA,QACqB;;AACrB,QAAM,UAAQ,YAAO,UAAP,mBAAc,OAAO,kBAAiB;AAEpD,SAAO,SAAS,OAAO,CAAC,YAAY;AAClC,QAAI,OAAO,YAAY,QAAQ,aAAa,OAAO,SAAU,QAAO;AACpE,QAAI,OAAO,YAAY,QAAQ,aAAa,OAAO,SAAU,QAAO;AACpE,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,WAAW;AAAA,MACf,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,GAAI,QAAQ,QAAQ,CAAA;AAAA,IAAC,EAEpB,OAAO,OAAO,EACd,KAAK,GAAG,EACR,YAAA;AAEH,WAAO,SAAS,SAAS,KAAK;AAAA,EAChC,CAAC;AACH;AAEO,SAAS,qBAAqB,UAAyC;AAC5E,SAAO,CAAC,GAAG,IAAI,IAAI,SAAS,IAAI,CAAC,YAAY,QAAQ,QAAQ,EAAE,OAAO,OAAO,CAAa,CAAC,EAAE,KAAA;AAC/F;ACvyBA,MAAM,kBAKF;AAAA,EACF,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,wBAAwB;AAC1B;AAEA,MAAM,wBAAwB;AAC9B,MAAM,uBAAuB;AAItB,MAAM,eAAmC;AAAA,EA0B9C,YAAY,SAAiC;AAzBrC;AACA;AACA;AACA;AACA;AACA;AAUA;AACA;AACA;AACA,0CAAmC,IAAI,WAAW,IAAA;AAClD,6CAA8B,CAAA;AAC9B,4CAA6B,CAAA;AAC7B,0CAAsC;AACtC,6CAAyC;AACzC,gDAAyD;AAG/D,SAAK,WAAW,EAAE,GAAG,iBAAiB,GAAG,QAAA;AACzC,SAAK,YAAY;AAAA,MACf,mCAAS;AAAA,MACT,KAAK,SAAS;AAAA,IAAA;AAEhB,SAAK,aAAa;AAAA,MAChB,KAAK;AAAA,MACL,mCAAS;AAAA,MACT,KAAK,SAAS;AAAA,IAAA;AAEhB,SAAK,SAAS;AAAA,MACZ,WAAW,KAAK,SAAS;AAAA,MACzB,YAAY,KAAK,SAAS;AAAA,MAC1B,iBAAiB,KAAK,SAAS;AAAA,MAC/B,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,UAAU;AAAA,MACV,SAAS;AAAA,IAAA;AAAA,EAEb;AAAA,EAEA,MAAM,KAA+B;AACnC,SAAK,OAAO;AACZ,SAAK,gBAAgB,IAAI,aAAA;AACzB,SAAK,aAAa,KAAK,iBAAA;AACvB,SAAK,SAAS,KAAK,aAAA;AACnB,SAAK,cAAc,YAAY,KAAK,MAAM;AAC1C,SAAK,qBAAA;AAEL,QAAI,CAAC,KAAK,OAAO,WAAW;AAC1B,WAAK,OAAO,UAAU,IAAI,UAAU;AACpC,4BAAsB,MAAM,KAAK,sBAAsB;AAAA,IACzD;AAEA,SAAK,eAAA;AAEL,QAAI,KAAK,OAAO,iBAAiB;AAC/B,WAAK,eAAe,KAAK,OAAO,eAAe;AAAA,IACjD;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAiB;;AACf,QAAI,KAAK,gBAAgB;AACvB,aAAO,oBAAoB,UAAU,KAAK,cAAc;AACxD,WAAK,iBAAiB;AAAA,IACxB;AACA,QAAI,KAAK,qBAAqB,KAAK,MAAM;AACvC,WAAK,KAAK,IAAI,UAAU,KAAK,iBAAiB;AAC9C,WAAK,oBAAoB;AAAA,IAC3B;AACA,QAAI,KAAK,sBAAsB;AAC7B,eAAS,oBAAoB,SAAS,KAAK,oBAAoB;AAC/D,WAAK,uBAAuB;AAAA,IAC9B;AAEA,qBAAK,WAAL,mBAAa,eAAb,mBAAyB,YAAY,KAAK;AAC1C,qBAAK,eAAL,mBAAiB,eAAjB,mBAA6B,YAAY,KAAK;AAE9C,SAAK,OAAO;AACZ,SAAK,gBAAgB;AACrB,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,eAAe,MAAA;AAAA,EACtB;AAAA,EAEA,WAAgC;AAC9B,WAAO,EAAE,GAAG,KAAK,OAAA;AAAA,EACnB;AAAA,EAEA,SAAS,UAA8C;AACrD,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,SAAA;AACnC,SAAK,eAAA;AACL,SAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,EAC5D;AAAA,EAEA,cAAmC;AACjC,WAAO,CAAC,GAAG,KAAK,SAAS;AAAA,EAC3B;AAAA,EAEA,YAAY,UAAqC;AAC/C,SAAK,YAAY,CAAC,GAAG,QAAQ;AAC7B,SAAK,aAAa;AAAA,MAChB,KAAK;AAAA,MACL,KAAK,SAAS;AAAA,MACd,KAAK,SAAS;AAAA,IAAA;AAEhB,QACE,KAAK,OAAO,mBACZ,CAAC,KAAK,UAAU,KAAK,CAAC,YAAY,QAAQ,OAAO,KAAK,OAAO,eAAe,GAC5E;AACA,WAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,iBAAiB,OAAA;AAAA,IACnD;AACA,SAAK,eAAA;AACL,SAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,EAC5D;AAAA,EAEA,mBAAkD;AAChD,WAAO,KAAK,UAAU,KAAK,CAAC,YAAY,QAAQ,OAAO,KAAK,OAAO,eAAe;AAAA,EACpF;AAAA,EAEA,MAAM,WAAW,IAA2B;AAC1C,UAAM,UAAU,KAAK,UAAU,KAAK,CAAC,cAAc,UAAU,OAAO,EAAE;AACtE,QAAI,CAAC,SAAS;AACZ,YAAM,QAAQ,IAAI,MAAM,YAAY,EAAE,kBAAkB;AACxD,WAAK,aAAa,KAAK;AACvB,YAAM;AAAA,IACR;AACA,QAAI,CAAC,KAAK,MAAM;AACd,YAAM,QAAQ,IAAI,MAAM,iEAAiE;AACzF,WAAK,aAAa,OAAO,OAAO;AAChC,YAAM;AAAA,IACR;AAEA,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,SAAS,MAAM,OAAO,OAAA;AACtD,SAAK,eAAA;AACL,SAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAE1D,QAAI;AACF,UAAI;AACJ,UAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,cAAM,KAAK,mBAAA;AACX,aAAK,sBAAA;AACL,wBAAgB,KAAK,kBAAkB,OAAO;AAAA,MAChD,OAAO;AACL,aAAK,sBAAA;AACL,aAAK,KAAK,SAAS,QAAQ,OAAO,GAAG;AAAA,MACvC;AAEA,WAAK,kBAAkB,OAAO;AAE9B,WAAK,SAAS;AAAA,QACZ,GAAG,KAAK;AAAA,QACR,iBAAiB,QAAQ;AAAA,QACzB,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAET,WAAK,eAAA;AACL,WAAK,MAAM;AAAA,QACT,MAAM;AAAA,QACN,OAAO,KAAK,SAAA;AAAA,QACZ;AAAA,QACA;AAAA,MAAA,CACD;AACD,WAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,IAC5D,SAAS,OAAO;AACd,YAAM,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACtE,WAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,SAAS,OAAO,OAAO,MAAM,QAAA;AAC7D,WAAK,eAAA;AACL,WAAK,aAAa,OAAO,OAAO;AAChC,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,IAAkB;AACvC,SAAK,WAAW,EAAE,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACpC;AAAA,EAEA,SAAe;AACb,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,WAAW,CAAC,KAAK,OAAO,UAAA;AAExD,QAAI,KAAK,QAAQ;AACf,UAAI,KAAK,OAAO,WAAW;AACzB,aAAK,OAAO,UAAU,OAAO,UAAU;AACvC,aAAK,MAAM,EAAE,MAAM,YAAY,OAAO,KAAK,SAAA,GAAY;AAAA,MACzD,OAAO;AACL,aAAK,OAAO,UAAU,IAAI,UAAU;AACpC,aAAK,qBAAA;AACL,aAAK,MAAM,EAAE,MAAM,UAAU,OAAO,KAAK,SAAA,GAAY;AAAA,MACvD;AAAA,IACF;AAEA,SAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,EAC5D;AAAA,EAEA,SAAe;AACb,QAAI,KAAK,OAAO,UAAW,MAAK,OAAA;AAAA,EAClC;AAAA,EAEA,WAAiB;AACf,QAAI,CAAC,KAAK,OAAO,gBAAgB,OAAA;AAAA,EACnC;AAAA,EAEA,GAAG,OAA4B,SAA2C;AACxE,QAAI,CAAC,KAAK,eAAe,IAAI,KAAK,GAAG;AACnC,WAAK,eAAe,IAAI,OAAO,oBAAI,KAAK;AAAA,IAC1C;AACA,SAAK,eAAe,IAAI,KAAK,EAAG,IAAI,OAAO;AAAA,EAC7C;AAAA,EAEA,IAAI,OAA4B,SAA2C;;AACzE,eAAK,eAAe,IAAI,KAAK,MAA7B,mBAAgC,OAAO;AAAA,EACzC;AAAA,EAEA,SAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAAwC;AACtC,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,MAAM,OAAwD;;AACpE,eAAK,eAAe,IAAI,MAAM,IAAI,MAAlC,mBAAqC,QAAQ,CAAC,YAAY,QAAQ,KAAK;AAAA,EACzE;AAAA,EAEQ,aAAa,OAAc,SAAmC;AACpE,SAAK,MAAM,EAAE,MAAM,SAAS,OAAO,KAAK,SAAA,GAAY,OAAO,SAAS;AACpE,SAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,EAC5D;AAAA,EAEQ,mBAAgC;AACtC,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,YAAY,wDACpB,KAAK,SAAS,YAAY,IAAI,KAAK,SAAS,SAAS,KAAK,EAC5D;AAEA,UAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,cAAU,YAAY;AACtB,cAAU,OAAO;AACjB,cAAU,QAAQ,KAAK,SAAS;AAChC,cAAU,aAAa,cAAc,KAAK,SAAS,KAAK;AACxD,cAAU,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAStB,cAAU,iBAAiB,SAAS,MAAM,KAAK,QAAQ;AACvD,cAAU,YAAY,SAAS;AAE/B,WAAO;AAAA,EACT;AAAA,EAEQ,eAA4B;AAClC,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,UAAM,MAAM,QAAQ,GAAG,KAAK,SAAS,UAAU;AAE/C,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AAEnB,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,YAAY;AAClB,UAAM,cAAc,KAAK,SAAS;AAElC,UAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,aAAS,YAAY;AACrB,aAAS,OAAO;AAChB,aAAS,aAAa,cAAc,qBAAqB;AACzD,aAAS,YAAY;AACrB,aAAS,iBAAiB,SAAS,MAAM,KAAK,UAAU;AAExD,WAAO,YAAY,KAAK;AACxB,WAAO,YAAY,QAAQ;AAE3B,SAAK,WAAW,SAAS,cAAc,KAAK;AAC5C,SAAK,SAAS,YAAY;AAE1B,UAAM,YAAY,MAAM;AACxB,UAAM,YAAY,KAAK,QAAQ;AAE/B,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,CAAC,KAAK,SAAU;AAEpB,UAAM,aAAa,qBAAqB,KAAK,SAAS;AACtD,UAAM,UAAU,KAAK,qBAAA;AAErB,SAAK,SAAS;AAAA,MACZ,KAAK,iBAAA;AAAA,MACL,KAAK,iBAAiB,KAAK,YAAY,UAAU;AAAA,MACjD,KAAK,cAAc,QAAQ,MAAM;AAAA,MACjC,KAAK,eAAe,OAAO;AAAA,IAAA;AAAA,EAE/B;AAAA,EAEQ,yBAA+B;;AACrC,QAAI,CAAC,KAAK,SAAU;AAEpB,UAAM,UAAU,KAAK,qBAAA;AACrB,eAAK,SAAS,cAAc,yBAAyB,MAArD,mBAAwD;AAAA,MACtD,KAAK,cAAc,QAAQ,MAAM;AAAA;AAEnC,eAAK,SAAS,cAAc,0BAA0B,MAAtD,mBAAyD;AAAA,MACvD,KAAK,eAAe,OAAO;AAAA;AAAA,EAE/B;AAAA,EAEQ,uBAA4C;AAClD,WAAO,eAAe,KAAK,WAAW;AAAA,MACpC,OAAO,KAAK,OAAO;AAAA,MACnB,UAAU,KAAK,OAAO;AAAA,MACtB,UAAU,KAAK,OAAO;AAAA,IAAA,CACvB;AAAA,EACH;AAAA,EAEQ,mBAAgC;AACtC,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY;AAChB,QAAI,YAAY,KAAK,oBAAoB;AACzC,QAAI,YAAY,KAAK,sBAAsB;AAC3C,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAkC;AACxC,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AAEpB,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,YAAY;AAClB,UAAM,OAAO;AACb,UAAM,cAAc;AACpB,UAAM,QAAQ,KAAK,OAAO;AAC1B,UAAM,aAAa,cAAc,iBAAiB;AAClD,UAAM,iBAAiB,SAAS,MAAM;AACpC,WAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,OAAO,MAAM,MAAA;AAC7C,WAAK,uBAAA;AACL,WAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,IAC5D,CAAC;AAED,YAAQ,YAAY,KAAK;AACzB,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAoC;AAC1C,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AAEpB,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,YAAY;AAClB,UAAM,OAAO;AACb,UAAM,cAAc;AACpB,UAAM,QAAQ,KAAK,OAAO;AAC1B,UAAM,aAAa,cAAc,WAAW;AAC5C,UAAM,iBAAiB,SAAS,MAAM;AACpC,WAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,UAAU,MAAM,MAAA;AAChD,WAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,IAC5D,CAAC;AAED,YAAQ,YAAY,KAAK;AACzB,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,WAA8B,YAAmC;AACxF,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY;AAChB,QAAI;AAAA,MACF,KAAK;AAAA,QACH;AAAA,QACA,KAAK,OAAO;AAAA,QACZ,UAAU,IAAI,CAAC,cAAc,EAAE,OAAO,SAAS,IAAI,OAAO,SAAS,KAAA,EAAO;AAAA,QAC1E,CAAC,UAAU;AACT,eAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,gBAAgB,MAAA;AAChD,eAAK,eAAA;AACL,eAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,QAC5D;AAAA,MAAA;AAAA,IACF;AAEF,QAAI;AAAA,MACF,KAAK;AAAA,QACH;AAAA,QACA,KAAK,OAAO;AAAA,QACZ,WAAW,IAAI,CAAC,cAAc,EAAE,OAAO,UAAU,OAAO,SAAA,EAAW;AAAA,QACnE,CAAC,UAAU;AACT,eAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,gBAAgB,MAAA;AAChD,eAAK,eAAA;AACL,eAAK,MAAM,EAAE,MAAM,eAAe,OAAO,KAAK,SAAA,GAAY;AAAA,QAC5D;AAAA,MAAA;AAAA,IACF;AAEF,WAAO;AAAA,EACT;AAAA,EAEQ,cACN,OACA,OACA,SACA,UACa;AACb,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,YAAY;AACnB,WAAO,aAAa,cAAc,KAAK;AAEvC,UAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,QAAI,QAAQ;AACZ,QAAI,cAAc,OAAO,MAAM,YAAA,CAAa;AAC5C,WAAO,YAAY,GAAG;AAEtB,YAAQ,QAAQ,CAAC,WAAW;AAC1B,YAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,cAAQ,QAAQ,OAAO;AACvB,cAAQ,cAAc,OAAO;AAC7B,aAAO,YAAY,OAAO;AAAA,IAC5B,CAAC;AAED,WAAO,QAAQ;AACf,WAAO,iBAAiB,UAAU,MAAM,SAAS,OAAO,KAAK,CAAC;AAC9D,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,aAAkC;AACtD,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,QAAI,KAAK,OAAO,SAAS;AACvB,aAAO,cAAc;AAAA,IACvB,WAAW,KAAK,OAAO,OAAO;AAC5B,aAAO,cAAc,KAAK,OAAO;AACjC,aAAO,UAAU,IAAI,UAAU;AAAA,IACjC,OAAO;AACL,aAAO,cAAc,GAAG,WAAW,WAAW,gBAAgB,IAAI,KAAK,GAAG;AAAA,IAC5E;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,SAA2C;AAChE,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AAEjB,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,cAAc;AACpB,WAAK,YAAY,KAAK;AACtB,aAAO;AAAA,IACT;AAEA,YAAQ,QAAQ,CAAC,YAAY;AAC3B,YAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,UAAI,OAAO;AACX,UAAI,YAAY;AAChB,UAAI,QAAQ,YAAY,QAAQ;AAChC,UAAI,QAAQ,OAAO,KAAK,OAAO,iBAAiB;AAC9C,YAAI,UAAU,IAAI,WAAW;AAC7B,YAAI,aAAa,gBAAgB,MAAM;AAAA,MACzC;AACA,UAAI,WAAW,KAAK,OAAO;AAC3B,UAAI,iBAAiB,SAAS,MAAM;AAClC,aAAK,eAAe,QAAQ,EAAE;AAAA,MAChC,CAAC;AAED,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,YAAY;AAEjB,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,YAAY;AACjB,WAAK,cAAc,QAAQ;AAE3B,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,YAAY;AACjB,WAAK,cAAc,KAAK,mBAAmB,OAAO;AAElD,WAAK,YAAY,IAAI;AACrB,WAAK,YAAY,IAAI;AAErB,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,YAAY;AACjB,WAAK,cAAc,QAAQ,SAAS,WAAW,WAAW;AAE1D,UAAI,YAAY,IAAI;AACpB,UAAI,YAAY,IAAI;AAEpB,UAAI,QAAQ,aAAa;AACvB,cAAM,cAAc,SAAS,cAAc,MAAM;AACjD,oBAAY,YAAY;AACxB,oBAAY,cAAc,KAAK,WAAW,QAAQ,WAAW;AAC7D,YAAI,YAAY,WAAW;AAAA,MAC7B;AAEA,WAAK,YAAY,GAAG;AAAA,IACtB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,SAAoC;AAC7D,UAAM,WAAW,KAAK,WAAW,KAAK,CAAC,cAAc,UAAU,OAAO,QAAQ,QAAQ;AACtF,WAAO,EAAC,qCAAU,SAAQ,QAAQ,UAAU,QAAQ,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,EAC1F;AAAA,EAEQ,WAAW,OAAuB;AACxC,UAAM,WAAW,SAAS,cAAc,UAAU;AAClD,aAAS,YAAY;AACrB,WAAO,SAAS,QAAQ,eAAe;AAAA,EACzC;AAAA,EAEQ,kBAAkB,SAA8D;AACtF,QAAI,CAAC,KAAK,QAAQ,QAAQ,OAAO,SAAS,SAAU,QAAO;AAE3D,UAAM,WAAW,GAAG,qBAAqB,IAAI,QAAQ,EAAE;AACvD,UAAM,UAAU,CAAC,sBAAsB,QAAQ,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC3E,UAAM,WAAW,KAAK,0BAAA;AACtB,UAAM,SAA8B;AAAA,MAClC,MAAM;AAAA,MACN,OAAO,QAAQ,OAAO;AAAA,MACtB,UAAU,QAAQ,OAAO,YAAY;AAAA,MACrC,SAAS,QAAQ,OAAO;AAAA,MACxB,SAAS,QAAQ,OAAO;AAAA,MACxB,QAAQ,QAAQ,OAAO;AAAA,MACvB,aAAa,QAAQ;AAAA,IAAA;AAEvB,UAAM,QAA4B;AAAA,MAChC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ;AAAA,IAAA;AAGV,SAAK,KAAK,UAAU,UAAU,MAAM;AACpC,SAAK,KAAK,SAAS,OAAO,QAAQ;AAClC,SAAK,oBAAoB,CAAC,QAAQ;AAClC,SAAK,mBAAmB,CAAC,OAAO;AAEhC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,qBAAoC;AAC1C,QAAI,CAAC,KAAK,KAAM,QAAO,QAAQ,QAAA;AAC/B,QAAI,OAAO,KAAK,KAAK,kBAAkB,cAAc,KAAK,KAAK,iBAAiB;AAC9E,aAAO,QAAQ,QAAA;AAAA,IACjB;AAEA,WAAO,IAAI,QAAQ,CAAC,YAAY;;AAC9B,YAAM,OAAO,MAAM;;AACjB,SAAAA,MAAA,KAAK,SAAL,gBAAAA,IAAW,IAAI,QAAQ;AACvB,SAAAC,MAAA,KAAK,SAAL,gBAAAA,IAAW,IAAI,cAAc;AAC7B,gBAAA;AAAA,MACF;AACA,iBAAK,SAAL,mBAAW,KAAK,QAAQ;AACxB,iBAAK,SAAL,mBAAW,KAAK,cAAc;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEQ,wBAA8B;AACpC,QAAI,CAAC,KAAK,KAAM;AAEhB,KAAC,GAAG,KAAK,gBAAgB,EAAE,UAAU,QAAQ,CAAC,YAAY;;AACxD,WAAI,UAAK,SAAL,mBAAW,SAAS,UAAU;AAChC,aAAK,KAAK,YAAY,OAAO;AAAA,MAC/B;AAAA,IACF,CAAC;AACD,KAAC,GAAG,KAAK,iBAAiB,EAAE,UAAU,QAAQ,CAAC,aAAa;;AAC1D,WAAI,UAAK,SAAL,mBAAW,UAAU,WAAW;AAClC,aAAK,KAAK,aAAa,QAAQ;AAAA,MACjC;AAAA,IACF,CAAC;AACD,SAAK,mBAAmB,CAAA;AACxB,SAAK,oBAAoB,CAAA;AAAA,EAC3B;AAAA,EAEQ,kBAAkB,SAAkC;AAC1D,QAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,KAAM;AAEjC,SAAK,KAAK,OAAO;AAAA,MACf,QAAQ,QAAQ,KAAK;AAAA,MACrB,MAAM,QAAQ,KAAK;AAAA,MACnB,SAAS,QAAQ,KAAK;AAAA,MACtB,OAAO,QAAQ,KAAK;AAAA,IAAA,CACrB;AAAA,EACH;AAAA,EAEQ,4BAAgD;AACtD,UAAM,WAAW,KAAK,OAAO,SAAS,KAAA;AACtC,QAAI,CAAC,YAAY,SAAS,YAAA,MAAkB,OAAQ,QAAO;AAC3D,WAAO;AAAA,EACT;AAAA,EAEQ,uBAA6B;;AACnC,SAAK,uBAAuB,CAAC,MAAkB;AAC7C,YAAM,SAAS,EAAE;AACjB,UACE,KAAK,cACL,KAAK,UACL,CAAC,KAAK,WAAW,SAAS,MAAM,KAChC,CAAC,KAAK,OAAO,SAAS,MAAM,GAC5B;AACA,aAAK,SAAA;AAAA,MACP;AAAA,IACF;AACA,aAAS,iBAAiB,SAAS,KAAK,oBAAoB;AAE5D,SAAK,iBAAiB,MAAM;AAC1B,UAAI,CAAC,KAAK,OAAO,gBAAgB,qBAAA;AAAA,IACnC;AACA,WAAO,iBAAiB,UAAU,KAAK,cAAc;AAErD,SAAK,oBAAoB,MAAM;AAC7B,UAAI,CAAC,KAAK,OAAO,gBAAgB,qBAAA;AAAA,IACnC;AACA,eAAK,SAAL,mBAAW,GAAG,UAAU,KAAK;AAAA,EAC/B;AAAA,EAEQ,sBAA8C;;AACpD,UAAM,UAAS,UAAK,eAAL,mBAAiB;AAChC,QAAI,CAAC,OAAQ,QAAO,KAAK,SAAS;AAElC,QAAI,OAAO,UAAU,SAAS,0BAA0B,EAAG,QAAO;AAClE,QAAI,OAAO,UAAU,SAAS,2BAA2B,EAAG,QAAO;AACnE,QAAI,OAAO,UAAU,SAAS,6BAA6B,EAAG,QAAO;AACrE,QAAI,OAAO,UAAU,SAAS,8BAA8B,EAAG,QAAO;AAEtE,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEQ,uBAA6B;AACnC,QAAI,CAAC,KAAK,cAAc,CAAC,KAAK,UAAU,CAAC,KAAK,cAAe;AAE7D,UAAM,SAAS,KAAK,WAAW,cAAc,yBAAyB;AACtE,QAAI,CAAC,OAAQ;AAEb,UAAM,aAAa,OAAO,sBAAA;AAC1B,UAAM,UAAU,KAAK,cAAc,sBAAA;AACnC,UAAM,WAAW,KAAK,oBAAA;AACtB,UAAM,YAAY,WAAW,MAAM,QAAQ;AAC3C,UAAM,eAAe,QAAQ,SAAS,WAAW;AACjD,UAAM,aAAa,WAAW,OAAO,QAAQ;AAC7C,UAAM,cAAc,QAAQ,QAAQ,WAAW;AAC/C,UAAM,WAAW;AAEjB,SAAK,OAAO,MAAM,MAAM;AACxB,SAAK,OAAO,MAAM,SAAS;AAC3B,SAAK,OAAO,MAAM,OAAO;AACzB,SAAK,OAAO,MAAM,QAAQ;AAE1B,YAAQ,UAAA;AAAA,MACN,KAAK;AACH,aAAK,OAAO,MAAM,MAAM,GAAG,YAAY,WAAW,SAAS,QAAQ;AACnE,aAAK,OAAO,MAAM,OAAO,GAAG,UAAU;AACtC;AAAA,MACF,KAAK;AACH,aAAK,OAAO,MAAM,MAAM,GAAG,YAAY,WAAW,SAAS,QAAQ;AACnE,aAAK,OAAO,MAAM,QAAQ,GAAG,WAAW;AACxC;AAAA,MACF,KAAK;AACH,aAAK,OAAO,MAAM,SAAS,GAAG,eAAe,WAAW,SAAS,QAAQ;AACzE,aAAK,OAAO,MAAM,OAAO,GAAG,UAAU;AACtC;AAAA,MACF,KAAK;AACH,aAAK,OAAO,MAAM,SAAS,GAAG,eAAe,WAAW,SAAS,QAAQ;AACzE,aAAK,OAAO,MAAM,QAAQ,GAAG,WAAW;AACxC;AAAA,IAAA;AAAA,EAEN;AACF;;;;;;;;;"}
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const BasemapControl = require("./BasemapControl-B6fW3kYQ.cjs");
3
+ const BasemapControl = require("./BasemapControl-CMZxjxEY.cjs");
4
4
  function clamp(value, min, max) {
5
5
  return Math.min(Math.max(value, min), max);
6
6
  }
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { B, D, a, c, b, f, g, r } from "./BasemapControl-Bgd4nl0C.js";
1
+ import { B, D, a, c, b, f, g, r } from "./BasemapControl-BBPUTp-_.js";
2
2
  function clamp(value, min, max) {
3
3
  return Math.min(Math.max(value, min), max);
4
4
  }
@@ -4,6 +4,7 @@
4
4
  background: #fff;
5
5
  border-radius: 4px;
6
6
  box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1);
7
+ color-scheme: light;
7
8
  color: #1f2933;
8
9
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
9
10
  }
@@ -138,6 +139,11 @@
138
139
  outline: none;
139
140
  }
140
141
 
142
+ .basemap-control-select option {
143
+ background: #fff;
144
+ color: #111827;
145
+ }
146
+
141
147
  .basemap-control-input {
142
148
  height: 34px;
143
149
  padding: 7px 9px;
package/dist/react.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const react = require("react");
4
- const BasemapControl = require("./BasemapControl-B6fW3kYQ.cjs");
4
+ const BasemapControl = require("./BasemapControl-CMZxjxEY.cjs");
5
5
  function BasemapControlReact({
6
6
  map,
7
7
  onStateChange,
package/dist/react.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useRef, useMemo, useEffect, useState, useCallback } from "react";
2
- import { B as BasemapControl, b as createBasemapCatalog } from "./BasemapControl-Bgd4nl0C.js";
2
+ import { B as BasemapControl, b as createBasemapCatalog } from "./BasemapControl-BBPUTp-_.js";
3
3
  function BasemapControlReact({
4
4
  map,
5
5
  onStateChange,
@@ -1,5 +1,5 @@
1
1
  export { BasemapControl } from './lib/core/BasemapControl';
2
2
  export { DEFAULT_BASEMAPS, DEFAULT_BASEMAP_PROVIDERS, combineProviders, createBasemapCatalog, filterBasemaps, getBasemapCategories, resolveBasemapProviders, } from './lib/core/catalog';
3
- export type { BasemapChangeEvent, BasemapControlEvent, BasemapControlEventHandler, BasemapControlEventPayload, BasemapControlOptions, BasemapControlPosition, BasemapControlState, BasemapDefinition, BasemapErrorEvent, BasemapProvider, BasemapSourceType, RasterBasemapSource, StyleBasemapSource, } from './lib/core/types';
3
+ export type { BasemapChangeEvent, BasemapControlEvent, BasemapControlEventHandler, BasemapControlEventPayload, BasemapControlOptions, BasemapControlPosition, BasemapControlState, BasemapDefinition, BasemapErrorEvent, BasemapProvider, BasemapSourceType, ManagedRasterBasemap, RasterBasemapSource, StyleBasemapSource, } from './lib/core/types';
4
4
  export { clamp, formatNumericValue, generateId, debounce, throttle, classNames, } from './lib/utils';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"BasemapControl.d.ts","sourceRoot":"","sources":["../../../../src/lib/core/BasemapControl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAER,GAAG,IAAI,WAAW,EAEnB,MAAM,aAAa,CAAC;AAOrB,OAAO,KAAK,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EAErB,mBAAmB,EACnB,iBAAiB,EAElB,MAAM,SAAS,CAAC;AAqBjB,qBAAa,cAAe,YAAW,QAAQ;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAc;IAC3B,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAc;IAC/B,OAAO,CAAC,QAAQ,CASZ;IACJ,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,oBAAoB,CAA0C;gBAE1D,OAAO,CAAC,EAAE,qBAAqB;IAuB3C,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW;IAsBpC,QAAQ,IAAI,IAAI;IAyBhB,QAAQ,IAAI,mBAAmB;IAI/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAMtD,WAAW,IAAI,iBAAiB,EAAE;IAIlC,WAAW,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,IAAI;IAiBhD,gBAAgB,IAAI,iBAAiB,GAAG,SAAS;IAI3C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkD3C,OAAO,CAAC,cAAc;IAItB,MAAM,IAAI,IAAI;IAiBd,MAAM,IAAI,IAAI;IAId,QAAQ,IAAI,IAAI;IAIhB,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,0BAA0B,GAAG,IAAI;IAOzE,GAAG,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,0BAA0B,GAAG,IAAI;IAI1E,MAAM,IAAI,WAAW,GAAG,SAAS;IAIjC,YAAY,IAAI,WAAW,GAAG,SAAS;IAIvC,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,cAAc;IA4DtB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,yBAAyB;IAMjC,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,oBAAoB;CAuC7B"}
1
+ {"version":3,"file":"BasemapControl.d.ts","sourceRoot":"","sources":["../../../../src/lib/core/BasemapControl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAER,GAAG,IAAI,WAAW,EAEnB,MAAM,aAAa,CAAC;AAOrB,OAAO,KAAK,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EAErB,mBAAmB,EACnB,iBAAiB,EAGlB,MAAM,SAAS,CAAC;AAqBjB,qBAAa,cAAe,YAAW,QAAQ;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAc;IAC3B,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAc;IAC/B,OAAO,CAAC,QAAQ,CASZ;IACJ,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,oBAAoB,CAA0C;gBAE1D,OAAO,CAAC,EAAE,qBAAqB;IAuB3C,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW;IAsBpC,QAAQ,IAAI,IAAI;IAyBhB,QAAQ,IAAI,mBAAmB;IAI/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAMtD,WAAW,IAAI,iBAAiB,EAAE;IAIlC,WAAW,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,IAAI;IAiBhD,gBAAgB,IAAI,iBAAiB,GAAG,SAAS;IAI3C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwD3C,OAAO,CAAC,cAAc;IAItB,MAAM,IAAI,IAAI;IAiBd,MAAM,IAAI,IAAI;IAId,QAAQ,IAAI,IAAI;IAIhB,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,0BAA0B,GAAG,IAAI;IAOzE,GAAG,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,0BAA0B,GAAG,IAAI;IAI1E,MAAM,IAAI,WAAW,GAAG,SAAS;IAIjC,YAAY,IAAI,WAAW,GAAG,SAAS;IAIvC,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,cAAc;IA4DtB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,iBAAiB;IAiCzB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,yBAAyB;IAMjC,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,oBAAoB;CAuC7B"}
@@ -58,10 +58,16 @@ export interface BasemapControlState {
58
58
  loading: boolean;
59
59
  error?: string;
60
60
  }
61
+ export interface ManagedRasterBasemap {
62
+ sourceId: string;
63
+ layerId: string;
64
+ beforeId?: string;
65
+ }
61
66
  export interface BasemapChangeEvent {
62
67
  type: 'basemapchange';
63
68
  state: BasemapControlState;
64
69
  basemap: BasemapDefinition;
70
+ managedRaster?: ManagedRasterBasemap;
65
71
  }
66
72
  export interface BasemapErrorEvent {
67
73
  type: 'error';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,CAAC;AAEpE,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;AAE/F,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,GAAG,cAAc,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,mBAAmB,GAAG,kBAAkB,CAAC;IACjD,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,mBAAmB,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,CAAC;IAC5C,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAED,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG,eAAe,GAAG,OAAO,CAAC;AAExF,MAAM,MAAM,0BAA0B,GAClC,iBAAiB,GACjB,kBAAkB,GAClB,iBAAiB,CAAC;AAEtB,MAAM,MAAM,0BAA0B,GAAG,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;AAErF,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,GAAG,EAAE,GAAG,CAAC;IACT,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACrD,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACnF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC9D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "maplibre-gl-basemap-control",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "A MapLibre GL JS control for searching and switching public basemaps",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -1 +0,0 @@
1
- {"version":3,"file":"BasemapControl-B6fW3kYQ.cjs","sources":["../src/lib/core/catalog.ts","../src/lib/core/BasemapControl.ts"],"sourcesContent":["import type { BasemapDefinition, BasemapProvider } from './types';\n\nexport const DEFAULT_BASEMAP_PROVIDERS: BasemapProvider[] = [\n { id: 'openstreetmap', name: 'OpenStreetMap', category: 'Community' },\n { id: 'google', name: 'Google', category: 'General' },\n { id: 'carto', name: 'Carto', category: 'General' },\n { id: 'cyclosm', name: 'CyclOSM', category: 'Cycling' },\n { id: 'esri', name: 'ESRI', category: 'Imagery' },\n { id: 'nasa-gibs', name: 'NASA GIBS', category: 'Imagery' },\n { id: 'openrailwaymap', name: 'OpenRailwayMap', category: 'Transport' },\n { id: 'opentopomap', name: 'OpenTopoMap', category: 'Terrain' },\n { id: 'openfreemap', name: 'OpenFreeMap', category: 'Vector Styles' },\n { id: 'swisstopo', name: 'Swiss Federal Geoportal', category: 'Regional' },\n { id: 'topplusopen', name: 'TopPlusOpen', category: 'Regional' },\n { id: 'usgs', name: 'USGS', category: 'United States' },\n { id: 'waymarkedtrails', name: 'Waymarked Trails', category: 'Outdoor' },\n { id: 'nlmaps', name: 'nlmaps', category: 'Regional' },\n];\n\nfunction rasterBasemap({\n id,\n name,\n provider,\n category,\n description,\n attribution,\n tiles,\n maxzoom = 19,\n tags = [],\n}: Omit<BasemapDefinition, 'type' | 'source'> & {\n tiles: string[];\n maxzoom?: number;\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 },\n tags,\n };\n}\n\nconst CARTO_ATTRIBUTION = '&copy; OpenStreetMap contributors &copy; CARTO';\nconst ESRI_ATTRIBUTION = 'Tiles &copy; Esri and the GIS User Community';\nconst OSM_ATTRIBUTION = '&copy; OpenStreetMap contributors';\nconst OPENFREEMAP_ATTRIBUTION = 'OpenFreeMap &copy; OpenMapTiles Data from OpenStreetMap';\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 rasterBasemap({\n id: 'google-maps',\n name: 'Google Maps',\n provider: 'google',\n category: 'Street',\n description: 'Google road map tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'street'],\n }),\n rasterBasemap({\n id: 'google-satellite',\n name: 'Google Satellite',\n provider: 'google',\n category: 'Imagery',\n description: 'Google satellite tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'satellite', 'imagery'],\n }),\n rasterBasemap({\n id: 'google-terrain',\n name: 'Google Terrain',\n provider: 'google',\n category: 'Terrain',\n description: 'Google terrain tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=p&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'terrain'],\n }),\n rasterBasemap({\n id: 'google-hybrid',\n name: 'Google Hybrid',\n provider: 'google',\n category: 'Imagery',\n description: 'Google hybrid imagery tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'hybrid', 'imagery'],\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: ['https://a.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png'],\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: ['https://a.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png'],\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: ['https://a.basemaps.cartocdn.com/rastertiles/voyager_only_labels/{z}/{x}/{y}.png'],\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: ['https://a.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png'],\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: '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-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 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: '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: 'opentopomap',\n name: 'OpenTopoMap',\n provider: 'opentopomap',\n category: 'Terrain',\n description: 'Topographic map with relief and contour styling.',\n attribution: '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 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 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: 'waymarkedtrails-hiking',\n name: 'Waymarked Trails Hiking',\n provider: 'waymarkedtrails',\n category: 'Outdoor',\n description: 'Hiking routes from Waymarked Trails.',\n attribution: '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: '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: '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: '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: 'nlmaps-standaard',\n name: 'nlmaps Standaard',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands standard background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/standaard/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional'],\n }),\n rasterBasemap({\n id: 'nlmaps-grijs',\n name: 'nlmaps Grijs',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands grey background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/grijs/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional', 'grey'],\n }),\n rasterBasemap({\n id: 'nlmaps-pastel',\n name: 'nlmaps Pastel',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands pastel background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/pastel/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional', 'pastel'],\n }),\n rasterBasemap({\n id: 'nlmaps-water',\n name: 'nlmaps Water',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands water-focused background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/water/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional', 'water'],\n }),\n rasterBasemap({\n id: 'nlmaps-luchtfoto',\n name: 'nlmaps Luchtfoto',\n provider: 'nlmaps',\n category: 'Imagery',\n description: 'Netherlands aerial photography.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/hwh/luchtfotorgb/wmts/v1_0/Actueel_ortho25/EPSG:3857/{z}/{x}/{y}.jpeg',\n ],\n tags: ['netherlands', 'imagery', 'aerial'],\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];\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 [...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) => byId.set(provider.id, provider));\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, { id: basemap.provider, name: basemap.provider });\n }\n });\n return [...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 [...new Set(basemaps.map((basemap) => basemap.category).filter(Boolean) as string[])].sort();\n}\n","import type {\n IControl,\n LayerSpecification,\n Map as MapLibreMap,\n SourceSpecification,\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} from './types';\n\nconst DEFAULT_OPTIONS: Required<\n Pick<\n BasemapControlOptions,\n 'collapsed' | 'position' | 'title' | 'panelWidth' | 'className' | 'includeDefaultBasemaps'\n >\n> = {\n collapsed: true,\n position: 'top-right',\n title: 'Basemaps',\n panelWidth: 340,\n className: '',\n includeDefaultBasemaps: true,\n};\n\nconst CONTROL_SOURCE_PREFIX = 'maplibre-basemap-control-source';\nconst CONTROL_LAYER_PREFIX = '';\n\ntype EventHandlersMap = globalThis.Map<BasemapControlEvent, Set<BasemapControlEventHandler>>;\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' | 'position' | 'title' | 'panelWidth' | 'className' | 'includeDefaultBasemaps'\n >\n > &\n Omit<\n BasemapControlOptions,\n 'collapsed' | 'position' | 'title' | 'panelWidth' | 'className' | 'includeDefaultBasemaps'\n >;\n private _state: BasemapControlState;\n private _basemaps: BasemapDefinition[];\n private _providers: BasemapProvider[];\n private _eventHandlers: EventHandlersMap = new globalThis.Map();\n private _managedSourceIds: string[] = [];\n private _managedLayerIds: string[] = [];\n private _resizeHandler: (() => void) | null = null;\n private _mapResizeHandler: (() => void) | null = null;\n private _clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(options?: BasemapControlOptions) {\n this._options = { ...DEFAULT_OPTIONS, ...options };\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 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 this._selectBasemap(this._state.activeBasemapId);\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 if (this._clickOutsideHandler) {\n document.removeEventListener('click', this._clickOutsideHandler);\n this._clickOutsideHandler = null;\n }\n\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._renderContent();\n this._emit({ type: 'statechange', state: this.getState() });\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 if (\n this._state.activeBasemapId &&\n !this._basemaps.some((basemap) => basemap.id === this._state.activeBasemapId)\n ) {\n this._state = { ...this._state, activeBasemapId: undefined };\n }\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 async setBasemap(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 setting a basemap.');\n this._handleError(error, basemap);\n throw error;\n }\n\n this._state = { ...this._state, loading: true, error: undefined };\n this._renderContent();\n this._emit({ type: 'statechange', state: this.getState() });\n\n try {\n if (basemap.source.type === 'raster') {\n await this._waitForStyleReady();\n this._removeManagedBasemap();\n this._addRasterBasemap(basemap);\n } else {\n this._removeManagedBasemap();\n this._map.setStyle(basemap.source.url);\n }\n\n this._applyBasemapView(basemap);\n\n this._state = {\n ...this._state,\n activeBasemapId: basemap.id,\n loading: false,\n error: undefined,\n };\n this._renderContent();\n this._emit({ type: 'basemapchange', state: this.getState(), basemap });\n this._emit({ type: 'statechange', state: this.getState() });\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n this._state = { ...this._state, loading: false, error: error.message };\n this._renderContent();\n this._handleError(error, basemap);\n throw error;\n }\n }\n\n // setBasemap rethrows after emitting the error event so callers that await\n // it can react. Internal fire-and-forget callers use this instead to avoid\n // unhandled promise rejections; the failure is still reported via `error`.\n private _selectBasemap(id: string): void {\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 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._options.panelWidth}px`;\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 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(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 return panel;\n }\n\n private _renderContent(): void {\n if (!this._content) return;\n\n const categories = getBasemapCategories(this._basemaps);\n const results = this._getFilteredBasemaps();\n\n this._content.replaceChildren(\n this._createSearchRow(),\n this._createFilterRow(this._providers, categories),\n this._createStatus(results.length),\n this._createResults(results),\n );\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 _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 this._state = { ...this._state, query: input.value };\n this._renderFilteredResults();\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 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 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._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.textContent = this._state.error;\n status.classList.add('is-error');\n } else {\n status.textContent = `${resultCount} basemap${resultCount === 1 ? '' : 's'}`;\n }\n return status;\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 (basemap.id === this._state.activeBasemapId) {\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 = basemap.type === 'raster' ? 'Raster' : '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 _addRasterBasemap(basemap: BasemapDefinition): void {\n if (!this._map || basemap.source.type !== 'raster') return;\n\n const sourceId = `${CONTROL_SOURCE_PREFIX}-${basemap.id}`;\n const layerId = [CONTROL_LAYER_PREFIX, basemap.id].filter(Boolean).join('-');\n const source: SourceSpecification = {\n type: 'raster',\n tiles: basemap.source.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, this._getBasemapInsertBeforeId());\n this._managedSourceIds = [sourceId];\n this._managedLayerIds = [layerId];\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 const done = () => {\n this._map?.off('load', done);\n this._map?.off('style.load', done);\n resolve();\n };\n this._map?.once('load', done);\n this._map?.once('style.load', done);\n });\n }\n\n private _removeManagedBasemap(): void {\n if (!this._map) return;\n\n [...this._managedLayerIds].reverse().forEach((layerId) => {\n if (this._map?.getLayer(layerId)) {\n this._map.removeLayer(layerId);\n }\n });\n [...this._managedSourceIds].reverse().forEach((sourceId) => {\n if (this._map?.getSource(sourceId)) {\n this._map.removeSource(sourceId);\n }\n });\n this._managedLayerIds = [];\n this._managedSourceIds = [];\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._clickOutsideHandler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n this._container &&\n this._panel &&\n !this._container.contains(target) &&\n !this._panel.contains(target)\n ) {\n this.collapse();\n }\n };\n document.addEventListener('click', this._clickOutsideHandler);\n\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"],"names":["_a","_b"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BasemapControl-Bgd4nl0C.js","sources":["../src/lib/core/catalog.ts","../src/lib/core/BasemapControl.ts"],"sourcesContent":["import type { BasemapDefinition, BasemapProvider } from './types';\n\nexport const DEFAULT_BASEMAP_PROVIDERS: BasemapProvider[] = [\n { id: 'openstreetmap', name: 'OpenStreetMap', category: 'Community' },\n { id: 'google', name: 'Google', category: 'General' },\n { id: 'carto', name: 'Carto', category: 'General' },\n { id: 'cyclosm', name: 'CyclOSM', category: 'Cycling' },\n { id: 'esri', name: 'ESRI', category: 'Imagery' },\n { id: 'nasa-gibs', name: 'NASA GIBS', category: 'Imagery' },\n { id: 'openrailwaymap', name: 'OpenRailwayMap', category: 'Transport' },\n { id: 'opentopomap', name: 'OpenTopoMap', category: 'Terrain' },\n { id: 'openfreemap', name: 'OpenFreeMap', category: 'Vector Styles' },\n { id: 'swisstopo', name: 'Swiss Federal Geoportal', category: 'Regional' },\n { id: 'topplusopen', name: 'TopPlusOpen', category: 'Regional' },\n { id: 'usgs', name: 'USGS', category: 'United States' },\n { id: 'waymarkedtrails', name: 'Waymarked Trails', category: 'Outdoor' },\n { id: 'nlmaps', name: 'nlmaps', category: 'Regional' },\n];\n\nfunction rasterBasemap({\n id,\n name,\n provider,\n category,\n description,\n attribution,\n tiles,\n maxzoom = 19,\n tags = [],\n}: Omit<BasemapDefinition, 'type' | 'source'> & {\n tiles: string[];\n maxzoom?: number;\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 },\n tags,\n };\n}\n\nconst CARTO_ATTRIBUTION = '&copy; OpenStreetMap contributors &copy; CARTO';\nconst ESRI_ATTRIBUTION = 'Tiles &copy; Esri and the GIS User Community';\nconst OSM_ATTRIBUTION = '&copy; OpenStreetMap contributors';\nconst OPENFREEMAP_ATTRIBUTION = 'OpenFreeMap &copy; OpenMapTiles Data from OpenStreetMap';\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 rasterBasemap({\n id: 'google-maps',\n name: 'Google Maps',\n provider: 'google',\n category: 'Street',\n description: 'Google road map tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'street'],\n }),\n rasterBasemap({\n id: 'google-satellite',\n name: 'Google Satellite',\n provider: 'google',\n category: 'Imagery',\n description: 'Google satellite tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'satellite', 'imagery'],\n }),\n rasterBasemap({\n id: 'google-terrain',\n name: 'Google Terrain',\n provider: 'google',\n category: 'Terrain',\n description: 'Google terrain tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=p&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'terrain'],\n }),\n rasterBasemap({\n id: 'google-hybrid',\n name: 'Google Hybrid',\n provider: 'google',\n category: 'Imagery',\n description: 'Google hybrid imagery tiles from the QGIS basemaps source.',\n attribution: '&copy; Google',\n tiles: ['https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}'],\n maxzoom: 20,\n tags: ['google', 'hybrid', 'imagery'],\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: ['https://a.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png'],\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: ['https://a.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png'],\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: ['https://a.basemaps.cartocdn.com/rastertiles/voyager_only_labels/{z}/{x}/{y}.png'],\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: ['https://a.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png'],\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: '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-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 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: '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: 'opentopomap',\n name: 'OpenTopoMap',\n provider: 'opentopomap',\n category: 'Terrain',\n description: 'Topographic map with relief and contour styling.',\n attribution: '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 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 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: 'waymarkedtrails-hiking',\n name: 'Waymarked Trails Hiking',\n provider: 'waymarkedtrails',\n category: 'Outdoor',\n description: 'Hiking routes from Waymarked Trails.',\n attribution: '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: '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: '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: '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: 'nlmaps-standaard',\n name: 'nlmaps Standaard',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands standard background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/standaard/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional'],\n }),\n rasterBasemap({\n id: 'nlmaps-grijs',\n name: 'nlmaps Grijs',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands grey background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/grijs/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional', 'grey'],\n }),\n rasterBasemap({\n id: 'nlmaps-pastel',\n name: 'nlmaps Pastel',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands pastel background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/pastel/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional', 'pastel'],\n }),\n rasterBasemap({\n id: 'nlmaps-water',\n name: 'nlmaps Water',\n provider: 'nlmaps',\n category: 'Regional',\n description: 'Netherlands water-focused background map.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0/water/EPSG:3857/{z}/{x}/{y}.png',\n ],\n tags: ['netherlands', 'regional', 'water'],\n }),\n rasterBasemap({\n id: 'nlmaps-luchtfoto',\n name: 'nlmaps Luchtfoto',\n provider: 'nlmaps',\n category: 'Imagery',\n description: 'Netherlands aerial photography.',\n attribution: 'Kaartgegevens &copy; Kadaster',\n tiles: [\n 'https://service.pdok.nl/hwh/luchtfotorgb/wmts/v1_0/Actueel_ortho25/EPSG:3857/{z}/{x}/{y}.jpeg',\n ],\n tags: ['netherlands', 'imagery', 'aerial'],\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];\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 [...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) => byId.set(provider.id, provider));\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, { id: basemap.provider, name: basemap.provider });\n }\n });\n return [...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 [...new Set(basemaps.map((basemap) => basemap.category).filter(Boolean) as string[])].sort();\n}\n","import type {\n IControl,\n LayerSpecification,\n Map as MapLibreMap,\n SourceSpecification,\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} from './types';\n\nconst DEFAULT_OPTIONS: Required<\n Pick<\n BasemapControlOptions,\n 'collapsed' | 'position' | 'title' | 'panelWidth' | 'className' | 'includeDefaultBasemaps'\n >\n> = {\n collapsed: true,\n position: 'top-right',\n title: 'Basemaps',\n panelWidth: 340,\n className: '',\n includeDefaultBasemaps: true,\n};\n\nconst CONTROL_SOURCE_PREFIX = 'maplibre-basemap-control-source';\nconst CONTROL_LAYER_PREFIX = '';\n\ntype EventHandlersMap = globalThis.Map<BasemapControlEvent, Set<BasemapControlEventHandler>>;\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' | 'position' | 'title' | 'panelWidth' | 'className' | 'includeDefaultBasemaps'\n >\n > &\n Omit<\n BasemapControlOptions,\n 'collapsed' | 'position' | 'title' | 'panelWidth' | 'className' | 'includeDefaultBasemaps'\n >;\n private _state: BasemapControlState;\n private _basemaps: BasemapDefinition[];\n private _providers: BasemapProvider[];\n private _eventHandlers: EventHandlersMap = new globalThis.Map();\n private _managedSourceIds: string[] = [];\n private _managedLayerIds: string[] = [];\n private _resizeHandler: (() => void) | null = null;\n private _mapResizeHandler: (() => void) | null = null;\n private _clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(options?: BasemapControlOptions) {\n this._options = { ...DEFAULT_OPTIONS, ...options };\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 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 this._selectBasemap(this._state.activeBasemapId);\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 if (this._clickOutsideHandler) {\n document.removeEventListener('click', this._clickOutsideHandler);\n this._clickOutsideHandler = null;\n }\n\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._renderContent();\n this._emit({ type: 'statechange', state: this.getState() });\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 if (\n this._state.activeBasemapId &&\n !this._basemaps.some((basemap) => basemap.id === this._state.activeBasemapId)\n ) {\n this._state = { ...this._state, activeBasemapId: undefined };\n }\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 async setBasemap(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 setting a basemap.');\n this._handleError(error, basemap);\n throw error;\n }\n\n this._state = { ...this._state, loading: true, error: undefined };\n this._renderContent();\n this._emit({ type: 'statechange', state: this.getState() });\n\n try {\n if (basemap.source.type === 'raster') {\n await this._waitForStyleReady();\n this._removeManagedBasemap();\n this._addRasterBasemap(basemap);\n } else {\n this._removeManagedBasemap();\n this._map.setStyle(basemap.source.url);\n }\n\n this._applyBasemapView(basemap);\n\n this._state = {\n ...this._state,\n activeBasemapId: basemap.id,\n loading: false,\n error: undefined,\n };\n this._renderContent();\n this._emit({ type: 'basemapchange', state: this.getState(), basemap });\n this._emit({ type: 'statechange', state: this.getState() });\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n this._state = { ...this._state, loading: false, error: error.message };\n this._renderContent();\n this._handleError(error, basemap);\n throw error;\n }\n }\n\n // setBasemap rethrows after emitting the error event so callers that await\n // it can react. Internal fire-and-forget callers use this instead to avoid\n // unhandled promise rejections; the failure is still reported via `error`.\n private _selectBasemap(id: string): void {\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 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._options.panelWidth}px`;\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 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(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 return panel;\n }\n\n private _renderContent(): void {\n if (!this._content) return;\n\n const categories = getBasemapCategories(this._basemaps);\n const results = this._getFilteredBasemaps();\n\n this._content.replaceChildren(\n this._createSearchRow(),\n this._createFilterRow(this._providers, categories),\n this._createStatus(results.length),\n this._createResults(results),\n );\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 _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 this._state = { ...this._state, query: input.value };\n this._renderFilteredResults();\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 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 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._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.textContent = this._state.error;\n status.classList.add('is-error');\n } else {\n status.textContent = `${resultCount} basemap${resultCount === 1 ? '' : 's'}`;\n }\n return status;\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 (basemap.id === this._state.activeBasemapId) {\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 = basemap.type === 'raster' ? 'Raster' : '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 _addRasterBasemap(basemap: BasemapDefinition): void {\n if (!this._map || basemap.source.type !== 'raster') return;\n\n const sourceId = `${CONTROL_SOURCE_PREFIX}-${basemap.id}`;\n const layerId = [CONTROL_LAYER_PREFIX, basemap.id].filter(Boolean).join('-');\n const source: SourceSpecification = {\n type: 'raster',\n tiles: basemap.source.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, this._getBasemapInsertBeforeId());\n this._managedSourceIds = [sourceId];\n this._managedLayerIds = [layerId];\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 const done = () => {\n this._map?.off('load', done);\n this._map?.off('style.load', done);\n resolve();\n };\n this._map?.once('load', done);\n this._map?.once('style.load', done);\n });\n }\n\n private _removeManagedBasemap(): void {\n if (!this._map) return;\n\n [...this._managedLayerIds].reverse().forEach((layerId) => {\n if (this._map?.getLayer(layerId)) {\n this._map.removeLayer(layerId);\n }\n });\n [...this._managedSourceIds].reverse().forEach((sourceId) => {\n if (this._map?.getSource(sourceId)) {\n this._map.removeSource(sourceId);\n }\n });\n this._managedLayerIds = [];\n this._managedSourceIds = [];\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._clickOutsideHandler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n this._container &&\n this._panel &&\n !this._container.contains(target) &&\n !this._panel.contains(target)\n ) {\n this.collapse();\n }\n };\n document.addEventListener('click', this._clickOutsideHandler);\n\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"],"names":["_a","_b"],"mappings":"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"}