{"version":3,"file":"index.cjs","sources":["../src/lib/adapters/NoaaLidarLayerAdapter.ts"],"sourcesContent":["import type { CustomLayerAdapter, LayerState } from 'maplibre-gl-layer-control';\nimport type { NoaaLidarControl } from '../core/NoaaLidarControl';\n\n/**\n * Adapter for integrating NOAA LiDAR point cloud layers with maplibre-gl-layer-control.\n *\n * This adapter allows NOAA LiDAR point clouds to appear in the layer control panel,\n * enabling visibility toggles and opacity sliders for each loaded point cloud.\n *\n * @example\n * ```typescript\n * import { NoaaLidarControl, NoaaLidarLayerAdapter } from 'maplibre-gl-noaa-lidar';\n * import { LayerControl } from 'maplibre-gl-layer-control';\n *\n * const noaaControl = new NoaaLidarControl({ ... });\n * map.addControl(noaaControl, 'top-right');\n *\n * // Create adapter after adding NOAA control\n * const noaaAdapter = new NoaaLidarLayerAdapter(noaaControl);\n *\n * // Add layer control with the adapter\n * const layerControl = new LayerControl({\n *   customLayerAdapters: [noaaAdapter],\n * });\n * map.addControl(layerControl, 'top-left');\n * ```\n */\nexport class NoaaLidarLayerAdapter implements CustomLayerAdapter {\n  readonly type = 'noaa-lidar';\n\n  private _noaaControl: NoaaLidarControl;\n  private _changeCallbacks: Array<(event: 'add' | 'remove', layerId: string) => void> = [];\n  private _unsubscribe?: () => void;\n\n  /**\n   * Creates a new NoaaLidarLayerAdapter.\n   *\n   * @param noaaControl - The NoaaLidarControl instance to adapt\n   */\n  constructor(noaaControl: NoaaLidarControl) {\n    this._noaaControl = noaaControl;\n    this._setupEventListeners();\n  }\n\n  /**\n   * Sets up event listeners on the NoaaLidarControl to detect layer changes.\n   */\n  private _setupEventListeners(): void {\n    // Listen for load and unload events\n    const handleLoad = (event: { pointCloud?: { id: string } }) => {\n      if (event.pointCloud?.id) {\n        // Find the item ID from the loaded items map\n        const state = this._noaaControl.getState();\n        for (const [itemId, info] of state.loadedItems.entries()) {\n          if (info.id === event.pointCloud.id) {\n            this._notifyLayerAdded(itemId);\n            break;\n          }\n        }\n      }\n    };\n\n    const handleUnload = (event: { itemId?: string }) => {\n      if (event.itemId) {\n        this._notifyLayerRemoved(event.itemId);\n      }\n    };\n\n    this._noaaControl.on('loadcomplete', handleLoad as any);\n    this._noaaControl.on('unload', handleUnload as any);\n\n    this._unsubscribe = () => {\n      this._noaaControl.off('loadcomplete', handleLoad as any);\n      this._noaaControl.off('unload', handleUnload as any);\n    };\n  }\n\n  /**\n   * Gets all layer IDs managed by this adapter.\n   *\n   * @returns Array of item IDs for loaded point clouds\n   */\n  getLayerIds(): string[] {\n    const state = this._noaaControl.getState();\n    return Array.from(state.loadedItems.keys());\n  }\n\n  /**\n   * Gets the current state of a layer.\n   *\n   * @param layerId - Item ID\n   * @returns LayerState or null if not found\n   */\n  getLayerState(layerId: string): LayerState | null {\n    const state = this._noaaControl.getState();\n    const info = state.loadedItems.get(layerId);\n    if (!info) return null;\n\n    // Access the LiDAR control's point cloud manager through internal state\n    const lidarControl = this._noaaControl.getLidarControl();\n    const manager = (lidarControl as any)?._pointCloudManager;\n\n    const visible = manager?.getPointCloudVisibility(info.id) ?? true;\n    const opacity = manager?.getPointCloudOpacity(info.id) ?? (state.lidarState?.opacity ?? 1);\n\n    return {\n      visible,\n      opacity,\n      name: this.getName(layerId),\n      isCustomLayer: true,\n      customLayerType: 'noaa-lidar',\n    };\n  }\n\n  /**\n   * Sets layer visibility.\n   *\n   * @param layerId - Item ID\n   * @param visible - Whether the layer should be visible\n   */\n  setVisibility(layerId: string, visible: boolean): void {\n    const state = this._noaaControl.getState();\n    const info = state.loadedItems.get(layerId);\n    if (!info) return;\n\n    const lidarControl = this._noaaControl.getLidarControl();\n    const manager = (lidarControl as any)?._pointCloudManager;\n    manager?.setPointCloudVisibility(info.id, visible);\n  }\n\n  /**\n   * Sets layer opacity.\n   *\n   * @param layerId - Item ID\n   * @param opacity - Opacity value (0-1)\n   */\n  setOpacity(layerId: string, opacity: number): void {\n    const state = this._noaaControl.getState();\n    const info = state.loadedItems.get(layerId);\n    if (!info) return;\n\n    const lidarControl = this._noaaControl.getLidarControl();\n    const manager = (lidarControl as any)?._pointCloudManager;\n    manager?.setPointCloudOpacity(info.id, opacity);\n  }\n\n  /**\n   * Gets display name for a layer.\n   *\n   * @param layerId - Item ID\n   * @returns Display name for the layer\n   */\n  getName(layerId: string): string {\n    const state = this._noaaControl.getState();\n    const info = state.loadedItems.get(layerId);\n    if (info) {\n      return info.name;\n    }\n    // Generate friendly name from ID\n    return layerId.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n  }\n\n  /**\n   * Gets layer symbol type for UI display.\n   *\n   * @param _layerId - Item ID (unused)\n   * @returns Symbol type string\n   */\n  getSymbolType(_layerId: string): string {\n    // Use 'circle' symbol for point clouds\n    return 'circle';\n  }\n\n  /**\n   * Subscribes to layer changes (add/remove).\n   *\n   * @param callback - Function to call when layers are added or removed\n   * @returns Unsubscribe function\n   */\n  onLayerChange(callback: (event: 'add' | 'remove', layerId: string) => void): () => void {\n    this._changeCallbacks.push(callback);\n    return () => {\n      const idx = this._changeCallbacks.indexOf(callback);\n      if (idx >= 0) this._changeCallbacks.splice(idx, 1);\n    };\n  }\n\n  /**\n   * Notifies subscribers that a layer was added.\n   *\n   * @param layerId - ID of the added layer\n   */\n  private _notifyLayerAdded(layerId: string): void {\n    this._changeCallbacks.forEach((cb) => cb('add', layerId));\n  }\n\n  /**\n   * Notifies subscribers that a layer was removed.\n   *\n   * @param layerId - ID of the removed layer\n   */\n  private _notifyLayerRemoved(layerId: string): void {\n    this._changeCallbacks.forEach((cb) => cb('remove', layerId));\n  }\n\n  /**\n   * Cleans up event listeners.\n   */\n  destroy(): void {\n    this._unsubscribe?.();\n    this._changeCallbacks = [];\n  }\n}\n"],"names":[],"mappings":"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"}