maplibre-gl-layer-control 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/index.cjs +189 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +189 -36
- package/dist/index.mjs.map +1 -1
- package/dist/maplibre-gl-layer-control.css +43 -6
- package/dist/types/index.d.ts +394 -0
- package/package.json +4 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/lib/utils/layerUtils.ts","../src/lib/utils/styleCache.ts","../src/lib/utils/colorUtils.ts","../src/lib/utils/formatters.ts","../src/lib/core/LayerControl.ts"],"sourcesContent":["import type { Map as MapLibreMap } from 'maplibre-gl';\nimport type { StyleableLayerType } from '../core/types';\n\n/**\n * Get the opacity property name for a given layer type\n * @param layerType MapLibre layer type\n * @returns Opacity property name(s)\n */\nexport function getOpacityProperty(layerType: string): string | string[] {\n switch (layerType) {\n case 'fill':\n return 'fill-opacity';\n case 'line':\n return 'line-opacity';\n case 'circle':\n return 'circle-opacity';\n case 'symbol':\n // Symbol layers have both icon and text opacity\n return ['icon-opacity', 'text-opacity'];\n case 'raster':\n return 'raster-opacity';\n case 'background':\n return 'background-opacity';\n default:\n return `${layerType}-opacity`;\n }\n}\n\n/**\n * Get the current opacity value for a layer\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param layerType Layer type\n * @returns Current opacity value (0-1)\n */\nexport function getLayerOpacity(\n map: MapLibreMap,\n layerId: string,\n layerType: string\n): number {\n const opacityProp = getOpacityProperty(layerType);\n\n if (Array.isArray(opacityProp)) {\n // For symbol layers, use icon-opacity as the primary value\n const opacity = map.getPaintProperty(layerId, opacityProp[0]);\n return (opacity !== undefined && opacity !== null) ? opacity as number : 1.0;\n }\n\n const opacity = map.getPaintProperty(layerId, opacityProp);\n return (opacity !== undefined && opacity !== null) ? opacity as number : 1.0;\n}\n\n/**\n * Set the opacity for a layer\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param layerType Layer type\n * @param opacity Opacity value (0-1)\n */\nexport function setLayerOpacity(\n map: MapLibreMap,\n layerId: string,\n layerType: string,\n opacity: number\n): void {\n const opacityProp = getOpacityProperty(layerType);\n\n if (Array.isArray(opacityProp)) {\n // For symbol layers, set both icon and text opacity\n opacityProp.forEach((prop) => {\n map.setPaintProperty(layerId, prop, opacity);\n });\n } else {\n map.setPaintProperty(layerId, opacityProp, opacity);\n }\n}\n\n/**\n * Check if a layer type supports style editing\n * @param layerType Layer type\n * @returns True if the layer type supports style editing\n */\nexport function isStyleableLayerType(layerType: string): layerType is StyleableLayerType {\n return ['fill', 'line', 'circle', 'symbol', 'raster'].includes(layerType);\n}\n\n/**\n * Get layer type from map\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @returns Layer type or null if layer not found\n */\nexport function getLayerType(map: MapLibreMap, layerId: string): string | null {\n try {\n const layer = map.getLayer(layerId);\n return layer ? layer.type : null;\n } catch (error) {\n console.warn(`Failed to get layer type for ${layerId}:`, error);\n return null;\n }\n}\n","import type { Map as MapLibreMap } from 'maplibre-gl';\nimport type { OriginalStyle } from '../core/types';\n\n/**\n * Deep clone a paint value (handles complex MapLibre expressions)\n * @param value Paint value to clone\n * @returns Cloned value\n */\nexport function clonePaintValue(value: any): any {\n if (Array.isArray(value)) {\n return value.map((item) => clonePaintValue(item));\n }\n if (value && typeof value === 'object') {\n try {\n return JSON.parse(JSON.stringify(value));\n } catch (error) {\n return value;\n }\n }\n return value;\n}\n\n/**\n * Cache the original paint properties for a layer\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param originalStyles Map to store original styles\n */\nexport function cacheOriginalLayerStyle(\n map: MapLibreMap,\n layerId: string,\n originalStyles: Map<string, OriginalStyle>\n): void {\n if (originalStyles.has(layerId)) {\n return; // Already cached\n }\n\n try {\n const layer = map.getLayer(layerId);\n if (!layer) {\n return;\n }\n\n const paint: Record<string, any> = {};\n const style = map.getStyle();\n const layerDef = style.layers?.find(l => l.id === layerId);\n\n // For raster layers, handle all properties with defaults\n if (layer.type === 'raster') {\n // Default values from MapLibre GL spec\n const rasterDefaults: Record<string, number> = {\n 'raster-opacity': 1,\n 'raster-brightness-min': 0,\n 'raster-brightness-max': 1,\n 'raster-saturation': 0,\n 'raster-contrast': 0,\n 'raster-hue-rotate': 0\n };\n\n // Start with defaults\n Object.assign(paint, rasterDefaults);\n\n // Override with values from layer definition\n if (layerDef && 'paint' in layerDef && layerDef.paint) {\n Object.entries(layerDef.paint).forEach(([prop, value]) => {\n if (prop.startsWith('raster-')) {\n paint[prop] = clonePaintValue(value);\n }\n });\n }\n } else {\n // For non-raster layers, just get values from the layer definition\n if (layerDef && 'paint' in layerDef && layerDef.paint) {\n Object.entries(layerDef.paint).forEach(([prop, value]) => {\n paint[prop] = clonePaintValue(value);\n });\n }\n }\n\n originalStyles.set(layerId, { paint });\n } catch (error) {\n console.warn(`Failed to cache original style for ${layerId}:`, error);\n }\n}\n\n/**\n * Get the current value of a paint property\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param property Property name\n * @param fallback Fallback value if property is not set\n * @returns Current property value\n */\nexport function getCurrentPaintValue(\n map: MapLibreMap,\n layerId: string,\n property: string,\n fallback?: any\n): any {\n try {\n const value = map.getPaintProperty(layerId, property);\n return value !== undefined ? value : fallback;\n } catch (error) {\n return fallback;\n }\n}\n\n/**\n * Restore original paint properties for a layer\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param originalStyles Map of original styles\n * @returns Object with restored properties\n */\nexport function restoreOriginalStyle(\n map: MapLibreMap,\n layerId: string,\n originalStyles: Map<string, OriginalStyle>\n): Record<string, any> {\n const original = originalStyles.get(layerId);\n if (!original) {\n return {};\n }\n\n const applied: Record<string, any> = {};\n\n Object.entries(original.paint).forEach(([property, value]) => {\n try {\n const restoredValue = clonePaintValue(value);\n map.setPaintProperty(layerId, property, restoredValue);\n applied[property] = restoredValue;\n } catch (error) {\n console.warn(`Failed to restore ${property} for ${layerId}:`, error);\n }\n });\n\n return applied;\n}\n","/**\n * Convert RGB values to hex color string\n * @param r Red component (0-255)\n * @param g Green component (0-255)\n * @param b Blue component (0-255)\n * @returns Hex color string (e.g., '#ff0000')\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n const toHex = (v: number) => {\n const hex = clamp(v).toString(16);\n return hex.length === 1 ? `0${hex}` : hex;\n };\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n/**\n * Normalize a color value to hex format\n * Handles hex strings, RGB strings, and RGB arrays\n * @param value Color value in various formats\n * @returns Normalized hex color string (always 6 digits)\n */\nexport function normalizeColor(value: any): string {\n if (typeof value === 'string') {\n // Already hex format\n if (value.startsWith('#')) {\n // Expand shorthand hex (#RGB to #RRGGBB)\n if (value.length === 4) {\n const r = value[1];\n const g = value[2];\n const b = value[3];\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n return value;\n }\n\n // RGB string format: 'rgb(51, 136, 255)'\n if (value.startsWith('rgb')) {\n const match = value.match(/\\d+/g);\n if (match && match.length >= 3) {\n const [r, g, b] = match.map((num) => parseInt(num, 10));\n return rgbToHex(r, g, b);\n }\n }\n } else if (Array.isArray(value) && value.length >= 3) {\n // RGB array format: [51, 136, 255]\n return rgbToHex(value[0], value[1], value[2]);\n }\n\n // Fallback color (MapLibre default blue)\n return '#3388ff';\n}\n","/**\n * Format a numeric value based on the step size\n * @param value Numeric value to format\n * @param step Step size (determines decimal places)\n * @returns Formatted string\n */\nexport function formatNumericValue(value: number, step: number): string {\n let decimals = 0;\n\n if (step && Number(step) !== 1) {\n const stepNumber = Number(step);\n if (stepNumber > 0 && stepNumber < 1) {\n decimals = Math.min(4, Math.ceil(Math.abs(Math.log10(stepNumber))));\n }\n }\n\n return value.toFixed(decimals);\n}\n\n/**\n * Clamp a numeric value between min and max\n * @param value Value to clamp\n * @param min Minimum value\n * @param max Maximum value\n * @returns Clamped value\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n","import type { IControl, Map as MapLibreMap } from 'maplibre-gl';\nimport type {\n LayerControlOptions,\n LayerState,\n OriginalStyle,\n InternalControlState,\n} from './types';\nimport { getLayerType, getLayerOpacity, setLayerOpacity } from '../utils/layerUtils';\nimport { cacheOriginalLayerStyle, restoreOriginalStyle } from '../utils/styleCache';\nimport { normalizeColor } from '../utils/colorUtils';\nimport { formatNumericValue } from '../utils/formatters';\n\n/**\n * LayerControl - A comprehensive layer control for MapLibre GL\n * Provides visibility toggle, opacity control, and advanced style editing\n */\nexport class LayerControl implements IControl {\n private map!: MapLibreMap;\n private container!: HTMLDivElement;\n private button!: HTMLButtonElement;\n private panel!: HTMLDivElement;\n\n // State management\n private state: InternalControlState;\n private targetLayers: string[];\n private styleEditors: Map<string, HTMLElement>;\n\n // Panel width management\n private minPanelWidth: number;\n private maxPanelWidth: number;\n private widthSliderEl: HTMLElement | null = null;\n private widthThumbEl: HTMLElement | null = null;\n private widthValueEl: HTMLElement | null = null;\n private isWidthSliderActive = false;\n private widthDragRectWidth: number | null = null;\n private widthDragStartX: number | null = null;\n private widthDragStartWidth: number | null = null;\n private widthFrame: number | null = null;\n\n constructor(options: LayerControlOptions = {}) {\n this.minPanelWidth = options.panelMinWidth || 240;\n this.maxPanelWidth = options.panelMaxWidth || 420;\n\n this.state = {\n collapsed: options.collapsed !== false,\n panelWidth: options.panelWidth || 320,\n activeStyleEditor: null,\n layerStates: options.layerStates || {},\n originalStyles: new Map<string, OriginalStyle>(),\n userInteractingWithSlider: false,\n backgroundLegendOpen: false,\n backgroundLayerVisibility: new Map<string, boolean>(),\n onlyRenderedFilter: false,\n };\n\n this.targetLayers = options.layers || Object.keys(this.state.layerStates);\n this.styleEditors = new Map<string, HTMLElement>();\n }\n\n /**\n * Called when the control is added to the map\n */\n onAdd(map: MapLibreMap): HTMLElement {\n this.map = map;\n\n // Auto-detect layers if layerStates not provided\n if (Object.keys(this.state.layerStates).length === 0) {\n this.autoDetectLayers();\n }\n\n this.container = this.createContainer();\n this.button = this.createToggleButton();\n this.panel = this.createPanel();\n\n this.container.appendChild(this.button);\n this.container.appendChild(this.panel);\n\n // Now that panel is attached, update width display\n this.updateWidthDisplay();\n\n // Setup event listeners\n this.setupEventListeners();\n\n // Build layer items\n this.buildLayerItems();\n\n return this.container;\n }\n\n /**\n * Called when the control is removed from the map\n */\n onRemove(): void {\n this.container.parentNode?.removeChild(this.container);\n // Cleanup will be handled by garbage collection\n }\n\n /**\n * Auto-detect layers from the map and populate layerStates\n */\n private autoDetectLayers(): void {\n const style = this.map.getStyle();\n if (!style || !style.layers) {\n return;\n }\n\n // Get all layer IDs from the map\n const allLayerIds = style.layers.map(layer => layer.id);\n\n if (this.targetLayers.length === 0) {\n // No layers specified - show ALL layers individually\n allLayerIds.forEach(layerId => {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n // Get visibility\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n const isVisible = visibility !== 'none';\n\n // Get opacity\n const layerType = layer.type;\n const opacity = getLayerOpacity(this.map, layerId, layerType);\n\n // Generate friendly name from layer ID\n const friendlyName = this.generateFriendlyName(layerId);\n\n this.state.layerStates[layerId] = {\n visible: isVisible,\n opacity: opacity,\n name: friendlyName\n };\n });\n } else {\n // Specific layers requested - separate into user layers + Background\n const userLayers: string[] = [];\n const basemapLayers: string[] = [];\n\n allLayerIds.forEach(layerId => {\n if (this.targetLayers.includes(layerId)) {\n userLayers.push(layerId);\n } else {\n basemapLayers.push(layerId);\n }\n });\n\n // Add Background entry if there are basemap layers\n if (basemapLayers.length > 0) {\n this.state.layerStates['Background'] = {\n visible: true,\n opacity: 1.0,\n name: 'Background'\n };\n }\n\n // Add entries for user-specified layers\n userLayers.forEach(layerId => {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n // Get visibility\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n const isVisible = visibility !== 'none';\n\n // Get opacity\n const layerType = layer.type;\n const opacity = getLayerOpacity(this.map, layerId, layerType);\n\n // Generate friendly name from layer ID\n const friendlyName = this.generateFriendlyName(layerId);\n\n this.state.layerStates[layerId] = {\n visible: isVisible,\n opacity: opacity,\n name: friendlyName\n };\n });\n }\n\n // Update targetLayers to include detected layers\n this.targetLayers = Object.keys(this.state.layerStates);\n }\n\n /**\n * Generate a friendly display name from a layer ID\n */\n private generateFriendlyName(layerId: string): string {\n // Remove common prefixes\n let name = layerId.replace(/^(layer[-_]?|gl[-_]?)/, '');\n\n // Replace dashes and underscores with spaces\n name = name.replace(/[-_]/g, ' ');\n\n // Capitalize first letter of each word\n name = name.replace(/\\b\\w/g, char => char.toUpperCase());\n\n return name || layerId; // Fallback to original if empty\n }\n\n /**\n * Create the main container element\n */\n private createContainer(): HTMLDivElement {\n const container = document.createElement('div');\n container.className = 'maplibregl-ctrl maplibregl-ctrl-group maplibregl-ctrl-layer-control';\n return container;\n }\n\n /**\n * Create the toggle button\n */\n private createToggleButton(): HTMLButtonElement {\n const button = document.createElement('button');\n button.type = 'button';\n button.title = 'Layer Control';\n button.setAttribute('aria-label', 'Layer Control');\n\n // Create layers icon (SVG)\n const icon = document.createElement('span');\n icon.className = 'layer-control-icon';\n icon.innerHTML =\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" ' +\n 'fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' +\n '<polygon points=\"12 3 3 8.25 12 13.5 21 8.25 12 3\"></polygon>' +\n '<polyline points=\"3 12.75 12 18 21 12.75\"></polyline>' +\n '<polyline points=\"3 17.25 12 22 21 17.25\"></polyline>' +\n '</svg>';\n\n button.appendChild(icon);\n return button;\n }\n\n /**\n * Create the panel element\n */\n private createPanel(): HTMLDivElement {\n const panel = document.createElement('div');\n panel.className = 'layer-control-panel';\n\n // Set initial width directly on the element\n panel.style.width = `${this.state.panelWidth}px`;\n\n if (!this.state.collapsed) {\n panel.classList.add('expanded');\n }\n\n // Add header\n const header = this.createPanelHeader();\n panel.appendChild(header);\n\n return panel;\n }\n\n /**\n * Create the panel header with title and width control\n */\n private createPanelHeader(): HTMLElement {\n const header = document.createElement('div');\n header.className = 'layer-control-panel-header';\n\n const title = document.createElement('span');\n title.className = 'layer-control-panel-title';\n title.textContent = 'Layers';\n header.appendChild(title);\n\n // Add width control\n const widthControl = this.createWidthControl();\n header.appendChild(widthControl);\n\n return header;\n }\n\n /**\n * Create the width control slider\n */\n private createWidthControl(): HTMLElement {\n const widthControl = document.createElement('label');\n widthControl.className = 'layer-control-width-control';\n widthControl.title = 'Adjust layer panel width';\n\n const widthLabel = document.createElement('span');\n widthLabel.textContent = 'Width';\n widthControl.appendChild(widthLabel);\n\n const widthSlider = document.createElement('div');\n widthSlider.className = 'layer-control-width-slider';\n widthSlider.setAttribute('role', 'slider');\n widthSlider.setAttribute('aria-valuemin', String(this.minPanelWidth));\n widthSlider.setAttribute('aria-valuemax', String(this.maxPanelWidth));\n widthSlider.setAttribute('aria-valuenow', String(this.state.panelWidth));\n widthSlider.setAttribute('aria-valuestep', '10');\n widthSlider.setAttribute('aria-label', 'Layer panel width');\n widthSlider.tabIndex = 0;\n\n const widthTrack = document.createElement('div');\n widthTrack.className = 'layer-control-width-track';\n const widthThumb = document.createElement('div');\n widthThumb.className = 'layer-control-width-thumb';\n\n widthSlider.appendChild(widthTrack);\n widthSlider.appendChild(widthThumb);\n\n this.widthSliderEl = widthSlider;\n this.widthThumbEl = widthThumb;\n\n // Add width value display\n const widthValue = document.createElement('span');\n widthValue.className = 'layer-control-width-value';\n this.widthValueEl = widthValue;\n\n widthControl.appendChild(widthSlider);\n widthControl.appendChild(widthValue);\n\n this.updateWidthDisplay();\n this.setupWidthSliderEvents(widthSlider);\n\n return widthControl;\n }\n\n /**\n * Setup event listeners for width slider\n */\n private setupWidthSliderEvents(widthSlider: HTMLElement): void {\n // Pointer events for dragging\n widthSlider.addEventListener('pointerdown', (event) => {\n event.preventDefault();\n const rect = widthSlider.getBoundingClientRect();\n this.widthDragRectWidth = rect.width || 1;\n this.widthDragStartX = event.clientX;\n this.widthDragStartWidth = this.state.panelWidth;\n this.isWidthSliderActive = true;\n widthSlider.setPointerCapture(event.pointerId);\n this.updateWidthFromPointer(event, true);\n });\n\n widthSlider.addEventListener('pointermove', (event) => {\n if (!this.isWidthSliderActive) return;\n this.updateWidthFromPointer(event);\n });\n\n const endPointerDrag = (event: PointerEvent) => {\n if (!this.isWidthSliderActive) return;\n if (event.pointerId !== undefined) {\n try {\n widthSlider.releasePointerCapture(event.pointerId);\n } catch (error) {\n // Ignore release errors\n }\n }\n this.isWidthSliderActive = false;\n this.widthDragRectWidth = null;\n this.widthDragStartX = null;\n this.widthDragStartWidth = null;\n this.updateWidthDisplay();\n };\n\n widthSlider.addEventListener('pointerup', endPointerDrag);\n widthSlider.addEventListener('pointercancel', endPointerDrag);\n widthSlider.addEventListener('lostpointercapture', endPointerDrag);\n\n // Keyboard navigation\n widthSlider.addEventListener('keydown', (event) => {\n let handled = true;\n const step = event.shiftKey ? 20 : 10;\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n this.applyPanelWidth(this.state.panelWidth - step, true);\n break;\n case 'ArrowRight':\n case 'ArrowUp':\n this.applyPanelWidth(this.state.panelWidth + step, true);\n break;\n case 'Home':\n this.applyPanelWidth(this.minPanelWidth, true);\n break;\n case 'End':\n this.applyPanelWidth(this.maxPanelWidth, true);\n break;\n case 'PageUp':\n this.applyPanelWidth(this.state.panelWidth + 50, true);\n break;\n case 'PageDown':\n this.applyPanelWidth(this.state.panelWidth - 50, true);\n break;\n default:\n handled = false;\n }\n\n if (handled) {\n event.preventDefault();\n this.updateWidthDisplay();\n }\n });\n }\n\n /**\n * Update panel width from pointer event\n */\n private updateWidthFromPointer(event: PointerEvent, resetBaseline = false): void {\n if (!this.widthSliderEl) return;\n\n const sliderWidth = this.widthDragRectWidth || this.widthSliderEl.getBoundingClientRect().width || 1;\n const widthRange = this.maxPanelWidth - this.minPanelWidth;\n\n let width: number;\n if (resetBaseline) {\n const rect = this.widthSliderEl.getBoundingClientRect();\n const relative = rect.width > 0 ? (event.clientX - rect.left) / rect.width : 0;\n const clampedRatio = Math.min(1, Math.max(0, relative));\n width = this.minPanelWidth + clampedRatio * widthRange;\n this.widthDragStartWidth = width;\n this.widthDragStartX = event.clientX;\n } else {\n const delta = event.clientX - (this.widthDragStartX || event.clientX);\n width = (this.widthDragStartWidth || this.state.panelWidth) + (delta / sliderWidth) * widthRange;\n }\n\n this.applyPanelWidth(width, this.isWidthSliderActive);\n }\n\n /**\n * Apply panel width (clamped to min/max)\n */\n private applyPanelWidth(width: number, immediate = false): void {\n const clamped = Math.round(Math.min(this.maxPanelWidth, Math.max(this.minPanelWidth, width)));\n\n const applyWidth = () => {\n this.state.panelWidth = clamped;\n const px = `${clamped}px`;\n this.panel.style.width = px;\n this.updateWidthDisplay();\n };\n\n if (immediate) {\n applyWidth();\n return;\n }\n\n if (this.widthFrame) {\n cancelAnimationFrame(this.widthFrame);\n }\n this.widthFrame = requestAnimationFrame(() => {\n applyWidth();\n this.widthFrame = null;\n });\n }\n\n /**\n * Update width display (value label and thumb position)\n */\n private updateWidthDisplay(): void {\n if (this.widthValueEl) {\n this.widthValueEl.textContent = `${this.state.panelWidth}px`;\n }\n if (this.widthSliderEl) {\n this.widthSliderEl.setAttribute('aria-valuenow', String(this.state.panelWidth));\n const ratio = (this.state.panelWidth - this.minPanelWidth) / (this.maxPanelWidth - this.minPanelWidth || 1);\n if (this.widthThumbEl) {\n const sliderWidth = this.widthSliderEl.clientWidth || 1;\n const thumbWidth = this.widthThumbEl.offsetWidth || 14;\n const padding = 16;\n const available = Math.max(0, sliderWidth - padding - thumbWidth);\n const clampedRatio = Math.min(1, Math.max(0, ratio));\n const leftPx = 8 + available * clampedRatio;\n this.widthThumbEl.style.left = `${leftPx}px`;\n }\n }\n }\n\n /**\n * Setup main event listeners\n */\n private setupEventListeners(): void {\n // Toggle button click\n this.button.addEventListener('click', () => this.toggle());\n\n // Click outside to close\n document.addEventListener('click', (e) => {\n if (!this.container.contains(e.target as Node)) {\n this.collapse();\n }\n });\n\n // Listen for map layer changes\n this.setupLayerChangeListeners();\n }\n\n /**\n * Setup listeners for map layer changes\n */\n private setupLayerChangeListeners(): void {\n this.map.on('styledata', () => {\n setTimeout(() => {\n this.updateLayerStatesFromMap();\n this.checkForNewLayers();\n }, 100);\n });\n\n this.map.on('data', (e) => {\n if (e.sourceDataType === 'content') {\n setTimeout(() => {\n this.updateLayerStatesFromMap();\n this.checkForNewLayers();\n }, 100);\n }\n });\n\n this.map.on('sourcedata', (e) => {\n if (e.sourceDataType === 'metadata') {\n setTimeout(() => {\n this.checkForNewLayers();\n }, 150);\n }\n });\n }\n\n /**\n * Toggle panel expanded/collapsed state\n */\n private toggle(): void {\n if (this.state.collapsed) {\n this.expand();\n } else {\n this.collapse();\n }\n }\n\n /**\n * Expand the panel\n */\n private expand(): void {\n this.state.collapsed = false;\n this.panel.classList.add('expanded');\n }\n\n /**\n * Collapse the panel\n */\n private collapse(): void {\n this.state.collapsed = true;\n this.panel.classList.remove('expanded');\n }\n\n /**\n * Build layer items (called initially and when layers change)\n */\n private buildLayerItems(): void {\n // Clear existing items\n const existingItems = this.panel.querySelectorAll('.layer-control-item');\n existingItems.forEach(item => item.remove());\n this.styleEditors.clear();\n\n // Add items for all layers in our state\n Object.entries(this.state.layerStates).forEach(([layerId, state]) => {\n if (this.targetLayers.length === 0 || this.targetLayers.includes(layerId)) {\n this.addLayerItem(layerId, state);\n }\n });\n }\n\n /**\n * Add a single layer item to the panel\n */\n private addLayerItem(layerId: string, state: LayerState): void {\n const item = document.createElement('div');\n item.className = 'layer-control-item';\n item.setAttribute('data-layer-id', layerId);\n\n const row = document.createElement('div');\n row.className = 'layer-control-row';\n\n // Visibility checkbox\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'layer-control-checkbox';\n checkbox.checked = state.visible;\n checkbox.addEventListener('change', () => {\n this.toggleLayerVisibility(layerId, checkbox.checked);\n });\n\n // Layer name\n const name = document.createElement('span');\n name.className = 'layer-control-name';\n name.textContent = state.name || layerId;\n name.title = state.name || layerId;\n\n // Opacity slider\n const opacity = document.createElement('input');\n opacity.type = 'range';\n opacity.className = 'layer-control-opacity';\n opacity.min = '0';\n opacity.max = '1';\n opacity.step = '0.01';\n opacity.value = String(state.opacity);\n opacity.title = `Opacity: ${Math.round(state.opacity * 100)}%`;\n\n // Handle slider interaction tracking\n opacity.addEventListener('mousedown', () => {\n this.state.userInteractingWithSlider = true;\n });\n opacity.addEventListener('mouseup', () => {\n this.state.userInteractingWithSlider = false;\n });\n\n opacity.addEventListener('input', () => {\n this.changeLayerOpacity(layerId, parseFloat(opacity.value));\n opacity.title = `Opacity: ${Math.round(parseFloat(opacity.value) * 100)}%`;\n });\n\n row.appendChild(checkbox);\n row.appendChild(name);\n row.appendChild(opacity);\n\n // Style button for regular layers, legend button for Background\n if (layerId === 'Background') {\n const legendButton = this.createBackgroundLegendButton();\n row.appendChild(legendButton);\n } else {\n const styleButton = this.createStyleButton(layerId);\n if (styleButton) {\n row.appendChild(styleButton);\n }\n }\n\n item.appendChild(row);\n this.panel.appendChild(item);\n }\n\n /**\n * Toggle layer visibility\n */\n private toggleLayerVisibility(layerId: string, visible: boolean): void {\n // Handle Background layer group\n if (layerId === 'Background') {\n this.toggleBackgroundVisibility(visible);\n return;\n }\n\n // Update local state\n if (this.state.layerStates[layerId]) {\n this.state.layerStates[layerId].visible = visible;\n }\n\n // Update map\n this.map.setLayoutProperty(layerId, 'visibility', visible ? 'visible' : 'none');\n }\n\n /**\n * Change layer opacity\n */\n private changeLayerOpacity(layerId: string, opacity: number): void {\n // Handle Background layer group\n if (layerId === 'Background') {\n this.changeBackgroundOpacity(opacity);\n return;\n }\n\n // Update local state\n if (this.state.layerStates[layerId]) {\n this.state.layerStates[layerId].opacity = opacity;\n }\n\n // Get layer type and set appropriate opacity property\n const layerType = getLayerType(this.map, layerId);\n if (layerType) {\n setLayerOpacity(this.map, layerId, layerType, opacity);\n }\n }\n\n /**\n * Check if a layer is a user-added layer (vs basemap layer)\n */\n private isUserAddedLayer(layerId: string): boolean {\n return this.state.layerStates[layerId] !== undefined && layerId !== 'Background';\n }\n\n /**\n * Toggle visibility for all background layers (basemap layers)\n */\n private toggleBackgroundVisibility(visible: boolean): void {\n // Update local state\n if (this.state.layerStates['Background']) {\n this.state.layerStates['Background'].visible = visible;\n }\n\n // Apply to all basemap layers (layers not in layerStates)\n const styleLayers = this.map.getStyle().layers || [];\n styleLayers.forEach(layer => {\n if (!this.isUserAddedLayer(layer.id)) {\n // Update visibility cache\n this.state.backgroundLayerVisibility.set(layer.id, visible);\n this.map.setLayoutProperty(layer.id, 'visibility', visible ? 'visible' : 'none');\n }\n });\n\n // Update legend panel checkboxes if open\n if (this.state.backgroundLegendOpen) {\n const legendPanel = this.panel.querySelector('.layer-control-background-legend');\n if (legendPanel) {\n const checkboxes = legendPanel.querySelectorAll('.background-legend-checkbox') as NodeListOf<HTMLInputElement>;\n checkboxes.forEach(checkbox => {\n checkbox.checked = visible;\n });\n }\n }\n }\n\n /**\n * Change opacity for all background layers (basemap layers)\n */\n private changeBackgroundOpacity(opacity: number): void {\n // Update local state\n if (this.state.layerStates['Background']) {\n this.state.layerStates['Background'].opacity = opacity;\n }\n\n // Apply to all basemap layers (layers not in layerStates)\n const styleLayers = this.map.getStyle().layers || [];\n styleLayers.forEach(styleLayer => {\n if (!this.isUserAddedLayer(styleLayer.id)) {\n const layerType = getLayerType(this.map, styleLayer.id);\n if (layerType) {\n setLayerOpacity(this.map, styleLayer.id, layerType, opacity);\n }\n }\n });\n }\n\n // ===== Background Legend Methods =====\n\n /**\n * Create legend button for Background layer\n */\n private createBackgroundLegendButton(): HTMLButtonElement {\n const button = document.createElement('button');\n button.className = 'layer-control-style-button layer-control-background-legend-button';\n button.innerHTML = '⚙'; // Gear icon (same as style button)\n button.title = 'Show background layer details';\n button.setAttribute('aria-label', 'Show background layer visibility controls');\n button.setAttribute('aria-expanded', String(this.state.backgroundLegendOpen));\n\n button.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleBackgroundLegend();\n });\n\n return button;\n }\n\n /**\n * Toggle background legend panel visibility\n */\n private toggleBackgroundLegend(): void {\n if (this.state.backgroundLegendOpen) {\n this.closeBackgroundLegend();\n } else {\n this.openBackgroundLegend();\n }\n }\n\n /**\n * Open background legend panel\n */\n private openBackgroundLegend(): void {\n // Close any open style editor first\n if (this.state.activeStyleEditor) {\n this.closeStyleEditor(this.state.activeStyleEditor);\n }\n\n const itemEl = this.panel.querySelector('[data-layer-id=\"Background\"]');\n if (!itemEl) return;\n\n // Check if panel already exists\n let legendPanel = itemEl.querySelector('.layer-control-background-legend');\n if (legendPanel) {\n // Refresh the list\n const layerList = legendPanel.querySelector('.background-legend-layer-list');\n if (layerList) {\n this.populateBackgroundLayerList(layerList as HTMLElement);\n }\n } else {\n // Create new panel\n legendPanel = this.createBackgroundLegendPanel();\n itemEl.appendChild(legendPanel);\n }\n\n this.state.backgroundLegendOpen = true;\n\n // Update button aria state\n const button = itemEl.querySelector('.layer-control-background-legend-button');\n if (button) {\n button.setAttribute('aria-expanded', 'true');\n button.classList.add('active');\n }\n\n // Scroll into view\n setTimeout(() => {\n legendPanel?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 50);\n }\n\n /**\n * Close background legend panel\n */\n private closeBackgroundLegend(): void {\n const itemEl = this.panel.querySelector('[data-layer-id=\"Background\"]');\n if (!itemEl) return;\n\n const legendPanel = itemEl.querySelector('.layer-control-background-legend');\n if (legendPanel) {\n legendPanel.remove();\n }\n\n this.state.backgroundLegendOpen = false;\n\n // Update button aria state\n const button = itemEl.querySelector('.layer-control-background-legend-button');\n if (button) {\n button.setAttribute('aria-expanded', 'false');\n button.classList.remove('active');\n }\n }\n\n /**\n * Create the background legend panel with individual layer controls\n */\n private createBackgroundLegendPanel(): HTMLDivElement {\n const panel = document.createElement('div');\n panel.className = 'layer-control-background-legend';\n\n // Header\n const header = document.createElement('div');\n header.className = 'background-legend-header';\n\n const title = document.createElement('span');\n title.className = 'background-legend-title';\n title.textContent = 'Background Layers';\n\n const closeBtn = document.createElement('button');\n closeBtn.className = 'background-legend-close';\n closeBtn.innerHTML = '×';\n closeBtn.title = 'Close';\n closeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.closeBackgroundLegend();\n });\n\n header.appendChild(title);\n header.appendChild(closeBtn);\n\n // Quick actions row\n const actionsRow = document.createElement('div');\n actionsRow.className = 'background-legend-actions';\n\n const showAllBtn = document.createElement('button');\n showAllBtn.className = 'background-legend-action-btn';\n showAllBtn.textContent = 'Show All';\n showAllBtn.addEventListener('click', () => this.setAllBackgroundLayersVisibility(true));\n\n const hideAllBtn = document.createElement('button');\n hideAllBtn.className = 'background-legend-action-btn';\n hideAllBtn.textContent = 'Hide All';\n hideAllBtn.addEventListener('click', () => this.setAllBackgroundLayersVisibility(false));\n\n actionsRow.appendChild(showAllBtn);\n actionsRow.appendChild(hideAllBtn);\n\n // Filter row - \"Only rendered\" checkbox\n const filterRow = document.createElement('div');\n filterRow.className = 'background-legend-filter';\n\n const filterCheckbox = document.createElement('input');\n filterCheckbox.type = 'checkbox';\n filterCheckbox.className = 'background-legend-filter-checkbox';\n filterCheckbox.id = 'background-legend-only-rendered';\n filterCheckbox.checked = this.state.onlyRenderedFilter;\n filterCheckbox.addEventListener('change', () => {\n this.state.onlyRenderedFilter = filterCheckbox.checked;\n const layerList = panel.querySelector('.background-legend-layer-list');\n if (layerList) {\n this.populateBackgroundLayerList(layerList as HTMLElement);\n }\n });\n\n const filterLabel = document.createElement('label');\n filterLabel.className = 'background-legend-filter-label';\n filterLabel.htmlFor = 'background-legend-only-rendered';\n filterLabel.textContent = 'Only rendered';\n\n filterRow.appendChild(filterCheckbox);\n filterRow.appendChild(filterLabel);\n\n // Layer list container (scrollable)\n const layerList = document.createElement('div');\n layerList.className = 'background-legend-layer-list';\n\n // Populate with background layers\n this.populateBackgroundLayerList(layerList);\n\n panel.appendChild(header);\n panel.appendChild(actionsRow);\n panel.appendChild(filterRow);\n panel.appendChild(layerList);\n\n return panel;\n }\n\n /**\n * Check if a layer is currently rendered in the map viewport\n */\n private isLayerRendered(layerId: string): boolean {\n try {\n const layer = this.map.getLayer(layerId);\n if (!layer) return false;\n\n // Check if layer is visible first\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n if (visibility === 'none') return false;\n\n // For raster layers, check if tiles are loaded\n if (layer.type === 'raster' || layer.type === 'hillshade') {\n // Raster layers are considered rendered if visible\n return true;\n }\n\n // For background layers (solid color), they're always rendered if visible\n if (layer.type === 'background') {\n return true;\n }\n\n // For vector layers, use queryRenderedFeatures to check if any features are visible\n const features = this.map.queryRenderedFeatures({ layers: [layerId] });\n return features.length > 0;\n } catch (error) {\n // If query fails, assume layer is rendered if we can see it\n return true;\n }\n }\n\n /**\n * Populate the background layer list with individual layers\n */\n private populateBackgroundLayerList(container: HTMLElement): void {\n container.innerHTML = ''; // Clear existing\n\n const styleLayers = this.map.getStyle().layers || [];\n\n styleLayers.forEach(layer => {\n if (!this.isUserAddedLayer(layer.id)) {\n // If \"Only rendered\" filter is enabled, skip layers that aren't rendered\n if (this.state.onlyRenderedFilter && !this.isLayerRendered(layer.id)) {\n return;\n }\n\n // This is a background layer\n const layerRow = document.createElement('div');\n layerRow.className = 'background-legend-layer-row';\n layerRow.setAttribute('data-background-layer-id', layer.id);\n\n // Checkbox\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'background-legend-checkbox';\n\n // Get visibility from map or cache\n const visibility = this.map.getLayoutProperty(layer.id, 'visibility');\n const isVisible = visibility !== 'none';\n checkbox.checked = isVisible;\n\n // Update cache\n this.state.backgroundLayerVisibility.set(layer.id, isVisible);\n\n checkbox.addEventListener('change', () => {\n this.toggleIndividualBackgroundLayer(layer.id, checkbox.checked);\n });\n\n // Layer name\n const name = document.createElement('span');\n name.className = 'background-legend-layer-name';\n name.textContent = this.generateFriendlyName(layer.id);\n name.title = layer.id; // Show full ID on hover\n\n // Layer type indicator\n const typeIndicator = document.createElement('span');\n typeIndicator.className = 'background-legend-layer-type';\n typeIndicator.textContent = layer.type;\n\n layerRow.appendChild(checkbox);\n layerRow.appendChild(name);\n layerRow.appendChild(typeIndicator);\n container.appendChild(layerRow);\n }\n });\n\n // Show message if no background layers\n if (container.children.length === 0) {\n const emptyMsg = document.createElement('p');\n emptyMsg.className = 'background-legend-empty';\n emptyMsg.textContent = this.state.onlyRenderedFilter\n ? 'No rendered layers in current view.'\n : 'No background layers found.';\n container.appendChild(emptyMsg);\n }\n }\n\n /**\n * Toggle visibility of an individual background layer\n */\n private toggleIndividualBackgroundLayer(layerId: string, visible: boolean): void {\n // Update visibility cache\n this.state.backgroundLayerVisibility.set(layerId, visible);\n\n // Apply to map\n this.map.setLayoutProperty(layerId, 'visibility', visible ? 'visible' : 'none');\n\n // Update the main Background checkbox state\n this.updateBackgroundCheckboxState();\n }\n\n /**\n * Set visibility for all background layers\n */\n private setAllBackgroundLayersVisibility(visible: boolean): void {\n const styleLayers = this.map.getStyle().layers || [];\n\n styleLayers.forEach(layer => {\n if (!this.isUserAddedLayer(layer.id)) {\n this.state.backgroundLayerVisibility.set(layer.id, visible);\n this.map.setLayoutProperty(layer.id, 'visibility', visible ? 'visible' : 'none');\n }\n });\n\n // Update checkboxes in the legend panel\n const legendPanel = this.panel.querySelector('.layer-control-background-legend');\n if (legendPanel) {\n const checkboxes = legendPanel.querySelectorAll('.background-legend-checkbox') as NodeListOf<HTMLInputElement>;\n checkboxes.forEach(checkbox => {\n checkbox.checked = visible;\n });\n }\n\n // Update main Background checkbox\n this.updateBackgroundCheckboxState();\n }\n\n /**\n * Update the main Background checkbox based on individual layer states\n */\n private updateBackgroundCheckboxState(): void {\n const styleLayers = this.map.getStyle().layers || [];\n let anyVisible = false;\n let allVisible = true;\n\n styleLayers.forEach(layer => {\n if (!this.isUserAddedLayer(layer.id)) {\n const visible = this.state.backgroundLayerVisibility.get(layer.id);\n if (visible === true) anyVisible = true;\n if (visible === false) allVisible = false;\n }\n });\n\n // Update main checkbox\n const backgroundItem = this.panel.querySelector('[data-layer-id=\"Background\"]');\n if (backgroundItem) {\n const checkbox = backgroundItem.querySelector('.layer-control-checkbox') as HTMLInputElement;\n if (checkbox) {\n checkbox.checked = anyVisible;\n checkbox.indeterminate = anyVisible && !allVisible;\n }\n }\n\n // Update layerState\n if (this.state.layerStates['Background']) {\n this.state.layerStates['Background'].visible = anyVisible;\n }\n }\n\n /**\n * Create style button for a layer\n */\n private createStyleButton(layerId: string): HTMLButtonElement | null {\n // Don't create button for Background layer\n if (layerId === 'Background') {\n return null;\n }\n\n const button = document.createElement('button');\n button.className = 'layer-control-style-button';\n button.innerHTML = '⚙'; // Gear icon\n button.title = 'Edit layer style';\n button.setAttribute('aria-label', `Edit style for ${layerId}`);\n\n button.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleStyleEditor(layerId);\n });\n\n return button;\n }\n\n /**\n * Toggle style editor for a layer\n */\n private toggleStyleEditor(layerId: string): void {\n // If this editor is already open, close it\n if (this.state.activeStyleEditor === layerId) {\n this.closeStyleEditor(layerId);\n return;\n }\n\n // Close any other open editor\n if (this.state.activeStyleEditor) {\n this.closeStyleEditor(this.state.activeStyleEditor);\n }\n\n // Open this editor\n this.openStyleEditor(layerId);\n }\n\n /**\n * Open style editor for a layer\n */\n private openStyleEditor(layerId: string): void {\n const itemEl = this.panel.querySelector(`[data-layer-id=\"${layerId}\"]`);\n if (!itemEl) return;\n\n // Cache original style if not already cached\n if (!this.state.originalStyles.has(layerId)) {\n const layer = this.map.getLayer(layerId);\n if (layer) {\n cacheOriginalLayerStyle(this.map, layerId, this.state.originalStyles);\n }\n }\n\n // Create style editor UI\n const editor = this.createStyleEditor(layerId);\n if (!editor) return;\n\n itemEl.appendChild(editor);\n this.styleEditors.set(layerId, editor);\n this.state.activeStyleEditor = layerId;\n\n // Scroll editor into view\n setTimeout(() => {\n editor.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 50);\n }\n\n /**\n * Close style editor for a layer\n */\n private closeStyleEditor(layerId: string): void {\n const editor = this.styleEditors.get(layerId);\n if (editor) {\n editor.remove();\n this.styleEditors.delete(layerId);\n }\n\n if (this.state.activeStyleEditor === layerId) {\n this.state.activeStyleEditor = null;\n }\n }\n\n /**\n * Create style editor UI\n */\n private createStyleEditor(layerId: string): HTMLDivElement | null {\n const layer = this.map.getLayer(layerId);\n if (!layer) return null;\n\n const editor = document.createElement('div');\n editor.className = 'layer-control-style-editor';\n\n // Header\n const header = document.createElement('div');\n header.className = 'style-editor-header';\n\n const title = document.createElement('span');\n title.className = 'style-editor-title';\n title.textContent = 'Edit Style';\n\n const closeBtn = document.createElement('button');\n closeBtn.className = 'style-editor-close';\n closeBtn.innerHTML = '×';\n closeBtn.title = 'Close';\n closeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.closeStyleEditor(layerId);\n });\n\n header.appendChild(title);\n header.appendChild(closeBtn);\n\n // Controls container - populate based on layer type\n const controls = document.createElement('div');\n controls.className = 'style-editor-controls';\n\n const layerType = layer.type;\n this.addStyleControlsForLayerType(controls, layerId, layerType);\n\n // Action buttons\n const actions = document.createElement('div');\n actions.className = 'style-editor-actions';\n\n const resetBtn = document.createElement('button');\n resetBtn.className = 'style-editor-button style-editor-button-reset';\n resetBtn.textContent = 'Reset';\n resetBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.resetLayerStyle(layerId);\n });\n\n const closeActionBtn = document.createElement('button');\n closeActionBtn.className = 'style-editor-button style-editor-button-close';\n closeActionBtn.textContent = 'Close';\n closeActionBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.closeStyleEditor(layerId);\n });\n\n actions.appendChild(resetBtn);\n actions.appendChild(closeActionBtn);\n\n editor.appendChild(header);\n editor.appendChild(controls);\n editor.appendChild(actions);\n\n return editor;\n }\n\n /**\n * Add style controls based on layer type\n */\n private addStyleControlsForLayerType(container: HTMLElement, layerId: string, layerType: string): void {\n switch (layerType) {\n case 'fill':\n this.addFillControls(container, layerId);\n break;\n case 'line':\n this.addLineControls(container, layerId);\n break;\n case 'circle':\n this.addCircleControls(container, layerId);\n break;\n case 'raster':\n this.addRasterControls(container, layerId);\n break;\n case 'symbol':\n this.addSymbolControls(container, layerId);\n break;\n default:\n container.textContent = `Style controls for ${layerType} layers not yet implemented.`;\n }\n }\n\n /**\n * Add controls for fill layers\n */\n private addFillControls(container: HTMLElement, layerId: string): void {\n // Fill Color - try layer definition first, then runtime property\n const style = this.map.getStyle();\n const layer = style.layers?.find(l => l.id === layerId);\n let fillColor: any = undefined;\n\n // First try to get from layer definition\n if (layer && 'paint' in layer && layer.paint && 'fill-color' in layer.paint) {\n fillColor = layer.paint['fill-color'];\n }\n\n // Fallback to runtime property if not in definition\n if (!fillColor) {\n fillColor = this.map.getPaintProperty(layerId, 'fill-color');\n }\n\n this.createColorControl(container, layerId, 'fill-color', 'Fill Color', normalizeColor(fillColor || '#088'));\n\n // Fill Opacity\n const fillOpacity = this.map.getPaintProperty(layerId, 'fill-opacity');\n if (fillOpacity !== undefined && typeof fillOpacity === 'number') {\n this.createSliderControl(container, layerId, 'fill-opacity', 'Fill Opacity', fillOpacity, 0, 1, 0.05);\n }\n\n // Fill Outline Color\n const outlineColor = this.map.getPaintProperty(layerId, 'fill-outline-color');\n if (outlineColor !== undefined) {\n this.createColorControl(container, layerId, 'fill-outline-color', 'Outline Color', normalizeColor(outlineColor));\n }\n }\n\n /**\n * Add controls for line layers\n */\n private addLineControls(container: HTMLElement, layerId: string): void {\n // Line Color - try layer definition first, then runtime property\n const style = this.map.getStyle();\n const layer = style.layers?.find(l => l.id === layerId);\n let lineColor: any = undefined;\n\n // First try to get from layer definition\n if (layer && 'paint' in layer && layer.paint && 'line-color' in layer.paint) {\n lineColor = layer.paint['line-color'];\n }\n\n // Fallback to runtime property if not in definition\n if (!lineColor) {\n lineColor = this.map.getPaintProperty(layerId, 'line-color');\n }\n\n this.createColorControl(container, layerId, 'line-color', 'Line Color', normalizeColor(lineColor || '#000'));\n\n // Line Width\n const lineWidth = this.map.getPaintProperty(layerId, 'line-width');\n this.createSliderControl(container, layerId, 'line-width', 'Line Width', typeof lineWidth === 'number' ? lineWidth : 1, 0, 20, 0.5);\n\n // Line Opacity\n const lineOpacity = this.map.getPaintProperty(layerId, 'line-opacity');\n if (lineOpacity !== undefined && typeof lineOpacity === 'number') {\n this.createSliderControl(container, layerId, 'line-opacity', 'Line Opacity', lineOpacity, 0, 1, 0.05);\n }\n\n // Line Blur\n const lineBlur = this.map.getPaintProperty(layerId, 'line-blur');\n if (lineBlur !== undefined && typeof lineBlur === 'number') {\n this.createSliderControl(container, layerId, 'line-blur', 'Line Blur', lineBlur, 0, 5, 0.1);\n }\n }\n\n /**\n * Add controls for circle layers\n */\n private addCircleControls(container: HTMLElement, layerId: string): void {\n // Circle Color - try layer definition first, then runtime property\n const style = this.map.getStyle();\n const layer = style.layers?.find(l => l.id === layerId);\n let circleColor: any = undefined;\n\n // First try to get from layer definition\n if (layer && 'paint' in layer && layer.paint && 'circle-color' in layer.paint) {\n circleColor = layer.paint['circle-color'];\n }\n\n // Fallback to runtime property if not in definition\n if (!circleColor) {\n circleColor = this.map.getPaintProperty(layerId, 'circle-color');\n }\n\n this.createColorControl(container, layerId, 'circle-color', 'Circle Color', normalizeColor(circleColor || '#000'));\n\n // Circle Radius\n const circleRadius = this.map.getPaintProperty(layerId, 'circle-radius');\n this.createSliderControl(container, layerId, 'circle-radius', 'Radius', typeof circleRadius === 'number' ? circleRadius : 5, 0, 40, 0.5);\n\n // Circle Opacity\n const circleOpacity = this.map.getPaintProperty(layerId, 'circle-opacity');\n if (circleOpacity !== undefined && typeof circleOpacity === 'number') {\n this.createSliderControl(container, layerId, 'circle-opacity', 'Opacity', circleOpacity, 0, 1, 0.05);\n }\n\n // Circle Stroke Color\n const strokeColor = this.map.getPaintProperty(layerId, 'circle-stroke-color');\n if (strokeColor !== undefined) {\n this.createColorControl(container, layerId, 'circle-stroke-color', 'Stroke Color', normalizeColor(strokeColor));\n }\n\n // Circle Stroke Width\n const strokeWidth = this.map.getPaintProperty(layerId, 'circle-stroke-width');\n if (strokeWidth !== undefined && typeof strokeWidth === 'number') {\n this.createSliderControl(container, layerId, 'circle-stroke-width', 'Stroke Width', strokeWidth, 0, 10, 0.1);\n }\n }\n\n /**\n * Add controls for raster layers\n */\n private addRasterControls(container: HTMLElement, layerId: string): void {\n // Raster Opacity\n const rasterOpacity = this.map.getPaintProperty(layerId, 'raster-opacity');\n this.createSliderControl(container, layerId, 'raster-opacity', 'Opacity', typeof rasterOpacity === 'number' ? rasterOpacity : 1, 0, 1, 0.05);\n\n // Raster Brightness Min\n const brightnessMin = this.map.getPaintProperty(layerId, 'raster-brightness-min');\n this.createSliderControl(container, layerId, 'raster-brightness-min', 'Brightness Min', typeof brightnessMin === 'number' ? brightnessMin : 0, -1, 1, 0.05);\n\n // Raster Brightness Max\n const brightnessMax = this.map.getPaintProperty(layerId, 'raster-brightness-max');\n this.createSliderControl(container, layerId, 'raster-brightness-max', 'Brightness Max', typeof brightnessMax === 'number' ? brightnessMax : 1, -1, 1, 0.05);\n\n // Raster Saturation\n const saturation = this.map.getPaintProperty(layerId, 'raster-saturation');\n this.createSliderControl(container, layerId, 'raster-saturation', 'Saturation', typeof saturation === 'number' ? saturation : 0, -1, 1, 0.05);\n\n // Raster Contrast\n const contrast = this.map.getPaintProperty(layerId, 'raster-contrast');\n this.createSliderControl(container, layerId, 'raster-contrast', 'Contrast', typeof contrast === 'number' ? contrast : 0, -1, 1, 0.05);\n\n // Raster Hue Rotate\n const hueRotate = this.map.getPaintProperty(layerId, 'raster-hue-rotate');\n this.createSliderControl(container, layerId, 'raster-hue-rotate', 'Hue Rotate', typeof hueRotate === 'number' ? hueRotate : 0, 0, 360, 5);\n }\n\n /**\n * Add controls for symbol layers\n */\n private addSymbolControls(container: HTMLElement, layerId: string): void {\n // Text Color\n const textColor = this.map.getPaintProperty(layerId, 'text-color');\n if (textColor !== undefined) {\n this.createColorControl(container, layerId, 'text-color', 'Text Color', normalizeColor(textColor));\n }\n\n // Text Opacity\n const textOpacity = this.map.getPaintProperty(layerId, 'text-opacity');\n if (textOpacity !== undefined && typeof textOpacity === 'number') {\n this.createSliderControl(container, layerId, 'text-opacity', 'Text Opacity', textOpacity, 0, 1, 0.05);\n }\n\n // Icon Opacity\n const iconOpacity = this.map.getPaintProperty(layerId, 'icon-opacity');\n if (iconOpacity !== undefined && typeof iconOpacity === 'number') {\n this.createSliderControl(container, layerId, 'icon-opacity', 'Icon Opacity', iconOpacity, 0, 1, 0.05);\n }\n }\n\n /**\n * Create a color control\n */\n private createColorControl(\n container: HTMLElement,\n layerId: string,\n property: string,\n label: string,\n initialValue: string\n ): void {\n const controlGroup = document.createElement('div');\n controlGroup.className = 'style-control-group';\n\n const labelEl = document.createElement('label');\n labelEl.className = 'style-control-label';\n labelEl.textContent = label;\n\n const inputWrapper = document.createElement('div');\n inputWrapper.className = 'style-control-color-group';\n\n const colorInput = document.createElement('input');\n colorInput.type = 'color';\n colorInput.className = 'style-control-color-picker';\n colorInput.value = initialValue;\n colorInput.dataset.property = property;\n\n const hexDisplay = document.createElement('input');\n hexDisplay.type = 'text';\n hexDisplay.className = 'style-control-color-value';\n hexDisplay.value = initialValue;\n hexDisplay.readOnly = true;\n\n colorInput.addEventListener('input', () => {\n const color = colorInput.value;\n hexDisplay.value = color;\n this.map.setPaintProperty(layerId, property, color);\n });\n\n inputWrapper.appendChild(colorInput);\n inputWrapper.appendChild(hexDisplay);\n\n controlGroup.appendChild(labelEl);\n controlGroup.appendChild(inputWrapper);\n\n container.appendChild(controlGroup);\n }\n\n /**\n * Create a slider control\n */\n private createSliderControl(\n container: HTMLElement,\n layerId: string,\n property: string,\n label: string,\n initialValue: number,\n min: number,\n max: number,\n step: number\n ): void {\n const controlGroup = document.createElement('div');\n controlGroup.className = 'style-control-group';\n\n const labelEl = document.createElement('label');\n labelEl.className = 'style-control-label';\n labelEl.textContent = label;\n\n const inputWrapper = document.createElement('div');\n inputWrapper.className = 'style-control-input-wrapper';\n\n const slider = document.createElement('input');\n slider.type = 'range';\n slider.className = 'style-control-slider';\n slider.min = String(min);\n slider.max = String(max);\n slider.step = String(step);\n slider.value = String(initialValue);\n slider.dataset.property = property;\n\n const valueDisplay = document.createElement('span');\n valueDisplay.className = 'style-control-value';\n valueDisplay.textContent = formatNumericValue(initialValue, step);\n\n slider.addEventListener('input', () => {\n const value = parseFloat(slider.value);\n valueDisplay.textContent = formatNumericValue(value, step);\n this.map.setPaintProperty(layerId, property, value);\n });\n\n inputWrapper.appendChild(slider);\n inputWrapper.appendChild(valueDisplay);\n\n controlGroup.appendChild(labelEl);\n controlGroup.appendChild(inputWrapper);\n\n container.appendChild(controlGroup);\n }\n\n /**\n * Reset layer style to original\n */\n private resetLayerStyle(layerId: string): void {\n const originalStyle = this.state.originalStyles.get(layerId);\n if (!originalStyle) return;\n\n // Restore original paint properties\n restoreOriginalStyle(this.map, layerId, this.state.originalStyles);\n\n // Update UI controls to reflect the reset values\n const editor = this.styleEditors.get(layerId);\n if (editor) {\n // Update all slider controls\n const sliders = editor.querySelectorAll('.style-control-slider') as NodeListOf<HTMLInputElement>;\n sliders.forEach(slider => {\n const property = slider.dataset.property;\n if (property) {\n const value = this.map.getPaintProperty(layerId, property);\n if (value !== undefined && typeof value === 'number') {\n slider.value = String(value);\n // Update value display\n const valueDisplay = slider.parentElement?.querySelector('.style-control-value');\n if (valueDisplay) {\n const step = parseFloat(slider.step);\n valueDisplay.textContent = formatNumericValue(value, step);\n }\n }\n }\n });\n\n // Update all color controls\n const colorPickers = editor.querySelectorAll('.style-control-color-picker') as NodeListOf<HTMLInputElement>;\n colorPickers.forEach(picker => {\n const property = picker.dataset.property;\n if (property) {\n const value = this.map.getPaintProperty(layerId, property);\n if (value !== undefined) {\n const hexColor = normalizeColor(value);\n picker.value = hexColor;\n // Update hex display\n const hexDisplay = picker.parentElement?.querySelector('.style-control-color-value');\n if (hexDisplay) {\n hexDisplay.textContent = hexColor;\n }\n }\n }\n });\n }\n }\n\n /**\n * Update layer states from map (sync UI with map)\n */\n private updateLayerStatesFromMap(): void {\n if (this.state.userInteractingWithSlider) {\n return; // Don't update while user is dragging\n }\n\n Object.keys(this.state.layerStates).forEach(layerId => {\n try {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n // Check visibility\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n const isVisible = visibility !== 'none';\n\n // Get opacity\n const layerType = layer.type;\n const opacity = getLayerOpacity(this.map, layerId, layerType);\n\n // Update local state\n if (this.state.layerStates[layerId]) {\n this.state.layerStates[layerId].visible = isVisible;\n this.state.layerStates[layerId].opacity = opacity;\n }\n\n // Update UI\n this.updateUIForLayer(layerId, isVisible, opacity);\n } catch (error) {\n console.warn(`Failed to update state for layer ${layerId}:`, error);\n }\n });\n }\n\n /**\n * Update UI elements for a specific layer\n */\n private updateUIForLayer(layerId: string, visible: boolean, opacity: number): void {\n const layerItems = this.panel.querySelectorAll('.layer-control-item');\n\n layerItems.forEach(item => {\n if ((item as HTMLElement).dataset.layerId === layerId) {\n const checkbox = item.querySelector('.layer-control-checkbox') as HTMLInputElement;\n const opacitySlider = item.querySelector('.layer-control-opacity') as HTMLInputElement;\n\n if (checkbox) {\n checkbox.checked = visible;\n }\n\n if (opacitySlider) {\n opacitySlider.value = String(opacity);\n opacitySlider.title = `Opacity: ${Math.round(opacity * 100)}%`;\n }\n }\n });\n }\n\n /**\n * Check for new layers and add them to the control\n */\n private checkForNewLayers(): void {\n try {\n const style = this.map.getStyle();\n if (!style || !style.layers) {\n return;\n }\n\n const currentMapLayers = style.layers\n .map(layer => layer.id)\n .filter(id => {\n // Exclude basemap layers (those not in layerStates initially)\n // Include only user-added layers\n if (this.targetLayers.length > 0) {\n return this.targetLayers.includes(id);\n }\n return true;\n });\n\n // Find new layers that aren't in our state yet\n const newLayers: string[] = [];\n currentMapLayers.forEach(layerId => {\n if (layerId !== 'Background' && !this.state.layerStates[layerId]) {\n const layer = this.map.getLayer(layerId);\n if (layer) {\n newLayers.push(layerId);\n }\n }\n });\n\n // Add UI for new layers\n if (newLayers.length > 0) {\n newLayers.forEach(layerId => {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n // Get layer type and opacity\n const layerType = layer.type;\n const opacity = getLayerOpacity(this.map, layerId, layerType);\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n const isVisible = visibility !== 'none';\n\n // Add to state\n this.state.layerStates[layerId] = {\n visible: isVisible,\n opacity: opacity,\n name: layerId.replace(/-/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()),\n };\n\n // Add to UI\n this.addLayerItem(layerId, this.state.layerStates[layerId]);\n });\n }\n } catch (error) {\n console.warn('Failed to check for new layers:', error);\n }\n }\n}\n"],"names":["opacity","clamp","layerList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/lib/utils/layerUtils.ts","../src/lib/utils/styleCache.ts","../src/lib/utils/colorUtils.ts","../src/lib/utils/formatters.ts","../src/lib/core/LayerControl.ts"],"sourcesContent":["import type { Map as MapLibreMap } from 'maplibre-gl';\nimport type { StyleableLayerType } from '../core/types';\n\n/**\n * Get the opacity property name for a given layer type\n * @param layerType MapLibre layer type\n * @returns Opacity property name(s)\n */\nexport function getOpacityProperty(layerType: string): string | string[] {\n switch (layerType) {\n case 'fill':\n return 'fill-opacity';\n case 'line':\n return 'line-opacity';\n case 'circle':\n return 'circle-opacity';\n case 'symbol':\n // Symbol layers have both icon and text opacity\n return ['icon-opacity', 'text-opacity'];\n case 'raster':\n return 'raster-opacity';\n case 'background':\n return 'background-opacity';\n default:\n return `${layerType}-opacity`;\n }\n}\n\n/**\n * Get the current opacity value for a layer\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param layerType Layer type\n * @returns Current opacity value (0-1)\n */\nexport function getLayerOpacity(\n map: MapLibreMap,\n layerId: string,\n layerType: string\n): number {\n const opacityProp = getOpacityProperty(layerType);\n\n if (Array.isArray(opacityProp)) {\n // For symbol layers, use icon-opacity as the primary value\n const opacity = map.getPaintProperty(layerId, opacityProp[0]);\n return (opacity !== undefined && opacity !== null) ? opacity as number : 1.0;\n }\n\n const opacity = map.getPaintProperty(layerId, opacityProp);\n return (opacity !== undefined && opacity !== null) ? opacity as number : 1.0;\n}\n\n/**\n * Set the opacity for a layer\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param layerType Layer type\n * @param opacity Opacity value (0-1)\n */\nexport function setLayerOpacity(\n map: MapLibreMap,\n layerId: string,\n layerType: string,\n opacity: number\n): void {\n const opacityProp = getOpacityProperty(layerType);\n\n if (Array.isArray(opacityProp)) {\n // For symbol layers, set both icon and text opacity\n opacityProp.forEach((prop) => {\n map.setPaintProperty(layerId, prop, opacity);\n });\n } else {\n map.setPaintProperty(layerId, opacityProp, opacity);\n }\n}\n\n/**\n * Check if a layer type supports style editing\n * @param layerType Layer type\n * @returns True if the layer type supports style editing\n */\nexport function isStyleableLayerType(layerType: string): layerType is StyleableLayerType {\n return ['fill', 'line', 'circle', 'symbol', 'raster'].includes(layerType);\n}\n\n/**\n * Get layer type from map\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @returns Layer type or null if layer not found\n */\nexport function getLayerType(map: MapLibreMap, layerId: string): string | null {\n try {\n const layer = map.getLayer(layerId);\n return layer ? layer.type : null;\n } catch (error) {\n console.warn(`Failed to get layer type for ${layerId}:`, error);\n return null;\n }\n}\n","import type { Map as MapLibreMap } from 'maplibre-gl';\nimport type { OriginalStyle } from '../core/types';\n\n/**\n * Deep clone a paint value (handles complex MapLibre expressions)\n * @param value Paint value to clone\n * @returns Cloned value\n */\nexport function clonePaintValue(value: any): any {\n if (Array.isArray(value)) {\n return value.map((item) => clonePaintValue(item));\n }\n if (value && typeof value === 'object') {\n try {\n return JSON.parse(JSON.stringify(value));\n } catch (error) {\n return value;\n }\n }\n return value;\n}\n\n/**\n * Cache the original paint properties for a layer\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param originalStyles Map to store original styles\n */\nexport function cacheOriginalLayerStyle(\n map: MapLibreMap,\n layerId: string,\n originalStyles: Map<string, OriginalStyle>\n): void {\n if (originalStyles.has(layerId)) {\n return; // Already cached\n }\n\n try {\n const layer = map.getLayer(layerId);\n if (!layer) {\n return;\n }\n\n const paint: Record<string, any> = {};\n const style = map.getStyle();\n const layerDef = style.layers?.find(l => l.id === layerId);\n\n // For raster layers, handle all properties with defaults\n if (layer.type === 'raster') {\n // Default values from MapLibre GL spec\n const rasterDefaults: Record<string, number> = {\n 'raster-opacity': 1,\n 'raster-brightness-min': 0,\n 'raster-brightness-max': 1,\n 'raster-saturation': 0,\n 'raster-contrast': 0,\n 'raster-hue-rotate': 0\n };\n\n // Start with defaults\n Object.assign(paint, rasterDefaults);\n\n // Override with values from layer definition\n if (layerDef && 'paint' in layerDef && layerDef.paint) {\n Object.entries(layerDef.paint).forEach(([prop, value]) => {\n if (prop.startsWith('raster-')) {\n paint[prop] = clonePaintValue(value);\n }\n });\n }\n } else {\n // For non-raster layers, just get values from the layer definition\n if (layerDef && 'paint' in layerDef && layerDef.paint) {\n Object.entries(layerDef.paint).forEach(([prop, value]) => {\n paint[prop] = clonePaintValue(value);\n });\n }\n }\n\n originalStyles.set(layerId, { paint });\n } catch (error) {\n console.warn(`Failed to cache original style for ${layerId}:`, error);\n }\n}\n\n/**\n * Get the current value of a paint property\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param property Property name\n * @param fallback Fallback value if property is not set\n * @returns Current property value\n */\nexport function getCurrentPaintValue(\n map: MapLibreMap,\n layerId: string,\n property: string,\n fallback?: any\n): any {\n try {\n const value = map.getPaintProperty(layerId, property);\n return value !== undefined ? value : fallback;\n } catch (error) {\n return fallback;\n }\n}\n\n/**\n * Restore original paint properties for a layer\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param originalStyles Map of original styles\n * @returns Object with restored properties\n */\nexport function restoreOriginalStyle(\n map: MapLibreMap,\n layerId: string,\n originalStyles: Map<string, OriginalStyle>\n): Record<string, any> {\n const original = originalStyles.get(layerId);\n if (!original) {\n return {};\n }\n\n const applied: Record<string, any> = {};\n\n Object.entries(original.paint).forEach(([property, value]) => {\n try {\n const restoredValue = clonePaintValue(value);\n map.setPaintProperty(layerId, property, restoredValue);\n applied[property] = restoredValue;\n } catch (error) {\n console.warn(`Failed to restore ${property} for ${layerId}:`, error);\n }\n });\n\n return applied;\n}\n","/**\n * Convert RGB values to hex color string\n * @param r Red component (0-255)\n * @param g Green component (0-255)\n * @param b Blue component (0-255)\n * @returns Hex color string (e.g., '#ff0000')\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n const toHex = (v: number) => {\n const hex = clamp(v).toString(16);\n return hex.length === 1 ? `0${hex}` : hex;\n };\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n/**\n * Normalize a color value to hex format\n * Handles hex strings, RGB strings, and RGB arrays\n * @param value Color value in various formats\n * @returns Normalized hex color string (always 6 digits)\n */\nexport function normalizeColor(value: any): string {\n if (typeof value === 'string') {\n // Already hex format\n if (value.startsWith('#')) {\n // Expand shorthand hex (#RGB to #RRGGBB)\n if (value.length === 4) {\n const r = value[1];\n const g = value[2];\n const b = value[3];\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n return value;\n }\n\n // RGB string format: 'rgb(51, 136, 255)'\n if (value.startsWith('rgb')) {\n const match = value.match(/\\d+/g);\n if (match && match.length >= 3) {\n const [r, g, b] = match.map((num) => parseInt(num, 10));\n return rgbToHex(r, g, b);\n }\n }\n } else if (Array.isArray(value) && value.length >= 3) {\n // RGB array format: [51, 136, 255]\n return rgbToHex(value[0], value[1], value[2]);\n }\n\n // Fallback color (MapLibre default blue)\n return '#3388ff';\n}\n","/**\n * Format a numeric value based on the step size\n * @param value Numeric value to format\n * @param step Step size (determines decimal places)\n * @returns Formatted string\n */\nexport function formatNumericValue(value: number, step: number): string {\n let decimals = 0;\n\n if (step && Number(step) !== 1) {\n const stepNumber = Number(step);\n if (stepNumber > 0 && stepNumber < 1) {\n decimals = Math.min(4, Math.ceil(Math.abs(Math.log10(stepNumber))));\n }\n }\n\n return value.toFixed(decimals);\n}\n\n/**\n * Clamp a numeric value between min and max\n * @param value Value to clamp\n * @param min Minimum value\n * @param max Maximum value\n * @returns Clamped value\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n","import type { IControl, Map as MapLibreMap } from 'maplibre-gl';\nimport type {\n LayerControlOptions,\n LayerState,\n OriginalStyle,\n InternalControlState,\n} from './types';\nimport { getLayerType, getLayerOpacity, setLayerOpacity } from '../utils/layerUtils';\nimport { cacheOriginalLayerStyle, restoreOriginalStyle } from '../utils/styleCache';\nimport { normalizeColor } from '../utils/colorUtils';\nimport { formatNumericValue } from '../utils/formatters';\n\n/**\n * LayerControl - A comprehensive layer control for MapLibre GL\n * Provides visibility toggle, opacity control, and advanced style editing\n */\nexport class LayerControl implements IControl {\n private map!: MapLibreMap;\n private container!: HTMLDivElement;\n private button!: HTMLButtonElement;\n private panel!: HTMLDivElement;\n\n // State management\n private state: InternalControlState;\n private targetLayers: string[];\n private styleEditors: Map<string, HTMLElement>;\n\n // Panel width management\n private minPanelWidth: number;\n private maxPanelWidth: number;\n private showStyleEditor: boolean;\n private showOpacitySlider: boolean;\n private widthSliderEl: HTMLElement | null = null;\n private widthThumbEl: HTMLElement | null = null;\n private widthValueEl: HTMLElement | null = null;\n private isWidthSliderActive = false;\n private widthDragRectWidth: number | null = null;\n private widthDragStartX: number | null = null;\n private widthDragStartWidth: number | null = null;\n private widthFrame: number | null = null;\n\n constructor(options: LayerControlOptions = {}) {\n this.minPanelWidth = options.panelMinWidth || 240;\n this.maxPanelWidth = options.panelMaxWidth || 420;\n this.showStyleEditor = options.showStyleEditor !== false;\n this.showOpacitySlider = options.showOpacitySlider !== false;\n\n this.state = {\n collapsed: options.collapsed !== false,\n panelWidth: options.panelWidth || 320,\n activeStyleEditor: null,\n layerStates: options.layerStates || {},\n originalStyles: new Map<string, OriginalStyle>(),\n userInteractingWithSlider: false,\n backgroundLegendOpen: false,\n backgroundLayerVisibility: new Map<string, boolean>(),\n onlyRenderedFilter: false,\n };\n\n this.targetLayers = options.layers || Object.keys(this.state.layerStates);\n this.styleEditors = new Map<string, HTMLElement>();\n }\n\n /**\n * Called when the control is added to the map\n */\n onAdd(map: MapLibreMap): HTMLElement {\n this.map = map;\n\n // Auto-detect layers if layerStates not provided\n if (Object.keys(this.state.layerStates).length === 0) {\n this.autoDetectLayers();\n }\n\n this.container = this.createContainer();\n this.button = this.createToggleButton();\n this.panel = this.createPanel();\n\n this.container.appendChild(this.button);\n this.container.appendChild(this.panel);\n\n // Now that panel is attached, update width display\n this.updateWidthDisplay();\n\n // Setup event listeners\n this.setupEventListeners();\n\n // Build layer items\n this.buildLayerItems();\n\n return this.container;\n }\n\n /**\n * Called when the control is removed from the map\n */\n onRemove(): void {\n this.container.parentNode?.removeChild(this.container);\n // Cleanup will be handled by garbage collection\n }\n\n /**\n * Auto-detect layers from the map and populate layerStates\n */\n private autoDetectLayers(): void {\n const style = this.map.getStyle();\n if (!style || !style.layers) {\n return;\n }\n\n // Get all layer IDs from the map\n const allLayerIds = style.layers.map(layer => layer.id);\n\n if (this.targetLayers.length === 0) {\n // No layers specified - auto-detect user-added layers vs background layers\n // Get the original style's source IDs to determine which layers are from the base style\n const originalSourceIds = this.getOriginalStyleSourceIds();\n\n const userAddedLayers: string[] = [];\n const backgroundLayerIds: string[] = [];\n\n allLayerIds.forEach(layerId => {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n // Check if this layer uses a source from the original style\n const sourceId = (layer as any).source;\n\n // Layers without a source (like background color layer) are background layers\n // Layers using sources NOT in the original style are user-added\n if (!sourceId || originalSourceIds.has(sourceId)) {\n backgroundLayerIds.push(layerId);\n } else {\n userAddedLayers.push(layerId);\n }\n });\n\n // Add Background entry if there are background layers\n if (backgroundLayerIds.length > 0) {\n this.state.layerStates['Background'] = {\n visible: true,\n opacity: 1.0,\n name: 'Background'\n };\n }\n\n // Add entries for auto-detected user layers\n userAddedLayers.forEach(layerId => {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n const isVisible = visibility !== 'none';\n const layerType = layer.type;\n const opacity = getLayerOpacity(this.map, layerId, layerType);\n const friendlyName = this.generateFriendlyName(layerId);\n\n this.state.layerStates[layerId] = {\n visible: isVisible,\n opacity: opacity,\n name: friendlyName\n };\n });\n } else {\n // Specific layers requested - separate into user layers + Background\n const userLayers: string[] = [];\n const basemapLayers: string[] = [];\n\n allLayerIds.forEach(layerId => {\n if (this.targetLayers.includes(layerId)) {\n userLayers.push(layerId);\n } else {\n basemapLayers.push(layerId);\n }\n });\n\n // Add Background entry if there are basemap layers\n if (basemapLayers.length > 0) {\n this.state.layerStates['Background'] = {\n visible: true,\n opacity: 1.0,\n name: 'Background'\n };\n }\n\n // Add entries for user-specified layers\n userLayers.forEach(layerId => {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n // Get visibility\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n const isVisible = visibility !== 'none';\n\n // Get opacity\n const layerType = layer.type;\n const opacity = getLayerOpacity(this.map, layerId, layerType);\n\n // Generate friendly name from layer ID\n const friendlyName = this.generateFriendlyName(layerId);\n\n this.state.layerStates[layerId] = {\n visible: isVisible,\n opacity: opacity,\n name: friendlyName\n };\n });\n }\n\n // Update targetLayers to include detected layers\n this.targetLayers = Object.keys(this.state.layerStates);\n }\n\n /**\n * Get the source IDs that were part of the original style (from the style URL)\n * Sources added via map.addSource() are considered user-added\n */\n private getOriginalStyleSourceIds(): Set<string> {\n const originalSourceIds = new Set<string>();\n const style = this.map.getStyle();\n if (!style || !style.sources) return originalSourceIds;\n\n // Try to determine the style's base URL from sprite or glyphs\n const spriteUrl = style.sprite as string | undefined;\n const glyphsUrl = style.glyphs;\n\n let styleBaseDomain = '';\n if (spriteUrl) {\n try {\n const url = new URL(typeof spriteUrl === 'string' ? spriteUrl : '');\n styleBaseDomain = url.hostname;\n } catch {\n // Ignore URL parsing errors\n }\n } else if (glyphsUrl) {\n try {\n const url = new URL(glyphsUrl.replace('{fontstack}', 'test').replace('{range}', 'test'));\n styleBaseDomain = url.hostname;\n } catch {\n // Ignore URL parsing errors\n }\n }\n\n // Check each source to determine if it's from the original style\n Object.entries(style.sources).forEach(([sourceId, source]) => {\n const src = source as any;\n\n // Check if this source matches the style's base domain\n let sourceUrl = src.url || (src.tiles && src.tiles[0]) || '';\n\n if (sourceUrl) {\n try {\n const url = new URL(sourceUrl);\n // If source is from the same domain as the style, it's original\n if (styleBaseDomain && url.hostname === styleBaseDomain) {\n originalSourceIds.add(sourceId);\n return;\n }\n // Common tile providers that are typically part of base styles\n const basemapDomains = [\n 'demotiles.maplibre.org',\n 'api.maptiler.com',\n 'tiles.stadiamaps.com',\n 'api.mapbox.com',\n 'basemaps.cartocdn.com'\n ];\n if (basemapDomains.some(domain => url.hostname.includes(domain))) {\n originalSourceIds.add(sourceId);\n return;\n }\n } catch {\n // If URL parsing fails, check other heuristics\n }\n }\n\n // Sources without URL and without data are likely from original style\n // (e.g., composite sources, or sources defined inline in the style)\n if (!src.data && !sourceUrl && src.type !== 'geojson') {\n originalSourceIds.add(sourceId);\n }\n });\n\n return originalSourceIds;\n }\n\n /**\n * Generate a friendly display name from a layer ID\n */\n private generateFriendlyName(layerId: string): string {\n // Remove common prefixes\n let name = layerId.replace(/^(layer[-_]?|gl[-_]?)/, '');\n\n // Replace dashes and underscores with spaces\n name = name.replace(/[-_]/g, ' ');\n\n // Capitalize first letter of each word\n name = name.replace(/\\b\\w/g, char => char.toUpperCase());\n\n return name || layerId; // Fallback to original if empty\n }\n\n /**\n * Create the main container element\n */\n private createContainer(): HTMLDivElement {\n const container = document.createElement('div');\n container.className = 'maplibregl-ctrl maplibregl-ctrl-group maplibregl-ctrl-layer-control';\n return container;\n }\n\n /**\n * Create the toggle button\n */\n private createToggleButton(): HTMLButtonElement {\n const button = document.createElement('button');\n button.type = 'button';\n button.title = 'Layer Control';\n button.setAttribute('aria-label', 'Layer Control');\n\n // Create layers icon (SVG)\n const icon = document.createElement('span');\n icon.className = 'layer-control-icon';\n icon.innerHTML =\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" ' +\n 'fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' +\n '<polygon points=\"12 3 3 8.25 12 13.5 21 8.25 12 3\"></polygon>' +\n '<polyline points=\"3 12.75 12 18 21 12.75\"></polyline>' +\n '<polyline points=\"3 17.25 12 22 21 17.25\"></polyline>' +\n '</svg>';\n\n button.appendChild(icon);\n return button;\n }\n\n /**\n * Create the panel element\n */\n private createPanel(): HTMLDivElement {\n const panel = document.createElement('div');\n panel.className = 'layer-control-panel';\n\n // Set initial width directly on the element\n panel.style.width = `${this.state.panelWidth}px`;\n\n if (!this.state.collapsed) {\n panel.classList.add('expanded');\n }\n\n // Add header\n const header = this.createPanelHeader();\n panel.appendChild(header);\n\n // Add action buttons (Show All / Hide All)\n const actionButtons = this.createActionButtons();\n panel.appendChild(actionButtons);\n\n return panel;\n }\n\n /**\n * Create action buttons for Show All / Hide All\n */\n private createActionButtons(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'layer-control-actions';\n\n const showAllBtn = document.createElement('button');\n showAllBtn.type = 'button';\n showAllBtn.className = 'layer-control-action-btn';\n showAllBtn.textContent = 'Show All';\n showAllBtn.title = 'Show all layers';\n showAllBtn.addEventListener('click', () => this.setAllLayersVisibility(true));\n\n const hideAllBtn = document.createElement('button');\n hideAllBtn.type = 'button';\n hideAllBtn.className = 'layer-control-action-btn';\n hideAllBtn.textContent = 'Hide All';\n hideAllBtn.title = 'Hide all layers';\n hideAllBtn.addEventListener('click', () => this.setAllLayersVisibility(false));\n\n container.appendChild(showAllBtn);\n container.appendChild(hideAllBtn);\n\n return container;\n }\n\n /**\n * Set visibility of all layers\n */\n private setAllLayersVisibility(visible: boolean): void {\n Object.keys(this.state.layerStates).forEach(layerId => {\n if (layerId === 'Background') {\n // Handle Background layer group\n this.toggleBackgroundVisibility(visible);\n } else {\n // Handle individual layers\n this.state.layerStates[layerId].visible = visible;\n this.map.setLayoutProperty(layerId, 'visibility', visible ? 'visible' : 'none');\n }\n\n // Update checkbox in UI\n const itemEl = this.panel.querySelector(`[data-layer-id=\"${layerId}\"]`);\n if (itemEl) {\n const checkbox = itemEl.querySelector('.layer-control-checkbox') as HTMLInputElement;\n if (checkbox) {\n checkbox.checked = visible;\n checkbox.indeterminate = false;\n }\n }\n });\n }\n\n /**\n * Create the panel header with title and width control\n */\n private createPanelHeader(): HTMLElement {\n const header = document.createElement('div');\n header.className = 'layer-control-panel-header';\n\n const title = document.createElement('span');\n title.className = 'layer-control-panel-title';\n title.textContent = 'Layers';\n header.appendChild(title);\n\n // Add width control\n const widthControl = this.createWidthControl();\n header.appendChild(widthControl);\n\n return header;\n }\n\n /**\n * Create the width control slider\n */\n private createWidthControl(): HTMLElement {\n const widthControl = document.createElement('label');\n widthControl.className = 'layer-control-width-control';\n widthControl.title = 'Adjust layer panel width';\n\n const widthLabel = document.createElement('span');\n widthLabel.textContent = 'Width';\n widthControl.appendChild(widthLabel);\n\n const widthSlider = document.createElement('div');\n widthSlider.className = 'layer-control-width-slider';\n widthSlider.setAttribute('role', 'slider');\n widthSlider.setAttribute('aria-valuemin', String(this.minPanelWidth));\n widthSlider.setAttribute('aria-valuemax', String(this.maxPanelWidth));\n widthSlider.setAttribute('aria-valuenow', String(this.state.panelWidth));\n widthSlider.setAttribute('aria-valuestep', '10');\n widthSlider.setAttribute('aria-label', 'Layer panel width');\n widthSlider.tabIndex = 0;\n\n const widthTrack = document.createElement('div');\n widthTrack.className = 'layer-control-width-track';\n const widthThumb = document.createElement('div');\n widthThumb.className = 'layer-control-width-thumb';\n\n widthSlider.appendChild(widthTrack);\n widthSlider.appendChild(widthThumb);\n\n this.widthSliderEl = widthSlider;\n this.widthThumbEl = widthThumb;\n\n // Add width value display\n const widthValue = document.createElement('span');\n widthValue.className = 'layer-control-width-value';\n this.widthValueEl = widthValue;\n\n widthControl.appendChild(widthSlider);\n widthControl.appendChild(widthValue);\n\n this.updateWidthDisplay();\n this.setupWidthSliderEvents(widthSlider);\n\n return widthControl;\n }\n\n /**\n * Setup event listeners for width slider\n */\n private setupWidthSliderEvents(widthSlider: HTMLElement): void {\n // Pointer events for dragging\n widthSlider.addEventListener('pointerdown', (event) => {\n event.preventDefault();\n const rect = widthSlider.getBoundingClientRect();\n this.widthDragRectWidth = rect.width || 1;\n this.widthDragStartX = event.clientX;\n this.widthDragStartWidth = this.state.panelWidth;\n this.isWidthSliderActive = true;\n widthSlider.setPointerCapture(event.pointerId);\n this.updateWidthFromPointer(event, true);\n });\n\n widthSlider.addEventListener('pointermove', (event) => {\n if (!this.isWidthSliderActive) return;\n this.updateWidthFromPointer(event);\n });\n\n const endPointerDrag = (event: PointerEvent) => {\n if (!this.isWidthSliderActive) return;\n if (event.pointerId !== undefined) {\n try {\n widthSlider.releasePointerCapture(event.pointerId);\n } catch (error) {\n // Ignore release errors\n }\n }\n this.isWidthSliderActive = false;\n this.widthDragRectWidth = null;\n this.widthDragStartX = null;\n this.widthDragStartWidth = null;\n this.updateWidthDisplay();\n };\n\n widthSlider.addEventListener('pointerup', endPointerDrag);\n widthSlider.addEventListener('pointercancel', endPointerDrag);\n widthSlider.addEventListener('lostpointercapture', endPointerDrag);\n\n // Keyboard navigation\n widthSlider.addEventListener('keydown', (event) => {\n let handled = true;\n const step = event.shiftKey ? 20 : 10;\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n this.applyPanelWidth(this.state.panelWidth - step, true);\n break;\n case 'ArrowRight':\n case 'ArrowUp':\n this.applyPanelWidth(this.state.panelWidth + step, true);\n break;\n case 'Home':\n this.applyPanelWidth(this.minPanelWidth, true);\n break;\n case 'End':\n this.applyPanelWidth(this.maxPanelWidth, true);\n break;\n case 'PageUp':\n this.applyPanelWidth(this.state.panelWidth + 50, true);\n break;\n case 'PageDown':\n this.applyPanelWidth(this.state.panelWidth - 50, true);\n break;\n default:\n handled = false;\n }\n\n if (handled) {\n event.preventDefault();\n this.updateWidthDisplay();\n }\n });\n }\n\n /**\n * Update panel width from pointer event\n */\n private updateWidthFromPointer(event: PointerEvent, resetBaseline = false): void {\n if (!this.widthSliderEl) return;\n\n const sliderWidth = this.widthDragRectWidth || this.widthSliderEl.getBoundingClientRect().width || 1;\n const widthRange = this.maxPanelWidth - this.minPanelWidth;\n\n let width: number;\n if (resetBaseline) {\n const rect = this.widthSliderEl.getBoundingClientRect();\n const relative = rect.width > 0 ? (event.clientX - rect.left) / rect.width : 0;\n const clampedRatio = Math.min(1, Math.max(0, relative));\n width = this.minPanelWidth + clampedRatio * widthRange;\n this.widthDragStartWidth = width;\n this.widthDragStartX = event.clientX;\n } else {\n const delta = event.clientX - (this.widthDragStartX || event.clientX);\n width = (this.widthDragStartWidth || this.state.panelWidth) + (delta / sliderWidth) * widthRange;\n }\n\n this.applyPanelWidth(width, this.isWidthSliderActive);\n }\n\n /**\n * Apply panel width (clamped to min/max)\n */\n private applyPanelWidth(width: number, immediate = false): void {\n const clamped = Math.round(Math.min(this.maxPanelWidth, Math.max(this.minPanelWidth, width)));\n\n const applyWidth = () => {\n this.state.panelWidth = clamped;\n const px = `${clamped}px`;\n this.panel.style.width = px;\n this.updateWidthDisplay();\n };\n\n if (immediate) {\n applyWidth();\n return;\n }\n\n if (this.widthFrame) {\n cancelAnimationFrame(this.widthFrame);\n }\n this.widthFrame = requestAnimationFrame(() => {\n applyWidth();\n this.widthFrame = null;\n });\n }\n\n /**\n * Update width display (value label and thumb position)\n */\n private updateWidthDisplay(): void {\n if (this.widthValueEl) {\n this.widthValueEl.textContent = `${this.state.panelWidth}px`;\n }\n if (this.widthSliderEl) {\n this.widthSliderEl.setAttribute('aria-valuenow', String(this.state.panelWidth));\n const ratio = (this.state.panelWidth - this.minPanelWidth) / (this.maxPanelWidth - this.minPanelWidth || 1);\n if (this.widthThumbEl) {\n const sliderWidth = this.widthSliderEl.clientWidth;\n // If element not yet rendered, defer the update\n if (sliderWidth === 0) {\n requestAnimationFrame(() => this.updateWidthDisplay());\n return;\n }\n const thumbWidth = this.widthThumbEl.offsetWidth || 14;\n const padding = 16;\n const available = Math.max(0, sliderWidth - padding - thumbWidth);\n const clampedRatio = Math.min(1, Math.max(0, ratio));\n const leftPx = 8 + available * clampedRatio;\n this.widthThumbEl.style.left = `${leftPx}px`;\n }\n }\n }\n\n /**\n * Setup main event listeners\n */\n private setupEventListeners(): void {\n // Toggle button click\n this.button.addEventListener('click', () => this.toggle());\n\n // Click outside to close\n document.addEventListener('click', (e) => {\n if (!this.container.contains(e.target as Node)) {\n this.collapse();\n }\n });\n\n // Listen for map layer changes\n this.setupLayerChangeListeners();\n }\n\n /**\n * Setup listeners for map layer changes\n */\n private setupLayerChangeListeners(): void {\n this.map.on('styledata', () => {\n setTimeout(() => {\n this.updateLayerStatesFromMap();\n this.checkForNewLayers();\n }, 100);\n });\n\n this.map.on('data', (e) => {\n if (e.sourceDataType === 'content') {\n setTimeout(() => {\n this.updateLayerStatesFromMap();\n this.checkForNewLayers();\n }, 100);\n }\n });\n\n this.map.on('sourcedata', (e) => {\n if (e.sourceDataType === 'metadata') {\n setTimeout(() => {\n this.checkForNewLayers();\n }, 150);\n }\n });\n }\n\n /**\n * Toggle panel expanded/collapsed state\n */\n private toggle(): void {\n if (this.state.collapsed) {\n this.expand();\n } else {\n this.collapse();\n }\n }\n\n /**\n * Expand the panel\n */\n private expand(): void {\n this.state.collapsed = false;\n this.panel.classList.add('expanded');\n }\n\n /**\n * Collapse the panel\n */\n private collapse(): void {\n this.state.collapsed = true;\n this.panel.classList.remove('expanded');\n }\n\n /**\n * Build layer items (called initially and when layers change)\n */\n private buildLayerItems(): void {\n // Clear existing items\n const existingItems = this.panel.querySelectorAll('.layer-control-item');\n existingItems.forEach(item => item.remove());\n this.styleEditors.clear();\n\n // Add items for all layers in our state\n Object.entries(this.state.layerStates).forEach(([layerId, state]) => {\n if (this.targetLayers.length === 0 || this.targetLayers.includes(layerId)) {\n this.addLayerItem(layerId, state);\n }\n });\n }\n\n /**\n * Add a single layer item to the panel\n */\n private addLayerItem(layerId: string, state: LayerState): void {\n const item = document.createElement('div');\n item.className = 'layer-control-item';\n item.setAttribute('data-layer-id', layerId);\n\n const row = document.createElement('div');\n row.className = 'layer-control-row';\n\n // Visibility checkbox\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'layer-control-checkbox';\n checkbox.checked = state.visible;\n checkbox.addEventListener('change', () => {\n this.toggleLayerVisibility(layerId, checkbox.checked);\n });\n\n // Layer name\n const name = document.createElement('span');\n name.className = 'layer-control-name';\n name.textContent = state.name || layerId;\n name.title = state.name || layerId;\n\n row.appendChild(checkbox);\n row.appendChild(name);\n\n // Opacity slider (conditionally shown)\n if (this.showOpacitySlider) {\n const opacity = document.createElement('input');\n opacity.type = 'range';\n opacity.className = 'layer-control-opacity';\n opacity.min = '0';\n opacity.max = '1';\n opacity.step = '0.01';\n opacity.value = String(state.opacity);\n opacity.title = `Opacity: ${Math.round(state.opacity * 100)}%`;\n\n // Handle slider interaction tracking\n opacity.addEventListener('mousedown', () => {\n this.state.userInteractingWithSlider = true;\n });\n opacity.addEventListener('mouseup', () => {\n this.state.userInteractingWithSlider = false;\n });\n\n opacity.addEventListener('input', () => {\n this.changeLayerOpacity(layerId, parseFloat(opacity.value));\n opacity.title = `Opacity: ${Math.round(parseFloat(opacity.value) * 100)}%`;\n });\n\n row.appendChild(opacity);\n }\n\n // Style button for regular layers, legend button for Background\n if (this.showStyleEditor) {\n if (layerId === 'Background') {\n const legendButton = this.createBackgroundLegendButton();\n row.appendChild(legendButton);\n } else {\n const styleButton = this.createStyleButton(layerId);\n if (styleButton) {\n row.appendChild(styleButton);\n }\n }\n }\n\n item.appendChild(row);\n this.panel.appendChild(item);\n }\n\n /**\n * Toggle layer visibility\n */\n private toggleLayerVisibility(layerId: string, visible: boolean): void {\n // Handle Background layer group\n if (layerId === 'Background') {\n this.toggleBackgroundVisibility(visible);\n return;\n }\n\n // Update local state\n if (this.state.layerStates[layerId]) {\n this.state.layerStates[layerId].visible = visible;\n }\n\n // Update map\n this.map.setLayoutProperty(layerId, 'visibility', visible ? 'visible' : 'none');\n }\n\n /**\n * Change layer opacity\n */\n private changeLayerOpacity(layerId: string, opacity: number): void {\n // Handle Background layer group\n if (layerId === 'Background') {\n this.changeBackgroundOpacity(opacity);\n return;\n }\n\n // Update local state\n if (this.state.layerStates[layerId]) {\n this.state.layerStates[layerId].opacity = opacity;\n }\n\n // Get layer type and set appropriate opacity property\n const layerType = getLayerType(this.map, layerId);\n if (layerType) {\n setLayerOpacity(this.map, layerId, layerType, opacity);\n }\n }\n\n /**\n * Check if a layer is a user-added layer (vs basemap layer)\n */\n private isUserAddedLayer(layerId: string): boolean {\n return this.state.layerStates[layerId] !== undefined && layerId !== 'Background';\n }\n\n /**\n * Toggle visibility for all background layers (basemap layers)\n */\n private toggleBackgroundVisibility(visible: boolean): void {\n // Update local state\n if (this.state.layerStates['Background']) {\n this.state.layerStates['Background'].visible = visible;\n }\n\n // Apply to all basemap layers (layers not in layerStates)\n const styleLayers = this.map.getStyle().layers || [];\n styleLayers.forEach(layer => {\n if (!this.isUserAddedLayer(layer.id)) {\n // Update visibility cache\n this.state.backgroundLayerVisibility.set(layer.id, visible);\n this.map.setLayoutProperty(layer.id, 'visibility', visible ? 'visible' : 'none');\n }\n });\n\n // Update legend panel checkboxes if open\n if (this.state.backgroundLegendOpen) {\n const legendPanel = this.panel.querySelector('.layer-control-background-legend');\n if (legendPanel) {\n const checkboxes = legendPanel.querySelectorAll('.background-legend-checkbox') as NodeListOf<HTMLInputElement>;\n checkboxes.forEach(checkbox => {\n checkbox.checked = visible;\n });\n }\n }\n }\n\n /**\n * Change opacity for all background layers (basemap layers)\n */\n private changeBackgroundOpacity(opacity: number): void {\n // Update local state\n if (this.state.layerStates['Background']) {\n this.state.layerStates['Background'].opacity = opacity;\n }\n\n // Apply to all basemap layers (layers not in layerStates)\n const styleLayers = this.map.getStyle().layers || [];\n styleLayers.forEach(styleLayer => {\n if (!this.isUserAddedLayer(styleLayer.id)) {\n const layerType = getLayerType(this.map, styleLayer.id);\n if (layerType) {\n setLayerOpacity(this.map, styleLayer.id, layerType, opacity);\n }\n }\n });\n }\n\n // ===== Background Legend Methods =====\n\n /**\n * Create legend button for Background layer\n */\n private createBackgroundLegendButton(): HTMLButtonElement {\n const button = document.createElement('button');\n button.className = 'layer-control-style-button layer-control-background-legend-button';\n button.innerHTML = '⚙'; // Gear icon (same as style button)\n button.title = 'Show background layer details';\n button.setAttribute('aria-label', 'Show background layer visibility controls');\n button.setAttribute('aria-expanded', String(this.state.backgroundLegendOpen));\n\n button.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleBackgroundLegend();\n });\n\n return button;\n }\n\n /**\n * Toggle background legend panel visibility\n */\n private toggleBackgroundLegend(): void {\n if (this.state.backgroundLegendOpen) {\n this.closeBackgroundLegend();\n } else {\n this.openBackgroundLegend();\n }\n }\n\n /**\n * Open background legend panel\n */\n private openBackgroundLegend(): void {\n // Close any open style editor first\n if (this.state.activeStyleEditor) {\n this.closeStyleEditor(this.state.activeStyleEditor);\n }\n\n const itemEl = this.panel.querySelector('[data-layer-id=\"Background\"]');\n if (!itemEl) return;\n\n // Check if panel already exists\n let legendPanel = itemEl.querySelector('.layer-control-background-legend');\n if (legendPanel) {\n // Refresh the list\n const layerList = legendPanel.querySelector('.background-legend-layer-list');\n if (layerList) {\n this.populateBackgroundLayerList(layerList as HTMLElement);\n }\n } else {\n // Create new panel\n legendPanel = this.createBackgroundLegendPanel();\n itemEl.appendChild(legendPanel);\n }\n\n this.state.backgroundLegendOpen = true;\n\n // Update button aria state\n const button = itemEl.querySelector('.layer-control-background-legend-button');\n if (button) {\n button.setAttribute('aria-expanded', 'true');\n button.classList.add('active');\n }\n\n // Scroll into view\n setTimeout(() => {\n legendPanel?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 50);\n }\n\n /**\n * Close background legend panel\n */\n private closeBackgroundLegend(): void {\n const itemEl = this.panel.querySelector('[data-layer-id=\"Background\"]');\n if (!itemEl) return;\n\n const legendPanel = itemEl.querySelector('.layer-control-background-legend');\n if (legendPanel) {\n legendPanel.remove();\n }\n\n this.state.backgroundLegendOpen = false;\n\n // Update button aria state\n const button = itemEl.querySelector('.layer-control-background-legend-button');\n if (button) {\n button.setAttribute('aria-expanded', 'false');\n button.classList.remove('active');\n }\n }\n\n /**\n * Create the background legend panel with individual layer controls\n */\n private createBackgroundLegendPanel(): HTMLDivElement {\n const panel = document.createElement('div');\n panel.className = 'layer-control-background-legend';\n\n // Header\n const header = document.createElement('div');\n header.className = 'background-legend-header';\n\n const title = document.createElement('span');\n title.className = 'background-legend-title';\n title.textContent = 'Background Layers';\n\n const closeBtn = document.createElement('button');\n closeBtn.className = 'background-legend-close';\n closeBtn.innerHTML = '×';\n closeBtn.title = 'Close';\n closeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.closeBackgroundLegend();\n });\n\n header.appendChild(title);\n header.appendChild(closeBtn);\n\n // Quick actions row\n const actionsRow = document.createElement('div');\n actionsRow.className = 'background-legend-actions';\n\n const showAllBtn = document.createElement('button');\n showAllBtn.className = 'background-legend-action-btn';\n showAllBtn.textContent = 'Show All';\n showAllBtn.addEventListener('click', () => this.setAllBackgroundLayersVisibility(true));\n\n const hideAllBtn = document.createElement('button');\n hideAllBtn.className = 'background-legend-action-btn';\n hideAllBtn.textContent = 'Hide All';\n hideAllBtn.addEventListener('click', () => this.setAllBackgroundLayersVisibility(false));\n\n actionsRow.appendChild(showAllBtn);\n actionsRow.appendChild(hideAllBtn);\n\n // Filter row - \"Only rendered\" checkbox\n const filterRow = document.createElement('div');\n filterRow.className = 'background-legend-filter';\n\n const filterCheckbox = document.createElement('input');\n filterCheckbox.type = 'checkbox';\n filterCheckbox.className = 'background-legend-filter-checkbox';\n filterCheckbox.id = 'background-legend-only-rendered';\n filterCheckbox.checked = this.state.onlyRenderedFilter;\n filterCheckbox.addEventListener('change', () => {\n this.state.onlyRenderedFilter = filterCheckbox.checked;\n const layerList = panel.querySelector('.background-legend-layer-list');\n if (layerList) {\n this.populateBackgroundLayerList(layerList as HTMLElement);\n }\n });\n\n const filterLabel = document.createElement('label');\n filterLabel.className = 'background-legend-filter-label';\n filterLabel.htmlFor = 'background-legend-only-rendered';\n filterLabel.textContent = 'Only rendered';\n\n filterRow.appendChild(filterCheckbox);\n filterRow.appendChild(filterLabel);\n\n // Layer list container (scrollable)\n const layerList = document.createElement('div');\n layerList.className = 'background-legend-layer-list';\n\n // Populate with background layers\n this.populateBackgroundLayerList(layerList);\n\n panel.appendChild(header);\n panel.appendChild(actionsRow);\n panel.appendChild(filterRow);\n panel.appendChild(layerList);\n\n return panel;\n }\n\n /**\n * Check if a layer is currently rendered in the map viewport\n */\n private isLayerRendered(layerId: string): boolean {\n try {\n const layer = this.map.getLayer(layerId);\n if (!layer) return false;\n\n // Check if layer is visible first\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n if (visibility === 'none') return false;\n\n // For raster layers, check if tiles are loaded\n if (layer.type === 'raster' || layer.type === 'hillshade') {\n // Raster layers are considered rendered if visible\n return true;\n }\n\n // For background layers (solid color), they're always rendered if visible\n if (layer.type === 'background') {\n return true;\n }\n\n // For vector layers, use queryRenderedFeatures to check if any features are visible\n const features = this.map.queryRenderedFeatures({ layers: [layerId] });\n return features.length > 0;\n } catch (error) {\n // If query fails, assume layer is rendered if we can see it\n return true;\n }\n }\n\n /**\n * Populate the background layer list with individual layers\n */\n private populateBackgroundLayerList(container: HTMLElement): void {\n container.innerHTML = ''; // Clear existing\n\n const styleLayers = this.map.getStyle().layers || [];\n\n styleLayers.forEach(layer => {\n if (!this.isUserAddedLayer(layer.id)) {\n // If \"Only rendered\" filter is enabled, skip layers that aren't rendered\n if (this.state.onlyRenderedFilter && !this.isLayerRendered(layer.id)) {\n return;\n }\n\n // This is a background layer\n const layerRow = document.createElement('div');\n layerRow.className = 'background-legend-layer-row';\n layerRow.setAttribute('data-background-layer-id', layer.id);\n\n // Checkbox\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'background-legend-checkbox';\n\n // Get visibility from map or cache\n const visibility = this.map.getLayoutProperty(layer.id, 'visibility');\n const isVisible = visibility !== 'none';\n checkbox.checked = isVisible;\n\n // Update cache\n this.state.backgroundLayerVisibility.set(layer.id, isVisible);\n\n checkbox.addEventListener('change', () => {\n this.toggleIndividualBackgroundLayer(layer.id, checkbox.checked);\n });\n\n // Layer name\n const name = document.createElement('span');\n name.className = 'background-legend-layer-name';\n name.textContent = this.generateFriendlyName(layer.id);\n name.title = layer.id; // Show full ID on hover\n\n // Layer type indicator\n const typeIndicator = document.createElement('span');\n typeIndicator.className = 'background-legend-layer-type';\n typeIndicator.textContent = layer.type;\n\n layerRow.appendChild(checkbox);\n layerRow.appendChild(name);\n layerRow.appendChild(typeIndicator);\n container.appendChild(layerRow);\n }\n });\n\n // Show message if no background layers\n if (container.children.length === 0) {\n const emptyMsg = document.createElement('p');\n emptyMsg.className = 'background-legend-empty';\n emptyMsg.textContent = this.state.onlyRenderedFilter\n ? 'No rendered layers in current view.'\n : 'No background layers found.';\n container.appendChild(emptyMsg);\n }\n }\n\n /**\n * Toggle visibility of an individual background layer\n */\n private toggleIndividualBackgroundLayer(layerId: string, visible: boolean): void {\n // Update visibility cache\n this.state.backgroundLayerVisibility.set(layerId, visible);\n\n // Apply to map\n this.map.setLayoutProperty(layerId, 'visibility', visible ? 'visible' : 'none');\n\n // Update the main Background checkbox state\n this.updateBackgroundCheckboxState();\n }\n\n /**\n * Set visibility for all background layers\n */\n private setAllBackgroundLayersVisibility(visible: boolean): void {\n const styleLayers = this.map.getStyle().layers || [];\n\n styleLayers.forEach(layer => {\n if (!this.isUserAddedLayer(layer.id)) {\n this.state.backgroundLayerVisibility.set(layer.id, visible);\n this.map.setLayoutProperty(layer.id, 'visibility', visible ? 'visible' : 'none');\n }\n });\n\n // Update checkboxes in the legend panel\n const legendPanel = this.panel.querySelector('.layer-control-background-legend');\n if (legendPanel) {\n const checkboxes = legendPanel.querySelectorAll('.background-legend-checkbox') as NodeListOf<HTMLInputElement>;\n checkboxes.forEach(checkbox => {\n checkbox.checked = visible;\n });\n }\n\n // Update main Background checkbox\n this.updateBackgroundCheckboxState();\n }\n\n /**\n * Update the main Background checkbox based on individual layer states\n */\n private updateBackgroundCheckboxState(): void {\n const styleLayers = this.map.getStyle().layers || [];\n let anyVisible = false;\n let allVisible = true;\n\n styleLayers.forEach(layer => {\n if (!this.isUserAddedLayer(layer.id)) {\n const visible = this.state.backgroundLayerVisibility.get(layer.id);\n if (visible === true) anyVisible = true;\n if (visible === false) allVisible = false;\n }\n });\n\n // Update main checkbox\n const backgroundItem = this.panel.querySelector('[data-layer-id=\"Background\"]');\n if (backgroundItem) {\n const checkbox = backgroundItem.querySelector('.layer-control-checkbox') as HTMLInputElement;\n if (checkbox) {\n checkbox.checked = anyVisible;\n checkbox.indeterminate = anyVisible && !allVisible;\n }\n }\n\n // Update layerState\n if (this.state.layerStates['Background']) {\n this.state.layerStates['Background'].visible = anyVisible;\n }\n }\n\n /**\n * Create style button for a layer\n */\n private createStyleButton(layerId: string): HTMLButtonElement | null {\n // Don't create button for Background layer\n if (layerId === 'Background') {\n return null;\n }\n\n const button = document.createElement('button');\n button.className = 'layer-control-style-button';\n button.innerHTML = '⚙'; // Gear icon\n button.title = 'Edit layer style';\n button.setAttribute('aria-label', `Edit style for ${layerId}`);\n\n button.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleStyleEditor(layerId);\n });\n\n return button;\n }\n\n /**\n * Toggle style editor for a layer\n */\n private toggleStyleEditor(layerId: string): void {\n // If this editor is already open, close it\n if (this.state.activeStyleEditor === layerId) {\n this.closeStyleEditor(layerId);\n return;\n }\n\n // Close any other open editor\n if (this.state.activeStyleEditor) {\n this.closeStyleEditor(this.state.activeStyleEditor);\n }\n\n // Open this editor\n this.openStyleEditor(layerId);\n }\n\n /**\n * Open style editor for a layer\n */\n private openStyleEditor(layerId: string): void {\n const itemEl = this.panel.querySelector(`[data-layer-id=\"${layerId}\"]`);\n if (!itemEl) return;\n\n // Cache original style if not already cached\n if (!this.state.originalStyles.has(layerId)) {\n const layer = this.map.getLayer(layerId);\n if (layer) {\n cacheOriginalLayerStyle(this.map, layerId, this.state.originalStyles);\n }\n }\n\n // Create style editor UI\n const editor = this.createStyleEditor(layerId);\n if (!editor) return;\n\n itemEl.appendChild(editor);\n this.styleEditors.set(layerId, editor);\n this.state.activeStyleEditor = layerId;\n\n // Scroll editor into view\n setTimeout(() => {\n editor.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 50);\n }\n\n /**\n * Close style editor for a layer\n */\n private closeStyleEditor(layerId: string): void {\n const editor = this.styleEditors.get(layerId);\n if (editor) {\n editor.remove();\n this.styleEditors.delete(layerId);\n }\n\n if (this.state.activeStyleEditor === layerId) {\n this.state.activeStyleEditor = null;\n }\n }\n\n /**\n * Create style editor UI\n */\n private createStyleEditor(layerId: string): HTMLDivElement | null {\n const layer = this.map.getLayer(layerId);\n if (!layer) return null;\n\n const editor = document.createElement('div');\n editor.className = 'layer-control-style-editor';\n\n // Header\n const header = document.createElement('div');\n header.className = 'style-editor-header';\n\n const title = document.createElement('span');\n title.className = 'style-editor-title';\n title.textContent = 'Edit Style';\n\n const closeBtn = document.createElement('button');\n closeBtn.className = 'style-editor-close';\n closeBtn.innerHTML = '×';\n closeBtn.title = 'Close';\n closeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.closeStyleEditor(layerId);\n });\n\n header.appendChild(title);\n header.appendChild(closeBtn);\n\n // Controls container - populate based on layer type\n const controls = document.createElement('div');\n controls.className = 'style-editor-controls';\n\n const layerType = layer.type;\n this.addStyleControlsForLayerType(controls, layerId, layerType);\n\n // Action buttons\n const actions = document.createElement('div');\n actions.className = 'style-editor-actions';\n\n const resetBtn = document.createElement('button');\n resetBtn.className = 'style-editor-button style-editor-button-reset';\n resetBtn.textContent = 'Reset';\n resetBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.resetLayerStyle(layerId);\n });\n\n const closeActionBtn = document.createElement('button');\n closeActionBtn.className = 'style-editor-button style-editor-button-close';\n closeActionBtn.textContent = 'Close';\n closeActionBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.closeStyleEditor(layerId);\n });\n\n actions.appendChild(resetBtn);\n actions.appendChild(closeActionBtn);\n\n editor.appendChild(header);\n editor.appendChild(controls);\n editor.appendChild(actions);\n\n return editor;\n }\n\n /**\n * Add style controls based on layer type\n */\n private addStyleControlsForLayerType(container: HTMLElement, layerId: string, layerType: string): void {\n switch (layerType) {\n case 'fill':\n this.addFillControls(container, layerId);\n break;\n case 'line':\n this.addLineControls(container, layerId);\n break;\n case 'circle':\n this.addCircleControls(container, layerId);\n break;\n case 'raster':\n this.addRasterControls(container, layerId);\n break;\n case 'symbol':\n this.addSymbolControls(container, layerId);\n break;\n default:\n container.textContent = `Style controls for ${layerType} layers not yet implemented.`;\n }\n }\n\n /**\n * Add controls for fill layers\n */\n private addFillControls(container: HTMLElement, layerId: string): void {\n // Fill Color - try layer definition first, then runtime property\n const style = this.map.getStyle();\n const layer = style.layers?.find(l => l.id === layerId);\n let fillColor: any = undefined;\n\n // First try to get from layer definition\n if (layer && 'paint' in layer && layer.paint && 'fill-color' in layer.paint) {\n fillColor = layer.paint['fill-color'];\n }\n\n // Fallback to runtime property if not in definition\n if (!fillColor) {\n fillColor = this.map.getPaintProperty(layerId, 'fill-color');\n }\n\n this.createColorControl(container, layerId, 'fill-color', 'Fill Color', normalizeColor(fillColor || '#088'));\n\n // Fill Opacity\n const fillOpacity = this.map.getPaintProperty(layerId, 'fill-opacity');\n if (fillOpacity !== undefined && typeof fillOpacity === 'number') {\n this.createSliderControl(container, layerId, 'fill-opacity', 'Fill Opacity', fillOpacity, 0, 1, 0.05);\n }\n\n // Fill Outline Color\n const outlineColor = this.map.getPaintProperty(layerId, 'fill-outline-color');\n if (outlineColor !== undefined) {\n this.createColorControl(container, layerId, 'fill-outline-color', 'Outline Color', normalizeColor(outlineColor));\n }\n }\n\n /**\n * Add controls for line layers\n */\n private addLineControls(container: HTMLElement, layerId: string): void {\n // Line Color - try layer definition first, then runtime property\n const style = this.map.getStyle();\n const layer = style.layers?.find(l => l.id === layerId);\n let lineColor: any = undefined;\n\n // First try to get from layer definition\n if (layer && 'paint' in layer && layer.paint && 'line-color' in layer.paint) {\n lineColor = layer.paint['line-color'];\n }\n\n // Fallback to runtime property if not in definition\n if (!lineColor) {\n lineColor = this.map.getPaintProperty(layerId, 'line-color');\n }\n\n this.createColorControl(container, layerId, 'line-color', 'Line Color', normalizeColor(lineColor || '#000'));\n\n // Line Width\n const lineWidth = this.map.getPaintProperty(layerId, 'line-width');\n this.createSliderControl(container, layerId, 'line-width', 'Line Width', typeof lineWidth === 'number' ? lineWidth : 1, 0, 20, 0.5);\n\n // Line Opacity\n const lineOpacity = this.map.getPaintProperty(layerId, 'line-opacity');\n if (lineOpacity !== undefined && typeof lineOpacity === 'number') {\n this.createSliderControl(container, layerId, 'line-opacity', 'Line Opacity', lineOpacity, 0, 1, 0.05);\n }\n\n // Line Blur\n const lineBlur = this.map.getPaintProperty(layerId, 'line-blur');\n if (lineBlur !== undefined && typeof lineBlur === 'number') {\n this.createSliderControl(container, layerId, 'line-blur', 'Line Blur', lineBlur, 0, 5, 0.1);\n }\n }\n\n /**\n * Add controls for circle layers\n */\n private addCircleControls(container: HTMLElement, layerId: string): void {\n // Circle Color - try layer definition first, then runtime property\n const style = this.map.getStyle();\n const layer = style.layers?.find(l => l.id === layerId);\n let circleColor: any = undefined;\n\n // First try to get from layer definition\n if (layer && 'paint' in layer && layer.paint && 'circle-color' in layer.paint) {\n circleColor = layer.paint['circle-color'];\n }\n\n // Fallback to runtime property if not in definition\n if (!circleColor) {\n circleColor = this.map.getPaintProperty(layerId, 'circle-color');\n }\n\n this.createColorControl(container, layerId, 'circle-color', 'Circle Color', normalizeColor(circleColor || '#000'));\n\n // Circle Radius\n const circleRadius = this.map.getPaintProperty(layerId, 'circle-radius');\n this.createSliderControl(container, layerId, 'circle-radius', 'Radius', typeof circleRadius === 'number' ? circleRadius : 5, 0, 40, 0.5);\n\n // Circle Opacity\n const circleOpacity = this.map.getPaintProperty(layerId, 'circle-opacity');\n if (circleOpacity !== undefined && typeof circleOpacity === 'number') {\n this.createSliderControl(container, layerId, 'circle-opacity', 'Opacity', circleOpacity, 0, 1, 0.05);\n }\n\n // Circle Stroke Color\n const strokeColor = this.map.getPaintProperty(layerId, 'circle-stroke-color');\n if (strokeColor !== undefined) {\n this.createColorControl(container, layerId, 'circle-stroke-color', 'Stroke Color', normalizeColor(strokeColor));\n }\n\n // Circle Stroke Width\n const strokeWidth = this.map.getPaintProperty(layerId, 'circle-stroke-width');\n if (strokeWidth !== undefined && typeof strokeWidth === 'number') {\n this.createSliderControl(container, layerId, 'circle-stroke-width', 'Stroke Width', strokeWidth, 0, 10, 0.1);\n }\n }\n\n /**\n * Add controls for raster layers\n */\n private addRasterControls(container: HTMLElement, layerId: string): void {\n // Raster Opacity\n const rasterOpacity = this.map.getPaintProperty(layerId, 'raster-opacity');\n this.createSliderControl(container, layerId, 'raster-opacity', 'Opacity', typeof rasterOpacity === 'number' ? rasterOpacity : 1, 0, 1, 0.05);\n\n // Raster Brightness Min\n const brightnessMin = this.map.getPaintProperty(layerId, 'raster-brightness-min');\n this.createSliderControl(container, layerId, 'raster-brightness-min', 'Brightness Min', typeof brightnessMin === 'number' ? brightnessMin : 0, -1, 1, 0.05);\n\n // Raster Brightness Max\n const brightnessMax = this.map.getPaintProperty(layerId, 'raster-brightness-max');\n this.createSliderControl(container, layerId, 'raster-brightness-max', 'Brightness Max', typeof brightnessMax === 'number' ? brightnessMax : 1, -1, 1, 0.05);\n\n // Raster Saturation\n const saturation = this.map.getPaintProperty(layerId, 'raster-saturation');\n this.createSliderControl(container, layerId, 'raster-saturation', 'Saturation', typeof saturation === 'number' ? saturation : 0, -1, 1, 0.05);\n\n // Raster Contrast\n const contrast = this.map.getPaintProperty(layerId, 'raster-contrast');\n this.createSliderControl(container, layerId, 'raster-contrast', 'Contrast', typeof contrast === 'number' ? contrast : 0, -1, 1, 0.05);\n\n // Raster Hue Rotate\n const hueRotate = this.map.getPaintProperty(layerId, 'raster-hue-rotate');\n this.createSliderControl(container, layerId, 'raster-hue-rotate', 'Hue Rotate', typeof hueRotate === 'number' ? hueRotate : 0, 0, 360, 5);\n }\n\n /**\n * Add controls for symbol layers\n */\n private addSymbolControls(container: HTMLElement, layerId: string): void {\n // Text Color\n const textColor = this.map.getPaintProperty(layerId, 'text-color');\n if (textColor !== undefined) {\n this.createColorControl(container, layerId, 'text-color', 'Text Color', normalizeColor(textColor));\n }\n\n // Text Opacity\n const textOpacity = this.map.getPaintProperty(layerId, 'text-opacity');\n if (textOpacity !== undefined && typeof textOpacity === 'number') {\n this.createSliderControl(container, layerId, 'text-opacity', 'Text Opacity', textOpacity, 0, 1, 0.05);\n }\n\n // Icon Opacity\n const iconOpacity = this.map.getPaintProperty(layerId, 'icon-opacity');\n if (iconOpacity !== undefined && typeof iconOpacity === 'number') {\n this.createSliderControl(container, layerId, 'icon-opacity', 'Icon Opacity', iconOpacity, 0, 1, 0.05);\n }\n }\n\n /**\n * Create a color control\n */\n private createColorControl(\n container: HTMLElement,\n layerId: string,\n property: string,\n label: string,\n initialValue: string\n ): void {\n const controlGroup = document.createElement('div');\n controlGroup.className = 'style-control-group';\n\n const labelEl = document.createElement('label');\n labelEl.className = 'style-control-label';\n labelEl.textContent = label;\n\n const inputWrapper = document.createElement('div');\n inputWrapper.className = 'style-control-color-group';\n\n const colorInput = document.createElement('input');\n colorInput.type = 'color';\n colorInput.className = 'style-control-color-picker';\n colorInput.value = initialValue;\n colorInput.dataset.property = property;\n\n const hexDisplay = document.createElement('input');\n hexDisplay.type = 'text';\n hexDisplay.className = 'style-control-color-value';\n hexDisplay.value = initialValue;\n hexDisplay.readOnly = true;\n\n colorInput.addEventListener('input', () => {\n const color = colorInput.value;\n hexDisplay.value = color;\n this.map.setPaintProperty(layerId, property, color);\n });\n\n inputWrapper.appendChild(colorInput);\n inputWrapper.appendChild(hexDisplay);\n\n controlGroup.appendChild(labelEl);\n controlGroup.appendChild(inputWrapper);\n\n container.appendChild(controlGroup);\n }\n\n /**\n * Create a slider control\n */\n private createSliderControl(\n container: HTMLElement,\n layerId: string,\n property: string,\n label: string,\n initialValue: number,\n min: number,\n max: number,\n step: number\n ): void {\n const controlGroup = document.createElement('div');\n controlGroup.className = 'style-control-group';\n\n const labelEl = document.createElement('label');\n labelEl.className = 'style-control-label';\n labelEl.textContent = label;\n\n const inputWrapper = document.createElement('div');\n inputWrapper.className = 'style-control-input-wrapper';\n\n const slider = document.createElement('input');\n slider.type = 'range';\n slider.className = 'style-control-slider';\n slider.min = String(min);\n slider.max = String(max);\n slider.step = String(step);\n slider.value = String(initialValue);\n slider.dataset.property = property;\n\n const valueDisplay = document.createElement('span');\n valueDisplay.className = 'style-control-value';\n valueDisplay.textContent = formatNumericValue(initialValue, step);\n\n slider.addEventListener('input', () => {\n const value = parseFloat(slider.value);\n valueDisplay.textContent = formatNumericValue(value, step);\n this.map.setPaintProperty(layerId, property, value);\n });\n\n inputWrapper.appendChild(slider);\n inputWrapper.appendChild(valueDisplay);\n\n controlGroup.appendChild(labelEl);\n controlGroup.appendChild(inputWrapper);\n\n container.appendChild(controlGroup);\n }\n\n /**\n * Reset layer style to original\n */\n private resetLayerStyle(layerId: string): void {\n const originalStyle = this.state.originalStyles.get(layerId);\n if (!originalStyle) return;\n\n // Restore original paint properties\n restoreOriginalStyle(this.map, layerId, this.state.originalStyles);\n\n // Update UI controls to reflect the reset values\n const editor = this.styleEditors.get(layerId);\n if (editor) {\n // Update all slider controls\n const sliders = editor.querySelectorAll('.style-control-slider') as NodeListOf<HTMLInputElement>;\n sliders.forEach(slider => {\n const property = slider.dataset.property;\n if (property) {\n const value = this.map.getPaintProperty(layerId, property);\n if (value !== undefined && typeof value === 'number') {\n slider.value = String(value);\n // Update value display\n const valueDisplay = slider.parentElement?.querySelector('.style-control-value');\n if (valueDisplay) {\n const step = parseFloat(slider.step);\n valueDisplay.textContent = formatNumericValue(value, step);\n }\n }\n }\n });\n\n // Update all color controls\n const colorPickers = editor.querySelectorAll('.style-control-color-picker') as NodeListOf<HTMLInputElement>;\n colorPickers.forEach(picker => {\n const property = picker.dataset.property;\n if (property) {\n const value = this.map.getPaintProperty(layerId, property);\n if (value !== undefined) {\n const hexColor = normalizeColor(value);\n picker.value = hexColor;\n // Update hex display\n const hexDisplay = picker.parentElement?.querySelector('.style-control-color-value');\n if (hexDisplay) {\n hexDisplay.textContent = hexColor;\n }\n }\n }\n });\n }\n }\n\n /**\n * Update layer states from map (sync UI with map)\n */\n private updateLayerStatesFromMap(): void {\n if (this.state.userInteractingWithSlider) {\n return; // Don't update while user is dragging\n }\n\n Object.keys(this.state.layerStates).forEach(layerId => {\n try {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n // Check visibility\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n const isVisible = visibility !== 'none';\n\n // Get opacity\n const layerType = layer.type;\n const opacity = getLayerOpacity(this.map, layerId, layerType);\n\n // Update local state\n if (this.state.layerStates[layerId]) {\n this.state.layerStates[layerId].visible = isVisible;\n this.state.layerStates[layerId].opacity = opacity;\n }\n\n // Update UI\n this.updateUIForLayer(layerId, isVisible, opacity);\n } catch (error) {\n console.warn(`Failed to update state for layer ${layerId}:`, error);\n }\n });\n }\n\n /**\n * Update UI elements for a specific layer\n */\n private updateUIForLayer(layerId: string, visible: boolean, opacity: number): void {\n const layerItems = this.panel.querySelectorAll('.layer-control-item');\n\n layerItems.forEach(item => {\n if ((item as HTMLElement).dataset.layerId === layerId) {\n const checkbox = item.querySelector('.layer-control-checkbox') as HTMLInputElement;\n const opacitySlider = item.querySelector('.layer-control-opacity') as HTMLInputElement;\n\n if (checkbox) {\n checkbox.checked = visible;\n }\n\n if (opacitySlider) {\n opacitySlider.value = String(opacity);\n opacitySlider.title = `Opacity: ${Math.round(opacity * 100)}%`;\n }\n }\n });\n }\n\n /**\n * Check for new layers and add them to the control, remove deleted layers\n */\n private checkForNewLayers(): void {\n try {\n const style = this.map.getStyle();\n if (!style || !style.layers) {\n return;\n }\n\n const currentMapLayerIds = new Set(style.layers.map(layer => layer.id));\n const originalSourceIds = this.getOriginalStyleSourceIds();\n\n // Check if we're in auto-detect mode (no specific layers were specified)\n const isAutoDetectMode = this.targetLayers.length === 0 ||\n (this.targetLayers.length === 1 && this.targetLayers[0] === 'Background') ||\n this.targetLayers.every(id => id === 'Background' || this.state.layerStates[id]);\n\n // Find new layers that aren't in our state yet\n const newLayers: string[] = [];\n currentMapLayerIds.forEach(layerId => {\n if (layerId !== 'Background' && !this.state.layerStates[layerId]) {\n const layer = this.map.getLayer(layerId);\n if (layer) {\n // In auto-detect mode, only add layers using user-added sources\n if (isAutoDetectMode) {\n const sourceId = (layer as any).source;\n // If no source or source is from original style, skip (it's a background layer)\n if (!sourceId || originalSourceIds.has(sourceId)) {\n return;\n }\n }\n newLayers.push(layerId);\n }\n }\n });\n\n // Find removed layers that are still in our state\n const removedLayers: string[] = [];\n Object.keys(this.state.layerStates).forEach(layerId => {\n if (layerId !== 'Background' && !currentMapLayerIds.has(layerId)) {\n removedLayers.push(layerId);\n }\n });\n\n // Remove deleted layers from UI and state\n if (removedLayers.length > 0) {\n removedLayers.forEach(layerId => {\n // Remove from state\n delete this.state.layerStates[layerId];\n\n // Remove from UI\n const itemEl = this.panel.querySelector(`[data-layer-id=\"${layerId}\"]`);\n if (itemEl) {\n itemEl.remove();\n }\n\n // Clean up style editor if open\n if (this.state.activeStyleEditor === layerId) {\n this.state.activeStyleEditor = null;\n }\n this.styleEditors.delete(layerId);\n });\n }\n\n // Add UI for new layers\n if (newLayers.length > 0) {\n newLayers.forEach(layerId => {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n // Get layer type and opacity\n const layerType = layer.type;\n const opacity = getLayerOpacity(this.map, layerId, layerType);\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n const isVisible = visibility !== 'none';\n\n // Add to state\n this.state.layerStates[layerId] = {\n visible: isVisible,\n opacity: opacity,\n name: this.generateFriendlyName(layerId),\n };\n\n // Add to UI\n this.addLayerItem(layerId, this.state.layerStates[layerId]);\n });\n }\n } catch (error) {\n console.warn('Failed to check for new layers:', error);\n }\n }\n}\n"],"names":["opacity","clamp","layerList"],"mappings":"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"}
|