{"version":3,"sources":["../src/index.js","../src/configs.json","../src/layerconfig.js"],"sourcesContent":["import configsJson from './configs.json' with { type: 'json' };\nimport { LayerConfig, LineStyle, INFINITY, MIN_LINE_WIDTH, interpolateLineWidth } from './layerconfig.js';\n\nexport { LayerConfig, LineStyle, INFINITY, MIN_LINE_WIDTH, interpolateLineWidth } from './layerconfig.js';\n\n// Export raw configs for testing/inspection\nexport { configsJson };\n\n/**\n * Layer configuration registry\n */\nexport class LayerConfigRegistry {\n  constructor() {\n    this.registry = {};\n  }\n\n  /**\n   * Get a layer config by id\n   */\n  get(id) {\n    return this.registry[id];\n  }\n\n  /**\n   * Register a new layer config\n   */\n  register(config) {\n    this.registry[config.id] = config;\n  }\n\n  /**\n   * Remove a layer config by id\n   */\n  remove(id) {\n    if (!this.registry[id]) return false;\n    delete this.registry[id];\n    return true;\n  }\n\n  /**\n   * Detect layer config from tile URL templates (with {z}/{x}/{y} placeholders)\n   * @param {string | string[]} templates - Single template URL or array of template URLs\n   */\n  detectFromTemplates(templates) {\n    if (!templates || (Array.isArray(templates) && templates.length === 0)) return undefined;\n    \n    for (const config of Object.values(this.registry)) {\n      if (config.matchTemplate(templates)) {\n        return config;\n      }\n    }\n    \n    return undefined;\n  }\n\n  /**\n   * Detect layer config from actual tile URLs (with numeric coordinates)\n   * @param {string | string[]} urls - Single tile URL or array of tile URLs\n   */\n  detectFromTileUrls(urls) {\n    if (!urls || (Array.isArray(urls) && urls.length === 0)) return undefined;\n    \n    for (const config of Object.values(this.registry)) {\n      if (config.matchTileUrl(urls)) {\n        return config;\n      }\n    }\n    \n    return undefined;\n  }\n\n  /**\n   * Get all available layer config ids\n   */\n  getAvailableIds() {\n    return Object.keys(this.registry);\n  }\n\n  /**\n   * Create a new registry with all configs from this registry plus extra configs.\n   * @param {LayerConfig[]} extraLayerConfigs - Additional configs to add\n   * @returns {LayerConfigRegistry} A new registry with merged configs\n   */\n  createMergedRegistry(extraLayerConfigs) {\n    const registry = new LayerConfigRegistry();\n    \n    for (const id of this.getAvailableIds()) {\n      registry.register(this.get(id));\n    }\n    \n    if (extraLayerConfigs && extraLayerConfigs.length > 0) {\n      for (const config of extraLayerConfigs) {\n        registry.register(config);\n      }\n    }\n    \n    return registry;\n  }\n\n  /**\n   * Parse a tile URL into its components: layer config and coordinates\n   * @param {string} url - Tile URL to parse\n   * @returns {{ layerConfig: LayerConfig, coords: { z: number, x: number, y: number } } | null}\n   */\n  parseTileUrl(url) {\n    // Check if URL matches any layer config\n    const layerConfig = this.detectFromTileUrls([url]);\n    if (!layerConfig) return null;\n    \n    // Extract tile coordinates using the matched config\n    const coords = layerConfig.extractCoords(url);\n    if (!coords) return null;\n    \n    return { layerConfig, coords };\n  }\n}\n\n// Default registry with built-in configs loaded from JSON\nexport const layerConfigs = new LayerConfigRegistry();\nfor (const configData of configsJson) {\n  layerConfigs.register(new LayerConfig(configData));\n}\n\n","[\n  {\n    \"id\": \"cartodb-dark\",\n    \"tileUrlTemplates\": [\n      \"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png\",\n      \"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_nolabels/{z}/{x}/{y}.png\"\n    ],\n    \"lineWidthStops\": { \"0\": 1.0, \"2\": 1.0, \"3\": 1.0, \"10\": 2.0, \"12\": 2.0 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne\", \"endZoom\": 4 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm\", \"startZoom\": 5 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.3, \"dashArray\": [2, 2], \"delWidthFactor\": 2.0 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.3, \"dashArray\": [2, 2], \"delWidthFactor\": 3.0 }\n    ]\n  },\n  {\n    \"id\": \"cartodb-dark-retina\",\n    \"tileUrlTemplates\": [\n      \"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}{r}.png\",\n      \"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_nolabels/{z}/{x}/{y}{r}.png\"\n    ],\n    \"lineWidthStops\": { \"0\": 1.5, \"2\": 1.5, \"3\": 1.5, \"6\": 2.5, \"10\": 3.0 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne\", \"endZoom\": 4 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm\", \"startZoom\": 5 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.3, \"dashArray\": [4, 4], \"delWidthFactor\": 2.0 },\n      { \"color\": \"rgb(40, 40, 40)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.3, \"dashArray\": [4, 4], \"delWidthFactor\": 3.0 }\n    ]\n  },\n  {\n    \"id\": \"cartodb-light\",\n    \"tileUrlTemplates\": [\n      \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png\",\n      \"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}.png\",\n      \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png\",\n      \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}.png\",\n      \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\",\n      \"https://basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png\"\n    ],\n    \"lineWidthStops\": { \"1\": 0.5, \"2\": 0.75, \"3\": 0.75, \"4\": 1.0, \"5\": 1.0, \"7\": 1.75, \"16\": 2.5 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne\", \"endZoom\": 4, \"lineExtensionFactor\": 0.1, \"delWidthFactor\": 2.5 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4, \"delWidthFactor\": 0 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"alpha\": 0.1,  \"startZoom\": 6,  \"lineWidthStops\": { \"6\": 9, \"10\": 8, \"14\": 8 }, \"lineExtensionFactor\": 0.1 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"startZoom\": 5, \"lineExtensionFactor\": 0.1 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5,  \"delWidthFactor\": 0 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.5, \"dashArray\": [2, 2], \"delWidthFactor\": 2.0 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.5, \"dashArray\": [2, 2], \"delWidthFactor\": 2.5 }\n    ]\n  },\n  {\n    \"id\": \"cartodb-light-retina\",\n    \"tileUrlTemplates\": [\n      \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}{r}.png\",\n      \"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png\",\n      \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/rastertiles/voyager_nolabels/{z}/{x}/{y}{r}.png\",\n      \"https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png\",\n      \"https://basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png\"\n    ],\n    \"lineWidthStops\": { \"1\": 1.0, \"3\": 1.0, \"4\": 2.0, \"5\": 2.0, \"6\": 2.5, \"7\": 3.0, \"8\": 3.0, \"10\": 4.0, \"11\": 4.0, \"12\": 4.0 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne\", \"endZoom\": 4, \"lineExtensionFactor\": 0.1, \"delWidthFactor\": 2.5 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-disp\", \"endZoom\": 4, \"delWidthFactor\": 0 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"alpha\": 0.1, \"startZoom\": 6, \"lineWidthStops\": { \"6\": 20, \"8\": 19, \"10\": 18, \"12\": 17 }, \"lineExtensionFactor\": 0.1 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm\", \"startZoom\": 5, \"lineExtensionFactor\": 0.1 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-disp\", \"startZoom\": 5,  \"delWidthFactor\": 0 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 5, \"widthFraction\": 0.5, \"dashArray\": [4, 4], \"delWidthFactor\": 2.0 },\n      { \"color\": \"rgb(235, 214, 214)\", \"layerSuffix\": \"ne-internal\", \"startZoom\": 4, \"endZoom\": 4, \"widthFraction\": 0.5, \"dashArray\": [4, 4], \"delWidthFactor\": 2.5 }\n    ]\n  },\n  {\n    \"id\": \"open-topo\",\n    \"tileUrlTemplates\": [\n      \"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png\",\n      \"https://tile.opentopomap.org/{z}/{x}/{y}.png\",\n      \"https://{s}.tile.top-o-map.de/{z}/{x}/{y}.png\",\n      \"https://tile.top-o-map.de/{z}/{x}/{y}.png\"\n    ],\n    \"lineWidthStops\": { \"4\": 0.75, \"5\": 1.0, \"6\": 1.25, \"7\": 1.5, \"8\": 1.75, \"9\": 1.25, \"10\": 1.25, \"13\": 1.5 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"ne\", \"startZoom\": 4, \"endZoom\": 6 },\n      { \"color\": \"rgb(173, 173, 173)\", \"layerSuffix\": \"osm\", \"startZoom\": 7, \"endZoom\": 8, \"alpha\": 0.5, \"widthFraction\": 4 },\n      { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"osm\", \"startZoom\": 7, \"endZoom\": 8 },\n      { \"color\": \"rgb(83, 83, 83)\", \"layerSuffix\": \"osm-internal\", \"widthFraction\": 0.75, \"startZoom\": 7, \"endZoom\": 8 },\n      { \"color\": \"rgb(199, 158, 204)\", \"layerSuffix\": \"osm\", \"startZoom\": 9, \"widthFraction\": 7, \"alpha\": 0.6, \"lineExtensionFactor\": 0.2 },\n      { \"color\": \"rgb(175, 41, 203)\", \"layerSuffix\": \"osm\", \"startZoom\": 9, \"lineExtensionFactor\": 0.2 },\n      { \"color\": \"rgb(199, 158, 204)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 9, \"widthFraction\": 2.25, \"alpha\": 0.6, \"lineExtensionFactor\": 0.2 },\n      { \"color\": \"rgb(175, 41, 203)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 9, \"widthFactor\": 0.75, \"lineExtensionFactor\": 0.2 }\n    ]\n  },\n  {\n    \"id\": \"osm-carto\",\n    \"tileUrlTemplates\": [\n      \"https://tile.openstreetmap.org/{z}/{x}/{y}.png\",\n      \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n    ],\n    \"lineWidthStops\": { \"3\": 0.7, \"4\": 1.0, \"10\": 3.75 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm\", \"startZoom\": 4, \"delWidthFactor\": 1.5 },\n      { \"color\": \"rgb(160, 120, 160)\", \"layerSuffix\": \"osm\", \"startZoom\": 4, \"widthFraction\": 0.333, \"dashArray\": [30, 2, 8, 2], \"delWidthFactor\": 0 },\n      { \"color\": \"rgb(200, 180, 200)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 4, \"widthFraction\": 0.45 },\n      { \"color\": \"rgb(160, 120, 160)\", \"layerSuffix\": \"osm-internal\", \"startZoom\": 4, \"widthFraction\": 0.15, \"dashArray\": [10, 4, 2] }\n    ]\n  },\n  {\n    \"id\": \"osm-hot\",\n    \"tileUrlTemplates\": [\n      \"https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\",\n      \"https://tile.openstreetmap.fr/hot/{z}/{x}/{y}.png\"\n    ],\n    \"lineWidthStops\": { \"2\": 3.0, \"3\": 3.0, \"7\": 3.0, \"8\": 3.5, \"9\": 3.5 },\n    \"lineStyles\": [\n      { \"color\": \"rgb(149, 175, 180)\", \"layerSuffix\": \"osm\", \"lineExtensionFactor\": 0.25, \"startZoom\": 2 },\n      { \"color\": \"rgb(89, 117, 123)\", \"layerSuffix\": \"osm\", \"widthFraction\": 0.33, \"lineExtensionFactor\": 0.25, \"startZoom\": 2 },\n      { \"color\": \"rgb(172, 163, 163)\", \"layerSuffix\": \"osm-internal\", \"widthFraction\": 0.33, \"startZoom\": 4, \"dashArray\": [7, 7] }\n    ]\n  }\n]\n","/**\n * Constant representing no zoom limit (used for endZoom).\n * Using -1 instead of Infinity for JSON serialization compatibility.\n */\nexport const INFINITY = -1;\n\n/**\n * Minimum line width used when extrapolating below the lowest zoom stop.\n */\nexport const MIN_LINE_WIDTH = 0.1;\n\n/**\n * Default fallback line width if interpolation fails.\n */\nconst DEFAULT_LINE_WIDTH = 1;\n\n/**\n * Interpolate or extrapolate line width for a given zoom level.\n * Uses a lineWidthStops map to calculate the appropriate width.\n * @param {number} zoom - Zoom level\n * @param {Object<number, number>} lineWidthStops - Map of zoom level to line width (at least 2 entries)\n * @returns {number}\n */\nexport function interpolateLineWidth(zoom, lineWidthStops) {\n  const zooms = Object.keys(lineWidthStops).map(Number).sort((a, b) => a - b);\n  \n  // Exact match\n  if (lineWidthStops[zoom] !== undefined) {\n    return lineWidthStops[zoom];\n  }\n  \n  // Below lowest zoom - extrapolate\n  if (zoom < zooms[0]) {\n    const z1 = zooms[0];\n    const z2 = zooms[1];\n    const w1 = lineWidthStops[z1];\n    const w2 = lineWidthStops[z2];\n    const slope = (w2 - w1) / (z2 - z1);\n    return Math.max(MIN_LINE_WIDTH, w1 + slope * (zoom - z1));\n  }\n  \n  // Above highest zoom - extrapolate\n  if (zoom > zooms[zooms.length - 1]) {\n    const z1 = zooms[zooms.length - 2];\n    const z2 = zooms[zooms.length - 1];\n    const w1 = lineWidthStops[z1];\n    const w2 = lineWidthStops[z2];\n    const slope = (w2 - w1) / (z2 - z1);\n    return Math.max(MIN_LINE_WIDTH, w2 + slope * (zoom - z2));\n  }\n  \n  // Interpolate between two stops\n  for (let i = 0; i < zooms.length - 1; i++) {\n    if (zoom > zooms[i] && zoom < zooms[i + 1]) {\n      const z1 = zooms[i];\n      const z2 = zooms[i + 1];\n      const w1 = lineWidthStops[z1];\n      const w2 = lineWidthStops[z2];\n      const t = (zoom - z1) / (z2 - z1);\n      return w1 + t * (w2 - w1);\n    }\n  }\n  \n  return DEFAULT_LINE_WIDTH; // fallback\n}\n\n/**\n * Convert a tile URL template to a regex pattern and capture group names.\n * Supports {z}, {x}, {y}, {s} (Leaflet subdomain), {a-c}/{1-4} (OpenLayers subdomain), and {r} (retina) placeholders.\n * @param {string} template - URL template like \"https://{s}.tile.example.com/{z}/{x}/{y}.png\"\n * @returns {{ pattern: RegExp, groups: string[] }}\n */\nfunction templateToRegex(template) {\n  const groups = [];\n  const hasRetina = template.includes('{r}');\n  const hasExtension = /\\.(png|jpg|jpeg|webp|gif)$/i.test(template);\n  \n  // Escape regex special chars, then replace placeholders\n  let pattern = template\n    .replace(/[.*+?^${}()|[\\]\\\\]/g, (char) => {\n      // Don't escape our placeholders\n      if (char === '{' || char === '}') return char;\n      return '\\\\' + char;\n    })\n    // Make protocol flexible (http/https)\n    .replace(/^https:\\/\\//, 'https?://')\n    .replace(/^http:\\/\\//, 'https?://')\n    // Handle {a-c} or {1-4} etc (OpenLayers style subdomain)\n    .replace(/\\{[a-z0-9]-[a-z0-9]\\}/gi, () => {\n      groups.push('s');\n      return '([a-z0-9]+)';\n    })\n    .replace(/\\{(z|x|y|s|r)\\}/gi, (_, name) => {\n      const lowerName = name.toLowerCase();\n      groups.push(lowerName);\n      if (lowerName === 's') {\n        // Subdomain: single letter or short string\n        return '([a-z0-9]+)';\n      }\n      if (lowerName === 'r') {\n        // Retina suffix: required @2x or similar (must be present for retina configs)\n        return '(@\\\\d+x)';\n      }\n      // z, x, y: numeric\n      return '(\\\\d+)';\n    });\n  \n  // If template has no {r} placeholder, ensure we DON'T match retina URLs\n  if (!hasRetina) {\n    if (hasExtension) {\n      // Insert negative lookahead before .png/.jpg/.webp etc\n      pattern = pattern.replace(/(\\\\\\.(png|jpg|jpeg|webp|gif))/, '(?!@\\\\d+x)$1');\n    } else {\n      // No extension - add negative lookahead at the end (before query string)\n      pattern = pattern + '(?!@\\\\d+x)';\n    }\n  }\n  \n  // Allow optional query string at end\n  return { pattern: new RegExp('^' + pattern + '(\\\\?.*)?$', 'i'), groups };\n}\n\n/**\n * Convert a tile URL template to a regex that matches the template itself.\n * @param {string} template - URL template like \"https://{s}.tile.example.com/{z}/{x}/{y}.png\"\n * @returns {RegExp}\n */\nfunction templateToTemplateRegex(template) {\n  const hasRetina = template.includes('{r}');\n  const hasExtension = /\\.(png|jpg|jpeg|webp|gif)$/i.test(template);\n  \n  // Escape regex special chars, then replace placeholders with literal match\n  let pattern = template\n    .replace(/[.*+?^${}()|[\\]\\\\]/g, (char) => {\n      if (char === '{' || char === '}') return char;\n      return '\\\\' + char;\n    })\n    // Make protocol flexible (http/https)\n    .replace(/^https:\\/\\//, 'https?://')\n    .replace(/^http:\\/\\//, 'https?://')\n    // Handle {a-c} or {1-4} (OpenLayers style subdomain)\n    .replace(/\\{([a-z0-9])-([a-z0-9])\\}/gi, (_, start, end) => `(\\\\{${start}-${end}\\\\}|\\\\{s\\\\}|[a-z0-9]+)`)\n    .replace(/\\{(z|x|y|s|r)\\}/gi, (_, name) => {\n      const lowerName = name.toLowerCase();\n      if (lowerName === 's') {\n        // Match {s} placeholder, {a-c} style placeholder, or actual subdomain\n        return '(\\\\{s\\\\}|\\\\{[a-z0-9]-[a-z0-9]\\\\}|[a-z0-9]+)';\n      }\n      if (lowerName === 'r') {\n        // Match {r} placeholder or actual retina suffix (required for retina configs)\n        return '(\\\\{r\\\\}|@\\\\d+x)';\n      }\n      // Match {z}, {x}, {y} placeholders\n      return `\\\\{${lowerName}\\\\}`;\n    });\n  \n  // If template has no {r} placeholder, ensure we DON'T match retina URLs/templates\n  if (!hasRetina) {\n    if (hasExtension) {\n      // Insert negative lookahead before .png/.jpg/.webp etc to reject @2x and {r}\n      pattern = pattern.replace(/(\\\\\\.(png|jpg|jpeg|webp|gif))/, '(?!@\\\\d+x|\\\\{r\\\\})$1');\n    } else {\n      // No extension - add negative lookahead at the end (before query string)\n      pattern = pattern + '(?!@\\\\d+x|\\\\{r\\\\})';\n    }\n  }\n  \n  // Allow optional query string at end\n  return new RegExp('^' + pattern + '(\\\\?.*)?$', 'i');\n}\n\n/**\n * Check if a string is a valid CSS color using the browser's CSS parser.\n * Falls back to a basic regex check in non-browser environments.\n * @param {string} color\n * @returns {boolean}\n */\nfunction isValidColor(color) {\n  if (typeof color !== 'string' || !color.trim()) return false;\n  \n  // Use CSS.supports if available (modern browsers)\n  if (typeof CSS !== 'undefined' && CSS.supports) {\n    return CSS.supports('color', color);\n  }\n  \n  // Fallback: basic validation for common formats\n  const trimmed = color.trim().toLowerCase();\n  // Hex colors\n  if (/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(trimmed)) return true;\n  // rgb/rgba/hsl/hsla functions\n  if (/^(rgb|hsl)a?\\(/.test(trimmed)) return true;\n  // Named colors (just check it's alphabetic)\n  if (/^[a-z]+$/.test(trimmed)) return true;\n  return false;\n}\n\n/**\n * Validate lineWidthStops object.\n * @param {Object} lineWidthStops - The lineWidthStops to validate\n * @param {string} prefix - Error message prefix\n * @throws {Error} If validation fails\n */\nfunction validateLineWidthStops(lineWidthStops, prefix) {\n  if (!lineWidthStops || typeof lineWidthStops !== 'object' || Array.isArray(lineWidthStops)) {\n    throw new Error(`${prefix}: lineWidthStops must be an object`);\n  }\n  const stopKeys = Object.keys(lineWidthStops);\n  if (stopKeys.length < 2) {\n    throw new Error(`${prefix}: lineWidthStops must have at least 2 entries`);\n  }\n  for (const key of stopKeys) {\n    const zoom = Number(key);\n    if (!Number.isInteger(zoom) || zoom < 0) {\n      throw new Error(`${prefix}: lineWidthStops keys must be non-negative integers, got \"${key}\"`);\n    }\n    if (typeof lineWidthStops[key] !== 'number' || lineWidthStops[key] <= 0) {\n      throw new Error(`${prefix}: lineWidthStops values must be positive numbers`);\n    }\n  }\n}\n\n/**\n * Represents a line style for drawing boundaries.\n */\nexport class LineStyle {\n  /**\n   * Validate a LineStyle configuration object.\n   * @param {Object} obj - The object to validate\n   * @param {number} [index] - Optional index for error messages (when validating in an array)\n   * @param {boolean} [requireLineWidthStops=false] - Whether lineWidthStops is required\n   * @throws {Error} If validation fails\n   */\n  static validateJSON(obj, index, requireLineWidthStops = false) {\n    const prefix = index !== undefined ? `lineStyles[${index}]` : 'LineStyle';\n    \n    if (!obj || typeof obj !== 'object') {\n      throw new Error(`${prefix}: must be an object`);\n    }\n    \n    if (!obj.color || typeof obj.color !== 'string') {\n      throw new Error(`${prefix}: color must be a non-empty string`);\n    }\n    \n    if (!isValidColor(obj.color)) {\n      throw new Error(`${prefix}: color \"${obj.color}\" is not a valid CSS color`);\n    }\n    \n    if (!obj.layerSuffix || typeof obj.layerSuffix !== 'string') {\n      throw new Error(`${prefix}: layerSuffix must be a non-empty string`);\n    }\n    \n    if (obj.widthFraction !== undefined && (typeof obj.widthFraction !== 'number' || obj.widthFraction <= 0)) {\n      throw new Error(`${prefix}: widthFraction must be a positive number`);\n    }\n    \n    if (obj.dashArray !== undefined && !Array.isArray(obj.dashArray)) {\n      throw new Error(`${prefix}: dashArray must be an array`);\n    }\n    \n    if (obj.alpha !== undefined && (typeof obj.alpha !== 'number' || obj.alpha < 0 || obj.alpha > 1)) {\n      throw new Error(`${prefix}: alpha must be a number between 0 and 1`);\n    }\n    \n    if (obj.startZoom !== undefined && (typeof obj.startZoom !== 'number' || obj.startZoom < 0)) {\n      throw new Error(`${prefix}: startZoom must be a non-negative number`);\n    }\n    \n    if (obj.endZoom !== undefined && (typeof obj.endZoom !== 'number' || (obj.endZoom < 0 && obj.endZoom !== INFINITY))) {\n      throw new Error(`${prefix}: endZoom must be a non-negative number or INFINITY (${INFINITY})`);\n    }\n    \n    if (obj.lineExtensionFactor !== undefined && (typeof obj.lineExtensionFactor !== 'number' || obj.lineExtensionFactor < 0)) {\n      throw new Error(`${prefix}: lineExtensionFactor must be a non-negative number`);\n    }\n    \n    if (obj.delWidthFactor !== undefined && (typeof obj.delWidthFactor !== 'number' || obj.delWidthFactor < 0)) {\n      throw new Error(`${prefix}: delWidthFactor must be a non-negative number`);\n    }\n    \n    if (requireLineWidthStops && obj.lineWidthStops === undefined) {\n      throw new Error(`${prefix}: lineWidthStops is required`);\n    }\n    \n    if (obj.lineWidthStops !== undefined) {\n      validateLineWidthStops(obj.lineWidthStops, prefix);\n    }\n  }\n\n  /**\n   * @param {Object} options\n   * @param {string} options.color - CSS color string\n   * @param {string} options.layerSuffix - Layer suffix (e.g., 'osm', 'ne', 'osm-disp')\n   * @param {Object<number, number>} options.lineWidthStops - Line width stops for this style\n   * @param {number} [options.widthFraction=1.0] - Multiplier for base line width\n   * @param {number[]} [options.dashArray] - Dash pattern for dashed lines\n   * @param {number} [options.alpha=1.0] - Opacity (0-1)\n   * @param {number} [options.startZoom=0] - Minimum zoom level for this style\n   * @param {number} [options.endZoom=INFINITY] - Maximum zoom level for this style (INFINITY means no limit)\n   * @param {number} [options.lineExtensionFactor=0.0] - Factor to extend lines by (multiplied by deletion line width)\n   * @param {number} [options.delWidthFactor=1.5] - Factor to multiply line width for deletion blur\n   */\n  constructor({ color, layerSuffix, lineWidthStops, widthFraction = 1.0, dashArray, alpha = 1.0, startZoom = 0, endZoom = INFINITY, lineExtensionFactor = 0.0, delWidthFactor = 1.5 }) {\n    this.color = color;\n    this.layerSuffix = layerSuffix;\n    this.lineWidthStops = lineWidthStops;\n    this.widthFraction = widthFraction;\n    this.dashArray = dashArray;\n    this.alpha = alpha;\n    this.startZoom = startZoom;\n    this.endZoom = endZoom;\n    this.lineExtensionFactor = lineExtensionFactor;\n    this.delWidthFactor = delWidthFactor;\n  }\n\n  /**\n   * Get base line width for this style at a given zoom level.\n   * @param {number} zoom - Zoom level\n   * @returns {number}\n   */\n  getLineWidth(zoom) {\n    return interpolateLineWidth(zoom, this.lineWidthStops);\n  }\n\n  /**\n   * Check if this style is active at the given zoom level.\n   * @param {number} z - Zoom level\n   * @returns {boolean}\n   */\n  isActiveAtZoom(z) {\n    return z >= this.startZoom && (this.endZoom === INFINITY || z <= this.endZoom);\n  }\n\n  /**\n   * Serialize to plain object.\n   * @returns {Object}\n   */\n  toJSON() {\n    return {\n      color: this.color,\n      layerSuffix: this.layerSuffix,\n      lineWidthStops: this.lineWidthStops,\n      widthFraction: this.widthFraction,\n      dashArray: this.dashArray,\n      alpha: this.alpha,\n      startZoom: this.startZoom,\n      endZoom: this.endZoom,\n      lineExtensionFactor: this.lineExtensionFactor,\n      delWidthFactor: this.delWidthFactor,\n    };\n  }\n\n  /**\n   * Create from plain object with validation.\n   * @param {Object} obj\n   * @param {number} [index] - Optional index for error messages\n   * @returns {LineStyle}\n   */\n  static fromJSON(obj, index) {\n    LineStyle.validateJSON(obj, index, true); // require lineWidthStops\n    return new LineStyle(obj);\n  }\n}\n\n/**\n * Base class for layer configurations\n * \n * Each lineStyle specifies which data layer to use via layerSuffix (e.g., 'osm', 'ne', 'osm-disp').\n * Layer names are derived as: to-add-{layerSuffix} and to-del-{layerSuffix}\n */\nexport class LayerConfig {\n  /**\n   * Validate a LayerConfig configuration object.\n   * Also validates all lineStyles within the config.\n   * @param {Object} obj - The object to validate\n   * @throws {Error} If validation fails\n   */\n  static validateJSON(obj) {\n    if (!obj || typeof obj !== 'object') {\n      throw new Error('LayerConfig: must be an object');\n    }\n    \n    // Validate id (required)\n    if (!obj.id || typeof obj.id !== 'string') {\n      throw new Error('LayerConfig: id must be a non-empty string');\n    }\n    if (obj.id.includes('/')) {\n      throw new Error(`LayerConfig: id cannot contain slashes: \"${obj.id}\"`);\n    }\n    \n    const id = obj.id;\n    \n    // Validate lineWidthStops (optional, but if provided must be valid)\n    if (obj.lineWidthStops !== undefined) {\n      if (!obj.lineWidthStops || typeof obj.lineWidthStops !== 'object' || Array.isArray(obj.lineWidthStops)) {\n        throw new Error(`LayerConfig \"${id}\": lineWidthStops must be an object`);\n      }\n      const stopKeys = Object.keys(obj.lineWidthStops);\n      if (stopKeys.length < 2) {\n        throw new Error(`LayerConfig \"${id}\": lineWidthStops must have at least 2 entries`);\n      }\n      for (const key of stopKeys) {\n        const zoom = Number(key);\n        if (!Number.isInteger(zoom) || zoom < 0) {\n          throw new Error(`LayerConfig \"${id}\": lineWidthStops keys must be non-negative integers, got \"${key}\"`);\n        }\n        if (typeof obj.lineWidthStops[key] !== 'number' || obj.lineWidthStops[key] <= 0) {\n          throw new Error(`LayerConfig \"${id}\": lineWidthStops values must be positive numbers`);\n        }\n      }\n    }\n    \n    // Validate lineStyles (required)\n    if (!Array.isArray(obj.lineStyles) || obj.lineStyles.length === 0) {\n      throw new Error(`LayerConfig \"${id}\": lineStyles must be a non-empty array`);\n    }\n    // Validate each lineStyle\n    for (let i = 0; i < obj.lineStyles.length; i++) {\n      LineStyle.validateJSON(obj.lineStyles[i], i);\n    }\n  }\n\n  constructor({\n    id,\n    // Tile URL templates for matching (e.g., \"https://{s}.tile.example.com/{z}/{x}/{y}.png\")\n    tileUrlTemplates = [],\n    // Line width stops: map of zoom level to line width (at least 2 entries)\n    // Note: interpolated/extrapolated line width is capped at a minimum of 0.5\n    lineWidthStops = { 1: 0.5, 10: 2.5 },\n    // Line styles array - each element describes a line to draw from a specific layer\n    // { color: string, layerSuffix: string, widthFraction?: number, dashArray?: number[], \n    //   startZoom?: number, endZoom?: number, lineExtensionFactor?: number, delWidthFactor?: number }\n    // Lines are drawn in array order. layerSuffix determines which PMTiles layer to use.\n    lineStyles,\n  }) {\n    this.id = id;\n\n    // Normalize to array\n    const templates = Array.isArray(tileUrlTemplates) ? tileUrlTemplates : \n                      (tileUrlTemplates ? [tileUrlTemplates] : []);\n    this.tileUrlTemplates = templates;\n    \n    // Pre-compile regex patterns for matching tile URLs (with actual coords)\n    this._compiledPatterns = templates.map(t => templateToRegex(t));\n    \n    // Pre-compile regex patterns for matching template URLs (with {z}/{x}/{y} placeholders)\n    this._templatePatterns = templates.map(t => templateToTemplateRegex(t));\n\n    this.lineWidthStops = lineWidthStops;\n    \n    // Convert to LineStyle instances, inheriting lineWidthStops from config if not specified\n    this.lineStyles = lineStyles.map(style => {\n      if (style instanceof LineStyle) {\n        return style;\n      }\n      // If style doesn't have lineWidthStops, use the config's lineWidthStops\n      const styleWithStops = style.lineWidthStops ? style : { ...style, lineWidthStops };\n      return new LineStyle(styleWithStops);\n    });\n  }\n\n  /**\n   * Get line styles active at a given zoom level\n   * @param {number} z - Zoom level\n   * @returns {LineStyle[]}\n   */\n  getLineStylesForZoom(z) {\n    return this.lineStyles.filter(style => style.isActiveAtZoom(z));\n  }\n\n  /**\n   * Get unique layer suffixes from styles active at a given zoom level\n   * @param {number} z - Zoom level\n   * @returns {string[]}\n   */\n  getLayerSuffixesForZoom(z) {\n    const activeStyles = this.getLineStylesForZoom(z);\n    return [...new Set(activeStyles.map(s => s.layerSuffix))];\n  }\n\n  /**\n   * Check if this config matches the given template URLs (with {z}/{x}/{y} placeholders)\n   * @param {string | string[]} templates - Single template URL or array of template URLs\n   * @returns {boolean}\n   */\n  matchTemplate(templates) {\n    if (this._templatePatterns.length === 0) return false;\n    \n    const urls = Array.isArray(templates) ? templates : [templates];\n    if (urls.length === 0) return false;\n    \n    return urls.some(url => \n      this._templatePatterns.some(pattern => pattern.test(url))\n    );\n  }\n\n  /**\n   * Check if this config matches the given tile URLs (with actual coordinates)\n   * @param {string | string[]} tiles - Single tile URL or array of tile URLs\n   * @returns {boolean}\n   */\n  matchTileUrl(tiles) {\n    if (this._compiledPatterns.length === 0) return false;\n    \n    const urls = Array.isArray(tiles) ? tiles : [tiles];\n    if (urls.length === 0) return false;\n    \n    return urls.some(url => \n      this._compiledPatterns.some(({ pattern }) => pattern.test(url))\n    );\n  }\n\n  /**\n   * Extract tile coordinates (z, x, y) from a URL using this config's templates\n   * @param {string} url - Tile URL to extract coordinates from\n   * @returns {{ z: number, x: number, y: number } | null}\n   */\n  extractCoords(url) {\n    for (const { pattern, groups } of this._compiledPatterns) {\n      const match = url.match(pattern);\n      if (match) {\n        const result = {};\n        for (let i = 0; i < groups.length; i++) {\n          const name = groups[i];\n          const value = match[i + 1];\n          if (name === 'z' || name === 'x' || name === 'y') {\n            result[name] = parseInt(value, 10);\n          }\n        }\n        if ('z' in result && 'x' in result && 'y' in result) {\n          return { z: result.z, x: result.x, y: result.y };\n        }\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Serialize the config to a plain object for postMessage\n   * @returns {Object}\n   */\n  toJSON() {\n    return {\n      id: this.id,\n      tileUrlTemplates: this.tileUrlTemplates,\n      lineWidthStops: this.lineWidthStops,\n      lineStyles: this.lineStyles.map(s => s.toJSON()),\n    };\n  }\n\n  /**\n   * Create a LayerConfig from a plain object with validation.\n   * @param {Object} obj\n   * @returns {LayerConfig}\n   * @throws {Error} If validation fails\n   */\n  static fromJSON(obj) {\n    LayerConfig.validateJSON(obj);\n    return new LayerConfig(obj);\n  }\n}\n\nexport default LayerConfig;\n"],"mappings":"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","names":[]}