UNPKG

vue3-maplibre-gl

Version:

Vue 3 components and composables for MapLibre GL JS - Build interactive maps with ease

1 lines 461 kB
{"version":3,"file":"index.umd.cjs","sources":["../libs/composables/utils/useBounds.ts","../libs/composables/utils/useLogger.ts","../libs/composables/utils/useDebounce.ts","../libs/composables/utils/useEaseTo.ts","../libs/composables/utils/useFitScreenCoordinates.ts","../libs/composables/utils/useFlyTo.ts","../libs/composables/utils/useJumpTo.ts","../libs/composables/utils/useOptimizedComputed.ts","../libs/composables/utils/usePan.ts","../libs/composables/utils/useRotate.ts","../libs/composables/utils/useZoom.ts","../libs/enums/MapProvideKey.ts","../libs/enums/MapboxEnum.ts","../libs/enums/MapboxLayerEnum.ts","../libs/composables/map/useCreateMapbox.ts","../libs/helpers/index.ts","../node_modules/nanoid/index.browser.js","../node_modules/nanoid/url-alphabet/index.js","../libs/composables/map/useLayer.ts","../libs/composables/map/useCreateImage.ts","../libs/composables/map/useGeoJsonSource.ts","../libs/composables/map/useCreatePopup.ts","../libs/composables/map/useCreateMarker.ts","../libs/composables/event/useMapEventListener.ts","../libs/composables/event/useGeolocateEventListener.ts","../libs/composables/event/useMapReloadEvent.ts","../libs/composables/event/useLayerEventListener.ts","../libs/composables/control/useGeolocateControl.ts","../libs/composables/sources/useCreateGeoJsonSource.ts","../libs/composables/layers/useCreateLayer.ts","../libs/composables/layers/useCreateFillLayer.ts","../libs/composables/layers/useCreateCircleLayer.ts","../libs/composables/layers/useCreateLineLayer.ts","../libs/composables/layers/useCreateSymbolLayer.ts","../libs/components/Mapbox.vue","../libs/components/GeolocateControls.vue","../libs/components/GeoJsonSource.vue","../libs/components/FillLayer.vue","../libs/components/CircleLayer.vue","../libs/components/LineLayer.vue","../libs/components/SymbolLayer.vue","../libs/components/Image.vue","../libs/components/PopUp.vue","../libs/components/Marker.vue","../libs/composables/map/useMapbox.ts"],"sourcesContent":["import { watchEffect, ref, computed, unref } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable, Undefinedable } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type {\n  Map,\n  LngLatBoundsLike,\n  FitBoundsOptions,\n  CameraForBoundsOptions,\n  LngLatBounds,\n} from 'maplibre-gl';\n\n/**\n * Bounds operation status enum for better state management\n */\nexport enum BoundsStatus {\n  NotSet = 'not-set',\n  Setting = 'setting',\n  Set = 'set',\n  Error = 'error',\n}\n\ninterface FitBoundsProps {\n  map: MaybeRef<Nullable<Map>>;\n  options?: FitBoundsOptions;\n  debug?: boolean;\n}\n\ninterface FitBoundsActions {\n  setFitBounds: (\n    boundsVal: LngLatBoundsLike,\n    options?: FitBoundsOptions,\n  ) => void;\n  clearBounds: () => void;\n  getCurrentBounds: () => LngLatBounds | null;\n  bounds: LngLatBoundsLike | undefined;\n  boundsStatus: Readonly<BoundsStatus>;\n  isBoundsSet: boolean;\n}\n\ninterface CameraForBoundsProps {\n  map: MaybeRef<Nullable<Map>>;\n  options?: CameraForBoundsOptions & { bounds?: LngLatBoundsLike };\n  debug?: boolean;\n}\n\ninterface CameraForBoundsActions {\n  cameraForBounds: (\n    boundsVal: LngLatBoundsLike,\n    options?: CameraForBoundsOptions,\n  ) => void;\n  clearCamera: () => void;\n  getCurrentBounds: () => LngLatBounds | null;\n  bbox: LngLatBoundsLike | undefined;\n  cameraStatus: Readonly<BoundsStatus>;\n  isCameraSet: boolean;\n}\n\n/**\n * Composable for managing map bounds fitting with enhanced error handling and performance\n * Provides reactive bounds management with validation and debugging capabilities\n *\n * @param props - Configuration options for bounds fitting\n * @returns Enhanced actions and state for bounds management\n */\nexport function useFitBounds(props: FitBoundsProps): FitBoundsActions {\n  const { logError } = useLogger(props.debug ?? false);\n  const bounds = ref<LngLatBoundsLike>();\n  const boundsOptions = ref<Undefinedable<FitBoundsOptions>>(props.options);\n  const boundsStatus = ref<BoundsStatus>(BoundsStatus.NotSet);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isBoundsSet = computed(() => boundsStatus.value === BoundsStatus.Set);\n\n  /**\n   * Validates if bounds operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateBoundsOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) return false;\n    return true;\n  }\n\n  /**\n   * Validates bounds data structure\n   * @param boundsVal - Bounds to validate\n   * @returns boolean indicating if bounds are valid\n   */\n  function validateBounds(boundsVal: LngLatBoundsLike): boolean {\n    if (!boundsVal) return false;\n    // Additional validation for array format\n    if (Array.isArray(boundsVal)) {\n      if (boundsVal.length !== 4 && boundsVal.length !== 2) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * Gets the current map bounds\n   * @returns Current map bounds or null if not available\n   */\n  function getCurrentBounds(): LngLatBounds | null {\n    const map = mapInstance.value;\n    if (!map) return null;\n\n    try {\n      return map.getBounds();\n    } catch (error) {\n      logError('Error getting current bounds:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Sets bounds for the map to fit with enhanced error handling and validation\n   * @param boundsVal - Bounds to fit\n   * @param options - Optional fit bounds options\n   */\n  function setFitBounds(\n    boundsVal: LngLatBoundsLike,\n    options?: FitBoundsOptions,\n  ): void {\n    if (!validateBoundsOperation() || !validateBounds(boundsVal)) {\n      boundsStatus.value = BoundsStatus.Error;\n      return;\n    }\n\n    const map = mapInstance.value!;\n    boundsStatus.value = BoundsStatus.Setting;\n\n    try {\n      bounds.value = boundsVal;\n      if (options) boundsOptions.value = options;\n\n      map.fitBounds(boundsVal, boundsOptions.value);\n      boundsStatus.value = BoundsStatus.Set;\n    } catch (error) {\n      boundsStatus.value = BoundsStatus.Error;\n      logError('Error setting map bounds:', error, { bounds: boundsVal });\n    }\n  }\n\n  /**\n   * Clears the current bounds\n   */\n  function clearBounds(): void {\n    bounds.value = undefined;\n    boundsStatus.value = BoundsStatus.NotSet;\n  }\n\n  // Watch for map and bounds changes\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (map && bounds.value && boundsStatus.value !== BoundsStatus.Setting) {\n      setFitBounds(bounds.value, boundsOptions.value);\n    }\n  });\n\n  return {\n    setFitBounds,\n    clearBounds,\n    getCurrentBounds,\n    bounds: bounds.value,\n    boundsStatus: boundsStatus.value as Readonly<BoundsStatus>,\n    isBoundsSet: isBoundsSet.value,\n  };\n}\n\n/**\n * Composable for managing camera positioning for bounds with enhanced error handling\n * Provides reactive camera management with validation and debugging capabilities\n *\n * @param props - Configuration options for camera bounds\n * @returns Enhanced actions and state for camera management\n */\nexport function useCameraForBounds(\n  props: CameraForBoundsProps,\n): CameraForBoundsActions {\n  const { log } = useLogger(props.debug ?? false);\n  const bbox = ref<LngLatBoundsLike | undefined>(props.options?.bounds);\n  const cameraOptions = ref<Undefinedable<CameraForBoundsOptions>>(\n    props.options,\n  );\n  const cameraStatus = ref<BoundsStatus>(BoundsStatus.NotSet);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isCameraSet = computed(() => cameraStatus.value === BoundsStatus.Set);\n\n  /**\n   * Validates if camera operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateCameraOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) {\n      log('Cannot perform camera operation: map instance not available');\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Gets the current map bounds\n   * @returns Current map bounds or null if not available\n   */\n  function getCurrentBounds(): LngLatBounds | null {\n    const map = mapInstance.value;\n    if (!map) {\n      log('Cannot get current bounds: map instance not available');\n      return null;\n    }\n\n    try {\n      return map.getBounds();\n    } catch (error) {\n      log('Error getting current bounds:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Sets camera position for bounds with enhanced error handling and validation\n   * @param boundsVal - Bounds for camera positioning\n   * @param options - Optional camera options\n   */\n  function cameraForBounds(\n    boundsVal: LngLatBoundsLike,\n    options?: CameraForBoundsOptions,\n  ): void {\n    if (!validateCameraOperation()) {\n      cameraStatus.value = BoundsStatus.Error;\n      return;\n    }\n\n    if (!boundsVal) {\n      log('Invalid bounds for camera: bounds value is null or undefined');\n      cameraStatus.value = BoundsStatus.Error;\n      return;\n    }\n\n    const map = mapInstance.value!;\n    cameraStatus.value = BoundsStatus.Setting;\n\n    try {\n      bbox.value = boundsVal;\n      if (options) cameraOptions.value = options;\n\n      log('Setting camera for bounds', { bounds: boundsVal, options });\n\n      map.cameraForBounds(boundsVal, cameraOptions.value);\n      cameraStatus.value = BoundsStatus.Set;\n\n      log('Camera for bounds set successfully');\n    } catch (error) {\n      cameraStatus.value = BoundsStatus.Error;\n      log('Error setting camera for bounds:', error, { bounds: boundsVal });\n    }\n  }\n\n  /**\n   * Clears the current camera bounds\n   */\n  function clearCamera(): void {\n    bbox.value = undefined;\n    cameraStatus.value = BoundsStatus.NotSet;\n    log('Camera bounds cleared');\n  }\n\n  // Watch for map and bounds changes\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (map && bbox.value && cameraStatus.value !== BoundsStatus.Setting) {\n      cameraForBounds(bbox.value, cameraOptions.value);\n    }\n  });\n\n  return {\n    cameraForBounds,\n    clearCamera,\n    getCurrentBounds,\n    bbox: bbox.value,\n    cameraStatus: cameraStatus.value as Readonly<BoundsStatus>,\n    isCameraSet: isCameraSet.value,\n  };\n}\n","export function useLogger(debug: boolean = false) {\n  const log = (...args: unknown[]) => {\n    if (debug) console.log(...args);\n  };\n\n  const logWarn = (...args: unknown[]) => {\n    if (debug) console.warn(...args);\n  };\n\n  const logError = (...args: unknown[]) => {\n    if (debug) console.error(...args);\n  };\n\n  return { log, logWarn, logError };\n}\n","import { ref, watch, onUnmounted, type Ref, type WatchSource } from 'vue';\nimport { useLogger } from './useLogger';\n\n/**\n * Debounce options interface\n */\ninterface DebounceOptions {\n  /** Delay in milliseconds (default: 300) */\n  delay?: number;\n  /** Whether to trigger on the leading edge (default: false) */\n  leading?: boolean;\n  /** Whether to trigger on the trailing edge (default: true) */\n  trailing?: boolean;\n  /** Maximum delay before forcing execution (default: none) */\n  maxWait?: number;\n  /** Enable debug logging */\n  debug?: boolean;\n}\n\n/**\n * Debounced function interface\n */\ninterface DebouncedFunction<T extends (...args: any[]) => any> {\n  (...args: Parameters<T>): void;\n  cancel: () => void;\n  flush: () => void;\n  pending: () => boolean;\n}\n\n/**\n * Creates a debounced version of a function\n *\n * @param func - Function to debounce\n * @param options - Debounce configuration options\n * @returns Debounced function with control methods\n */\nexport function useDebounce<T extends (...args: any[]) => any>(\n  func: T,\n  options: DebounceOptions = {},\n): DebouncedFunction<T> {\n  const {\n    delay = 300,\n    leading = false,\n    trailing = true,\n    maxWait,\n    debug = false,\n  } = options;\n\n  const { log, logError } = useLogger(debug);\n\n  let timeoutId: number | undefined;\n  let maxTimeoutId: number | undefined;\n  let lastCallTime: number | undefined;\n  let lastInvokeTime = 0;\n  let lastArgs: Parameters<T> | undefined;\n  let result: ReturnType<T>;\n\n  /**\n   * Invokes the original function\n   */\n  function invokeFunc(time: number): ReturnType<T> {\n    const args = lastArgs!;\n    lastArgs = undefined;\n    lastInvokeTime = time;\n\n    try {\n      result = func(...args);\n      if (debug) {\n        log('Debounced function executed', { time, delay });\n      }\n      return result;\n    } catch (error) {\n      logError('Error in debounced function:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Determines if function should be invoked\n   */\n  function shouldInvoke(time: number): boolean {\n    const timeSinceLastCall = time - (lastCallTime || 0);\n    const timeSinceLastInvoke = time - lastInvokeTime;\n\n    return (\n      lastCallTime === undefined ||\n      timeSinceLastCall >= delay ||\n      timeSinceLastCall < 0 ||\n      (maxWait !== undefined && timeSinceLastInvoke >= maxWait)\n    );\n  }\n\n  /**\n   * Timer callback for trailing edge\n   */\n  function timerExpired(): ReturnType<T> | undefined {\n    const time = Date.now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer\n    timeoutId = window.setTimeout(\n      timerExpired,\n      delay - (time - (lastCallTime || 0)),\n    );\n  }\n\n  /**\n   * Handles trailing edge invocation\n   */\n  function trailingEdge(time: number): ReturnType<T> | undefined {\n    timeoutId = undefined;\n\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = undefined;\n    return result;\n  }\n\n  /**\n   * Handles leading edge invocation\n   */\n  function leadingEdge(time: number): ReturnType<T> {\n    lastInvokeTime = time;\n    timeoutId = window.setTimeout(timerExpired, delay);\n    return leading ? invokeFunc(time) : result;\n  }\n\n  /**\n   * Cancels pending invocations\n   */\n  function cancel(): void {\n    if (timeoutId !== undefined) {\n      clearTimeout(timeoutId);\n    }\n    if (maxTimeoutId !== undefined) {\n      clearTimeout(maxTimeoutId);\n    }\n    lastInvokeTime = 0;\n    lastCallTime = undefined;\n    lastArgs = undefined;\n    timeoutId = undefined;\n    maxTimeoutId = undefined;\n  }\n\n  /**\n   * Immediately invokes the function\n   */\n  function flush(): ReturnType<T> | undefined {\n    return timeoutId === undefined ? result : trailingEdge(Date.now());\n  }\n\n  /**\n   * Checks if there's a pending invocation\n   */\n  function pending(): boolean {\n    return timeoutId !== undefined;\n  }\n\n  /**\n   * Main debounced function\n   */\n  function debounced(...args: Parameters<T>): void {\n    const time = Date.now();\n    const isInvoking = shouldInvoke(time);\n\n    lastArgs = args;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timeoutId === undefined) {\n        leadingEdge(lastCallTime);\n      } else if (maxWait !== undefined) {\n        // Handle maxWait\n        timeoutId = window.setTimeout(timerExpired, delay);\n        maxTimeoutId = window.setTimeout(() => {\n          if (lastArgs) {\n            invokeFunc(Date.now());\n          }\n        }, maxWait);\n        if (leading) {\n          invokeFunc(lastCallTime);\n        }\n      }\n    } else if (timeoutId === undefined) {\n      timeoutId = window.setTimeout(timerExpired, delay);\n    }\n  }\n\n  // Cleanup on unmount\n  onUnmounted(cancel);\n\n  // Attach control methods\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  debounced.pending = pending;\n\n  return debounced as DebouncedFunction<T>;\n}\n\n/**\n * Creates a debounced ref watcher\n *\n * @param source - Watch source\n * @param callback - Callback function\n * @param options - Debounce and watch options\n * @returns Stop function\n */\nexport function useDebouncedWatch<T>(\n  source: WatchSource<T>,\n  callback: (value: T, oldValue: T | undefined) => void,\n  options: DebounceOptions & {\n    immediate?: boolean;\n    deep?: boolean;\n    flush?: 'pre' | 'post' | 'sync';\n  } = {},\n): () => void {\n  const { immediate, deep, flush, ...debounceOptions } = options;\n\n  const debouncedCallback = useDebounce(callback, debounceOptions);\n\n  const stopWatcher = watch(\n    source,\n    (newValue, oldValue) => {\n      debouncedCallback(newValue, oldValue);\n    },\n    {\n      immediate,\n      deep,\n      flush,\n    },\n  );\n\n  // Return combined stop function\n  return () => {\n    stopWatcher();\n    debouncedCallback.cancel();\n  };\n}\n\n/**\n * Creates a debounced ref that updates after a delay\n *\n * @param initialValue - Initial value\n * @param delay - Debounce delay in milliseconds\n * @returns Tuple of [debouncedRef, immediateRef, flush, cancel]\n */\nexport function useDebouncedRef<T>(\n  initialValue: T,\n  delay = 300,\n): [Ref<T>, Ref<T>, () => void, () => void] {\n  const immediateRef = ref(initialValue) as Ref<T>;\n  const debouncedRef = ref(initialValue) as Ref<T>;\n\n  const updateDebounced = useDebounce(\n    (value: T) => {\n      debouncedRef.value = value;\n    },\n    { delay },\n  );\n\n  watch(\n    immediateRef,\n    (newValue) => {\n      updateDebounced(newValue);\n    },\n    { immediate: false },\n  );\n\n  return [\n    debouncedRef,\n    immediateRef,\n    updateDebounced.flush,\n    updateDebounced.cancel,\n  ];\n}\n","import { watchEffect, ref, computed, unref } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable, Undefinedable } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type {\n  Map,\n  EaseToOptions,\n  LngLatLike,\n  CameraOptions,\n} from 'maplibre-gl';\n\n/**\n * Ease animation status enum for better state management\n */\nexport enum EaseStatus {\n  NotStarted = 'not-started',\n  Easing = 'easing',\n  Completed = 'completed',\n  Error = 'error',\n}\n\ninterface EaseToProps {\n  map: MaybeRef<Nullable<Map>>;\n  options?: EaseToOptions;\n  debug?: boolean;\n}\n\ninterface EaseToActions {\n  easeTo: (options?: EaseToOptions) => Promise<void>;\n  easeToCenter: (\n    center: LngLatLike,\n    options?: Omit<EaseToOptions, 'center'>,\n  ) => Promise<void>;\n  easeToZoom: (\n    zoom: number,\n    options?: Omit<EaseToOptions, 'zoom'>,\n  ) => Promise<void>;\n  easeToBearing: (\n    bearing: number,\n    options?: Omit<EaseToOptions, 'bearing'>,\n  ) => Promise<void>;\n  easeToPitch: (\n    pitch: number,\n    options?: Omit<EaseToOptions, 'pitch'>,\n  ) => Promise<void>;\n  stopEasing: () => void;\n  getCurrentCamera: () => CameraOptions | null;\n  easeStatus: Readonly<EaseStatus>;\n  isEasing: boolean;\n}\n\n/**\n * Composable for managing smooth map camera transitions with enhanced error handling\n * Provides reactive ease-to animations with validation and debugging capabilities\n *\n * @param props - Configuration options for ease-to animations\n * @returns Enhanced actions and state for camera animations\n */\nexport function useEaseTo(props: EaseToProps): EaseToActions {\n  const { logError, logWarn } = useLogger(props.debug ?? false);\n  const easeOptions = ref<Undefinedable<EaseToOptions>>(props.options);\n  const easeStatus = ref<EaseStatus>(EaseStatus.NotStarted);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isEasing = computed(() => easeStatus.value === EaseStatus.Easing);\n\n  /**\n   * Validates if ease operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateEaseOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) return false;\n    return true;\n  }\n\n  /**\n   * Validates ease-to options\n   * @param options - Options to validate\n   * @returns boolean indicating if options are valid\n   */\n  function validateEaseOptions(options: EaseToOptions): boolean {\n    if (!options || typeof options !== 'object') return false;\n    // Validate zoom range\n    if (options.zoom !== undefined && (options.zoom < 0 || options.zoom > 24)) {\n      logWarn('Warning: Zoom level should be between 0 and 24', {\n        zoom: options.zoom,\n      });\n    }\n\n    // Validate bearing range\n    if (\n      options.bearing !== undefined &&\n      (options.bearing < -180 || options.bearing > 180)\n    ) {\n      logWarn('Warning: Bearing should be between -180 and 180 degrees', {\n        bearing: options.bearing,\n      });\n    }\n\n    // Validate pitch range\n    if (\n      options.pitch !== undefined &&\n      (options.pitch < 0 || options.pitch > 60)\n    ) {\n      logWarn('Warning: Pitch should be between 0 and 60 degrees', {\n        pitch: options.pitch,\n      });\n    }\n\n    return true;\n  }\n\n  /**\n   * Gets the current camera state\n   * @returns Current camera options or null if not available\n   */\n  function getCurrentCamera(): CameraOptions | null {\n    const map = mapInstance.value;\n    if (!map) return null;\n\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch (error) {\n      logError('Error getting current camera state:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Performs ease-to animation with enhanced error handling and validation\n   * @param options - Ease-to options\n   * @returns Promise that resolves when animation completes\n   */\n  function easeTo(options?: EaseToOptions): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (!validateEaseOperation()) {\n        reject(new Error('Map instance not available'));\n        return;\n      }\n\n      const finalOptions = options || easeOptions.value;\n      if (!finalOptions) {\n        reject(new Error('No ease options provided'));\n        return;\n      }\n\n      if (!validateEaseOptions(finalOptions)) {\n        easeStatus.value = EaseStatus.Error;\n        reject(new Error('Invalid ease options'));\n        return;\n      }\n\n      const map = mapInstance.value!;\n      easeStatus.value = EaseStatus.Easing;\n\n      try {\n        // Store options for future use\n        if (options) easeOptions.value = options;\n\n        // Add event listeners for animation completion\n        const onMoveEnd = () => {\n          map.off('moveend', onMoveEnd);\n          map.off('error', onError);\n          easeStatus.value = EaseStatus.Completed;\n          resolve();\n        };\n\n        const onError = (error: any) => {\n          map.off('moveend', onMoveEnd);\n          map.off('error', onError);\n          easeStatus.value = EaseStatus.Error;\n          reject(error);\n        };\n\n        map.once('moveend', onMoveEnd);\n        map.once('error', onError);\n\n        // Start the animation\n        map.easeTo(finalOptions);\n      } catch (error) {\n        easeStatus.value = EaseStatus.Error;\n        logError('Error starting ease-to animation:', error);\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Eases to a specific center coordinate\n   * @param center - Target center coordinate\n   * @param options - Additional ease options (excluding center)\n   * @returns Promise that resolves when animation completes\n   */\n  function easeToCenter(\n    center: LngLatLike,\n    options?: Omit<EaseToOptions, 'center'>,\n  ): Promise<void> {\n    return easeTo({ ...options, center });\n  }\n\n  /**\n   * Eases to a specific zoom level\n   * @param zoom - Target zoom level\n   * @param options - Additional ease options (excluding zoom)\n   * @returns Promise that resolves when animation completes\n   */\n  function easeToZoom(\n    zoom: number,\n    options?: Omit<EaseToOptions, 'zoom'>,\n  ): Promise<void> {\n    return easeTo({ ...options, zoom });\n  }\n\n  /**\n   * Eases to a specific bearing\n   * @param bearing - Target bearing in degrees\n   * @param options - Additional ease options (excluding bearing)\n   * @returns Promise that resolves when animation completes\n   */\n  function easeToBearing(\n    bearing: number,\n    options?: Omit<EaseToOptions, 'bearing'>,\n  ): Promise<void> {\n    return easeTo({ ...options, bearing });\n  }\n\n  /**\n   * Eases to a specific pitch\n   * @param pitch - Target pitch in degrees\n   * @param options - Additional ease options (excluding pitch)\n   * @returns Promise that resolves when animation completes\n   */\n  function easeToPitch(\n    pitch: number,\n    options?: Omit<EaseToOptions, 'pitch'>,\n  ): Promise<void> {\n    return easeTo({ ...options, pitch });\n  }\n\n  /**\n   * Stops any ongoing easing animation\n   */\n  function stopEasing(): void {\n    const map = mapInstance.value;\n    if (!map) return;\n\n    try {\n      map.stop();\n      easeStatus.value = EaseStatus.Completed;\n    } catch (error) {\n      logError('Error stopping easing animation:', error);\n    }\n  }\n\n  // Watch for map and options changes\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (\n      map &&\n      easeOptions.value &&\n      easeStatus.value === EaseStatus.NotStarted\n    ) {\n      easeTo(easeOptions.value).catch((error) => {\n        logError('Error in watchEffect easeTo:', error);\n      });\n    }\n  });\n\n  return {\n    easeTo,\n    easeToCenter,\n    easeToZoom,\n    easeToBearing,\n    easeToPitch,\n    stopEasing,\n    getCurrentCamera,\n    easeStatus: easeStatus.value as Readonly<EaseStatus>,\n    isEasing: isEasing.value,\n  };\n}\n","import { watchEffect, ref, computed, unref, onUnmounted } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable, Undefinedable } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type { Map, FitBoundsOptions, PointLike } from 'maplibre-gl';\n\n/**\n * Screen coordinates fitting status enum for better state management\n */\nexport enum FitScreenCoordinatesStatus {\n  NotSet = 'not-set',\n  Setting = 'setting',\n  Set = 'set',\n  Error = 'error',\n}\n\n/**\n * Configuration options for screen coordinates fitting\n */\ninterface FitScreenCoordinatesProps {\n  map: MaybeRef<Nullable<Map>>;\n  /** Enable debug logging */\n  debug?: boolean;\n  /** Automatically cleanup resources on unmount */\n  autoCleanup?: boolean;\n  /** Default options for fitting screen coordinates */\n  defaultOptions?: Omit<FitBoundsOptions, 'bearing'>;\n  /** Default bearing value */\n  defaultBearing?: number;\n}\n\n/**\n * Actions and state for screen coordinates fitting\n */\ninterface FitScreenCoordinatesActions {\n  /** Fit the map to screen coordinates */\n  fitScreenCoordinates: (\n    p0: PointLike,\n    p1: PointLike,\n    options?: Omit<FitBoundsOptions, 'bearing'>,\n    bearing?: number,\n  ) => void;\n  /** Clear current screen coordinates */\n  clearCoordinates: () => void;\n  /** Current status */\n  readonly status: Readonly<FitScreenCoordinatesStatus>;\n  /** Computed state flags */\n  readonly isCoordinatesSet: boolean;\n  readonly isFitting: boolean;\n  readonly hasError: boolean;\n}\n\n/**\n * Composable for managing screen coordinates fitting with enhanced error handling\n * Provides reactive screen coordinates management with validation and debugging capabilities\n *\n * @param props - Configuration options for screen coordinates fitting\n * @returns Enhanced actions and state for screen coordinates management\n */\nexport function useFitScreenCoordinates(\n  props: FitScreenCoordinatesProps,\n): FitScreenCoordinatesActions;\n\n/**\n * Backward-compatible overload for existing API\n * @deprecated Use the props-based API for better type safety and features\n */\nexport function useFitScreenCoordinates(\n  map: MaybeRef<Nullable<Map>>,\n): FitScreenCoordinatesActions;\n\nexport function useFitScreenCoordinates(\n  propsOrMap: FitScreenCoordinatesProps | MaybeRef<Nullable<Map>>,\n): FitScreenCoordinatesActions | FitScreenCoordinatesActions {\n  // Handle backward compatibility\n  const props: FitScreenCoordinatesProps =\n    'map' in (propsOrMap as any) ||\n    (typeof propsOrMap === 'object' &&\n      propsOrMap !== null &&\n      !('value' in propsOrMap))\n      ? (propsOrMap as FitScreenCoordinatesProps)\n      : { map: propsOrMap as MaybeRef<Nullable<Map>> };\n  const {\n    debug = false,\n    autoCleanup = true,\n    defaultOptions,\n    defaultBearing,\n  } = props;\n  const { logError, logWarn } = useLogger(debug);\n\n  // Reactive state\n  const p0 = ref<PointLike>();\n  const p1 = ref<PointLike>();\n  const options =\n    ref<Undefinedable<Omit<FitBoundsOptions, 'bearing'>>>(defaultOptions);\n  const bearing = ref<Undefinedable<number>>(defaultBearing);\n  const status = ref<FitScreenCoordinatesStatus>(\n    FitScreenCoordinatesStatus.NotSet,\n  );\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isCoordinatesSet = computed(() => !!(p0.value && p1.value));\n  const isFitting = computed(\n    () => status.value === FitScreenCoordinatesStatus.Setting,\n  );\n  const hasError = computed(\n    () => status.value === FitScreenCoordinatesStatus.Error,\n  );\n\n  /**\n   * Validates if screen coordinates operation can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) {\n      logWarn('Map instance not available for screen coordinates operation');\n      return false;\n    }\n\n    if (!map.isStyleLoaded()) {\n      logWarn('Map style not loaded, deferring screen coordinates operation');\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Validates screen coordinates data\n   * @param p0Val - First point to validate\n   * @param p1Val - Second point to validate\n   * @returns boolean indicating if coordinates are valid\n   */\n  function validateCoordinates(p0Val: PointLike, p1Val: PointLike): boolean {\n    if (!p0Val || !p1Val) {\n      logError('Invalid screen coordinates: both p0 and p1 are required');\n      return false;\n    }\n\n    // Validate point structure\n    const validatePoint = (point: PointLike): boolean => {\n      if (Array.isArray(point)) {\n        return (\n          point.length === 2 &&\n          typeof point[0] === 'number' &&\n          typeof point[1] === 'number'\n        );\n      }\n      if (typeof point === 'object' && point !== null) {\n        return (\n          'x' in point &&\n          'y' in point &&\n          typeof (point as any).x === 'number' &&\n          typeof (point as any).y === 'number'\n        );\n      }\n      return false;\n    };\n\n    if (!validatePoint(p0Val) || !validatePoint(p1Val)) {\n      logError(\n        'Invalid point format: points must be [x, y] arrays or {x, y} objects',\n      );\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Gets the current bearing from the map\n   * @returns Current bearing or null if not available\n   */\n  function getCurrentBearing(): number | null {\n    const map = mapInstance.value;\n    if (!map) return null;\n\n    try {\n      return map.getBearing();\n    } catch (error) {\n      logError('Error getting current bearing:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Fits the map to screen coordinates with enhanced error handling and validation\n   * @param p0Val - First screen coordinate point\n   * @param p1Val - Second screen coordinate point\n   * @param optionsVal - Optional fit bounds options\n   * @param bearingVal - Optional bearing value\n   */\n  function fitScreenCoordinates(\n    p0Val: PointLike,\n    p1Val: PointLike,\n    optionsVal?: Omit<FitBoundsOptions, 'bearing'>,\n    bearingVal?: number,\n  ): void {\n    if (!validateOperation() || !validateCoordinates(p0Val, p1Val)) {\n      status.value = FitScreenCoordinatesStatus.Error;\n      return;\n    }\n\n    const map = mapInstance.value!;\n    status.value = FitScreenCoordinatesStatus.Setting;\n\n    try {\n      // Update reactive state\n      p0.value = p0Val;\n      p1.value = p1Val;\n      if (optionsVal !== undefined) options.value = optionsVal;\n      if (bearingVal !== undefined) bearing.value = bearingVal;\n\n      // Use current bearing if none provided\n      const finalBearing = bearing.value ?? getCurrentBearing() ?? 0;\n\n      // Perform the screen coordinates fitting\n      map.fitScreenCoordinates(p0Val, p1Val, finalBearing, options.value);\n\n      status.value = FitScreenCoordinatesStatus.Set;\n    } catch (error) {\n      status.value = FitScreenCoordinatesStatus.Error;\n      logError('Error fitting screen coordinates:', error, {\n        p0: p0Val,\n        p1: p1Val,\n        bearing: bearingVal,\n        options: optionsVal,\n      });\n    }\n  }\n\n  /**\n   * Clears the current screen coordinates\n   */\n  function clearCoordinates(): void {\n    p0.value = undefined;\n    p1.value = undefined;\n    options.value = defaultOptions;\n    bearing.value = defaultBearing;\n    status.value = FitScreenCoordinatesStatus.NotSet;\n  }\n\n  // Watch for map and coordinates changes with enhanced error handling\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (\n      map &&\n      p0.value &&\n      p1.value &&\n      status.value !== FitScreenCoordinatesStatus.Setting\n    ) {\n      try {\n        if (!map.isStyleLoaded()) {\n          // Wait for style to load before fitting\n          const onStyleLoad = () => {\n            map.off('styledata', onStyleLoad);\n            fitScreenCoordinates(\n              p0.value!,\n              p1.value!,\n              options.value,\n              bearing.value,\n            );\n          };\n          map.on('styledata', onStyleLoad);\n          return;\n        }\n\n        // Use current bearing if none set\n        const finalBearing = bearing.value ?? getCurrentBearing() ?? 0;\n\n        map.fitScreenCoordinates(\n          p0.value,\n          p1.value,\n          finalBearing,\n          options.value,\n        );\n        status.value = FitScreenCoordinatesStatus.Set;\n      } catch (error) {\n        status.value = FitScreenCoordinatesStatus.Error;\n        logError('Error in watchEffect for screen coordinates:', error);\n      }\n    }\n  });\n\n  // Cleanup function for disposing resources\n  function cleanup(): void {\n    if (autoCleanup) {\n      clearCoordinates();\n    }\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  return {\n    fitScreenCoordinates,\n    clearCoordinates,\n    status: status.value as Readonly<FitScreenCoordinatesStatus>,\n    isCoordinatesSet: isCoordinatesSet.value,\n    isFitting: isFitting.value,\n    hasError: hasError.value,\n  };\n}\n","import { watchEffect, ref, computed, unref, onUnmounted } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable, Undefinedable } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type { Map, FlyToOptions, LngLatLike, CameraOptions } from 'maplibre-gl';\n\n/**\n * Fly animation status enum for better state management\n */\nexport enum FlyStatus {\n  NotStarted = 'not-started',\n  Flying = 'flying',\n  Completed = 'completed',\n  Error = 'error',\n}\n\ninterface FlyToProps {\n  map: MaybeRef<Nullable<Map>>;\n  options?: FlyToOptions;\n  debug?: boolean;\n}\n\ninterface FlyToActions {\n  flyTo: (options?: FlyToOptions) => Promise<void>;\n  flyToCenter: (\n    center: LngLatLike,\n    options?: Omit<FlyToOptions, 'center'>,\n  ) => Promise<void>;\n  flyToZoom: (\n    zoom: number,\n    options?: Omit<FlyToOptions, 'zoom'>,\n  ) => Promise<void>;\n  flyToBearing: (\n    bearing: number,\n    options?: Omit<FlyToOptions, 'bearing'>,\n  ) => Promise<void>;\n  flyToPitch: (\n    pitch: number,\n    options?: Omit<FlyToOptions, 'pitch'>,\n  ) => Promise<void>;\n  stopFlying: () => void;\n  getCurrentCamera: () => CameraOptions | null;\n  flyStatus: Readonly<FlyStatus>;\n  isFlying: boolean;\n  cleanup: () => void;\n}\n\n/**\n * Composable for managing smooth map camera fly animations with enhanced error handling\n * Provides reactive fly-to animations with validation and debugging capabilities\n *\n * @param props - Configuration options for fly-to animations\n * @returns Enhanced actions and state for camera fly animations\n */\nexport function useFlyTo(props: FlyToProps): FlyToActions {\n  const { logWarn, logError } = useLogger(props.debug ?? false);\n  const flyOptions = ref<Undefinedable<FlyToOptions>>(props.options);\n  const flyStatus = ref<FlyStatus>(FlyStatus.NotStarted);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isFlying = computed(() => flyStatus.value === FlyStatus.Flying);\n\n  /**\n   * Validates if fly operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateFlyOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) return false;\n    return true;\n  }\n\n  /**\n   * Validates fly-to options\n   * @param options - Options to validate\n   * @returns boolean indicating if options are valid\n   */\n  function validateFlyOptions(options: FlyToOptions): boolean {\n    if (!options || typeof options !== 'object') return false;\n\n    // Validate zoom range\n    if (options.zoom !== undefined && (options.zoom < 0 || options.zoom > 24)) {\n      logWarn('Warning: Zoom level should be between 0 and 24', {\n        zoom: options.zoom,\n      });\n    }\n\n    // Validate bearing range\n    if (\n      options.bearing !== undefined &&\n      (options.bearing < -180 || options.bearing > 180)\n    ) {\n      logWarn('Warning: Bearing should be between -180 and 180 degrees', {\n        bearing: options.bearing,\n      });\n    }\n\n    // Validate pitch range\n    if (\n      options.pitch !== undefined &&\n      (options.pitch < 0 || options.pitch > 60)\n    ) {\n      logWarn('Warning: Pitch should be between 0 and 60 degrees', {\n        pitch: options.pitch,\n      });\n    }\n\n    // Validate speed\n    if (options.speed !== undefined && options.speed <= 0) {\n      logWarn('Warning: Speed should be greater than 0', {\n        speed: options.speed,\n      });\n    }\n\n    // Validate curve\n    if (options.curve !== undefined && options.curve < 0) {\n      logWarn('Warning: Curve should be non-negative', {\n        curve: options.curve,\n      });\n    }\n\n    return true;\n  }\n\n  /**\n   * Gets the current camera state\n   * @returns Current camera options or null if not available\n   */\n  function getCurrentCamera(): CameraOptions | null {\n    const map = mapInstance.value;\n    if (!map) return null;\n\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch (error) {\n      logError('Error getting current camera state:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Performs fly-to animation with enhanced error handling and validation\n   * @param options - Fly-to options\n   * @returns Promise that resolves when animation completes\n   */\n  function flyTo(options?: FlyToOptions): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (!validateFlyOperation()) {\n        reject(new Error('Map instance not available'));\n        return;\n      }\n\n      const finalOptions = options || flyOptions.value;\n      if (!finalOptions) {\n        reject(new Error('No fly options provided'));\n        return;\n      }\n\n      if (!validateFlyOptions(finalOptions)) {\n        flyStatus.value = FlyStatus.Error;\n        reject(new Error('Invalid fly options'));\n        return;\n      }\n\n      const map = mapInstance.value!;\n      flyStatus.value = FlyStatus.Flying;\n\n      try {\n        // Store options for future use\n        if (options) flyOptions.value = options;\n\n        // Add event listeners for animation completion\n        const onMoveEnd = () => {\n          map.off('moveend', onMoveEnd);\n          map.off('error', onError);\n          flyStatus.value = FlyStatus.Completed;\n          resolve();\n        };\n\n        const onError = (error: any) => {\n          map.off('moveend', onMoveEnd);\n          map.off('error', onError);\n          flyStatus.value = FlyStatus.Error;\n          reject(error);\n        };\n\n        map.once('moveend', onMoveEnd);\n        map.once('error', onError);\n\n        // Start the animation\n        map.flyTo(finalOptions);\n      } catch (error) {\n        flyStatus.value = FlyStatus.Error;\n        logError('Error starting fly-to animation:', error);\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Flies to a specific center coordinate\n   * @param center - Target center coordinate\n   * @param options - Additional fly options (excluding center)\n   * @returns Promise that resolves when animation completes\n   */\n  function flyToCenter(\n    center: LngLatLike,\n    options?: Omit<FlyToOptions, 'center'>,\n  ): Promise<void> {\n    return flyTo({ ...options, center });\n  }\n\n  /**\n   * Flies to a specific zoom level\n   * @param zoom - Target zoom level\n   * @param options - Additional fly options (excluding zoom)\n   * @returns Promise that resolves when animation completes\n   */\n  function flyToZoom(\n    zoom: number,\n    options?: Omit<FlyToOptions, 'zoom'>,\n  ): Promise<void> {\n    return flyTo({ ...options, zoom });\n  }\n\n  /**\n   * Flies to a specific bearing\n   * @param bearing - Target bearing in degrees\n   * @param options - Additional fly options (excluding bearing)\n   * @returns Promise that resolves when animation completes\n   */\n  function flyToBearing(\n    bearing: number,\n    options?: Omit<FlyToOptions, 'bearing'>,\n  ): Promise<void> {\n    return flyTo({ ...options, bearing });\n  }\n\n  /**\n   * Flies to a specific pitch\n   * @param pitch - Target pitch in degrees\n   * @param options - Additional fly options (excluding pitch)\n   * @returns Promise that resolves when animation completes\n   */\n  function flyToPitch(\n    pitch: number,\n    options?: Omit<FlyToOptions, 'pitch'>,\n  ): Promise<void> {\n    return flyTo({ ...options, pitch });\n  }\n\n  /**\n   * Stops any ongoing flying animation\n   */\n  function stopFlying(): void {\n    const map = mapInstance.value;\n    if (!map) return;\n\n    try {\n      map.stop();\n      flyStatus.value = FlyStatus.Completed;\n    } catch (error) {\n      logError('Error stopping flying animation:', error);\n    }\n  }\n\n  // Watch for map and options changes with cleanup\n  const stopWatchEffect = watchEffect(() => {\n    const map = mapInstance.value;\n    if (map && flyOptions.value && flyStatus.value === FlyStatus.NotStarted) {\n      flyTo(flyOptions.value).catch((error) => {\n        logError('Error in watchEffect flyTo:', error);\n      });\n    }\n  });\n\n  // Enhanced cleanup function\n  function cleanup(): void {\n    try {\n      // Stop any ongoing animation\n      stopFlying();\n\n      // Stop watch effect\n      stopWatchEffect();\n\n      // Clear references\n      flyOptions.value = undefined;\n      flyStatus.value = FlyStatus.NotStarted;\n    } catch (error) {\n      logError('Error during useFlyTo cleanup:', error);\n    }\n  }\n\n  // Automatic cleanup on unmount\n  onUnmounted(cleanup);\n\n  return {\n    flyTo,\n    flyToCenter,\n    flyToZoom,\n    flyToBearing,\n    flyToPitch,\n    stopFlying,\n    getCurrentCamera,\n    flyStatus: flyStatus.value as Readonly<FlyStatus>,\n    isFlying: isFlying.value,\n    cleanup, // Expose cleanup for manual use\n  };\n}\n","import { watchEffect, ref, computed, unref, onUnmounted } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable, Undefinedable } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type {\n  Map,\n  JumpToOptions,\n  LngLatLike,\n  CameraOptions,\n} from 'maplibre-gl';\n\n/**\n * Jump animation status enum for better state management\n */\nexport enum JumpStatus {\n  NotStarted = 'not-started',\n  Jumping = 'jumping',\n  Completed = 'completed',\n  Error = 'error',\n}\n\ninterface JumpToProps {\n  map: MaybeRef<Nullable<Map>>;\n  options?: JumpToOptions;\n  debug?: boolean;\n  autoJump?: boolean;\n}\n\ninterface JumpToActions {\n  jumpTo: (options?: JumpToOptions) => void;\n  jumpToCenter: (\n    center: LngLatLike,\n    options?: Omit<JumpToOptions, 'center'>,\n  ) => void;\n  jumpToZoom: (zoom: number, options?: Omit<JumpToOptions, 'zoom'>) => void;\n  jumpToBearing: (\n    bearing: number,\n    options?: Omit<JumpToOptions, 'bearing'>,\n  ) => void;\n  jumpToPitch: (pitch: number, options?: Omit<JumpToOptions, 'pitch'>) => void;\n  getCurrentCamera: () => CameraOptions | null;\n  validateJumpOptions: (options: JumpToOptions) => boolean;\n  jumpStatus: Readonly<JumpStatus>;\n  isJumping: boolean;\n}\n\n/**\n * Composable for managing instant map camera jumps with enhanced error handling\n * Provides reactive jump-to functionality with validation and debugging capabilities\n *\n * @param props - Configuration options for jump-to functionality\n * @returns Enhanced actions and state for camera jumps\n */\nexport function useJumpTo(props: JumpToProps): JumpToActions;\n\n/**\n * Legacy overload for backward compatibility\n * @deprecated Use the new props-based interface for better type safety and features\n */\nexport function useJumpTo(\n  map: MaybeRef<Nullable<Map>>,\n  options?: JumpToOptions,\n): { jumpTo: (options?: JumpToOptions) => void };\n\nexport function useJumpTo(\n  mapOrProps: MaybeRef<Nullable<Map>> | JumpToProps,\n  legacyOptions?: JumpToOptions,\n): JumpToActions | { jumpTo: (options?: JumpToOptions) => void } {\n  // Handle legacy API for backward compatibility\n  const isLegacyAPI =\n    legacyOptions !== undefined || !('map' in (mapOrProps as any));\n  const props: JumpToProps = isLegacyAPI\n    ? {\n        map: mapOrProps as MaybeRef<Nullable<Map>>,\n        options: legacyOptions,\n        debug: false,\n        autoJump: true,\n      }\n    : (mapOrProps as JumpToProps);\n\n  const { logError } = useLogger(props.debug ?? false);\n  const jumpOptions = ref<Undefinedable<JumpToOptions>>(props.options);\n  const jumpStatus = ref<JumpStatus>(JumpStatus.NotStarted);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isJumping = computed(() => jumpStatus.value === JumpStatus.Jumping);\n\n  /**\n   * Validates if jump operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateJumpOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) return false;\n    return true;\n  }\n\n  /**\n   * Validates jump options for correctness\n   * @param options - Jump options to validate\n   * @returns boolean indicating if options are valid\n   */\n  function validateJumpOptions(options: JumpToOptions): boolean {\n    if (!options) return false;\n\n    // Validate center coordinates if provided\n    if (options.center) {\n      if (Array.isArray(options.center)) {\n        if (options.center.length !== 2) {\n          return false;\n        }\n        const [lng, lat] = options.center;\n        if (typeof lng !== 'number' || typeof lat !== 'number') {\n          return false;\n        }\n        if (lng < -180 || lng > 180 || lat < -90 || lat > 90) {\n          return false;\n        }\n      }\n    }\n\n    // Validate zoom level if provided\n    if (options.zoom !== undefined) {\n      if (\n        typeof options.zoom !== 'number' ||\n        options.zoom < 0 ||\n        options.zoom > 24\n      ) {\n        return false;\n      }\n    }\n\n    // Validate bearing if provided\n    if (options.bearing !== undefined) {\n      if (typeof options.bearing !== 'number') {\n        return false;\n      }\n    }\n\n    // Validate pitch if provided\n    if (options.pitch !== undefined) {\n      if (\n        typeof options.pitch !== 'number' ||\n        options.pitch < 0 ||\n        options.pitch > 60\n      ) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * Gets the current camera position\n   * @returns Current camera options or null\n   */\n  function getCurrentCamera(): CameraOptions | null {\n    const map = mapInstance.value;\n    if (!map) return null;\n\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch (error) {\n      logError('Error getting current camera:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Performs jump-to operation with enhanced error handling and validation\n   * @param options - Jump-to options\n   */\n  function jumpTo(options?: JumpToOptions): void {\n    if (!validateJumpOperation()) return;\n\n    const finalOptions = options || jumpOptions.value;\n    if (!finalOptions) return;\n\n    if (!validateJumpOptions(finalOptions)) {\n      jumpStatus.value = JumpStatus.Error;\n      return;\n    }\n\n    const map = mapInstance.value!;\n    jumpStatus.value = JumpStatus.Jumping;\n\n    try {\n      // Store options for future use\n      if (options) jumpOptions.value = options;\n\n      // Perform the jump\n      map.jumpTo(finalOptions);\n\n      jumpStatus.value = JumpStatus.Completed;\n    } catch (error) {\n      jumpStatus.value = JumpStatus.Error;\n      logError('Error performing jump-to operation:', error);\n    }\n  }\n\n  /**\n   * Jumps to a specific center coordinate\n   * @param center - Target center coordinate\n   * @param options - Additional jump options (excluding center)\n   */\n  function jumpToCenter(\n    center: LngLatLike,\n    options?: Omit<JumpToOptions, 'center'>,\n  ): void {\n    jumpTo({ ...options, center });\n  }\n\n  /**\n   * Jumps to a specific zoom level\n   * @param zoom - Target zoom level\n   * @param options - Additional jump options (excluding zoom)\n   */\n  function jumpToZoom(\n    zoom: number,\n    options?: Omit<JumpToOptions, 'zoom'>,\n  ): void {\n    jumpTo({ ...options, zoom });\n  }\n\n  /**\n   * Jumps to a specific bearing\n   * @param bearing - Target bearing in degrees\n   * @param options - Additional jump options (excluding bearing)\n   */\n  function jumpToBearing(\n    bearing: number,\n    options?: Omit<JumpToOptions, 'bearing'>,\n  ): void {\n    jumpTo({ ...options, bearing });\n  }\n\n  /**\n   * Jumps to a specific pitch\n   * @param pitch - Target pitch in degrees\n   * @param options - Additional jump options (excluding pitch)\n   */\n  function jumpToPitch(\n    pitch: number,\n    options?: Omit<JumpToOptions, 'pitch'>,\n  ): void {\n    jumpTo({ ...options, pitch });\n  }\n\n  // Watch for map and options changes\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (\n      map &&\n      jumpOptions.value &&\n      props.autoJump !== false &&\n      jumpStatus.value === JumpStatus.NotStarted\n    ) {\n      jumpTo(jumpOptions.value);\n    }\n  });\n\n  // Cleanup function\n  function cleanup(): void {\n    jumpStatus.value = JumpStatus.Completed;\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  // Return appropriate interface based on API version\n  if (isLegacyAPI) {\n    return { jumpTo };\n  }\n\n  return {\n    jumpTo,\n    jumpToCenter,\n    jumpToZoom,\n    jumpToBearing,\n    jumpToPitch,\n    getCurrentCamera,\n    validateJumpOptions,\n    jumpStatus: jumpStatus.value as Readonly<JumpStatus>,\n    isJumping: isJumping.value,\n  };\n}\n","import { computed, ref, type ComputedRef } from 'vue';\n\n/**\n * Options for optimized computed properties\n */\ninterface OptimizedComputedOptions<T> {\n  /** Enable deep equality checking (default: false) */\n  deepEqual?: boolean;\n  /** Custom equality function */\n  equalityFn?: (a: T, b: T) => boolean;\n  /** Cache duration in milliseconds (default: no expiration) */\n  cacheDuration?: number;\n}\n\n/**\n * Creates an optimized computed property with caching and equality checking\n * Prevents unnecessary re-computations when values haven't actually changed\n *\n * @param getter - The computed getter function\n * @param options - Optimization options\n * @returns Optimized computed ref\n */\nexport function useOptimizedComputed<T>(\n  getter: () => T,\n  options: OptimizedComputedOptions<T> = {},\n): ComputedRef<T> {\n  const { deepEqual = false, equalityFn, cacheDuration } = options;\n\n  const lastValue = ref<T>();\n  const lastComputedTime = ref<number>(0);\n  const hasInitialValue = ref(false);\n\n  /**\n   * Default equality function\n   */\n  function defaultEqualityFn(a: T, b: T): boolean {\n    if (deepEqual) {\n      return JSON.stringify(a) === JSON.stringify(b);\n    }\n    return Object.is(a, b);\n  }\n\n  const isEqual = equalityFn || defaultEqualityFn;\n\n  return computed(() => {\n    const now = Date.now();\n\n    // Check cache expiration\n    if (cacheDuration && hasInitialValue.value) {\n      const timeSinceLastCompute = now - lastComputedTime.value;\n      if (timeSinceLastCompute < cacheDuration) {\n        return lastValue.value as T;\n      }\n    }\n\n    const newValue = getter();\n\n    // Check if value actually changed\n    if (hasInitialValue.value && isEqual(newValue, lastValue.value as T)) {\n      return lastValue.value as T;\n    }\n\n    // Update cache\n    lastValue.value = newValue;\n    lastComputedTime.value = now;\n    hasInitialValue.value = true;\n\n    return newValue;\n  });\n}\n\n/**\n * Creates a memoized function with caching\n * Useful for expensive operations that depend on reactive data\n *\n * @param fn - Function to memoize\n * @param keyFn - Function to generate cache key\n * @param maxCacheSize - Maximum cache size (default: 100)\n * @returns Memoized function\n */\nexport function useMemoized<TArgs extends any[], TReturn>(\n  fn: (...args: TArgs) => TReturn,\n  keyFn: (...args: TArgs) => string = (...args) => JSON.stringify(args),\n  maxCacheSize = 100,\n): (...args: TArgs) => TReturn {\n  const cache = new Map<string, { value: TReturn; timestamp: number }>();\n\n  return (...args: TArgs): TReturn => {\n    const key = keyFn(...args);\n    const cached = cache.get(key);\n\n    if (cached) {\n      return cached.value;\n    }\n\n    const result = fn(...args);\n\n    // Manage cache size\n    if (cache.size >= maxCacheSize) {\n      // Remove oldest entry\n      const oldestKey = cache.keys().next().value;\n      if (oldestKey !== undefined) {\n        cache.delete(oldestKey);\n      }\n    }\n\n    cache.set(key, { value: result, timestamp: Date.now() });\n    return result;\n  };\n}\n\n/**\n * Creates a computed property that only updates when dependencies change significantly\n * Useful for expensive computations that should be throttled\n *\n * @param getter - The computed getter function\n * @param threshold - Minimum change threshold (for numbers)\n * @param debounceMs - Debounce delay in milliseconds\n * @returns Throttled computed ref\n */\nexport function useThrottledComputed<T extends number>(\n  getter: () => T,\n  threshold = 0.01,\n  debounceMs = 100,\n): ComputedRef<T> {\n  const lastValue = ref<T>();\n  const timeoutId = ref<number>();\n\n  return computed(() => {\n    const newValue = getter();\n\n    if (lastValue.value !== undefined) {\n      const change = Math.abs(newValue - lastValue.value);\n      if (change < threshold) {\n        return lastValue.value;\n      }\n    }\n\n    // Clear existing timeout\n    if (timeoutId.value) {\n      clearTimeout(timeoutId.value);\n    }\n\n    // Debounce the update\n    timeoutId.value = window.setTimeout(() => {\n      lastValue.value = newValue;\n    }, debounceMs);\n\n    return newValue;\n  });\n}\n\n/**\n * Creates a computed property with automatic cleanup\n * Useful for computed properties that create resources\n *\n * @param getter - The computed getter function\n * @param cleanup - Cleanup function for old values\n * @returns Computed ref with cleanup\n */\nexport function useComputedWithCleanup<T>(\n  getter: () => T,\n  cleanup: (oldValue: T) => void,\n): ComputedRef<T> {\n  const lastValue = ref<T>();\n\n  return computed(() => {\n    const newValue = getter();\n\n    // Cleanup old value if it exists and is different\n    if (lastValue.value !== undefined && lastValue.value !== newValue) {\n      try {\n        cleanup(lastValue.value);\n      } catch (error) {\n        console.warn('Error during computed cleanup:', error);\n      }\n    }\n\n    lastValue.value = newValue;\n    return newValue;\n  });\n}\n\n/**\n * Creates a computed property that batches updates\n * Useful for computed properties that trigger multiple reactive updates\n *\n * @param getter - The computed getter function\n * @param batchSize - Number of updates to batch (default: 5)\n * @param batchDelay - Delay between batches in milliseconds (default: 16)\n * @returns Batched computed ref\n */\nexport function useBatchedComputed<T>(\n  getter: () => T,\n  batchSize = 5,\n  batchDelay = 16,\n): ComputedRef<T> {\n  const pendingUpdates = ref<T[]>([]);\n  const lastValue = ref<T>();\n  const timeoutId = ref<number>();\n\n  function processBatch(): void {\n    if (pendingUpdates.value.length > 0) {\n      // Use the latest value from the batch\n      const latestValue = pendingUpdates.value[pendingUpdates.value.length - 1];\n      lastValue.value = latestValue as any;\n      pendingUpdates.value = [];\n    }\n  }\n\n  return computed(() => {\n    const newValue = getter();\n\n    pendingUpdates.value.push(newValue as any);\n\n    // Process batch when it reaches the size limit\n    if (pendingUpdates.value.length >= batchSize) {\n      processBatch();\n      return lastValue.value as T;\n    }\n\n    // Schedule batch processing\n    if (timeoutId.value) {\n      clearTimeout(timeoutId.value);\n    }\n\n    timeoutId.value = window.setTimeout(processBatch, batchDelay);\n\n    return lastValue.value !== undefined ? lastValue.value : newValue;\n  });\n}\n","import { watchEffect, ref, computed, unref, onUnmounted } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable, Undefinedable } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type {\n  Map,\n  AnimationOptions,\n  PointLike,\n  LngLatLike,\n  CameraOptions,\n} from 'maplibre-gl';\n\n/**\n * Pan animation status enum for better state management\n */\nexport enum PanStatus {\n  NotStarted = 'not-started',\n  Panning = 'panning',\n  Completed = 'completed',\n  Error = 'error',\n}\n\ninterface PanByProps {\n  map: MaybeRef<Nullable<Map>>;\n  offset?: PointLike;\n  options?: AnimationOptions;\n  debug?: boolean;\n  autoPan?: boolean;\n}\n\ninterface PanByActions {\n  panBy: (offset: PointLike, options?: AnimationOptions) => Promise<void>;\n  stopPanning: () => void;\n  getCurrentCamera: () => CameraOptions | null;\n  validatePanOffset: (offset: PointLike) => boolean;\n  panStatus: Readonly<PanStatus>;\n  isPanning: boolean;\n  panCount: number;\n}\n\ninterface PanToProps {\n  map: MaybeRef<Nullable<Map>>;\n  lnglat?: LngLatLike;\n  options?: AnimationOptions;\n  debug?: boolean;\n  autoPan?: boolean;\n}\n\ninterface PanToActions {\n  panTo: (lnglat: LngLatLike, options?: AnimationOptions) => Promise<void>;\n  stopPanning: () => void;\n  getCurrentCamera: () => CameraOptions | null;\n  validatePanTarget: (lnglat: LngLatLike) => boolean;\n  panStatus: Readonly<PanStatus>;\n  isPanning: boolean;\n}\n\n/**\n * Composable for managing map panning by offset with enhanced error handling\n * Provides reactive pan-by functionality with validation and debugging capabilities\n *\n * @param props - Configuration options for pan-by functionality\n * @returns Enhanced actions and state for pan-by operations\n */\nexport function usePanBy(props: PanByProps): PanByActions;\n\n/**\n * Legacy overload for backward compatibility\n * @deprecated Use the new props-based interface for better type safety and features\n */\nexport function usePanBy(\n  map: MaybeRef<Nullable<Map>>,\n  options?: AnimationOptions & { offset: PointLike },\n): { panBy: (offsetVal: PointLike, options?: AnimationOptions) => void };\n\nexport function usePanBy(\n  mapOrProps: MaybeRef<Nullable<Map>> | PanByProps,\n  legacyOptions?: AnimationOptions & { offset: PointLike },\n):\n  | PanByActions\n  | { panBy: (offsetVal: PointLike, options?: AnimationOptions) => void } {\n  // Handle legacy API for backward compatibility\n  const isLegacyAPI =\n    legacyOptions !== undefined || !('map' in (mapOrProps as any));\n  const props: PanByProps = isLegacyAPI\n    ? {\n        map: mapOrProps as MaybeRef<Nullable<Map>>,\n        offset: legacyOptions?.offset,\n        options: legacyOptions,\n        debug: false,\n        autoPan: true,\n      }\n    : (mapOrProps as PanByProps);\n\n  const { logError } = useLogger(props.debug ?? false);\n  const offset = ref<PointLike | undefined>(props.offset);\n  const animationOptions = ref<Undefinedable<AnimationOptions>>(props.options);\n  const panStatus = ref<PanStatus>(PanStatus.NotStarted);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isPanning = computed(() => panStatus.value === PanStatus.Panning);\n\n  /**\n   * Validates if pan operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validatePanOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) return false;\n    return true;\n  }\n\n  /**\n   * Validates pan offset for correctness\n   * @param offset - Pan offset to validate\n   * @returns boolean indicating if offset is valid\n   */\n  function validatePanOffset(offset: PointLike): boolean {\n    if (!offset) return false;\n\n    if (Array.isArray(offset)) {\n      if (offset.length !== 2) {\n        return false;\n      }\n      const [x, y] = offset;\n      if (typeof x !== 'number' || typeof y !== 'number') {\n        return false;\n      }\n    } else if (typeof offset === 'object') {\n      if (typeof offset.x !== 'number' || typeof offset.y !== 'number') {\n        return false;\n      }\n    } else {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Gets the current camera position\n   * @returns Current camera options or null\n   */\n  function getCurrentCamera(): CameraOptions | null {\n    const map = mapInstance.value;\n    if (!map) return null;\n\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch (error) {\n      logError('Error getting current camera:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Performs pan-by operation with enhanced error handling and validation\n   * @param offsetVal - Pan offset value\n   * @param options - Animation options\n   * @returns Promise that resolves when animation completes\n   */\n  function panBy(\n    offsetVal: PointLike,\n    options?: AnimationOptions,\n  ): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (!validatePanOperation()) {\n        reject(new Error('Map instance not available'));\n        return;\n      }\n\n      if (!validatePanOffset(offsetVal)) {\n        panStatus.value = PanStatus.Error;\n        reject(new Error('Invalid pan offset'));\n        return;\n      }\n\n      const map = mapInstance.value!;\n      const finalOptions = options || animationOptions.value;\n      panStatus.value = PanStatus.Panning;\n\n      try {\n        // Store values for future use\n        offset.value = offsetVal;\n        if (options) animationOptions.value = options;\n\n        if (finalOptions) {\n          // Add event listeners for animation completion\n          const onMoveEnd = () => {\n            map.off('moveend', onMoveEnd);\n            map.off('error', onError);\n            panStatus.value = PanStatus.Completed;\n            resolve();\n          };\n\n          const onError = (error: any) => {\n            map.off('moveend', onMoveEnd);\n            map.off('error', onError);\n            panStatus.value = PanStatus.Error;\n            reject(error);\n          };\n\n          map.once('moveend', onMoveEnd);\n          map.once('error', onError);\n\n          // Start the animation\n          map.panBy(offsetVal, finalOptions);\n        } else {\n          // Immediate pan without animation\n          map.panBy(offsetVal);\n          panStatus.value = PanStatus.Completed;\n          resolve();\n        }\n      } catch (error) {\n        panStatus.value = PanStatus.Error;\n        logError('Error performing pan-by operation:', error);\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Stops any ongoing panning animation\n   */\n  function stopPanning(): void {\n    const map = mapInstance.value;\n    if (!map) return;\n\n    try {\n      map.stop();\n      panStatus.value = PanStatus.Completed;\n    } catch (error) {\n      logError('Error stopping panning animation:', error);\n    }\n  }\n\n  // Legacy function for backward compatibility\n  function legacyPanBy(offsetVal: PointLike, options?: AnimationOptions): void {\n    panBy(offsetVal, options).catch((error) => {\n      logError('Error in legacy panBy:', error);\n    });\n  }\n\n  // Watch for map and options changes\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (\n      map &&\n      offset.value &&\n      props.autoPan !== false &&\n      panStatus.value === PanStatus.NotStarted\n    ) {\n      panBy(offset.value, animationOptions.value).catch((error) => {\n        logError('Error in watchEffect panBy:', error);\n      });\n    }\n  });\n\n  // Cleanup function\n  function cleanup(): void {\n    panStatus.value = PanStatus.Completed;\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  // Return appropriate interface based on API version\n  if (isLegacyAPI) {\n    return { panBy: legacyPanBy };\n  }\n\n  return {\n    panBy,\n    stopPanning,\n    getCurrentCamera,\n    validatePanOffset,\n    panStatus: panStatus.value as Readonly<PanStatus>,\n    isPanning: isPanning.value,\n  };\n}\n\n/**\n * Composable for managing map panning to coordinates with enhanced error handling\n * Provides reactive pan-to functionality with validation and debugging capabilities\n *\n * @param props - Configuration options for pan-to functionality\n * @returns Enhanced actions and state for pan-to operations\n */\nexport function usePanTo(props: PanToProps): PanToActions;\n\n/**\n * Legacy overload for backward compatibility\n * @deprecated Use the new props-based interface for better type safety and features\n */\nexport function usePanTo(\n  map: MaybeRef<Nullable<Map>>,\n  options?: AnimationOptions & { lnglat: LngLatLike },\n): { panTo: (offsetVal: LngLatLike, options?: AnimationOptions) => void };\n\nexport function usePanTo(\n  mapOrProps: MaybeRef<Nullable<Map>> | PanToProps,\n  legacyOptions?: AnimationOptions & { lnglat: LngLatLike },\n):\n  | PanToActions\n  | { panTo: (offsetVal: LngLatLike, options?: AnimationOptions) => void } {\n  // Handle legacy API for backward compatibility\n  const isLegacyAPI =\n    legacyOptions !== undefined || !('map' in (mapOrProps as any));\n  const props: PanToProps = isLegacyAPI\n    ? {\n        map: mapOrProps as MaybeRef<Nullable<Map>>,\n        lnglat: legacyOptions?.lnglat,\n        options: legacyOptions,\n        debug: false,\n        autoPan: true,\n      }\n    : (mapOrProps as PanToProps);\n\n  const { log } = useLogger(props.debug ?? false);\n  const lnglat = ref<LngLatLike | undefined>(props.lnglat);\n  const animationOptions = ref<Undefinedable<AnimationOptions>>(props.options);\n  const panStatus = ref<PanStatus>(PanStatus.NotStarted);\n  const panCount = ref<number>(0);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isPanning = computed(() => panStatus.value === PanStatus.Panning);\n\n  /**\n   * Validates if pan operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validatePanOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) {\n      log('Cannot perform pan operation: map instance not available');\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Validates pan target coordinates for correctness\n   * @param lnglat - Pan target coordinates to validate\n   * @returns boolean indicating if coordinates are valid\n   */\n  function validatePanTarget(lnglat: LngLatLike): boolean {\n    if (!lnglat) {\n      log('Invalid pan target: coordinates are null or undefined');\n      return false;\n    }\n\n    if (Array.isArray(lnglat)) {\n      if (lnglat.length !== 2) {\n        log('Invalid pan target: array must have exactly 2 elements', {\n          lnglat,\n        });\n        return false;\n      }\n      const [lng, lat] = lnglat;\n      if (typeof lng !== 'number' || typeof lat !== 'number') {\n        log('Invalid pan target: coordinates must be numbers', { lnglat });\n        return false;\n      }\n      if (lng < -180 || lng > 180 || lat < -90 || lat > 90) {\n        log('Invalid pan target: coordinates out of valid range', { lnglat });\n        return false;\n      }\n    } else if (typeof lnglat === 'object') {\n      // Handle different LngLatLike object formats\n      const hasLngLat = 'lng' in lnglat && 'lat' in lnglat;\n      const hasLonLat = 'lon' in lnglat && 'lat' in lnglat;\n\n      if (hasLngLat) {\n        const obj = lnglat as { lng: number; lat: number };\n        if (typeof obj.lng !== 'number' || typeof obj.lat !== 'number') {\n          log('Invalid pan target: lng and lat must be numbers', { lnglat });\n          return false;\n        }\n        if (obj.lng < -180 || obj.lng > 180 || obj.lat < -90 || obj.lat > 90) {\n          log('Invalid pan target: coordinates out of valid range', { lnglat });\n          return false;\n        }\n      } else if (hasLonLat) {\n        const obj = lnglat as { lon: number; lat: number };\n        if (typeof obj.lon !== 'number' || typeof obj.lat !== 'number') {\n          log('Invalid pan target: lon and lat must be numbers', { lnglat });\n          return false;\n        }\n        if (obj.lon < -180 || obj.lon > 180 || obj.lat < -90 || obj.lat > 90) {\n          log('Invalid pan target: coordinates out of valid range', { lnglat });\n          return false;\n        }\n      } else {\n        log(\n          'Invalid pan target: object must have lng,lat or lon,lat properties',\n          { lnglat },\n        );\n        return false;\n      }\n    } else {\n      log(\n        'Invalid pan target: must be array or object with lng,lat properties',\n        { lnglat },\n      );\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Gets the current camera position\n   * @returns Current camera options or null\n   */\n  function getCurrentCamera(): CameraOptions | null {\n    const map = mapInstance.value;\n    if (!map) {\n      log('Cannot get camera: map instance not available');\n      return null;\n    }\n\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch (error) {\n      log('Error getting current camera:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Performs pan-to operation with enhanced error handling and validation\n   * @param lnglatVal - Pan target coordinates\n   * @param options - Animation options\n   * @returns Promise that resolves when animation completes\n   */\n  function panTo(\n    lnglatVal: LngLatLike,\n    options?: AnimationOptions,\n  ): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (!validatePanOperation()) {\n        reject(new Error('Map instance not available'));\n        return;\n      }\n\n      if (!validatePanTarget(lnglatVal)) {\n        panStatus.value = PanStatus.Error;\n        reject(new Error('Invalid pan target coordinates'));\n        return;\n      }\n\n      const map = mapInstance.value!;\n      const finalOptions = options || animationOptions.value;\n      panStatus.value = PanStatus.Panning;\n\n      try {\n        // Store values for future use\n        lnglat.value = lnglatVal;\n        if (options) animationOptions.value = options;\n\n        panCount.value++;\n        log('Performing pan-to operation', {\n          lnglat: lnglatVal,\n          options: finalOptions,\n          panCount: panCount.value,\n        });\n\n        if (finalOptions) {\n          // Add event listeners for animation completion\n          const onMoveEnd = () => {\n            map.off('moveend', onMoveEnd);\n            map.off('error', onError);\n            panStatus.value = PanStatus.Completed;\n            log('Pan-to animation completed successfully');\n            resolve();\n          };\n\n          const onError = (error: any) => {\n            map.off('moveend', onMoveEnd);\n            map.off('error', onError);\n            panStatus.value = PanStatus.Error;\n            log('Error during pan-to animation:', error);\n            reject(error);\n          };\n\n          map.once('moveend', onMoveEnd);\n          map.once('error', onError);\n\n          // Start the animation\n          map.panTo(lnglatVal, finalOptions);\n        } else {\n          // Immediate pan without animation\n          map.panTo(lnglatVal);\n          panStatus.value = PanStatus.Completed;\n          log('Pan-to operation completed immediately');\n          resolve();\n        }\n      } catch (error) {\n        panStatus.value = PanStatus.Error;\n        log('Error performing pan-to operation:', error);\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Stops any ongoing panning animation\n   */\n  function stopPanning(): void {\n    const map = mapInstance.value;\n    if (!map) {\n      log('Cannot stop panning: map instance not available');\n      return;\n    }\n\n    try {\n      map.stop();\n      panStatus.value = PanStatus.Completed;\n      log('Panning animation stopped');\n    } catch (error) {\n      log('Error stopping panning animation:', error);\n    }\n  }\n\n  // Legacy function for backward compatibility\n  function legacyPanTo(\n    lnglatVal: LngLatLike,\n    options?: AnimationOptions,\n  ): void {\n    panTo(lnglatVal, options).catch((error) => {\n      log('Error in legacy panTo:', error);\n    });\n  }\n\n  // Watch for map and options changes\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (\n      map &&\n      lnglat.value &&\n      props.autoPan !== false &&\n      panStatus.value === PanStatus.NotStarted\n    ) {\n      panTo(lnglat.value, animationOptions.value).catch((error) => {\n        log('Error in watchEffect panTo:', error);\n      });\n    }\n  });\n\n  // Cleanup function\n  function cleanup(): void {\n    log('Cleaning up pan-to composable');\n    panStatus.value = PanStatus.Completed;\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  // Return appropriate interface based on API version\n  if (isLegacyAPI) {\n    return { panTo: legacyPanTo };\n  }\n\n  return {\n    panTo,\n    stopPanning,\n    getCurrentCamera,\n    validatePanTarget,\n    panStatus: panStatus.value as Readonly<PanStatus>,\n    isPanning: isPanning.value,\n  };\n}\n","import { watchEffect, ref, computed, unref, onUnmounted } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable, Undefinedable } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type { Map, AnimationOptions, CameraOptions } from 'maplibre-gl';\n\n/**\n * Rotation animation status enum for better state management\n */\nexport enum RotationStatus {\n  NotStarted = 'not-started',\n  Rotating = 'rotating',\n  Completed = 'completed',\n  Error = 'error',\n}\n\ninterface RotateToProps {\n  map: MaybeRef<Nullable<Map>>;\n  bearing?: number;\n  options?: AnimationOptions;\n  debug?: boolean;\n  autoRotate?: boolean;\n}\n\ninterface RotateToActions {\n  rotateTo: (bearing: number, options?: AnimationOptions) => Promise<void>;\n  stopRotating: () => void;\n  getCurrentBearing: () => number | null;\n  getCurrentCamera: () => CameraOptions | null;\n  validateBearing: (bearing: number) => boolean;\n  rotationStatus: Readonly<RotationStatus>;\n  isRotating: boolean;\n}\n\ninterface ResetNorthProps {\n  map: MaybeRef<Nullable<Map>>;\n  options?: AnimationOptions;\n  debug?: boolean;\n  autoReset?: boolean;\n}\n\ninterface ResetNorthActions {\n  resetNorth: (options?: AnimationOptions) => Promise<void>;\n  stopRotating: () => void;\n  getCurrentBearing: () => number | null;\n  getCurrentCamera: () => CameraOptions | null;\n  rotationStatus: Readonly<RotationStatus>;\n  isRotating: boolean;\n}\n\ninterface ResetNorthPitchProps {\n  map: MaybeRef<Nullable<Map>>;\n  options?: AnimationOptions;\n  debug?: boolean;\n  autoReset?: boolean;\n}\n\ninterface ResetNorthPitchActions {\n  resetNorthPitch: (options?: AnimationOptions) => Promise<void>;\n  stopRotating: () => void;\n  getCurrentBearing: () => number | null;\n  getCurrentPitch: () => number | null;\n  getCurrentCamera: () => CameraOptions | null;\n  rotationStatus: Readonly<RotationStatus>;\n  isRotating: boolean;\n}\n\ninterface SnapToNorthProps {\n  map: MaybeRef<Nullable<Map>>;\n  options?: AnimationOptions;\n  debug?: boolean;\n  autoSnap?: boolean;\n}\n\ninterface SnapToNorthActions {\n  snapToNorth: (options?: AnimationOptions) => Promise<void>;\n  stopRotating: () => void;\n  getCurrentBearing: () => number | null;\n  getCurrentCamera: () => CameraOptions | null;\n  rotationStatus: Readonly<RotationStatus>;\n  isRotating: boolean;\n}\n\n/**\n * Composable for managing map rotation-to operations with enhanced error handling\n * Provides reactive rotation-to functionality with validation and debugging capabilities\n *\n * @param props - Configuration options for rotation-to functionality\n * @returns Enhanced actions and state for rotation-to operations\n */\nexport function useRotateTo(props: RotateToProps): RotateToActions;\n\n/**\n * Legacy overload for backward compatibility\n * @deprecated Use the new props-based interface for better type safety and features\n */\nexport function useRotateTo(\n  map: MaybeRef<Nullable<Map>>,\n  options?: AnimationOptions & { bearing: number },\n): { rotateTo: (bearingVal: number, options?: AnimationOptions) => void };\n\nexport function useRotateTo(\n  mapOrProps: MaybeRef<Nullable<Map>> | RotateToProps,\n  legacyOptions?: AnimationOptions & { bearing: number },\n):\n  | RotateToActions\n  | { rotateTo: (bearingVal: number, options?: AnimationOptions) => void } {\n  // Handle legacy API for backward compatibility\n  const isLegacyAPI =\n    legacyOptions !== undefined || !('map' in (mapOrProps as any));\n  const props: RotateToProps = isLegacyAPI\n    ? {\n        map: mapOrProps as MaybeRef<Nullable<Map>>,\n        bearing: legacyOptions?.bearing,\n        options: legacyOptions,\n        debug: false,\n        autoRotate: true,\n      }\n    : (mapOrProps as RotateToProps);\n\n  const { logError, logWarn } = useLogger(props.debug ?? false);\n  const bearing = ref<number | undefined>(props.bearing);\n  const animationOptions = ref<Undefinedable<AnimationOptions>>(props.options);\n  const rotationStatus = ref<RotationStatus>(RotationStatus.NotStarted);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isRotating = computed(\n    () => rotationStatus.value === RotationStatus.Rotating,\n  );\n\n  /**\n   * Validates if rotation operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateRotationOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) return false;\n    return true;\n  }\n\n  /**\n   * Validates bearing value for correctness\n   * @param bearing - Bearing value to validate\n   * @returns boolean indicating if bearing is valid\n   */\n  function validateBearing(bearing: number): boolean {\n    if (typeof bearing !== 'number' || isNaN(bearing)) {\n      return false;\n    }\n\n    // Normalize bearing to 0-360 range for validation\n    const normalizedBearing = ((bearing % 360) + 360) % 360;\n    if (normalizedBearing !== bearing && bearing < 0) {\n      logWarn('Warning: Negative bearing will be normalized', {\n        original: bearing,\n        normalized: normalizedBearing,\n      });\n    }\n\n    return true;\n  }\n\n  /**\n   * Gets the current bearing\n   * @returns Current bearing or null\n   */\n  function getCurrentBearing(): number | null {\n    const map = mapInstance.value;\n    if (!map) return null;\n\n    try {\n      return map.getBearing();\n    } catch (error) {\n      logError('Error getting current bearing:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Gets the current camera position\n   * @returns Current camera options or null\n   */\n  function getCurrentCamera(): CameraOptions | null {\n    const map = mapInstance.value;\n    if (!map) return null;\n\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch (error) {\n      logError('Error getting current camera:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Performs rotate-to operation with enhanced error handling and validation\n   * @param bearingVal - Target bearing value\n   * @param options - Animation options\n   * @returns Promise that resolves when animation completes\n   */\n  function rotateTo(\n    bearingVal: number,\n    options?: AnimationOptions,\n  ): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (!validateRotationOperation()) {\n        reject(new Error('Map instance not available'));\n        return;\n      }\n\n      if (!validateBearing(bearingVal)) {\n        rotationStatus.value = RotationStatus.Error;\n        reject(new Error('Invalid bearing value'));\n        return;\n      }\n\n      const map = mapInstance.value!;\n      const finalOptions = options || animationOptions.value;\n      rotationStatus.value = RotationStatus.Rotating;\n\n      try {\n        // Store values for future use\n        bearing.value = bearingVal;\n        if (options) animationOptions.value = options;\n\n        if (finalOptions) {\n          // Add event listeners for animation completion\n          const onRotateEnd = () => {\n            map.off('rotateend', onRotateEnd);\n            map.off('error', onError);\n            rotationStatus.value = RotationStatus.Completed;\n            resolve();\n          };\n\n          const onError = (error: any) => {\n            map.off('rotateend', onRotateEnd);\n            map.off('error', onError);\n            rotationStatus.value = RotationStatus.Error;\n            reject(error);\n          };\n\n          map.once('rotateend', onRotateEnd);\n          map.once('error', onError);\n\n          // Start the animation\n          map.rotateTo(bearingVal, finalOptions);\n        } else {\n          // Immediate rotation without animation\n          map.rotateTo(bearingVal);\n          rotationStatus.value = RotationStatus.Completed;\n          resolve();\n        }\n      } catch (error) {\n        rotationStatus.value = RotationStatus.Error;\n        logError('Error performing rotate-to operation:', error);\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Stops any ongoing rotation animation\n   */\n  function stopRotating(): void {\n    const map = mapInstance.value;\n    if (!map) return;\n\n    try {\n      map.stop();\n      rotationStatus.value = RotationStatus.Completed;\n    } catch (error) {\n      logError('Error stopping rotation animation:', error);\n    }\n  }\n\n  // Legacy function for backward compatibility\n  function legacyRotateTo(\n    bearingVal: number,\n    options?: AnimationOptions,\n  ): void {\n    rotateTo(bearingVal, options).catch((error) => {\n      logError('Error in legacy rotateTo:', error);\n    });\n  }\n\n  // Watch for map and options changes\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (\n      map &&\n      bearing.value !== undefined &&\n      props.autoRotate !== false &&\n      rotationStatus.value === RotationStatus.NotStarted\n    ) {\n      rotateTo(bearing.value, animationOptions.value).catch((error) => {\n        logError('Error in watchEffect rotateTo:', error);\n      });\n    }\n  });\n\n  // Cleanup function\n  function cleanup(): void {\n    rotationStatus.value = RotationStatus.Completed;\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  // Return appropriate interface based on API version\n  if (isLegacyAPI) {\n    return { rotateTo: legacyRotateTo };\n  }\n\n  return {\n    rotateTo,\n    stopRotating,\n    getCurrentBearing,\n    getCurrentCamera,\n    validateBearing,\n    rotationStatus: rotationStatus.value as Readonly<RotationStatus>,\n    isRotating: isRotating.value,\n  };\n}\n\n/**\n * Composable for managing map reset-north operations with enhanced error handling\n * Provides reactive reset-north functionality with validation and debugging capabilities\n *\n * @param props - Configuration options for reset-north functionality\n * @returns Enhanced actions and state for reset-north operations\n */\nexport function useResetNorth(props: ResetNorthProps): ResetNorthActions;\n\n/**\n * Legacy overload for backward compatibility\n * @deprecated Use the new props-based interface for better type safety and features\n */\nexport function useResetNorth(\n  map: MaybeRef<Nullable<Map>>,\n  options?: AnimationOptions,\n): { resetNorth: (options?: AnimationOptions) => void };\n\nexport function useResetNorth(\n  mapOrProps: MaybeRef<Nullable<Map>> | ResetNorthProps,\n  legacyOptions?: AnimationOptions,\n): ResetNorthActions | { resetNorth: (options?: AnimationOptions) => void } {\n  // Handle legacy API for backward compatibility\n  const isLegacyAPI =\n    legacyOptions !== undefined || !('map' in (mapOrProps as any));\n  const props: ResetNorthProps = isLegacyAPI\n    ? {\n        map: mapOrProps as MaybeRef<Nullable<Map>>,\n        options: legacyOptions,\n        debug: false,\n        autoReset: true,\n      }\n    : (mapOrProps as ResetNorthProps);\n\n  const { logError } = useLogger(props.debug ?? false);\n  const animationOptions = ref<Undefinedable<AnimationOptions>>(props.options);\n  const rotationStatus = ref<RotationStatus>(RotationStatus.NotStarted);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isRotating = computed(\n    () => rotationStatus.value === RotationStatus.Rotating,\n  );\n\n  /**\n   * Validates if rotation operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateRotationOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) return false;\n    return true;\n  }\n\n  /**\n   * Gets the current bearing\n   * @returns Current bearing or null\n   */\n  function getCurrentBearing(): number | null {\n    const map = mapInstance.value;\n    if (!map) return null;\n\n    try {\n      return map.getBearing();\n    } catch (error) {\n      logError('Error getting current bearing:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Gets the current camera position\n   * @returns Current camera options or null\n   */\n  function getCurrentCamera(): CameraOptions | null {\n    const map = mapInstance.value;\n    if (!map) return null;\n\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch (error) {\n      logError('Error getting current camera:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Performs reset-north operation with enhanced error handling and validation\n   * @param options - Animation options\n   * @returns Promise that resolves when animation completes\n   */\n  function resetNorth(options?: AnimationOptions): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (!validateRotationOperation()) {\n        reject(new Error('Map instance not available'));\n        return;\n      }\n\n      const map = mapInstance.value!;\n      const finalOptions = options || animationOptions.value;\n      rotationStatus.value = RotationStatus.Rotating;\n\n      try {\n        // Store options for future use\n        if (options) animationOptions.value = options;\n\n        if (finalOptions) {\n          // Add event listeners for animation completion\n          const onRotateEnd = () => {\n            map.off('rotateend', onRotateEnd);\n            map.off('error', onError);\n            rotationStatus.value = RotationStatus.Completed;\n            resolve();\n          };\n\n          const onError = (error: any) => {\n            map.off('rotateend', onRotateEnd);\n            map.off('error', onError);\n            rotationStatus.value = RotationStatus.Error;\n            reject(error);\n          };\n\n          map.once('rotateend', onRotateEnd);\n          map.once('error', onError);\n\n          // Start the animation\n          map.resetNorth(finalOptions);\n        } else {\n          // Immediate reset without animation\n          map.resetNorth();\n          rotationStatus.value = RotationStatus.Completed;\n          resolve();\n        }\n      } catch (error) {\n        rotationStatus.value = RotationStatus.Error;\n        logError('Error performing reset-north operation:', error);\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Stops any ongoing rotation animation\n   */\n  function stopRotating(): void {\n    const map = mapInstance.value;\n    if (!map) return;\n\n    try {\n      map.stop();\n      rotationStatus.value = RotationStatus.Completed;\n    } catch (error) {\n      logError('Error stopping rotation animation:', error);\n    }\n  }\n\n  // Legacy function for backward compatibility\n  function legacyResetNorth(options?: AnimationOptions): void {\n    resetNorth(options).catch((error) => {\n      logError('Error in legacy resetNorth:', error);\n    });\n  }\n\n  // Watch for map and options changes\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (\n      map &&\n      props.autoReset !== false &&\n      rotationStatus.value === RotationStatus.NotStarted\n    ) {\n      resetNorth(animationOptions.value).catch((error) => {\n        logError('Error in watchEffect resetNorth:', error);\n      });\n    }\n  });\n\n  // Cleanup function\n  function cleanup(): void {\n    rotationStatus.value = RotationStatus.Completed;\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  // Return appropriate interface based on API version\n  if (isLegacyAPI) {\n    return { resetNorth: legacyResetNorth };\n  }\n\n  return {\n    resetNorth,\n    stopRotating,\n    getCurrentBearing,\n    getCurrentCamera,\n    rotationStatus: rotationStatus.value as Readonly<RotationStatus>,\n    isRotating: isRotating.value,\n  };\n}\n\n/**\n * Enhanced useResetNorthPitch with error handling and debugging\n */\nexport function useResetNorthPitch(\n  props: ResetNorthPitchProps,\n): ResetNorthPitchActions;\nexport function useResetNorthPitch(\n  map: MaybeRef<Nullable<Map>>,\n  options?: AnimationOptions,\n): { resetNorthPitch: (options?: AnimationOptions) => void };\nexport function useResetNorthPitch(\n  mapOrProps: MaybeRef<Nullable<Map>> | ResetNorthPitchProps,\n  legacyOptions?: AnimationOptions,\n):\n  | ResetNorthPitchActions\n  | { resetNorthPitch: (options?: AnimationOptions) => void } {\n  const isLegacyAPI =\n    legacyOptions !== undefined || !('map' in (mapOrProps as any));\n  const props: ResetNorthPitchProps = isLegacyAPI\n    ? {\n        map: mapOrProps as MaybeRef<Nullable<Map>>,\n        options: legacyOptions,\n        debug: false,\n        autoReset: true,\n      }\n    : (mapOrProps as ResetNorthPitchProps);\n\n  const { logError } = useLogger(props.debug ?? false);\n  const animationOptions = ref<Undefinedable<AnimationOptions>>(props.options);\n  const rotationStatus = ref<RotationStatus>(RotationStatus.NotStarted);\n  const mapInstance = computed(() => unref(props.map));\n  const isRotating = computed(\n    () => rotationStatus.value === RotationStatus.Rotating,\n  );\n\n  function getCurrentBearing(): number | null {\n    try {\n      return mapInstance.value?.getBearing() ?? null;\n    } catch {\n      logError('Error getting current bearing');\n      return null;\n    }\n  }\n\n  function getCurrentPitch(): number | null {\n    try {\n      return mapInstance.value?.getPitch() ?? null;\n    } catch {\n      logError('Error getting current pitch');\n      return null;\n    }\n  }\n\n  function getCurrentCamera(): CameraOptions | null {\n    const map = mapInstance.value;\n    if (!map) return null;\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch {\n      logError('Error getting current camera');\n      return null;\n    }\n  }\n\n  function resetNorthPitch(options?: AnimationOptions): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const map = mapInstance.value;\n      if (!map) {\n        reject(new Error('Map instance not available'));\n        return;\n      }\n\n      try {\n        rotationStatus.value = RotationStatus.Rotating;\n        const finalOptions = options || animationOptions.value;\n\n        if (finalOptions) {\n          const onComplete = () => {\n            rotationStatus.value = RotationStatus.Completed;\n            resolve();\n          };\n          map.once('moveend', onComplete);\n          map.resetNorthPitch(finalOptions);\n        } else {\n          map.resetNorthPitch();\n          rotationStatus.value = RotationStatus.Completed;\n          resolve();\n        }\n      } catch (error) {\n        rotationStatus.value = RotationStatus.Error;\n        logError('Error performing reset-north-pitch operation:', error);\n        reject(error);\n      }\n    });\n  }\n\n  function stopRotating(): void {\n    try {\n      mapInstance.value?.stop();\n      rotationStatus.value = RotationStatus.Completed;\n    } catch {\n      logError('Error stopping rotation animation');\n    }\n  }\n\n  onUnmounted(() => {\n    rotationStatus.value = RotationStatus.Completed;\n  });\n\n  if (isLegacyAPI) {\n    return {\n      resetNorthPitch: (options?: AnimationOptions) => {\n        resetNorthPitch(options).catch(() => {\n          logError('Error in legacy resetNorthPitch');\n        });\n      },\n    };\n  }\n\n  return {\n    resetNorthPitch,\n    stopRotating,\n    getCurrentBearing,\n    getCurrentPitch,\n    getCurrentCamera,\n    rotationStatus: rotationStatus.value as Readonly<RotationStatus>,\n    isRotating: isRotating.value,\n  };\n}\n\n/**\n * Enhanced useSnapToNorth with error handling and debugging\n */\nexport function useSnapToNorth(props: SnapToNorthProps): SnapToNorthActions;\nexport function useSnapToNorth(\n  map: MaybeRef<Nullable<Map>>,\n  options?: AnimationOptions,\n): { snapToNorth: (options?: AnimationOptions) => void };\nexport function useSnapToNorth(\n  mapOrProps: MaybeRef<Nullable<Map>> | SnapToNorthProps,\n  legacyOptions?: AnimationOptions,\n): SnapToNorthActions | { snapToNorth: (options?: AnimationOptions) => void } {\n  const isLegacyAPI =\n    legacyOptions !== undefined || !('map' in (mapOrProps as any));\n  const props: SnapToNorthProps = isLegacyAPI\n    ? {\n        map: mapOrProps as MaybeRef<Nullable<Map>>,\n        options: legacyOptions,\n        debug: false,\n        autoSnap: true,\n      }\n    : (mapOrProps as SnapToNorthProps);\n\n  const { logError } = useLogger(props.debug ?? false);\n  const animationOptions = ref<Undefinedable<AnimationOptions>>(props.options);\n  const rotationStatus = ref<RotationStatus>(RotationStatus.NotStarted);\n  const mapInstance = computed(() => unref(props.map));\n  const isRotating = computed(\n    () => rotationStatus.value === RotationStatus.Rotating,\n  );\n\n  function getCurrentBearing(): number | null {\n    try {\n      return mapInstance.value?.getBearing() ?? null;\n    } catch {\n      logError('Error getting current bearing');\n      return null;\n    }\n  }\n\n  function getCurrentCamera(): CameraOptions | null {\n    const map = mapInstance.value;\n    if (!map) return null;\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch {\n      logError('Error getting current camera');\n      return null;\n    }\n  }\n\n  function snapToNorth(options?: AnimationOptions): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const map = mapInstance.value;\n      if (!map) {\n        reject(new Error('Map instance not available'));\n        return;\n      }\n\n      try {\n        rotationStatus.value = RotationStatus.Rotating;\n        const finalOptions = options || animationOptions.value;\n\n        if (finalOptions) {\n          const onComplete = () => {\n            rotationStatus.value = RotationStatus.Completed;\n            resolve();\n          };\n          map.once('moveend', onComplete);\n          map.snapToNorth(finalOptions);\n        } else {\n          map.snapToNorth();\n          rotationStatus.value = RotationStatus.Completed;\n          resolve();\n        }\n      } catch (error) {\n        rotationStatus.value = RotationStatus.Error;\n        logError('Error performing snap-to-north operation:', error);\n        reject(error);\n      }\n    });\n  }\n\n  function stopRotating(): void {\n    try {\n      mapInstance.value?.stop();\n      rotationStatus.value = RotationStatus.Completed;\n    } catch {\n      logError('Error stopping rotation animation');\n    }\n  }\n\n  onUnmounted(() => {\n    rotationStatus.value = RotationStatus.Completed;\n  });\n\n  if (isLegacyAPI) {\n    return {\n      snapToNorth: (options?: AnimationOptions) => {\n        snapToNorth(options).catch(() => {\n          logError('Error in legacy snapToNorth');\n        });\n      },\n    };\n  }\n\n  return {\n    snapToNorth,\n    stopRotating,\n    getCurrentBearing,\n    getCurrentCamera,\n    rotationStatus: rotationStatus.value as Readonly<RotationStatus>,\n    isRotating: isRotating.value,\n  };\n}\n","import { watchEffect, ref, computed, unref, onUnmounted } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable, Undefinedable } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type { Map, AnimationOptions, CameraOptions } from 'maplibre-gl';\n\n/**\n * Zoom animation status enum for better state management\n */\nexport enum ZoomStatus {\n  NotStarted = 'not-started',\n  Zooming = 'zooming',\n  Completed = 'completed',\n  Error = 'error',\n}\n\ninterface ZoomToProps {\n  map: MaybeRef<Nullable<Map>>;\n  zoom?: number;\n  options?: AnimationOptions;\n  debug?: boolean;\n  autoZoom?: boolean;\n}\n\ninterface ZoomToActions {\n  zoomTo: (zoom: number, options?: AnimationOptions) => Promise<void>;\n  stopZooming: () => void;\n  getCurrentZoom: () => number | null;\n  getCurrentCamera: () => CameraOptions | null;\n  validateZoomLevel: (zoom: number) => boolean;\n  zoomStatus: Readonly<ZoomStatus>;\n  isZooming: boolean;\n}\n\ninterface ZoomInProps {\n  map: MaybeRef<Nullable<Map>>;\n  options?: AnimationOptions;\n  debug?: boolean;\n  autoZoom?: boolean;\n}\n\ninterface ZoomInActions {\n  zoomIn: (options?: AnimationOptions) => Promise<void>;\n  stopZooming: () => void;\n  getCurrentZoom: () => number | null;\n  getCurrentCamera: () => CameraOptions | null;\n  zoomStatus: Readonly<ZoomStatus>;\n  isZooming: boolean;\n}\n\ninterface ZoomOutProps {\n  map: MaybeRef<Nullable<Map>>;\n  options?: AnimationOptions;\n  debug?: boolean;\n  autoZoom?: boolean;\n}\n\ninterface ZoomOutActions {\n  zoomOut: (options?: AnimationOptions) => Promise<void>;\n  stopZooming: () => void;\n  getCurrentZoom: () => number | null;\n  getCurrentCamera: () => CameraOptions | null;\n  zoomStatus: Readonly<ZoomStatus>;\n  isZooming: boolean;\n}\n\n/**\n * Composable for managing map zoom-to operations with enhanced error handling\n * Provides reactive zoom-to functionality with validation and debugging capabilities\n *\n * @param props - Configuration options for zoom-to functionality\n * @returns Enhanced actions and state for zoom-to operations\n */\nexport function useZoomTo(props: ZoomToProps): ZoomToActions;\n\n/**\n * Legacy overload for backward compatibility\n * @deprecated Use the new props-based interface for better type safety and features\n */\nexport function useZoomTo(\n  map: MaybeRef<Nullable<Map>>,\n  options?: AnimationOptions & { zoom: number },\n): { zoomTo: (zoomVal: number, options?: AnimationOptions) => void };\n\nexport function useZoomTo(\n  mapOrProps: MaybeRef<Nullable<Map>> | ZoomToProps,\n  legacyOptions?: AnimationOptions & { zoom: number },\n):\n  | ZoomToActions\n  | { zoomTo: (zoomVal: number, options?: AnimationOptions) => void } {\n  // Handle legacy API for backward compatibility\n  const isLegacyAPI =\n    legacyOptions !== undefined || !('map' in (mapOrProps as any));\n  const props: ZoomToProps = isLegacyAPI\n    ? {\n        map: mapOrProps as MaybeRef<Nullable<Map>>,\n        zoom: legacyOptions?.zoom,\n        options: legacyOptions,\n        debug: false,\n        autoZoom: true,\n      }\n    : (mapOrProps as ZoomToProps);\n\n  const { logError } = useLogger(props.debug ?? false);\n  const zoom = ref<number | undefined>(props.zoom);\n  const animationOptions = ref<Undefinedable<AnimationOptions>>(props.options);\n  const zoomStatus = ref<ZoomStatus>(ZoomStatus.NotStarted);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isZooming = computed(() => zoomStatus.value === ZoomStatus.Zooming);\n\n  /**\n   * Validates if zoom operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateZoomOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) {\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Validates zoom level for correctness\n   * @param zoom - Zoom level to validate\n   * @returns boolean indicating if zoom level is valid\n   */\n  function validateZoomLevel(zoom: number): boolean {\n    if (typeof zoom !== 'number' || isNaN(zoom)) {\n      return false;\n    }\n\n    if (zoom < 0 || zoom > 24) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Gets the current zoom level\n   * @returns Current zoom level or null\n   */\n  function getCurrentZoom(): number | null {\n    const map = mapInstance.value;\n    if (!map) {\n      return null;\n    }\n\n    try {\n      return map.getZoom();\n    } catch (error) {\n      logError('Error getting current zoom:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Gets the current camera position\n   * @returns Current camera options or null\n   */\n  function getCurrentCamera(): CameraOptions | null {\n    const map = mapInstance.value;\n    if (!map) {\n      return null;\n    }\n\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch (error) {\n      logError('Error getting current camera:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Performs zoom-to operation with enhanced error handling and validation\n   * @param zoomVal - Target zoom level\n   * @param options - Animation options\n   * @returns Promise that resolves when animation completes\n   */\n  function zoomTo(zoomVal: number, options?: AnimationOptions): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (!validateZoomOperation()) {\n        reject(new Error('Map instance not available'));\n        return;\n      }\n\n      if (!validateZoomLevel(zoomVal)) {\n        zoomStatus.value = ZoomStatus.Error;\n        reject(new Error('Invalid zoom level'));\n        return;\n      }\n\n      const map = mapInstance.value!;\n      const finalOptions = options || animationOptions.value;\n      zoomStatus.value = ZoomStatus.Zooming;\n\n      try {\n        // Store values for future use\n        zoom.value = zoomVal;\n        if (options) animationOptions.value = options;\n\n        if (finalOptions) {\n          // Add event listeners for animation completion\n          const onZoomEnd = () => {\n            map.off('zoomend', onZoomEnd);\n            map.off('error', onError);\n            zoomStatus.value = ZoomStatus.Completed;\n            resolve();\n          };\n\n          const onError = (error: any) => {\n            map.off('zoomend', onZoomEnd);\n            map.off('error', onError);\n            zoomStatus.value = ZoomStatus.Error;\n            reject(error);\n          };\n\n          map.once('zoomend', onZoomEnd);\n          map.once('error', onError);\n\n          // Start the animation\n          map.zoomTo(zoomVal, finalOptions);\n        } else {\n          // Immediate zoom without animation\n          map.zoomTo(zoomVal);\n          zoomStatus.value = ZoomStatus.Completed;\n          resolve();\n        }\n      } catch (error) {\n        zoomStatus.value = ZoomStatus.Error;\n        logError('Error performing zoom-to operation:', error);\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Stops any ongoing zoom animation\n   */\n  function stopZooming(): void {\n    const map = mapInstance.value;\n    if (!map) {\n      return;\n    }\n\n    try {\n      map.stop();\n      zoomStatus.value = ZoomStatus.Completed;\n    } catch (error) {\n      logError('Error stopping zoom animation:', error);\n    }\n  }\n\n  // Legacy function for backward compatibility\n  function legacyZoomTo(zoomVal: number, options?: AnimationOptions): void {\n    zoomTo(zoomVal, options).catch((error) => {\n      logError('Error in legacy zoomTo:', error);\n    });\n  }\n\n  // Watch for map and options changes\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (\n      map &&\n      zoom.value !== undefined &&\n      props.autoZoom !== false &&\n      zoomStatus.value === ZoomStatus.NotStarted\n    ) {\n      zoomTo(zoom.value, animationOptions.value).catch((error) => {\n        logError('Error in watchEffect zoomTo:', error);\n      });\n    }\n  });\n\n  // Cleanup function\n  function cleanup(): void {\n    zoomStatus.value = ZoomStatus.Completed;\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  // Return appropriate interface based on API version\n  if (isLegacyAPI) {\n    return { zoomTo: legacyZoomTo };\n  }\n\n  return {\n    zoomTo,\n    stopZooming,\n    getCurrentZoom,\n    getCurrentCamera,\n    validateZoomLevel,\n    zoomStatus: zoomStatus.value as Readonly<ZoomStatus>,\n    isZooming: isZooming.value,\n  };\n}\n\n/**\n * Composable for managing map zoom-in operations with enhanced error handling\n * Provides reactive zoom-in functionality with validation and debugging capabilities\n *\n * @param props - Configuration options for zoom-in functionality\n * @returns Enhanced actions and state for zoom-in operations\n */\nexport function useZoomIn(props: ZoomInProps): ZoomInActions;\n\n/**\n * Legacy overload for backward compatibility\n * @deprecated Use the new props-based interface for better type safety and features\n */\nexport function useZoomIn(\n  map: MaybeRef<Nullable<Map>>,\n  options?: AnimationOptions,\n): { zoomIn: (options?: AnimationOptions) => void };\n\nexport function useZoomIn(\n  mapOrProps: MaybeRef<Nullable<Map>> | ZoomInProps,\n  legacyOptions?: AnimationOptions,\n): ZoomInActions | { zoomIn: (options?: AnimationOptions) => void } {\n  // Handle legacy API for backward compatibility\n  const isLegacyAPI =\n    legacyOptions !== undefined || !('map' in (mapOrProps as any));\n  const props: ZoomInProps = isLegacyAPI\n    ? {\n        map: mapOrProps as MaybeRef<Nullable<Map>>,\n        options: legacyOptions,\n        debug: false,\n        autoZoom: true,\n      }\n    : (mapOrProps as ZoomInProps);\n\n  const { logError } = useLogger(props.debug ?? false);\n  const animationOptions = ref<Undefinedable<AnimationOptions>>(props.options);\n  const zoomStatus = ref<ZoomStatus>(ZoomStatus.NotStarted);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isZooming = computed(() => zoomStatus.value === ZoomStatus.Zooming);\n\n  /**\n   * Validates if zoom operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateZoomOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) {\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Gets the current zoom level\n   * @returns Current zoom level or null\n   */\n  function getCurrentZoom(): number | null {\n    const map = mapInstance.value;\n    if (!map) {\n      return null;\n    }\n\n    try {\n      return map.getZoom();\n    } catch (error) {\n      logError('Error getting current zoom:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Gets the current camera position\n   * @returns Current camera options or null\n   */\n  function getCurrentCamera(): CameraOptions | null {\n    const map = mapInstance.value;\n    if (!map) {\n      return null;\n    }\n\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch (error) {\n      logError('Error getting current camera:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Performs zoom-in operation with enhanced error handling and validation\n   * @param options - Animation options\n   * @returns Promise that resolves when animation completes\n   */\n  function zoomIn(options?: AnimationOptions): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (!validateZoomOperation()) {\n        reject(new Error('Map instance not available'));\n        return;\n      }\n\n      const map = mapInstance.value!;\n      const finalOptions = options || animationOptions.value;\n      zoomStatus.value = ZoomStatus.Zooming;\n\n      try {\n        // Store options for future use\n        if (options) animationOptions.value = options;\n\n        if (finalOptions) {\n          // Add event listeners for animation completion\n          const onZoomEnd = () => {\n            map.off('zoomend', onZoomEnd);\n            map.off('error', onError);\n            zoomStatus.value = ZoomStatus.Completed;\n            resolve();\n          };\n\n          const onError = (error: any) => {\n            map.off('zoomend', onZoomEnd);\n            map.off('error', onError);\n            zoomStatus.value = ZoomStatus.Error;\n            reject(error);\n          };\n\n          map.once('zoomend', onZoomEnd);\n          map.once('error', onError);\n\n          // Start the animation\n          map.zoomIn(finalOptions);\n        } else {\n          // Immediate zoom without animation\n          map.zoomIn();\n          zoomStatus.value = ZoomStatus.Completed;\n          resolve();\n        }\n      } catch (error) {\n        zoomStatus.value = ZoomStatus.Error;\n        logError('Error performing zoom-in operation:', error);\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Stops any ongoing zoom animation\n   */\n  function stopZooming(): void {\n    const map = mapInstance.value;\n    if (!map) {\n      return;\n    }\n\n    try {\n      map.stop();\n      zoomStatus.value = ZoomStatus.Completed;\n    } catch (error) {\n      logError('Error stopping zoom animation:', error);\n    }\n  }\n\n  // Legacy function for backward compatibility\n  function legacyZoomIn(options?: AnimationOptions): void {\n    zoomIn(options).catch((error) => {\n      logError('Error in legacy zoomIn:', error);\n    });\n  }\n\n  // Watch for map and options changes\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (\n      map &&\n      props.autoZoom !== false &&\n      zoomStatus.value === ZoomStatus.NotStarted\n    ) {\n      zoomIn(animationOptions.value).catch((error) => {\n        logError('Error in watchEffect zoomIn:', error);\n      });\n    }\n  });\n\n  // Cleanup function\n  function cleanup(): void {\n    zoomStatus.value = ZoomStatus.Completed;\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  // Return appropriate interface based on API version\n  if (isLegacyAPI) {\n    return { zoomIn: legacyZoomIn };\n  }\n\n  return {\n    zoomIn,\n    stopZooming,\n    getCurrentZoom,\n    getCurrentCamera,\n    zoomStatus: zoomStatus.value as Readonly<ZoomStatus>,\n    isZooming: isZooming.value,\n  };\n}\n\n/**\n * Composable for managing map zoom-out operations with enhanced error handling\n * Provides reactive zoom-out functionality with validation and debugging capabilities\n *\n * @param props - Configuration options for zoom-out functionality\n * @returns Enhanced actions and state for zoom-out operations\n */\nexport function useZoomOut(props: ZoomOutProps): ZoomOutActions;\n\n/**\n * Legacy overload for backward compatibility\n * @deprecated Use the new props-based interface for better type safety and features\n */\nexport function useZoomOut(\n  map: MaybeRef<Nullable<Map>>,\n  options?: AnimationOptions,\n): { zoomOut: (options?: AnimationOptions) => void };\n\nexport function useZoomOut(\n  mapOrProps: MaybeRef<Nullable<Map>> | ZoomOutProps,\n  legacyOptions?: AnimationOptions,\n): ZoomOutActions | { zoomOut: (options?: AnimationOptions) => void } {\n  // Handle legacy API for backward compatibility\n  const isLegacyAPI =\n    legacyOptions !== undefined || !('map' in (mapOrProps as any));\n  const props: ZoomOutProps = isLegacyAPI\n    ? {\n        map: mapOrProps as MaybeRef<Nullable<Map>>,\n        options: legacyOptions,\n        debug: false,\n        autoZoom: true,\n      }\n    : (mapOrProps as ZoomOutProps);\n\n  const { logError } = useLogger(props.debug ?? false);\n  const animationOptions = ref<Undefinedable<AnimationOptions>>(props.options);\n  const zoomStatus = ref<ZoomStatus>(ZoomStatus.NotStarted);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isZooming = computed(() => zoomStatus.value === ZoomStatus.Zooming);\n\n  /**\n   * Validates if zoom operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateZoomOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) {\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Gets the current zoom level\n   * @returns Current zoom level or null\n   */\n  function getCurrentZoom(): number | null {\n    const map = mapInstance.value;\n    if (!map) {\n      return null;\n    }\n\n    try {\n      return map.getZoom();\n    } catch (error) {\n      logError('Error getting current zoom:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Gets the current camera position\n   * @returns Current camera options or null\n   */\n  function getCurrentCamera(): CameraOptions | null {\n    const map = mapInstance.value;\n    if (!map) {\n      return null;\n    }\n\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch (error) {\n      logError('Error getting current camera:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Performs zoom-out operation with enhanced error handling and validation\n   * @param options - Animation options\n   * @returns Promise that resolves when animation completes\n   */\n  function zoomOut(options?: AnimationOptions): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (!validateZoomOperation()) {\n        reject(new Error('Map instance not available'));\n        return;\n      }\n\n      const map = mapInstance.value!;\n      const finalOptions = options || animationOptions.value;\n      zoomStatus.value = ZoomStatus.Zooming;\n\n      try {\n        // Store options for future use\n        if (options) animationOptions.value = options;\n\n        if (finalOptions) {\n          // Add event listeners for animation completion\n          const onZoomEnd = () => {\n            map.off('zoomend', onZoomEnd);\n            map.off('error', onError);\n            zoomStatus.value = ZoomStatus.Completed;\n            resolve();\n          };\n\n          const onError = (error: any) => {\n            map.off('zoomend', onZoomEnd);\n            map.off('error', onError);\n            zoomStatus.value = ZoomStatus.Error;\n            reject(error);\n          };\n\n          map.once('zoomend', onZoomEnd);\n          map.once('error', onError);\n\n          // Start the animation\n          map.zoomOut(finalOptions);\n        } else {\n          // Immediate zoom without animation\n          map.zoomOut();\n          zoomStatus.value = ZoomStatus.Completed;\n          resolve();\n        }\n      } catch (error) {\n        zoomStatus.value = ZoomStatus.Error;\n        logError('Error performing zoom-out operation:', error);\n        reject(error);\n      }\n    });\n  }\n\n  /**\n   * Stops any ongoing zoom animation\n   */\n  function stopZooming(): void {\n    const map = mapInstance.value;\n    if (!map) {\n      return;\n    }\n\n    try {\n      map.stop();\n      zoomStatus.value = ZoomStatus.Completed;\n    } catch (error) {\n      logError('Error stopping zoom animation:', error);\n    }\n  }\n\n  // Legacy function for backward compatibility\n  function legacyZoomOut(options?: AnimationOptions): void {\n    zoomOut(options).catch((error) => {\n      logError('Error in legacy zoomOut:', error);\n    });\n  }\n\n  // Watch for map and options changes\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (\n      map &&\n      props.autoZoom !== false &&\n      zoomStatus.value === ZoomStatus.NotStarted\n    ) {\n      zoomOut(animationOptions.value).catch((error) => {\n        logError('Error in watchEffect zoomOut:', error);\n      });\n    }\n  });\n\n  // Cleanup function\n  function cleanup(): void {\n    zoomStatus.value = ZoomStatus.Completed;\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  // Return appropriate interface based on API version\n  if (isLegacyAPI) {\n    return { zoomOut: legacyZoomOut };\n  }\n\n  return {\n    zoomOut,\n    stopZooming,\n    getCurrentZoom,\n    getCurrentCamera,\n    zoomStatus: zoomStatus.value as Readonly<ZoomStatus>,\n    isZooming: isZooming.value,\n  };\n}\n","import type { ComputedRef, InjectionKey, ShallowRef } from 'vue';\nimport type { GeoJSONSource, Map, SourceSpecification } from 'maplibre-gl';\nimport type { Nullable } from '@libs/types';\n\nexport const MapProvideKey = Symbol() as InjectionKey<\n  ShallowRef<Nullable<Map>> | ComputedRef<Nullable<Map>>\n>;\n\nexport const SourceProvideKey = Symbol() as InjectionKey<\n  | ShallowRef<Nullable<SourceSpecification | GeoJSONSource>>\n  | ComputedRef<Nullable<SourceSpecification | GeoJSONSource>>\n>;\n","import type { GeolocateEventTypes, MapEventTypes } from '@libs/types';\n\nexport enum MapCreationStatus {\n  NotInitialized = 'not-initialized',\n  Initializing = 'initializing',\n  Loading = 'loading',\n  Loaded = 'loaded',\n  Error = 'error',\n  Destroyed = 'destroyed',\n}\n\nexport const MapboxEvents: (keyof MapEventTypes)[] = [\n  'error',\n  'load',\n  'idle',\n  'remove',\n  'render',\n  'resize',\n  'webglcontextlost',\n  'webglcontextrestored',\n  'dataloading',\n  'data',\n  'tiledataloading',\n  'sourcedataloading',\n  'sourcedata',\n  'styledata',\n  'styleimagemissing',\n  'dataabort',\n  'sourcedataabort',\n  'boxzoomcancel',\n  'boxzoomstart',\n  'boxzoomend',\n  'touchcancel',\n  'touchmove',\n  'touchend',\n  'touchstart',\n  'click',\n  'contextmenu',\n  'dblclick',\n  'mousemove',\n  'mouseup',\n  'mousedown',\n  'mouseout',\n  'mouseover',\n  'movestart',\n  'move',\n  'moveend',\n  'zoomstart',\n  'zoom',\n  'zoomend',\n  'rotatestart',\n  'rotate',\n  'rotateend',\n  'dragstart',\n  'drag',\n  'dragend',\n  'pitchstart',\n  'pitch',\n  'pitchend',\n  'wheel',\n  'terrain',\n];\n\nexport const GeolocateEvents: (keyof GeolocateEventTypes)[] = [\n  'geolocate',\n  'error',\n  'outofmaxbounds',\n  'trackuserlocationstart',\n  'trackuserlocationend',\n];\n","import type { MapLayerEventType } from 'maplibre-gl';\n\nexport const MapboxLayerEvents: (keyof MapLayerEventType)[] = [\n  'click',\n  'dblclick',\n  'mousedown',\n  'mouseup',\n  'mousemove',\n  'mouseenter',\n  'mouseleave',\n  'mouseover',\n  'mouseout',\n  'contextmenu',\n  'touchstart',\n  'touchend',\n  'touchcancel',\n];\n","import {\n  ref,\n  shallowRef,\n  computed,\n  watchEffect,\n  unref,\n  onUnmounted,\n} from 'vue';\nimport { useLogger } from '@libs/composables';\nimport { MapCreationStatus } from '@libs/enums';\nimport { type CreateMaplibreActions } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport { Map } from 'maplibre-gl';\nimport type {\n  MapOptions,\n  LngLatBoundsLike,\n  LngLatLike,\n  StyleSpecification,\n  CameraOptions,\n  StyleSwapOptions,\n  StyleOptions,\n} from 'maplibre-gl';\n\ninterface CreateMapboxProps extends MapOptions {\n  register?: (actions: SimplifiedCreateMaplibreActions) => void;\n  debug?: boolean;\n  onLoad?: (map: Map) => void;\n  onError?: (error: any) => void;\n}\n\ninterface SimplifiedCreateMaplibreActions extends CreateMaplibreActions {\n  // Essential camera controls\n  getCurrentCamera: () => CameraOptions | null;\n\n  // Essential status and state\n  mapCreationStatus: Readonly<MapCreationStatus>;\n  isMapReady: boolean;\n  isMapLoading: boolean;\n  hasMapError: boolean;\n\n  // Essential style management\n  getCurrentStyle: () => StyleSpecification | string | null;\n}\n\n/**\n * Composable for creating and managing MapLibre GL Maps with enhanced error handling\n * Provides reactive map management with validation, debugging, and comprehensive state management\n *\n * @param elRef - Reference to the HTML element container\n * @param styleRef - Reference to the map style\n * @param props - Configuration options for the map\n * @returns Enhanced actions and state for map management\n */\nexport function useCreateMapbox(\n  elRef: MaybeRef<HTMLElement | undefined>,\n  styleRef: MaybeRef<StyleSpecification | string>,\n  props: Omit<CreateMapboxProps, 'container' | 'style'> = {},\n) {\n  const { register, onLoad, onError, ...options } = props;\n  const { log, logError, logWarn } = useLogger(props.debug ?? false);\n\n  // Enhanced state management\n  const mapInstance = shallowRef<Map | null>(null);\n  const mapCreationStatus = ref<MapCreationStatus>(\n    MapCreationStatus.NotInitialized,\n  );\n  const mapOptions = ref<Omit<MapOptions, 'container' | 'style'>>(options);\n  const retryCount = ref<number>(0);\n  const currentStyle = ref<StyleSpecification | string | null>(null);\n\n  // Computed properties for better reactivity and performance\n  const mapInstanceComputed = computed(() => mapInstance.value);\n  const mapCreationStatusComputed = computed(() => mapCreationStatus.value);\n  const isMapReady = computed(\n    () => mapCreationStatus.value === MapCreationStatus.Loaded,\n  );\n  const isMapLoading = computed(\n    () => mapCreationStatus.value === MapCreationStatus.Loading,\n  );\n  const hasMapError = computed(\n    () => mapCreationStatus.value === MapCreationStatus.Error,\n  );\n\n  /**\n   * Validates if map operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateMapOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) return false;\n    return true;\n  }\n\n  /**\n   * Gets the current camera state\n   * @returns Current camera options or null if not available\n   */\n  function getCurrentCamera(): CameraOptions | null {\n    if (!validateMapOperation()) return null;\n\n    const map = mapInstance.value!;\n    try {\n      return {\n        center: map.getCenter(),\n        zoom: map.getZoom(),\n        bearing: map.getBearing(),\n        pitch: map.getPitch(),\n      };\n    } catch (error) {\n      logError('Error getting current camera state:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Gets the current map style\n   * @returns Current style or null if not available\n   */\n  function getCurrentStyle(): StyleSpecification | string | null {\n    if (!validateMapOperation()) return null;\n\n    try {\n      return mapInstance.value!.getStyle() as StyleSpecification;\n    } catch (error) {\n      logError('Error getting current style:', error);\n      return currentStyle.value as StyleSpecification | string | null;\n    }\n  }\n\n  /**\n   * Enhanced map initialization with comprehensive error handling\n   */\n  function initMap(): void {\n    const el = unref(elRef);\n    const style = unref(styleRef);\n\n    if (!el) {\n      mapCreationStatus.value = MapCreationStatus.Error;\n      return;\n    }\n\n    if (!style) {\n      mapCreationStatus.value = MapCreationStatus.Error;\n      return;\n    }\n\n    mapCreationStatus.value = MapCreationStatus.Initializing;\n\n    try {\n      const mapOpts = unref(mapOptions);\n\n      mapInstance.value = new Map({\n        ...mapOpts,\n        style,\n        container: el,\n      });\n\n      // Use explicit type assertion to avoid deep type instantiation\n      currentStyle.value = style as any;\n      mapCreationStatus.value = MapCreationStatus.Loading;\n\n      // Attach event listeners\n      mapInstance.value.on('load', mapEventLoad);\n      mapInstance.value.on('error', mapEventError);\n      mapInstance.value.on('styledata', mapEventStyleData);\n    } catch (error) {\n      mapCreationStatus.value = MapCreationStatus.Error;\n      logError('Error creating map instance:', error);\n\n      if (onError) {\n        onError(error);\n      }\n    }\n  }\n\n  /**\n   * Enhanced map removal with comprehensive cleanup\n   */\n  function removeMap(): void {\n    const map = mapInstance.value;\n    if (!map) return;\n\n    try {\n      // Remove all event listeners\n      map.off('load', mapEventLoad);\n      map.off('error', mapEventError);\n      map.off('styledata', mapEventStyleData);\n\n      // Remove the map\n      map.remove();\n    } catch (error) {\n      logError('Error removing map instance:', error);\n    } finally {\n      mapInstance.value = null;\n      mapCreationStatus.value = MapCreationStatus.Destroyed;\n      currentStyle.value = null;\n    }\n  }\n\n  /**\n   * Enhanced map load event handler\n   */\n  function mapEventLoad(): void {\n    mapCreationStatus.value = MapCreationStatus.Loaded;\n    retryCount.value = 0; // Reset retry count on successful load\n\n    if (onLoad && mapInstance.value) {\n      onLoad(mapInstance.value);\n    }\n  }\n\n  /**\n   * Enhanced map error event handler\n   */\n  function mapEventError(e: any): void {\n    mapCreationStatus.value = MapCreationStatus.Error;\n\n    if (onError) {\n      onError(e);\n    }\n  }\n\n  /**\n   * Map style data event handler\n   */\n  function mapEventStyleData(e: any): void {\n    log('Map style data updated', e);\n  }\n\n  /**\n   * Enhanced center setter with validation and error handling\n   * @param centerVal - Center coordinates to set\n   */\n  function setCenter(centerVal: LngLatLike): void {\n    if (!validateMapOperation()) return;\n\n    try {\n      mapInstance.value!.setCenter(centerVal);\n      mapOptions.value.center = centerVal;\n    } catch (error) {\n      logError('Error setting map center:', error, { center: centerVal });\n    }\n  }\n\n  /**\n   * Enhanced bearing setter with validation and error handling\n   * @param bearing - Bearing value in degrees (default: 0)\n   */\n  function setBearing(bearing = 0): void {\n    if (!validateMapOperation()) return;\n\n    // Validate bearing range\n    if (bearing < -180 || bearing > 180) {\n      logWarn('Warning: Bearing should be between -180 and 180 degrees', {\n        bearing,\n      });\n    }\n\n    try {\n      mapInstance.value!.setBearing(bearing);\n      mapOptions.value.bearing = bearing;\n    } catch (error) {\n      logError('Error setting map bearing:', error, { bearing });\n    }\n  }\n\n  /**\n   * Enhanced zoom setter with validation and error handling\n   * @param zoom - Zoom level to set\n   */\n  function setZoom(zoom: number): void {\n    if (!validateMapOperation()) return;\n\n    // Validate zoom range\n    if (zoom < 0 || zoom > 24) {\n      logWarn('Warning: Zoom level should be between 0 and 24', { zoom });\n    }\n\n    try {\n      mapInstance.value!.setZoom(zoom);\n      mapOptions.value.zoom = zoom;\n    } catch (error) {\n      logError('Error setting map zoom:', error, { zoom });\n    }\n  }\n\n  /**\n   * Enhanced pitch setter with validation and error handling\n   * @param pitch - Pitch value in degrees\n   */\n  function setPitch(pitch: number): void {\n    if (!validateMapOperation()) return;\n\n    // Validate pitch range\n    if (pitch < 0 || pitch > 60) {\n      logWarn('Warning: Pitch should be between 0 and 60 degrees', { pitch });\n    }\n\n    try {\n      mapInstance.value!.setPitch(pitch);\n      mapOptions.value.pitch = pitch;\n    } catch (error) {\n      logError('Error setting map pitch:', error, { pitch });\n    }\n  }\n\n  /**\n   * Enhanced style setter with validation and error handling\n   * @param style - Style to set\n   * @param options - Style options\n   */\n  function setStyle(\n    style: string | StyleSpecification,\n    options?: StyleSwapOptions & StyleOptions,\n  ): void {\n    if (!validateMapOperation()) return;\n\n    try {\n      mapInstance.value!.setStyle(style, options);\n      // Use explicit type assertion to avoid deep type instantiation\n      currentStyle.value = style as any;\n    } catch (error) {\n      logError('Error setting map style:', error, { style });\n    }\n  }\n\n  /**\n   * Enhanced max bounds setter with validation and error handling\n   * @param bounds - Maximum bounds to set\n   */\n  function setMaxBounds(bounds?: LngLatBoundsLike): void {\n    if (!validateMapOperation()) return;\n\n    try {\n      mapInstance.value!.setMaxBounds(bounds);\n      mapOptions.value.maxBounds = bounds;\n    } catch (error) {\n      logError('Error setting map max bounds:', error, { bounds });\n    }\n  }\n\n  /**\n   * Enhanced max pitch setter with validation and error handling\n   * @param pitch - Maximum pitch value (default: 60)\n   */\n  function setMaxPitch(pitch = 60): void {\n    if (!validateMapOperation()) return;\n\n    if (pitch < 0 || pitch > 60) {\n      logWarn('Warning: Max pitch should be between 0 and 60 degrees', {\n        pitch,\n      });\n    }\n\n    try {\n      mapInstance.value!.setMaxPitch(pitch);\n      mapOptions.value.maxPitch = pitch;\n    } catch (error) {\n      logError('Error setting map max pitch:', error, { pitch });\n    }\n  }\n\n  /**\n   * Enhanced max zoom setter with validation and error handling\n   * @param zoom - Maximum zoom level (default: 24)\n   */\n  function setMaxZoom(zoom = 24): void {\n    if (!validateMapOperation()) return;\n\n    if (zoom < 0 || zoom > 24) {\n      logWarn('Warning: Max zoom should be between 0 and 24', { zoom });\n    }\n\n    try {\n      mapInstance.value!.setMaxZoom(zoom);\n      mapOptions.value.maxZoom = zoom;\n    } catch (error) {\n      logError('Error setting map max zoom:', error, { zoom });\n    }\n  }\n\n  /**\n   * Enhanced min pitch setter with validation and error handling\n   * @param pitch - Minimum pitch value (default: 0)\n   */\n  function setMinPitch(pitch = 0): void {\n    if (!validateMapOperation()) return;\n\n    if (pitch < 0 || pitch > 60) {\n      logWarn('Warning: Min pitch should be between 0 and 60 degrees', {\n        pitch,\n      });\n    }\n\n    try {\n      mapInstance.value!.setMinPitch(pitch);\n      mapOptions.value.minPitch = pitch;\n    } catch (error) {\n      logError('Error setting map min pitch:', error, { pitch });\n    }\n  }\n\n  /**\n   * Enhanced min zoom setter with validation and error handling\n   * @param zoom - Minimum zoom level (default: 0)\n   */\n  function setMinZoom(zoom = 0): void {\n    if (!validateMapOperation()) return;\n\n    if (zoom < 0 || zoom > 24) {\n      logWarn('Warning: Min zoom should be between 0 and 24', { zoom });\n    }\n\n    try {\n      mapInstance.value!.setMinZoom(zoom);\n      mapOptions.value.minZoom = zoom;\n    } catch (error) {\n      logError('Error setting map min zoom:', error, { zoom });\n    }\n  }\n\n  /**\n   * Enhanced render world copies setter with validation and error handling\n   * @param renderWorldCopies - Whether to render world copies (default: true)\n   */\n  function setRenderWorldCopies(renderWorldCopies = true): void {\n    if (!validateMapOperation()) return;\n\n    try {\n      mapInstance.value!.setRenderWorldCopies(renderWorldCopies);\n      mapOptions.value.renderWorldCopies = renderWorldCopies;\n    } catch (error) {\n      logError('Error setting map render world copies:', error, {\n        renderWorldCopies,\n      });\n    }\n  }\n\n  /**\n   * Destroys the map permanently\n   */\n  function destroyMap(): void {\n    removeMap();\n    mapCreationStatus.value = MapCreationStatus.Destroyed;\n  }\n\n  /**\n   * Checks if map should be initialized based on options\n   */\n  function checkInitMap(): void {\n    const opts = unref(mapOptions);\n    if (!opts.center && !opts.bounds) {\n      log('Map initialization skipped: no center or bounds provided');\n      return;\n    }\n    initMap();\n  }\n\n  // Watch effect for automatic map initialization\n  const stopWatchEffect = watchEffect(() => {\n    removeMap();\n    if (!unref(mapInstance) && unref(elRef)) {\n      initMap();\n      stopWatchEffect();\n    }\n  });\n\n  // Cleanup on unmount\n  onUnmounted(() => {\n    destroyMap();\n  });\n\n  const methods: SimplifiedCreateMaplibreActions = {\n    // Original CreateMaplibreActions\n    mapInstance: mapInstanceComputed,\n    setRenderWorldCopies,\n    setMinZoom,\n    setMinPitch,\n    setMaxZoom,\n    setMaxPitch,\n    setMaxBounds,\n    setStyle,\n    setPitch,\n    setZoom,\n    setBearing,\n    setCenter,\n\n    // Simplified essential actions\n    getCurrentCamera,\n    mapCreationStatus: mapCreationStatusComputed.value,\n    isMapReady: isMapReady.value,\n    isMapLoading: isMapLoading.value,\n    hasMapError: hasMapError.value,\n    getCurrentStyle,\n  };\n\n  // Register the simplified methods\n  register?.(methods);\n\n  return {\n    initMap,\n    removeMap,\n    checkInitMap,\n    destroyMap,\n    ...methods,\n  };\n}\n","import { getVersion } from 'maplibre-gl';\nimport { nanoid } from 'nanoid';\nimport type { LngLatLike, Map } from 'maplibre-gl';\n\nexport function getNanoid(id?: string) {\n  if (id) return id;\n  return nanoid();\n}\n\nexport function getMainVersion(): number {\n  return parseInt(getVersion().split('.')[0], 10);\n}\n\nexport function hasSource(map: Map, sourceId: string): boolean {\n  return !!map.style && !!map.getSource(sourceId);\n}\n\nexport function hasLayer(map: Map, sourceId: string): boolean {\n  return !!map.style && !!map.getLayer(sourceId);\n}\n\nexport function lngLatLikeHasValue(lngLatLike?: LngLatLike): boolean {\n  if (lngLatLike) {\n    if (Array.isArray(lngLatLike)) {\n      return (\n        lngLatLike.length >= 2 &&\n        lngLatLike[0] !== undefined &&\n        lngLatLike[1] !== undefined\n      );\n    }\n\n    if (typeof lngLatLike === 'object') {\n      if ('lat' in lngLatLike && ('lng' in lngLatLike || 'lon' in lngLatLike)) {\n        const { lat } = lngLatLike;\n        const lng = 'lng' in lngLatLike ? lngLatLike.lng : undefined;\n        const lon = 'lon' in lngLatLike ? lngLatLike.lon : undefined;\n        return (lng !== undefined || lon !== undefined) && lat !== undefined;\n      }\n    }\n  }\n\n  return false;\n}\n\nexport function filterStylePropertiesByKeys<T extends Record<string, any>>(\n  style: Record<string, any>,\n  keys: (keyof T)[],\n): T {\n  return Object.fromEntries(\n    Object.entries(style).filter(([key]) => keys.includes(key as keyof T)),\n  ) as T;\n}\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n  let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n  let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n  return (size = defaultSize) => {\n    let id = ''\n    while (true) {\n      let bytes = getRandom(step)\n      let j = step | 0\n      while (j--) {\n        id += alphabet[bytes[j] & mask] || ''\n        if (id.length >= size) return id\n      }\n    }\n  }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n  customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n  let id = ''\n  let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n  while (size--) {\n    id += scopedUrlAlphabet[bytes[size] & 63]\n  }\n  return id\n}\n","export const urlAlphabet =\n  'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","import {\n  ref,\n  shallowRef,\n  computed,\n  effectScope,\n  unref,\n  watch,\n  onUnmounted,\n} from 'vue';\nimport { hasLayer } from '@libs/helpers';\nimport { useLogger } from '@libs/composables';\nimport type {\n  AnyLayout,\n  AnyPaint,\n  CreateLayerActions,\n  Nullable,\n} from '@libs/types';\nimport type { FilterSpecification, Map, StyleSetterOptions } from 'maplibre-gl';\nimport type { EffectScope, ComputedRef } from 'vue';\nimport type { LayerSpecification } from 'maplibre-gl';\n\n/**\n * Layer management status enum for better state management\n */\nexport enum LayerManagementStatus {\n  NotRegistered = 'not-registered',\n  Registering = 'registering',\n  Registered = 'registered',\n  Error = 'error',\n  Disposed = 'disposed',\n}\n\ninterface LayerManagementProps {\n  debug?: boolean;\n  autoCleanup?: boolean;\n}\n\ninterface LayerManagementActions {\n  register: (instance: CreateLayerActions<any>, map: Map) => void;\n  layerId: ComputedRef<string | undefined>;\n  layer: ComputedRef<Nullable<LayerSpecification>>;\n  layerStatus: ComputedRef<LayerManagementStatus>;\n  isLayerRegistered: ComputedRef<boolean>;\n  isLayerReady: ComputedRef<boolean>;\n  getFilter: () => void | FilterSpecification;\n  getLayoutProperty: (name: keyof AnyLayout) => any;\n  getPaintProperty: (name: keyof AnyPaint) => any;\n  setBeforeId: (beforeId?: string) => void;\n  setFilter: (filter?: FilterSpecification) => void;\n  setPaintProperty: (\n    name: string,\n    value: any,\n    options?: StyleSetterOptions,\n  ) => void;\n  setLayoutProperty: (\n    name: string,\n    value: any,\n    options?: StyleSetterOptions,\n  ) => void;\n  setZoomRange: (minzoom?: number, maxzoom?: number) => void;\n  removeLayer: () => void;\n  setStyle: (styleVal: AnyLayout & AnyPaint) => void;\n  dispose: () => void;\n  refresh: () => void;\n}\n\n/**\n * Composable for managing MapLibre GL Layer instances\n * Provides reactive layer management with error handling, performance optimizations, and enhanced API\n *\n * @param props - Configuration options for layer management\n * @returns Enhanced actions and state for layer management\n */\nexport function useLayer<T extends LayerSpecification>(\n  props: LayerManagementProps = {},\n): LayerManagementActions {\n  const { debug = false, autoCleanup = true } = props;\n  const { logError } = useLogger(debug);\n\n  const instanceRef = ref<CreateLayerActions<T>>();\n  const layerStatus = ref<LayerManagementStatus>(\n    LayerManagementStatus.NotRegistered,\n  );\n  const mapInstanceRef = shallowRef<Nullable<Map>>(null);\n  const layerRef = shallowRef<Nullable<LayerSpecification>>(null);\n  const layerIdRef = ref<string>();\n\n  let watchScope: EffectScope;\n\n  // Computed properties for better reactivity and performance\n  const isLayerRegistered = computed(\n    () => layerStatus.value === LayerManagementStatus.Registered,\n  );\n  const isLayerReady = computed(() => {\n    const map = mapInstanceRef.value;\n    const layerId = layerIdRef.value;\n    return (\n      isLayerRegistered.value && !!map && !!layerId && hasLayer(map, layerId)\n    );\n  });\n\n  /**\n   * Validates if layer operations can be performed safely\n   * @returns boolean indicating if layer is ready for operations\n   */\n  function validateLayerOperation(): boolean {\n    const map = mapInstanceRef.value;\n    const layerId = layerIdRef.value;\n\n    if (!map || !layerId || !hasLayer(map, layerId)) return false;\n    return true;\n  }\n\n  /**\n   * Registers a layer instance with enhanced error handling and validation\n   * @param instance - Layer instance to register\n   * @param map - Map instance\n   */\n  function register(instance: CreateLayerActions<T>, map: Map): void {\n    try {\n      // Prevent duplicate registration\n      if (\n        unref(instanceRef) === instance &&\n        layerStatus.value === LayerManagementStatus.Registered\n      )\n        return;\n\n      layerStatus.value = LayerManagementStatus.Registering;\n\n      instanceRef.value = instance;\n      mapInstanceRef.value = map;\n\n      // Clean up previous watch scope\n      watchScope?.stop();\n\n      // Set up new watch scope for layer changes\n      watchScope = effectScope();\n      watchScope.run(() => {\n        watch(\n          () => instance.getLayer.value,\n          (layer) => {\n            try {\n              layerRef.value = layer;\n              layerIdRef.value = layer?.id;\n\n              if (layer) {\n                layerStatus.value = LayerManagementStatus.Registered;\n              } else {\n                layerStatus.value = LayerManagementStatus.NotRegistered;\n              }\n            } catch (error) {\n              layerStatus.value = LayerManagementStatus.Error;\n              logError('Error in layer watch handler:', error);\n            }\n          },\n          {\n            immediate: true,\n          },\n        );\n      });\n    } catch (error) {\n      layerStatus.value = LayerManagementStatus.Error;\n      logError('Error registering layer instance:', error);\n    }\n  }\n\n  /**\n   * Gets the current layer instance with validation\n   * @returns Layer instance or undefined\n   */\n  function getInstance(): CreateLayerActions<T> | undefined {\n    const instance = unref(instanceRef);\n    if (!instance) return undefined;\n    return instance;\n  }\n\n  /**\n   * Disposes of the layer management and cleans up resources\n   */\n  function dispose(): void {\n    try {\n      watchScope?.stop();\n      instanceRef.value = undefined;\n      mapInstanceRef.value = null;\n      layerRef.value = null;\n      layerIdRef.value = undefined;\n      layerStatus.value = LayerManagementStatus.Disposed;\n    } catch (error) {\n      logError('Error disposing layer management:', error);\n    }\n  }\n\n  /**\n   * Refreshes the layer registration\n   */\n  function refresh(): void {\n    const instance = getInstance();\n    const map = mapInstanceRef.value;\n\n    if (instance && map) {\n      register(instance, map);\n    }\n  }\n\n  /**\n   * Enhanced layer property getters with error handling\n   */\n  function getFilter(): void | FilterSpecification {\n    if (!validateLayerOperation()) return;\n\n    try {\n      const map = mapInstanceRef.value!;\n      const layerId = layerIdRef.value!;\n      const filter = map.getFilter(layerId);\n      return filter;\n    } catch (error) {\n      logError('Error getting layer filter:', error, {\n        layerId: layerIdRef.value,\n      });\n    }\n  }\n\n  function getLayoutProperty(name: keyof AnyLayout): any {\n    if (!validateLayerOperation()) return;\n\n    try {\n      const map = mapInstanceRef.value!;\n      const layerId = layerIdRef.value!;\n      const value = map.getLayoutProperty(layerId, name as string);\n\n      return value;\n    } catch (error) {\n      logError('Error getting layout property:', error, {\n        layerId: layerIdRef.value,\n        property: name,\n      });\n    }\n  }\n\n  function getPaintProperty(name: keyof AnyPaint): any {\n    if (!validateLayerOperation()) return;\n\n    try {\n      const map = mapInstanceRef.value!;\n      const layerId = layerIdRef.value!;\n      const value = map.getPaintProperty(layerId, name as string);\n      return value;\n    } catch (error) {\n      logError('Error getting paint property:', error, {\n        layerId: layerIdRef.value,\n        property: name,\n      });\n    }\n  }\n\n  /**\n   * Enhanced layer property setters with error handling\n   */\n  function setBeforeId(beforeId?: string): void {\n    const instance = getInstance();\n    if (!instance) return;\n\n    try {\n      instance.setBeforeId(beforeId);\n    } catch (error) {\n      logError('Error setting before ID:', error, { beforeId });\n    }\n  }\n\n  function setFilter(filter?: FilterSpecification): void {\n    const instance = getInstance();\n    if (!instance) return;\n\n    try {\n      instance.setFilter(filter);\n    } catch (error) {\n      logError('Error setting filter:', error, { filter });\n    }\n  }\n\n  function setPaintProperty(\n    name: string,\n    value: any,\n    options?: StyleSetterOptions,\n  ): void {\n    const instance = getInstance();\n    if (!instance) return;\n\n    try {\n      instance.setPaintProperty(name, value, options);\n    } catch (error) {\n      logError('Error setting paint property:', error, {\n        property: name,\n        value,\n      });\n    }\n  }\n\n  function setLayoutProperty(\n    name: string,\n    value: any,\n    options?: StyleSetterOptions,\n  ): void {\n    const instance = getInstance();\n    if (!instance) return;\n\n    try {\n      instance.setLayoutProperty(name, value, options);\n    } catch (error) {\n      logError('Error setting layout property:', error, {\n        property: name,\n        value,\n      });\n    }\n  }\n\n  function setZoomRange(minzoom?: number, maxzoom?: number): void {\n    const instance = getInstance();\n    if (!instance) return;\n\n    try {\n      instance.setZoomRange(minzoom, maxzoom);\n    } catch (error) {\n      logError('Error setting zoom range:', error, { minzoom, maxzoom });\n    }\n  }\n\n  function removeLayer(): void {\n    const instance = getInstance();\n    if (!instance) return;\n\n    try {\n      instance.removeLayer();\n    } catch (error) {\n      logError('Error removing layer:', error, { layerId: layerIdRef.value });\n    }\n  }\n\n  function setStyle(styleVal: AnyLayout & AnyPaint): void {\n    const instance = getInstance();\n    if (!instance) return;\n\n    try {\n      instance.setStyle(styleVal);\n    } catch (error) {\n      logError('Error setting layer style:', error, { style: styleVal });\n    }\n  }\n\n  // Cleanup function for disposing resources\n  function cleanup(): void {\n    if (autoCleanup) {\n      dispose();\n    }\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  return {\n    register,\n    layerId: computed(() => layerIdRef.value),\n    layer: computed(() => layerRef.value),\n    layerStatus: computed(() => layerStatus.value),\n    isLayerRegistered,\n    isLayerReady,\n    getFilter,\n    getLayoutProperty,\n    getPaintProperty,\n    setBeforeId,\n    setFilter,\n    setPaintProperty,\n    setLayoutProperty,\n    setZoomRange,\n    removeLayer,\n    setStyle,\n    dispose,\n    refresh,\n  };\n}\n","import { unref, watchEffect, computed, ref, onUnmounted } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable, ImageDatas } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type { Map, StyleImageMetadata } from 'maplibre-gl';\n\n/**\n * Image creation status enum for better state management\n */\nexport enum ImageStatus {\n  NotCreated = 'not-created',\n  Loading = 'loading',\n  Created = 'created',\n  Updated = 'updated',\n  Error = 'error',\n}\n\ninterface CreateImageProps {\n  map: MaybeRef<Nullable<Map>>;\n  id: string;\n  image: ImageDatas | string;\n  options?: Partial<StyleImageMetadata>;\n  debug?: boolean;\n  /**\n   * Force recreation when image dimensions change instead of throwing error.\n   * When true (default), images are always removed and re-added to prevent dimension mismatch errors.\n   * When false, uses the legacy behavior of trying updateImage first and falling back to recreation on error.\n   */\n  forceRecreateOnDimensionChange?: boolean;\n}\n\ninterface CreateImageActions {\n  remove: () => void;\n  loadImage: (imageUrl: string) => Promise<HTMLImageElement | ImageBitmap>;\n  updateImage: (newImage: ImageDatas | string) => Promise<void>;\n  refreshImage: () => Promise<void>;\n  hasImage: () => boolean;\n  imageStatus: Readonly<ImageStatus>;\n  isImageReady: boolean;\n  loadPromise: Promise<void>;\n}\n\n/**\n * Composable for creating and managing MapLibre GL Images\n * Provides reactive image management with error handling, performance optimizations, and enhanced API\n *\n * **Important:** MapLibre GL requires that updated images have the same dimensions as the previous version.\n * This composable automatically handles dimension changes by removing and re-adding images when necessary.\n *\n * @param props - Configuration options for the image\n * @returns Enhanced actions and state for the image\n */\nexport function useCreateImage(props: CreateImageProps): CreateImageActions {\n  const { logError } = useLogger(props.debug ?? false);\n  const imageStatus = ref<ImageStatus>(ImageStatus.NotCreated);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isImageReady = computed(\n    () =>\n      imageStatus.value === ImageStatus.Created ||\n      imageStatus.value === ImageStatus.Updated,\n  );\n\n  let resolveFn: (value?: any) => void;\n  let rejectFn: (reason?: any) => void;\n\n  const promise = new Promise<void>((resolve, reject) => {\n    resolveFn = resolve;\n    rejectFn = reject;\n  });\n\n  /**\n   * Validates if image operations can be performed safely\n   * @returns boolean indicating if operations can proceed\n   */\n  function validateImageOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map) return false;\n    return true;\n  }\n\n  /**\n   * Gets the dimensions of an image data object\n   * @param imageData - Image data to get dimensions from\n   * @returns Object with width and height properties, or null if not determinable\n   */\n  function getImageDimensions(\n    imageData: ImageDatas,\n  ): { width: number; height: number } | null {\n    try {\n      if (imageData instanceof HTMLImageElement) {\n        return {\n          width: imageData.naturalWidth || imageData.width,\n          height: imageData.naturalHeight || imageData.height,\n        };\n      }\n      if (imageData instanceof ImageBitmap) {\n        return { width: imageData.width, height: imageData.height };\n      }\n      if (imageData instanceof ImageData) {\n        return { width: imageData.width, height: imageData.height };\n      }\n      if (\n        typeof imageData === 'object' &&\n        'width' in imageData &&\n        'height' in imageData\n      ) {\n        return { width: imageData.width, height: imageData.height };\n      }\n      return null;\n    } catch (error) {\n      logError('Error getting image dimensions:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Checks if the image exists on the map\n   * @returns boolean indicating if image exists\n   */\n  function hasImage(): boolean {\n    const map = mapInstance.value;\n    if (!map) return false;\n\n    try {\n      return map.hasImage(props.id);\n    } catch (error) {\n      logError('Error checking if image exists:', error, { imageId: props.id });\n      return false;\n    }\n  }\n\n  /**\n   * Loads an image from a URL with enhanced error handling\n   * @param imageUrl - URL of the image to load\n   * @returns Promise resolving to the loaded image data\n   */\n  async function loadImage(\n    imageUrl: string,\n  ): Promise<HTMLImageElement | ImageBitmap> {\n    if (!validateImageOperation()) {\n      throw new Error('Map instance not available');\n    }\n\n    const map = mapInstance.value!;\n\n    try {\n      const result = await map.loadImage(imageUrl);\n\n      return result.data;\n    } catch (error) {\n      logError('Error loading image from URL:', error, {\n        imageId: props.id,\n        imageUrl,\n      });\n      throw new Error(`Failed to load image from URL: ${imageUrl}`);\n    }\n  }\n\n  /**\n   * Updates or creates an image with enhanced error handling and validation\n   * @param newImage - New image data (URL string or ImageData)\n   */\n  async function updateImage(newImage: ImageDatas | string): Promise<void> {\n    if (!validateImageOperation()) {\n      throw new Error('Map instance not available');\n    }\n\n    const map = mapInstance.value!;\n    imageStatus.value = ImageStatus.Loading;\n\n    try {\n      let imageData: ImageDatas;\n\n      // Handle string URLs\n      if (typeof newImage === 'string') {\n        imageData = await loadImage(newImage);\n      } else {\n        imageData = newImage;\n      }\n\n      // Update or add the image\n      if (hasImage()) {\n        // Check if we should force recreation when dimensions change\n        const forceRecreate = props.forceRecreateOnDimensionChange ?? true; // Default to true for better UX\n\n        if (forceRecreate) {\n          // Safe approach: always remove and re-add to avoid dimension mismatch errors\n          const newDimensions = getImageDimensions(imageData);\n\n          try {\n            // Remove the existing image\n            map.removeImage(props.id);\n\n            // Add the new image\n            map.addImage(props.id, imageData, props.options);\n            imageStatus.value = ImageStatus.Updated;\n          } catch (recreateError) {\n            logError('Error recreating image:', recreateError, {\n              imageId: props.id,\n              newDimensions,\n            });\n            throw recreateError;\n          }\n        } else {\n          // Legacy approach: try update first, fallback to recreate on dimension errors\n          try {\n            map.updateImage(props.id, imageData);\n            imageStatus.value = ImageStatus.Updated;\n          } catch (updateError: any) {\n            // If update fails due to dimension mismatch, remove and re-add the image\n            if (\n              updateError?.message?.includes('width and height') ||\n              updateError?.message?.includes('same as the previous version')\n            ) {\n              const newDimensions = getImageDimensions(imageData);\n              logError(\n                'Image dimensions changed, removing and re-adding image:',\n                updateError,\n                {\n                  imageId: props.id,\n                  newDimensions,\n                },\n              );\n\n              // Remove the existing image\n              map.removeImage(props.id);\n\n              // Add the new image with updated dimensions\n              map.addImage(props.id, imageData, props.options);\n              imageStatus.value = ImageStatus.Created;\n            } else {\n              // Re-throw if it's a different error\n              throw updateError;\n            }\n          }\n        }\n      } else {\n        map.addImage(props.id, imageData, props.options);\n        imageStatus.value = ImageStatus.Created;\n      }\n\n      resolveFn();\n    } catch (error) {\n      imageStatus.value = ImageStatus.Error;\n      logError('Error updating/creating image:', error, { imageId: props.id });\n      rejectFn(error);\n      throw error;\n    }\n  }\n\n  /**\n   * Refreshes the image by re-applying the current image data\n   */\n  async function refreshImage(): Promise<void> {\n    await updateImage(props.image);\n  }\n\n  /**\n   * Removes the image from the map with enhanced error handling\n   */\n  function remove(): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    try {\n      if (hasImage()) {\n        map.removeImage(props.id);\n        imageStatus.value = ImageStatus.NotCreated;\n      }\n    } catch (error) {\n      logError('Error removing image:', error, { imageId: props.id });\n      imageStatus.value = ImageStatus.Error;\n    } finally {\n      rejectFn(new Error('Image removed'));\n    }\n  }\n\n  // Watch for map changes and manage image lifecycle\n  watchEffect(() => {\n    const map = mapInstance.value;\n    if (map && imageStatus.value === ImageStatus.NotCreated) {\n      updateImage(props.image).catch((error) => {\n        logError('Error in watchEffect updateImage:', error);\n      });\n    }\n  });\n\n  // Cleanup on unmount\n  onUnmounted(() => {\n    remove();\n  });\n\n  return {\n    remove,\n    loadImage,\n    updateImage,\n    refreshImage,\n    hasImage,\n    imageStatus: imageStatus.value as Readonly<ImageStatus>,\n    isImageReady: isImageReady.value,\n    loadPromise: promise,\n  };\n}\n","import {\n  computed,\n  effectScope,\n  ref,\n  shallowRef,\n  unref,\n  watch,\n  onScopeDispose,\n  type ComputedRef,\n  type EffectScope,\n} from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { CreateGeoJsonSourceActions } from '@libs/composables';\nimport type { GeoJSONSource, GeoJSONSourceSpecification } from 'maplibre-gl';\nimport type { Nullable } from '@libs/types';\n\n/**\n * GeoJSON source management status enum for better state tracking\n */\nexport enum GeoJsonSourceStatus {\n  NotRegistered = 'not-registered',\n  Registered = 'registered',\n  Error = 'error',\n}\n\n/**\n * Enhanced interface for GeoJSON source management methods\n */\ninterface GeoJsonSourceMethods {\n  sourceId: ComputedRef<string | undefined>;\n  getSource: ComputedRef<Nullable<GeoJSONSource>>;\n  setData: (data: GeoJSONSourceSpecification['data']) => void;\n  refreshSource: () => void;\n  isSourceReady: ComputedRef<boolean>;\n  sourceStatus: ComputedRef<GeoJsonSourceStatus>;\n}\n\n/**\n * Configuration options for GeoJSON source management\n */\ninterface UseGeoJsonSourceProps {\n  debug?: boolean;\n  autoRefresh?: boolean;\n}\n\n/**\n * Enhanced composable for managing GeoJSON source instances\n * Provides reactive source management with improved error handling and performance optimizations\n *\n * @param props - Configuration options for the GeoJSON source manager\n * @returns Enhanced methods and state for GeoJSON source management\n */\nexport function useGeoJsonSource(\n  props: UseGeoJsonSourceProps = {},\n): GeoJsonSourceMethods & {\n  register: (instance: CreateGeoJsonSourceActions) => void;\n} {\n  const { debug = false, autoRefresh = true } = props;\n  const { logError } = useLogger(debug);\n\n  // State management with better typing and performance\n  const instanceRef = ref<CreateGeoJsonSourceActions>();\n  const sourceRef = shallowRef<Nullable<GeoJSONSource>>(null);\n  const sourceIdRef = ref<string>();\n  const sourceStatus = ref<GeoJsonSourceStatus>(\n    GeoJsonSourceStatus.NotRegistered,\n  );\n\n  // Effect scope for proper cleanup management\n  let watchScope: EffectScope | undefined;\n\n  // Computed properties for better reactivity and performance\n  const isSourceReady = computed(\n    () =>\n      sourceStatus.value === GeoJsonSourceStatus.Registered &&\n      !!sourceRef.value &&\n      !!sourceIdRef.value,\n  );\n\n  /**\n   * Enhanced registration function with better error handling and validation\n   * @param instance - The GeoJSON source actions instance to register\n   */\n  function register(instance: CreateGeoJsonSourceActions): void {\n    try {\n      // Prevent unnecessary re-registration of the same instance\n      if (\n        sourceStatus.value === GeoJsonSourceStatus.Registered &&\n        instance === unref(instanceRef)\n      )\n        return;\n\n      // Clean up previous watch scope\n      cleanupWatchScope();\n\n      // Update instance and status\n      instanceRef.value = instance;\n      sourceStatus.value = GeoJsonSourceStatus.Registered;\n\n      // Set up new watch scope for reactive source tracking\n      setupSourceWatcher(instance);\n    } catch (error) {\n      sourceStatus.value = GeoJsonSourceStatus.Error;\n      logError('Error registering GeoJSON source instance:', error);\n    }\n  }\n\n  /**\n   * Sets up reactive watcher for source changes with enhanced error handling\n   * @param instance - The source instance to watch\n   */\n  function setupSourceWatcher(instance: CreateGeoJsonSourceActions): void {\n    watchScope = effectScope();\n\n    watchScope.run(() => {\n      watch(\n        () => instance.getSource.value,\n        (newSource, oldSource) => {\n          try {\n            if (newSource !== oldSource) {\n              sourceRef.value = newSource;\n              sourceIdRef.value = instance.sourceId;\n            }\n          } catch (error) {\n            sourceStatus.value = GeoJsonSourceStatus.Error;\n            logError('Error in source watcher:', error);\n          }\n        },\n        { immediate: true },\n      );\n    });\n  }\n\n  /**\n   * Safely cleans up the watch scope\n   */\n  function cleanupWatchScope(): void {\n    try {\n      watchScope?.stop();\n      watchScope = undefined;\n    } catch (error) {\n      logError('Error cleaning up watch scope:', error);\n    }\n  }\n\n  /**\n   * Enhanced setData method with validation and error handling\n   * @param data - The GeoJSON data to set\n   */\n  function setData(data: GeoJSONSourceSpecification['data']): void {\n    try {\n      if (!instanceRef.value) return;\n\n      if (!instanceRef.value.setData) return;\n\n      instanceRef.value.setData(data);\n    } catch (error) {\n      logError('Error setting GeoJSON source data:', error);\n    }\n  }\n\n  /**\n   * Refreshes the source by triggering a re-registration if auto-refresh is enabled\n   */\n  function refreshSource(): void {\n    try {\n      if (!autoRefresh) return;\n\n      const currentInstance = instanceRef.value;\n      if (currentInstance) {\n        register(currentInstance);\n      }\n    } catch (error) {\n      logError('Error refreshing GeoJSON source:', error);\n    }\n  }\n\n  // Cleanup on scope disposal\n  onScopeDispose(() => {\n    cleanupWatchScope();\n  });\n\n  // Return enhanced interface with computed properties for better encapsulation\n  const methods: GeoJsonSourceMethods = {\n    sourceId: computed(() => sourceIdRef.value),\n    getSource: computed(() => sourceRef.value),\n    setData,\n    refreshSource,\n    isSourceReady,\n    sourceStatus: computed(() => sourceStatus.value),\n  };\n\n  return {\n    register,\n    ...methods,\n  };\n}\n","import {\n  computed,\n  shallowRef,\n  unref,\n  watchEffect,\n  ref,\n  watch,\n  onUnmounted,\n} from 'vue';\nimport { Popup } from 'maplibre-gl';\nimport { lngLatLikeHasValue } from '@libs/helpers';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable } from '@libs/types';\nimport type { Ref, MaybeRef } from 'vue';\nimport type { LngLatLike, Map, PopupOptions, PointLike } from 'maplibre-gl';\n\n/**\n * Popup creation status enum for better state management\n */\nexport enum PopupStatus {\n  NotCreated = 'not-created',\n  Creating = 'creating',\n  Created = 'created',\n  Open = 'open',\n  Closed = 'closed',\n  Error = 'error',\n  Removed = 'removed',\n}\n\ninterface PopupEventHandlers {\n  open?: (popup: Popup) => void;\n  close?: (popup: Popup) => void;\n}\n\ninterface CreatePopupProps {\n  map: MaybeRef<Nullable<Map>>;\n  options?: PopupOptions;\n  el?: Ref<HTMLElement | undefined>;\n  lnglat?: MaybeRef<LngLatLike | undefined>;\n  show?: boolean;\n  withMap?: boolean;\n  html?: MaybeRef<string | undefined>;\n  on?: PopupEventHandlers;\n  debug?: boolean;\n  autoCreate?: boolean;\n  closeOnClick?: boolean;\n  closeButton?: boolean;\n}\n\ninterface CreatePopupActions {\n  popup: Readonly<Nullable<Popup>>;\n  popupStatus: Readonly<PopupStatus>;\n  isPopupCreated: boolean;\n  isPopupOpen: boolean;\n  setLngLat: (lnglat: LngLatLike) => void;\n  setOffset: (offset: PointLike) => void;\n  addClassName: (className: string) => void;\n  removeClassName: (className: string) => void;\n  setMaxWidth: (width: string) => void;\n  show: () => void;\n  hide: () => void;\n  toggle: () => void;\n  addToMap: () => void;\n  setHTMLContent: (html?: string) => void;\n  setDOMContent: (element: HTMLElement) => void;\n  setText: (text: string) => void;\n  removePopup: () => void;\n  createPopup: () => void;\n  getLngLat: () => LngLatLike | null;\n  getElement: () => HTMLElement | null;\n}\n\n/**\n * Composable for managing MapLibre GL Popups\n * Provides reactive popup with error handling, performance optimizations, and enhanced API\n *\n * @param props - Configuration options for the popup\n * @returns Enhanced actions and state for the popup\n */\nexport function useCreatePopup({\n  map: mapRef,\n  lnglat: lnglatVal,\n  html,\n  el,\n  show: showVal = true,\n  withMap: withMapVal = true,\n  options = {},\n  on = {},\n  debug = false,\n  autoCreate = true,\n  closeOnClick = true,\n  closeButton = true,\n}: CreatePopupProps): CreatePopupActions {\n  const { logError } = useLogger(debug);\n  const popup = shallowRef<Nullable<Popup>>(null);\n  const popupStatus = ref<PopupStatus>(PopupStatus.NotCreated);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(mapRef));\n  const lnglatValue = computed(() => unref(lnglatVal));\n  const htmlValue = computed(() => unref(html));\n  const isPopupCreated = computed(\n    () =>\n      popupStatus.value === PopupStatus.Created ||\n      popupStatus.value === PopupStatus.Open ||\n      popupStatus.value === PopupStatus.Closed,\n  );\n  const isPopupOpen = computed(() => popupStatus.value === PopupStatus.Open);\n\n  /**\n   * Enhanced event handlers with error handling and debugging\n   */\n  const openEventFn = (): void => {\n    try {\n      if (popup.value) {\n        popupStatus.value = PopupStatus.Open;\n        on.open?.(popup.value);\n      }\n    } catch (error) {\n      logError('Error in popup open handler:', error);\n    }\n  };\n\n  const closeEventFn = (): void => {\n    try {\n      if (popup.value) {\n        popupStatus.value = PopupStatus.Closed;\n        on.close?.(popup.value);\n      }\n    } catch (error) {\n      logError('Error in popup close handler:', error);\n    }\n  };\n\n  /**\n   * Creates and initializes the popup\n   */\n  function createPopup(): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    if (popup.value) return;\n\n    if (!el?.value && !htmlValue.value) return;\n\n    try {\n      popupStatus.value = PopupStatus.Creating;\n\n      popup.value = new Popup({\n        closeOnClick,\n        closeButton,\n        ...options,\n      });\n\n      // Set content\n      if (el?.value) {\n        popup.value.setDOMContent(el.value);\n      } else if (htmlValue.value) {\n        popup.value.setHTML(htmlValue.value);\n      }\n\n      // Set initial position if provided\n      const lnglat = lnglatValue.value;\n      if (lnglat && lngLatLikeHasValue(lnglat)) {\n        popup.value.setLngLat(lnglat);\n      }\n\n      // Attach event listeners\n      popup.value.on('open', openEventFn);\n      popup.value.on('close', closeEventFn);\n\n      popupStatus.value = PopupStatus.Created;\n\n      // Show popup if requested\n      if (showVal && withMapVal) {\n        show();\n      } else if (withMapVal) {\n        addToMap();\n      }\n    } catch (error) {\n      popupStatus.value = PopupStatus.Error;\n      logError('Error creating popup:', error);\n      popup.value = null;\n    }\n  }\n\n  // Watch for map changes and manage popup lifecycle\n  watchEffect((onCleanUp) => {\n    const map = mapInstance.value;\n    if (map && popupStatus.value === PopupStatus.NotCreated && autoCreate) {\n      createPopup();\n    } else if (!map && isPopupCreated.value) {\n      removePopup();\n    }\n    onCleanUp(removePopup);\n  });\n\n  // Watch for HTML content changes\n  watch(htmlValue, (newHtml) => {\n    if (popup.value && newHtml) {\n      setHTMLContent(newHtml);\n    }\n  });\n\n  // Watch for position changes\n  watch(lnglatValue, (newLnglat) => {\n    if (popup.value && newLnglat && lngLatLikeHasValue(newLnglat)) {\n      setLngLat(newLnglat);\n    }\n  });\n\n  /**\n   * Sets the popup's position with error handling\n   * @param lnglat - New position for the popup\n   */\n  function setLngLat(lnglat: LngLatLike): void {\n    if (!popup.value) return;\n\n    try {\n      popup.value.setLngLat(lnglat);\n    } catch (error) {\n      logError('Error setting popup position:', error, { lnglat });\n    }\n  }\n\n  /**\n   * Sets the popup's offset with error handling\n   * @param offset - Offset for the popup\n   */\n  function setOffset(offset: PointLike): void {\n    if (!popup.value) return;\n\n    try {\n      popup.value.setOffset(offset);\n    } catch (error) {\n      logError('Error setting popup offset:', error, { offset });\n    }\n  }\n\n  /**\n   * Adds a CSS class to the popup with error handling\n   * @param className - CSS class name to add\n   */\n  function addClassName(className: string): void {\n    if (!popup.value) return;\n    try {\n      popup.value.addClassName(className);\n    } catch (error) {\n      logError('Error adding popup class:', error, { className });\n    }\n  }\n\n  /**\n   * Removes a CSS class from the popup with error handling\n   * @param className - CSS class name to remove\n   */\n  function removeClassName(className: string): void {\n    if (!popup.value) return;\n\n    try {\n      popup.value.removeClassName(className);\n    } catch (error) {\n      logError('Error removing popup class:', error, { className });\n    }\n  }\n\n  /**\n   * Sets the popup's maximum width with error handling\n   * @param width - Maximum width value\n   */\n  function setMaxWidth(width: string): void {\n    if (!popup.value) return;\n\n    try {\n      popup.value.setMaxWidth(width);\n    } catch (error) {\n      logError('Error setting popup max width:', error, { width });\n    }\n  }\n\n  /**\n   * Shows the popup on the map\n   */\n  function show(): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    if (!popup.value) return;\n\n    try {\n      if (!popup.value.isOpen()) {\n        popup.value.addTo(map);\n      }\n    } catch (error) {\n      logError('Error showing popup:', error);\n    }\n  }\n\n  /**\n   * Hides the popup from the map\n   */\n  function hide(): void {\n    if (!popup.value) return;\n\n    try {\n      if (popup.value.isOpen()) {\n        popup.value.remove();\n      }\n    } catch (error) {\n      logError('Error hiding popup:', error);\n    }\n  }\n\n  /**\n   * Toggles the popup visibility\n   */\n  function toggle(): void {\n    if (!popup.value) return;\n\n    try {\n      if (popup.value.isOpen()) {\n        hide();\n      } else {\n        show();\n      }\n    } catch (error) {\n      logError('Error toggling popup:', error);\n    }\n  }\n\n  /**\n   * Adds the popup to the map without showing it\n   */\n  function addToMap(): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    if (!popup.value) return;\n\n    try {\n      popup.value.addTo(map);\n    } catch (error) {\n      logError('Error adding popup to map:', error);\n    }\n  }\n\n  /**\n   * Sets the popup's HTML content with error handling\n   * @param html - HTML content to set\n   */\n  function setHTMLContent(html?: string): void {\n    if (!popup.value) return;\n\n    const content = html || htmlValue.value;\n    if (!content) return;\n\n    try {\n      popup.value.setHTML(content);\n    } catch (error) {\n      logError('Error setting popup HTML content:', error, { content });\n    }\n  }\n\n  /**\n   * Sets the popup's DOM content with error handling\n   * @param element - DOM element to set as content\n   */\n  function setDOMContent(element: HTMLElement): void {\n    if (!popup.value) return;\n\n    try {\n      popup.value.setDOMContent(element);\n    } catch (error) {\n      logError('Error setting popup DOM content:', error, { element });\n    }\n  }\n\n  /**\n   * Sets the popup's text content with error handling\n   * @param text - Text content to set\n   */\n  function setText(text: string): void {\n    if (!popup.value) return;\n\n    try {\n      popup.value.setText(text);\n    } catch (error) {\n      logError('Error setting popup text content:', error, { text });\n    }\n  }\n\n  /**\n   * Gets the popup's current position\n   * @returns Current position or null\n   */\n  function getLngLat(): LngLatLike | null {\n    if (!popup.value) return null;\n\n    try {\n      return popup.value.getLngLat();\n    } catch (error) {\n      logError('Error getting popup position:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Gets the popup's DOM element\n   * @returns The popup's DOM element or null\n   */\n  function getElement(): HTMLElement | null {\n    if (!popup.value) return null;\n\n    try {\n      return popup.value.getElement();\n    } catch (error) {\n      logError('Error getting popup element:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Removes the popup and cleans up resources\n   */\n  function removePopup(): void {\n    if (!popup.value) return;\n\n    try {\n      // Remove event listeners\n      popup.value.off('open', openEventFn);\n      popup.value.off('close', closeEventFn);\n\n      // Hide popup if open\n      if (popup.value.isOpen()) {\n        popup.value.remove();\n      }\n\n      popupStatus.value = PopupStatus.Removed;\n    } catch (error) {\n      logError('Error removing popup:', error);\n    } finally {\n      popup.value = null;\n      popupStatus.value = PopupStatus.NotCreated;\n    }\n  }\n\n  // Cleanup function for removing popup and stopping watchers\n  function cleanup(): void {\n    removePopup();\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  return {\n    popup: popup.value,\n    popupStatus: popupStatus.value,\n    isPopupCreated: isPopupCreated.value,\n    isPopupOpen: isPopupOpen.value,\n    setLngLat,\n    setOffset,\n    addClassName,\n    removeClassName,\n    setMaxWidth,\n    show,\n    hide,\n    toggle,\n    addToMap,\n    setHTMLContent,\n    setDOMContent,\n    setText,\n    removePopup,\n    createPopup,\n    getLngLat,\n    getElement,\n  };\n}\n","import {\n  watchEffect,\n  watch,\n  unref,\n  shallowRef,\n  computed,\n  ref,\n  onUnmounted,\n} from 'vue';\nimport { Marker } from 'maplibre-gl';\nimport { lngLatLikeHasValue } from '@libs/helpers';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable } from '@libs/types';\nimport type { MaybeRef, Ref } from 'vue';\nimport type {\n  Alignment,\n  Listener,\n  LngLatLike,\n  Map,\n  MarkerOptions,\n  Popup,\n  PointLike,\n} from 'maplibre-gl';\n\n/**\n * Marker creation status enum for better state management\n */\nexport enum MarkerStatus {\n  NotCreated = 'not-created',\n  Creating = 'creating',\n  Created = 'created',\n  Error = 'error',\n  Removed = 'removed',\n}\n\ninterface MarkerEventHandlers {\n  dragstart?: (e: Event) => void;\n  drag?: (e: Event) => void;\n  dragend?: (e: Event) => void;\n}\n\ninterface CreateMarkerProps {\n  map: MaybeRef<Nullable<Map>>;\n  lnglat?: MaybeRef<LngLatLike | undefined>;\n  popup?: MaybeRef<Nullable<Popup>>;\n  el?: Ref<HTMLElement | undefined>;\n  options?: MarkerOptions;\n  on?: MarkerEventHandlers;\n  debug?: boolean;\n  autoAdd?: boolean;\n}\n\ninterface CreateMarkerActions {\n  marker: Readonly<Nullable<Marker>>;\n  markerStatus: Readonly<MarkerStatus>;\n  isMarkerCreated: boolean;\n  setLngLat: (lnglat: LngLatLike) => void;\n  setPopup: (popup?: Popup | null) => void;\n  setOffset: (offset: PointLike) => void;\n  setDraggable: (draggable: boolean) => void;\n  togglePopup: () => void;\n  getElement: () => HTMLElement | null;\n  setRotation: (rotation: number) => void;\n  setRotationAlignment: (alignment: Alignment) => void;\n  setPitchAlignment: (alignment: Alignment) => void;\n  setOpacity: (opacity: string, opacityWhenCovered?: string) => void;\n  removeMarker: () => void;\n  addMarker: () => void;\n  getLngLat: () => LngLatLike | null;\n  getPopup: () => Popup | null;\n  getOffset: () => PointLike;\n  getDraggable: () => boolean;\n  getRotation: () => number;\n}\n\n/**\n * Composable for managing MapLibre GL Markers\n * Provides reactive marker with error handling, performance optimizations, and enhanced API\n *\n * @param props - Configuration options for the marker\n * @returns Enhanced actions and state for the marker\n */\nexport function useCreateMarker({\n  map: mapRef,\n  lnglat: lnglatVal,\n  popup: popupRef,\n  el,\n  options = {},\n  on = {},\n  debug = false,\n  autoAdd = true,\n}: CreateMarkerProps): CreateMarkerActions {\n  const { logError } = useLogger(debug);\n  const marker = shallowRef<Nullable<Marker>>(null);\n  const markerStatus = ref<MarkerStatus>(MarkerStatus.NotCreated);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(mapRef));\n  const lnglatValue = computed(() => unref(lnglatVal));\n  const popupValue = computed(() => unref(popupRef));\n  const isMarkerCreated = computed(\n    () => markerStatus.value === MarkerStatus.Created,\n  );\n\n  /**\n   * Enhanced drag event handlers with error handling and debugging\n   */\n  const dragstartEventFn = (ev: Event): void => {\n    try {\n      on.dragstart?.(ev);\n    } catch (error) {\n      logError('Error in marker dragstart handler:', error);\n    }\n  };\n\n  const dragEventFn = (ev: Event): void => {\n    try {\n      on.drag?.(ev);\n    } catch (error) {\n      logError('Error in marker drag handler:', error);\n    }\n  };\n\n  const dragendEventFn = (ev: Event): void => {\n    try {\n      on.dragend?.(ev);\n    } catch (error) {\n      logError('Error in marker dragend handler:', error);\n    }\n  };\n\n  /**\n   * Creates and initializes the marker\n   */\n  function createMarker(): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    if (marker.value) return;\n\n    try {\n      markerStatus.value = MarkerStatus.Creating;\n\n      marker.value = new Marker({\n        ...options,\n        element: el?.value,\n      });\n\n      // Set initial position if provided\n      const lnglat = lnglatValue.value;\n      if (lnglat && lngLatLikeHasValue(lnglat)) {\n        marker.value.setLngLat(lnglat);\n      }\n\n      // Set initial popup if provided\n      const popup = popupValue.value;\n      if (popup) {\n        marker.value.setPopup(popup);\n      }\n\n      // Attach event listeners\n      marker.value.on('dragstart', dragstartEventFn as Listener);\n      marker.value.on('drag', dragEventFn as Listener);\n      marker.value.on('dragend', dragendEventFn as Listener);\n\n      // Add to map if autoAdd is enabled\n      if (autoAdd) {\n        marker.value.addTo(map);\n      }\n\n      markerStatus.value = MarkerStatus.Created;\n    } catch (error) {\n      markerStatus.value = MarkerStatus.Error;\n      logError('Error creating marker:', error);\n      marker.value = null;\n    }\n  }\n\n  // Watch for map changes and manage marker lifecycle\n  watchEffect((onCleanUp) => {\n    const map = mapInstance.value;\n    if (map && markerStatus.value === MarkerStatus.NotCreated) {\n      createMarker();\n    } else if (!map && markerStatus.value === MarkerStatus.Created) {\n      removeMarker();\n    }\n    onCleanUp(removeMarker);\n  });\n\n  // Watch for popup changes\n  watch(popupValue, (newPopup) => {\n    if (marker.value && newPopup !== undefined) {\n      setPopup(newPopup);\n    }\n  });\n\n  // Watch for lnglat changes\n  watch(lnglatValue, (newLnglat) => {\n    if (marker.value && newLnglat && lngLatLikeHasValue(newLnglat)) {\n      setLngLat(newLnglat);\n    }\n  });\n\n  /**\n   * Sets the marker's position with error handling\n   * @param lnglat - New position for the marker\n   */\n  function setLngLat(lnglat: LngLatLike): void {\n    if (!marker.value) return;\n\n    try {\n      marker.value.setLngLat(lnglat);\n    } catch (error) {\n      logError('Error setting marker position:', error, { lnglat });\n    }\n  }\n\n  /**\n   * Sets the marker's popup with error handling\n   * @param popup - Popup to attach to the marker\n   */\n  function setPopup(popup?: Popup | null): void {\n    if (!marker.value) return;\n\n    try {\n      if (popup) {\n        marker.value.setPopup(popup);\n      } else {\n        marker.value.setPopup(undefined);\n      }\n    } catch (error) {\n      logError('Error setting marker popup:', error);\n    }\n  }\n\n  /**\n   * Sets the marker's offset with error handling\n   * @param offset - Offset for the marker\n   */\n  function setOffset(offset: PointLike): void {\n    if (!marker.value) return;\n\n    try {\n      marker.value.setOffset(offset);\n    } catch (error) {\n      logError('Error setting marker offset:', error, { offset });\n    }\n  }\n\n  /**\n   * Sets the marker's draggable state with error handling\n   * @param draggable - Whether the marker should be draggable\n   */\n  function setDraggable(draggable: boolean): void {\n    if (!marker.value) return;\n\n    try {\n      marker.value.setDraggable(draggable);\n    } catch (error) {\n      logError('Error setting marker draggable state:', error, { draggable });\n    }\n  }\n\n  /**\n   * Toggles the marker's popup with error handling\n   */\n  function togglePopup(): void {\n    if (!marker.value) return;\n\n    try {\n      marker.value.togglePopup();\n    } catch (error) {\n      logError('Error toggling marker popup:', error);\n    }\n  }\n\n  /**\n   * Gets the marker's DOM element\n   * @returns The marker's DOM element or null\n   */\n  function getElement(): HTMLElement | null {\n    if (!marker.value) return null;\n\n    try {\n      return marker.value.getElement();\n    } catch (error) {\n      logError('Error getting marker element:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Sets the marker's rotation with error handling\n   * @param rotation - Rotation angle in degrees\n   */\n  function setRotation(rotation: number): void {\n    if (!marker.value) return;\n\n    try {\n      marker.value.setRotation(rotation);\n    } catch (error) {\n      logError('Error setting marker rotation:', error, { rotation });\n    }\n  }\n\n  /**\n   * Sets the marker's rotation alignment with error handling\n   * @param alignment - Rotation alignment\n   */\n  function setRotationAlignment(alignment: Alignment): void {\n    if (!marker.value) return;\n\n    try {\n      marker.value.setRotationAlignment(alignment);\n    } catch (error) {\n      logError('Error setting marker rotation alignment:', error, {\n        alignment,\n      });\n    }\n  }\n\n  /**\n   * Sets the marker's pitch alignment with error handling\n   * @param alignment - Pitch alignment\n   */\n  function setPitchAlignment(alignment: Alignment): void {\n    if (!marker.value) return;\n\n    try {\n      marker.value.setPitchAlignment(alignment);\n    } catch (error) {\n      logError('Error setting marker pitch alignment:', error, { alignment });\n    }\n  }\n\n  /**\n   * Sets the marker's opacity with error handling\n   * @param opacity - Opacity value\n   * @param opacityWhenCovered - Opacity when covered by other elements\n   */\n  function setOpacity(opacity: string, opacityWhenCovered?: string): void {\n    if (!marker.value) return;\n\n    try {\n      marker.value.setOpacity(opacity, opacityWhenCovered);\n    } catch (error) {\n      logError('Error setting marker opacity:', error, {\n        opacity,\n        opacityWhenCovered,\n      });\n    }\n  }\n\n  /**\n   * Adds the marker to the map\n   */\n  function addMarker(): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    if (!marker.value) return;\n\n    try {\n      marker.value.addTo(map);\n    } catch (error) {\n      logError('Error adding marker to map:', error);\n    }\n  }\n\n  /**\n   * Removes the marker from the map and cleans up resources\n   */\n  function removeMarker(): void {\n    if (!marker.value) return;\n\n    try {\n      // Remove event listeners\n      marker.value.off('dragstart', dragstartEventFn as Listener);\n      marker.value.off('drag', dragEventFn as Listener);\n      marker.value.off('dragend', dragendEventFn as Listener);\n\n      // Remove from map\n      marker.value.remove();\n\n      markerStatus.value = MarkerStatus.Removed;\n    } catch (error) {\n      logError('Error removing marker:', error);\n    } finally {\n      marker.value = null;\n      markerStatus.value = MarkerStatus.NotCreated;\n    }\n  }\n\n  /**\n   * Gets the marker's current position\n   * @returns Current position or null\n   */\n  function getLngLat(): LngLatLike | null {\n    if (!marker.value) return null;\n\n    try {\n      return marker.value.getLngLat();\n    } catch (error) {\n      logError('Error getting marker position:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Gets the marker's current popup\n   * @returns Current popup or null\n   */\n  function getPopup(): Popup | null {\n    if (!marker.value) return null;\n\n    try {\n      return marker.value.getPopup();\n    } catch (error) {\n      logError('Error getting marker popup:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Gets the marker's current offset\n   * @returns Current offset\n   */\n  function getOffset(): PointLike {\n    if (!marker.value) return [0, 0];\n\n    try {\n      return marker.value.getOffset();\n    } catch (error) {\n      logError('Error getting marker offset:', error);\n      return [0, 0];\n    }\n  }\n\n  /**\n   * Gets the marker's draggable state\n   * @returns Whether the marker is draggable\n   */\n  function getDraggable(): boolean {\n    if (!marker.value) return false;\n\n    try {\n      return marker.value.isDraggable();\n    } catch (error) {\n      logError('Error getting marker draggable state:', error);\n      return false;\n    }\n  }\n\n  /**\n   * Gets the marker's current rotation\n   * @returns Current rotation in degrees\n   */\n  function getRotation(): number {\n    if (!marker.value) return 0;\n\n    try {\n      return marker.value.getRotation();\n    } catch (error) {\n      logError('Error getting marker rotation:', error);\n      return 0;\n    }\n  }\n\n  // Cleanup function for removing marker and stopping watchers\n  function cleanup(): void {\n    removeMarker();\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  return {\n    marker: marker.value,\n    markerStatus: markerStatus.value,\n    isMarkerCreated: isMarkerCreated.value,\n    setLngLat,\n    setPopup,\n    setOffset,\n    setDraggable,\n    togglePopup,\n    getElement,\n    setRotation,\n    setRotationAlignment,\n    setPitchAlignment,\n    setOpacity,\n    removeMarker,\n    addMarker,\n    getLngLat,\n    getPopup,\n    getOffset,\n    getDraggable,\n    getRotation,\n  };\n}\n","import { onUnmounted, unref, watchEffect, computed, ref } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable, MapEventTypes } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type { Map } from 'maplibre-gl';\n\n/**\n * Event listener status enum for better state management\n */\nexport enum EventListenerStatus {\n  NotAttached = 'not-attached',\n  Attached = 'attached',\n  Error = 'error',\n}\n\ninterface MapEventListenerProps {\n  map: MaybeRef<Nullable<Map>>;\n  event: keyof MapEventTypes;\n  on: <T extends keyof MapEventTypes>(e: MapEventTypes[T]) => void;\n  debug?: boolean;\n  once?: boolean;\n}\n\ninterface MapEventListenerActions {\n  removeListener: () => void;\n  attachListener: () => void;\n  isListenerAttached: boolean;\n  listenerStatus: Readonly<EventListenerStatus>;\n}\n\n/**\n * Composable for managing MapLibre GL Map Event Listeners\n * Provides reactive event listener with error handling, performance optimizations, and enhanced API\n *\n * @param props - Configuration options for the map event listener\n * @returns Enhanced actions and state for the event listener\n */\nexport function useMapEventListener(\n  props: MapEventListenerProps,\n): MapEventListenerActions {\n  const { logError } = useLogger(props.debug ?? false);\n  const listenerStatus = ref<EventListenerStatus>(\n    EventListenerStatus.NotAttached,\n  );\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isListenerAttached = computed(\n    () => listenerStatus.value === EventListenerStatus.Attached,\n  );\n\n  /**\n   * Enhanced event handler with error handling and debugging\n   * @param e - Map event data\n   */\n  const mapEventFn = (e: MapEventTypes[keyof MapEventTypes]): void => {\n    try {\n      if (props.on) props.on(e);\n\n      // Remove listener if it's a one-time event\n      if (props.once) removeListener();\n    } catch (error) {\n      logError('Error in map event handler:', error, { event: props.event });\n      listenerStatus.value = EventListenerStatus.Error;\n    }\n  };\n\n  /**\n   * Attaches the event listener to the map with error handling\n   */\n  function attachListener(): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    if (listenerStatus.value === EventListenerStatus.Attached) return;\n\n    try {\n      map.on(props.event, mapEventFn);\n      listenerStatus.value = EventListenerStatus.Attached;\n    } catch (error) {\n      listenerStatus.value = EventListenerStatus.Error;\n      logError('Error attaching map event listener:', error, {\n        event: props.event,\n      });\n    }\n  }\n\n  /**\n   * Removes the event listener from the map with error handling\n   */\n  function removeListener(): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    if (listenerStatus.value === EventListenerStatus.NotAttached) return;\n    try {\n      map.off(props.event, mapEventFn);\n      listenerStatus.value = EventListenerStatus.NotAttached;\n    } catch (error) {\n      logError('Error removing map event listener:', error, {\n        event: props.event,\n      });\n      // Still mark as not attached even if removal failed\n      listenerStatus.value = EventListenerStatus.NotAttached;\n    }\n  }\n\n  // Optimized watch for map changes with reduced overhead\n  let lastMapInstance: any = null;\n  const stopEffect = watchEffect((onCleanUp) => {\n    const map = mapInstance.value;\n\n    // Only process if map instance actually changed\n    if (map === lastMapInstance) return;\n    lastMapInstance = map;\n\n    if (map && listenerStatus.value === EventListenerStatus.NotAttached) {\n      attachListener();\n    } else if (!map && listenerStatus.value === EventListenerStatus.Attached) {\n      removeListener();\n    }\n    onCleanUp(removeListener);\n  });\n\n  // Cleanup function for removing listener and stopping watchers\n  function cleanup(): void {\n    stopEffect();\n    removeListener();\n  }\n\n  // Automatic cleanup on component unmount\n  onUnmounted(cleanup);\n\n  return {\n    removeListener,\n    attachListener,\n    isListenerAttached: isListenerAttached.value,\n    listenerStatus: listenerStatus.value as Readonly<EventListenerStatus>,\n  };\n}\n","import { onUnmounted, unref, watchEffect, computed, ref } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { Nullable, GeolocateEventTypes } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type { GeolocateControl } from 'maplibre-gl';\n\n/**\n * Event listener status enum for better state management\n */\nexport enum GeolocateEventListenerStatus {\n  NotAttached = 'not-attached',\n  Attached = 'attached',\n  Error = 'error',\n}\n\ninterface GeolocateEventListenerProps {\n  geolocate: MaybeRef<Nullable<GeolocateControl>>;\n  event: keyof GeolocateEventTypes;\n  on: <T extends keyof GeolocateEventTypes>(e: GeolocateEventTypes[T]) => void;\n  debug?: boolean;\n  once?: boolean;\n}\n\ninterface GeolocateEventListenerActions {\n  removeListener: () => void;\n  attachListener: () => void;\n  isListenerAttached: boolean;\n  listenerStatus: Readonly<GeolocateEventListenerStatus>;\n}\n\n/**\n * Composable for managing MapLibre GL Geolocate Control Event Listeners\n * Provides reactive event listener with error handling, performance optimizations, and enhanced API\n *\n * @param props - Configuration options for the geolocate event listener\n * @returns Enhanced actions and state for the event listener\n */\nexport function useGeolocateEventListener(\n  props: GeolocateEventListenerProps,\n): GeolocateEventListenerActions {\n  const { logWarn, logError } = useLogger(props.debug ?? false);\n  const listenerStatus = ref<GeolocateEventListenerStatus>(\n    GeolocateEventListenerStatus.NotAttached,\n  );\n\n  // Computed property for better reactivity and performance\n  const geolocateInstance = computed(() => unref(props.geolocate));\n  const isListenerAttached = computed(\n    () => listenerStatus.value === GeolocateEventListenerStatus.Attached,\n  );\n\n  /**\n   * Enhanced event handler with error handling and debugging\n   * @param e - Geolocate event data\n   */\n  const geoEventFn = (\n    e: GeolocateEventTypes[keyof GeolocateEventTypes],\n  ): void => {\n    try {\n      if (props.on) props.on(e);\n\n      // Remove listener if it's a one-time event\n      if (props.once) removeListener();\n    } catch (error) {\n      logError('Error in geolocate event handler:', error, {\n        event: props.event,\n      });\n      listenerStatus.value = GeolocateEventListenerStatus.Error;\n    }\n  };\n\n  /**\n   * Attaches the event listener to the geolocate control with error handling\n   */\n  function attachListener(): void {\n    const geolocate = geolocateInstance.value;\n\n    if (!geolocate) return;\n\n    if (listenerStatus.value === GeolocateEventListenerStatus.Attached) {\n      logWarn('Event listener already attached', { event: props.event });\n      return;\n    }\n\n    try {\n      geolocate.on(props.event, geoEventFn);\n      listenerStatus.value = GeolocateEventListenerStatus.Attached;\n    } catch (error) {\n      listenerStatus.value = GeolocateEventListenerStatus.Error;\n      logError('Error attaching geolocate event listener:', error, {\n        event: props.event,\n      });\n    }\n  }\n\n  /**\n   * Removes the event listener from the geolocate control with error handling\n   */\n  function removeListener(): void {\n    const geolocate = geolocateInstance.value;\n\n    if (!geolocate) return;\n\n    if (listenerStatus.value === GeolocateEventListenerStatus.NotAttached)\n      return;\n    try {\n      geolocate.off(props.event, geoEventFn);\n      listenerStatus.value = GeolocateEventListenerStatus.NotAttached;\n    } catch (error) {\n      logError('Error removing geolocate event listener:', error, {\n        event: props.event,\n      });\n      // Still mark as not attached even if removal failed\n      listenerStatus.value = GeolocateEventListenerStatus.NotAttached;\n    }\n  }\n\n  // Watch for geolocate control changes and manage listener lifecycle\n  const stopEffect = watchEffect((onCleanUp) => {\n    const geolocate = geolocateInstance.value;\n    if (\n      geolocate &&\n      listenerStatus.value === GeolocateEventListenerStatus.NotAttached\n    ) {\n      attachListener();\n    } else if (\n      !geolocate &&\n      listenerStatus.value === GeolocateEventListenerStatus.Attached\n    ) {\n      removeListener();\n    }\n    onCleanUp(removeListener);\n  });\n\n  // Cleanup function for removing listener and stopping watchers\n  function cleanup(): void {\n    stopEffect();\n    removeListener();\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  return {\n    removeListener,\n    attachListener,\n    isListenerAttached: isListenerAttached.value,\n    listenerStatus: listenerStatus.value,\n  };\n}\n","import { watchEffect, onUnmounted, unref, computed, ref } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport type { MaybeRef } from 'vue';\nimport type { Nullable } from '@libs/types';\nimport type { Map } from 'maplibre-gl';\n\n/**\n * Map reload event status enum for better state management\n */\nexport enum MapReloadEventStatus {\n  NotLoaded = 'not-loaded',\n  Loading = 'loading',\n  Loaded = 'loaded',\n  Error = 'error',\n}\n\ninterface MapReloadEventCallbacks {\n  onLoad: (map: Map) => void;\n  onUnload?: (map: Map) => void;\n  onError?: (error: any) => void;\n}\n\ninterface MapReloadEventProps {\n  map: MaybeRef<Nullable<Map>>;\n  callbacks: MapReloadEventCallbacks;\n  debug?: boolean;\n  autoTriggerOnMount?: boolean;\n}\n\ninterface MapReloadEventActions {\n  clear: () => void;\n  forceLoad: () => void;\n  forceUnload: () => void;\n  isMapLoaded: boolean;\n  loadStatus: Readonly<MapReloadEventStatus>;\n}\n\n/**\n * Composable for managing MapLibre GL Map Reload Events\n * Provides reactive map load/unload event handling with enhanced error handling and state management\n *\n * @param props - Configuration options for the map reload event handler\n * @returns Enhanced actions and state for map reload events\n */\nexport function useMapReloadEvent(\n  props: MapReloadEventProps,\n): MapReloadEventActions;\n\n/**\n * Legacy overload for backward compatibility\n * @deprecated Use the new props-based interface for better type safety and features\n */\nexport function useMapReloadEvent(\n  mapRef: MaybeRef<Nullable<Map>>,\n  callbacks: {\n    unLoad?: (map: Map) => void;\n    onLoad: (map: Map) => void;\n  },\n): { clear: () => void };\n\nexport function useMapReloadEvent(\n  mapRefOrProps: MaybeRef<Nullable<Map>> | MapReloadEventProps,\n  legacyCallbacks?: {\n    unLoad?: (map: Map) => void;\n    onLoad: (map: Map) => void;\n  },\n): MapReloadEventActions | { clear: () => void } {\n  // Handle legacy API for backward compatibility\n  const isLegacyAPI = legacyCallbacks !== undefined;\n  const props: MapReloadEventProps = isLegacyAPI\n    ? {\n        map: mapRefOrProps as MaybeRef<Nullable<Map>>,\n        callbacks: {\n          onLoad: legacyCallbacks!.onLoad,\n          onUnload: legacyCallbacks!.unLoad,\n        },\n        debug: false,\n        autoTriggerOnMount: true,\n      }\n    : (mapRefOrProps as MapReloadEventProps);\n\n  const { logError } = useLogger(props.debug ?? false);\n  const loadStatus = ref<MapReloadEventStatus>(MapReloadEventStatus.NotLoaded);\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const isMapLoaded = computed(\n    () => loadStatus.value === MapReloadEventStatus.Loaded,\n  );\n\n  // Initialize load status based on map state\n  const initialMap = mapInstance.value;\n  if (initialMap?._loaded) {\n    loadStatus.value = MapReloadEventStatus.Loaded;\n    if (props.autoTriggerOnMount !== false) {\n      // Trigger initial load callback if map is already loaded\n      setTimeout(() => forceLoad(), 0);\n    }\n  }\n\n  /**\n   * Enhanced unload event handler with error handling and debugging\n   */\n  function handleUnloadEvent(): void {\n    const map = mapInstance.value;\n\n    if (loadStatus.value === MapReloadEventStatus.NotLoaded) return;\n\n    try {\n      loadStatus.value = MapReloadEventStatus.NotLoaded;\n\n      if (props.callbacks.onUnload && map) props.callbacks.onUnload(map);\n    } catch (error) {\n      loadStatus.value = MapReloadEventStatus.Error;\n      logError('Error in map unload handler:', error);\n\n      if (props.callbacks.onError) {\n        props.callbacks.onError(error);\n      }\n    }\n  }\n\n  /**\n   * Enhanced load event handler with error handling and debugging\n   * @param isForced - Whether this is a forced load event\n   */\n  function handleLoadEvent(isForced: boolean = false): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    if (loadStatus.value === MapReloadEventStatus.Loaded && !isForced) return;\n\n    try {\n      loadStatus.value = MapReloadEventStatus.Loaded;\n\n      props.callbacks.onLoad(map);\n    } catch (error) {\n      loadStatus.value = MapReloadEventStatus.Error;\n      logError('Error in map load handler:', error);\n\n      if (props.callbacks.onError) {\n        props.callbacks.onError(error);\n      }\n    }\n  }\n\n  /**\n   * Forces a load event to be triggered\n   */\n  function forceLoad(): void {\n    handleLoadEvent(true);\n  }\n\n  /**\n   * Forces an unload event to be triggered\n   */\n  function forceUnload(): void {\n    handleUnloadEvent();\n  }\n\n  /**\n   * Clears all event listeners from the map with enhanced error handling\n   */\n  function clear(): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    try {\n      map.off('styledata', handleLoadEvent);\n      map.off('styledataloading', handleUnloadEvent);\n      map.off('load', handleLoadEvent);\n    } catch (error) {\n      logError('Error clearing map reload event listeners:', error);\n    }\n  }\n\n  // Watch for map changes and manage event listener lifecycle\n  const stopEffect = watchEffect((onCleanUp) => {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    try {\n      // Set up event listeners\n      if (loadStatus.value === MapReloadEventStatus.NotLoaded && !map._loaded) {\n        map.on('load', handleLoadEvent);\n      } else if (\n        map._loaded &&\n        loadStatus.value !== MapReloadEventStatus.Loaded\n      ) {\n        // Map is already loaded, trigger load event\n        handleLoadEvent();\n      }\n\n      map.on('styledata', handleLoadEvent);\n      map.on('styledataloading', handleUnloadEvent);\n    } catch (error) {\n      loadStatus.value = MapReloadEventStatus.Error;\n      logError('Error setting up map reload event listeners:', error);\n\n      if (props.callbacks.onError) {\n        props.callbacks.onError(error);\n      }\n    }\n\n    onCleanUp(clear);\n  });\n\n  // Cleanup function for removing listeners and stopping watchers\n  function cleanup(): void {\n    handleUnloadEvent();\n    stopEffect();\n    clear();\n  }\n\n  // Cleanup on component unmount\n  onUnmounted(cleanup);\n\n  // Return appropriate interface based on API version\n  if (isLegacyAPI) {\n    return { clear };\n  }\n\n  return {\n    clear,\n    forceLoad,\n    forceUnload,\n    isMapLoaded: isMapLoaded.value,\n    loadStatus: loadStatus.value,\n  };\n}\n","import { onUnmounted, unref, watchEffect, computed, ref } from 'vue';\nimport { useLogger } from '@libs/composables';\nimport { hasLayer } from '@libs/helpers';\nimport type { Nullable } from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type { Map, MapLayerEventType, LayerSpecification } from 'maplibre-gl';\n\n/**\n * Layer event listener status enum for better state management\n */\nexport enum LayerEventListenerStatus {\n  NotAttached = 'not-attached',\n  Attached = 'attached',\n  Error = 'error',\n}\n\ninterface LayerEventListenerProps<T extends keyof MapLayerEventType> {\n  map: MaybeRef<Nullable<Map>>;\n  layer: MaybeRef<Nullable<LayerSpecification | string>>;\n  event: keyof MapLayerEventType;\n  on: (e: MapLayerEventType[T]) => void;\n  debug?: boolean;\n  once?: boolean;\n}\n\ninterface LayerEventListenerActions {\n  removeListener: () => void;\n  attachListener: () => void;\n  isListenerAttached: boolean;\n  listenerStatus: Readonly<LayerEventListenerStatus>;\n  layerId: string | null;\n}\n\n/**\n * Composable for managing MapLibre GL Layer Event Listeners\n * Provides reactive layer event listener with error handling, performance optimizations, and enhanced API\n *\n * @param props - Configuration options for the layer event listener\n * @returns Enhanced actions and state for the layer event listener\n */\nexport function useLayerEventListener<T extends keyof MapLayerEventType>(\n  props: LayerEventListenerProps<T>,\n): LayerEventListenerActions {\n  const { logError } = useLogger(props.debug ?? false);\n  const listenerStatus = ref<LayerEventListenerStatus>(\n    LayerEventListenerStatus.NotAttached,\n  );\n\n  // Computed properties for better reactivity and performance\n  const mapInstance = computed(() => unref(props.map));\n  const layerInstance = computed(() => unref(props.layer));\n  const layerId = computed(() => {\n    const layer = layerInstance.value;\n    return layer ? (typeof layer === 'string' ? layer : layer.id) : null;\n  });\n  const isListenerAttached = computed(\n    () => listenerStatus.value === LayerEventListenerStatus.Attached,\n  );\n\n  /**\n   * Enhanced layer event handler with error handling and debugging\n   * @param e - Layer event data\n   */\n  const layerEventFn = <K extends T>(e: MapLayerEventType[K]): void => {\n    try {\n      if (props.on) props.on(e);\n\n      // Remove listener if it's a one-time event\n      if (props.once) removeListener();\n    } catch (error) {\n      logError('Error in layer event handler:', error, {\n        event: props.event,\n        layerId: layerId.value,\n      });\n      listenerStatus.value = LayerEventListenerStatus.Error;\n    }\n  };\n\n  /**\n   * Validates if the layer event listener can be attached\n   * @returns boolean indicating if listener can be attached\n   */\n  function validateListenerAttachment(): boolean {\n    const map = mapInstance.value;\n    const currentLayerId = layerId.value;\n\n    if (!map) return false;\n\n    if (!currentLayerId) return false;\n\n    if (!hasLayer(map, currentLayerId)) return false;\n\n    return true;\n  }\n\n  /**\n   * Attaches the layer event listener to the map with error handling\n   */\n  function attachListener(): void {\n    if (!validateListenerAttachment()) return;\n\n    const map = mapInstance.value!;\n    const currentLayerId = layerId.value!;\n\n    if (listenerStatus.value === LayerEventListenerStatus.Attached) return;\n\n    try {\n      map.on<T>(props.event as T, currentLayerId, layerEventFn);\n      listenerStatus.value = LayerEventListenerStatus.Attached;\n    } catch (error) {\n      listenerStatus.value = LayerEventListenerStatus.Error;\n      logError('Error attaching layer event listener:', error, {\n        event: props.event,\n        layerId: currentLayerId,\n      });\n    }\n  }\n\n  /**\n   * Removes the layer event listener from the map with error handling\n   */\n  function removeListener(): void {\n    const map = mapInstance.value;\n    const currentLayerId = layerId.value;\n\n    if (!map || !currentLayerId) return;\n\n    if (listenerStatus.value === LayerEventListenerStatus.NotAttached) return;\n\n    try {\n      map.off<T>(props.event as T, currentLayerId, layerEventFn);\n      listenerStatus.value = LayerEventListenerStatus.NotAttached;\n    } catch (error) {\n      logError('Error removing layer event listener:', error, {\n        event: props.event,\n        layerId: currentLayerId,\n      });\n      // Still mark as not attached even if removal failed\n      listenerStatus.value = LayerEventListenerStatus.NotAttached;\n    }\n  }\n\n  // Optimized watch for map and layer changes with reduced overhead\n  let lastMapInstance: any = null;\n  let lastLayerInstance: any = null;\n  const stopEffect = watchEffect((onCleanUp) => {\n    const map = mapInstance.value;\n    const layer = layerInstance.value;\n\n    // Only process if instances actually changed\n    if (map === lastMapInstance && layer === lastLayerInstance) return;\n    lastMapInstance = map;\n    lastLayerInstance = layer;\n\n    if (\n      map &&\n      layer &&\n      listenerStatus.value === LayerEventListenerStatus.NotAttached\n    ) {\n      attachListener();\n    } else if (\n      (!map || !layer) &&\n      listenerStatus.value === LayerEventListenerStatus.Attached\n    ) {\n      removeListener();\n    }\n    onCleanUp(removeListener);\n  });\n\n  // Cleanup function for removing listener and stopping watchers\n  function cleanup(): void {\n    stopEffect();\n    removeListener();\n  }\n\n  // Automatic cleanup on component unmount\n  onUnmounted(cleanup);\n\n  return {\n    removeListener,\n    attachListener,\n    isListenerAttached: isListenerAttached.value,\n    listenerStatus: listenerStatus.value as Readonly<LayerEventListenerStatus>,\n    layerId: layerId.value,\n  };\n}\n","import { shallowRef, watchEffect, onUnmounted, computed, unref } from 'vue';\nimport { GeolocateControl } from 'maplibre-gl';\nimport { useLogger } from '@libs/composables';\nimport type { ShallowRef, MaybeRef } from 'vue';\nimport type { Nullable } from '@libs/types';\nimport type {\n  Map,\n  GeolocateControlOptions,\n  ControlPosition,\n} from 'maplibre-gl';\n\ninterface GeolocateControlProps {\n  map: MaybeRef<Nullable<Map>>;\n  position?: ControlPosition;\n  options?: GeolocateControlOptions;\n  debug?: boolean;\n}\n\ninterface GeolocateControlActions {\n  geolocateControl: ShallowRef<Nullable<GeolocateControl>>;\n  isControlAdded: ShallowRef<boolean>;\n  removeControl: () => void;\n  addControl: () => void;\n  trigger: () => void;\n}\n\n/**\n * Composable for managing MapLibre GL Geolocate Control\n * Provides reactive geolocate control with error handling and lifecycle management\n *\n * @param props - Configuration options for the geolocate control\n * @returns Actions and state for the geolocate control\n */\nexport function useGeolocateControl({\n  map,\n  position = 'bottom-right',\n  options = {},\n  debug = false,\n}: GeolocateControlProps): GeolocateControlActions {\n  const { logError } = useLogger(debug);\n  const geolocateControl = shallowRef<Nullable<GeolocateControl>>(null);\n  const isControlAdded = shallowRef<boolean>(false);\n\n  // Computed property for better reactivity and performance\n  const mapInstance = computed(() => unref(map));\n\n  /**\n   * Safely adds the geolocate control to the map\n   */\n  function addControl(): void {\n    const mapRef = mapInstance.value;\n\n    if (!mapRef) return;\n\n    if (geolocateControl.value && isControlAdded.value) return;\n\n    try {\n      if (!geolocateControl.value)\n        geolocateControl.value = new GeolocateControl(options);\n\n      mapRef.addControl(geolocateControl.value, position);\n      isControlAdded.value = true;\n    } catch (error) {\n      logError('Error adding geolocate control to map:', error);\n      // Reset state on error\n      geolocateControl.value = null;\n      isControlAdded.value = false;\n    }\n  }\n\n  /**\n   * Safely removes the geolocate control from the map\n   */\n  function removeControl(): void {\n    const mapRef = mapInstance.value;\n\n    if (!mapRef || !geolocateControl.value || !isControlAdded.value) return;\n\n    try {\n      mapRef.removeControl(geolocateControl.value);\n      isControlAdded.value = false;\n    } catch (error) {\n      logError('Error removing geolocate control from map:', error);\n      // Still reset state even if removal failed\n      isControlAdded.value = false;\n    } finally {\n      geolocateControl.value = null;\n    }\n  }\n\n  /**\n   * Triggers the geolocate functionality programmatically\n   */\n  function trigger(): void {\n    if (!geolocateControl.value) return;\n\n    try {\n      geolocateControl.value.trigger();\n    } catch (error) {\n      logError('Error triggering geolocate:', error);\n    }\n  }\n\n  // Watch for map changes and manage control lifecycle\n  const stopWatchEffect = watchEffect(() => {\n    const mapRef = mapInstance.value;\n\n    if (mapRef && !isControlAdded.value) {\n      addControl();\n    } else if (!mapRef && isControlAdded.value) {\n      removeControl();\n    }\n  });\n\n  // Cleanup function for removing control and stopping watchers\n  function cleanup(): void {\n    stopWatchEffect();\n    removeControl();\n  }\n\n  // Automatic cleanup on component unmount\n  onUnmounted(cleanup);\n\n  return {\n    geolocateControl,\n    isControlAdded,\n    removeControl,\n    addControl,\n    trigger,\n  };\n}\n","import {\n  unref,\n  shallowRef,\n  computed,\n  onUnmounted,\n  onMounted,\n  nextTick,\n  ref,\n} from 'vue';\nimport { getMainVersion, getNanoid, hasSource } from '@libs/helpers';\nimport { useMapReloadEvent, useLogger } from '@libs/composables';\nimport type { MaybeRef, ShallowRef } from 'vue';\nimport type { Nullable } from '@libs/types';\nimport type {\n  Map,\n  GeoJSONSource,\n  MapSourceDataEvent,\n  GeoJSONSourceSpecification,\n} from 'maplibre-gl';\n\n/**\n * Source creation status enum for better state management\n */\nexport enum SourceStatus {\n  NotCreated = 'not-created',\n  Creating = 'creating',\n  Created = 'created',\n  Error = 'error',\n}\n\nexport interface CreateGeoJsonSourceActions {\n  sourceId: string;\n  getSource: ShallowRef<Nullable<GeoJSONSource>>;\n  setData: (data: GeoJSONSourceSpecification['data']) => void;\n  removeSource: () => void;\n  refreshSource: () => void;\n  sourceStatus: Readonly<SourceStatus>;\n  isSourceReady: boolean;\n}\n\ninterface CreateGeoJsonSourceProps {\n  map: MaybeRef<Nullable<Map>>;\n  id?: string;\n  data: GeoJSONSourceSpecification['data'];\n  options?: Partial<GeoJSONSourceSpecification>;\n  debug?: boolean;\n  register?: (actions: CreateGeoJsonSourceActions, map: Map) => void;\n}\n\n/**\n * Default empty GeoJSON data structure\n */\nconst DEFAULT_GEOJSON_DATA: GeoJSONSourceSpecification['data'] = {\n  type: 'FeatureCollection',\n  features: [],\n};\n\n/**\n * Composable for creating and managing MapLibre GL GeoJSON Sources\n * Provides reactive GeoJSON source with error handling, performance optimizations, and enhanced API\n *\n * @param props - Configuration options for the GeoJSON source\n * @returns Enhanced actions and state for the GeoJSON source\n */\nexport function useCreateGeoJsonSource({\n  map: mapRef,\n  id,\n  data = DEFAULT_GEOJSON_DATA,\n  options = {},\n  debug = false,\n  register,\n}: CreateGeoJsonSourceProps): CreateGeoJsonSourceActions {\n  const { logError } = useLogger(debug);\n  const sourceId = getNanoid(id);\n  const source = shallowRef<Nullable<GeoJSONSource>>(null);\n  const sourceStatus = ref<SourceStatus>(SourceStatus.NotCreated);\n\n  // Computed properties for better reactivity and performance\n  const getSource = computed(() => source.value);\n  const mapInstance = computed(() => unref(mapRef));\n  const isSourceReady = computed(\n    () =>\n      sourceStatus.value === SourceStatus.Created &&\n      !!source.value &&\n      !!mapInstance.value &&\n      hasSource(mapInstance.value, sourceId),\n  );\n\n  useMapReloadEvent({\n    map: mapRef,\n    callbacks: {\n      onUnload: removeSource,\n      onLoad: initSource,\n    },\n    debug,\n  });\n\n  /**\n   * Handles source data events with enhanced error handling\n   * @param e - Map source data event\n   */\n  function sourcedataEventFn(e: MapSourceDataEvent): void {\n    try {\n      const map = mapInstance.value;\n      if (!map) return;\n\n      let isSourceLoaded = e.isSourceLoaded;\n      if (getMainVersion() > 0) isSourceLoaded = true;\n\n      if (!source.value && e.sourceId === sourceId && isSourceLoaded) {\n        source.value = map.getSource(sourceId) as GeoJSONSource;\n        sourceStatus.value = SourceStatus.Created;\n\n        register?.(\n          {\n            sourceId,\n            getSource,\n            setData,\n            removeSource,\n            refreshSource,\n            sourceStatus: sourceStatus.value as Readonly<SourceStatus>,\n            isSourceReady: isSourceReady.value,\n          },\n          map,\n        );\n        map.off('sourcedata', sourcedataEventFn);\n      }\n    } catch (error) {\n      sourceStatus.value = SourceStatus.Error;\n      logError('Error in source data event handler:', error);\n    }\n  }\n\n  /**\n   * Initializes the GeoJSON source with enhanced error handling\n   */\n  function initSource(): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    if (source.value || hasSource(map, sourceId)) return;\n\n    if (!data) return;\n\n    sourceStatus.value = SourceStatus.Creating;\n\n    try {\n      const sourceSpec: GeoJSONSourceSpecification = {\n        ...options,\n        type: 'geojson',\n        data,\n      };\n\n      map.addSource(sourceId, sourceSpec);\n      map.on('sourcedata', sourcedataEventFn);\n    } catch (error) {\n      sourceStatus.value = SourceStatus.Error;\n      logError('Error creating GeoJSON source:', error, { sourceId });\n    }\n  }\n\n  /**\n   * Sets new data for the GeoJSON source with error handling and validation\n   * @param newData - New GeoJSON data to set\n   */\n  function setData(newData: GeoJSONSourceSpecification['data']): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    if (!source.value || !hasSource(map, sourceId)) return;\n\n    if (!newData) return;\n\n    try {\n      source.value.setData(newData);\n    } catch (error) {\n      logError('Error setting GeoJSON source data:', error, { sourceId });\n    }\n  }\n\n  /**\n   * Removes the GeoJSON source with enhanced cleanup and error handling\n   */\n  function removeSource(): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    try {\n      if (hasSource(map, sourceId)) {\n        map.removeSource(sourceId);\n        map.off('sourcedata', sourcedataEventFn);\n      }\n    } catch (error) {\n      logError('Error removing GeoJSON source:', error, { sourceId });\n    } finally {\n      source.value = null;\n      sourceStatus.value = SourceStatus.NotCreated;\n    }\n  }\n\n  /**\n   * Refreshes the source by removing and recreating it\n   */\n  function refreshSource(): void {\n    removeSource();\n    initSource();\n  }\n\n  onMounted(async () => {\n    await nextTick();\n    initSource();\n  });\n\n  onUnmounted(() => {\n    removeSource();\n  });\n\n  return {\n    sourceId,\n    getSource,\n    setData,\n    removeSource,\n    refreshSource,\n    sourceStatus: sourceStatus.value as Readonly<SourceStatus>,\n    isSourceReady: isSourceReady.value,\n  };\n}\n","import { shallowRef, unref, computed, watch, ref } from 'vue';\nimport type { CreateBaseLayerActions, Nullable, LayerTypes } from '@libs/types';\nimport { getNanoid, hasLayer } from '@libs/helpers';\nimport { useMapReloadEvent, useLogger } from '@libs/composables';\nimport type { MaybeRef } from 'vue';\nimport type {\n  SourceSpecification,\n  FilterSpecification,\n  Map,\n  StyleSetterOptions,\n  LayerSpecification,\n} from 'maplibre-gl';\n\n/**\n * Layer creation status enum for better state management\n */\nexport enum LayerStatus {\n  NotCreated = 'not-created',\n  Creating = 'creating',\n  Created = 'created',\n  Error = 'error',\n}\n\nexport interface CreateBaseLayerProps<Layer extends LayerSpecification> {\n  map: MaybeRef<Nullable<Map>>;\n  id?: string;\n  source: MaybeRef<string | SourceSpecification | object | null | undefined>;\n  type: LayerTypes;\n  beforeId?: string;\n  filter?: FilterSpecification;\n  layout?: Layer['layout'];\n  paint?: Layer['paint'];\n  maxzoom?: number;\n  minzoom?: number;\n  metadata?: object;\n  sourceLayer?: string;\n  debug?: boolean;\n  register?: (actions: CreateBaseLayerActions<Layer>, map: Map) => void;\n}\n\nexport interface EnhancedLayerActions<Layer extends LayerSpecification>\n  extends CreateBaseLayerActions<Layer> {\n  layerStatus: Readonly<LayerStatus>;\n  isLayerReady: boolean;\n  refreshLayer: () => void;\n  updateLayer: (updates: {\n    filter?: FilterSpecification;\n    minzoom?: number;\n    maxzoom?: number;\n    paint?: Record<string, any>;\n    layout?: Record<string, any>;\n  }) => void;\n}\n\n/**\n * Composable for creating and managing MapLibre GL Layers\n * Provides reactive layer management with error handling, performance optimizations, and enhanced API\n *\n * @param cfg - Configuration options for the layer\n * @returns Enhanced actions and state for the layer\n */\nexport function useCreateLayer<Layer extends LayerSpecification>(\n  cfg: CreateBaseLayerProps<Layer>,\n): EnhancedLayerActions<Layer> {\n  const {\n    map: mapRef,\n    id,\n    source: sourceRef,\n    type,\n    beforeId,\n    filter = ['all'],\n    layout = {},\n    paint = {},\n    maxzoom = 24,\n    minzoom = 0,\n    metadata,\n    sourceLayer = '',\n    debug = false,\n    register,\n  } = cfg;\n\n  const { logWarn, logError } = useLogger(debug);\n  const layerId = getNanoid(id);\n  const layer = shallowRef<Nullable<Layer>>(null);\n  const layerStatus = ref<LayerStatus>(LayerStatus.NotCreated);\n\n  // Computed properties for better reactivity and performance\n  const getLayer = computed(() => layer.value);\n  const mapInstance = computed(() => unref(mapRef));\n  const sourceInstance = computed(() => unref(sourceRef));\n  const isLayerReady = computed(\n    () =>\n      layerStatus.value === LayerStatus.Created &&\n      !!layer.value &&\n      !!mapInstance.value &&\n      hasLayer(mapInstance.value, layerId),\n  );\n\n  // Watch for source changes and manage layer lifecycle\n  watch(\n    sourceInstance,\n    (source) => {\n      if (source) createLayer();\n      else removeLayer();\n    },\n    { immediate: false },\n  );\n\n  // Handle map reload events\n  useMapReloadEvent({\n    map: mapRef,\n    callbacks: {\n      onUnload: removeLayer,\n      onLoad: createLayer,\n    },\n    debug,\n  });\n\n  /**\n   * Validates if layer operations can be performed safely\n   * @returns boolean indicating if layer is ready for operations\n   */\n  function validateLayerOperation(): boolean {\n    const map = mapInstance.value;\n    if (!map || !layer.value || !hasLayer(map, layerId)) return false;\n    return true;\n  }\n\n  /**\n   * Sets the layer position relative to other layers with error handling\n   * @param beforeIdVal - ID of the layer to insert this layer before\n   */\n  function setBeforeId(beforeIdVal?: string): void {\n    if (!validateLayerOperation()) return;\n\n    try {\n      const map = mapInstance.value!;\n      map.moveLayer(layerId, beforeIdVal);\n    } catch (error) {\n      logError('Error setting layer position:', error);\n    }\n  }\n\n  /**\n   * Sets the layer filter with error handling and validation\n   * @param filterVal - Filter specification for the layer\n   */\n  function setFilter(filterVal: FilterSpecification = ['all']): void {\n    if (!validateLayerOperation()) return;\n\n    try {\n      const map = mapInstance.value!;\n      map.setFilter(layerId, filterVal);\n    } catch (error) {\n      logError('Error setting layer filter:', error);\n    }\n  }\n\n  /**\n   * Sets the layer zoom range with validation and error handling\n   * @param minzoomVal - Minimum zoom level (default: 0)\n   * @param maxzoomVal - Maximum zoom level (default: 24)\n   */\n  function setZoomRange(minzoomVal = 0, maxzoomVal = 24): void {\n    if (!validateLayerOperation()) return;\n\n    // Validate zoom range\n    if (minzoomVal < 0 || maxzoomVal > 24 || minzoomVal >= maxzoomVal) return;\n    try {\n      const map = mapInstance.value!;\n      map.setLayerZoomRange(layerId, minzoomVal, maxzoomVal);\n    } catch (error) {\n      logError('Error setting layer zoom range:', error);\n    }\n  }\n\n  /**\n   * Sets a paint property with error handling and validation\n   * @param name - Property name\n   * @param value - Property value\n   * @param options - Style setter options\n   */\n  function setPaintProperty(\n    name: string,\n    value: any,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    if (!validateLayerOperation()) return;\n\n    try {\n      const map = mapInstance.value!;\n      map.setPaintProperty(layerId, name, value, options);\n    } catch (error) {\n      logError('Error setting paint property:', error, {\n        property: name,\n        value,\n      });\n    }\n  }\n\n  /**\n   * Sets a layout property with error handling and validation\n   * @param name - Property name\n   * @param value - Property value\n   * @param options - Style setter options\n   */\n  function setLayoutProperty(\n    name: string,\n    value: any,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    if (!validateLayerOperation()) return;\n\n    try {\n      const map = mapInstance.value!;\n      map.setLayoutProperty(layerId, name, value, options);\n    } catch (error) {\n      logError('Error setting layout property:', error, {\n        property: name,\n        value,\n      });\n    }\n  }\n\n  /**\n   * Resolves source data from various input types\n   * @param source - Source input (string, object, or specification)\n   * @returns Resolved source data or null if invalid\n   */\n  function resolveSourceData(source: any): string | null {\n    if (typeof source === 'string') {\n      return source;\n    }\n\n    if (typeof source === 'object' && source !== null) {\n      if ('id' in source && typeof source.id === 'string') {\n        return source.id;\n      }\n      // For source specifications, we need to return the source ID\n      // This assumes the source has already been added to the map\n      if ('type' in source) {\n        logWarn(\n          'Warning: Source specification provided, ensure source is added to map first',\n        );\n        return source.id || '';\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Creates the layer with comprehensive error handling and validation\n   */\n  function createLayer(): void {\n    const map = mapInstance.value;\n    const source = sourceInstance.value;\n\n    // Early validation\n    if (!map) return;\n\n    if (!source) return;\n\n    if (layer.value || hasLayer(map, layerId)) return;\n\n    layerStatus.value = LayerStatus.Creating;\n\n    try {\n      const sourceData = resolveSourceData(source);\n      if (!sourceData) {\n        layerStatus.value = LayerStatus.Error;\n        return;\n      }\n\n      const layerSpec = {\n        id: layerId,\n        type,\n        source: sourceData,\n        layout: layout || {},\n        paint: paint || {},\n        'source-layer': sourceLayer,\n        minzoom,\n        maxzoom,\n        metadata,\n        filter,\n      } as LayerSpecification;\n\n      map.addLayer(layerSpec, beforeId);\n      layer.value = map.getLayer(layerId) as unknown as Layer;\n      layerStatus.value = LayerStatus.Created;\n\n      // Register the enhanced actions\n      register?.(\n        {\n          layerId,\n          getLayer,\n          removeLayer,\n          setBeforeId,\n          setFilter,\n          setZoomRange,\n          setPaintProperty,\n          setLayoutProperty,\n        },\n        map,\n      );\n    } catch (error) {\n      layerStatus.value = LayerStatus.Error;\n      logError('Error creating layer:', error, { layerId, type });\n\n      // Cleanup on error\n      if (hasLayer(map, layerId)) {\n        try {\n          map.removeLayer(layerId);\n        } catch (cleanupError) {\n          logError('Error during layer cleanup:', cleanupError);\n        }\n      }\n      layer.value = null;\n    }\n  }\n\n  /**\n   * Removes the layer with error handling and cleanup\n   */\n  function removeLayer(): void {\n    const map = mapInstance.value;\n\n    if (!map) return;\n\n    try {\n      if (hasLayer(map, layerId)) {\n        map.removeLayer(layerId);\n      }\n    } catch (error) {\n      logError('Error removing layer:', error, { layerId });\n    } finally {\n      layer.value = null;\n      layerStatus.value = LayerStatus.NotCreated;\n    }\n  }\n\n  /**\n   * Refreshes the layer by removing and recreating it\n   */\n  function refreshLayer(): void {\n    removeLayer();\n    createLayer();\n  }\n\n  /**\n   * Updates layer properties in batch\n   * @param updates - Object containing layer property updates\n   */\n  function updateLayer(updates: {\n    filter?: FilterSpecification;\n    minzoom?: number;\n    maxzoom?: number;\n    paint?: Record<string, any>;\n    layout?: Record<string, any>;\n  }): void {\n    if (!validateLayerOperation()) return;\n\n    try {\n      // Update filter if provided\n      if (updates.filter !== undefined) {\n        setFilter(updates.filter);\n      }\n\n      // Update zoom range if provided\n      if (updates.minzoom !== undefined || updates.maxzoom !== undefined) {\n        setZoomRange(updates.minzoom, updates.maxzoom);\n      }\n\n      // Update paint properties\n      if (updates.paint) {\n        Object.entries(updates.paint).forEach(([key, value]) => {\n          setPaintProperty(key, value);\n        });\n      }\n\n      // Update layout properties\n      if (updates.layout) {\n        Object.entries(updates.layout).forEach(([key, value]) => {\n          setLayoutProperty(key, value);\n        });\n      }\n    } catch (error) {\n      logError('Error updating layer:', error, { layerId, updates });\n    }\n  }\n\n  return {\n    layerId,\n    getLayer,\n    removeLayer,\n    setBeforeId,\n    setFilter,\n    setZoomRange,\n    setPaintProperty,\n    setLayoutProperty,\n    layerStatus: layerStatus.value as Readonly<LayerStatus>,\n    isLayerReady: isLayerReady.value,\n    refreshLayer,\n    updateLayer,\n  };\n}\n","import { computed } from 'vue';\nimport { useCreateLayer, useLogger } from '@libs/composables';\nimport { filterStylePropertiesByKeys } from '@libs/helpers';\nimport type {\n  CreateLayerActions,\n  Nullable,\n  FillLayout,\n  FillPaint,\n  FillLayerStyle,\n} from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type {\n  Map,\n  SourceSpecification,\n  FilterSpecification,\n  FillLayerSpecification,\n  StyleSetterOptions,\n} from 'maplibre-gl';\n\ntype Layer = FillLayerSpecification;\ntype Layout = FillLayout;\ntype Paint = FillPaint;\n\n/**\n * Paint properties for fill layers\n * Comprehensive list of all supported fill paint properties\n */\nconst FILL_PAINT_KEYS: (keyof Paint)[] = [\n  'fill-antialias',\n  'fill-opacity',\n  'fill-color',\n  'fill-outline-color',\n  'fill-translate',\n  'fill-translate-anchor',\n  'fill-pattern',\n];\n\n/**\n * Layout properties for fill layers\n * Comprehensive list of all supported fill layout properties\n */\nconst FILL_LAYOUT_KEYS: (keyof Layout)[] = ['fill-sort-key', 'visibility'];\n\ninterface CreateFillLayerProps {\n  map: MaybeRef<Nullable<Map>>;\n  source: MaybeRef<string | SourceSpecification | object | null>;\n  id?: string;\n  beforeId?: string;\n  filter?: FilterSpecification;\n  style?: FillLayerStyle;\n  maxzoom?: number;\n  minzoom?: number;\n  metadata?: object;\n  sourceLayer?: string;\n  debug?: boolean;\n  register?: (actions: CreateLayerActions<Layer>, map: Map) => void;\n}\n\ninterface FillLayerActions extends CreateLayerActions<Layer> {\n  setStyle: (styleVal?: FillLayerStyle) => void;\n  setOpacity: (opacity: number, options?: StyleSetterOptions) => void;\n  setColor: (color: string, options?: StyleSetterOptions) => void;\n  setOutlineColor: (color: string, options?: StyleSetterOptions) => void;\n  setPattern: (pattern: string, options?: StyleSetterOptions) => void;\n  setAntialias: (antialias: boolean, options?: StyleSetterOptions) => void;\n  setVisibility: (\n    visibility: 'visible' | 'none',\n    options?: StyleSetterOptions,\n  ) => void;\n  setSortKey: (sortKey: number, options?: StyleSetterOptions) => void;\n}\n\n/**\n * Composable for creating and managing MapLibre GL Fill Layers\n * Provides reactive fill layer with error handling, performance optimizations, and enhanced API\n *\n * @param props - Configuration options for the fill layer\n * @returns Enhanced actions and state for the fill layer\n */\nexport function useCreateFillLayer(\n  props: CreateFillLayerProps,\n): FillLayerActions {\n  const { logWarn, logError } = useLogger(props.debug ?? false);\n\n  // Memoized style processing for better performance\n  const styleConfig = computed(() => {\n    const style = props.style || {};\n    return {\n      paint: filterStylePropertiesByKeys(style, FILL_PAINT_KEYS),\n      layout: filterStylePropertiesByKeys(style, FILL_LAYOUT_KEYS),\n    };\n  });\n\n  const { setLayoutProperty, setPaintProperty, ...actions } =\n    useCreateLayer<Layer>({\n      map: props.map,\n      source: props.source,\n      type: 'fill',\n      id: props.id,\n      beforeId: props.beforeId,\n      filter: props.filter,\n      layout: styleConfig.value.layout as any,\n      paint: styleConfig.value.paint as any,\n      maxzoom: props.maxzoom,\n      minzoom: props.minzoom,\n      metadata: props.metadata,\n      sourceLayer: props.sourceLayer,\n      debug: props.debug,\n      register: (actions, map) => {\n        props.register?.(\n          {\n            ...actions,\n            setStyle,\n            setOpacity,\n            setColor,\n            setOutlineColor,\n            setPattern,\n            setAntialias,\n            setVisibility,\n            setSortKey,\n          } as FillLayerActions,\n          map,\n        );\n      },\n    });\n\n  /**\n   * Updates multiple style properties at once with error handling\n   * @param styleVal - Style object containing paint and layout properties\n   */\n  function setStyle(styleVal: FillLayerStyle = {}): void {\n    try {\n      const styleKeys = Object.keys(styleVal);\n\n      styleKeys.forEach((key) => {\n        const typedKey = key as keyof FillLayerStyle;\n        const value = styleVal[typedKey];\n\n        if (value === undefined) return;\n\n        if (FILL_PAINT_KEYS.includes(typedKey as keyof Paint)) {\n          setPaintProperty(key, value, { validate: false });\n        } else if (FILL_LAYOUT_KEYS.includes(typedKey as keyof Layout)) {\n          setLayoutProperty(key, value, { validate: false });\n        }\n      });\n    } catch (error) {\n      logError('Error updating fill layer style:', error);\n    }\n  }\n\n  /**\n   * Sets the fill opacity with error handling and validation\n   * @param opacity - Fill opacity value (0-1)\n   * @param options - Style setter options\n   */\n  function setOpacity(\n    opacity: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      if (opacity < 0 || opacity > 1) {\n        logWarn('Warning: Fill opacity should be between 0 and 1', { opacity });\n      }\n      setPaintProperty('fill-opacity', opacity, options);\n    } catch (error) {\n      logError('Error setting fill opacity:', error);\n    }\n  }\n\n  /**\n   * Sets the fill color with error handling\n   * @param color - Fill color value\n   * @param options - Style setter options\n   */\n  function setColor(\n    color: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('fill-color', color, options);\n    } catch (error) {\n      logError('Error setting fill color:', error);\n    }\n  }\n\n  /**\n   * Sets the fill outline color with error handling\n   * @param color - Outline color value\n   * @param options - Style setter options\n   */\n  function setOutlineColor(\n    color: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('fill-outline-color', color, options);\n    } catch (error) {\n      logError('Error setting fill outline color:', error);\n    }\n  }\n\n  /**\n   * Sets the fill pattern with error handling\n   * @param pattern - Pattern image name\n   * @param options - Style setter options\n   */\n  function setPattern(\n    pattern: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('fill-pattern', pattern, options);\n    } catch (error) {\n      logError('Error setting fill pattern:', error);\n    }\n  }\n\n  /**\n   * Sets the fill antialias with error handling\n   * @param antialias - Antialias boolean value\n   * @param options - Style setter options\n   */\n  function setAntialias(\n    antialias: boolean,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('fill-antialias', antialias, options);\n    } catch (error) {\n      logError('Error setting fill antialias:', error);\n    }\n  }\n\n  /**\n   * Sets the layer visibility with error handling\n   * @param visibility - Visibility value ('visible' | 'none')\n   * @param options - Style setter options\n   */\n  function setVisibility(\n    visibility: 'visible' | 'none',\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('visibility', visibility, options);\n    } catch (error) {\n      logError('Error setting fill layer visibility:', error);\n    }\n  }\n\n  /**\n   * Sets the fill sort key with error handling\n   * @param sortKey - Sort key value for layer ordering\n   * @param options - Style setter options\n   */\n  function setSortKey(\n    sortKey: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('fill-sort-key', sortKey, options);\n    } catch (error) {\n      logError('Error setting fill sort key:', error);\n    }\n  }\n\n  return {\n    ...actions,\n    setStyle,\n    setLayoutProperty,\n    setPaintProperty,\n    setOpacity,\n    setColor,\n    setOutlineColor,\n    setPattern,\n    setAntialias,\n    setVisibility,\n    setSortKey,\n  };\n}\n","import { computed } from 'vue';\nimport { useCreateLayer, useLogger } from '@libs/composables';\nimport { filterStylePropertiesByKeys } from '@libs/helpers';\nimport type {\n  CreateLayerActions,\n  Nullable,\n  CircleLayout,\n  CirclePaint,\n  CircleLayerStyle,\n} from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type {\n  Map,\n  SourceSpecification,\n  FilterSpecification,\n  CircleLayerSpecification,\n  StyleSetterOptions,\n} from 'maplibre-gl';\n\ntype Layer = CircleLayerSpecification;\ntype Layout = CircleLayout;\ntype Paint = CirclePaint;\n\n/**\n * Paint properties for circle layers\n * Comprehensive list of all supported circle paint properties\n */\nconst CIRCLE_PAINT_KEYS: (keyof Paint)[] = [\n  'circle-radius',\n  'circle-color',\n  'circle-blur',\n  'circle-opacity',\n  'circle-translate',\n  'circle-translate-anchor',\n  'circle-pitch-scale',\n  'circle-pitch-alignment',\n  'circle-stroke-width',\n  'circle-stroke-color',\n  'circle-stroke-opacity',\n];\n\n/**\n * Layout properties for circle layers\n * Comprehensive list of all supported circle layout properties\n */\nconst CIRCLE_LAYOUT_KEYS: (keyof Layout)[] = ['circle-sort-key', 'visibility'];\n\ninterface CreateCircleLayerProps {\n  map: MaybeRef<Nullable<Map>>;\n  source: MaybeRef<string | SourceSpecification | object | null>;\n  id?: string;\n  beforeId?: string;\n  filter?: FilterSpecification;\n  style?: CircleLayerStyle;\n  maxzoom?: number;\n  minzoom?: number;\n  metadata?: object;\n  sourceLayer?: string;\n  debug?: boolean;\n  register?: (actions: CreateLayerActions<Layer>, map: Map) => void;\n}\n\ninterface CircleLayerActions extends CreateLayerActions<Layer> {\n  setStyle: (styleVal?: CircleLayerStyle) => void;\n  setRadius: (radius: number | string, options?: StyleSetterOptions) => void;\n  setColor: (color: string, options?: StyleSetterOptions) => void;\n  setOpacity: (opacity: number, options?: StyleSetterOptions) => void;\n  setStrokeWidth: (width: number, options?: StyleSetterOptions) => void;\n  setStrokeColor: (color: string, options?: StyleSetterOptions) => void;\n  setStrokeOpacity: (opacity: number, options?: StyleSetterOptions) => void;\n  setVisibility: (\n    visibility: 'visible' | 'none',\n    options?: StyleSetterOptions,\n  ) => void;\n}\n\n/**\n * Composable for creating and managing MapLibre GL Circle Layers\n * Provides reactive circle layer with error handling, performance optimizations, and enhanced API\n *\n * @param props - Configuration options for the circle layer\n * @returns Enhanced actions and state for the circle layer\n */\nexport function useCreateCircleLayer(\n  props: CreateCircleLayerProps,\n): CircleLayerActions {\n  const { logError, logWarn } = useLogger(props.debug ?? false);\n\n  // Memoized style processing for better performance\n  const styleConfig = computed(() => {\n    const style = props.style || {};\n    return {\n      paint: filterStylePropertiesByKeys(style, CIRCLE_PAINT_KEYS),\n      layout: filterStylePropertiesByKeys(style, CIRCLE_LAYOUT_KEYS),\n    };\n  });\n\n  const { setLayoutProperty, setPaintProperty, ...actions } =\n    useCreateLayer<Layer>({\n      map: props.map,\n      source: props.source,\n      type: 'circle',\n      id: props.id,\n      beforeId: props.beforeId,\n      filter: props.filter,\n      layout: styleConfig.value.layout as any,\n      paint: styleConfig.value.paint as any,\n      maxzoom: props.maxzoom,\n      minzoom: props.minzoom,\n      metadata: props.metadata,\n      sourceLayer: props.sourceLayer,\n      register: (actions, map) => {\n        props.register?.(\n          {\n            ...actions,\n            setStyle,\n            setRadius,\n            setColor,\n            setOpacity,\n            setStrokeWidth,\n            setStrokeColor,\n            setStrokeOpacity,\n            setVisibility,\n          } as CircleLayerActions,\n          map,\n        );\n      },\n    });\n\n  /**\n   * Updates multiple style properties at once with error handling\n   * @param styleVal - Style object containing paint and layout properties\n   */\n  function setStyle(styleVal: CircleLayerStyle = {}): void {\n    if (!styleVal || typeof styleVal !== 'object') return;\n\n    try {\n      const styleKeys = Object.keys(styleVal);\n\n      styleKeys.forEach((key) => {\n        const typedKey = key as keyof CircleLayerStyle;\n        const value = styleVal[typedKey];\n\n        if (value === undefined) return;\n\n        if (CIRCLE_PAINT_KEYS.includes(typedKey as keyof Paint)) {\n          setPaintProperty(key, value, { validate: false });\n        } else if (CIRCLE_LAYOUT_KEYS.includes(typedKey as keyof Layout)) {\n          setLayoutProperty(key, value, { validate: false });\n        }\n      });\n    } catch (error) {\n      logError('Error updating circle layer style:', error);\n    }\n  }\n\n  /**\n   * Sets the circle radius with error handling\n   * @param radius - Circle radius value\n   * @param options - Style setter options\n   */\n  function setRadius(\n    radius: number | string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('circle-radius', radius, options);\n    } catch (error) {\n      logError('Error setting circle radius:', error);\n    }\n  }\n\n  /**\n   * Sets the circle color with error handling\n   * @param color - Circle color value\n   * @param options - Style setter options\n   */\n  function setColor(\n    color: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('circle-color', color, options);\n    } catch (error) {\n      logError('Error setting circle color:', error);\n    }\n  }\n\n  /**\n   * Sets the circle opacity with error handling\n   * @param opacity - Circle opacity value (0-1)\n   * @param options - Style setter options\n   */\n  function setOpacity(\n    opacity: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      if (opacity < 0 || opacity > 1) {\n        logWarn('Warning: Circle opacity should be between 0 and 1', {\n          opacity,\n        });\n      }\n      setPaintProperty('circle-opacity', opacity, options);\n    } catch (error) {\n      logError('Error setting circle opacity:', error);\n    }\n  }\n\n  /**\n   * Sets the circle stroke width with error handling\n   * @param width - Stroke width value\n   * @param options - Style setter options\n   */\n  function setStrokeWidth(\n    width: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('circle-stroke-width', width, options);\n    } catch (error) {\n      logError('Error setting circle stroke width:', error);\n    }\n  }\n\n  /**\n   * Sets the circle stroke color with error handling\n   * @param color - Stroke color value\n   * @param options - Style setter options\n   */\n  function setStrokeColor(\n    color: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('circle-stroke-color', color, options);\n    } catch (error) {\n      logError('Error setting circle stroke color:', error);\n    }\n  }\n\n  /**\n   * Sets the circle stroke opacity with error handling\n   * @param opacity - Stroke opacity value (0-1)\n   * @param options - Style setter options\n   */\n  function setStrokeOpacity(\n    opacity: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      if (opacity < 0 || opacity > 1) {\n        logWarn('Warning: Circle stroke opacity should be between 0 and 1', {\n          opacity,\n        });\n      }\n      setPaintProperty('circle-stroke-opacity', opacity, options);\n    } catch (error) {\n      logError('Error setting circle stroke opacity:', error);\n    }\n  }\n\n  /**\n   * Sets the layer visibility with error handling\n   * @param visibility - Visibility value ('visible' | 'none')\n   * @param options - Style setter options\n   */\n  function setVisibility(\n    visibility: 'visible' | 'none',\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('visibility', visibility, options);\n    } catch (error) {\n      logError('Error setting circle layer visibility:', error);\n    }\n  }\n\n  return {\n    ...actions,\n    setStyle,\n    setLayoutProperty,\n    setPaintProperty,\n    setRadius,\n    setColor,\n    setOpacity,\n    setStrokeWidth,\n    setStrokeColor,\n    setStrokeOpacity,\n    setVisibility,\n  };\n}\n","import { computed } from 'vue';\nimport { useCreateLayer, useLogger } from '@libs/composables';\nimport { filterStylePropertiesByKeys } from '@libs/helpers';\nimport type {\n  CreateLayerActions,\n  Nullable,\n  LineLayout,\n  LinePaint,\n  LineLayerStyle,\n} from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type {\n  Map,\n  SourceSpecification,\n  FilterSpecification,\n  LineLayerSpecification,\n  StyleSetterOptions,\n} from 'maplibre-gl';\n\ntype Layer = LineLayerSpecification;\ntype Layout = LineLayout;\ntype Paint = LinePaint;\n\n/**\n * Paint properties for line layers\n * Comprehensive list of all supported line paint properties\n */\nconst LINE_PAINT_KEYS: (keyof Paint)[] = [\n  'line-opacity',\n  'line-color',\n  'line-translate',\n  'line-translate-anchor',\n  'line-width',\n  'line-gap-width',\n  'line-offset',\n  'line-blur',\n  'line-dasharray',\n  'line-pattern',\n  'line-gradient',\n];\n\n/**\n * Layout properties for line layers\n * Comprehensive list of all supported line layout properties\n */\nconst LINE_LAYOUT_KEYS: (keyof Layout)[] = [\n  'line-cap',\n  'line-join',\n  'line-miter-limit',\n  'line-round-limit',\n  'line-sort-key',\n  'visibility',\n];\n\ninterface CreateLineLayerProps {\n  map: MaybeRef<Nullable<Map>>;\n  source: MaybeRef<string | SourceSpecification | object | null>;\n  id?: string;\n  beforeId?: string;\n  filter?: FilterSpecification;\n  style?: LineLayerStyle;\n  maxzoom?: number;\n  minzoom?: number;\n  metadata?: object;\n  sourceLayer?: string;\n  debug?: boolean;\n  register?: (actions: CreateLayerActions<Layer>, map: Map) => void;\n}\n\ninterface LineLayerActions extends CreateLayerActions<Layer> {\n  setStyle: (styleVal?: LineLayerStyle) => void;\n  setOpacity: (opacity: number, options?: StyleSetterOptions) => void;\n  setColor: (color: string, options?: StyleSetterOptions) => void;\n  setWidth: (width: number | string, options?: StyleSetterOptions) => void;\n  setGapWidth: (gapWidth: number, options?: StyleSetterOptions) => void;\n  setOffset: (offset: number, options?: StyleSetterOptions) => void;\n  setBlur: (blur: number, options?: StyleSetterOptions) => void;\n  setDashArray: (dashArray: number[], options?: StyleSetterOptions) => void;\n  setPattern: (pattern: string, options?: StyleSetterOptions) => void;\n  setGradient: (gradient: string, options?: StyleSetterOptions) => void;\n  setCap: (\n    cap: 'butt' | 'round' | 'square',\n    options?: StyleSetterOptions,\n  ) => void;\n  setJoin: (\n    join: 'bevel' | 'round' | 'miter',\n    options?: StyleSetterOptions,\n  ) => void;\n  setVisibility: (\n    visibility: 'visible' | 'none',\n    options?: StyleSetterOptions,\n  ) => void;\n  setSortKey: (sortKey: number, options?: StyleSetterOptions) => void;\n}\n\n/**\n * Composable for creating and managing MapLibre GL Line Layers\n * Provides reactive line layer with error handling, performance optimizations, and enhanced API\n *\n * @param props - Configuration options for the line layer\n * @returns Enhanced actions and state for the line layer\n */\nexport function useCreateLineLayer(\n  props: CreateLineLayerProps,\n): LineLayerActions {\n  const { logError, logWarn } = useLogger(props.debug ?? false);\n\n  // Memoized style processing for better performance\n  const styleConfig = computed(() => {\n    const style = props.style || {};\n    return {\n      paint: filterStylePropertiesByKeys(style, LINE_PAINT_KEYS),\n      layout: filterStylePropertiesByKeys(style, LINE_LAYOUT_KEYS),\n    };\n  });\n\n  const { setLayoutProperty, setPaintProperty, ...actions } =\n    useCreateLayer<Layer>({\n      map: props.map,\n      source: props.source,\n      type: 'line',\n      id: props.id,\n      beforeId: props.beforeId,\n      filter: props.filter,\n      layout: styleConfig.value.layout as any,\n      paint: styleConfig.value.paint as any,\n      maxzoom: props.maxzoom,\n      minzoom: props.minzoom,\n      metadata: props.metadata,\n      sourceLayer: props.sourceLayer,\n      debug: props.debug,\n      register: (actions, map) => {\n        props.register?.(\n          {\n            ...actions,\n            setStyle,\n            setOpacity,\n            setColor,\n            setWidth,\n            setGapWidth,\n            setOffset,\n            setBlur,\n            setDashArray,\n            setPattern,\n            setGradient,\n            setCap,\n            setJoin,\n            setVisibility,\n            setSortKey,\n          } as LineLayerActions,\n          map,\n        );\n      },\n    });\n\n  /**\n   * Updates multiple style properties at once with error handling\n   * @param styleVal - Style object containing paint and layout properties\n   */\n  function setStyle(styleVal: LineLayerStyle = {}): void {\n    if (!styleVal || typeof styleVal !== 'object') return;\n\n    try {\n      const styleKeys = Object.keys(styleVal);\n\n      styleKeys.forEach((key) => {\n        const typedKey = key as keyof LineLayerStyle;\n        const value = styleVal[typedKey];\n\n        if (value === undefined) return;\n\n        if (LINE_PAINT_KEYS.includes(typedKey as keyof Paint)) {\n          setPaintProperty(key, value, { validate: false });\n        } else if (LINE_LAYOUT_KEYS.includes(typedKey as keyof Layout)) {\n          setLayoutProperty(key, value, { validate: false });\n        }\n      });\n    } catch (error) {\n      logError('Error updating line layer style:', error);\n    }\n  }\n\n  /**\n   * Sets the line opacity with error handling and validation\n   * @param opacity - Line opacity value (0-1)\n   * @param options - Style setter options\n   */\n  function setOpacity(\n    opacity: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      if (opacity < 0 || opacity > 1) {\n        logWarn('Warning: Line opacity should be between 0 and 1', { opacity });\n      }\n      setPaintProperty('line-opacity', opacity, options);\n    } catch (error) {\n      logError('Error setting line opacity:', error);\n    }\n  }\n\n  /**\n   * Sets the line color with error handling\n   * @param color - Line color value\n   * @param options - Style setter options\n   */\n  function setColor(\n    color: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('line-color', color, options);\n    } catch (error) {\n      logError('Error setting line color:', error);\n    }\n  }\n\n  /**\n   * Sets the line width with error handling\n   * @param width - Line width value\n   * @param options - Style setter options\n   */\n  function setWidth(\n    width: number | string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('line-width', width, options);\n    } catch (error) {\n      logError('Error setting line width:', error);\n    }\n  }\n\n  /**\n   * Sets the line gap width with error handling\n   * @param gapWidth - Gap width value for creating line outlines\n   * @param options - Style setter options\n   */\n  function setGapWidth(\n    gapWidth: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('line-gap-width', gapWidth, options);\n    } catch (error) {\n      logError('Error setting line gap width:', error);\n    }\n  }\n\n  /**\n   * Sets the line offset with error handling\n   * @param offset - Line offset value\n   * @param options - Style setter options\n   */\n  function setOffset(\n    offset: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('line-offset', offset, options);\n    } catch (error) {\n      logError('Error setting line offset:', error);\n    }\n  }\n\n  /**\n   * Sets the line blur with error handling\n   * @param blur - Line blur value\n   * @param options - Style setter options\n   */\n  function setBlur(\n    blur: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('line-blur', blur, options);\n    } catch (error) {\n      logError('Error setting line blur:', error);\n    }\n  }\n\n  /**\n   * Sets the line dash array with error handling\n   * @param dashArray - Array of dash lengths for creating dashed lines\n   * @param options - Style setter options\n   */\n  function setDashArray(\n    dashArray: number[],\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      if (!Array.isArray(dashArray)) {\n        logWarn('Warning: Dash array should be an array of numbers', {\n          dashArray,\n        });\n      }\n      setPaintProperty('line-dasharray', dashArray, options);\n    } catch (error) {\n      logError('Error setting line dash array:', error);\n    }\n  }\n\n  /**\n   * Sets the line pattern with error handling\n   * @param pattern - Pattern image name\n   * @param options - Style setter options\n   */\n  function setPattern(\n    pattern: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('line-pattern', pattern, options);\n    } catch (error) {\n      logError('Error setting line pattern:', error);\n    }\n  }\n\n  /**\n   * Sets the line gradient with error handling\n   * @param gradient - Gradient expression for line coloring\n   * @param options - Style setter options\n   */\n  function setGradient(\n    gradient: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('line-gradient', gradient, options);\n    } catch (error) {\n      logError('Error setting line gradient:', error);\n    }\n  }\n\n  /**\n   * Sets the line cap style with error handling\n   * @param cap - Line cap style ('butt' | 'round' | 'square')\n   * @param options - Style setter options\n   */\n  function setCap(\n    cap: 'butt' | 'round' | 'square',\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('line-cap', cap, options);\n    } catch (error) {\n      logError('Error setting line cap:', error);\n    }\n  }\n\n  /**\n   * Sets the line join style with error handling\n   * @param join - Line join style ('bevel' | 'round' | 'miter')\n   * @param options - Style setter options\n   */\n  function setJoin(\n    join: 'bevel' | 'round' | 'miter',\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('line-join', join, options);\n    } catch (error) {\n      logError('Error setting line join:', error);\n    }\n  }\n\n  /**\n   * Sets the layer visibility with error handling\n   * @param visibility - Visibility value ('visible' | 'none')\n   * @param options - Style setter options\n   */\n  function setVisibility(\n    visibility: 'visible' | 'none',\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('visibility', visibility, options);\n    } catch (error) {\n      logError('Error setting line layer visibility:', error);\n    }\n  }\n\n  /**\n   * Sets the line sort key with error handling\n   * @param sortKey - Sort key value for layer ordering\n   * @param options - Style setter options\n   */\n  function setSortKey(\n    sortKey: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('line-sort-key', sortKey, options);\n    } catch (error) {\n      logError('Error setting line sort key:', error);\n    }\n  }\n\n  return {\n    ...actions,\n    setStyle,\n    setLayoutProperty,\n    setPaintProperty,\n    setOpacity,\n    setColor,\n    setWidth,\n    setGapWidth,\n    setOffset,\n    setBlur,\n    setDashArray,\n    setPattern,\n    setGradient,\n    setCap,\n    setJoin,\n    setVisibility,\n    setSortKey,\n  };\n}\n","import { computed } from 'vue';\nimport { useCreateLayer, useLogger } from '@libs/composables';\nimport { filterStylePropertiesByKeys } from '@libs/helpers';\nimport type {\n  CreateLayerActions,\n  Nullable,\n  SymbolLayout,\n  SymbolPaint,\n  SymbolLayerStyle,\n} from '@libs/types';\nimport type { MaybeRef } from 'vue';\nimport type {\n  Map,\n  SourceSpecification,\n  FilterSpecification,\n  SymbolLayerSpecification,\n  StyleSetterOptions,\n} from 'maplibre-gl';\n\ntype Layer = SymbolLayerSpecification;\ntype Layout = SymbolLayout;\ntype Paint = SymbolPaint;\n\n/**\n * Paint properties for symbol layers\n * Comprehensive list of all supported symbol paint properties\n */\nconst SYMBOL_PAINT_KEYS: (keyof Paint)[] = [\n  'icon-opacity',\n  'icon-color',\n  'icon-halo-color',\n  'icon-halo-width',\n  'icon-halo-blur',\n  'icon-translate',\n  'icon-translate-anchor',\n  'text-opacity',\n  'text-color',\n  'text-halo-color',\n  'text-halo-width',\n  'text-halo-blur',\n  'text-translate',\n  'text-translate-anchor',\n];\n\n/**\n * Layout properties for symbol layers\n * Comprehensive list of all supported symbol layout properties\n */\nconst SYMBOL_LAYOUT_KEYS: (keyof Layout)[] = [\n  'symbol-placement',\n  'symbol-spacing',\n  'symbol-avoid-edges',\n  'symbol-sort-key',\n  'symbol-z-order',\n  'icon-allow-overlap',\n  'icon-overlap',\n  'icon-ignore-placement',\n  'icon-optional',\n  'icon-rotation-alignment',\n  'icon-size',\n  'icon-text-fit',\n  'icon-text-fit-padding',\n  'icon-image',\n  'icon-rotate',\n  'icon-padding',\n  'icon-keep-upright',\n  'icon-offset',\n  'icon-anchor',\n  'icon-pitch-alignment',\n  'text-pitch-alignment',\n  'text-rotation-alignment',\n  'text-field',\n  'text-font',\n  'text-size',\n  'text-max-width',\n  'text-line-height',\n  'text-letter-spacing',\n  'text-justify',\n  'text-radial-offset',\n  'text-variable-anchor',\n  'text-variable-anchor-offset',\n  'text-anchor',\n  'text-max-angle',\n  'text-writing-mode',\n  'text-rotate',\n  'text-padding',\n  'text-keep-upright',\n  'text-transform',\n  'text-offset',\n  'text-allow-overlap',\n  'text-overlap',\n  'text-ignore-placement',\n  'text-optional',\n  'visibility',\n];\n\ninterface CreateSymbolLayerProps {\n  map: MaybeRef<Nullable<Map>>;\n  source: MaybeRef<string | SourceSpecification | object | null>;\n  id?: string;\n  beforeId?: string;\n  filter?: FilterSpecification;\n  style?: SymbolLayerStyle;\n  maxzoom?: number;\n  minzoom?: number;\n  metadata?: object;\n  sourceLayer?: string;\n  debug?: boolean;\n  register?: (actions: CreateLayerActions<Layer>, map: Map) => void;\n}\n\ninterface SymbolLayerActions extends CreateLayerActions<Layer> {\n  setStyle: (styleVal?: SymbolLayerStyle) => void;\n  // Icon properties\n  setIconOpacity: (opacity: number, options?: StyleSetterOptions) => void;\n  setIconColor: (color: string, options?: StyleSetterOptions) => void;\n  setIconHaloColor: (color: string, options?: StyleSetterOptions) => void;\n  setIconHaloWidth: (width: number, options?: StyleSetterOptions) => void;\n  setIconHaloBlur: (blur: number, options?: StyleSetterOptions) => void;\n  setIconImage: (image: string, options?: StyleSetterOptions) => void;\n  setIconSize: (size: number | string, options?: StyleSetterOptions) => void;\n  setIconRotate: (rotation: number, options?: StyleSetterOptions) => void;\n  setIconOffset: (\n    offset: [number, number],\n    options?: StyleSetterOptions,\n  ) => void;\n  setIconAnchor: (anchor: string, options?: StyleSetterOptions) => void;\n  // Text properties\n  setTextOpacity: (opacity: number, options?: StyleSetterOptions) => void;\n  setTextColor: (color: string, options?: StyleSetterOptions) => void;\n  setTextHaloColor: (color: string, options?: StyleSetterOptions) => void;\n  setTextHaloWidth: (width: number, options?: StyleSetterOptions) => void;\n  setTextHaloBlur: (blur: number, options?: StyleSetterOptions) => void;\n  setTextField: (field: string, options?: StyleSetterOptions) => void;\n  setTextFont: (font: string[], options?: StyleSetterOptions) => void;\n  setTextSize: (size: number | string, options?: StyleSetterOptions) => void;\n  setTextRotate: (rotation: number, options?: StyleSetterOptions) => void;\n  setTextOffset: (\n    offset: [number, number],\n    options?: StyleSetterOptions,\n  ) => void;\n  setTextAnchor: (anchor: string, options?: StyleSetterOptions) => void;\n  // Common properties\n  setVisibility: (\n    visibility: 'visible' | 'none',\n    options?: StyleSetterOptions,\n  ) => void;\n  setSortKey: (sortKey: number, options?: StyleSetterOptions) => void;\n}\n\n/**\n * Composable for creating and managing MapLibre GL Symbol Layers\n * Provides reactive symbol layer with error handling, performance optimizations, and enhanced API\n *\n * @param props - Configuration options for the symbol layer\n * @returns Enhanced actions and state for the symbol layer\n */\nexport function useCreateSymbolLayer(\n  props: CreateSymbolLayerProps,\n): SymbolLayerActions {\n  const { log, logWarn, logError } = useLogger(props.debug ?? false);\n\n  // Memoized style processing for better performance\n  const styleConfig = computed(() => {\n    const style = props.style || {};\n    return {\n      paint: filterStylePropertiesByKeys(style, SYMBOL_PAINT_KEYS),\n      layout: filterStylePropertiesByKeys(style, SYMBOL_LAYOUT_KEYS),\n    };\n  });\n\n  const { setLayoutProperty, setPaintProperty, ...actions } =\n    useCreateLayer<Layer>({\n      map: props.map,\n      source: props.source,\n      type: 'symbol',\n      id: props.id,\n      beforeId: props.beforeId,\n      filter: props.filter,\n      layout: styleConfig.value.layout as any,\n      paint: styleConfig.value.paint as any,\n      maxzoom: props.maxzoom,\n      minzoom: props.minzoom,\n      metadata: props.metadata,\n      sourceLayer: props.sourceLayer,\n      debug: props.debug,\n      register: (actions, map) => {\n        props.register?.(\n          {\n            ...actions,\n            setStyle,\n            setIconOpacity,\n            setIconColor,\n            setIconHaloColor,\n            setIconHaloWidth,\n            setIconHaloBlur,\n            setIconImage,\n            setIconSize,\n            setIconRotate,\n            setIconOffset,\n            setIconAnchor,\n            setTextOpacity,\n            setTextColor,\n            setTextHaloColor,\n            setTextHaloWidth,\n            setTextHaloBlur,\n            setTextField,\n            setTextFont,\n            setTextSize,\n            setTextRotate,\n            setTextOffset,\n            setTextAnchor,\n            setVisibility,\n            setSortKey,\n          } as SymbolLayerActions,\n          map,\n        );\n      },\n    });\n\n  /**\n   * Updates multiple style properties at once with error handling\n   * @param styleVal - Style object containing paint and layout properties\n   */\n  function setStyle(styleVal: SymbolLayerStyle = {}): void {\n    if (!styleVal || typeof styleVal !== 'object') return;\n\n    try {\n      const styleKeys = Object.keys(styleVal);\n\n      styleKeys.forEach((key) => {\n        const typedKey = key as keyof SymbolLayerStyle;\n        const value = styleVal[typedKey];\n\n        if (value === undefined) return;\n\n        if (SYMBOL_PAINT_KEYS.includes(typedKey as keyof Paint)) {\n          setPaintProperty(key, value, { validate: false });\n        } else if (SYMBOL_LAYOUT_KEYS.includes(typedKey as keyof Layout)) {\n          setLayoutProperty(key, value, { validate: false });\n        }\n      });\n    } catch (error) {\n      logError('Error updating symbol layer style:', error);\n    }\n  }\n\n  // Icon property setters\n  /**\n   * Sets the icon opacity with error handling and validation\n   * @param opacity - Icon opacity value (0-1)\n   * @param options - Style setter options\n   */\n  function setIconOpacity(\n    opacity: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      if (opacity < 0 || opacity > 1) {\n        logWarn('Warning: Icon opacity should be between 0 and 1', { opacity });\n      }\n      setPaintProperty('icon-opacity', opacity, options);\n    } catch (error) {\n      logError('Error setting icon opacity:', error);\n    }\n  }\n\n  /**\n   * Sets the icon color with error handling\n   * @param color - Icon color value\n   * @param options - Style setter options\n   */\n  function setIconColor(\n    color: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('icon-color', color, options);\n    } catch (error) {\n      logError('Error setting icon color:', error);\n    }\n  }\n\n  /**\n   * Sets the icon halo color with error handling\n   * @param color - Icon halo color value\n   * @param options - Style setter options\n   */\n  function setIconHaloColor(\n    color: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('icon-halo-color', color, options);\n    } catch (error) {\n      logError('Error setting icon halo color:', error);\n    }\n  }\n\n  /**\n   * Sets the icon halo width with error handling\n   * @param width - Icon halo width value\n   * @param options - Style setter options\n   */\n  function setIconHaloWidth(\n    width: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('icon-halo-width', width, options);\n    } catch (error) {\n      logError('Error setting icon halo width:', error);\n    }\n  }\n\n  /**\n   * Sets the icon halo blur with error handling\n   * @param blur - Icon halo blur value\n   * @param options - Style setter options\n   */\n  function setIconHaloBlur(\n    blur: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('icon-halo-blur', blur, options);\n    } catch (error) {\n      logError('Error setting icon halo blur:', error);\n    }\n  }\n\n  /**\n   * Sets the icon image with error handling\n   * @param image - Icon image name\n   * @param options - Style setter options\n   */\n  function setIconImage(\n    image: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('icon-image', image, options);\n    } catch (error) {\n      logError('Error setting icon image:', error);\n    }\n  }\n\n  /**\n   * Sets the icon size with error handling\n   * @param size - Icon size value\n   * @param options - Style setter options\n   */\n  function setIconSize(\n    size: number | string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('icon-size', size, options);\n    } catch (error) {\n      logError('Error setting icon size:', error);\n    }\n  }\n\n  /**\n   * Sets the icon rotation with error handling\n   * @param rotation - Icon rotation value in degrees\n   * @param options - Style setter options\n   */\n  function setIconRotate(\n    rotation: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('icon-rotate', rotation, options);\n    } catch (error) {\n      logError('Error setting icon rotation:', error);\n    }\n  }\n\n  /**\n   * Sets the icon offset with error handling\n   * @param offset - Icon offset as [x, y] coordinates\n   * @param options - Style setter options\n   */\n  function setIconOffset(\n    offset: [number, number],\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      if (!Array.isArray(offset) || offset.length !== 2) {\n        logWarn(\n          'Warning: Icon offset should be an array of two numbers [x, y]',\n          {\n            offset,\n          },\n        );\n      }\n      setLayoutProperty('icon-offset', offset, options);\n      log('Icon offset updated', { offset });\n    } catch (error) {\n      logError('Error setting icon offset:', error);\n    }\n  }\n\n  /**\n   * Sets the icon anchor with error handling\n   * @param anchor - Icon anchor position\n   * @param options - Style setter options\n   */\n  function setIconAnchor(\n    anchor: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('icon-anchor', anchor, options);\n    } catch (error) {\n      logError('Error setting icon anchor:', error);\n    }\n  }\n\n  // Text property setters\n  /**\n   * Sets the text opacity with error handling and validation\n   * @param opacity - Text opacity value (0-1)\n   * @param options - Style setter options\n   */\n  function setTextOpacity(\n    opacity: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      if (opacity < 0 || opacity > 1) {\n        logWarn('Warning: Text opacity should be between 0 and 1', { opacity });\n      }\n      setPaintProperty('text-opacity', opacity, options);\n    } catch (error) {\n      logError('Error setting text opacity:', error);\n    }\n  }\n\n  /**\n   * Sets the text color with error handling\n   * @param color - Text color value\n   * @param options - Style setter options\n   */\n  function setTextColor(\n    color: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('text-color', color, options);\n    } catch (error) {\n      logError('Error setting text color:', error);\n    }\n  }\n\n  /**\n   * Sets the text halo color with error handling\n   * @param color - Text halo color value\n   * @param options - Style setter options\n   */\n  function setTextHaloColor(\n    color: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('text-halo-color', color, options);\n    } catch (error) {\n      logError('Error setting text halo color:', error);\n    }\n  }\n\n  /**\n   * Sets the text halo width with error handling\n   * @param width - Text halo width value\n   * @param options - Style setter options\n   */\n  function setTextHaloWidth(\n    width: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('text-halo-width', width, options);\n    } catch (error) {\n      logError('Error setting text halo width:', error);\n    }\n  }\n\n  /**\n   * Sets the text halo blur with error handling\n   * @param blur - Text halo blur value\n   * @param options - Style setter options\n   */\n  function setTextHaloBlur(\n    blur: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setPaintProperty('text-halo-blur', blur, options);\n    } catch (error) {\n      logError('Error setting text halo blur:', error);\n    }\n  }\n\n  /**\n   * Sets the text field with error handling\n   * @param field - Text field value or expression\n   * @param options - Style setter options\n   */\n  function setTextField(\n    field: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('text-field', field, options);\n    } catch (error) {\n      logError('Error setting text field:', error);\n    }\n  }\n\n  /**\n   * Sets the text font with error handling\n   * @param font - Array of font names\n   * @param options - Style setter options\n   */\n  function setTextFont(\n    font: string[],\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      if (!Array.isArray(font)) {\n        logWarn('Warning: Text font should be an array of font names', {\n          font,\n        });\n      }\n      setLayoutProperty('text-font', font, options);\n    } catch (error) {\n      logError('Error setting text font:', error);\n    }\n  }\n\n  /**\n   * Sets the text size with error handling\n   * @param size - Text size value\n   * @param options - Style setter options\n   */\n  function setTextSize(\n    size: number | string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('text-size', size, options);\n    } catch (error) {\n      logError('Error setting text size:', error);\n    }\n  }\n\n  /**\n   * Sets the text rotation with error handling\n   * @param rotation - Text rotation value in degrees\n   * @param options - Style setter options\n   */\n  function setTextRotate(\n    rotation: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('text-rotate', rotation, options);\n    } catch (error) {\n      logError('Error setting text rotation:', error);\n    }\n  }\n\n  /**\n   * Sets the text offset with error handling\n   * @param offset - Text offset as [x, y] coordinates\n   * @param options - Style setter options\n   */\n  function setTextOffset(\n    offset: [number, number],\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      if (!Array.isArray(offset) || offset.length !== 2) {\n        logWarn(\n          'Warning: Text offset should be an array of two numbers [x, y]',\n          {\n            offset,\n          },\n        );\n      }\n      setLayoutProperty('text-offset', offset, options);\n    } catch (error) {\n      logError('Error setting text offset:', error);\n    }\n  }\n\n  /**\n   * Sets the text anchor with error handling\n   * @param anchor - Text anchor position\n   * @param options - Style setter options\n   */\n  function setTextAnchor(\n    anchor: string,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('text-anchor', anchor, options);\n    } catch (error) {\n      logError('Error setting text anchor:', error);\n    }\n  }\n\n  /**\n   * Sets the layer visibility with error handling\n   * @param visibility - Visibility value ('visible' | 'none')\n   * @param options - Style setter options\n   */\n  function setVisibility(\n    visibility: 'visible' | 'none',\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('visibility', visibility, options);\n    } catch (error) {\n      logError('Error setting symbol layer visibility:', error);\n    }\n  }\n\n  /**\n   * Sets the symbol sort key with error handling\n   * @param sortKey - Sort key value for layer ordering\n   * @param options - Style setter options\n   */\n  function setSortKey(\n    sortKey: number,\n    options: StyleSetterOptions = { validate: true },\n  ): void {\n    try {\n      setLayoutProperty('symbol-sort-key', sortKey, options);\n    } catch (error) {\n      logError('Error setting symbol sort key:', error);\n    }\n  }\n\n  return {\n    ...actions,\n    setStyle,\n    setLayoutProperty,\n    setPaintProperty,\n    setIconOpacity,\n    setIconColor,\n    setIconHaloColor,\n    setIconHaloWidth,\n    setIconHaloBlur,\n    setIconImage,\n    setIconSize,\n    setIconRotate,\n    setIconOffset,\n    setIconAnchor,\n    setTextOpacity,\n    setTextColor,\n    setTextHaloColor,\n    setTextHaloWidth,\n    setTextHaloBlur,\n    setTextField,\n    setTextFont,\n    setTextSize,\n    setTextRotate,\n    setTextOffset,\n    setTextAnchor,\n    setVisibility,\n    setSortKey,\n  };\n}\n","<script lang=\"ts\" setup>\nimport {\n  ref,\n  provide,\n  computed,\n  unref,\n  watch,\n  nextTick,\n  onBeforeMount,\n  onUnmounted,\n  watchEffect,\n} from 'vue';\nimport { MapProvideKey, MapboxEvents, MapCreationStatus } from '@libs/enums';\nimport {\n  useCreateMapbox,\n  useMapEventListener,\n  useLogger,\n  useOptimizedComputed,\n} from '@libs/composables';\nimport type { CreateMaplibreActions, MaplibreActions } from '@libs/types';\nimport type {\n  Map,\n  MapContextEvent,\n  MapDataEvent,\n  MapEventType,\n  MapLibreZoomEvent,\n  MapMouseEvent,\n  MapOptions,\n  MapSourceDataEvent,\n  MapTouchEvent,\n  MapWheelEvent,\n} from 'maplibre-gl';\n\n/**\n * Enhanced Mapbox component props with comprehensive configuration options\n */\ninterface MapboxProps {\n  /** Map configuration options */\n  options?: Partial<MapOptions>;\n  /** Callback for registering map actions */\n  register?: (actions: MaplibreActions) => void;\n  /** Enable debug logging */\n  debug?: boolean;\n  /** Automatically cleanup resources on unmount */\n  autoCleanup?: boolean;\n  /** Container ID for the map element */\n  containerId?: string;\n  /** Custom container class names */\n  containerClass?: string;\n  /** Error handling callback */\n  onError?: (error: any) => void;\n  /** Load success callback */\n  onLoad?: (map: Map) => void;\n}\n\ninterface Emits {\n  (e: keyof MapEventType, ev: any): void;\n  (e: 'register', actions: MaplibreActions): void;\n  (\n    e: 'error' | 'load' | 'idle' | 'remove' | 'render' | 'resize',\n    ev: Event,\n  ): void;\n  (e: 'webglcontextlost' | 'webglcontextrestored', ev: MapContextEvent): void;\n  (\n    e: 'dataloading' | 'data' | 'tiledataloading' | 'dataabort',\n    ev: MapDataEvent,\n  ): void;\n  (\n    e: 'sourcedataloading' | 'sourcedata' | 'sourcedataabort',\n    ev: MapSourceDataEvent,\n  ): void;\n  (e: 'styledata', ev: Event): void;\n  (e: 'styleimagemissing', ev: Event): void;\n  (\n    e: 'boxzoomcancel' | 'boxzoomstart' | 'boxzoomend',\n    ev: MapLibreZoomEvent,\n  ): void;\n  (\n    e: 'touchcancel' | 'touchmove' | 'touchend' | 'touchstart',\n    ev: MapTouchEvent,\n  ): void;\n  (\n    e:\n      | 'click'\n      | 'contextmenu'\n      | 'dblclick'\n      | 'mousemove'\n      | 'mouseup'\n      | 'mousedown'\n      | 'mouseout'\n      | 'mouseover',\n    ev: MapMouseEvent,\n  ): void;\n  (\n    e:\n      | 'movestart'\n      | 'move'\n      | 'moveend'\n      | 'zoomstart'\n      | 'zoom'\n      | 'zoomend'\n      | 'rotatestart'\n      | 'rotate'\n      | 'rotateend'\n      | 'dragstart'\n      | 'drag'\n      | 'dragend'\n      | 'pitchstart'\n      | 'pitch'\n      | 'pitchend',\n    ev: Event,\n  ): void;\n  (e: 'wheel', ev: MapWheelEvent): void;\n  (e: 'terrain', ev: Event): void;\n}\n\nconst props = withDefaults(defineProps<MapboxProps>(), {\n  options: () => ({\n    // Provide sensible defaults for better performance\n    style: 'https://demotiles.maplibre.org/style.json',\n    center: [0, 0] as [number, number],\n    zoom: 1,\n    pitch: 0,\n    bearing: 0,\n    antialias: true,\n    optimizeForTerrain: true,\n    // Performance optimizations\n    preserveDrawingBuffer: false,\n    refreshExpiredTiles: true,\n    maxTileCacheSize: null,\n    localIdeographFontFamily: false,\n    transformRequest: undefined,\n    collectResourceTiming: false,\n    fadeDuration: 300,\n    crossSourceCollisions: true,\n  }),\n  debug: false,\n  autoCleanup: true,\n  containerId: () => `maplibre-${Math.random().toString(36).substring(2, 11)}`,\n  containerClass: '',\n});\nconst emits = defineEmits<Emits>();\n\n// Enhanced logging and error handling\nconst { logError } = useLogger(props.debug);\n\n// Reactive state management\nconst innerOptions = ref<Partial<MapOptions>>();\nconst maplibreElRef = ref<HTMLElement>();\nconst styleRef = ref(props.options.style as string);\n\nconst isComponentMounted = ref(false);\nconst mapCreationStatus = ref<MapCreationStatus>(\n  MapCreationStatus.NotInitialized,\n);\n\n// Enhanced computed properties for better reactivity and performance\nconst mapOptions = useOptimizedComputed(\n  () => {\n    const baseOptions = { ...props.options };\n    const mergedOptions = { ...baseOptions, ...innerOptions.value };\n\n    // Ensure container is properly set\n    if (!mergedOptions.container) {\n      mergedOptions.container = props.containerId;\n    }\n\n    return mergedOptions;\n  },\n  {\n    deepEqual: true, // Use deep equality for complex objects\n  },\n);\n\nconst isMapReady = computed(\n  () => mapCreationStatus.value === MapCreationStatus.Loaded,\n);\nconst isMapLoading = computed(\n  () => mapCreationStatus.value === MapCreationStatus.Loading,\n);\nconst hasMapError = computed(\n  () => mapCreationStatus.value === MapCreationStatus.Error,\n);\n\n/**\n * Enhanced map options setter with validation and error handling\n * @param options - Partial map options to merge\n */\nfunction setMapOptions(options: Partial<MapOptions>): void {\n  try {\n    innerOptions.value = {\n      ...(unref(mapOptions) || {}),\n      ...options,\n    };\n  } catch (error) {\n    logError('Error setting map options:', error, { options });\n  }\n}\n\n/**\n * Enhanced container creation with error handling and validation\n */\nfunction createMapContainer(): HTMLElement | null {\n  try {\n    const wrapper = document.getElementById('maplibre_container');\n    if (!wrapper) {\n      logError('Map container wrapper not found');\n      return null;\n    }\n\n    // Remove existing container if present\n    const existingContainer = document.getElementById(props.containerId);\n    if (existingContainer) {\n      existingContainer.remove();\n    }\n\n    const container = document.createElement('div');\n    container.id = props.containerId;\n    container.className = props.containerClass;\n    container.style.width = '100%';\n    container.style.height = '100%';\n\n    wrapper.appendChild(container);\n    return container;\n  } catch (error) {\n    logError('Error creating map container:', error);\n    return null;\n  }\n}\n\n// Enhanced map creation with comprehensive error handling and performance monitoring\nconst {\n  mapInstance,\n\n  setCenter,\n  setBearing,\n  setZoom,\n  setPitch,\n  setStyle,\n  setMaxBounds,\n  setMaxPitch,\n  setMaxZoom,\n  setMinPitch,\n  setMinZoom,\n  setRenderWorldCopies,\n} = useCreateMapbox(maplibreElRef, styleRef, {\n  ...unref(mapOptions),\n  register: (actions: CreateMaplibreActions) => {\n    try {\n      const enhancedActions = {\n        ...actions,\n        setMapOptions,\n        // Additional enhanced methods\n        isMapReady: isMapReady.value,\n        isMapLoading: isMapLoading.value,\n        hasMapError: hasMapError.value,\n      };\n\n      props.register?.(enhancedActions as MaplibreActions);\n      emits('register', enhancedActions as MaplibreActions);\n    } catch (error) {\n      logError('Error during map registration:', error);\n      props.onError?.(error);\n    }\n  },\n  onLoad: (map) => {\n    try {\n      mapCreationStatus.value = MapCreationStatus.Loaded;\n      props.onLoad?.(map);\n    } catch (error) {\n      logError('Error in map load handler:', error);\n      props.onError?.(error);\n    }\n  },\n  onError: (error) => {\n    try {\n      mapCreationStatus.value = MapCreationStatus.Error;\n      logError('Map creation error:', error);\n      props.onError?.(error);\n    } catch (handlerError) {\n      logError('Error in error handler:', handlerError);\n    }\n  },\n  debug: props.debug,\n});\n\n// Provide map instance to child components\nprovide(MapProvideKey, mapInstance);\n\n// Enhanced event listeners with error handling and performance monitoring\nMapboxEvents.map((evt) => {\n  return useMapEventListener({\n    map: mapInstance,\n    event: evt,\n    on: (data) => {\n      try {\n        emits(evt as keyof MapEventType, data);\n      } catch (error) {\n        logError(`Error in ${evt} event handler:`, error, { data });\n      }\n    },\n    debug: props.debug,\n  });\n});\n\n// Create optimized watchers for map properties with null safety\nconst watchers = [\n  watch(\n    () => unref(mapOptions).center,\n    (value) => value && setCenter(value),\n    { flush: 'post' },\n  ),\n  watch(\n    () => unref(mapOptions).bearing,\n    (value) => value !== undefined && setBearing(value),\n    { flush: 'post' },\n  ),\n  watch(\n    () => unref(mapOptions).zoom,\n    (value) => value !== undefined && setZoom(value),\n    { flush: 'post' },\n  ),\n  watch(\n    () => unref(mapOptions).pitch,\n    (value) => value !== undefined && setPitch(value),\n    { flush: 'post' },\n  ),\n  watch(\n    () => unref(mapOptions).style,\n    (value) => value && setStyle(value),\n    { flush: 'post' },\n  ),\n  watch(\n    () => unref(mapOptions).maxBounds,\n    (value) => value && setMaxBounds(value),\n    { flush: 'post' },\n  ),\n  watch(\n    () => unref(mapOptions).maxPitch,\n    (value) => value !== undefined && value !== null && setMaxPitch(value),\n    { flush: 'post' },\n  ),\n  watch(\n    () => unref(mapOptions).maxZoom,\n    (value) => value !== undefined && value !== null && setMaxZoom(value),\n    { flush: 'post' },\n  ),\n  watch(\n    () => unref(mapOptions).minPitch,\n    (value) => value !== undefined && value !== null && setMinPitch(value),\n    { flush: 'post' },\n  ),\n  watch(\n    () => unref(mapOptions).minZoom,\n    (value) => value !== undefined && value !== null && setMinZoom(value),\n    { flush: 'post' },\n  ),\n  watch(\n    () => unref(mapOptions).renderWorldCopies,\n    (value) => value !== undefined && setRenderWorldCopies(value),\n    { flush: 'post' },\n  ),\n];\n\n// Enhanced container management\nwatchEffect(async () => {\n  try {\n    await nextTick();\n\n    const container = createMapContainer();\n    if (container) {\n      maplibreElRef.value = container;\n      isComponentMounted.value = true;\n      mapCreationStatus.value = MapCreationStatus.Initializing;\n    } else {\n      logError('Failed to create map container');\n      mapCreationStatus.value = MapCreationStatus.Error;\n    }\n  } catch (error) {\n    logError('Error in container creation watchEffect:', error);\n    mapCreationStatus.value = MapCreationStatus.Error;\n    props.onError?.(error);\n  }\n});\n\n// Enhanced cleanup with comprehensive resource disposal\nfunction cleanup(): void {\n  try {\n    // Stop all watchers\n    watchers.forEach((stopWatcher) => stopWatcher?.());\n\n    // Remove container\n    maplibreElRef.value?.remove();\n\n    // Reset state\n    isComponentMounted.value = false;\n    mapCreationStatus.value = MapCreationStatus.Destroyed;\n  } catch (error) {\n    logError('Error during cleanup:', error);\n  }\n}\n\nonBeforeMount(() => {\n  if (props.autoCleanup) {\n    cleanup();\n  }\n});\n\nonUnmounted(() => {\n  if (props.autoCleanup) {\n    cleanup();\n  }\n});\n</script>\n\n<template>\n  <div id=\"maplibre_container\">\n    <!-- Loading state -->\n    <div v-if=\"isMapLoading\">\n      <slot name=\"loading\"> </slot>\n    </div>\n\n    <!-- Error state -->\n    <div v-if=\"hasMapError\">\n      <slot name=\"error\"> </slot>\n    </div>\n\n    <!-- Map content -->\n    <slot v-if=\"isMapReady || (!isMapLoading && !hasMapError)\" />\n  </div>\n</template>\n\n<style lang=\"scss\">\n.maplibre-container {\n  position: relative;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n}\n\n// Legacy support\n#maplibre_container {\n  @extend .maplibre-container;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { inject, ref, watchEffect, computed, onUnmounted } from 'vue';\nimport { MapProvideKey, GeolocateEvents } from '@libs/enums';\nimport {\n  useGeolocateControl,\n  useGeolocateEventListener,\n  useLogger,\n} from '@libs/composables';\nimport type {\n  GeolocateSuccess,\n  GeolocationPositionError,\n  GeolocateEventTypes,\n} from '@libs/types';\nimport type {\n  ControlPosition,\n  GeolocateControl,\n  GeolocateControlOptions,\n} from 'maplibre-gl';\n\n/**\n * Enhanced GeolocateControl component props with comprehensive configuration options\n */\ninterface GeolocateControlProps {\n  /** Position of the control on the map */\n  position?: ControlPosition;\n  /** Geolocate control configuration options */\n  options?: GeolocateControlOptions;\n  /** Enable debug logging */\n  debug?: boolean;\n  /** Automatically cleanup resources on unmount */\n  autoCleanup?: boolean;\n  /** Error handling callback */\n  onError?: (error: any) => void;\n  /** Success callback for geolocation */\n  onGeolocate?: (data: GeolocateSuccess) => void;\n  /** Callback when user location tracking starts */\n  onTrackingStart?: (data: GeolocateSuccess) => void;\n  /** Callback when user location tracking ends */\n  onTrackingEnd?: (data: GeolocateSuccess) => void;\n  /** Callback when user location is out of max bounds */\n  onOutOfMaxBounds?: (data: GeolocateSuccess) => void;\n}\n\n/**\n * Enhanced event emits with proper typing and comprehensive event coverage\n */\ninterface Emits {\n  (e: keyof GeolocateEventTypes, ev: any): void;\n  (e: 'register', ev: GeolocateControl): void;\n  (e: 'geolocate', ev: GeolocateSuccess): void;\n  (e: 'error', ev: GeolocationPositionError): void;\n  (e: 'outofmaxbounds', ev: GeolocateSuccess): void;\n  (e: 'trackuserlocationstart', ev: GeolocateSuccess): void;\n  (e: 'trackuserlocationend', ev: GeolocateSuccess): void;\n}\n\nconst props = withDefaults(defineProps<GeolocateControlProps>(), {\n  position: 'bottom-right',\n  options: () => ({}),\n  debug: false,\n  autoCleanup: true,\n});\nconst emits = defineEmits<Emits>();\n\n// Enhanced logging and error handling\nconst { logError } = useLogger(props.debug);\n\n// Reactive state management\nconst mapInstance = inject(MapProvideKey, ref(null));\nconst isControlRegistered = ref(false);\nconst controlError = ref<any>(null);\n\n// Computed properties for better reactivity and performance\nconst hasControlError = computed(() => !!controlError.value);\n\n// Enhanced geolocate control with comprehensive error handling\nconst { geolocateControl, isControlAdded, removeControl, addControl, trigger } =\n  useGeolocateControl({\n    map: mapInstance,\n    position: props.position,\n    options: props.options,\n    debug: props.debug,\n  });\n\n/**\n * Enhanced event handler with error handling and callback support\n * @param eventType - The type of geolocate event\n * @param data - Event data\n */\nfunction handleGeolocateEvent(\n  eventType: keyof GeolocateEventTypes,\n  data: any,\n): void {\n  try {\n    // Emit the event\n    emits(eventType, data);\n\n    // Call specific callback handlers\n    switch (eventType) {\n      case 'geolocate':\n        props.onGeolocate?.(data as GeolocateSuccess);\n        break;\n      case 'error':\n        controlError.value = data;\n        props.onError?.(data);\n        break;\n      case 'trackuserlocationstart':\n        props.onTrackingStart?.(data as GeolocateSuccess);\n        break;\n      case 'trackuserlocationend':\n        props.onTrackingEnd?.(data as GeolocateSuccess);\n        break;\n      case 'outofmaxbounds':\n        props.onOutOfMaxBounds?.(data as GeolocateSuccess);\n        break;\n      default:\n        break;\n    }\n  } catch (error) {\n    logError(`Error handling ${eventType} event:`, error, { data });\n    controlError.value = error;\n    props.onError?.(error);\n  }\n}\n\n// Enhanced control registration with error handling\nwatchEffect(() => {\n  try {\n    if (geolocateControl.value && !isControlRegistered.value) {\n      emits('register', geolocateControl.value);\n      isControlRegistered.value = true;\n      controlError.value = null;\n    }\n  } catch (error) {\n    logError('Error registering geolocate control:', error);\n    controlError.value = error;\n    props.onError?.(error);\n  }\n});\n\n// Enhanced event listeners with error handling and performance optimization\nGeolocateEvents.map((evt) => {\n  return useGeolocateEventListener({\n    geolocate: geolocateControl,\n    event: evt,\n    on: (data) => handleGeolocateEvent(evt, data),\n    debug: props.debug,\n  });\n});\n\n/**\n * Enhanced cleanup function for disposing resources\n */\nfunction cleanup(): void {\n  try {\n    if (props.autoCleanup) {\n      // Reset state\n      isControlRegistered.value = false;\n      controlError.value = null;\n\n      // Remove control if still added\n      if (isControlAdded.value) {\n        removeControl();\n      }\n    }\n  } catch (error) {\n    logError('Error during geolocate control cleanup:', error);\n  }\n}\n\n// Cleanup on component unmount\nonUnmounted(cleanup);\n\n// Expose control methods for parent components\ndefineExpose({\n  geolocateControl,\n  isControlAdded,\n  isControlRegistered,\n  hasControlError,\n  controlError,\n  addControl,\n  removeControl,\n  trigger,\n  cleanup,\n});\n</script>\n\n<template>\n  <!-- Enhanced template with error state and accessibility -->\n  <div v-if=\"hasControlError\">\n    <slot name=\"error\"> </slot>\n  </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { inject, ref, provide, computed, onUnmounted } from 'vue';\nimport { MapProvideKey, SourceProvideKey } from '@libs/enums';\nimport {\n  useCreateGeoJsonSource,\n  useLogger,\n  useDebouncedWatch,\n} from '@libs/composables';\nimport type { CreateGeoJsonSourceActions } from '@libs/composables';\nimport type { GeoJSONSource, GeoJSONSourceSpecification } from 'maplibre-gl';\n\n/**\n * Enhanced GeoJsonSource component props with comprehensive configuration options\n */\ninterface GeoJsonSourceProps {\n  /** Unique identifier for the source */\n  id?: string;\n  /** GeoJSON data for the source */\n  data?: GeoJSONSourceSpecification['data'];\n  /** Additional source configuration options */\n  options?: Partial<GeoJSONSourceSpecification>;\n  /** Callback for registering source actions */\n  register?: (actions: CreateGeoJsonSourceActions) => void;\n  /** Enable debug logging */\n  debug?: boolean;\n  /** Automatically cleanup resources on unmount */\n  autoCleanup?: boolean;\n  /** Error handling callback */\n  onError?: (error: any) => void;\n  /** Source load success callback */\n  onLoad?: (source: GeoJSONSource) => void;\n  /** Data update callback */\n  onDataUpdate?: (data: GeoJSONSourceSpecification['data']) => void;\n  /** Debounce delay for data updates in milliseconds (default: 100) */\n  debounceDelay?: number;\n}\n\n/**\n * Enhanced event emits with proper typing and comprehensive event coverage\n */\ninterface Emits {\n  (e: 'register', actions: CreateGeoJsonSourceActions): void;\n  (e: 'error', error: any): void;\n  (e: 'load', source: any): void;\n  (e: 'data-update', data: GeoJSONSourceSpecification['data']): void;\n}\n\nconst props = withDefaults(defineProps<GeoJsonSourceProps>(), {\n  data: () => ({\n    type: 'FeatureCollection',\n    features: [],\n  }),\n  options: () => ({}),\n  debug: false,\n  autoCleanup: true,\n  debounceDelay: 100,\n});\n\nconst emits = defineEmits<Emits>();\n\n// Enhanced logging and error handling\nconst { logError } = useLogger(props.debug);\n\n// Reactive state management\nconst mapInstance = inject(MapProvideKey, ref(null));\nconst isSourceRegistered = ref(false);\nconst lastDataUpdate = ref<GeoJSONSourceSpecification['data']>();\n\n// Computed properties for better reactivity and performance\nconst isDataValid = computed(() => {\n  const data = props.data;\n  if (!data) return false;\n\n  // Basic GeoJSON validation\n  if (typeof data === 'object' && 'type' in data) {\n    return data.type === 'FeatureCollection' || data.type === 'Feature';\n  }\n\n  // URL validation for string data\n  if (typeof data === 'string') {\n    try {\n      new URL(data);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  return false;\n});\n\n/**\n * Enhanced data setter with validation and error handling\n * @param newData - New GeoJSON data to set\n */\nfunction handleSetData(newData: GeoJSONSourceSpecification['data']): void {\n  try {\n    if (!newData) return;\n\n    // Validate data before setting\n    if (typeof newData === 'object' && 'type' in newData) {\n      if (!['FeatureCollection', 'Feature'].includes(newData.type)) {\n        logError('Invalid GeoJSON type:', newData.type);\n        return;\n      }\n    }\n\n    setData(newData);\n    lastDataUpdate.value = newData;\n\n    // Emit data update event\n    emits('data-update', newData);\n    props.onDataUpdate?.(newData);\n  } catch (error) {\n    logError('Error setting GeoJSON source data:', error);\n    emits('error', error);\n    props.onError?.(error);\n  }\n}\n\n// Enhanced GeoJSON source with comprehensive error handling\nconst {\n  sourceId,\n  getSource,\n  setData,\n  removeSource,\n  refreshSource,\n  sourceStatus,\n  isSourceReady,\n} = useCreateGeoJsonSource({\n  map: mapInstance,\n  id: props.id,\n  data: props.data,\n  options: props.options,\n  debug: props.debug,\n  register: (actions) => {\n    try {\n      const enhancedActions = {\n        ...actions,\n        // Additional enhanced methods\n        isSourceRegistered: isSourceRegistered.value,\n        lastDataUpdate: lastDataUpdate.value,\n        isDataValid: isDataValid.value,\n      };\n\n      props.register?.(enhancedActions);\n      emits('register', enhancedActions);\n\n      isSourceRegistered.value = true;\n\n      // Emit load event\n      if (actions.getSource.value) {\n        emits('load', actions.getSource.value);\n        props.onLoad?.(actions.getSource.value);\n      }\n    } catch (error) {\n      logError('Error registering GeoJSON source:', error);\n      emits('error', error);\n      props.onError?.(error);\n    }\n  },\n});\n\n// Provide source to child components\nprovide(SourceProvideKey, getSource);\n\n// Enhanced debounced data watcher with validation and error handling for better performance\nconst stopDataWatcher = useDebouncedWatch(\n  () => props.data,\n  (newData, oldData) => {\n    if (newData === oldData) return;\n\n    try {\n      if (newData && isDataValid.value) {\n        handleSetData(newData);\n      } else if (newData && !isDataValid.value) {\n        const error = new Error('Invalid GeoJSON data format');\n        logError('Invalid GeoJSON data provided:', newData);\n        emits('error', error);\n        props.onError?.(error);\n      }\n    } catch (error) {\n      logError('Error in data watcher:', error);\n      emits('error', error);\n      props.onError?.(error);\n    }\n  },\n  {\n    delay: props.debounceDelay,\n    deep: true,\n    immediate: true,\n    flush: 'post', // Optimize by running after DOM updates\n    debug: props.debug,\n  },\n);\n\n/**\n * Enhanced cleanup function for disposing resources\n */\nfunction cleanup(): void {\n  try {\n    if (props.autoCleanup) {\n      // Stop debounced watcher\n      stopDataWatcher();\n\n      // Reset state\n      isSourceRegistered.value = false;\n      lastDataUpdate.value = undefined;\n\n      // Remove source if still available\n      if (isSourceReady) {\n        removeSource();\n      }\n    }\n  } catch (error) {\n    logError('Error during GeoJSON source cleanup:', error);\n  }\n}\n\n// Cleanup on component unmount\nonUnmounted(cleanup);\n\n// Expose source methods for parent components\ndefineExpose({\n  sourceId,\n  getSource,\n  setData: handleSetData,\n  removeSource,\n  refreshSource,\n  sourceStatus,\n  isSourceReady,\n  isSourceRegistered,\n  isDataValid,\n  lastDataUpdate,\n  cleanup,\n});\n</script>\n\n<template>\n  <!-- Main content slot -->\n  <slot />\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, inject, watch, computed, onUnmounted } from 'vue';\nimport {\n  MapProvideKey,\n  SourceProvideKey,\n  MapboxLayerEvents,\n} from '@libs/enums';\nimport { useCreateFillLayer, useLayerEventListener } from '@libs/composables';\nimport type {\n  CreateLayerActions,\n  AnyLayout,\n  FillLayerStyle,\n} from '@libs/types';\nimport type {\n  Map,\n  MapLayerEventType,\n  MapLayerMouseEvent,\n  MapLayerTouchEvent,\n  FilterSpecification,\n  FillLayerSpecification,\n} from 'maplibre-gl';\n\n/**\n * Props interface for FillLayer component\n * Defines all configurable properties for a MapLibre GL Fill Layer\n */\ninterface LayerProps {\n  /** Unique identifier for the layer */\n  id: string;\n  /** Filter expression to apply to the layer */\n  filter: FilterSpecification;\n  /** Style configuration for the fill layer */\n  style: FillLayerStyle;\n  /** Maximum zoom level for layer visibility */\n  maxzoom: number;\n  /** Minimum zoom level for layer visibility */\n  minzoom: number;\n  /** Arbitrary metadata for the layer */\n  metadata: object;\n  /** Data source for the layer */\n  source: string | object;\n  /** Source layer name for vector sources */\n  sourceLayer: string;\n  /** ID of layer before which to insert this layer */\n  beforeId: string;\n  /** Whether the layer is visible */\n  visible: boolean;\n  /** Callback function to register layer actions */\n  register: (\n    actions: CreateLayerActions<FillLayerSpecification>,\n    map: Map,\n  ) => void;\n}\n\n/**\n * Events interface for FillLayer component\n * Defines all events that can be emitted by the layer\n */\ninterface Emits {\n  /** Generic layer event */\n  (e: keyof MapLayerEventType, ev: any): void;\n  /** Layer registration event */\n  (\n    e: 'register',\n    actions: CreateLayerActions<FillLayerSpecification>,\n    map: Map,\n  ): void;\n  /** Mouse events */\n  (\n    e:\n      | 'click'\n      | 'dblclick'\n      | 'mousedown'\n      | 'mouseup'\n      | 'mousemove'\n      | 'mouseenter'\n      | 'mouseleave'\n      | 'mouseover'\n      | 'mouseout'\n      | 'contextmenu',\n    ev: MapLayerMouseEvent,\n  ): void;\n  /** Touch events */\n  (e: 'touchstart' | 'touchend' | 'touchcancel', ev: MapLayerTouchEvent): void;\n}\n\n// Component props with sensible defaults\nconst props = withDefaults(defineProps<Partial<LayerProps>>(), {\n  visible: true,\n});\n\n// Component events\nconst emits = defineEmits<Emits>();\n\n// Injected dependencies\nconst sourceData = inject(SourceProvideKey, ref(null));\nconst mapInstance = inject(MapProvideKey, ref(null));\n\n// Computed properties for better performance and reactivity\nconst effectiveSource = computed(() => props.source || sourceData.value);\n\nconst visibilityStyle = computed(\n  (): AnyLayout => ({\n    visibility: props.visible ? 'visible' : 'none',\n  }),\n);\n\nconst mergedStyle = computed(() => ({\n  ...props.style,\n  ...visibilityStyle.value,\n}));\n\n// Enhanced register callback with proper typing\nconst handleRegister = (\n  actions: CreateLayerActions<FillLayerSpecification>,\n  map: Map,\n) => {\n  emits('register', actions, map);\n};\n\n// Create fill layer with optimized configuration\nconst {\n  getLayer,\n  setBeforeId,\n  setFilter,\n  setStyle,\n  setZoomRange,\n  setLayoutProperty,\n} = useCreateFillLayer({\n  map: mapInstance,\n  source: effectiveSource,\n  style: mergedStyle.value,\n  filter: props.filter || ['all'],\n  id: props.id,\n  maxzoom: props.maxzoom,\n  minzoom: props.minzoom,\n  metadata: props.metadata,\n  sourceLayer: props.sourceLayer,\n  register: handleRegister,\n});\n\n// Optimized event listener setup with error handling\nMapboxLayerEvents.forEach((evt) => {\n  useLayerEventListener({\n    map: mapInstance,\n    layer: getLayer,\n    event: evt,\n    on: (data) => {\n      emits(evt, data);\n    },\n  });\n});\n\n// Optimized single watcher for all prop changes to reduce overhead\nconst stopPropsWatcher = watch(\n  () => ({\n    filter: props.filter,\n    style: props.style,\n    maxzoom: props.maxzoom,\n    minzoom: props.minzoom,\n    beforeId: props.beforeId,\n    visible: props.visible,\n  }),\n  (newProps, oldProps) => {\n    // Only update if values actually changed to prevent unnecessary operations\n    if (newProps.filter !== oldProps?.filter) {\n      setFilter(newProps.filter);\n    }\n    if (newProps.style !== oldProps?.style) {\n      setStyle(newProps.style);\n    }\n    if (\n      newProps.maxzoom !== oldProps?.maxzoom ||\n      newProps.minzoom !== oldProps?.minzoom\n    ) {\n      setZoomRange(newProps.minzoom, newProps.maxzoom);\n    }\n    if (newProps.beforeId !== oldProps?.beforeId) {\n      setBeforeId(newProps.beforeId);\n    }\n    if (newProps.visible !== oldProps?.visible) {\n      setLayoutProperty('visibility', newProps.visible ? 'visible' : 'none');\n    }\n  },\n  {\n    deep: true,\n    flush: 'post', // Run after DOM updates for better performance\n  },\n);\n\n// Enhanced cleanup\nonUnmounted(() => {\n  stopPropsWatcher();\n});\n</script>\n<template></template>\n","<script lang=\"ts\" setup>\nimport { ref, inject, watch, computed, onUnmounted } from 'vue';\nimport {\n  MapProvideKey,\n  SourceProvideKey,\n  MapboxLayerEvents,\n} from '@libs/enums';\nimport { useLayerEventListener, useCreateCircleLayer } from '@libs/composables';\nimport type {\n  CreateLayerActions,\n  AnyLayout,\n  CircleLayerStyle,\n} from '@libs/types';\nimport type {\n  Map,\n  MapLayerEventType,\n  MapLayerMouseEvent,\n  MapLayerTouchEvent,\n  FilterSpecification,\n  CircleLayerSpecification,\n} from 'maplibre-gl';\n\n/**\n * Props interface for CircleLayer component\n * Defines all configurable properties for a MapLibre GL Circle Layer\n */\ninterface LayerProps {\n  /** Unique identifier for the layer */\n  id: string;\n  /** Filter expression to apply to the layer */\n  filter: FilterSpecification;\n  /** Style configuration for the circle layer */\n  style: CircleLayerStyle;\n  /** Maximum zoom level for layer visibility */\n  maxzoom: number;\n  /** Minimum zoom level for layer visibility */\n  minzoom: number;\n  /** Arbitrary metadata for the layer */\n  metadata: object;\n  /** Data source for the layer */\n  source: string | object;\n  /** Source layer name for vector sources */\n  sourceLayer: string;\n  /** ID of layer before which to insert this layer */\n  beforeId: string;\n  /** Whether the layer is visible */\n  visible: boolean;\n  /** Enable debug logging */\n  debug: boolean;\n  /** Callback function to register layer actions */\n  register: (\n    actions: CreateLayerActions<CircleLayerSpecification>,\n    map: Map,\n  ) => void;\n}\n\n/**\n * Events interface for CircleLayer component\n * Defines all events that can be emitted by the layer\n */\ninterface Emits {\n  /** Generic layer event */\n  (e: keyof MapLayerEventType, ev: any): void;\n  /** Layer registration event */\n  (\n    e: 'register',\n    actions: CreateLayerActions<CircleLayerSpecification>,\n    map: Map,\n  ): void;\n  /** Mouse events */\n  (\n    e:\n      | 'click'\n      | 'dblclick'\n      | 'mousedown'\n      | 'mouseup'\n      | 'mousemove'\n      | 'mouseenter'\n      | 'mouseleave'\n      | 'mouseover'\n      | 'mouseout'\n      | 'contextmenu',\n    ev: MapLayerMouseEvent,\n  ): void;\n  /** Touch events */\n  (e: 'touchstart' | 'touchend' | 'touchcancel', ev: MapLayerTouchEvent): void;\n}\n\n// Component props with sensible defaults and performance optimizations\nconst props = withDefaults(defineProps<Partial<LayerProps>>(), {\n  visible: true,\n  debug: false,\n  filter: () => ['all'] as FilterSpecification,\n  style: () => ({}) as CircleLayerStyle,\n});\n\n// Component events\nconst emits = defineEmits<Emits>();\n\n// Injected dependencies\nconst sourceData = inject(SourceProvideKey, ref(null));\nconst mapInstance = inject(MapProvideKey, ref(null));\n\n// Computed properties for better performance and reactivity\nconst effectiveSource = computed(() => props.source || sourceData.value);\n\nconst visibilityStyle = computed(\n  (): AnyLayout => ({\n    visibility: props.visible ? 'visible' : 'none',\n  }),\n);\n\nconst mergedStyle = computed(() => ({\n  ...props.style,\n  ...visibilityStyle.value,\n}));\n\n// Enhanced register callback with proper typing\nconst handleRegister = (\n  actions: CreateLayerActions<CircleLayerSpecification>,\n  map: Map,\n) => {\n  props.register?.(actions, map);\n  emits('register', actions, map);\n};\n\n// Create circle layer with optimized configuration\nconst {\n  getLayer,\n  setBeforeId,\n  setFilter,\n  setStyle,\n  setZoomRange,\n  setLayoutProperty,\n} = useCreateCircleLayer({\n  map: mapInstance,\n  source: effectiveSource,\n  style: mergedStyle.value,\n  filter: props.filter || ['all'],\n  id: props.id,\n  maxzoom: props.maxzoom,\n  minzoom: props.minzoom,\n  metadata: props.metadata,\n  sourceLayer: props.sourceLayer,\n  register: handleRegister,\n});\n\n// Optimized event listener setup with error handling\nMapboxLayerEvents.forEach((evt) => {\n  useLayerEventListener({\n    map: mapInstance,\n    layer: getLayer,\n    event: evt,\n    on: (data) => {\n      emits(evt, data);\n    },\n  });\n});\n\n// Optimized single watcher for all prop changes to reduce overhead\nconst stopPropsWatcher = watch(\n  () => ({\n    filter: props.filter,\n    style: props.style,\n    maxzoom: props.maxzoom,\n    minzoom: props.minzoom,\n    beforeId: props.beforeId,\n    visible: props.visible,\n  }),\n  (newProps, oldProps) => {\n    // Only update if values actually changed to prevent unnecessary operations\n    if (newProps.filter !== oldProps?.filter) {\n      setFilter(newProps.filter);\n    }\n    if (newProps.style !== oldProps?.style) {\n      setStyle(newProps.style);\n    }\n    if (\n      newProps.maxzoom !== oldProps?.maxzoom ||\n      newProps.minzoom !== oldProps?.minzoom\n    ) {\n      setZoomRange(newProps.minzoom, newProps.maxzoom);\n    }\n    if (newProps.beforeId !== oldProps?.beforeId) {\n      setBeforeId(newProps.beforeId);\n    }\n    if (newProps.visible !== oldProps?.visible) {\n      setLayoutProperty('visibility', newProps.visible ? 'visible' : 'none');\n    }\n  },\n  {\n    deep: true,\n    flush: 'post', // Run after DOM updates for better performance\n  },\n);\n\n// Enhanced cleanup\nonUnmounted(() => {\n  stopPropsWatcher();\n});\n</script>\n<template></template>\n","<script lang=\"ts\" setup>\nimport { ref, inject, watch, computed, onUnmounted } from 'vue';\nimport {\n  MapProvideKey,\n  SourceProvideKey,\n  MapboxLayerEvents,\n} from '@libs/enums';\nimport { useCreateLineLayer, useLayerEventListener } from '@libs/composables';\nimport type {\n  CreateLayerActions,\n  AnyLayout,\n  LineLayerStyle,\n} from '@libs/types';\nimport type {\n  Map,\n  MapLayerEventType,\n  MapLayerMouseEvent,\n  MapLayerTouchEvent,\n  FilterSpecification,\n  LineLayerSpecification,\n} from 'maplibre-gl';\n\n/**\n * Props interface for LineLayer component\n * Defines all configurable properties for a MapLibre GL Line Layer\n */\ninterface LayerProps {\n  /** Unique identifier for the layer */\n  id: string;\n  /** Filter expression to apply to the layer */\n  filter: FilterSpecification;\n  /** Style configuration for the line layer */\n  style: LineLayerStyle;\n  /** Maximum zoom level for layer visibility */\n  maxzoom: number;\n  /** Minimum zoom level for layer visibility */\n  minzoom: number;\n  /** Arbitrary metadata for the layer */\n  metadata: object;\n  /** Data source for the layer */\n  source: string | object;\n  /** Source layer name for vector sources */\n  sourceLayer: string;\n  /** ID of layer before which to insert this layer */\n  beforeId: string;\n  /** Whether the layer is visible */\n  visible: boolean;\n  /** Callback function to register layer actions */\n  register: (\n    actions: CreateLayerActions<LineLayerSpecification>,\n    map: Map,\n  ) => void;\n}\n\n/**\n * Events interface for LineLayer component\n * Defines all events that can be emitted by the layer\n */\ninterface Emits {\n  /** Generic layer event */\n  (e: keyof MapLayerEventType, ev: any): void;\n  /** Layer registration event */\n  (\n    e: 'register',\n    actions: CreateLayerActions<LineLayerSpecification>,\n    map: Map,\n  ): void;\n  /** Mouse events */\n  (\n    e:\n      | 'click'\n      | 'dblclick'\n      | 'mousedown'\n      | 'mouseup'\n      | 'mousemove'\n      | 'mouseenter'\n      | 'mouseleave'\n      | 'mouseover'\n      | 'mouseout'\n      | 'contextmenu',\n    ev: MapLayerMouseEvent,\n  ): void;\n  /** Touch events */\n  (e: 'touchstart' | 'touchend' | 'touchcancel', ev: MapLayerTouchEvent): void;\n}\n\n// Component props with sensible defaults\nconst props = withDefaults(defineProps<Partial<LayerProps>>(), {\n  visible: true,\n});\n\n// Component events\nconst emits = defineEmits<Emits>();\n\n// Injected dependencies\nconst sourceData = inject(SourceProvideKey, ref(null));\nconst mapInstance = inject(MapProvideKey, ref(null));\n\n// Computed properties for better performance and reactivity\nconst effectiveSource = computed(() => props.source || sourceData.value);\n\nconst visibilityStyle = computed(\n  (): AnyLayout => ({\n    visibility: props.visible ? 'visible' : 'none',\n  }),\n);\n\nconst mergedStyle = computed(() => ({\n  ...props.style,\n  ...visibilityStyle.value,\n}));\n\n// Enhanced register callback with proper typing\nconst handleRegister = (\n  actions: CreateLayerActions<LineLayerSpecification>,\n  map: Map,\n) => {\n  props.register?.(actions, map);\n  emits('register', actions, map);\n};\n\n// Create line layer with optimized configuration\nconst {\n  getLayer,\n  setBeforeId,\n  setFilter,\n  setStyle,\n  setZoomRange,\n  setLayoutProperty,\n} = useCreateLineLayer({\n  map: mapInstance,\n  source: effectiveSource,\n  style: mergedStyle.value,\n  filter: props.filter || ['all'],\n  id: props.id,\n  maxzoom: props.maxzoom,\n  minzoom: props.minzoom,\n  metadata: props.metadata,\n  sourceLayer: props.sourceLayer,\n  register: handleRegister,\n});\n\n// Optimized event listener setup with error handling\nMapboxLayerEvents.forEach((evt) => {\n  useLayerEventListener({\n    map: mapInstance,\n    layer: getLayer,\n    event: evt,\n    on: (data) => {\n      emits(evt, data);\n    },\n  });\n});\n\n// Optimized single watcher for all prop changes to reduce overhead\nconst stopPropsWatcher = watch(\n  () => ({\n    filter: props.filter,\n    style: props.style,\n    maxzoom: props.maxzoom,\n    minzoom: props.minzoom,\n    beforeId: props.beforeId,\n    visible: props.visible,\n  }),\n  (newProps, oldProps) => {\n    // Only update if values actually changed to prevent unnecessary operations\n    if (newProps.filter !== oldProps?.filter) {\n      setFilter(newProps.filter);\n    }\n    if (newProps.style !== oldProps?.style) {\n      setStyle(newProps.style);\n    }\n    if (\n      newProps.maxzoom !== oldProps?.maxzoom ||\n      newProps.minzoom !== oldProps?.minzoom\n    ) {\n      setZoomRange(newProps.minzoom, newProps.maxzoom);\n    }\n    if (newProps.beforeId !== oldProps?.beforeId) {\n      setBeforeId(newProps.beforeId);\n    }\n    if (newProps.visible !== oldProps?.visible) {\n      setLayoutProperty('visibility', newProps.visible ? 'visible' : 'none');\n    }\n  },\n  {\n    deep: true,\n    flush: 'post', // Run after DOM updates for better performance\n  },\n);\n\n// Enhanced cleanup\nonUnmounted(() => {\n  stopPropsWatcher();\n});\n</script>\n<template></template>\n","<script lang=\"ts\" setup>\nimport { ref, inject, watch, computed, onUnmounted } from 'vue';\nimport {\n  MapProvideKey,\n  SourceProvideKey,\n  MapboxLayerEvents,\n} from '@libs/enums';\nimport { useCreateSymbolLayer, useLayerEventListener } from '@libs/composables';\nimport type {\n  CreateLayerActions,\n  AnyLayout,\n  SymbolLayerStyle,\n} from '@libs/types';\nimport type {\n  Map,\n  MapLayerEventType,\n  MapLayerMouseEvent,\n  MapLayerTouchEvent,\n  FilterSpecification,\n  SymbolLayerSpecification,\n} from 'maplibre-gl';\n\n/**\n * Props interface for SymbolLayer component\n * Defines all configurable properties for a MapLibre GL Symbol Layer\n */\ninterface LayerProps {\n  /** Unique identifier for the layer */\n  id: string;\n  /** Filter expression to apply to the layer */\n  filter: FilterSpecification;\n  /** Style configuration for the symbol layer */\n  style: SymbolLayerStyle;\n  /** Maximum zoom level for layer visibility */\n  maxzoom: number;\n  /** Minimum zoom level for layer visibility */\n  minzoom: number;\n  /** Arbitrary metadata for the layer */\n  metadata: object;\n  /** Data source for the layer */\n  source: string | object;\n  /** Source layer name for vector sources */\n  sourceLayer: string;\n  /** ID of layer before which to insert this layer */\n  beforeId: string;\n  /** Whether the layer is visible */\n  visible: boolean;\n  /** Callback function to register layer actions */\n  register: (\n    actions: CreateLayerActions<SymbolLayerSpecification>,\n    map: Map,\n  ) => void;\n}\n\n/**\n * Events interface for SymbolLayer component\n * Defines all events that can be emitted by the layer\n */\ninterface Emits {\n  /** Generic layer event */\n  (e: keyof MapLayerEventType, ev: any): void;\n  /** Layer registration event */\n  (\n    e: 'register',\n    actions: CreateLayerActions<SymbolLayerSpecification>,\n    map: Map,\n  ): void;\n  /** Mouse events */\n  (\n    e:\n      | 'click'\n      | 'dblclick'\n      | 'mousedown'\n      | 'mouseup'\n      | 'mousemove'\n      | 'mouseenter'\n      | 'mouseleave'\n      | 'mouseover'\n      | 'mouseout'\n      | 'contextmenu',\n    ev: MapLayerMouseEvent,\n  ): void;\n  /** Touch events */\n  (e: 'touchstart' | 'touchend' | 'touchcancel', ev: MapLayerTouchEvent): void;\n}\n\n// Component props with sensible defaults\nconst props = withDefaults(defineProps<Partial<LayerProps>>(), {\n  visible: true,\n});\n\n// Component events\nconst emits = defineEmits<Emits>();\n\n// Injected dependencies\nconst sourceData = inject(SourceProvideKey, ref(null));\nconst mapInstance = inject(MapProvideKey, ref(null));\n\n// Computed properties for better performance and reactivity\nconst effectiveSource = computed(() => props.source || sourceData.value);\n\nconst visibilityStyle = computed(\n  (): AnyLayout => ({\n    visibility: props.visible ? 'visible' : 'none',\n  }),\n);\n\nconst mergedStyle = computed(() => ({\n  ...props.style,\n  ...visibilityStyle.value,\n}));\n\n// Enhanced register callback with proper typing\nconst handleRegister = (\n  actions: CreateLayerActions<SymbolLayerSpecification>,\n  map: Map,\n) => {\n  props.register?.(actions, map);\n  emits('register', actions, map);\n};\n\n// Create symbol layer with optimized configuration\nconst {\n  getLayer,\n  setBeforeId,\n  setFilter,\n  setStyle,\n  setZoomRange,\n  setLayoutProperty,\n} = useCreateSymbolLayer({\n  map: mapInstance,\n  source: effectiveSource,\n  style: mergedStyle.value,\n  filter: props.filter || ['all'],\n  id: props.id,\n  maxzoom: props.maxzoom,\n  minzoom: props.minzoom,\n  metadata: props.metadata,\n  sourceLayer: props.sourceLayer,\n  register: handleRegister,\n});\n\n// Optimized event listener setup with error handling\nMapboxLayerEvents.forEach((evt) => {\n  useLayerEventListener({\n    map: mapInstance,\n    layer: getLayer,\n    event: evt,\n    on: (data) => {\n      emits(evt, data);\n    },\n  });\n});\n\n// Optimized single watcher for all prop changes to reduce overhead\nconst stopPropsWatcher = watch(\n  () => ({\n    filter: props.filter,\n    style: props.style,\n    maxzoom: props.maxzoom,\n    minzoom: props.minzoom,\n    beforeId: props.beforeId,\n    visible: props.visible,\n  }),\n  (newProps, oldProps) => {\n    // Only update if values actually changed to prevent unnecessary operations\n    if (newProps.filter !== oldProps?.filter) {\n      setFilter(newProps.filter);\n    }\n    if (newProps.style !== oldProps?.style) {\n      setStyle(newProps.style);\n    }\n    if (\n      newProps.maxzoom !== oldProps?.maxzoom ||\n      newProps.minzoom !== oldProps?.minzoom\n    ) {\n      setZoomRange(newProps.minzoom, newProps.maxzoom);\n    }\n    if (newProps.beforeId !== oldProps?.beforeId) {\n      setBeforeId(newProps.beforeId);\n    }\n    if (newProps.visible !== oldProps?.visible) {\n      setLayoutProperty('visibility', newProps.visible ? 'visible' : 'none');\n    }\n  },\n  {\n    deep: true,\n    flush: 'post', // Run after DOM updates for better performance\n  },\n);\n\n// Enhanced cleanup\nonUnmounted(() => {\n  stopPropsWatcher();\n});\n</script>\n<template></template>\n","<script lang=\"ts\" setup>\nimport { inject, ref, computed, watch, onMounted } from 'vue';\nimport { useCreateImage, useLogger } from '@libs/composables';\nimport { MapProvideKey } from '@libs/enums';\nimport type { ImageDatas } from '@libs/types';\nimport type { StyleImageMetadata } from 'maplibre-gl';\n\n/**\n * Interface for individual image items\n */\ninterface ImageItem {\n  /** Unique identifier for the image */\n  id: string;\n  /** Image data (URL string or ImageData/HTMLImageElement) */\n  image: ImageDatas | string;\n  /** Optional image metadata and options */\n  options?: Partial<StyleImageMetadata>;\n}\n\n/**\n * Props interface for Image component\n * Manages multiple images for MapLibre GL\n */\ninterface ImageProps {\n  /** Array of images to load */\n  images: ImageItem[];\n  /** Default options applied to all images */\n  options?: Partial<StyleImageMetadata>;\n  /** Whether to show loading state */\n  showLoading?: boolean;\n  /** Whether to enable debug logging */\n  debug?: boolean;\n  /**\n   * Force recreation when image dimensions change instead of throwing error.\n   * When true (default), images are always removed and re-added to prevent dimension mismatch errors.\n   * This solves the common \"width and height must be the same as the previous version\" error.\n   */\n  forceRecreateOnDimensionChange?: boolean;\n}\n\n// Component props with sensible defaults\nconst props = withDefaults(defineProps<ImageProps>(), {\n  images: () => [],\n  showLoading: true,\n  forceRecreateOnDimensionChange: true,\n});\n\nconst { logError } = useLogger(props.debug);\n\n// Reactive state\nconst loading = ref(true);\n\n// Injected dependencies\nconst mapInstance = inject(MapProvideKey, ref(null));\n\n// Computed properties for better performance\nconst hasImages = computed(() => props.images.length > 0);\n\n/**\n * Enhanced image loading function with error handling and progress tracking\n * @param images - Array of images to load\n */\nasync function loadImages(images: ImageItem[]): Promise<void> {\n  if (!images.length) {\n    loading.value = false;\n    return;\n  }\n\n  loading.value = true;\n\n  try {\n    const loadPromises = images.map(async (image) => {\n      try {\n        const actions = useCreateImage({\n          map: mapInstance,\n          id: image.id,\n          image: image.image,\n          options: image.options || props.options,\n          debug: props.debug,\n          forceRecreateOnDimensionChange: props.forceRecreateOnDimensionChange,\n        });\n        await actions.loadPromise;\n      } catch (error) {\n        const errorMessage = `Failed to load image ${image.id}: ${error}`;\n        logError(errorMessage);\n      }\n    });\n\n    await Promise.allSettled(loadPromises);\n  } catch (error) {\n    logError('Error loading images:', error);\n  } finally {\n    loading.value = false;\n  }\n}\n\n// Watch for changes in images prop\nwatch(\n  () => props.images,\n  (newImages) => {\n    if (newImages.length > 0) {\n      loadImages(newImages);\n    }\n  },\n  { deep: true, immediate: false },\n);\n\n// Load images on mount\nonMounted(() => {\n  if (hasImages.value) {\n    loadImages(props.images);\n  } else {\n    loading.value = false;\n  }\n});\n</script>\n<template>\n  <slot v-if=\"!loading\" />\n</template>\n","<script lang=\"ts\" setup>\nimport { inject, ref, watch, computed } from 'vue';\nimport { MapProvideKey } from '@libs/enums';\nimport { useCreatePopup } from '@libs/composables';\nimport type { LngLatLike, PopupOptions } from 'maplibre-gl';\n\n/**\n * Props interface for Popup component\n * Defines all configurable properties for a MapLibre GL Popup\n */\ninterface PopupProps {\n  /** CSS class name for the popup */\n  className: string;\n  /** Geographic coordinates for the popup */\n  lnglat: LngLatLike;\n  /** Whether the popup is visible */\n  show: boolean;\n  /** Whether to attach popup to the map */\n  withMap: boolean;\n  /** Popup configuration options */\n  options: PopupOptions;\n  /** HTML content for the popup */\n  html: string;\n  /** Maximum width of the popup */\n  maxWidth?: string;\n  /** Whether to show close button */\n  closeButton?: boolean;\n  /** Whether to close on map click */\n  closeOnClick?: boolean;\n  /** Whether to close on escape key */\n  closeOnEscape?: boolean;\n}\n\n/**\n * Events interface for Popup component\n * Defines all events that can be emitted by the popup\n */\ninterface Emits {\n  /** Fired when popup is closed */\n  (event: 'close'): void;\n  /** Fired when popup is opened */\n  (event: 'open'): void;\n  /** Fired when show state changes (for v-model support) */\n  (event: 'update:show', show: boolean): void;\n}\n\n// Component props with sensible defaults\nconst props = withDefaults(defineProps<Partial<PopupProps>>(), {\n  show: true,\n  withMap: true,\n  closeButton: true,\n  closeOnClick: true,\n  closeOnEscape: true,\n});\n\n// Component events\nconst emits = defineEmits<Emits>();\n\n// Injected dependencies\nconst mapInstance = inject(MapProvideKey, ref(null));\nconst popupElRef = ref<HTMLElement>();\n\n// Computed properties for better performance\nconst popupOptions = computed(() => ({\n  ...props.options,\n  className: props.className,\n  maxWidth: props.maxWidth,\n  closeButton: props.closeButton,\n  closeOnClick: props.closeOnClick,\n  closeOnEscape: props.closeOnEscape,\n}));\n\n// Enhanced event handlers with error handling\nconst eventHandlers = {\n  open: () => {\n    emits('open');\n    emits('update:show', true);\n  },\n  close: () => {\n    emits('close');\n    emits('update:show', false);\n  },\n};\n\n// Create popup with optimized configuration\nconst { setLngLat, show, hide } = useCreatePopup({\n  map: mapInstance,\n  el: popupElRef,\n  lnglat: props.lnglat,\n  html: props.html,\n  show: props.show,\n  withMap: props.withMap,\n  options: popupOptions.value,\n  on: eventHandlers,\n});\n\n// Reactive watchers for prop changes with error handling\nwatch(\n  () => props.show,\n  (isShow) => {\n    isShow ? show() : hide();\n  },\n);\n\nwatch(\n  () => props.lnglat,\n  (newLnglat) => {\n    if (newLnglat) {\n      setLngLat(newLnglat);\n    }\n  },\n  { deep: true },\n);\n</script>\n<template>\n  <div ref=\"popupElRef\" class=\"mapboxgl-popup-content-inner\">\n    <slot />\n  </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { inject, ref, useSlots, watch, computed } from 'vue';\nimport { MapProvideKey } from '@libs/enums';\nimport { useCreateMarker } from '@libs/composables';\nimport type { Anchor } from '@libs/types';\nimport type {\n  LngLatLike,\n  Alignment,\n  PointLike,\n  MarkerOptions,\n  Popup,\n} from 'maplibre-gl';\n\n/**\n * Props interface for Marker component\n * Defines all configurable properties for a MapLibre GL Marker\n */\ninterface MarkerProps {\n  /** Geographic coordinates for the marker */\n  lnglat: LngLatLike;\n  /** Popup to associate with the marker */\n  popup: Popup;\n  /** Marker configuration options */\n  options: MarkerOptions;\n  /** Whether the marker is draggable */\n  draggable: boolean;\n  /** Custom HTML element for the marker */\n  element: HTMLElement | undefined;\n  /** Offset from the marker's position */\n  offset: PointLike | undefined;\n  /** Anchor point for the marker */\n  anchor: Anchor | undefined;\n  /** Color of the default marker */\n  color: string | undefined;\n  /** Tolerance for click events */\n  clickTolerance: number | undefined;\n  /** Rotation angle in degrees */\n  rotation: number | undefined;\n  /** Rotation alignment relative to the map */\n  rotationAlignment: Alignment | undefined;\n  /** Pitch alignment relative to the map */\n  pitchAlignment: Alignment | undefined;\n  /** Scale factor for the marker */\n  scale: number | undefined;\n  /** Opacity when marker is occluded */\n  occludedOpacity: number | undefined;\n}\n\n/**\n * Events interface for Marker component\n * Defines all events that can be emitted by the marker\n */\ninterface Emits {\n  /** Fired when marker drag starts */\n  (e: 'dragstart', ev: Event): void;\n  /** Fired during marker drag */\n  (e: 'drag', ev: Event): void;\n  /** Fired when marker drag ends */\n  (e: 'dragend', ev: Event): void;\n}\n\n// Component props with sensible defaults\nconst props = withDefaults(defineProps<Partial<MarkerProps>>(), {\n  options: () => ({}),\n});\n\n// Component events\nconst emits = defineEmits<Emits>();\n\n// Slots for custom marker content\nconst slots = useSlots();\n\n// Injected dependencies\nconst mapInstance = inject(MapProvideKey, ref(null));\nconst markerElRef = ref<HTMLElement>();\n\n// Computed properties for better performance\nconst hasCustomElement = computed(() => Boolean(slots.default?.()));\n\nconst markerOptions = computed(() => ({\n  ...props.options,\n  ...(props.draggable !== undefined && { draggable: props.draggable }),\n  ...(props.offset !== undefined && { offset: props.offset }),\n  ...(props.anchor !== undefined && { anchor: props.anchor }),\n  ...(props.color !== undefined && { color: props.color }),\n  ...(props.clickTolerance !== undefined && {\n    clickTolerance: props.clickTolerance,\n  }),\n  ...(props.rotation !== undefined && { rotation: props.rotation }),\n  ...(props.rotationAlignment !== undefined && {\n    rotationAlignment: props.rotationAlignment,\n  }),\n  ...(props.pitchAlignment !== undefined && {\n    pitchAlignment: props.pitchAlignment,\n  }),\n  ...(props.scale !== undefined && { scale: props.scale }),\n  ...(props.occludedOpacity !== undefined && {\n    occludedOpacity: props.occludedOpacity,\n  }),\n}));\n\n// Enhanced event handlers with error handling\nconst eventHandlers = {\n  dragstart: (ev: Event) => {\n    emits('dragstart', ev);\n  },\n  drag: (ev: Event) => {\n    emits('drag', ev);\n  },\n  dragend: (ev: Event) => {\n    emits('dragend', ev);\n  },\n};\n\n// Create marker with optimized configuration\nconst { setDraggable, setLngLat } = useCreateMarker({\n  map: mapInstance,\n  el: hasCustomElement.value ? markerElRef : undefined,\n  lnglat: props.lnglat,\n  popup: props.popup,\n  options: markerOptions.value,\n  on: eventHandlers,\n});\n\n// Reactive watchers for prop changes with error handling\nwatch(\n  () => props.lnglat,\n  (newLnglat) => {\n    if (newLnglat) {\n      setLngLat(newLnglat);\n    }\n  },\n  { deep: true },\n);\n\nwatch(\n  () => props.draggable,\n  (newDraggable) => {\n    if (newDraggable !== undefined) {\n      setDraggable(newDraggable);\n    }\n  },\n);\n</script>\n<template>\n  <div ref=\"markerElRef\">\n    <slot />\n  </div>\n</template>\n","import {\n  computed,\n  effectScope,\n  onUnmounted,\n  ref,\n  shallowRef,\n  unref,\n  watch,\n  type ComputedRef,\n  type EffectScope,\n} from 'vue';\nimport type {\n  FeatureIdentifier,\n  LngLatBoundsLike,\n  LngLatLike,\n  Map,\n  MapOptions,\n  PaddingOptions,\n  PointLike,\n  QueryRenderedFeaturesOptions,\n  QuerySourceFeatureOptions,\n  StyleSpecification,\n} from 'maplibre-gl';\n\nimport { useLogger } from '@libs/composables';\nimport { MapCreationStatus } from '@libs/enums';\nimport type { MaplibreActions, MaplibreMethods, Nullable } from '@libs/types';\n\ninterface UseMapboxOptions {\n  /** Enable debug logging */\n  debug?: boolean;\n  /** Automatically cleanup resources on unmount */\n  autoCleanup?: boolean;\n}\n\ninterface UseMapboxReturn\n  extends Omit<\n    MaplibreMethods,\n    | 'mapCreationStatus'\n    | 'isMapReady'\n    | 'isMapLoading'\n    | 'hasMapError'\n    | 'mapInstance'\n  > {\n  /** Reactive map instance reference */\n  readonly mapInstance: ComputedRef<Map | null>;\n  /** Current map creation status */\n  readonly mapStatus: ComputedRef<MapCreationStatus>;\n  /** Whether the map is ready for operations */\n  readonly isMapReady: ComputedRef<boolean>;\n  /** Whether the map is currently loading */\n  readonly isMapLoading: ComputedRef<boolean>;\n  /** Whether the map has encountered an error */\n  readonly hasMapError: ComputedRef<boolean>;\n  /** Whether a map instance is registered and ready */\n  readonly isRegistered: ComputedRef<boolean>;\n\n  /** Register a MapLibre actions instance */\n  register: (instance: MaplibreActions) => Promise<void>;\n  /** Set map options on the registered instance */\n  setMapOptions: (options: Partial<MapOptions>) => void;\n}\n\n/**\n * Composable for managing MapLibre GL Map instances\n *\n * Provides reactive state management and a clean API for interacting with MapLibre GL maps.\n * Handles registration, lifecycle management, and provides reactive access to map state.\n *\n * @param options - Configuration options for the composable\n * @returns Reactive map management interface\n */\nexport function useMapbox(options: UseMapboxOptions = {}): UseMapboxReturn {\n  const { debug = false, autoCleanup = true } = options;\n  const { logError } = useLogger(debug);\n\n  // Internal state\n  const instanceRef = ref<MaplibreActions>();\n  const mapStatus = ref<MapCreationStatus>(MapCreationStatus.NotInitialized);\n  const mapInstance = shallowRef<Nullable<Map>>(null);\n\n  let watchScope: EffectScope | undefined;\n\n  // Reactive computed properties\n  const isMapReady = computed(\n    () => mapStatus.value === MapCreationStatus.Loaded,\n  );\n  const isMapLoading = computed(\n    () => mapStatus.value === MapCreationStatus.Loading,\n  );\n  const hasMapError = computed(\n    () => mapStatus.value === MapCreationStatus.Error,\n  );\n  const isRegistered = computed(\n    () => isMapReady.value && mapInstance.value !== null,\n  );\n\n  /**\n   * Registers a MapLibre actions instance with enhanced error handling and validation\n   * @param instance - MapLibre actions instance to register\n   */\n  async function register(instance: MaplibreActions): Promise<void> {\n    try {\n      // Validate instance\n      if (!instance) {\n        throw new Error('Cannot register: instance is null or undefined');\n      }\n\n      if (!instance.mapInstance) {\n        throw new Error(\n          'Cannot register: instance missing mapInstance property',\n        );\n      }\n\n      // Prevent duplicate registration\n      if (instance === unref(instanceRef)) {\n        if (debug) {\n          console.log('Skipping duplicate registration for same instance');\n        }\n        return;\n      }\n\n      if (debug) {\n        console.log('🔄 Registering MapLibre instance with useMapbox', {\n          hasMapInstance: !!instance.mapInstance,\n          currentMapCreationStatus: instance.mapCreationStatus,\n          isMapReady: instance.isMapReady,\n          isMapLoading: instance.isMapLoading,\n          hasMapError: instance.hasMapError,\n        });\n      }\n      instanceRef.value = instance;\n\n      // Clean up previous watch scope\n      watchScope?.stop();\n\n      // Set up new watch scope for instance changes\n      watchScope = effectScope();\n      watchScope.run(() => {\n        // Watch for map instance changes\n        watch(\n          () => instance.mapInstance.value,\n          (map) => {\n            try {\n              mapInstance.value = map;\n              if (debug) {\n                console.log('🗺️ Map instance updated in useMapbox', {\n                  hasMap: !!map,\n                  mapLoaded: map?.loaded?.(),\n                });\n              }\n            } catch (error) {\n              mapStatus.value = MapCreationStatus.Error;\n              logError('Error updating map instance:', error);\n            }\n          },\n          {\n            immediate: true,\n          },\n        );\n\n        // Set initial status from instance\n        mapStatus.value = instance.mapCreationStatus;\n\n        // Watch for map instance changes to determine status\n        watch(\n          () => instance.mapInstance.value,\n          (map) => {\n            try {\n              if (map) {\n                // Map instance exists, check if it's loaded\n                if (map.loaded()) {\n                  mapStatus.value = MapCreationStatus.Loaded;\n                  if (debug) {\n                    console.log('Map successfully registered with useMapbox');\n                  }\n                } else {\n                  // Map exists but not loaded yet\n                  mapStatus.value = MapCreationStatus.Loading;\n\n                  // Listen for load event\n                  const onLoad = () => {\n                    mapStatus.value = MapCreationStatus.Loaded;\n                    if (debug) {\n                      console.log('Map loaded and registered with useMapbox');\n                    }\n                    map.off('load', onLoad);\n                  };\n\n                  map.on('load', onLoad);\n                }\n              } else {\n                // No map instance\n                if (instance.hasMapError) {\n                  mapStatus.value = MapCreationStatus.Error;\n                } else if (instance.isMapLoading) {\n                  mapStatus.value = MapCreationStatus.Loading;\n                } else {\n                  mapStatus.value = MapCreationStatus.NotInitialized;\n                }\n              }\n            } catch (error) {\n              mapStatus.value = MapCreationStatus.Error;\n              logError('Error updating map status:', error);\n            }\n          },\n          {\n            immediate: true,\n          },\n        );\n      });\n    } catch (error) {\n      mapStatus.value = MapCreationStatus.Error;\n      logError('Error registering MapLibre instance:', error);\n      throw error; // Re-throw to allow caller to handle\n    }\n  }\n\n  // Helper functions\n  const getMapInstance = (): Map | null => mapInstance.value;\n  const getInstance = (): MaplibreActions | undefined => instanceRef.value;\n\n  // Map methods that delegate to the current instance\n  const methods = {\n    getContainer: () => getMapInstance()?.getContainer(),\n    getCanvasContainer: () => getMapInstance()?.getCanvasContainer(),\n    getCanvas: () => getMapInstance()?.getCanvas(),\n    getStyle: () => getMapInstance()?.getStyle(),\n    getBounds: () => getMapInstance()?.getBounds(),\n    getCenter: () => getMapInstance()?.getCenter(),\n    getZoom: () => getMapInstance()?.getZoom(),\n    getBearing: () => getMapInstance()?.getBearing(),\n    getPadding: () => getMapInstance()?.getPadding(),\n    getPitch: () => getMapInstance()?.getPitch(),\n    getMinZoom: () => getMapInstance()?.getMinZoom(),\n    getMaxZoom: () => getMapInstance()?.getMaxZoom(),\n    getMinPitch: () => getMapInstance()?.getMinPitch(),\n    getMaxPitch: () => getMapInstance()?.getMaxPitch(),\n    getFilter: (layerId: string) => getMapInstance()?.getFilter(layerId),\n    getLayer: (layerId: string) => getMapInstance()?.getLayer(layerId),\n    getLayoutProperty: (layerId: string, name: string) =>\n      getMapInstance()?.getLayoutProperty(layerId, name),\n    getPaintProperty: (layerId: string, name: string) =>\n      getMapInstance()?.getPaintProperty(layerId, name),\n    getSource: (sourceId: string) => getMapInstance()?.getSource(sourceId),\n    project: (lnglat: LngLatLike) => getMapInstance()?.project(lnglat),\n    unproject: (point: PointLike) => getMapInstance()?.unproject(point),\n    queryRenderedFeatures: (\n      point: PointLike | [PointLike, PointLike],\n      options?: QueryRenderedFeaturesOptions,\n    ) => getMapInstance()?.queryRenderedFeatures(point, options),\n    querySourceFeatures: (\n      sourceId: string,\n      parameters?: QuerySourceFeatureOptions,\n    ) => getMapInstance()?.querySourceFeatures(sourceId, parameters),\n    queryTerrainElevation: (lnglat: LngLatLike) =>\n      getMapInstance()?.queryTerrainElevation(lnglat),\n    isStyleLoaded: () => getMapInstance()?.isStyleLoaded(),\n    isMoving: () => getMapInstance()?.isMoving(),\n    isZooming: () => getMapInstance()?.isZooming(),\n    isRotating: () => getMapInstance()?.isRotating(),\n    isEasing: () => getMapInstance()?.isEasing(),\n    resize: () => getMapInstance()?.resize(),\n    remove: () => getMapInstance()?.remove(),\n    triggerRepaint: () => getMapInstance()?.triggerRepaint(),\n    setFeatureState: (options: FeatureIdentifier, state: Record<string, any>) =>\n      getMapInstance()?.setFeatureState(options, state),\n    removeFeatureState: (options: FeatureIdentifier, key: string) =>\n      getMapInstance()?.removeFeatureState(options, key),\n    getFeatureState: (options: FeatureIdentifier) =>\n      getMapInstance()?.getFeatureState(options),\n    setPadding: (padding?: PaddingOptions) =>\n      padding && getMapInstance()?.setPadding(padding),\n\n    // Setter methods that delegate to instance\n    setRenderWorldCopies: (val: boolean) =>\n      getInstance()?.setRenderWorldCopies?.(val),\n    setMinZoom: (zoom: number) => getInstance()?.setMinZoom?.(zoom),\n    setMinPitch: (pitch: number) => getInstance()?.setMinPitch?.(pitch),\n    setMaxZoom: (zoom: number) => getInstance()?.setMaxZoom?.(zoom),\n    setMaxPitch: (pitch: number) => getInstance()?.setMaxPitch?.(pitch),\n    setMaxBounds: (bounds: LngLatBoundsLike) =>\n      getInstance()?.setMaxBounds?.(bounds),\n    setStyle: (style: string | StyleSpecification) =>\n      getInstance()?.setStyle?.(style),\n    setPitch: (pitch: number) => getInstance()?.setPitch?.(pitch),\n    setZoom: (zoom: number) => getInstance()?.setZoom?.(zoom),\n    setBearing: (bearing: number) => getInstance()?.setBearing?.(bearing),\n    setCenter: (center: LngLatLike) => getInstance()?.setCenter?.(center),\n  };\n\n  // Cleanup on component unmount\n  onUnmounted(() => {\n    if (autoCleanup) {\n      // Stop watching\n      watchScope?.stop();\n\n      // Clear references\n      instanceRef.value = undefined;\n      mapInstance.value = null;\n      mapStatus.value = MapCreationStatus.NotInitialized;\n    }\n  });\n\n  /**\n   * Sets map options on the registered instance\n   */\n  const setMapOptions = (options: Partial<MapOptions>): void => {\n    const instance = getInstance();\n    if (instance?.setMapOptions) {\n      instance.setMapOptions(options);\n      if (debug) console.log('Map options updated', options);\n    } else {\n      logError('Cannot set map options: no registered instance');\n    }\n  };\n\n  return {\n    ...methods,\n    mapInstance: computed(() => mapInstance.value),\n    mapStatus: computed(() => mapStatus.value),\n    isMapReady,\n    isMapLoading,\n    hasMapError,\n    isRegistered,\n    register,\n    setMapOptions,\n  };\n}\n"],"names":["g","f","exports","module","require","define","amd","globalThis","self","VueMapLibreGL","maplibregl","Vue","this","maplibreGl","vue","BoundsStatus","useLogger","debug","log","args","logWarn","logError","useDebounce","func","options","delay","leading","trailing","maxWait","timeoutId","maxTimeoutId","lastCallTime","lastArgs","result","lastInvokeTime","invokeFunc","time","error","shouldInvoke","timeSinceLastCall","timerExpired","Date","now","trailingEdge","window","setTimeout","cancel","clearTimeout","debounced","isInvoking","leadingEdge","onUnmounted","flush","pending","useDebouncedWatch","source","callback","immediate","deep","debounceOptions","debouncedCallback","stopWatcher","watch","newValue","oldValue","EaseStatus","FitScreenCoordinatesStatus","FlyStatus","JumpStatus","useOptimizedComputed","getter","deepEqual","equalityFn","cacheDuration","lastValue","ref","lastComputedTime","hasInitialValue","isEqual","a","b","JSON","stringify","Object","is","computed","value","PanStatus","RotationStatus","ZoomStatus","MapProvideKey","Symbol","SourceProvideKey","MapCreationStatus","MapboxEvents","GeolocateEvents","MapboxLayerEvents","useCreateMapbox","elRef","styleRef","props","register","onLoad","onError","mapInstance","shallowRef","mapCreationStatus","NotInitialized","mapOptions","retryCount","currentStyle","mapInstanceComputed","mapCreationStatusComputed","isMapReady","Loaded","isMapLoading","Loading","hasMapError","Error","validateMapOperation","initMap","el","unref","style","Initializing","mapOpts","Map","container","on","mapEventLoad","mapEventError","mapEventStyleData","removeMap","map","off","remove","Destroyed","e","destroyMap","stopWatchEffect","watchEffect","methods","setRenderWorldCopies","renderWorldCopies","setMinZoom","zoom","minZoom","setMinPitch","pitch","minPitch","setMaxZoom","maxZoom","setMaxPitch","maxPitch","setMaxBounds","bounds","maxBounds","setStyle","setPitch","setZoom","setBearing","bearing","setCenter","centerVal","center","getCurrentCamera","getCenter","getZoom","getBearing","getPitch","getCurrentStyle","getStyle","checkInitMap","opts","getNanoid","id","size","bytes","crypto","getRandomValues","Uint8Array","nanoid","getMainVersion","parseInt","getVersion","split","hasSource","sourceId","getSource","hasLayer","getLayer","lngLatLikeHasValue","lngLatLike","Array","isArray","length","lat","lng","lon","filterStylePropertiesByKeys","keys","fromEntries","entries","filter","key","includes","LayerManagementStatus","ImageStatus","useCreateImage","imageStatus","isImageReady","resolveFn","rejectFn","promise","Promise","resolve","reject","validateImageOperation","getImageDimensions","imageData","HTMLImageElement","width","naturalWidth","height","naturalHeight","ImageBitmap","ImageData","hasImage","imageId","async","loadImage","imageUrl","data","updateImage","newImage","_a","_b","forceRecreateOnDimensionChange","newDimensions","removeImage","addImage","recreateError","updateError","message","image","catch","refreshImage","loadPromise","GeoJsonSourceStatus","PopupStatus","useCreatePopup","mapRef","lnglat","lnglatVal","html","show","showVal","withMap","withMapVal","autoCreate","closeOnClick","closeButton","popup","popupStatus","lnglatValue","htmlValue","isPopupCreated","isPopupOpen","openEventFn","open","closeEventFn","close","createPopup","Popup","setDOMContent","setHTML","setLngLat","addToMap","isOpen","addTo","hide","setHTMLContent","content","removePopup","onCleanUp","newHtml","newLnglat","setOffset","offset","addClassName","className","removeClassName","setMaxWidth","toggle","element","setText","text","getLngLat","getElement","MarkerStatus","useCreateMarker","popupRef","autoAdd","marker","markerStatus","popupValue","isMarkerCreated","dragstartEventFn","ev","dragstart","call","dragEventFn","drag","dragendEventFn","dragend","setPopup","removeMarker","Marker","createMarker","newPopup","setDraggable","draggable","togglePopup","setRotation","rotation","setRotationAlignment","alignment","setPitchAlignment","setOpacity","opacity","opacityWhenCovered","addMarker","getPopup","getOffset","getDraggable","isDraggable","getRotation","EventListenerStatus","useMapEventListener","listenerStatus","isListenerAttached","mapEventFn","once","removeListener","event","attachListener","lastMapInstance","stopEffect","GeolocateEventListenerStatus","useGeolocateEventListener","geolocateInstance","geolocate","geoEventFn","MapReloadEventStatus","useMapReloadEvent","mapRefOrProps","legacyCallbacks","isLegacyAPI","callbacks","onUnload","unLoad","autoTriggerOnMount","loadStatus","isMapLoaded","initialMap","handleUnloadEvent","handleLoadEvent","isForced","forceLoad","clear","_loaded","forceUnload","LayerEventListenerStatus","useLayerEventListener","layerInstance","layer","layerId","layerEventFn","currentLayerId","validateListenerAttachment","lastLayerInstance","useGeolocateControl","position","geolocateControl","isControlAdded","addControl","GeolocateControl","removeControl","trigger","SourceStatus","DEFAULT_GEOJSON_DATA","type","features","useCreateGeoJsonSource","sourceStatus","isSourceReady","sourcedataEventFn","isSourceLoaded","setData","removeSource","refreshSource","initSource","sourceSpec","addSource","newData","onMounted","nextTick","LayerStatus","useCreateLayer","cfg","sourceRef","beforeId","layout","paint","maxzoom","minzoom","metadata","sourceLayer","layerStatus","sourceInstance","isLayerReady","validateLayerOperation","setBeforeId","beforeIdVal","moveLayer","setFilter","filterVal","setZoomRange","minzoomVal","maxzoomVal","setLayerZoomRange","setPaintProperty","name","validate","property","setLayoutProperty","createLayer","sourceData","resolveSourceData","layerSpec","addLayer","removeLayer","cleanupError","refreshLayer","updateLayer","updates","forEach","FILL_PAINT_KEYS","FILL_LAYOUT_KEYS","useCreateFillLayer","styleConfig","actions","setColor","setOutlineColor","setPattern","setAntialias","setVisibility","setSortKey","styleVal","typedKey","color","pattern","antialias","visibility","sortKey","CIRCLE_PAINT_KEYS","CIRCLE_LAYOUT_KEYS","useCreateCircleLayer","setRadius","setStrokeWidth","setStrokeColor","setStrokeOpacity","radius","LINE_PAINT_KEYS","LINE_LAYOUT_KEYS","useCreateLineLayer","setWidth","setGapWidth","setBlur","setDashArray","setGradient","setCap","setJoin","gapWidth","blur","dashArray","gradient","cap","join","SYMBOL_PAINT_KEYS","SYMBOL_LAYOUT_KEYS","useCreateSymbolLayer","setIconOpacity","setIconColor","setIconHaloColor","setIconHaloWidth","setIconHaloBlur","setIconImage","setIconSize","setIconRotate","setIconOffset","setIconAnchor","setTextOpacity","setTextColor","setTextHaloColor","setTextHaloWidth","setTextHaloBlur","setTextField","setTextFont","setTextSize","setTextRotate","setTextOffset","setTextAnchor","anchor","field","font","__props","emits","__emit","innerOptions","maplibreElRef","isComponentMounted","mergedOptions","containerId","setMapOptions","enhancedActions","handlerError","provide","evt","watchers","cleanup","wrapper","document","getElementById","existingContainer","createElement","containerClass","appendChild","createMapContainer","onBeforeMount","autoCleanup","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_renderSlot","_ctx","$slots","_hoisted_3","inject","isControlRegistered","controlError","hasControlError","eventType","_c","_d","_e","_f","onGeolocate","onTrackingStart","onTrackingEnd","onOutOfMaxBounds","handleGeolocateEvent","__expose","isSourceRegistered","lastDataUpdate","isDataValid","URL","handleSetData","onDataUpdate","stopDataWatcher","oldData","debounceDelay","effectiveSource","visibilityStyle","visible","mergedStyle","stopPropsWatcher","newProps","oldProps","loading","hasImages","images","loadImages","loadPromises","errorMessage","allSettled","newImages","popupElRef","popupOptions","maxWidth","closeOnEscape","eventHandlers","isShow","class","slots","useSlots","markerElRef","hasCustomElement","Boolean","default","markerOptions","clickTolerance","rotationAlignment","pitchAlignment","scale","occludedOpacity","newDraggable","batchSize","batchDelay","pendingUpdates","processBatch","latestValue","push","bbox","cameraOptions","cameraStatus","isCameraSet","cameraForBounds","boundsVal","clearCamera","getCurrentBounds","getBounds","initialValue","immediateRef","debouncedRef","updateDebounced","easeOptions","easeStatus","isEasing","easeTo","finalOptions","validateEaseOptions","onMoveEnd","easeToCenter","easeToZoom","easeToBearing","easeToPitch","stopEasing","stop","boundsOptions","boundsStatus","isBoundsSet","setFitBounds","validateBounds","fitBounds","clearBounds","propsOrMap","defaultOptions","defaultBearing","p0","p1","status","isCoordinatesSet","isFitting","hasError","getCurrentBearing","fitScreenCoordinates","p0Val","p1Val","optionsVal","bearingVal","isStyleLoaded","validateOperation","validatePoint","point","x","y","validateCoordinates","finalBearing","clearCoordinates","onStyleLoad","flyOptions","flyStatus","isFlying","flyTo","speed","curve","validateFlyOptions","stopFlying","flyToCenter","flyToZoom","flyToBearing","flyToPitch","autoRefresh","instanceRef","sourceIdRef","watchScope","instance","cleanupWatchScope","effectScope","run","newSource","oldSource","setupSourceWatcher","onScopeDispose","currentInstance","mapOrProps","legacyOptions","autoJump","jumpOptions","jumpStatus","isJumping","validateJumpOptions","jumpTo","jumpToCenter","jumpToZoom","jumpToBearing","jumpToPitch","mapInstanceRef","layerRef","layerIdRef","isLayerRegistered","getInstance","dispose","getFilter","getLayoutProperty","getPaintProperty","refresh","mapStatus","isRegistered","getMapInstance","getContainer","getCanvasContainer","getCanvas","getPadding","getMinZoom","getMaxZoom","getMinPitch","getMaxPitch","project","unproject","queryRenderedFeatures","querySourceFeatures","parameters","queryTerrainElevation","isMoving","isZooming","isRotating","resize","triggerRepaint","setFeatureState","state","removeFeatureState","getFeatureState","setPadding","padding","val","loaded","fn","keyFn","maxCacheSize","cache","cached","get","oldestKey","next","delete","set","timestamp","autoPan","animationOptions","panStatus","isPanning","validatePanOffset","panBy","offsetVal","stopPanning","panCount","validatePanTarget","hasLonLat","obj","panTo","autoReset","rotationStatus","resetNorth","onRotateEnd","stopRotating","resetNorthPitch","onComplete","getCurrentPitch","autoRotate","validateBearing","isNaN","normalizedBearing","original","normalized","rotateTo","snapToNorth","threshold","debounceMs","Math","abs","autoZoom","zoomStatus","zoomIn","onZoomEnd","stopZooming","getCurrentZoom","zoomOut","validateZoomLevel","zoomTo","zoomVal"],"mappings":"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","x_google_ignoreList":[16,17]}