solid-map-gl 1.1.28 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/{esm/styles.css → cjs/index.css} +0 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/index.css +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/index/components/Camera/index.d.ts +15 -0
- package/dist/index/components/Camera/index.jsx +49 -0
- package/dist/{types → index}/components/Control/index.d.ts +2 -2
- package/dist/{source → index}/components/Control/index.jsx +8 -6
- package/dist/{types → index}/components/Fog/index.d.ts +2 -2
- package/dist/index/components/Fog/index.jsx +21 -0
- package/dist/{types → index}/components/Image/index.d.ts +1 -2
- package/dist/{source → index}/components/Image/index.jsx +8 -10
- package/dist/{types → index}/components/Layer/index.d.ts +2 -2
- package/dist/{source → index}/components/Layer/index.jsx +28 -26
- package/dist/{types → index}/components/MapGL/index.d.ts +22 -5
- package/dist/{source → index}/components/MapGL/index.jsx +22 -15
- package/dist/{types → index}/components/Marker/index.d.ts +2 -2
- package/dist/{source → index}/components/Marker/index.jsx +6 -5
- package/dist/{types → index}/components/Popup/index.d.ts +2 -2
- package/dist/{source → index}/components/Popup/index.jsx +7 -6
- package/dist/{types → index}/components/Sky/index.d.ts +2 -2
- package/dist/index/components/Sky/index.jsx +22 -0
- package/dist/index/components/Source/index.d.ts +10 -0
- package/dist/index/components/Source/index.jsx +72 -0
- package/dist/{types → index}/components/Terrain/index.d.ts +2 -2
- package/dist/index/components/Terrain/index.jsx +23 -0
- package/dist/{types → index}/events.d.ts +0 -0
- package/dist/{source → index}/events.js +0 -0
- package/dist/index/index.d.ts +12 -0
- package/dist/index/index.jsx +11 -0
- package/dist/index/styles.d.ts +56 -0
- package/dist/index/styles.js +121 -0
- package/package.json +16 -14
- package/dist/source/components/Fog/index.jsx +0 -21
- package/dist/source/components/Sky/index.jsx +0 -22
- package/dist/source/components/Source/index.jsx +0 -32
- package/dist/source/components/Terrain/index.jsx +0 -23
- package/dist/source/index.jsx +0 -10
- package/dist/types/components/Source/index.d.ts +0 -8
- package/dist/types/index.d.ts +0 -11
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/events.ts","../../src/components/MapGL/index.tsx","../../src/components/Source/index.tsx","../../src/components/Layer/index.tsx","../../src/components/Fog/index.tsx","../../src/components/Sky/index.tsx","../../src/components/Terrain/index.tsx","../../src/components/Control/index.tsx","../../src/components/Marker/index.tsx","../../src/components/Popup/index.tsx","../../src/components/Image/index.tsx"],"sourcesContent":["const mapEvents: string[] = [\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseOver',\n 'onMouseOut',\n 'onMouseMove',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onPreClick',\n 'onClick',\n 'onDblClick',\n 'onContextMenu',\n 'onTouchStart',\n 'onTouchEnd',\n 'onTouchCancel',\n 'onWheel',\n 'onResize',\n 'onRemove',\n 'onTouchMove',\n 'onMoveStart',\n 'onMove',\n 'onMoveEnd',\n 'onDragStart',\n 'onDrag',\n 'onDragEnd',\n 'onZoomStart',\n 'onZoom',\n 'onZoomEnd',\n 'onRotateStart',\n 'onRotate',\n 'onRotatEnd',\n 'onPitchStart',\n 'onPitch',\n 'onPitchEnd',\n 'onBoxZoomStart',\n 'onBoxZoomEnd',\n 'onBoxZoomCancel',\n 'onWebglContextLost',\n 'onWebglContextRestored',\n 'onLoad',\n 'onRender',\n 'onIdle',\n 'onError',\n 'onData',\n 'onStyleData',\n 'onSourceData',\n 'onDataLoading',\n 'onStyleDataLoading',\n 'onSourceDataLoading',\n 'onStyleImageMissing',\n]\n\nconst layerEvents: string[] = [\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseOver',\n 'onMouseOut',\n 'onMouseMove',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onClick',\n 'onDblClick',\n 'onContextMenu',\n 'onTouchStart',\n 'onTouchEnd',\n 'onTouchCancel',\n]\n\nexport { mapEvents, layerEvents }\n","import {\n createSignal,\n createEffect,\n onMount,\n onCleanup,\n createContext,\n useContext,\n Component,\n useTransition,\n createUniqueId,\n untrack,\n on,\n} from 'solid-js'\nimport { mapEvents } from '../../events'\nimport mapboxgl from 'mapbox-gl'\nimport 'mapbox-gl/dist/mapbox-gl.css'\nimport type { MapboxMap, MapboxOptions } from 'mapbox-gl/src/ui/map'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\nimport type { LngLatBounds } from 'mapbox-gl/src/geo/lng_lat_bounds.js'\nimport type { PaddingOptions } from 'mapbox-gl/src/geo/edge_insets.js'\nimport type { JSX } from 'solid-js'\n\nexport type Viewport = {\n id?: string\n center?: LngLatLike\n bounds?: LngLatBounds\n zoom?: number\n pitch?: number\n bearing?: number\n padding?: PaddingOptions\n}\n\nconst [pending, start] = useTransition()\nconst [transitionType, setTransitionType] = createSignal('flyTo')\n\nconst MapContext = createContext<MapboxMap>()\nconst useMap = () => useContext(MapContext)\n\nconst MapGL: Component<{\n id?: string\n style?: JSX.CSSProperties\n class?: string\n classList?: {\n [k: string]: boolean | undefined\n }\n viewport?: Viewport\n options?: MapboxOptions\n children?: Element | Element[]\n triggerResize?: boolean\n transitionType?: 'flyTo' | 'easeTo' | 'jumpTo'\n onViewportChange?: (viewport: Viewport) => void\n showTileBoundaries?: boolean\n showTerrainWireframe?: boolean\n showPadding?: boolean\n showCollisionBoxes?: boolean\n showOverdrawInspector?: boolean\n repaint?: boolean\n cursorStyle?: string\n ref?: HTMLDivElement\n}> = props => {\n let map: MapboxMap\n let mapRef: HTMLDivElement\n let containerRef: HTMLElement\n props.id = props.id || createUniqueId()\n\n onMount(() => {\n map = new mapboxgl.Map({\n ...props.options,\n style: props.options?.style || { version: 8, sources: {}, layers: [] },\n container: mapRef,\n interactive: !!props.onViewportChange,\n bounds: props.viewport?.bounds,\n center: props.viewport?.center,\n zoom: props.viewport?.zoom || null,\n pitch: props.viewport?.pitch || null,\n bearing: props.viewport?.bearing || null,\n fitBoundsOptions: { padding: props.viewport?.padding },\n } as MapboxOptions)\n\n map.container = containerRef\n })\n\n onCleanup(() => map.remove())\n\n // Hook up events\n createEffect(() =>\n mapEvents.forEach(item => {\n if (props[item]) {\n const event = item.slice(2).toLowerCase()\n const callback = e => props[item](e)\n map.on(event, callback)\n onCleanup(() => map.off(event, callback))\n }\n })\n )\n\n // Update debug features\n createEffect(() => (map.showTileBoundaries = props.showTileBoundaries))\n createEffect(() => (map.showTerrainWireframe = props.showTerrainWireframe))\n createEffect(() => (map.showPadding = props.showPadding))\n createEffect(() => (map.showCollisionBoxes = props.showCollisionBoxes))\n createEffect(() => (map.showOverdrawInspector = props.showOverdrawInspector))\n createEffect(() => (map.getCanvas().style.cursor = props.cursorStyle))\n\n // Update map style\n createEffect(\n on(\n () => props.options.style,\n () => {\n const oldStyle = map.getStyle()\n const oldLayers = oldStyle.layers.filter(l => l.id.startsWith('cl-'))\n const oldSources = Object.keys(oldStyle.sources)\n .filter(s => s.startsWith('cl-'))\n .reduce((obj, key) => ({ ...obj, [key]: oldStyle.sources[key] }), {})\n map.setStyle(props.options.style)\n map.once('styledata', () => {\n const newStyle = map.getStyle()\n map.setStyle({\n ...newStyle,\n sources: { ...newStyle.sources, ...oldSources },\n layers: [...newStyle.layers, ...oldLayers],\n })\n })\n },\n { defer: true }\n )\n )\n\n // Update projection\n createEffect(\n on(\n () => props.options.projection,\n () => map.setProjection(props.options.projection),\n { defer: true }\n )\n )\n\n createEffect(() => setTransitionType(props.transitionType))\n\n // Hook up viewport events\n createEffect(() => {\n const viewport = {\n id: null,\n center: map.getCenter(),\n zoom: map.getZoom(),\n pitch: map.getPitch(),\n bearing: map.getBearing(),\n padding: props.viewport?.padding,\n bounds: props.viewport?.bounds,\n }\n\n const callMove = event => {\n if (event.originalEvent)\n props.onViewportChange &&\n props.onViewportChange({ ...viewport, id: props.id })\n setTransitionType('jumpTo')\n }\n\n const callEnd = event => {\n if (event.originalEvent)\n props.onViewportChange && props.onViewportChange(viewport)\n setTransitionType(props.transitionType)\n }\n\n map.on('move', callMove).on('moveend', callEnd)\n onCleanup(() => map.off('move', callMove).off('moveend', callEnd))\n })\n\n // Update boundaries\n createEffect(prev => {\n if (props.viewport?.bounds != prev)\n props.onViewportChange({\n ...props.viewport,\n ...map.cameraForBounds(props.viewport?.bounds, {\n padding: props.viewport?.padding,\n }),\n })\n return props.viewport?.bounds\n }, props.viewport?.bounds)\n\n // Update Viewport\n createEffect(() => {\n if (props.id === props.viewport?.id) return\n const viewport = {\n ...props.viewport,\n padding: props.viewport?.padding || 0,\n }\n switch (untrack(transitionType)) {\n case 'easeTo':\n map.stop().easeTo(viewport)\n case 'jumpTo':\n map.stop().jumpTo(viewport)\n default:\n map.stop().flyTo(viewport)\n }\n })\n\n let index = 0\n\n createEffect(() => {\n if (props.triggerResize) {\n index = 0\n window.requestAnimationFrame(function loop() {\n if (index < 15) {\n index++\n window.requestAnimationFrame(loop)\n start(() => map.resize())\n }\n })\n }\n })\n\n return (\n <MapContext.Provider value={() => map}>\n <section\n ref={containerRef}\n style={{ position: 'absolute', 'z-index': 1 }}>\n {props.children}\n </section>\n <div\n ref={mapRef}\n class={props.class || ''}\n classList={props.classList}\n style={{ height: '100%', width: '100%', ...props.style }}\n />\n </MapContext.Provider>\n )\n}\n\nexport { MapGL as default, useMap }\n","import {\n onMount,\n onCleanup,\n createEffect,\n Component,\n createContext,\n useContext,\n createUniqueId,\n} from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n Source,\n SourceSpecification,\n} from 'mapbox-gl/src/style-spec/types.js'\n\nconst SourceContext = createContext<Source>()\n\nconst useSource = (): Source => useContext(SourceContext)\n\nconst SourceComponent: Component<{\n id?: string\n source: SourceSpecification\n}> = props => {\n const map: MapboxMap = useMap()\n props.id = props.id || createUniqueId()\n // Add Source\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n !map().getSource(props.id) && map().addSource(props.id, props.source)\n })\n\n // Remove Source\n onCleanup(() => {\n map()\n .getStyle()\n .layers.forEach(\n layer => layer.source === props.id && map().removeLayer(layer.id)\n )\n map().getSource(props.id) && map().removeSource(props.id)\n })\n\n // Update GeoJSON Data\n createEffect(async () => {\n if (props.source.type !== 'geojson' && !props.source.data) return\n\n map().style &&\n map().getSource(props.id) &&\n map().getSource(props.id).setData(props.source.data)\n })\n\n return (\n <SourceContext.Provider value={{ id: props.id }}>\n {props.children}\n </SourceContext.Provider>\n )\n}\n\nexport { SourceComponent as default, useSource }\n","import {\n onMount,\n onCleanup,\n createEffect,\n Component,\n createUniqueId,\n} from 'solid-js'\nimport { useMap } from '../MapGL'\nimport { useSource } from '../Source'\nimport { layerEvents } from '../../events'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n FilterSpecification,\n StyleSpecification,\n SourceSpecification,\n} from 'mapbox-gl/src/style-spec/types.js'\nimport type { CustomLayerInterface } from 'mapbox-gl/src/style/style_layer/custom_style_layer'\n\nconst diff = (\n newProps: StyleSpecification = {},\n prevProps: StyleSpecification = {}\n) => {\n const keys = new Set([...Object.keys(newProps), ...Object.keys(prevProps)])\n return [...keys].reduce((acc, key: string) => {\n const value = newProps[key]\n if (value !== prevProps[key]) {\n acc.push([key, value])\n }\n return acc\n }, [])\n}\n\nconst Layer: Component<{\n id?: string\n style?: StyleSpecification\n customLayer?: CustomLayerInterface\n filter?: FilterSpecification\n visible?: boolean\n sourceId?: string\n beforeType?:\n | 'background'\n | 'fill'\n | 'line'\n | 'symbol'\n | 'raster'\n | 'circle'\n | 'fill-extrusion'\n | 'heatmap'\n | 'hillshade'\n | 'sky'\n beforeId?: string\n featureState?: { id: number | string; state: object }\n}> = props => {\n const map: MapboxMap = useMap()\n const source: SourceSpecification = useSource()\n props.id = props.id || createUniqueId()\n // Add Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n\n if (map().getLayer(props.id)) return\n\n map().addLayer(\n props.customLayer || {\n ...props.style,\n id: props.id,\n source: source.id,\n metadata: {\n smg: { beforeType: props.beforeType, beforeId: props.beforeId },\n },\n },\n props.beforeType\n ? map()\n .getStyle()\n .layers.find(l => l.type === props.beforeType).id\n : props.beforeId\n )\n })\n\n onCleanup(() => map().removeLayer(props.id))\n\n // Hook up events\n createEffect(() =>\n layerEvents.forEach(item => {\n if (props[item]) {\n const event = item.slice(2).toLowerCase()\n const callback = e => props[item](e)\n map().on(event, props.id, callback)\n onCleanup(() => map().off(event, props.id, callback))\n }\n })\n )\n\n // Update Style\n createEffect((prev: StyleSpecification) => {\n if (\n !props.style ||\n !map().style ||\n !map().getSource(source.id) ||\n !map().getLayer(props.id)\n )\n return\n\n if (props.style.layout !== prev?.layout)\n diff(props.style.layout, prev?.layout).forEach(([key, value]) =>\n map().setLayoutProperty(props.id, key, value, { validate: false })\n )\n\n if (props.style.paint !== prev?.paint)\n diff(props.style.paint, prev?.paint).forEach(([key, value]) =>\n map().setPaintProperty(props.id, key, value, { validate: false })\n )\n\n if (\n props.style.minzoom !== prev?.minzoom ||\n props.style.maxzoom !== prev?.maxzoom\n )\n map().setLayerZoomRange(\n props.id,\n props.style.minzoom,\n props.style.maxzoom\n )\n\n if (props.style.filter !== prev?.filter)\n map().setFilter(props.id, props.style.filter, { validate: false })\n\n return props.style\n }, props.style)\n\n // Update Visibility\n createEffect((prev: boolean) => {\n if (\n props.visible === undefined ||\n props.visible === prev ||\n !map().getSource(source.id) ||\n !map().getLayer(props.id)\n )\n return\n\n map().setLayoutProperty(\n props.id,\n 'visibility',\n props.visible ? 'visible' : 'none',\n { validate: false }\n )\n return props.visible\n }, props.visible)\n\n // Update Filter\n createEffect(async () => {\n if (!props.filter) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFilter(props.id, props.filter)\n })\n\n // Update Feature State\n createEffect(async () => {\n if (!props.featureState || !props.featureState.id) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n\n map().removeFeatureState({\n source: source.id,\n sourceLayer: props.style['source-layer'],\n })\n map().setFeatureState(\n {\n source: source.id,\n sourceLayer: props.style['source-layer'],\n id: props.featureState.id,\n },\n props.featureState.state\n )\n })\n\n return props.children\n}\n\nexport default Layer\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { FogSpecification } from 'mapbox-gl/src/style-spec/types.js'\n\nconst Fog: Component<{\n style: FogSpecification\n visible?: boolean\n}> = props => {\n const map: MapboxMap = useMap()\n // Add Fog Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFog(props.style)\n })\n // Remove Fog Layer\n onCleanup(() => map().setFog(null))\n\n // Update Visibility\n createEffect(async () => {\n if (props.visible === undefined) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFog(props.visible ? props.style : null)\n })\n\n return props.children\n}\n\nexport default Fog\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { StyleSpecification } from 'mapbox-gl/src/style-spec/types.js'\n\nconst Sky: Component<{\n style: StyleSpecification\n visible?: boolean\n}> = props => {\n const map: MapboxMap = useMap()\n const layerId = '_sky'\n // Add Sky Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n !map().getLayer(layerId) && map().addLayer({ ...props.style, id: layerId })\n })\n\n // Remove Sky Layer\n onCleanup(() => map().getLayer(layerId) && map().removeLayer(layerId))\n\n // Update Visibility\n createEffect(async () => {\n if (props.visible === undefined) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setLayoutProperty(\n layerId,\n 'visibility',\n props.visible ? 'visible' : 'none'\n )\n })\n\n return props.children\n}\n\nexport default Sky\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport { useSource } from '../Source'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n TerrainSpecification,\n SourceSpecification,\n} from 'mapbox-gl/src/style-spec/types.js'\n\nconst Terrain: Component<{\n style: TerrainSpecification\n visible?: boolean\n}> = props => {\n const map: MapboxMap = useMap()\n const source: SourceSpecification = useSource()\n\n // Add Terrain Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setTerrain({ ...props.style, source: source.id })\n })\n\n // Remove Terrain Layer\n onCleanup(() => map().setTerrain(null))\n\n // Update Visibility\n createEffect(async () => {\n if (props.visible === undefined) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setTerrain(props.visible ? props.style : null)\n })\n\n return props.children\n}\n\nexport default Terrain\n","import { onMount, onCleanup, createSignal, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { Options as AttributionOptions } from 'mapbox-gl/src/ui/control/attribution_control'\nimport type { Options as FullscreenOptions } from 'mapbox-gl/src/ui/control/fullscreen_control'\nimport type { Options as GeolocateOptions } from 'mapbox-gl/src/ui/control/geolocate_control'\nimport type { Options as NavigationOptions } from 'mapbox-gl/src/ui/control/navigation_control'\nimport type { Options as ScaleOptions } from 'mapbox-gl/src/ui/control/scale_control'\n\nconst Control: Component<{\n type: 'navigation' | 'scale' | 'attribution' | 'fullscreen' | 'geolocate'\n options?:\n | NavigationOptions\n | ScaleOptions\n | AttributionOptions\n | FullscreenOptions\n | GeolocateOptions\n | object\n custom?: any\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n}> = props => {\n const map: MapboxMap = useMap()\n const [control, setControl] = createSignal(null)\n\n const getControl = (type, options) => {\n if (props.custom) return new props.custom(options)\n switch (type) {\n case 'navigation':\n return new mapboxgl.NavigationControl(options)\n case 'scale':\n return new mapboxgl.ScaleControl(options)\n case 'attribution':\n return new mapboxgl.AttributionControl(options)\n case 'geolocate':\n return new mapboxgl.GeolocateControl(options)\n case 'fullscreen':\n return new mapboxgl.FullscreenControl(\n options || { container: map().container }\n )\n default:\n throw new Error(`Unknown control type: ${type}`)\n }\n }\n\n // Add Control\n onMount(() => {\n const control = getControl(props.type, props.options)\n control && map().addControl(control, props.position)\n setControl(control)\n })\n\n onCleanup(() => map().removeControl(control()))\n\n return props.children\n}\n\nexport default Control\n","import { onMount, onCleanup, createEffect, Component, children } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { MarkerSpecification } from 'mapbox-gl/src/style-spec/types.js'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\n\nconst Marker: Component<{\n options?: MarkerSpecification\n lnglat: LngLatLike\n}> = props => {\n const map: MapboxMap = useMap()\n let marker = null\n\n // Add Marker\n onMount(async () => {\n marker = new mapboxgl.Marker(props.options)\n .setLngLat(props.lnglat)\n .setPopup(\n props.children\n ? new mapboxgl.Popup().setDOMContent(<div>{props.children}</div>)\n : null\n )\n .addTo(map())\n })\n // Remove Marker\n onCleanup(() => marker.remove())\n\n // Update Position\n createEffect(() => marker.setLngLat(props.lnglat))\n\n return <></>\n}\n\nexport default Marker\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { PopupSpecification } from 'mapbox-gl/src/style-spec/types.js'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\n\nconst Popup: Component<{\n options?: PopupSpecification\n lnglat: LngLatLike\n}> = props => {\n const map: MapboxMap = useMap()\n let popup = null\n\n // Add Popup\n onMount(async () => {\n popup = new mapboxgl.Popup(props.options)\n .setLngLat(props.lnglat)\n .setDOMContent(<div>{props.children}</div>)\n .addTo(map())\n })\n // Remove Popup\n onCleanup(() => popup.remove())\n\n // Update Position\n createEffect(() => popup.setLngLat(props.lnglat))\n\n // Update Content\n createEffect(() => popup.setDOMContent(<div>{props.children}</div>))\n\n return <></>\n}\n\nexport default Popup\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n StyleImageInterface,\n StyleImageMetadata,\n} from 'mapbox-gl/src/style/style_image'\n\nconst Image: Component<{\n id: string\n url?: string\n image?:\n | HTMLImageElement\n | ImageBitmap\n | ImageData\n | { width: number; height: number; data: Uint8Array | Uint8ClampedArray }\n | StyleImageInterface\n options?: StyleImageMetadata\n}> = props => {\n const map: MapboxMap = useMap()\n // Add Image\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n if (props.url) {\n map().loadImage(props.url, (error, image) => {\n if (error) throw error\n !map().hasImage(props.id) && map().addImage(props.id, image)\n })\n } else {\n !map().hasImage(props.id) &&\n map().addImage(props.id, props.image, props.options)\n }\n })\n // Remove Image\n onCleanup(() => map().hasImage(props.id) && map().removeImage(props.id))\n\n // Update Image\n createEffect(async () => {\n if (props.image && props.url) return\n\n if (props.url) {\n map().loadImage(props.url, (error, image) => {\n if (error) throw error\n !map().hasImage(props.id) && map().updateImage(props.id, image)\n })\n } else {\n map().style &&\n map().hasImage(props.id) &&\n map().updateImage(props.id, props.image)\n }\n })\n\n return <></>\n}\n\nexport default Image\n"],"names":["mapEvents","layerEvents","pending","start","useTransition","transitionType","setTransitionType","createSignal","MapContext","createContext","useMap","useContext","MapGL","props","_props$viewport13","let","map","mapRef","containerRef","index","id","createUniqueId","onMount","_props$viewport6","mapboxgl","Map","options","style","_props$options","version","sources","layers","container","interactive","onViewportChange","bounds","viewport","_props$viewport","center","_props$viewport2","zoom","_props$viewport3","pitch","_props$viewport4","bearing","_props$viewport5","fitBoundsOptions","padding","onCleanup","remove","createEffect","forEach","item","event","slice","toLowerCase","callback","e","on","off","showTileBoundaries","showTerrainWireframe","showPadding","showCollisionBoxes","showOverdrawInspector","getCanvas","cursor","cursorStyle","oldStyle","getStyle","oldLayers","filter","l","startsWith","oldSources","Object","keys","s","reduce","obj","key","setStyle","once","newStyle","defer","projection","setProjection","_props$viewport8","getCenter","getZoom","getPitch","getBearing","_props$viewport7","callMove","originalEvent","callEnd","prev","_props$viewport12","_props$viewport9","cameraForBounds","_props$viewport10","_props$viewport11","_props$viewport15","_props$viewport14","untrack","stop","easeTo","jumpTo","flyTo","triggerResize","window","requestAnimationFrame","loop","resize","_$createComponent","Provider","value","children","_el$","_tmpl$","cloneNode","_ref$","setProperty","_el$2","_tmpl$2","_ref$2","_$effect","_p$","_v$","class","classList","_v$3","height","width","className","_v$2","_$classList","_$style","undefined","SourceContext","useSource","SourceComponent","async","isStyleLoaded","getSource","addSource","source","layer","removeLayer","removeSource","type","data","setData","diff","newProps","prevProps","Set","acc","push","Layer","getLayer","addLayer","customLayer","metadata","smg","beforeType","beforeId","find","layout","setLayoutProperty","validate","paint","setPaintProperty","minzoom","maxzoom","setLayerZoomRange","setFilter","visible","featureState","removeFeatureState","sourceLayer","setFeatureState","state","Fog","setFog","Sky","layerId","Terrain","setTerrain","Control","control","setControl","custom","NavigationControl","ScaleControl","AttributionControl","GeolocateControl","FullscreenControl","Error","getControl","addControl","position","removeControl","Marker","marker","setLngLat","lnglat","setPopup","Popup","setDOMContent","addTo","popup","Image","url","loadImage","error","image","hasImage","addImage","removeImage","updateImage"],"mappings":"oPAAA,MAAMA,UAAsB,CAC1B,cACA,YACA,cACA,aACA,cACA,eACA,eACA,aACA,UACA,aACA,gBACA,eACA,aACA,gBACA,UACA,WACA,WACA,cACA,cACA,SACA,YACA,cACA,SACA,YACA,cACA,SACA,YACA,gBACA,WACA,aACA,eACA,UACA,aACA,iBACA,eACA,kBACA,qBACA,yBACA,SACA,WACA,SACA,UACA,SACA,cACA,eACA,gBACA,qBACA,sBACA,uBAGIC,YAAwB,CAC5B,cACA,YACA,cACA,aACA,cACA,eACA,eACA,UACA,aACA,gBACA,eACA,aACA,8FCjCI,CAACC,QAASC,OAASC,gBACnB,CAACC,eAAgBC,mBAAqBC,aAAa,SAEnDC,WAAaC,gBACbC,OAAS,IAAMC,WAAWH,YAE1BI,MAqBDC,IAAS,IAAAC,EACZC,IAAIC,EACAC,EACAC,EAuIAC,GAtIJN,EAAMO,GAAKP,EAAMO,IAAMC,iBAEvBC,QAAQ,KAAM,IAAAC,GACZP,EAAM,IAAIQ,SAASC,IAAI,IAClBZ,EAAMa,QACTC,OAAOd,OAAAA,EAAAA,EAAMa,cAAN,EAAAE,EAAeD,QAAS,CAAEE,QAAS,EAAGC,QAAS,GAAIC,OAAQ,IAClEC,UAAWf,EACXgB,cAAepB,EAAMqB,iBACrBC,OAAQtB,OAAAA,EAAAA,EAAMuB,eAAR,EAAEC,EAAgBF,OACxBG,OAAQzB,OAAAA,EAAAA,EAAMuB,eAAR,EAAEG,EAAgBD,OACxBE,MAAM3B,OAAAA,EAAAA,EAAMuB,eAAN,EAAAK,EAAgBD,OAAQ,KAC9BE,OAAO7B,OAAAA,EAAAA,EAAMuB,eAAN,EAAAO,EAAgBD,QAAS,KAChCE,SAAS/B,OAAAA,EAAAA,EAAMuB,eAAN,EAAAS,EAAgBD,UAAW,KACpCE,iBAAkB,CAAEC,QAASlC,OAAAA,EAAAA,EAAMuB,iBAANb,EAAgBwB,YAG3Cf,UAAYd,IAGlB8B,UAAU,IAAMhC,EAAIiC,UAGpBC,aAAa,IACXlD,UAAUmD,QAAQC,IAChB,GAAIvC,EAAMuC,GAAO,CACTC,MAAAA,EAAQD,EAAKE,MAAM,GAAGC,cACtBC,EAAWC,GAAK5C,EAAMuC,GAAMK,GAClCzC,EAAI0C,GAAGL,EAAOG,GACdR,UAAU,IAAMhC,EAAI2C,IAAIN,EAAOG,QAMrCN,aAAa,IAAOlC,EAAI4C,mBAAqB/C,EAAM+C,oBACnDV,aAAa,IAAOlC,EAAI6C,qBAAuBhD,EAAMgD,sBACrDX,aAAa,IAAOlC,EAAI8C,YAAcjD,EAAMiD,aAC5CZ,aAAa,IAAOlC,EAAI+C,mBAAqBlD,EAAMkD,oBACnDb,aAAa,IAAOlC,EAAIgD,sBAAwBnD,EAAMmD,uBACtDd,aAAa,IAAOlC,EAAIiD,YAAYtC,MAAMuC,OAASrD,EAAMsD,aAGzDjB,aACEQ,GACE,IAAM7C,EAAMa,QAAQC,MACpB,KACE,MAAMyC,EAAWpD,EAAIqD,WACfC,EAAYF,EAASrC,OAAOwC,OAAOC,GAAKA,EAAEpD,GAAGqD,WAAW,QACxDC,EAAaC,OAAOC,KAAKR,EAAStC,SACrCyC,OAAOM,GAAKA,EAAEJ,WAAW,QACzBK,OAAO,CAACC,EAAKC,KAAS,IAAKD,GAAMC,GAAMZ,EAAStC,QAAQkD,KAAS,IACpEhE,EAAIiE,SAASpE,EAAMa,QAAQC,OAC3BX,EAAIkE,KAAK,YAAa,KACpB,IAAMC,EAAWnE,EAAIqD,WACrBrD,EAAIiE,SAAS,IACRE,EACHrD,QAAS,IAAKqD,EAASrD,WAAY4C,GACnC3C,OAAQ,IAAIoD,EAASpD,UAAWuC,QAItC,CAAEc,OAAO,KAKblC,aACEQ,GACE,IAAM7C,EAAMa,QAAQ2D,WACpB,IAAMrE,EAAIsE,cAAczE,EAAMa,QAAQ2D,YACtC,CAAED,OAAO,KAIblC,aAAa,IAAM5C,kBAAkBO,EAAMR,iBAG3C6C,aAAa,KAAM,IAAAqC,EACjB,MAAMnD,EAAW,CACfhB,GAAI,KACJkB,OAAQtB,EAAIwE,YACZhD,KAAMxB,EAAIyE,UACV/C,MAAO1B,EAAI0E,WACX9C,QAAS5B,EAAI2E,aACb5C,QAASlC,OAAAA,EAAAA,EAAMuB,eAAR,EAAEwD,EAAgB7C,QACzBZ,OAAQtB,OAAAA,EAAAA,EAAMuB,iBAANmD,EAAgBpD,QAGpB0D,EAAWxC,IACXA,EAAMyC,eACRjF,EAAMqB,kBACJrB,EAAMqB,iBAAiB,IAAKE,EAAUhB,GAAIP,EAAMO,KACpDd,kBAAkB,WAGdyF,EAAU1C,IACVA,EAAMyC,eACRjF,EAAMqB,kBAAoBrB,EAAMqB,iBAAiBE,GACnD9B,kBAAkBO,EAAMR,iBAG1BW,EAAI0C,GAAG,OAAQmC,GAAUnC,GAAG,UAAWqC,GACvC/C,UAAU,IAAMhC,EAAI2C,IAAI,OAAQkC,GAAUlC,IAAI,UAAWoC,MAI3D7C,aAAa8C,IAAQ,IAAAC,EAQnB,gBAPIpF,EAAMuB,eAAN,EAAA8D,EAAgB/D,SAAU6D,GAC5BnF,EAAMqB,iBAAiB,IAClBrB,EAAMuB,YACNpB,EAAImF,gBAAgBtF,OAAAA,EAAAA,EAAMuB,eAA1B,EAAoBgE,EAAgBjE,OAAQ,CAC7CY,QAASlC,OAAAA,EAAAA,EAAMuB,iBAANiE,EAAgBtD,YAG/B,OAAAkD,EAAOpF,EAAMuB,eAAb,EAAO6D,EAAgB9D,QARb,OAAArB,EASTD,EAAMuB,iBAANtB,EAAgBqB,QAGnBe,aAAa,KAAM,IAAAoD,EACbzF,GAAAA,EAAMO,MAAOP,OAAAA,EAAAA,EAAMuB,eAAN,EAAAmE,EAAgBnF,IAA7BP,CACJ,IAAMuB,EAAW,IACZvB,EAAMuB,SACTW,SAASlC,OAAAA,EAAAA,EAAMuB,eAAN,EAAAkE,EAAgBvD,UAAW,GAE9ByD,OAAAA,QAAQnG,iBACd,IAAK,SACHW,EAAIyF,OAAOC,OAAOtE,GACpB,IAAK,SACHpB,EAAIyF,OAAOE,OAAOvE,GACpB,QACEpB,EAAIyF,OAAOG,MAAMxE,OAIX,GAgBT,OAdHc,aAAa,KACPrC,EAAMgG,gBACR1F,EAAQ,EACR2F,OAAOC,sBAAsB,SAASC,IAChC7F,EAAQ,KACVA,IACA2F,OAAOC,sBAAsBC,GAC7B7G,MAAM,IAAMa,EAAIiG,gBAOrBC,gBAAA1G,WAAW2G,SADd,CACuBC,MAAO,IAAMpG,EADpCqG,eAAA,MAAA,EAAA,KAAA,MAAAC,EAAAC,SAAAC,WAAA,GAAAC,EAGWvG,EAHX,MAAA,mBAAAuG,EAAAA,EAAAH,GAGWpG,EAHXoG,EAAAA,EAAA3F,MAAA+F,YAAA,WAAA,YAAAJ,EAAA3F,MAAA+F,YAAA,UAAA,KAKO7G,OAAAA,EAAAA,IAAAA,EAAMwG,UALbC,GAAA,IAAA,KAAA,MAAAK,EAAAC,QAAAJ,WAAA,GAAAK,EAQW5G,EARX,MAAA,mBAAA4G,EAAAA,EAAAF,GAQW1G,EARX0G,EAAAG,OAAAC,IAAA,IAAAC,EASanH,EAAMoH,OAAS,GACXpH,EAAAA,EAAMqH,UACVC,EAAA,CAAEC,OAAQ,OAAQC,MAAO,UAAWxH,EAAMc,OAXvD,OAAAqG,IAAAD,EAAAC,MAAAL,EAAAW,UAAAP,EAAAC,IAAAA,GAAAD,EAAAQ,KAAAC,UAAAb,EAAAY,EAAAR,EAAAQ,MAAAR,EAAAI,KAAAM,MAAAd,EAAAQ,EAAAJ,EAAAI,MAAAJ,GAAA,CAAAC,SAAAU,EAAAH,UAAAG,EAAAP,UAAAO,IAAAf,GAAA,QCpMIgB,cAAgBlI,gBAEhBmI,UAAY,IAAcjI,WAAWgI,eAErCE,gBAGDhI,IACGG,MAAAA,EAAiBN,SA4BpB,OA3BHG,EAAMO,GAAKP,EAAMO,IAAMC,iBAEvBC,QAAQwH,UACL9H,IAAM+H,uBAA0B/H,IAAMkE,KAAK,aAC3ClE,IAAMgI,UAAUnI,EAAMO,KAAOJ,IAAMiI,UAAUpI,EAAMO,GAAIP,EAAMqI,UAIhElG,UAAU,KACRhC,IACGqD,WACAtC,OAAOoB,QACNgG,GAASA,EAAMD,SAAWrI,EAAMO,IAAMJ,IAAMoI,YAAYD,EAAM/H,KAElEJ,IAAMgI,UAAUnI,EAAMO,KAAOJ,IAAMqI,aAAaxI,EAAMO,MAIxD8B,aAAa4F,WACe,YAAtBjI,EAAMqI,OAAOI,MAAuBzI,EAAMqI,OAAOK,OAErDvI,IAAMW,OACJX,IAAMgI,UAAUnI,EAAMO,KACtBJ,IAAMgI,UAAUnI,EAAMO,IAAIoI,QAAQ3I,EAAMqI,OAAOK,QAIhDrC,gBAAAyB,cAAcxB,SADjB,CAAAC,YACiC,MAAA,CAAEhG,GAAIP,EAAMO,KAD7CiG,eAEKxG,OAAAA,EAAMwG,aCnCPoC,KAAO,CACXC,EAA+B,GAC/BC,EAAgC,MAGzB,MAAA,IADM,IAAIC,IAAI,IAAIjF,OAAOC,KAAK8E,MAAc/E,OAAOC,KAAK+E,MAC9C7E,OAAO,CAAC+E,EAAK7E,KAC5B,IAAMoC,EAAQsC,EAAS1E,GAIvB,OAHIoC,IAAUuC,EAAU3E,IACtB6E,EAAIC,KAAK,CAAC9E,EAAKoC,IAEVyC,GACN,KAGCE,MAoBDlJ,IACGG,MAAAA,EAAiBN,SACjBwI,EAA8BN,YA0H7B/H,OAzHPA,EAAMO,GAAKP,EAAMO,IAAMC,iBAEvBC,QAAQwH,UACL9H,IAAM+H,uBAA0B/H,IAAMkE,KAAK,aAExClE,IAAMgJ,SAASnJ,EAAMO,KAEzBJ,IAAMiJ,SACJpJ,EAAMqJ,aAAe,IAChBrJ,EAAMc,MACTP,GAAIP,EAAMO,GACV8H,OAAQA,EAAO9H,GACf+I,SAAU,CACRC,IAAK,CAAEC,WAAYxJ,EAAMwJ,WAAYC,SAAUzJ,EAAMyJ,YAGzDzJ,EAAMwJ,WACFrJ,IACGqD,WACAtC,OAAOwI,KAAK/F,GAAKA,EAAE8E,OAASzI,EAAMwJ,YAAYjJ,GACjDP,EAAMyJ,YAIdtH,UAAU,IAAMhC,IAAMoI,YAAYvI,EAAMO,KAGxC8B,aAAa,IACXjD,YAAYkD,QAAQC,IAClB,GAAIvC,EAAMuC,GAAO,CACTC,MAAAA,EAAQD,EAAKE,MAAM,GAAGC,cACtBC,EAAWC,GAAK5C,EAAMuC,GAAMK,GAClCzC,IAAM0C,GAAGL,EAAOxC,EAAMO,GAAIoC,GAC1BR,UAAU,IAAMhC,IAAM2C,IAAIN,EAAOxC,EAAMO,GAAIoC,QAMjDN,aAAc8C,IACZ,GACGnF,EAAMc,OACNX,IAAMW,OACNX,IAAMgI,UAAUE,EAAO9H,KACvBJ,IAAMgJ,SAASnJ,EAAMO,IA2BjBP,OAvBHA,EAAMc,MAAM6I,UAAWxE,MAAAA,OAAvB,EAAuBA,EAAMwE,SAC/Bf,KAAK5I,EAAMc,MAAM6I,OAAQxE,MAAAA,SAAAA,EAAMwE,QAAQrH,QAAQ,CAAA,CAAE6B,EAAKoC,KACpDpG,IAAMyJ,kBAAkB5J,EAAMO,GAAI4D,EAAKoC,EAAO,CAAEsD,UAAU,KAG1D7J,EAAMc,MAAMgJ,SAAU3E,MAAAA,OAAtB,EAAsBA,EAAM2E,QAC9BlB,KAAK5I,EAAMc,MAAMgJ,MAAO3E,MAAAA,SAAAA,EAAM2E,OAAOxH,QAAQ,CAAA,CAAE6B,EAAKoC,KAClDpG,IAAM4J,iBAAiB/J,EAAMO,GAAI4D,EAAKoC,EAAO,CAAEsD,UAAU,KAI3D7J,EAAMc,MAAMkJ,WAAY7E,MAAAA,OAAxB,EAAwBA,EAAM6E,UAC9BhK,EAAMc,MAAMmJ,WAAY9E,MAAAA,SAAAA,EAAM8E,UAE9B9J,IAAM+J,kBACJlK,EAAMO,GACNP,EAAMc,MAAMkJ,QACZhK,EAAMc,MAAMmJ,SAGZjK,EAAMc,MAAM4C,UAAWyB,MAAAA,OAAvB,EAAuBA,EAAMzB,SAC/BvD,IAAMgK,UAAUnK,EAAMO,GAAIP,EAAMc,MAAM4C,OAAQ,CAAEmG,UAAU,IAErD7J,EAAMc,OACZd,EAAMc,OAGTuB,aAAc8C,IACZ,QACoB0C,IAAlB7H,EAAMoK,SACNpK,EAAMoK,UAAYjF,GACjBhF,IAAMgI,UAAUE,EAAO9H,KACvBJ,IAAMgJ,SAASnJ,EAAMO,IAUjBP,OANPG,IAAMyJ,kBACJ5J,EAAMO,GACN,aACAP,EAAMoK,QAAU,UAAY,OAC5B,CAAEP,UAAU,IAEP7J,EAAMoK,SACZpK,EAAMoK,SAGT/H,aAAa4F,UACNjI,EAAM0D,SAEVvD,IAAM+H,uBAA0B/H,IAAMkE,KAAK,aAC5ClE,IAAMgK,UAAUnK,EAAMO,GAAIP,EAAM0D,WAIlCrB,aAAa4F,UACNjI,EAAMqK,cAAiBrK,EAAMqK,aAAa9J,KAE9CJ,IAAM+H,uBAA0B/H,IAAMkE,KAAK,aAE5ClE,IAAMmK,mBAAmB,CACvBjC,OAAQA,EAAO9H,GACfgK,YAAavK,EAAMc,MAAM,kBAE3BX,IAAMqK,gBACJ,CACEnC,OAAQA,EAAO9H,GACfgK,YAAavK,EAAMc,MAAM,gBACzBP,GAAIP,EAAMqK,aAAa9J,IAEzBP,EAAMqK,aAAaI,UAIhBzK,EAAMwG,UC3KTkE,IAGD1K,IACH,MAAMG,EAAiBN,SAiBhBG,OAfPS,QAAQwH,UACL9H,IAAM+H,uBAA0B/H,IAAMkE,KAAK,aAC5ClE,IAAMwK,OAAO3K,EAAMc,SAGrBqB,UAAU,IAAMhC,IAAMwK,OAAO,OAG7BtI,aAAa4F,eACWJ,IAAlB7H,EAAMoK,UAETjK,IAAM+H,uBAA0B/H,IAAMkE,KAAK,aAC5ClE,IAAMwK,OAAO3K,EAAMoK,QAAUpK,EAAMc,MAAQ,SAGtCd,EAAMwG,UCrBToE,IAGD5K,IACGG,MAAAA,EAAiBN,SACjBgL,EAAU,OAsBT7K,OApBPS,QAAQwH,UACL9H,IAAM+H,uBAA0B/H,IAAMkE,KAAK,aAC3ClE,IAAMgJ,SAAS0B,IAAY1K,IAAMiJ,SAAS,IAAKpJ,EAAMc,MAAOP,GAAIsK,MAInE1I,UAAU,IAAMhC,IAAMgJ,SAAS0B,IAAY1K,IAAMoI,YAAYsC,IAG7DxI,aAAa4F,eACWJ,IAAlB7H,EAAMoK,UAETjK,IAAM+H,uBAA0B/H,IAAMkE,KAAK,aAC5ClE,IAAMyJ,kBACJiB,EACA,aACA7K,EAAMoK,QAAU,UAAY,WAIzBpK,EAAMwG,UCvBTsE,QAGD9K,IACGG,MAAAA,EAAiBN,SACjBwI,EAA8BN,YAmB7B/H,OAhBPS,QAAQwH,UACL9H,IAAM+H,uBAA0B/H,IAAMkE,KAAK,aAC5ClE,IAAM4K,WAAW,IAAK/K,EAAMc,MAAOuH,OAAQA,EAAO9H,OAIpD4B,UAAU,IAAMhC,IAAM4K,WAAW,OAGjC1I,aAAa4F,eACWJ,IAAlB7H,EAAMoK,UAETjK,IAAM+H,uBAA0B/H,IAAMkE,KAAK,aAC5ClE,IAAM4K,WAAW/K,EAAMoK,QAAUpK,EAAMc,MAAQ,SAG1Cd,EAAMwG,UCvBTwE,QAWDhL,IACGG,MAAAA,EAAiBN,SACjB,CAACoL,EAASC,GAAcxL,aAAa,MA+BpCM,OARPS,QAAQ,KACAwK,IAAAA,GAtBW,CAACxC,EAAM5H,KACpBb,GAAAA,EAAMmL,OAAQ,OAAO,IAAInL,EAAMmL,OAAOtK,GAC1C,OAAQ4H,GACN,IAAK,aACH,OAAO,IAAI9H,SAASyK,kBAAkBvK,GACxC,IAAK,QACH,OAAO,IAAIF,SAAS0K,aAAaxK,GACnC,IAAK,cACH,OAAO,IAAIF,SAAS2K,mBAAmBzK,GACzC,IAAK,YACH,OAAO,IAAIF,SAAS4K,iBAAiB1K,GACvC,IAAK,aACH,OAAO,IAAIF,SAAS6K,kBAClB3K,GAAW,CAAEM,UAAWhB,IAAMgB,YAElC,QACE,MAAM,IAAIsK,MAAO,yBAAwBhD,KAM7BiD,CAAW1L,EAAMyI,KAAMzI,EAAMa,SAC7CoK,GAAW9K,IAAMwL,WAAWV,EAASjL,EAAM4L,UAC3CV,EAAWD,KAGb9I,UAAU,IAAMhC,IAAM0L,cAAcZ,MAE7BjL,EAAMwG,6CC/CTsF,OAGD9L,IACGG,MAAAA,EAAiBN,SACvBK,IAAI6L,EAAS,KAmBb,OAhBAtL,QAAQwH,UAKE,IAAAxB,EAJRsF,EAAS,IAAIpL,SAASmL,OAAO9L,EAAMa,SAChCmL,UAAUhM,EAAMiM,QAChBC,SACClM,EAAMwG,UACF,IAAI7F,SAASwL,OAAQC,eAArB3F,EAAAC,SAAAC,WAAA,GAAyC3G,OAAAA,EAAAA,IAAAA,EAAMwG,UAA/CC,IACA,MAEL4F,MAAMlM,OAGXgC,UAAU,IAAM4J,EAAO3J,UAGvBC,aAAa,IAAM0J,EAAOC,UAAUhM,EAAMiM,SAE1C,qCCxBIE,MAGDnM,IACGG,MAAAA,EAAiBN,SACvBK,IAAIoM,EAAQ,KAkBZ,OAfA7L,QAAQwH,UACE,IAAAxB,EAAR6F,EAAQ,IAAI3L,SAASwL,MAAMnM,EAAMa,SAC9BmL,UAAUhM,EAAMiM,QAChBG,eAFK3F,EAAAC,OAAAC,WAAA,GAEe3G,OAAAA,EAAAA,IAAAA,EAAMwG,UAFrBC,IAGL4F,MAAMlM,OAGXgC,UAAU,IAAMmK,EAAMlK,UAGtBC,aAAa,IAAMiK,EAAMN,UAAUhM,EAAMiM,SAGzC5J,aAAa,IAAMiK,EAAMF,eAAN,KAAA,IAAAtF,EAAAJ,OAAAC,WAAA,GAAA,OAA0B3G,OAAAA,EAAAA,IAAAA,EAAMwG,UAAhCM,GAAA,KAEnB,ICtBIyF,MAUDvM,IACH,MAAMG,EAAiBN,SAiCvB,OA/BAY,QAAQwH,UACL9H,IAAM+H,uBAA0B/H,IAAMkE,KAAK,aACxCrE,EAAMwM,IACRrM,IAAMsM,UAAUzM,EAAMwM,IAAK,CAACE,EAAOC,KAC7BD,GAAAA,EAAO,MAAMA,EAChBvM,IAAMyM,SAAS5M,EAAMO,KAAOJ,IAAM0M,SAAS7M,EAAMO,GAAIoM,KAGvDxM,IAAMyM,SAAS5M,EAAMO,KACpBJ,IAAM0M,SAAS7M,EAAMO,GAAIP,EAAM2M,MAAO3M,EAAMa,WAIlDsB,UAAU,IAAMhC,IAAMyM,SAAS5M,EAAMO,KAAOJ,IAAM2M,YAAY9M,EAAMO,KAGpE8B,aAAa4F,UACPjI,EAAM2M,OAAS3M,EAAMwM,MAErBxM,EAAMwM,IACRrM,IAAMsM,UAAUzM,EAAMwM,IAAK,CAACE,EAAOC,KAC7BD,GAAAA,EAAO,MAAMA,EAChBvM,IAAMyM,SAAS5M,EAAMO,KAAOJ,IAAM4M,YAAY/M,EAAMO,GAAIoM,KAG3DxM,IAAMW,OACJX,IAAMyM,SAAS5M,EAAMO,KACrBJ,IAAM4M,YAAY/M,EAAMO,GAAIP,EAAM2M,UAIxC"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/events.ts","../../src/styles.ts","../../src/components/MapGL/index.tsx","../../src/components/Source/index.tsx","../../src/components/Layer/index.tsx","../../src/components/Fog/index.tsx","../../src/components/Sky/index.tsx","../../src/components/Terrain/index.tsx","../../src/components/Control/index.tsx","../../src/components/Marker/index.tsx","../../src/components/Popup/index.tsx","../../src/components/Image/index.tsx","../../src/components/Camera/index.tsx"],"sourcesContent":["const mapEvents: string[] = [\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseOver',\n 'onMouseOut',\n 'onMouseMove',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onPreClick',\n 'onClick',\n 'onDblClick',\n 'onContextMenu',\n 'onTouchStart',\n 'onTouchEnd',\n 'onTouchCancel',\n 'onWheel',\n 'onResize',\n 'onRemove',\n 'onTouchMove',\n 'onMoveStart',\n 'onMove',\n 'onMoveEnd',\n 'onDragStart',\n 'onDrag',\n 'onDragEnd',\n 'onZoomStart',\n 'onZoom',\n 'onZoomEnd',\n 'onRotateStart',\n 'onRotate',\n 'onRotatEnd',\n 'onPitchStart',\n 'onPitch',\n 'onPitchEnd',\n 'onBoxZoomStart',\n 'onBoxZoomEnd',\n 'onBoxZoomCancel',\n 'onWebglContextLost',\n 'onWebglContextRestored',\n 'onLoad',\n 'onRender',\n 'onIdle',\n 'onError',\n 'onData',\n 'onStyleData',\n 'onSourceData',\n 'onDataLoading',\n 'onStyleDataLoading',\n 'onSourceDataLoading',\n 'onStyleImageMissing',\n]\n\nconst layerEvents: string[] = [\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseOver',\n 'onMouseOut',\n 'onMouseMove',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onClick',\n 'onDblClick',\n 'onContextMenu',\n 'onTouchStart',\n 'onTouchEnd',\n 'onTouchCancel',\n]\n\nexport { mapEvents, layerEvents }\n","const mapBase = 'mapbox://styles/mapbox'\nconst gitBase = 'https://raw.githubusercontent.com'\n\nexport const vectorStyleList = {\n 'mb:light': `${mapBase}/light-v10`,\n 'mb:dark': `${mapBase}/dark-v10`,\n 'mb:streets': `${mapBase}/streets-v11`,\n 'mb:outdoor': `${mapBase}/outdoors-v11`,\n 'mb:sat': `${mapBase}/satellite-v9`,\n 'mb:sat-streets': `${mapBase}/satellite-streets-v11`,\n 'mb:nav': `${mapBase}/navigation-guidance-day-v4`,\n 'mb:nav-night': `${mapBase}/navigation-guidance-night-v4`,\n\n 'mb:basic': `${mapBase}/cjf4m44iw0uza2spb3q0a7s41`,\n 'mb:monochrome': `${mapBase}/cjv6rzz4j3m4b1fqcchuxclhb`,\n 'mb:leshine': `${mapBase}/cjcunv5ae262f2sm9tfwg8i0w`,\n 'mb:icecream': `${mapBase}/cj7t3i5yj0unt2rmt3y4b5e32`,\n 'mb:cali': `${mapBase}/cjerxnqt3cgvp2rmyuxbeqme7`,\n 'mb:northstar': `${mapBase}/cj44mfrt20f082snokim4ungi`,\n 'mb:mineral': `${mapBase}/cjtep62gq54l21frr1whf27ak`,\n 'mb:moonlight': `${mapBase}/cj3kbeqzo00022smj7akz3o1e`,\n 'mb:frank': `${mapBase}-map-design/ckshxkppe0gge18nz20i0nrwq`,\n 'mb:minimo': `${mapBase}-map-design/cksjc2nsq1bg117pnekb655h1`,\n 'mb:decimal': `${mapBase}-map-design/ck4014y110wt61ctt07egsel6`,\n 'mb:standard': `${mapBase}-map-design/ckr0svm3922ki18qntevm857n`,\n 'mb:blueprint': `${mapBase}-map-design/cks97e1e37nsd17nzg7p0308g`,\n 'mb:bubble': `${mapBase}-map-design/cksysy2nl62zp17quosctdtcc`,\n 'mb:pencil': `${mapBase}-map-design/cks9iema71es417mlrft4go2k`,\n\n 'mb:swiss-ski': `${gitBase}/mapbox/mapbox-gl-swiss-ski-style/master/cij1zoclj002y8rkkdjl69psd.json`,\n 'mb:vintage': `${gitBase}/mapbox/mapbox-gl-vintage-style/master/cif5p01n202nisaktvljx9mv3.json`,\n 'mb:whaam': `${gitBase}/mapbox/mapbox-gl-whaam-style/master/cii8323c8004w0nlvtss3dbm2.json`,\n 'mb:neon': `${gitBase}/NatEvatt/awesome-mapbox-gl-styles/master/styles/Neon/style.json`,\n 'mb:camoflauge': `${gitBase}/jingsam/mapbox-gl-styles/master/Camouflage.json`,\n 'mb:emerald': `${gitBase}/jingsam/mapbox-gl-styles/master/Emerald.json`,\n 'mb:runner': `${gitBase}/jingsam/mapbox-gl-styles/master/Runner.json`,\n 'mb:x-ray': `${gitBase}/jingsam/mapbox-gl-styles/master/X-ray.json`,\n}\n\nexport const rasterStyleList = {\n 'osm:org': [\n 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',\n 'Map © <a href=\"https://www.openstreetmap.org\"><em>OpenStreetMap</em></a>',\n ],\n 'osm:human': [\n 'https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png',\n 'Map © <a href=\"http://hot.openstreetmap.org\"><em>Humanitarian OpenStreetMap Team</em></a>',\n ],\n 'osm:cycle': [\n 'https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png',\n 'Maps © <a href=\"https://www.cyclosm.org\" target=\"_blank\"><em>CyclOSM</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'carto:voyager': [\n 'https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png',\n 'Maps © <a href=\"https://carto.com/attribution\"><em>Carto</em></a>',\n ],\n 'carto:positron': [\n 'https://{s}.basemaps.cartocdn.com/rastertiles/light_all/{z}/{x}/{y}.png',\n 'Maps © <a href=\"https://carto.com/attribution\"><em>Carto</em></a>',\n ],\n 'carto:dark': [\n 'https://{s}.basemaps.cartocdn.com/rastertiles/dark_all/{z}/{x}/{y}.png',\n 'Maps © <a href=\"https://carto.com/attribution\"><em>Carto</em></a>',\n ],\n 'open:topo': [\n 'https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png',\n 'Maps © <a href=\"https://opentopomap.org/credits\"><em>OpenTopoMap</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'stamen:toner': [\n 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner/{z}/{x}/{y}.png',\n 'Maps © <a href=\"https://stamen.com\" target=\"_blank\"><em>Stamen Design</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'stamen:toner-lite': [\n 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.png',\n 'Maps © <a href=\"https://stamen.com\" target=\"_blank\"><em>Stamen Design</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'stamen:watercolor': [\n 'https://stamen-tiles-{s}.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.jpg',\n 'Maps © <a href=\"https://stamen.com\" target=\"_blank\"><em>Stamen Design</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'stamen:terrain': [\n 'https://stamen-tiles-{s}.a.ssl.fastly.net/terrain/{z}/{x}/{y}.jpg',\n 'Maps © <a href=\"https://stamen.com\" target=\"_blank\"><em>Stamen Design</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'tf:cycle': [\n 'https://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}@2x.png?apikey={apikey}',\n 'Maps © <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'tf:trans': [\n 'https://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png?apikey={apikey}',\n 'Maps © <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'tf:trans-dark': [\n 'https://{s}.tile.thunderforest.com/transport-dark/{z}/{x}/{y}.png?apikey={apikey}',\n 'Maps © <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'tf:landscape': [\n 'https://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey={apikey}',\n 'Maps © <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'tf:outdoors': [\n 'https://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png?apikey={apikey}',\n 'Maps © <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'tf:neighbourhood': [\n 'https://{s}.tile.thunderforest.com/neighbourhood/{z}/{x}/{y}.png?apikey={apikey}',\n 'Maps © <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'tf:spinal': [\n 'https://{s}.tile.thunderforest.com/spinal-map/{z}/{x}/{y}.png?apikey={apikey}',\n 'Maps © <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'tf:pioneer': [\n 'https://{s}.tile.thunderforest.com/pioneer/{z}/{x}/{y}.png?apikey={apikey}',\n 'Maps © <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'tf:atlas': [\n 'https://{s}.tile.thunderforest.com/atlas/{z}/{x}/{y}.png?apikey={apikey}',\n 'Maps © <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n 'tf:mobile': [\n 'https://{s}.tile.thunderforest.com/mobile-atlas/{z}/{x}/{y}.png?apikey={apikey}',\n 'Maps © <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data © <a href=\"http://www.openstreetmap.org/copyright\" target=\"_blank\"><em>OpenStreetMap</em></a>',\n ],\n}\n","import {\n createSignal,\n createEffect,\n onMount,\n onCleanup,\n createContext,\n useContext,\n Component,\n useTransition,\n createUniqueId,\n untrack,\n on,\n} from 'solid-js'\nimport { mapEvents } from '../../events'\nimport { vectorStyleList } from '../../styles'\nimport mapboxgl from 'mapbox-gl'\nimport 'mapbox-gl/dist/mapbox-gl.css'\nimport type { MapboxMap, MapboxOptions } from 'mapbox-gl/src/ui/map'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\nimport type { LngLatBounds } from 'mapbox-gl/src/geo/lng_lat_bounds.js'\nimport type { PaddingOptions } from 'mapbox-gl/src/geo/edge_insets.js'\nimport type { JSX } from 'solid-js'\n\nexport type Viewport = {\n id?: string\n center?: LngLatLike\n bounds?: LngLatBounds\n zoom?: number\n pitch?: number\n bearing?: number\n padding?: PaddingOptions\n}\n\nconst MapContext = createContext<MapboxMap>()\n/** Provides the Mapbox Map Object */\nexport const useMap = (): MapboxMap => useContext(MapContext)\n\n/** Creates a new Map Container */\nexport const MapGL: Component<{\n id?: string\n /** Map Container CSS Style */\n style?: JSX.CSSProperties\n /** Map Container CSS Class */\n class?: string\n /** SolidJS Class List for Map Container */\n classList?: {\n [k: string]: boolean | undefined\n }\n /** Current Map View */\n viewport?: Viewport\n /** Mapbox Options\n * @see https://docs.mapbox.com/mapbox-gl-js/api/map/#map-parameters\n */\n options?: MapboxOptions\n /** Type for pan, move and zoom transitions */\n transitionType?: 'flyTo' | 'easeTo' | 'jumpTo'\n /** Event listener for Viewport updates */\n onViewportChange?: (viewport: Viewport) => void\n /** Displays Map Tile Borders */\n showTileBoundaries?: boolean\n /** Displays Wireframe if Terrain is visible */\n showTerrainWireframe?: boolean\n /** Displays Borders if Padding is set */\n showPadding?: boolean\n /** Displays Label Collision Boxes */\n showCollisionBoxes?: boolean\n /** Displays all feature outlines even if normally not drawn by style rules */\n showOverdrawInspector?: boolean\n triggerResize?: boolean\n repaint?: boolean\n /** Mouse Cursor Style */\n cursorStyle?: string\n ref?: HTMLDivElement\n /** Children within the Map Container */\n children?: Element | Element[]\n}> = props => {\n let map: MapboxMap\n let mapRef: HTMLDivElement\n let containerRef: HTMLElement\n props.id = props.id || createUniqueId()\n\n const [mapRoot, setMapRoot] = createSignal<MapboxMap>()\n const [pending, start] = useTransition()\n const [transitionType, setTransitionType] = createSignal('flyTo')\n\n onMount(async () => {\n map = new mapboxgl.Map({\n ...props.options,\n style: vectorStyleList[props.options?.style] ||\n props.options?.style || { version: 8, sources: {}, layers: [] },\n container: mapRef,\n interactive: !!props.onViewportChange,\n bounds: props.viewport?.bounds,\n center: props.viewport?.center,\n zoom: props.viewport?.zoom || null,\n pitch: props.viewport?.pitch || null,\n bearing: props.viewport?.bearing || null,\n fitBoundsOptions: { padding: props.viewport?.padding },\n } as MapboxOptions)\n\n map.container = containerRef\n\n await map.once('styledata')\n setMapRoot(map)\n })\n\n onCleanup(() => map.remove())\n\n // Hook up events\n createEffect(() =>\n mapEvents.forEach(item => {\n if (props[item]) {\n const event = item.slice(2).toLowerCase()\n const callback = e => props[item](e)\n map.on(event, callback)\n onCleanup(() => map.off(event, callback))\n }\n })\n )\n\n // Update debug features\n createEffect(() => (map.showTileBoundaries = props.showTileBoundaries))\n createEffect(() => (map.showTerrainWireframe = props.showTerrainWireframe))\n createEffect(() => (map.showPadding = props.showPadding))\n createEffect(() => (map.showCollisionBoxes = props.showCollisionBoxes))\n createEffect(() => (map.showOverdrawInspector = props.showOverdrawInspector))\n\n createEffect(() => (map.getCanvas().style.cursor = props.cursorStyle))\n createEffect(() => setTransitionType(props.transitionType))\n\n // Update projection\n createEffect(\n on(\n () => props.options?.projection,\n proj => map.setProjection(proj),\n { defer: true }\n )\n )\n\n // Update map style\n createEffect(\n on(\n () => props.options?.style,\n style => {\n const oldStyle = map.getStyle()\n const oldLayers = oldStyle.layers.filter(l => l.id.startsWith('cl-'))\n const oldSources = Object.keys(oldStyle.sources)\n .filter(s => s.startsWith('cl-'))\n .reduce((obj, key) => ({ ...obj, [key]: oldStyle.sources[key] }), {})\n map.setStyle(\n vectorStyleList[style] ||\n style || { version: 8, sources: {}, layers: [] }\n )\n map.once('styledata', () => {\n const newStyle = map.getStyle()\n map.setStyle({\n ...newStyle,\n sources: { ...newStyle.sources, ...oldSources },\n layers: [...newStyle.layers, ...oldLayers],\n })\n })\n },\n { defer: true }\n )\n )\n\n // Hook up viewport events\n createEffect(() => {\n const viewport = {\n id: null,\n center: map.getCenter(),\n zoom: map.getZoom(),\n pitch: map.getPitch(),\n bearing: map.getBearing(),\n padding: props.viewport?.padding,\n bounds: props.viewport?.bounds,\n }\n\n const callMove = event => {\n if (event.originalEvent)\n props.onViewportChange &&\n props.onViewportChange({ ...viewport, id: props.id })\n setTransitionType('jumpTo')\n }\n\n const callEnd = event => {\n if (event.originalEvent)\n props.onViewportChange && props.onViewportChange(viewport)\n setTransitionType(props.transitionType)\n }\n\n map.on('move', callMove).on('moveend', callEnd)\n onCleanup(() => map.off('move', callMove).off('moveend', callEnd))\n })\n\n // Update boundaries\n createEffect(prev => {\n if (props.viewport?.bounds != prev)\n props.onViewportChange({\n ...props.viewport,\n ...map.cameraForBounds(props.viewport?.bounds, {\n padding: props.viewport?.padding,\n }),\n })\n return props.viewport?.bounds\n }, props.viewport?.bounds)\n\n // Update Viewport\n createEffect(() => {\n if (props.id === props.viewport?.id) return\n const viewport = {\n ...props.viewport,\n padding: props.viewport?.padding || 0,\n }\n switch (untrack(transitionType)) {\n case 'easeTo':\n map.stop().easeTo(viewport)\n case 'jumpTo':\n map.stop().jumpTo(viewport)\n default:\n map.stop().flyTo(viewport)\n }\n })\n\n let index = 0\n\n createEffect(() => {\n if (props.triggerResize) {\n index = 0\n window.requestAnimationFrame(function loop() {\n if (index < 15) {\n index++\n window.requestAnimationFrame(loop)\n start(() => map.resize())\n }\n })\n }\n })\n\n return (\n <MapContext.Provider value={mapRoot}>\n <section\n ref={containerRef}\n style={{ position: 'absolute', 'z-index': 1 }}>\n {props.children || null}\n </section>\n <div\n ref={mapRef}\n class={props.class || null}\n classList={props.classList || null}\n style={{ height: '100%', width: '100%', ...props.style }}\n />\n </MapContext.Provider>\n )\n}\n","import {\n onCleanup,\n createEffect,\n Component,\n createContext,\n useContext,\n createUniqueId,\n} from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { SourceSpecification } from 'mapbox-gl/src/style-spec/types.js'\nimport { rasterStyleList } from '../../styles'\n\nconst SourceContext = createContext<string>()\nexport const useSourceId = (): string => useContext(SourceContext)\n\nexport const Source: Component<{\n /** @optional Source ID for referencing non nexted Layers */\n id?: string\n /** @see https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/ */\n source: SourceSpecification\n children?: any\n}> = props => {\n const map: MapboxMap = useMap()\n props.id = props.id || createUniqueId()\n\n const lookup = url =>\n rasterStyleList[url]\n ? {\n ...props.source,\n url: '',\n tiles: [\n rasterStyleList[url][0].replace('{apikey}', props.source.apikey),\n ],\n attribution: rasterStyleList[url][1],\n }\n : props.source\n\n // Add Source\n createEffect(() => {\n if (!map()) return\n const source = lookup(props.source.url)\n source.tiles &&\n (source.tiles = ['a', 'b', 'c'].map(i =>\n source.tiles[0].replace('{s}', i)\n ))\n !map().getSource(props.id) && map().addSource(props.id, source)\n })\n\n // Remove Source\n onCleanup(() => {\n map()\n .getStyle()\n .layers.forEach(\n layer => layer.source === props.id && map().removeLayer(layer.id)\n )\n map().getSource(props.id) && map().removeSource(props.id)\n })\n\n // Update\n createEffect(() => {\n if (!map()) return\n const source = map().getSource(props.id)\n if (!source) return\n\n // Update GeoJSON Data\n if (props.source.type === 'geojson' && props.source.data)\n source.setData(props.source.data)\n\n // Update Image URL\n if (\n props.source.type === 'image' &&\n (props.source.url || props.source.coordinates)\n )\n source.updateImage(props.source.url, props.source.coordinates)\n\n // Update Vector URL or Tiles\n if (\n props.source.type === 'vector' &&\n (props.source.url || props.source.tiles)\n )\n props.source.url\n ? source.setUrl(props.source.url)\n : source.setTiles(props.source.tiles)\n\n // Update Raster URL or Tiles\n if (\n props.source.type === 'raster' &&\n (props.source.url || props.source.tiles)\n ) {\n const src = lookup(props.source.url)\n src.tiles &&\n (src.tiles = ['a', 'b', 'c'].map(i => src.tiles[0].replace('{s}', i)))\n source._tileJSONRequest?.cancel()\n source.url = src.url\n source.scheme = src.scheme\n source._options = { ...source._options, ...src }\n map().style._sourceCaches[`other:${props.id}`]?.clearTiles()\n source.load()\n }\n })\n\n return (\n <SourceContext.Provider value={props.id}>\n {props.children}\n </SourceContext.Provider>\n )\n}\n","import { onCleanup, createEffect, Component, createUniqueId } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport { useSourceId } from '../Source'\nimport { layerEvents } from '../../events'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n FilterSpecification,\n StyleSpecification,\n} from 'mapbox-gl/src/style-spec/types.js'\nimport type { CustomLayerInterface } from 'mapbox-gl/src/style/style_layer/custom_style_layer'\n\nconst diff = (\n newProps: StyleSpecification = {},\n prevProps: StyleSpecification = {}\n) => {\n const keys = new Set([...Object.keys(newProps), ...Object.keys(prevProps)])\n return [...keys].reduce((acc, key: string) => {\n const value = newProps[key]\n if (value !== prevProps[key]) {\n acc.push([key, value])\n }\n return acc\n }, [])\n}\n\nexport const Layer: Component<{\n id?: string\n style?: StyleSpecification\n customLayer?: CustomLayerInterface\n filter?: FilterSpecification\n visible?: boolean\n sourceId?: string\n beforeType?:\n | 'background'\n | 'fill'\n | 'line'\n | 'symbol'\n | 'raster'\n | 'circle'\n | 'fill-extrusion'\n | 'heatmap'\n | 'hillshade'\n | 'sky'\n beforeId?: string\n featureState?: { id: number | string; state: object }\n children?: any\n}> = props => {\n const map: MapboxMap = useMap()\n const sourceId: string = useSourceId()\n props.id = props.id || createUniqueId()\n\n // Add Layer\n createEffect(() => {\n if (!map()) return\n !map().getLayer(props.id) &&\n map().addLayer(\n props.customLayer || {\n ...props.style,\n id: props.id,\n source: sourceId,\n metadata: {\n smg: { beforeType: props.beforeType, beforeId: props.beforeId },\n },\n },\n props.beforeType\n ? map()\n ?.getStyle()\n .layers.find(l => l.type === props.beforeType).id\n : props.beforeId\n )\n })\n\n //Remove Layer\n onCleanup(() => map().removeLayer(props.id))\n\n // Hook up events\n createEffect(() =>\n layerEvents.forEach(item => {\n if (props[item]) {\n const event = item.slice(2).toLowerCase()\n const callback = e => props[item](e)\n map()?.on(event, props.id, callback)\n onCleanup(() => map()?.off(event, props.id, callback))\n }\n })\n )\n\n // Update Style\n createEffect((prev: StyleSpecification) => {\n if (!map()) return\n if (\n !props.style ||\n !map().style ||\n !map().getSource(sourceId) ||\n !map().getLayer(props.id)\n )\n return\n\n if (props.style.layout !== prev?.layout)\n diff(props.style.layout, prev?.layout).forEach(([key, value]) =>\n map().setLayoutProperty(props.id, key, value, { validate: false })\n )\n\n if (props.style.paint !== prev?.paint)\n diff(props.style.paint, prev?.paint).forEach(([key, value]) =>\n map().setPaintProperty(props.id, key, value, { validate: false })\n )\n\n if (\n props.style.minzoom !== prev?.minzoom ||\n props.style.maxzoom !== prev?.maxzoom\n )\n map().setLayerZoomRange(\n props.id,\n props.style.minzoom,\n props.style.maxzoom\n )\n\n if (props.style.filter !== prev?.filter)\n map().setFilter(props.id, props.style.filter, { validate: false })\n\n return props.style\n }, props.style)\n\n // Update Visibility\n createEffect((prev: boolean) => {\n if (\n props.visible === undefined ||\n props.visible === prev ||\n !map().getSource(sourceId) ||\n !map().getLayer(props.id)\n )\n return\n\n map().setLayoutProperty(\n props.id,\n 'visibility',\n props.visible ? 'visible' : 'none',\n { validate: false }\n )\n return props.visible\n }, props.visible)\n\n // Update Filter\n createEffect(async () => {\n if (!props.filter) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFilter(props.id, props.filter)\n })\n\n // Update Feature State\n createEffect(async () => {\n if (!props.featureState || !props.featureState.id) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n\n map().removeFeatureState({\n source: sourceId,\n sourceLayer: props.style['source-layer'],\n })\n map().setFeatureState(\n {\n source: sourceId,\n sourceLayer: props.style['source-layer'],\n id: props.featureState.id,\n },\n props.featureState.state\n )\n })\n\n return props.children\n}\n","import { onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { FogSpecification } from 'mapbox-gl/src/style-spec/types.js'\n\nexport const Fog: Component<{\n style: FogSpecification\n visible?: boolean\n children?: any\n}> = props => {\n const map: MapboxMap = useMap()\n // Add Fog Layer\n createEffect(() => {\n if (!map()) return\n map().setFog(props.style)\n })\n\n // Remove Fog Layer\n onCleanup(() => map().setFog(null))\n\n // Update Visibility\n createEffect(() => {\n if (!map()) return\n props.visible !== undefined &&\n map().setFog(props.visible ? props.style : null)\n })\n\n return props.children\n}\n","import { onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { StyleSpecification } from 'mapbox-gl/src/style-spec/types.js'\n\nexport const Sky: Component<{\n style: StyleSpecification\n visible?: boolean\n children?: any\n}> = props => {\n const map: MapboxMap = useMap()\n const layerId = '_sky'\n\n // Add Sky Layer\n createEffect(() => {\n if (!map()) return\n map().getLayer(layerId) && map().addLayer({ ...props.style, id: layerId })\n })\n\n // Remove Sky Layer\n onCleanup(() => map().getLayer(layerId) && map().removeLayer(layerId))\n\n // Update Visibility\n createEffect(() => {\n if (!map()) return\n props.visible !== undefined &&\n map().setLayoutProperty(\n layerId,\n 'visibility',\n props.visible ? 'visible' : 'none'\n )\n })\n\n return props.children\n}\n","import { onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport { useSourceId } from '../Source'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n TerrainSpecification,\n SourceSpecification,\n} from 'mapbox-gl/src/style-spec/types.js'\n\nexport const Terrain: Component<{\n style: TerrainSpecification\n visible?: boolean\n children?: any\n}> = props => {\n const map: MapboxMap = useMap()\n const sourceId: SourceSpecification = useSourceId()\n\n // Add Terrain Layer\n createEffect(() => {\n if (!map()) return\n map().setTerrain({ ...props.style, source: sourceId })\n })\n\n // Remove Terrain Layer\n onCleanup(() => map().setTerrain(null))\n\n // Update Visibility\n createEffect(() => {\n if (!map()) return\n props.visible !== undefined &&\n map().setTerrain(props.visible ? props.style : null)\n })\n\n return props.children\n}\n","import { createEffect, onCleanup, createSignal, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { Options as AttributionOptions } from 'mapbox-gl/src/ui/control/attribution_control'\nimport type { Options as FullscreenOptions } from 'mapbox-gl/src/ui/control/fullscreen_control'\nimport type { Options as GeolocateOptions } from 'mapbox-gl/src/ui/control/geolocate_control'\nimport type { Options as NavigationOptions } from 'mapbox-gl/src/ui/control/navigation_control'\nimport type { Options as ScaleOptions } from 'mapbox-gl/src/ui/control/scale_control'\n\nexport const Control: Component<{\n type: 'navigation' | 'scale' | 'attribution' | 'fullscreen' | 'geolocate'\n options?:\n | NavigationOptions\n | ScaleOptions\n | AttributionOptions\n | FullscreenOptions\n | GeolocateOptions\n | object\n custom?: any\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n children?: any\n}> = props => {\n const map: MapboxMap = useMap()\n const [control, setControl] = createSignal(null)\n\n const getControl = (type, options) => {\n if (props.custom) return new props.custom(options)\n switch (type) {\n case 'navigation':\n return new mapboxgl.NavigationControl(options)\n case 'scale':\n return new mapboxgl.ScaleControl(options)\n case 'attribution':\n return new mapboxgl.AttributionControl(options)\n case 'geolocate':\n return new mapboxgl.GeolocateControl(options)\n case 'fullscreen':\n return new mapboxgl.FullscreenControl()\n // options || { container: map().container }\n default:\n throw new Error(`Unknown control type: ${type}`)\n }\n }\n\n // Add Control\n createEffect(() => {\n if (!map()) return\n const control = getControl(props.type, props.options)\n control && map()?.addControl(control, props.position)\n setControl(control)\n })\n\n onCleanup(() => map().removeControl(control()))\n\n return props.children\n}\n","import { onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { MarkerSpecification } from 'mapbox-gl/src/style-spec/types.js'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\n\nexport const Marker: Component<{\n options?: MarkerSpecification\n lnglat: LngLatLike\n children?: any\n}> = props => {\n const map: MapboxMap = useMap()\n let marker = null\n\n // Add Marker\n createEffect(() => {\n if (!map()) return\n marker = new mapboxgl.Marker(props.options)\n .setLngLat(props.lnglat)\n .setPopup(\n props.children\n ? new mapboxgl.Popup().setDOMContent(<div>{props.children}</div>)\n : null\n )\n .addTo(map())\n })\n // Remove Marker\n onCleanup(() => marker.remove())\n\n // Update Position\n createEffect(() => marker && marker.setLngLat(props.lnglat))\n\n return <></>\n}\n","import { onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { PopupSpecification } from 'mapbox-gl/src/style-spec/types.js'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\n\nexport const Popup: Component<{\n options?: PopupSpecification\n lnglat: LngLatLike\n children?: any\n}> = props => {\n const map: MapboxMap = useMap()\n let popup = null\n\n // Add Popup\n createEffect(() => {\n if (!map()) return\n popup = new mapboxgl.Popup(props.options)\n .setLngLat(props.lnglat)\n .setDOMContent(<div>{props.children}</div>)\n .addTo(map())\n })\n\n // Remove Popup\n onCleanup(() => popup.remove())\n\n // Update Position\n createEffect(() => popup && popup.setLngLat(props.lnglat))\n\n // Update Content\n createEffect(() => popup && popup.setDOMContent(<div>{props.children}</div>))\n\n return <></>\n}\n","import { onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n StyleImageInterface,\n StyleImageMetadata,\n} from 'mapbox-gl/src/style/style_image'\n\nexport const Image: Component<{\n id: string\n url?: string\n image?:\n | HTMLImageElement\n | ImageBitmap\n | ImageData\n | { width: number; height: number; data: Uint8Array | Uint8ClampedArray }\n | StyleImageInterface\n options?: StyleImageMetadata\n}> = props => {\n const map: MapboxMap = useMap()\n // Add Image\n createEffect(() => {\n if (!map()) return\n if (props.url) {\n map().loadImage(\n props.url,\n (_, image) =>\n !map().hasImage(props.id) && map().addImage(props.id, image)\n )\n } else {\n !map().hasImage(props.id) &&\n map().addImage(props.id, props.image, props.options)\n }\n })\n\n // Remove Image\n onCleanup(() => map().hasImage(props.id) && map().removeImage(props.id))\n\n // Update Image\n createEffect(async () => {\n if (!map()) return\n if (props.image && props.url) return\n\n if (props.url) {\n map().loadImage(props.url, (error, image) => {\n if (error) throw error\n !map().hasImage(props.id) && map().updateImage(props.id, image)\n })\n } else {\n map().style &&\n map().hasImage(props.id) &&\n map().updateImage(props.id, props.image)\n }\n })\n\n return <></>\n}\n","import { createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type LngLatLike from 'mapbox-gl/src/geo/lng_lat.js'\nimport { MercatorCoordinate } from 'mapbox-gl'\n\n// linearly interpolate between two positions [x,y,z] based on time\nconst lerp = (a, b, t) => a.map((_, idx) => (1.0 - t) * a[idx] + t * b[idx])\n\n// sphericaly interpolate between two positions [x,y,z] based on time\nconst slerp = (a, b, t) => {\n const omega = 0.075\n // TODO: Proper Calculation\n // a.map((_, idx) => a[idx] * b[idx]).reduce((m, n) => m + n)\n\n return a.map(\n (_, idx) =>\n (Math.sin((1 - t) * omega) / Math.sin(omega)) * a[idx] +\n (Math.sin(t * omega) / Math.sin(omega)) * b[idx]\n )\n}\n\n// calculations from: https://easings.net\nconst easeQuad = {\n in: (x: number): number => x * x,\n out: (x: number): number => 1 - (1 - x) * (1 - x),\n inOut: (x: number): number =>\n x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2,\n}\n\nexport const Camera: Component<{\n animate: boolean\n translate?: {\n type?: 'line' | 'sphere'\n start: [number, number, number]\n end: [number, number, number]\n target: LngLatLike\n targetEnd?: LngLatLike\n easing?: 'in' | 'out' | 'inOut'\n loop?: boolean\n duration: number\n }\n}> = props => {\n const map: MapboxMap = useMap()\n let animationTime = 0.1\n let isReverse = false\n\n const updateCameraPosition = ([lng, lat, alt], target) => {\n const camera = map().getFreeCameraOptions()\n camera.position = MercatorCoordinate.fromLngLat([lng, lat], alt)\n camera.lookAtPoint(target)\n map().setFreeCameraOptions(camera)\n }\n\n const frame = (time: number) => {\n props.animate && window.requestAnimationFrame(frame)\n const params = [\n props.translate.start,\n props.translate.end,\n props.translate.easing\n ? easeQuad[props.translate.easing](animationTime)\n : animationTime,\n ] as const\n const position =\n props.translate.type === 'line' ? lerp(...params) : slerp(...params)\n\n updateCameraPosition(position, props.translate.target)\n\n if (!props.translate.loop && (animationTime > 1.0 || animationTime < 0.0))\n isReverse = !isReverse\n animationTime = isReverse ? animationTime - 0.001 : animationTime + 0.001\n }\n\n createEffect(async () => {\n props.animate && window.requestAnimationFrame(frame)\n })\n\n return props.children\n}\n"],"names":["mapEvents","layerEvents","mapBase","gitBase","vectorStyleList","mb:light","mb:dark","mb:streets","mb:outdoor","mb:sat","mb:sat-streets","mb:nav","mb:nav-night","mb:basic","mb:monochrome","mb:leshine","mb:icecream","mb:cali","mb:northstar","mb:mineral","mb:moonlight","mb:frank","mb:minimo","mb:decimal","mb:standard","mb:blueprint","mb:bubble","mb:pencil","mb:swiss-ski","mb:vintage","mb:whaam","mb:neon","mb:camoflauge","mb:emerald","mb:runner","mb:x-ray","rasterStyleList","osm:org","osm:human","osm:cycle","carto:voyager","carto:positron","carto:dark","open:topo","stamen:toner","stamen:toner-lite","stamen:watercolor","stamen:terrain","tf:cycle","tf:trans","tf:trans-dark","tf:landscape","tf:outdoors","tf:neighbourhood","tf:spinal","tf:pioneer","tf:atlas","tf:mobile","MapContext","createContext","useMap","useContext","MapGL","props","_props$viewport13","let","map","mapRef","containerRef","id","createUniqueId","mapRoot","setMapRoot","createSignal","start","useTransition","transitionType","setTransitionType","onMount","async","_props$viewport6","mapboxgl","Map","options","style","_props$options","_props$options2","version","sources","layers","container","interactive","onViewportChange","bounds","viewport","_props$viewport","center","_props$viewport2","zoom","pitch","bearing","fitBoundsOptions","padding","once","onCleanup","remove","createEffect","forEach","item","event","slice","toLowerCase","callback","e","on","off","showTileBoundaries","showTerrainWireframe","showPadding","showCollisionBoxes","showOverdrawInspector","getCanvas","cursor","cursorStyle","_props$options3","projection","proj","setProjection","defer","_props$options4","oldStyle","getStyle","oldLayers","filter","l","startsWith","oldSources","Object","keys","s","reduce","obj","key","setStyle","newStyle","_props$viewport8","getCenter","getZoom","getPitch","getBearing","_props$viewport7","callMove","originalEvent","callEnd","prev","_props$viewport12","_props$viewport9","cameraForBounds","_props$viewport10","_props$viewport11","_props$viewport15","_props$viewport14","untrack","stop","easeTo","jumpTo","flyTo","index","triggerResize","window","requestAnimationFrame","loop","resize","_$createComponent","Provider","value","children","_el$","_tmpl$","cloneNode","_ref$","setProperty","_$insert","_el$2","_tmpl$2","_ref$2","_$effect","_p$","_v$","class","_v$2","classList","_v$3","height","width","_$className","_$classList","_$style","undefined","SourceContext","useSourceId","Source","lookup","url","source","tiles","replace","apikey","attribution","i","getSource","addSource","layer","removeLayer","removeSource","type","data","setData","coordinates","updateImage","setUrl","setTiles","_map$style$_sourceCac","src","_source$_tileJSONRequ","_tileJSONRequest","cancel","scheme","_options","_sourceCaches","clearTiles","load","diff","newProps","prevProps","Set","acc","push","Layer","sourceId","_map","getLayer","addLayer","customLayer","metadata","smg","beforeType","beforeId","find","_map2","_map3","layout","setLayoutProperty","validate","paint","setPaintProperty","minzoom","maxzoom","setLayerZoomRange","setFilter","visible","isStyleLoaded","featureState","removeFeatureState","sourceLayer","setFeatureState","state","Fog","setFog","Sky","layerId","Terrain","setTerrain","Control","control","setControl","custom","NavigationControl","ScaleControl","AttributionControl","GeolocateControl","FullscreenControl","Error","getControl","addControl","position","removeControl","Marker","marker","setLngLat","lnglat","setPopup","Popup","setDOMContent","addTo","popup","Image","loadImage","_","image","hasImage","addImage","removeImage","error","lerp","a","b","t","idx","slerp","Math","sin","easeQuad","in","x","out","inOut","pow","Camera","animationTime","isReverse","frame","time","animate","params","translate","end","easing","updateCameraPosition","lng","lat","alt","target","camera","getFreeCameraOptions","MercatorCoordinate","fromLngLat","lookAtPoint","setFreeCameraOptions"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Component } from 'solid-js';
|
|
2
|
+
import type LngLatLike from 'mapbox-gl/src/geo/lng_lat.js';
|
|
3
|
+
export declare const Camera: Component<{
|
|
4
|
+
animate: boolean;
|
|
5
|
+
translate?: {
|
|
6
|
+
type?: 'line' | 'sphere';
|
|
7
|
+
start: [number, number, number];
|
|
8
|
+
end: [number, number, number];
|
|
9
|
+
target: LngLatLike;
|
|
10
|
+
targetEnd?: LngLatLike;
|
|
11
|
+
easing?: 'in' | 'out' | 'inOut';
|
|
12
|
+
loop?: boolean;
|
|
13
|
+
duration: number;
|
|
14
|
+
};
|
|
15
|
+
}>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createEffect } from 'solid-js';
|
|
2
|
+
import { useMap } from '../MapGL';
|
|
3
|
+
import { MercatorCoordinate } from 'mapbox-gl';
|
|
4
|
+
// linearly interpolate between two positions [x,y,z] based on time
|
|
5
|
+
const lerp = (a, b, t) => a.map((_, idx) => (1.0 - t) * a[idx] + t * b[idx]);
|
|
6
|
+
// sphericaly interpolate between two positions [x,y,z] based on time
|
|
7
|
+
const slerp = (a, b, t) => {
|
|
8
|
+
const omega = 0.075;
|
|
9
|
+
// TODO: Proper Calculation
|
|
10
|
+
// a.map((_, idx) => a[idx] * b[idx]).reduce((m, n) => m + n)
|
|
11
|
+
return a.map((_, idx) => (Math.sin((1 - t) * omega) / Math.sin(omega)) * a[idx] +
|
|
12
|
+
(Math.sin(t * omega) / Math.sin(omega)) * b[idx]);
|
|
13
|
+
};
|
|
14
|
+
// calculations from: https://easings.net
|
|
15
|
+
const easeQuad = {
|
|
16
|
+
in: (x) => x * x,
|
|
17
|
+
out: (x) => 1 - (1 - x) * (1 - x),
|
|
18
|
+
inOut: (x) => x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2,
|
|
19
|
+
};
|
|
20
|
+
export const Camera = props => {
|
|
21
|
+
const map = useMap();
|
|
22
|
+
let animationTime = 0.1;
|
|
23
|
+
let isReverse = false;
|
|
24
|
+
const updateCameraPosition = ([lng, lat, alt], target) => {
|
|
25
|
+
const camera = map().getFreeCameraOptions();
|
|
26
|
+
camera.position = MercatorCoordinate.fromLngLat([lng, lat], alt);
|
|
27
|
+
camera.lookAtPoint(target);
|
|
28
|
+
map().setFreeCameraOptions(camera);
|
|
29
|
+
};
|
|
30
|
+
const frame = (time) => {
|
|
31
|
+
props.animate && window.requestAnimationFrame(frame);
|
|
32
|
+
const params = [
|
|
33
|
+
props.translate.start,
|
|
34
|
+
props.translate.end,
|
|
35
|
+
props.translate.easing
|
|
36
|
+
? easeQuad[props.translate.easing](animationTime)
|
|
37
|
+
: animationTime,
|
|
38
|
+
];
|
|
39
|
+
const position = props.translate.type === 'line' ? lerp(...params) : slerp(...params);
|
|
40
|
+
updateCameraPosition(position, props.translate.target);
|
|
41
|
+
if (!props.translate.loop && (animationTime > 1.0 || animationTime < 0.0))
|
|
42
|
+
isReverse = !isReverse;
|
|
43
|
+
animationTime = isReverse ? animationTime - 0.001 : animationTime + 0.001;
|
|
44
|
+
};
|
|
45
|
+
createEffect(async () => {
|
|
46
|
+
props.animate && window.requestAnimationFrame(frame);
|
|
47
|
+
});
|
|
48
|
+
return props.children;
|
|
49
|
+
};
|
|
@@ -4,10 +4,10 @@ import type { Options as FullscreenOptions } from 'mapbox-gl/src/ui/control/full
|
|
|
4
4
|
import type { Options as GeolocateOptions } from 'mapbox-gl/src/ui/control/geolocate_control';
|
|
5
5
|
import type { Options as NavigationOptions } from 'mapbox-gl/src/ui/control/navigation_control';
|
|
6
6
|
import type { Options as ScaleOptions } from 'mapbox-gl/src/ui/control/scale_control';
|
|
7
|
-
declare const Control: Component<{
|
|
7
|
+
export declare const Control: Component<{
|
|
8
8
|
type: 'navigation' | 'scale' | 'attribution' | 'fullscreen' | 'geolocate';
|
|
9
9
|
options?: NavigationOptions | ScaleOptions | AttributionOptions | FullscreenOptions | GeolocateOptions | object;
|
|
10
10
|
custom?: any;
|
|
11
11
|
position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
12
|
+
children?: any;
|
|
12
13
|
}>;
|
|
13
|
-
export default Control;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createEffect, onCleanup, createSignal } from 'solid-js';
|
|
2
2
|
import { useMap } from '../MapGL';
|
|
3
3
|
import mapboxgl from 'mapbox-gl';
|
|
4
|
-
const Control = props => {
|
|
4
|
+
export const Control = props => {
|
|
5
5
|
const map = useMap();
|
|
6
6
|
const [control, setControl] = createSignal(null);
|
|
7
7
|
const getControl = (type, options) => {
|
|
@@ -17,18 +17,20 @@ const Control = props => {
|
|
|
17
17
|
case 'geolocate':
|
|
18
18
|
return new mapboxgl.GeolocateControl(options);
|
|
19
19
|
case 'fullscreen':
|
|
20
|
-
return new mapboxgl.FullscreenControl(
|
|
20
|
+
return new mapboxgl.FullscreenControl();
|
|
21
|
+
// options || { container: map().container }
|
|
21
22
|
default:
|
|
22
23
|
throw new Error(`Unknown control type: ${type}`);
|
|
23
24
|
}
|
|
24
25
|
};
|
|
25
26
|
// Add Control
|
|
26
|
-
|
|
27
|
+
createEffect(() => {
|
|
28
|
+
if (!map())
|
|
29
|
+
return;
|
|
27
30
|
const control = getControl(props.type, props.options);
|
|
28
|
-
control && map()
|
|
31
|
+
control && map()?.addControl(control, props.position);
|
|
29
32
|
setControl(control);
|
|
30
33
|
});
|
|
31
34
|
onCleanup(() => map().removeControl(control()));
|
|
32
35
|
return props.children;
|
|
33
36
|
};
|
|
34
|
-
export default Control;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Component } from 'solid-js';
|
|
2
2
|
import type { FogSpecification } from 'mapbox-gl/src/style-spec/types.js';
|
|
3
|
-
declare const Fog: Component<{
|
|
3
|
+
export declare const Fog: Component<{
|
|
4
4
|
style: FogSpecification;
|
|
5
5
|
visible?: boolean;
|
|
6
|
+
children?: any;
|
|
6
7
|
}>;
|
|
7
|
-
export default Fog;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { onCleanup, createEffect } from 'solid-js';
|
|
2
|
+
import { useMap } from '../MapGL';
|
|
3
|
+
export const Fog = props => {
|
|
4
|
+
const map = useMap();
|
|
5
|
+
// Add Fog Layer
|
|
6
|
+
createEffect(() => {
|
|
7
|
+
if (!map())
|
|
8
|
+
return;
|
|
9
|
+
map().setFog(props.style);
|
|
10
|
+
});
|
|
11
|
+
// Remove Fog Layer
|
|
12
|
+
onCleanup(() => map().setFog(null));
|
|
13
|
+
// Update Visibility
|
|
14
|
+
createEffect(() => {
|
|
15
|
+
if (!map())
|
|
16
|
+
return;
|
|
17
|
+
props.visible !== undefined &&
|
|
18
|
+
map().setFog(props.visible ? props.style : null);
|
|
19
|
+
});
|
|
20
|
+
return props.children;
|
|
21
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Component } from 'solid-js';
|
|
2
2
|
import type { StyleImageInterface, StyleImageMetadata } from 'mapbox-gl/src/style/style_image';
|
|
3
|
-
declare const Image: Component<{
|
|
3
|
+
export declare const Image: Component<{
|
|
4
4
|
id: string;
|
|
5
5
|
url?: string;
|
|
6
6
|
image?: HTMLImageElement | ImageBitmap | ImageData | {
|
|
@@ -10,4 +10,3 @@ declare const Image: Component<{
|
|
|
10
10
|
} | StyleImageInterface;
|
|
11
11
|
options?: StyleImageMetadata;
|
|
12
12
|
}>;
|
|
13
|
-
export default Image;
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { onCleanup, createEffect } from 'solid-js';
|
|
2
2
|
import { useMap } from '../MapGL';
|
|
3
|
-
const Image = props => {
|
|
3
|
+
export const Image = props => {
|
|
4
4
|
const map = useMap();
|
|
5
5
|
// Add Image
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
createEffect(() => {
|
|
7
|
+
if (!map())
|
|
8
|
+
return;
|
|
8
9
|
if (props.url) {
|
|
9
|
-
map().loadImage(props.url, (
|
|
10
|
-
if (error)
|
|
11
|
-
throw error;
|
|
12
|
-
!map().hasImage(props.id) && map().addImage(props.id, image);
|
|
13
|
-
});
|
|
10
|
+
map().loadImage(props.url, (_, image) => !map().hasImage(props.id) && map().addImage(props.id, image));
|
|
14
11
|
}
|
|
15
12
|
else {
|
|
16
13
|
!map().hasImage(props.id) &&
|
|
@@ -21,6 +18,8 @@ const Image = props => {
|
|
|
21
18
|
onCleanup(() => map().hasImage(props.id) && map().removeImage(props.id));
|
|
22
19
|
// Update Image
|
|
23
20
|
createEffect(async () => {
|
|
21
|
+
if (!map())
|
|
22
|
+
return;
|
|
24
23
|
if (props.image && props.url)
|
|
25
24
|
return;
|
|
26
25
|
if (props.url) {
|
|
@@ -38,4 +37,3 @@ const Image = props => {
|
|
|
38
37
|
});
|
|
39
38
|
return <></>;
|
|
40
39
|
};
|
|
41
|
-
export default Image;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Component } from 'solid-js';
|
|
2
2
|
import type { FilterSpecification, StyleSpecification } from 'mapbox-gl/src/style-spec/types.js';
|
|
3
3
|
import type { CustomLayerInterface } from 'mapbox-gl/src/style/style_layer/custom_style_layer';
|
|
4
|
-
declare const Layer: Component<{
|
|
4
|
+
export declare const Layer: Component<{
|
|
5
5
|
id?: string;
|
|
6
6
|
style?: StyleSpecification;
|
|
7
7
|
customLayer?: CustomLayerInterface;
|
|
@@ -14,5 +14,5 @@ declare const Layer: Component<{
|
|
|
14
14
|
id: number | string;
|
|
15
15
|
state: object;
|
|
16
16
|
};
|
|
17
|
+
children?: any;
|
|
17
18
|
}>;
|
|
18
|
-
export default Layer;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { onCleanup, createEffect, createUniqueId } from 'solid-js';
|
|
2
2
|
import { useMap } from '../MapGL';
|
|
3
|
-
import {
|
|
3
|
+
import { useSourceId } from '../Source';
|
|
4
4
|
import { layerEvents } from '../../events';
|
|
5
5
|
const diff = (newProps = {}, prevProps = {}) => {
|
|
6
6
|
const keys = new Set([...Object.keys(newProps), ...Object.keys(prevProps)]);
|
|
@@ -12,43 +12,46 @@ const diff = (newProps = {}, prevProps = {}) => {
|
|
|
12
12
|
return acc;
|
|
13
13
|
}, []);
|
|
14
14
|
};
|
|
15
|
-
const Layer = props => {
|
|
15
|
+
export const Layer = props => {
|
|
16
16
|
const map = useMap();
|
|
17
|
-
const
|
|
17
|
+
const sourceId = useSourceId();
|
|
18
18
|
props.id = props.id || createUniqueId();
|
|
19
19
|
// Add Layer
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
if (map().getLayer(props.id))
|
|
20
|
+
createEffect(() => {
|
|
21
|
+
if (!map())
|
|
23
22
|
return;
|
|
24
|
-
map().
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
23
|
+
!map().getLayer(props.id) &&
|
|
24
|
+
map().addLayer(props.customLayer || {
|
|
25
|
+
...props.style,
|
|
26
|
+
id: props.id,
|
|
27
|
+
source: sourceId,
|
|
28
|
+
metadata: {
|
|
29
|
+
smg: { beforeType: props.beforeType, beforeId: props.beforeId },
|
|
30
|
+
},
|
|
31
|
+
}, props.beforeType
|
|
32
|
+
? map()
|
|
33
|
+
?.getStyle()
|
|
34
|
+
.layers.find(l => l.type === props.beforeType).id
|
|
35
|
+
: props.beforeId);
|
|
36
36
|
});
|
|
37
|
+
//Remove Layer
|
|
37
38
|
onCleanup(() => map().removeLayer(props.id));
|
|
38
39
|
// Hook up events
|
|
39
40
|
createEffect(() => layerEvents.forEach(item => {
|
|
40
41
|
if (props[item]) {
|
|
41
42
|
const event = item.slice(2).toLowerCase();
|
|
42
43
|
const callback = e => props[item](e);
|
|
43
|
-
map()
|
|
44
|
-
onCleanup(() => map()
|
|
44
|
+
map()?.on(event, props.id, callback);
|
|
45
|
+
onCleanup(() => map()?.off(event, props.id, callback));
|
|
45
46
|
}
|
|
46
47
|
}));
|
|
47
48
|
// Update Style
|
|
48
49
|
createEffect((prev) => {
|
|
50
|
+
if (!map())
|
|
51
|
+
return;
|
|
49
52
|
if (!props.style ||
|
|
50
53
|
!map().style ||
|
|
51
|
-
!map().getSource(
|
|
54
|
+
!map().getSource(sourceId) ||
|
|
52
55
|
!map().getLayer(props.id))
|
|
53
56
|
return;
|
|
54
57
|
if (props.style.layout !== prev?.layout)
|
|
@@ -66,7 +69,7 @@ const Layer = props => {
|
|
|
66
69
|
createEffect((prev) => {
|
|
67
70
|
if (props.visible === undefined ||
|
|
68
71
|
props.visible === prev ||
|
|
69
|
-
!map().getSource(
|
|
72
|
+
!map().getSource(sourceId) ||
|
|
70
73
|
!map().getLayer(props.id))
|
|
71
74
|
return;
|
|
72
75
|
map().setLayoutProperty(props.id, 'visibility', props.visible ? 'visible' : 'none', { validate: false });
|
|
@@ -85,15 +88,14 @@ const Layer = props => {
|
|
|
85
88
|
return;
|
|
86
89
|
!map().isStyleLoaded() && (await map().once('styledata'));
|
|
87
90
|
map().removeFeatureState({
|
|
88
|
-
source:
|
|
91
|
+
source: sourceId,
|
|
89
92
|
sourceLayer: props.style['source-layer'],
|
|
90
93
|
});
|
|
91
94
|
map().setFeatureState({
|
|
92
|
-
source:
|
|
95
|
+
source: sourceId,
|
|
93
96
|
sourceLayer: props.style['source-layer'],
|
|
94
97
|
id: props.featureState.id,
|
|
95
98
|
}, props.featureState.state);
|
|
96
99
|
});
|
|
97
100
|
return props.children;
|
|
98
101
|
};
|
|
99
|
-
export default Layer;
|
|
@@ -14,27 +14,44 @@ export declare type Viewport = {
|
|
|
14
14
|
bearing?: number;
|
|
15
15
|
padding?: PaddingOptions;
|
|
16
16
|
};
|
|
17
|
-
|
|
18
|
-
declare const
|
|
17
|
+
/** Provides the Mapbox Map Object */
|
|
18
|
+
export declare const useMap: () => MapboxMap;
|
|
19
|
+
/** Creates a new Map Container */
|
|
20
|
+
export declare const MapGL: Component<{
|
|
19
21
|
id?: string;
|
|
22
|
+
/** Map Container CSS Style */
|
|
20
23
|
style?: JSX.CSSProperties;
|
|
24
|
+
/** Map Container CSS Class */
|
|
21
25
|
class?: string;
|
|
26
|
+
/** SolidJS Class List for Map Container */
|
|
22
27
|
classList?: {
|
|
23
28
|
[k: string]: boolean | undefined;
|
|
24
29
|
};
|
|
30
|
+
/** Current Map View */
|
|
25
31
|
viewport?: Viewport;
|
|
32
|
+
/** Mapbox Options
|
|
33
|
+
* @see https://docs.mapbox.com/mapbox-gl-js/api/map/#map-parameters
|
|
34
|
+
*/
|
|
26
35
|
options?: MapboxOptions;
|
|
27
|
-
|
|
28
|
-
triggerResize?: boolean;
|
|
36
|
+
/** Type for pan, move and zoom transitions */
|
|
29
37
|
transitionType?: 'flyTo' | 'easeTo' | 'jumpTo';
|
|
38
|
+
/** Event listener for Viewport updates */
|
|
30
39
|
onViewportChange?: (viewport: Viewport) => void;
|
|
40
|
+
/** Displays Map Tile Borders */
|
|
31
41
|
showTileBoundaries?: boolean;
|
|
42
|
+
/** Displays Wireframe if Terrain is visible */
|
|
32
43
|
showTerrainWireframe?: boolean;
|
|
44
|
+
/** Displays Borders if Padding is set */
|
|
33
45
|
showPadding?: boolean;
|
|
46
|
+
/** Displays Label Collision Boxes */
|
|
34
47
|
showCollisionBoxes?: boolean;
|
|
48
|
+
/** Displays all feature outlines even if normally not drawn by style rules */
|
|
35
49
|
showOverdrawInspector?: boolean;
|
|
50
|
+
triggerResize?: boolean;
|
|
36
51
|
repaint?: boolean;
|
|
52
|
+
/** Mouse Cursor Style */
|
|
37
53
|
cursorStyle?: string;
|
|
38
54
|
ref?: HTMLDivElement;
|
|
55
|
+
/** Children within the Map Container */
|
|
56
|
+
children?: Element | Element[];
|
|
39
57
|
}>;
|
|
40
|
-
export { MapGL as default, useMap };
|