vue3-maplibre-gl
Version:
Vue 3 components and composables for MapLibre GL JS - Build interactive maps with ease
1 lines • 461 kB
Source Map (JSON)
{"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]}