@geoql/v-maplibre 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +256 -0
- package/dist/index.js +1457 -0
- package/dist/index.js.map +1 -0
- package/dist/v-maplibre.css +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils/injects.ts","../src/utils/symbols.ts","../src/controls/attribution/VControlAttribution.vue","../src/controls/fullscreen/VControlFullscreen.vue","../src/controls/geolocate/events.ts","../src/controls/geolocate/VControlGeolocate.vue","../src/controls/navigation/VControlNavigation.vue","../src/controls/scale/VControlScale.vue","../src/layers/maplibre/canvas/VLayerMaplibreCanvas.vue","../src/layers/maplibre/geojson/VLayerMaplibreGeojson.vue","../src/layers/maplibre/image/VLayerMaplibreImage.vue","../src/layers/maplibre/raster/VLayerMaplibreRaster.vue","../src/constants/events/layer.ts","../src/constants/events/map.ts","../src/constants/events/marker.ts","../src/constants/events/popup.ts","../src/layers/maplibre/vector/VLayerMaplibreVector.vue","../src/layers/maplibre/video/VLayerMaplibreVideo.vue","../src/layers/maplibre/pmtile/VLayerMaplibrePmtile.vue","../src/layers/maplibre/cluster/VLayerMaplibreCluster.vue","../src/map/VMap.vue","../src/popups/VPopup.vue","../src/markers/VMarker.vue"],"sourcesContent":["import type { InjectionKey } from 'vue';\nimport { inject } from 'vue';\n\n/**\n * Dependency injection 🥳\n * @param {InjectionKey} key - The key to inject\n * @param {string | undefined} fallback - The fallback value\n * @returns {undefined} - The value\n */\nexport function injectStrict<T>(key: InjectionKey<T>, fallback?: T): T {\n const resolved = inject(key, fallback);\n if (!resolved) {\n throw new Error(`Could not resolve ${key.description}`);\n }\n return resolved;\n}\n","import type { Map } from 'maplibre-gl';\nimport type { Protocol } from 'pmtiles';\nimport type { InjectionKey, Ref } from 'vue';\n\nconst MapKey: InjectionKey<Ref<Map | null>> = Symbol('Map');\nconst PMTileProtocolKey: InjectionKey<Protocol | null> = Symbol('Protocol');\n\nexport { MapKey, PMTileProtocolKey };\n","<script setup lang=\"ts\">\n import { AttributionControl } from 'maplibre-gl';\n import { onMounted, useSlots } from 'vue';\n import { MapKey, injectStrict } from '../../utils';\n import type { AttributionControlOptions, ControlPosition } from './types';\n\n const defaultOptions: AttributionControlOptions = {\n compact: false,\n customAttribution: undefined,\n };\n\n const props = withDefaults(\n defineProps<{\n options?: AttributionControlOptions;\n position?: ControlPosition;\n }>(),\n {\n options: undefined,\n position: 'bottom-right',\n },\n );\n\n const slots = useSlots();\n\n const map = injectStrict(MapKey);\n\n onMounted(() => {\n addControl();\n });\n\n const addControl = (): void => {\n let options = defaultOptions;\n if (props.options) {\n options = {\n ...props.options,\n };\n }\n if (slots && slots.default?.()) {\n options.customAttribution = slots.default()[0]!\n .children as unknown as string;\n }\n const control = new AttributionControl(options);\n map.value!.addControl(control, props.position);\n };\n</script>\n\n<template>\n <slot></slot>\n</template>\n","<script setup lang=\"ts\">\n import { FullscreenControl } from 'maplibre-gl';\n import { onMounted } from 'vue';\n import { MapKey, injectStrict } from '../../utils';\n import type { ControlPosition, FullscreenControlOptions } from './types';\n\n const defaultOptions: FullscreenControlOptions = {\n container: undefined,\n };\n\n const props = withDefaults(\n defineProps<{\n options?: FullscreenControlOptions;\n position?: ControlPosition;\n }>(),\n {\n options: undefined,\n position: 'top-left',\n },\n );\n\n const map = injectStrict(MapKey);\n\n onMounted(() => {\n addControl();\n });\n\n const addControl = (): void => {\n const control = new FullscreenControl(props.options || defaultOptions);\n map.value!.addControl(control, props.position);\n };\n</script>\n","export const geolocateControlEvents: string[] = [\n 'geolocate',\n 'error',\n 'outofmaxbounds',\n 'trackuserlocationstart',\n 'trackuserlocationend',\n];\n","<script setup lang=\"ts\">\n import { GeolocateControl } from 'maplibre-gl';\n import { onMounted } from 'vue';\n import { MapKey, injectStrict } from '../../utils';\n import { geolocateControlEvents as events } from './events';\n import type { ControlPosition, GeolocateControlOptions } from './types';\n\n const defaultOptions: GeolocateControlOptions = {\n fitBoundsOptions: {\n linear: false,\n offset: [0, 0],\n maxZoom: 22,\n },\n positionOptions: {\n enableHighAccuracy: true,\n maximumAge: 0,\n timeout: 6000,\n },\n trackUserLocation: true,\n showAccuracyCircle: true,\n showUserLocation: true,\n };\n\n const props = withDefaults(\n defineProps<{\n options?: GeolocateControlOptions;\n position?: ControlPosition;\n }>(),\n {\n options: undefined,\n position: 'top-left',\n },\n );\n\n const emit = defineEmits(events);\n\n const map = injectStrict(MapKey);\n\n onMounted(() => {\n addControl();\n });\n\n const addControl = (): void => {\n const control = new GeolocateControl(props.options || defaultOptions);\n map.value!.addControl(control, props.position);\n events.forEach((event: string) => {\n control.on(event, () => {\n emit(event);\n });\n });\n };\n</script>\n","<script setup lang=\"ts\">\n import { NavigationControl } from 'maplibre-gl';\n import { onMounted, inject } from 'vue';\n import { MapKey } from '../../utils';\n import type { ControlPosition, NavigationOptions } from './types';\n\n const defaultOptions: NavigationOptions = {\n showCompass: true,\n showZoom: true,\n visualizePitch: true,\n };\n\n const props = withDefaults(\n defineProps<{\n options?: NavigationOptions;\n position?: ControlPosition;\n }>(),\n {\n options: undefined,\n position: 'top-left',\n },\n );\n\n const map = inject(MapKey);\n\n onMounted(() => {\n addControl();\n });\n\n const addControl = (): void => {\n const control = new NavigationControl(props.options || defaultOptions);\n map!.value!.addControl(control, props.position);\n };\n</script>\n","<script setup lang=\"ts\">\n import { onMounted, inject } from 'vue';\n import { ScaleControl } from 'maplibre-gl';\n import { MapKey } from '../../utils';\n import type { ControlPosition, ScaleControlOptions } from './types';\n\n const defaultOptions: ScaleControlOptions = {\n maxWidth: 100,\n unit: 'metric',\n };\n\n const props = withDefaults(\n defineProps<{\n options?: ScaleControlOptions;\n position?: ControlPosition;\n }>(),\n {\n options: undefined,\n position: 'bottom-left',\n },\n );\n\n const map = inject(MapKey);\n\n onMounted(() => {\n addControl();\n });\n\n const addControl = (): void => {\n const control = new ScaleControl(props.options || defaultOptions);\n map?.value!.addControl(control, props.position);\n };\n</script>\n\n<template>\n <slot></slot>\n</template>\n","<script setup lang=\"ts\">\n import type {\n CanvasSourceSpecification,\n LayerSpecification,\n Map,\n } from 'maplibre-gl';\n import type { Ref } from 'vue';\n import { onMounted, onBeforeUnmount, ref, watch } from 'vue';\n import { injectStrict, MapKey } from '../../../utils';\n\n const props = withDefaults(\n defineProps<{\n source: CanvasSourceSpecification;\n layer: LayerSpecification;\n sourceId?: string;\n layerId?: string;\n before?: string;\n }>(),\n {\n sourceId: 'maplibre.gl-canvas-source',\n layerId: 'maplibre.gl-canvas-layer',\n before: '',\n },\n );\n\n const map = injectStrict(MapKey);\n const loaded: Ref<boolean> = ref(false);\n\n // Helper function to safely get map instance\n const getMapInstance = (): Map | null => {\n return map.value || null;\n };\n\n // Setup functions\n const setupMap = (mapInstance: Map) => {\n if (!mapInstance) return;\n\n mapInstance.on('style.load', () => {\n const styleTimeout = () => {\n if (!mapInstance.isStyleLoaded()) {\n loaded.value = false;\n setTimeout(styleTimeout, 200);\n } else {\n loaded.value = true;\n }\n };\n styleTimeout();\n });\n };\n\n const addLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (!mapInstance.getSource(props.sourceId)) {\n mapInstance.addSource(props.sourceId, props.source);\n }\n if (!mapInstance.getLayer(props.layerId)) {\n const layerSpec = {\n ...props.layer,\n id: props.layerId,\n source: props.sourceId,\n } as LayerSpecification;\n mapInstance.addLayer(layerSpec, props.before);\n }\n } catch (error) {\n console.error('Error adding Canvas layer:', error);\n }\n };\n\n const updateSource = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n // For canvas sources, we need to remove and re-add both source and layer\n if (mapInstance.getLayer(props.layerId)) {\n mapInstance.removeLayer(props.layerId);\n }\n if (mapInstance.getSource(props.sourceId)) {\n mapInstance.removeSource(props.sourceId);\n }\n\n mapInstance.addSource(props.sourceId, props.source);\n const layerSpec = {\n ...props.layer,\n id: props.layerId,\n source: props.sourceId,\n } as LayerSpecification;\n mapInstance.addLayer(layerSpec, props.before);\n } catch (error) {\n console.error('Error updating Canvas source:', error);\n }\n };\n\n const updateLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (mapInstance.getLayer(props.layerId)) {\n Object.entries(props.layer.paint || {}).forEach(([key, value]) => {\n mapInstance.setPaintProperty(props.layerId, key, value);\n });\n Object.entries(props.layer.layout || {}).forEach(([key, value]) => {\n mapInstance.setLayoutProperty(props.layerId, key, value);\n });\n }\n } catch (error) {\n console.error('Error updating Canvas layer:', error);\n }\n };\n\n // Watchers\n watch(() => props.source, updateSource, { deep: true });\n watch(() => props.layer, updateLayer, { deep: true });\n\n // Watch for map instance changes\n watch(\n map,\n (newMap) => {\n if (newMap) {\n setupMap(newMap);\n }\n },\n { immediate: true },\n );\n\n // Watch loaded state\n watch(loaded, (value) => {\n if (value) {\n addLayer();\n }\n });\n\n // Lifecycle hooks\n onMounted(() => {\n const mapInstance = getMapInstance();\n if (mapInstance?.isStyleLoaded()) {\n addLayer();\n }\n });\n\n onBeforeUnmount(() => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (mapInstance.getLayer(props.layerId)) {\n mapInstance.removeLayer(props.layerId);\n }\n if (mapInstance.getSource(props.sourceId)) {\n mapInstance.removeSource(props.sourceId);\n }\n } catch (error) {\n console.error('Error cleaning up Canvas layer:', error);\n }\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n","<!-- web/app/lib/v-mapbox/layers/maplibre/geojson/VLayerMaplibreGeojson.vue -->\n<script setup lang=\"ts\">\n import type { Ref } from 'vue';\n import { onMounted, onBeforeUnmount, ref, watch } from 'vue';\n import type {\n GeoJSONSource,\n GeoJSONSourceSpecification,\n LayerSpecification,\n Map,\n MapLayerMouseEvent,\n } from 'maplibre-gl';\n import { injectStrict, MapKey } from '../../../utils';\n\n interface LayerClick {\n features: GeoJSON.Feature[];\n coordinates: {\n lng: number;\n lat: number;\n };\n }\n\n interface Props {\n sourceId: string;\n layerId: string;\n source: GeoJSONSourceSpecification;\n layer: LayerSpecification;\n before?: string;\n }\n\n const props = withDefaults(defineProps<Props>(), {\n sourceId: 'maplibre-gl-geojson-source',\n layerId: 'maplibre-gl-geojson-layer',\n before: '',\n });\n\n const emit = defineEmits<{\n 'on-click': [event: LayerClick];\n }>();\n\n const map = injectStrict(MapKey);\n const loaded: Ref<boolean> = ref(false);\n\n // Helper to check if data is valid GeoJSON with features\n const hasValidData = (\n data: string | GeoJSON.GeoJSON | undefined,\n ): boolean => {\n if (!data || typeof data === 'string') return false;\n if (data && typeof data === 'object' && 'type' in data) {\n if (data.type === 'FeatureCollection' && 'features' in data) {\n return data.features.length > 0;\n }\n // Also valid for single Feature or Geometry\n return (\n data.type === 'Feature' ||\n data.type === 'Point' ||\n data.type === 'LineString' ||\n data.type === 'Polygon' ||\n data.type === 'MultiPoint' ||\n data.type === 'MultiLineString' ||\n data.type === 'MultiPolygon'\n );\n }\n return false;\n };\n\n // Helper function to safely get map instance\n const getMapInstance = (): Map | null => {\n const instance = map.value || null;\n return instance;\n };\n\n // Setup functions\n const setupMap = (mapInstance: Map) => {\n if (!mapInstance) {\n return;\n }\n\n mapInstance.on('style.load', () => {\n const styleTimeout = () => {\n if (!mapInstance.isStyleLoaded()) {\n loaded.value = false;\n setTimeout(styleTimeout, 200);\n } else {\n loaded.value = true;\n }\n };\n styleTimeout();\n });\n };\n\n const addLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance || !mapInstance.isStyleLoaded()) {\n return;\n }\n\n // For clustering support, wait for valid data before adding source/layer\n if (!hasValidData(props.source.data)) {\n console.log(\n `[${props.layerId}] Waiting for valid data before adding layer`,\n );\n return;\n }\n\n try {\n // Only add source if it doesn't exist\n if (!mapInstance.getSource(props.sourceId)) {\n mapInstance.addSource(props.sourceId, props.source);\n }\n\n // Only add layer if it doesn't exist\n if (!mapInstance.getLayer(props.layerId)) {\n const layerSpec = {\n ...props.layer,\n id: props.layerId,\n source: props.sourceId,\n } as LayerSpecification;\n\n mapInstance.addLayer(layerSpec, props.before);\n }\n } catch (error) {\n console.error('Error adding GeoJSON layer:', error);\n }\n };\n\n const updateSource = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n const source = mapInstance.getSource(props.sourceId) as\n | GeoJSONSource\n | undefined;\n\n if (source && 'setData' in source) {\n // CRITICAL FIX: Only update data if source doesn't have clustering\n // or if this is the first/primary layer for this source\n const existingLayers = mapInstance\n .getStyle()\n .layers.filter(\n (l) =>\n l.type !== 'background' &&\n 'source' in l &&\n l.source === props.sourceId,\n );\n\n // Only update data if this is the first layer using this source\n // This prevents breaking clustering when multiple layers share a source\n if (\n existingLayers.length === 0 ||\n existingLayers[0]?.id === props.layerId\n ) {\n source.setData(props.source.data);\n }\n } else if (!source) {\n // If source doesn't exist, try to add the layer\n addLayer();\n }\n } catch (error) {\n console.error('Error updating GeoJSON source:', error);\n }\n };\n\n const updateLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (mapInstance.getLayer(props.layerId)) {\n // Update paint properties\n Object.entries(props.layer.paint || {}).forEach(([key, value]) => {\n mapInstance.setPaintProperty(props.layerId, key, value);\n });\n // Update layout properties\n Object.entries(props.layer.layout || {}).forEach(([key, value]) => {\n mapInstance.setLayoutProperty(props.layerId, key, value);\n });\n } else {\n // If layer doesn't exist, try to add it\n addLayer();\n }\n } catch (error) {\n console.error('Error updating GeoJSON layer:', error);\n }\n };\n\n const setupLayerEvents = (mapInstance: Map) => {\n if (!mapInstance) {\n return;\n }\n\n try {\n // Add click handler for the specific layer\n mapInstance.on('click', props.layerId, (e: MapLayerMouseEvent) => {\n if (e.features && e.features.length > 0) {\n emit('on-click', {\n features: e.features,\n coordinates: e.lngLat,\n });\n }\n });\n\n // Add hover effect to verify interactivity\n mapInstance.on('mouseenter', props.layerId, () => {\n mapInstance.getCanvas().style.cursor = 'pointer';\n });\n\n mapInstance.on('mouseleave', props.layerId, () => {\n mapInstance.getCanvas().style.cursor = '';\n });\n } catch (error) {\n console.error('Error in setupLayerEvents:', error);\n }\n };\n\n // Watchers - Modified to handle timing and prevent unnecessary updates\n watch(\n () => props.source,\n (newSource, oldSource) => {\n // Wait for valid data before doing anything\n if (!hasValidData(newSource?.data)) {\n return;\n }\n\n // Only update if the data actually changed\n if (JSON.stringify(newSource.data) !== JSON.stringify(oldSource?.data)) {\n const mapInstance = getMapInstance();\n if (mapInstance?.isStyleLoaded()) {\n // If source doesn't exist yet, add the whole layer\n if (!mapInstance.getSource(props.sourceId)) {\n addLayer();\n } else {\n // Source exists, just update data\n updateSource();\n }\n }\n }\n },\n { deep: true },\n );\n\n watch(() => props.layer, updateLayer, { deep: true });\n\n // Watch for map instance changes\n watch(\n map,\n (newMap) => {\n if (newMap) {\n setupMap(newMap);\n // Check if style is already loaded\n if (newMap.isStyleLoaded()) {\n loaded.value = true;\n }\n }\n },\n { immediate: true },\n );\n\n // Watch loaded state - only add layer when we have valid data\n watch(loaded, (value) => {\n if (value && hasValidData(props.source.data)) {\n const mapInstance = getMapInstance();\n if (mapInstance) {\n addLayer();\n setupLayerEvents(mapInstance);\n }\n }\n });\n\n // Watch for visibility changes\n watch(\n () => props.layer.layout?.visibility,\n (newVisibility) => {\n const mapInstance = getMapInstance();\n if (!mapInstance || !mapInstance.isStyleLoaded()) return;\n\n const hasLayer = mapInstance.getLayer(props.layerId);\n\n if (!hasLayer && newVisibility === 'visible') {\n // Add layer if it doesn't exist and should be visible\n if (hasValidData(props.source.data)) {\n addLayer();\n }\n } else if (hasLayer) {\n // Update visibility of existing layer\n try {\n mapInstance.setLayoutProperty(\n props.layerId,\n 'visibility',\n newVisibility,\n );\n } catch (error) {\n console.error(\n `Error updating visibility for ${props.layerId}:`,\n error,\n );\n }\n }\n },\n { immediate: true },\n );\n\n // Lifecycle hooks\n onMounted(() => {\n try {\n const mapInstance = getMapInstance();\n // Only add layer if map is ready AND we have valid data\n if (mapInstance?.isStyleLoaded() && hasValidData(props.source.data)) {\n addLayer();\n }\n } catch (error) {\n console.error('Error adding layer:', error);\n }\n });\n\n onBeforeUnmount(() => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n // Remove layer\n if (mapInstance.getLayer(props.layerId)) {\n mapInstance.removeLayer(props.layerId);\n }\n\n // Only remove source if no other layers are using it\n const layersUsingSource = mapInstance\n .getStyle()\n .layers.filter(\n (l) =>\n l.type !== 'background' &&\n 'source' in l &&\n l.source === props.sourceId,\n );\n\n if (\n layersUsingSource.length === 0 &&\n mapInstance.getSource(props.sourceId)\n ) {\n mapInstance.removeSource(props.sourceId);\n }\n } catch (error) {\n console.error('Error cleaning up GeoJSON layer:', error);\n }\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n","<script setup lang=\"ts\">\n import type {\n LayerSpecification as AnyLayer,\n ImageSourceSpecification as ImageSourceRaw,\n ImageSource,\n Map,\n } from 'maplibre-gl';\n import type { PropType, Ref } from 'vue';\n import { onMounted, onBeforeUnmount, ref, watch } from 'vue';\n import { injectStrict, MapKey } from '../../../utils';\n\n const props = defineProps({\n sourceId: {\n type: String,\n default: 'maplibre.gl-image-source',\n required: true,\n },\n layerId: {\n type: String,\n default: 'maplibre.gl-image-layer',\n required: true,\n },\n source: {\n type: Object as PropType<ImageSourceRaw>,\n required: true,\n },\n layer: {\n type: Object as PropType<AnyLayer>,\n default: () => ({}),\n required: true,\n },\n before: {\n type: String,\n default: '',\n required: false,\n },\n });\n\n const map = injectStrict(MapKey);\n const loaded: Ref<boolean> = ref(false);\n\n // Helper function to safely get map instance\n const getMapInstance = (): Map | null => {\n return map.value || null;\n };\n\n // Setup functions\n const setupMap = (mapInstance: Map) => {\n if (!mapInstance) return;\n\n mapInstance.on('style.load', () => {\n const styleTimeout = () => {\n if (!mapInstance.isStyleLoaded()) {\n loaded.value = false;\n setTimeout(styleTimeout, 200);\n } else {\n loaded.value = true;\n }\n };\n styleTimeout();\n });\n };\n\n const addLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (!mapInstance.getSource(props.sourceId)) {\n mapInstance.addSource(props.sourceId, props.source);\n }\n if (!mapInstance.getLayer(props.layerId)) {\n const layerSpec = {\n ...props.layer,\n id: props.layerId,\n source: props.sourceId,\n } as AnyLayer;\n mapInstance.addLayer(layerSpec, props.before);\n }\n } catch (error) {\n console.error('Error adding Image layer:', error);\n }\n };\n\n const updateSource = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n const source = mapInstance.getSource(props.sourceId) as ImageSource;\n if (source) {\n // For image sources, we need to update coordinates and url\n if (source.updateImage) {\n source.updateImage({\n url: props.source.url,\n coordinates: props.source.coordinates,\n });\n } else {\n // If updateImage is not available, remove and re-add the source and layer\n if (mapInstance.getLayer(props.layerId)) {\n mapInstance.removeLayer(props.layerId);\n }\n if (mapInstance.getSource(props.sourceId)) {\n mapInstance.removeSource(props.sourceId);\n }\n\n mapInstance.addSource(props.sourceId, props.source);\n const layerSpec = {\n ...props.layer,\n id: props.layerId,\n source: props.sourceId,\n } as AnyLayer;\n mapInstance.addLayer(layerSpec, props.before);\n }\n }\n } catch (error) {\n console.error('Error updating Image source:', error);\n }\n };\n\n const updateLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (mapInstance.getLayer(props.layerId)) {\n Object.entries(props.layer.paint || {}).forEach(([key, value]) => {\n mapInstance.setPaintProperty(props.layerId, key, value);\n });\n Object.entries(props.layer.layout || {}).forEach(([key, value]) => {\n mapInstance.setLayoutProperty(props.layerId, key, value);\n });\n }\n } catch (error) {\n console.error('Error updating Image layer:', error);\n }\n };\n\n // Watchers\n watch(() => props.source, updateSource, { deep: true });\n watch(() => props.layer, updateLayer, { deep: true });\n\n // Watch for map instance changes\n watch(\n map,\n (newMap) => {\n if (newMap) {\n setupMap(newMap);\n }\n },\n { immediate: true },\n );\n\n // Watch loaded state\n watch(loaded, (value) => {\n if (value) {\n addLayer();\n }\n });\n\n // Lifecycle hooks\n onMounted(() => {\n const mapInstance = getMapInstance();\n if (mapInstance?.isStyleLoaded()) {\n addLayer();\n }\n });\n\n onBeforeUnmount(() => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (mapInstance.getLayer(props.layerId)) {\n mapInstance.removeLayer(props.layerId);\n }\n if (mapInstance.getSource(props.sourceId)) {\n mapInstance.removeSource(props.sourceId);\n }\n } catch (error) {\n console.error('Error cleaning up Image layer:', error);\n }\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n","<script setup lang=\"ts\">\n import type {\n RasterSourceSpecification,\n RasterLayerSpecification,\n Map,\n } from 'maplibre-gl';\n import type { Ref } from 'vue';\n import { onMounted, ref, watch } from 'vue';\n import { injectStrict, MapKey } from '../../../utils';\n\n const props = defineProps<{\n sourceId: string;\n source: RasterSourceSpecification;\n layerId: string;\n layer: RasterLayerSpecification;\n before?: string;\n }>();\n\n const map = injectStrict(MapKey);\n const loaded: Ref<boolean> = ref(false);\n\n const getMapInstance = (): Map | null => {\n return map.value || null;\n };\n\n const setupMap = (mapInstance: Map) => {\n if (!mapInstance) return;\n\n mapInstance.on('style.load', () => {\n const styleTimeout = () => {\n if (!mapInstance.isStyleLoaded()) {\n loaded.value = false;\n setTimeout(styleTimeout, 200);\n } else {\n loaded.value = true;\n }\n };\n styleTimeout();\n });\n };\n\n const addLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (!mapInstance.getSource(props.sourceId)) {\n mapInstance.addSource(props.sourceId, props.source);\n }\n if (!mapInstance.getLayer(props.layerId)) {\n // Always add with proper ordering\n mapInstance.addLayer(props.layer, props.before);\n\n // Set initial visibility\n if (props.layer.layout?.visibility) {\n mapInstance.setLayoutProperty(\n props.layerId,\n 'visibility',\n props.layer.layout.visibility,\n );\n }\n }\n } catch (error) {\n console.error(`[${props.layerId}] Error setting up layer:`, error);\n }\n };\n\n const updateSource = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n // Store the current beforeId since we'll need to reuse it\n const beforeId = props.before;\n\n if (mapInstance.getLayer(props.layerId)) {\n mapInstance.removeLayer(props.layerId);\n }\n mapInstance.removeSource(props.sourceId);\n\n mapInstance.addSource(props.sourceId, props.source);\n const layerSpec = {\n ...props.layer,\n id: props.layerId,\n type: 'raster',\n source: props.sourceId,\n } as RasterLayerSpecification;\n\n // Explicitly check if the beforeId layer exists before adding\n if (beforeId && mapInstance.getLayer(beforeId)) {\n mapInstance.addLayer(layerSpec, beforeId);\n } else {\n mapInstance.addLayer(layerSpec);\n }\n } catch (error) {\n console.error('Error updating Raster source:', error);\n }\n };\n\n const updateLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (mapInstance.getLayer(props.layerId)) {\n // Update paint properties\n const paint = props.layer.paint || {};\n Object.entries(paint).forEach(([key, value]) => {\n mapInstance.setPaintProperty(props.layerId, key, value);\n });\n\n // Update layout properties\n const layout = props.layer.layout || {};\n Object.entries(layout).forEach(([key, value]) => {\n mapInstance.setLayoutProperty(props.layerId, key, value);\n });\n }\n } catch (error) {\n console.error('Error updating Raster layer:', error);\n }\n };\n\n // Watchers\n watch(\n () => props.source.tiles?.[0], // Usually raster sources have a single tile URL\n (newTileUrl, oldTileUrl) => {\n if (newTileUrl !== oldTileUrl) {\n updateSource();\n }\n },\n );\n watch(() => props.layer, updateLayer, { deep: true });\n watch(\n map,\n (newMap) => {\n if (newMap) {\n setupMap(newMap);\n }\n },\n { immediate: true },\n );\n watch(loaded, (value) => {\n if (value) {\n addLayer();\n }\n });\n watch(\n () => props.layer.layout?.visibility,\n (newVisibility) => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n const hasLayer = mapInstance.getLayer(props.layerId);\n\n if (!hasLayer) {\n // Add layer with proper ordering\n try {\n mapInstance.addLayer(props.layer, props.before);\n } catch (error) {\n console.error(`[${props.layerId}] Error adding layer:`, error);\n }\n } else {\n try {\n // Update visibility\n mapInstance.setLayoutProperty(\n props.layerId,\n 'visibility',\n newVisibility,\n );\n\n // If becoming visible, ensure proper layer ordering\n if (newVisibility === 'visible' && props.before) {\n mapInstance.moveLayer(props.layerId, props.before);\n }\n } catch (error) {\n console.error(`[${props.layerId}] Error updating visibility:`, error);\n }\n }\n },\n { immediate: true },\n );\n watch(\n () => props.before,\n (newBefore) => {\n const mapInstance = getMapInstance();\n if (!mapInstance || !mapInstance.getLayer(props.layerId)) return;\n\n // Only move layer if it's visible\n if (props.layer.layout?.visibility === 'visible') {\n try {\n console.log(`[${props.layerId}] Moving layer before:`, newBefore);\n mapInstance.moveLayer(props.layerId, newBefore);\n } catch (error) {\n console.error(`[${props.layerId}] Error moving layer:`, error);\n }\n }\n },\n );\n\n // Also add logging for source and layer setup\n onMounted(() => {\n const mapInstance = getMapInstance();\n if (!mapInstance) {\n return;\n }\n try {\n addLayer();\n } catch (error) {\n console.error(`[${props.layerId}] Error setting up layer:`, error);\n }\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n","import type { MapLayerEventType } from 'maplibre-gl';\n\nexport const mapLayerEvents: Array<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 type { MapEventType } from 'maplibre-gl';\n\nexport const mapEvents: Array<keyof MapEventType> = [\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 'styledataloading',\n 'sourcedata',\n 'styledata',\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];\n","export const markerMapEvents = ['dragstart', 'drag', 'dragend'];\nexport const markerDOMEvents = ['click', 'mouseenter', 'mouseleave'];\n","export const popupEvents = ['open', 'close'] as Array<'open' | 'close'>;\n","<script setup lang=\"ts\">\n import type { Ref } from 'vue';\n import { onMounted, ref, watch } from 'vue';\n import type {\n Map,\n VectorSourceSpecification,\n LayerSpecification,\n } from 'maplibre-gl';\n import { mapLayerEvents } from '../../../constants/events';\n import { injectStrict, MapKey } from '../../../utils';\n\n const props = defineProps<{\n sourceId: string;\n source: VectorSourceSpecification;\n layerId: string;\n layer: LayerSpecification;\n before?: string;\n }>();\n const emit = defineEmits([...mapLayerEvents]);\n\n const map = injectStrict(MapKey);\n const loaded: Ref<boolean> = ref(false);\n\n // Helper function to safely get map instance\n const getMapInstance = (): Map | null => {\n return map.value || null;\n };\n\n // Setup functions\n const setupMap = (mapInstance: Map) => {\n if (!mapInstance) return;\n\n mapInstance.on('style.load', () => {\n const styleTimeout = () => {\n if (!mapInstance.isStyleLoaded()) {\n loaded.value = false;\n setTimeout(styleTimeout, 200);\n } else {\n loaded.value = true;\n }\n };\n styleTimeout();\n });\n };\n const addLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (!mapInstance.getSource(props.sourceId)) {\n mapInstance.addSource(props.sourceId, props.source);\n }\n if (!mapInstance.getLayer(props.layerId)) {\n // Always get a fresh beforeId when adding a layer\n if (props.layer.layout?.visibility === 'visible') {\n mapInstance.addLayer(props.layer, props.before);\n } else {\n // For hidden layers, just add them without worrying about order\n mapInstance.addLayer(props.layer);\n }\n }\n } catch (error) {\n console.error(`[${props.layerId}] Error setting up layer:`, error);\n }\n };\n const updateSource = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n const existingSource = mapInstance.getSource(props.sourceId);\n // Only update source if it has actually changed\n if (\n existingSource &&\n JSON.stringify(existingSource.serialize()) !==\n JSON.stringify(props.source)\n ) {\n if (mapInstance.getLayer(props.layerId)) {\n mapInstance.removeLayer(props.layerId);\n }\n mapInstance.removeSource(props.sourceId);\n mapInstance.addSource(props.sourceId, props.source);\n const layerSpec = {\n ...props.layer,\n id: props.layerId,\n source: props.sourceId,\n } as LayerSpecification;\n mapInstance.addLayer(layerSpec, props.before);\n }\n } catch (error) {\n console.error('Error updating vector source:', error);\n }\n };\n const updateLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (mapInstance.getLayer(props.layerId)) {\n // Get current paint and layout properties\n const currentLayer = mapInstance.getLayer(props.layerId);\n const currentPaint = (currentLayer?.paint || {}) as Record<\n string,\n unknown\n >;\n const currentLayout = (currentLayer?.layout || {}) as Record<\n string,\n unknown\n >;\n\n // Only update properties that have changed\n Object.entries(props.layer.paint || {}).forEach(([key, value]) => {\n if (JSON.stringify(currentPaint[key]) !== JSON.stringify(value)) {\n mapInstance.setPaintProperty(props.layerId, key, value);\n }\n });\n\n Object.entries(props.layer.layout || {}).forEach(([key, value]) => {\n if (JSON.stringify(currentLayout[key]) !== JSON.stringify(value)) {\n mapInstance.setLayoutProperty(props.layerId, key, value);\n }\n });\n }\n } catch (error) {\n console.error('Error updating vector layer:', error);\n }\n };\n const setupLayerEvents = (mapInstance: Map) => {\n if (!mapInstance) return;\n\n try {\n mapLayerEvents.forEach((eventName) => {\n mapInstance.on(eventName, props.layerId, (e) => {\n if (eventName === 'mousemove') {\n mapInstance.getCanvas().style.cursor = 'pointer';\n }\n if (eventName === 'mouseleave') {\n mapInstance.getCanvas().style.cursor = '';\n }\n emit(eventName, e);\n });\n });\n } catch (error) {\n console.error('Error setting up layer events:', error);\n }\n };\n\n // Watchers\n watch(\n map,\n (newMap, oldMap) => {\n if (newMap && newMap !== oldMap) {\n setupMap(newMap);\n }\n },\n { immediate: true },\n );\n watch(loaded, (value) => {\n if (value) {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n addLayer();\n setupLayerEvents(mapInstance);\n }\n });\n watch(\n () => JSON.stringify(props.source.tiles),\n (newTiles, oldTiles) => {\n if (newTiles !== oldTiles) {\n updateSource();\n }\n },\n );\n watch(\n () => ({\n paint: props.layer.paint,\n // Watch layout changes but exclude visibility since it's handled separately\n layout: props.layer.layout\n ? { ...props.layer.layout, visibility: undefined }\n : undefined,\n }),\n (newValue, oldValue) => {\n if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) {\n updateLayer();\n }\n },\n { deep: true },\n );\n watch(\n () => props.layer.layout?.visibility,\n (newVisibility) => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n const hasLayer = mapInstance.getLayer(props.layerId);\n\n if (!hasLayer) {\n // Add layer if it doesn't exist\n try {\n if (!mapInstance.getSource(props.sourceId)) {\n mapInstance.addSource(props.sourceId, props.source);\n }\n mapInstance.addLayer(props.layer, props.before);\n } catch (error) {\n console.error(`[${props.layerId}] Error adding layer:`, error);\n }\n } else {\n try {\n // Update visibility\n mapInstance.setLayoutProperty(\n props.layerId,\n 'visibility',\n newVisibility,\n );\n\n // If becoming visible, ensure proper layer order\n if (newVisibility === 'visible' && props.before) {\n // Small timeout to ensure target layer is ready\n setTimeout(() => {\n mapInstance.moveLayer(props.layerId, props.before);\n }, 0);\n }\n } catch (error) {\n console.error(`[${props.layerId}] Error updating visibility:`, error);\n }\n }\n },\n { immediate: true },\n );\n watch(\n () => props.before,\n (newBefore) => {\n const mapInstance = getMapInstance();\n if (!mapInstance || !mapInstance.getLayer(props.layerId)) return;\n\n // Only move visible layers\n if (props.layer.layout?.visibility === 'visible') {\n try {\n mapInstance.moveLayer(props.layerId, newBefore);\n } catch (error) {\n console.error(\n `Error reordering vector layer ${props.layerId}:`,\n error,\n );\n }\n }\n },\n );\n watch(\n () => props.layer.layout?.visibility,\n (newVisibility) => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n const hasLayer = mapInstance.getLayer(props.layerId);\n\n if (!hasLayer) {\n // Only add layer if it doesn't exist\n try {\n if (!mapInstance.getSource(props.sourceId)) {\n mapInstance.addSource(props.sourceId, props.source);\n }\n mapInstance.addLayer(props.layer, props.before);\n } catch (error) {\n console.error(`[${props.layerId}] Error adding layer:`, error);\n }\n } else {\n // Just update visibility if layer exists\n try {\n mapInstance.setLayoutProperty(\n props.layerId,\n 'visibility',\n newVisibility,\n );\n } catch (error) {\n console.error(`[${props.layerId}] Error updating visibility:`, error);\n }\n }\n },\n { immediate: true },\n );\n onMounted(() => {\n const mapInstance = getMapInstance();\n if (!mapInstance) {\n return;\n }\n try {\n addLayer();\n } catch (error) {\n console.error(`[${props.layerId}] Error setting up layer:`, error);\n }\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n","<script setup lang=\"ts\">\n import type {\n LayerSpecification as AnyLayer,\n VideoSourceSpecification,\n VideoSource,\n Map,\n } from 'maplibre-gl';\n import type { PropType, Ref } from 'vue';\n import { onMounted, onBeforeUnmount, ref, watch } from 'vue';\n import { injectStrict, MapKey } from '../../../utils';\n\n const props = defineProps({\n sourceId: {\n type: String,\n default: 'maplibre.gl-video-source',\n required: true,\n },\n layerId: {\n type: String,\n default: 'maplibre.gl-video-layer',\n required: true,\n },\n source: {\n type: Object as PropType<VideoSourceSpecification>,\n required: true,\n },\n layer: {\n type: Object as PropType<AnyLayer>,\n default: () => ({}),\n required: true,\n },\n before: {\n type: String,\n default: '',\n required: false,\n },\n });\n\n const map = injectStrict(MapKey);\n const loaded: Ref<boolean> = ref(false);\n\n // Helper function to safely get map instance\n const getMapInstance = (): Map | null => {\n return map.value || null;\n };\n\n // Setup functions\n const setupMap = (mapInstance: Map) => {\n if (!mapInstance) return;\n\n mapInstance.on('style.load', () => {\n const styleTimeout = () => {\n if (!mapInstance.isStyleLoaded()) {\n loaded.value = false;\n setTimeout(styleTimeout, 200);\n } else {\n loaded.value = true;\n }\n };\n styleTimeout();\n });\n };\n\n const addLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (!mapInstance.getSource(props.sourceId)) {\n mapInstance.addSource(props.sourceId, props.source);\n }\n if (!mapInstance.getLayer(props.layerId)) {\n const layerSpec = {\n ...props.layer,\n id: props.layerId,\n source: props.sourceId,\n } as AnyLayer;\n mapInstance.addLayer(layerSpec, props.before);\n }\n } catch (error) {\n console.error('Error adding Video layer:', error);\n }\n };\n\n const updateSource = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n const source = mapInstance.getSource(props.sourceId) as VideoSource;\n if (source) {\n // For video sources, we need to remove and re-add since there's no direct update method\n if (mapInstance.getLayer(props.layerId)) {\n mapInstance.removeLayer(props.layerId);\n }\n if (mapInstance.getSource(props.sourceId)) {\n mapInstance.removeSource(props.sourceId);\n }\n\n mapInstance.addSource(props.sourceId, props.source);\n const layerSpec = {\n ...props.layer,\n id: props.layerId,\n source: props.sourceId,\n } as AnyLayer;\n mapInstance.addLayer(layerSpec, props.before);\n\n // Additional video-specific operations if needed\n if (source.getVideo) {\n const videoElement = source.getVideo();\n if (videoElement) {\n // Handle video element updates if needed\n videoElement.play().catch((error) => {\n console.error('Error playing video:', error);\n });\n }\n }\n }\n } catch (error) {\n console.error('Error updating Video source:', error);\n }\n };\n\n const updateLayer = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if (mapInstance.getLayer(props.layerId)) {\n Object.entries(props.layer.paint || {}).forEach(([key, value]) => {\n mapInstance.setPaintProperty(props.layerId, key, value);\n });\n Object.entries(props.layer.layout || {}).forEach(([key, value]) => {\n mapInstance.setLayoutProperty(props.layerId, key, value);\n });\n }\n } catch (error) {\n console.error('Error updating Video layer:', error);\n }\n };\n\n // Watchers\n watch(() => props.source, updateSource, { deep: true });\n watch(() => props.layer, updateLayer, { deep: true });\n\n // Watch for map instance changes\n watch(\n map,\n (newMap) => {\n if (newMap) {\n setupMap(newMap);\n }\n },\n { immediate: true },\n );\n\n // Watch loaded state\n watch(loaded, (value) => {\n if (value) {\n addLayer();\n }\n });\n\n // Lifecycle hooks\n onMounted(() => {\n const mapInstance = getMapInstance();\n if (mapInstance?.isStyleLoaded()) {\n addLayer();\n }\n });\n\n onBeforeUnmount(() => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n const source = mapInstance.getSource(props.sourceId) as VideoSource;\n if (source?.getVideo) {\n const videoElement = source.getVideo();\n if (videoElement) {\n // Stop and cleanup video if needed\n videoElement.pause();\n videoElement.remove();\n }\n }\n\n if (mapInstance.getLayer(props.layerId)) {\n mapInstance.removeLayer(props.layerId);\n }\n if (mapInstance.getSource(props.sourceId)) {\n mapInstance.removeSource(props.sourceId);\n }\n } catch (error) {\n console.error('Error cleaning up Video layer:', error);\n }\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n","<script setup lang=\"ts\">\n import { PMTiles } from 'pmtiles';\n import { inject, onMounted, ref } from 'vue';\n import type { PropType } from 'vue';\n import type {\n RasterLayerSpecification,\n RasterSourceSpecification,\n } from 'maplibre-gl';\n import VLayerMaplibreRaster from '../raster/VLayerMaplibreRaster.vue';\n import { PMTileProtocolKey } from '../../../utils/symbols';\n\n const props = defineProps({\n sourceId: {\n type: String,\n default: 'maplibre.gl-pmtile-source',\n required: true,\n },\n layerId: {\n type: String,\n default: 'maplibre.gl-pmtile-layer',\n required: true,\n },\n url: {\n type: String,\n required: true,\n },\n layer: {\n type: Object as PropType<RasterLayerSpecification>,\n default: () => ({}),\n required: true,\n },\n before: {\n type: String,\n default: '',\n required: false,\n },\n });\n\n const protocol = inject(PMTileProtocolKey);\n if (!protocol) {\n throw new Error('Protocol not provided');\n }\n\n const source = ref<RasterSourceSpecification>({\n type: 'raster',\n url: `pmtiles://${props.url}`,\n tileSize: 512,\n volatile: true,\n });\n onMounted(async () => {\n const p = new PMTiles(props.url);\n protocol.add(p);\n // Optional: You could fetch the header here if you need metadata\n // const header = await p.getHeader();\n });\n</script>\n\n<template>\n <VLayerMaplibreRaster\n :source-id=\"sourceId\"\n :layer-id=\"layerId\"\n :source=\"source\"\n :layer=\"{\n ...layer,\n type: 'raster',\n }\"\n :before=\"before\"\n ></VLayerMaplibreRaster>\n</template>\n","<!-- web/app/lib/v-mapbox/layers/maplibre/cluster/VLayerMaplibreCluster.vue -->\n<script setup lang=\"ts\">\n import type { Ref } from 'vue';\n import { onMounted, onBeforeUnmount, ref, watch, computed } from 'vue';\n import type {\n GeoJSONSource,\n GeoJSONSourceSpecification,\n CircleLayerSpecification,\n SymbolLayerSpecification,\n Map,\n MapLayerMouseEvent,\n DataDrivenPropertyValueSpecification,\n } from 'maplibre-gl';\n import { injectStrict, MapKey } from '../../../utils';\n\n interface LayerClick {\n features: GeoJSON.Feature[];\n coordinates: {\n lng: number;\n lat: number;\n };\n }\n\n interface Props {\n sourceId: string;\n baseLayerId: string;\n source: GeoJSONSourceSpecification;\n visibility?: boolean;\n clusterPaint?: {\n colors?: string[];\n radii?: number[];\n };\n unclusteredPaint?: {\n color?: DataDrivenPropertyValueSpecification<string>;\n radius?: number;\n };\n textPaint?: {\n color?: string;\n font?: string[];\n size?: number;\n };\n }\n\n const props = withDefaults(defineProps<Props>(), {\n sourceId: 'cluster-source',\n baseLayerId: 'cluster',\n visibility: true,\n clusterPaint: () => ({\n colors: ['#51bbd6', '#f1f075', '#f28cb1'],\n radii: [20, 30, 40],\n }),\n unclusteredPaint: () => ({\n color: '#51bbd6',\n radius: 6,\n }),\n textPaint: () => ({\n color: '#ffffff',\n font: ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'],\n size: 12,\n }),\n });\n\n const emit = defineEmits<{\n 'cluster-click': [event: LayerClick];\n 'point-click': [event: LayerClick];\n }>();\n\n const map = injectStrict(MapKey);\n const loaded: Ref<boolean> = ref(false);\n\n // Layer IDs\n const clustersLayerId = computed(() => `${props.baseLayerId}-clusters`);\n const clusterCountLayerId = computed(\n () => `${props.baseLayerId}-cluster-count`,\n );\n const unclusteredLayerId = computed(\n () => `${props.baseLayerId}-unclustered-point`,\n );\n\n // Helper function to safely get map instance\n const getMapInstance = (): Map | null => {\n return map.value || null;\n };\n\n // Helper to check if data is valid GeoJSON with features\n const hasValidData = (data: string | GeoJSON.GeoJSON): boolean => {\n if (typeof data === 'string') return false;\n if (data && typeof data === 'object' && 'type' in data) {\n if (data.type === 'FeatureCollection' && 'features' in data) {\n return data.features.length > 0;\n }\n }\n return false;\n };\n\n // Add all cluster-related layers at once\n const addClusterLayers = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance || !mapInstance.isStyleLoaded()) {\n return;\n }\n\n try {\n // 1. Add source if it doesn't exist\n if (!mapInstance.getSource(props.sourceId)) {\n console.log(`Adding clustered source: ${props.sourceId}`);\n mapInstance.addSource(props.sourceId, {\n ...props.source,\n cluster: true,\n clusterMaxZoom: 14,\n clusterRadius: 50,\n });\n } else {\n // If source exists, update its data\n const source = mapInstance.getSource(props.sourceId) as GeoJSONSource;\n if (source && 'setData' in source) {\n source.setData(props.source.data);\n }\n }\n\n // 2. Add clusters layer\n if (!mapInstance.getLayer(clustersLayerId.value)) {\n console.log(`Adding clusters layer: ${clustersLayerId.value}`);\n mapInstance.addLayer({\n id: clustersLayerId.value,\n type: 'circle',\n source: props.sourceId,\n filter: ['has', 'point_count'],\n paint: {\n 'circle-color': [\n 'step',\n ['get', 'point_count'],\n props.clusterPaint.colors![0]!,\n 100,\n props.clusterPaint.colors![1]!,\n 750,\n props.clusterPaint.colors![2]!,\n ],\n 'circle-radius': [\n 'step',\n ['get', 'point_count'],\n props.clusterPaint.radii![0]!,\n 100,\n props.clusterPaint.radii![1]!,\n 750,\n props.clusterPaint.radii![2]!,\n ],\n 'circle-stroke-width': 2,\n 'circle-stroke-color': '#ffffff',\n 'circle-opacity': 0.9,\n },\n layout: {\n visibility: props.visibility ? 'visible' : 'none',\n },\n } as CircleLayerSpecification);\n }\n\n // 3. Add cluster count text layer\n if (!mapInstance.getLayer(clusterCountLayerId.value)) {\n console.log(`Adding cluster count layer: ${clusterCountLayerId.value}`);\n mapInstance.addLayer({\n id: clusterCountLayerId.value,\n type: 'symbol',\n source: props.sourceId,\n filter: ['has', 'point_count'],\n layout: {\n 'text-field': '{point_count_abbreviated}',\n 'text-font': props.textPaint.font!,\n 'text-size': props.textPaint.size!,\n visibility: props.visibility ? 'visible' : 'none',\n },\n paint: {\n 'text-color': props.textPaint.color!,\n },\n } as SymbolLayerSpecification);\n }\n\n // 4. Add unclustered points layer\n if (!mapInstance.getLayer(unclusteredLayerId.value)) {\n console.log(\n `Adding unclustered points layer: ${unclusteredLayerId.value}`,\n );\n mapInstance.addLayer({\n id: unclusteredLayerId.value,\n type: 'circle',\n source: props.sourceId,\n filter: ['!', ['has', 'point_count']],\n paint: {\n 'circle-color': props.unclusteredPaint.color!,\n 'circle-radius': props.unclusteredPaint.radius!,\n 'circle-stroke-width': 2,\n 'circle-stroke-color': '#ffffff',\n 'circle-opacity': 0.95,\n },\n layout: {\n visibility: props.visibility ? 'visible' : 'none',\n },\n } as CircleLayerSpecification);\n }\n\n console.log(`All cluster layers added for ${props.baseLayerId}`);\n\n // Setup click handlers after layers are added\n setupLayerEvents(mapInstance);\n } catch (error) {\n console.error('Error adding cluster layers:', error);\n }\n };\n\n // Update source data\n const updateSource = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n const source = mapInstance.getSource(props.sourceId) as\n | GeoJSONSource\n | undefined;\n if (source && 'setData' in source) {\n console.log(`Updating source ${props.sourceId} with data`);\n source.setData(props.source.data);\n\n // After updating data, ensure all layers are properly added\n // This fixes the issue where layers might not render correctly with initial empty data\n setTimeout(() => {\n // Re-add layers if they're missing (this won't duplicate them)\n addClusterLayers();\n }, 100);\n } else if (!source) {\n // Source doesn't exist, add all layers\n addClusterLayers();\n }\n } catch (error) {\n console.error('Error updating source:', error);\n }\n };\n\n // Update visibility for all layers\n const updateVisibility = (visible: boolean): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n const visibility = visible ? 'visible' : 'none';\n\n [\n clustersLayerId.value,\n clusterCountLayerId.value,\n unclusteredLayerId.value,\n ].forEach((layerId) => {\n if (mapInstance.getLayer(layerId)) {\n mapInstance.setLayoutProperty(layerId, 'visibility', visibility);\n }\n });\n };\n\n // Setup click handlers for layers\n const setupLayerEvents = (mapInstance: Map) => {\n if (!mapInstance) return;\n\n try {\n // Click handler for clusters\n mapInstance.on(\n 'click',\n clustersLayerId.value,\n (e: MapLayerMouseEvent) => {\n if (e.features && e.features.length > 0) {\n emit('cluster-click', {\n features: e.features,\n coordinates: e.lngLat,\n });\n }\n },\n );\n\n // Click handler for individual points\n mapInstance.on(\n 'click',\n unclusteredLayerId.value,\n (e: MapLayerMouseEvent) => {\n if (e.features && e.features.length > 0) {\n emit('point-click', {\n features: e.features,\n coordinates: e.lngLat,\n });\n }\n },\n );\n\n // Add hover effects\n [clustersLayerId.value, unclusteredLayerId.value].forEach((layerId) => {\n mapInstance.on('mouseenter', layerId, () => {\n mapInstance.getCanvas().style.cursor = 'pointer';\n });\n\n mapInstance.on('mouseleave', layerId, () => {\n mapInstance.getCanvas().style.cursor = '';\n });\n });\n } catch (error) {\n console.error('Error setting up layer events:', error);\n }\n };\n\n // Setup map\n const setupMap = (mapInstance: Map) => {\n if (!mapInstance) return;\n\n mapInstance.on('style.load', () => {\n const checkStyleLoaded = () => {\n if (!mapInstance.isStyleLoaded()) {\n loaded.value = false;\n setTimeout(checkStyleLoaded, 200);\n } else {\n loaded.value = true;\n // Only add layers if we have data\n if (hasValidData(props.source.data)) {\n addClusterLayers();\n }\n }\n };\n checkStyleLoaded();\n });\n\n // If style is already loaded\n if (mapInstance.isStyleLoaded()) {\n loaded.value = true;\n // Only add layers if we have data\n if (hasValidData(props.source.data)) {\n addClusterLayers();\n }\n }\n };\n\n // Watchers\n watch(\n () => props.source.data,\n (newData) => {\n // Only proceed if we have actual data\n if (hasValidData(newData)) {\n const mapInstance = getMapInstance();\n if (mapInstance?.isStyleLoaded()) {\n // First time with data - add all layers\n if (!mapInstance.getSource(props.sourceId)) {\n addClusterLayers();\n } else {\n // Source exists, just update data\n updateSource();\n }\n }\n }\n },\n { deep: true, immediate: true },\n );\n\n watch(() => props.visibility, updateVisibility);\n\n watch(\n map,\n (newMap) => {\n if (newMap) {\n setupMap(newMap);\n }\n },\n { immediate: true },\n );\n\n // Lifecycle\n onMounted(() => {\n const mapInstance = getMapInstance();\n // Only add layers if map is ready AND we have data\n if (mapInstance?.isStyleLoaded() && hasValidData(props.source.data)) {\n addClusterLayers();\n }\n });\n\n onBeforeUnmount(() => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n // Remove click handlers\n [clustersLayerId.value, unclusteredLayerId.value].forEach((layerId) => {\n mapInstance.off('click', layerId, () => {});\n mapInstance.off('mouseenter', layerId, () => {});\n mapInstance.off('mouseleave', layerId, () => {});\n });\n\n // Remove all layers\n [\n clustersLayerId.value,\n clusterCountLayerId.value,\n unclusteredLayerId.value,\n ].forEach((layerId) => {\n if (mapInstance.getLayer(layerId)) {\n mapInstance.removeLayer(layerId);\n }\n });\n\n // Remove source\n if (mapInstance.getSource(props.sourceId)) {\n mapInstance.removeSource(props.sourceId);\n }\n } catch (error) {\n console.error('Error cleaning up cluster layers:', error);\n }\n });\n</script>\n\n<template>\n <slot></slot>\n</template>\n","<script setup lang=\"ts\">\n import maplibregl, { Map } from 'maplibre-gl';\n import { Protocol } from 'pmtiles';\n import { onMounted, provide, ref, shallowRef } from 'vue';\n import type { MapOptions, MapEventType } from 'maplibre-gl';\n import type { Ref } from 'vue';\n import { mapEvents } from '../constants/events';\n import { MapKey, PMTileProtocolKey } from '../utils/symbols';\n\n const props = withDefaults(\n defineProps<{\n options: MapOptions;\n supportPmtiles?: boolean;\n }>(),\n {\n options: () => ({ container: 'map' }) as MapOptions,\n supportPmtiles: false,\n },\n );\n const emit = defineEmits(['loaded', ...mapEvents]);\n\n if (props.supportPmtiles) {\n const protocol = new Protocol({ metadata: true });\n maplibregl.addProtocol('pmtiles', protocol.tile);\n provide(PMTileProtocolKey, protocol);\n }\n\n const map: Ref<Map | null> = shallowRef(null); // Initialize as null\n const loaded: Ref<boolean> = ref(false);\n const events: Ref<Array<keyof MapEventType>> = ref(mapEvents);\n\n // Provide the map reference immediately\n provide(MapKey, map);\n\n onMounted(() => {\n map.value = new Map(props.options);\n loaded.value = true;\n listenMapEvents();\n });\n\n const listenMapEvents = () => {\n if (!map.value) return;\n\n events.value.forEach((e) => {\n map.value?.on(e, (evt) => {\n switch (e) {\n case 'load':\n emit('loaded', map.value);\n break;\n default:\n emit(e, evt);\n break;\n }\n });\n });\n };\n</script>\n\n<template>\n <div :id=\"`${options?.container}`\" class=\"v-map-container\">\n <slot v-if=\"loaded\">\n <slot></slot>\n </slot>\n </div>\n</template>\n\n<style scoped>\n canvas {\n outline: none;\n }\n\n .v-map-container {\n width: 100%;\n height: 100%;\n }\n</style>\n","<script setup lang=\"ts\">\n import type { Ref } from 'vue';\n import { ref, onMounted, onBeforeUnmount, watch } from 'vue';\n import type { LngLatLike, Marker, PopupOptions, Map } from 'maplibre-gl';\n import { Popup } from 'maplibre-gl';\n import { popupEvents } from '../constants/events';\n import { injectStrict, MapKey } from '../utils';\n\n const props = withDefaults(\n defineProps<{\n options: PopupOptions;\n coordinates: LngLatLike;\n marker?: Marker;\n }>(),\n {\n options: () => ({}) as PopupOptions,\n coordinates: () => ({}) as LngLatLike,\n marker: () => ({}) as Marker,\n },\n );\n\n const emit = defineEmits<{\n (e: 'added', payload: { popup: Popup }): void;\n (e: 'removed' | 'open' | 'close'): void;\n }>();\n\n const map = injectStrict(MapKey);\n const popup = new Popup(props.options);\n const loaded: Ref<boolean> = ref(true);\n const content = ref<HTMLElement | null>(null);\n\n // Helper function to safely get map instance\n const getMapInstance = (): Map | null => {\n return map.value || null;\n };\n\n // Setup functions\n const setupMap = (mapInstance: Map) => {\n if (!mapInstance) return;\n\n mapInstance.on('style.load', () => {\n const styleTimeout = () => {\n if (!mapInstance.isStyleLoaded()) {\n loaded.value = false;\n setTimeout(styleTimeout, 200);\n } else {\n loaded.value = true;\n }\n };\n styleTimeout();\n });\n };\n\n const setPopupContent = (): void => {\n try {\n if (content.value) {\n popup.setDOMContent(content.value);\n }\n } catch (error) {\n console.error('Error setting popup content:', error);\n }\n };\n\n const setPopupCoordinates = (): void => {\n try {\n popup.setLngLat(props.coordinates);\n } catch (error) {\n console.error('Error setting popup coordinates:', error);\n }\n };\n\n const addToMarker = (): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n if ('setPopup' in props.marker) {\n props.marker.setPopup(popup);\n } else {\n popup.addTo(mapInstance);\n }\n emit('added', { popup });\n } catch (error) {\n console.error('Error adding popup to marker:', error);\n }\n };\n\n const remove = (): void => {\n try {\n popup.remove();\n emit('removed');\n } catch (error) {\n console.error('Error removing popup:', error);\n }\n };\n\n const listenPopupEvents = (): void => {\n try {\n popupEvents.forEach((event) => {\n popup.on(event, () => {\n emit(event);\n });\n });\n } catch (error) {\n console.error('Error setting up popup events:', error);\n }\n };\n\n const removePopupEvents = (): void => {\n try {\n popupEvents.forEach((event) => {\n popup.off(event, () => {\n emit(event);\n });\n });\n } catch (error) {\n console.error('Error removing popup events:', error);\n }\n };\n\n // Watch for map instance changes\n watch(\n map,\n (newMap) => {\n if (newMap) {\n setupMap(newMap);\n }\n },\n { immediate: true },\n );\n\n // Watch for coordinates changes\n watch(\n () => props.coordinates,\n () => {\n setPopupCoordinates();\n },\n { deep: true },\n );\n\n // Lifecycle hooks\n onMounted(() => {\n if (loaded.value) {\n try {\n setPopupContent();\n setPopupCoordinates();\n addToMarker();\n listenPopupEvents();\n } catch (error) {\n console.error('Error initializing popup:', error);\n }\n } else {\n remove();\n removePopupEvents();\n }\n });\n\n onBeforeUnmount(() => {\n remove();\n removePopupEvents();\n });\n</script>\n\n<template>\n <section :id=\"`popup-${Date.now()}`\" ref=\"content\">\n <slot></slot>\n </section>\n</template>\n","<script setup lang=\"ts\">\n import type { Ref } from 'vue';\n import { ref, watch, onMounted, onBeforeUnmount } from 'vue';\n import type {\n LngLatLike,\n MarkerOptions,\n PopupOptions,\n Map,\n } from 'maplibre-gl';\n import { Marker } from 'maplibre-gl';\n import VPopup from '../popups/VPopup.vue';\n import { markerDOMEvents, markerMapEvents } from '../constants/events';\n import { injectStrict, MapKey } from '../utils';\n\n const props = withDefaults(\n defineProps<{\n coordinates: LngLatLike | null;\n options?: MarkerOptions;\n popupOptions?: PopupOptions;\n cursor?: string;\n }>(),\n {\n coordinates: null,\n options: () => ({}),\n popupOptions: () => ({}),\n cursor: 'pointer',\n },\n );\n\n const emit = defineEmits([\n 'added',\n 'update:coordinates',\n 'removed',\n ...markerMapEvents,\n ...markerDOMEvents,\n ]);\n\n const map = injectStrict(MapKey);\n const marker: Ref<Marker | null> = ref(null);\n const loaded = ref(true);\n const isMarkerAvailable = ref(false);\n const slotRef = ref<HTMLElement | null>(null);\n\n // Helper function to safely get map instance\n const getMapInstance = (): Map | null => {\n return map.value || null;\n };\n\n // Setup functions\n const setupMap = (mapInstance: Map) => {\n if (!mapInstance) return;\n\n mapInstance.on('style.load', () => {\n const styleTimeout = () => {\n if (!mapInstance.isStyleLoaded()) {\n loaded.value = false;\n setTimeout(styleTimeout, 200);\n } else {\n loaded.value = true;\n }\n };\n styleTimeout();\n });\n };\n\n const setSlotRef = (el: HTMLElement) => {\n slotRef.value = el;\n };\n\n const setMarkerCoordinates = (markerInstance: Marker): void => {\n if (props.coordinates !== null) {\n try {\n markerInstance.setLngLat(props.coordinates);\n } catch (error) {\n console.error('Error setting marker coordinates:', error);\n }\n }\n };\n\n const setCursorPointer = (markerInstance: Marker): void => {\n try {\n markerInstance.getElement().style.cursor = props.cursor || 'default';\n } catch (error) {\n console.error('Error setting cursor:', error);\n }\n };\n\n const addToMap = (markerInstance: Marker): void => {\n const mapInstance = getMapInstance();\n if (!mapInstance) return;\n\n try {\n markerInstance.addTo(mapInstance);\n emit('added', { marker: markerInstance });\n } catch (error) {\n console.error('Error adding marker to map:', error);\n }\n };\n\n const removeFromMap = (markerInstance: Marker): void => {\n try {\n markerInstance.remove();\n emit('removed');\n } catch (error) {\n console.error('Error removing marker from map:', error);\n }\n };\n\n const listenMarkerEvents = (markerInstance: Marker): void => {\n try {\n let coordinates: LngLatLike;\n markerMapEvents.forEach((event: string) => {\n markerInstance.on(event, (e: { target: Marker }) => {\n if (event === 'dragend') {\n if (Array.isArray(props.coordinates)) {\n coordinates = [\n e.target.getLngLat().lng,\n e.target.getLngLat().lat,\n ];\n } else {\n coordinates = e.target.getLngLat();\n }\n emit('update:coordinates', coordinates);\n }\n emit(event, e);\n });\n });\n\n markerDOMEvents.forEach((event: string) => {\n markerInstance.getElement().addEventListener(event, (e) => {\n emit(event, e);\n });\n });\n } catch (error) {\n console.error('Error setting up marker events:', error);\n }\n };\n\n // Watchers\n watch(marker, (markerValue) => {\n isMarkerAvailable.value = markerValue !== null && '_map' in markerValue;\n });\n\n // Watch for map instance changes\n watch(\n map,\n (newMap) => {\n if (newMap) {\n setupMap(newMap);\n }\n },\n { immediate: true },\n );\n\n // Lifecycle hooks\n onMounted(() => {\n if (loaded.value) {\n try {\n const markerOptions: MarkerOptions = {\n ...props.options,\n element: slotRef.value || undefined,\n };\n marker.value = new Marker(markerOptions);\n setMarkerCoordinates(marker.value);\n addToMap(marker.value);\n setCursorPointer(marker.value);\n listenMarkerEvents(marker.value);\n } catch (error) {\n console.error('Error initializing marker:', error);\n }\n }\n });\n\n onBeforeUnmount(() => {\n if (marker.value) {\n removeFromMap(marker.value);\n }\n });\n</script>\n\n<template>\n <section :id=\"`marker-${Date.now()}`\" class=\"absolute\">\n <slot :set-ref=\"setSlotRef\" name=\"markers\"></slot>\n <template v-if=\"isMarkerAvailable\">\n <v-popup\n :marker=\"marker!\"\n :options=\"popupOptions\"\n :coordinates=\"coordinates!\"\n >\n <slot></slot>\n </v-popup>\n </template>\n </section>\n</template>\n\n<style>\n .absolute {\n position: absolute !important;\n }\n</style>\n"],"names":["injectStrict","key","fallback","resolved","inject","MapKey","PMTileProtocolKey","defaultOptions","props","__props","slots","useSlots","map","onMounted","addControl","options","control","AttributionControl","_renderSlot","_ctx","FullscreenControl","geolocateControlEvents","emit","__emit","GeolocateControl","events","event","NavigationControl","ScaleControl","loaded","ref","getMapInstance","setupMap","mapInstance","styleTimeout","addLayer","layerSpec","error","updateSource","updateLayer","value","watch","newMap","onBeforeUnmount","hasValidData","data","source","existingLayers","l","setupLayerEvents","e","newSource","oldSource","newVisibility","hasLayer","beforeId","paint","layout","newTileUrl","oldTileUrl","newBefore","mapLayerEvents","mapEvents","markerMapEvents","markerDOMEvents","popupEvents","existingSource","currentLayer","currentPaint","currentLayout","eventName","oldMap","newTiles","oldTiles","newValue","oldValue","videoElement","protocol","p","PMTiles","_createBlock","VLayerMaplibreRaster","clustersLayerId","computed","clusterCountLayerId","unclusteredLayerId","addClusterLayers","updateVisibility","visible","visibility","layerId","checkStyleLoaded","newData","Protocol","maplibregl","provide","shallowRef","Map","listenMapEvents","evt","_createElementBlock","popup","Popup","content","setPopupContent","setPopupCoordinates","addToMarker","remove","listenPopupEvents","removePopupEvents","marker","isMarkerAvailable","slotRef","setSlotRef","el","setMarkerCoordinates","markerInstance","setCursorPointer","addToMap","removeFromMap","listenMarkerEvents","coordinates","markerValue","markerOptions","Marker","VPopup"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
canvas[data-v-e49c0b85]{outline:none}.v-map-container[data-v-e49c0b85]{width:100%;height:100%}.absolute{position:absolute!important}
|
package/package.json
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@geoql/v-maplibre",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Vue 3 components for MapLibre GL - reactive map components with full TypeScript support",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./style.css": "./dist/v-maplibre.css",
|
|
15
|
+
"./dist/style.css": "./dist/v-maplibre.css"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"dev": "vite",
|
|
22
|
+
"build": "vite build && vue-tsc --declaration --emitDeclarationOnly --outDir dist",
|
|
23
|
+
"preview": "vite preview",
|
|
24
|
+
"test": "vitest",
|
|
25
|
+
"test:ui": "vitest --ui",
|
|
26
|
+
"test:coverage": "vitest --coverage",
|
|
27
|
+
"lint": "oxlint",
|
|
28
|
+
"lint:fix": "oxlint --fix",
|
|
29
|
+
"format": "prettier --write .",
|
|
30
|
+
"format:check": "prettier --check .",
|
|
31
|
+
"docs:dev": "nuxi dev docs",
|
|
32
|
+
"docs:build": "nuxi generate docs",
|
|
33
|
+
"docs:preview": "nuxi preview docs",
|
|
34
|
+
"prepare": "husky",
|
|
35
|
+
"release": "release-it",
|
|
36
|
+
"prepublishOnly": "pnpm run lint && pnpm run format:check && pnpm run test:coverage && pnpm run build"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"vue": "^3.5.0"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"maplibre-gl": "^5.0.0",
|
|
43
|
+
"pmtiles": "^4.0.0"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@awmottaz/prettier-plugin-void-html": "^1.6.1",
|
|
47
|
+
"@commitlint/cli": "^19.6.1",
|
|
48
|
+
"@commitlint/config-conventional": "^19.6.0",
|
|
49
|
+
"@nuxt-themes/docus": "^1.15.1",
|
|
50
|
+
"@release-it/conventional-changelog": "^9.0.3",
|
|
51
|
+
"@types/node": "^22.10.2",
|
|
52
|
+
"@vitejs/plugin-vue": "^5.2.1",
|
|
53
|
+
"@vitest/coverage-v8": "^2.1.8",
|
|
54
|
+
"@vitest/ui": "^2.1.8",
|
|
55
|
+
"@vue/test-utils": "^2.4.6",
|
|
56
|
+
"happy-dom": "^15.11.7",
|
|
57
|
+
"husky": "^9.1.7",
|
|
58
|
+
"lint-staged": "^15.2.11",
|
|
59
|
+
"nuxt": "^3.15.2",
|
|
60
|
+
"oxlint": "^1.30.0",
|
|
61
|
+
"prettier": "^3.4.2",
|
|
62
|
+
"release-it": "^17.10.0",
|
|
63
|
+
"typescript": "^5.7.2",
|
|
64
|
+
"vite": "^6.0.7",
|
|
65
|
+
"vitest": "^2.1.8",
|
|
66
|
+
"vue": "^3.5.13",
|
|
67
|
+
"vue-tsc": "^2.1.10"
|
|
68
|
+
},
|
|
69
|
+
"publishConfig": {
|
|
70
|
+
"access": "public"
|
|
71
|
+
},
|
|
72
|
+
"keywords": [
|
|
73
|
+
"vue",
|
|
74
|
+
"vue3",
|
|
75
|
+
"maplibre",
|
|
76
|
+
"maplibre-gl",
|
|
77
|
+
"map",
|
|
78
|
+
"mapping",
|
|
79
|
+
"gis",
|
|
80
|
+
"geospatial",
|
|
81
|
+
"components",
|
|
82
|
+
"nuxt"
|
|
83
|
+
],
|
|
84
|
+
"license": "MIT",
|
|
85
|
+
"repository": {
|
|
86
|
+
"type": "git",
|
|
87
|
+
"url": "https://github.com/geoql/v-maplibre.git"
|
|
88
|
+
},
|
|
89
|
+
"bugs": {
|
|
90
|
+
"url": "https://github.com/geoql/v-maplibre/issues"
|
|
91
|
+
},
|
|
92
|
+
"homepage": "https://github.com/geoql/v-maplibre#readme",
|
|
93
|
+
"private": false,
|
|
94
|
+
"sideEffects": [
|
|
95
|
+
"*.css"
|
|
96
|
+
],
|
|
97
|
+
"author": {
|
|
98
|
+
"name": "Vinayak Kulkarni",
|
|
99
|
+
"email": "inbox.vinayak@gmail.com",
|
|
100
|
+
"url": "https://vinayakkulkarni.dev"
|
|
101
|
+
},
|
|
102
|
+
"packageManager": "pnpm@10.23.0+sha512.21c4e5698002ade97e4efe8b8b4a89a8de3c85a37919f957e7a0f30f38fbc5bbdd05980ffe29179b2fb6e6e691242e098d945d1601772cad0fef5fb6411e2a4b"
|
|
103
|
+
}
|