solid-map-gl 1.1.28 → 1.2.2

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.
Files changed (44) hide show
  1. package/README.md +13 -7
  2. package/dist/{esm/styles.css → cjs/index.css} +0 -0
  3. package/dist/cjs/index.js +2 -0
  4. package/dist/cjs/index.js.map +1 -0
  5. package/dist/esm/index.css +1 -0
  6. package/dist/esm/index.js +1 -1
  7. package/dist/esm/index.js.map +1 -1
  8. package/dist/index/components/Camera/index.d.ts +16 -0
  9. package/dist/index/components/Camera/index.jsx +49 -0
  10. package/dist/{types → index}/components/Control/index.d.ts +2 -2
  11. package/dist/{source → index}/components/Control/index.jsx +6 -6
  12. package/dist/{types → index}/components/Fog/index.d.ts +2 -2
  13. package/dist/index/components/Fog/index.jsx +17 -0
  14. package/dist/{types → index}/components/Image/index.d.ts +1 -2
  15. package/dist/{source → index}/components/Image/index.jsx +4 -10
  16. package/dist/{types → index}/components/Layer/index.d.ts +2 -2
  17. package/dist/{source → index}/components/Layer/index.jsx +26 -28
  18. package/dist/{types → index}/components/MapGL/index.d.ts +22 -5
  19. package/dist/index/components/MapGL/index.jsx +149 -0
  20. package/dist/{types → index}/components/Marker/index.d.ts +2 -2
  21. package/dist/{source → index}/components/Marker/index.jsx +4 -5
  22. package/dist/{types → index}/components/Popup/index.d.ts +2 -2
  23. package/dist/{source → index}/components/Popup/index.jsx +5 -6
  24. package/dist/{types → index}/components/Sky/index.d.ts +2 -2
  25. package/dist/index/components/Sky/index.jsx +18 -0
  26. package/dist/index/components/Source/index.d.ts +10 -0
  27. package/dist/index/components/Source/index.jsx +68 -0
  28. package/dist/{types → index}/components/Terrain/index.d.ts +2 -2
  29. package/dist/index/components/Terrain/index.jsx +19 -0
  30. package/dist/{types → index}/events.d.ts +0 -0
  31. package/dist/{source → index}/events.js +0 -0
  32. package/dist/index/index.d.ts +12 -0
  33. package/dist/index/index.jsx +11 -0
  34. package/dist/index/styles.d.ts +56 -0
  35. package/dist/index/styles.js +121 -0
  36. package/package.json +16 -14
  37. package/dist/source/components/Fog/index.jsx +0 -21
  38. package/dist/source/components/MapGL/index.jsx +0 -139
  39. package/dist/source/components/Sky/index.jsx +0 -22
  40. package/dist/source/components/Source/index.jsx +0 -32
  41. package/dist/source/components/Terrain/index.jsx +0 -23
  42. package/dist/source/index.jsx +0 -10
  43. package/dist/types/components/Source/index.d.ts +0 -8
  44. package/dist/types/index.d.ts +0 -11
@@ -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":"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"}
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 &copy; <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 &copy; <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 &copy; <a href=\"https://www.cyclosm.org\" target=\"_blank\"><em>CyclOSM</em></a>, Data &copy; <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 &copy; <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 &copy; <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 &copy; <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 &copy; <a href=\"https://opentopomap.org/credits\"><em>OpenTopoMap</em></a>, Data &copy; <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 &copy; <a href=\"https://stamen.com\" target=\"_blank\"><em>Stamen Design</em></a>, Data &copy; <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 &copy; <a href=\"https://stamen.com\" target=\"_blank\"><em>Stamen Design</em></a>, Data &copy; <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 &copy; <a href=\"https://stamen.com\" target=\"_blank\"><em>Stamen Design</em></a>, Data &copy; <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 &copy; <a href=\"https://stamen.com\" target=\"_blank\"><em>Stamen Design</em></a>, Data &copy; <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 &copy; <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data &copy; <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 &copy; <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data &copy; <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 &copy; <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data &copy; <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 &copy; <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data &copy; <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 &copy; <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data &copy; <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 &copy; <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data &copy; <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 &copy; <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data &copy; <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 &copy; <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data &copy; <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 &copy; <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data &copy; <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 &copy; <a href=\"https://thunderforest.com\" target=\"_blank\"><em>Thunderforest</em></a>, Data &copy; <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(() => {\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 || 'map',\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 map.once('styledata').then(() => setMapRoot(map))\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(() => {\n map.showTileBoundaries = props.showTileBoundaries\n map.showTerrainWireframe = props.showTerrainWireframe\n map.showPadding = props.showPadding\n map.showCollisionBoxes = props.showCollisionBoxes\n map.showOverdrawInspector = props.showOverdrawInspector\n })\n\n // Update cursor\n createEffect(() => (map.getCanvas().style.cursor = props.cursorStyle))\n //Update transition type\n createEffect(() => setTransitionType(props.transitionType))\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(\n (obj, key) => ({ ...obj, [key]: oldStyle.sources[key] }),\n {}\n )\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\n return (\n <MapContext.Provider value={mapRoot}>\n <section\n ref={containerRef}\n style={{ position: 'absolute', 'z-index': 1 }}>\n {mapRoot() ? props.children : null}\n </section>\n <div\n id='map'\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 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 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 !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().getLayer(props.id) && 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(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 map().setFog(props.style)\n })\n\n // Remove Fog Layer\n onCleanup(() => map().setFog(null))\n\n // Update Visibility\n createEffect(() => {\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 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 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 map().setTerrain({ ...props.style, source: sourceId })\n })\n\n // Remove Terrain Layer\n onCleanup(() => map().setTerrain(null))\n\n // Update Visibility\n createEffect(() => {\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 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 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 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 (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 (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 children?: any\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","let","map","mapRef","containerRef","id","createUniqueId","mapRoot","setMapRoot","createSignal","start","useTransition","transitionType","setTransitionType","onMount","_props$viewport13","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","_props$viewport6","once","then","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","async","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,16 @@
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
+ children?: any;
16
+ }>;
@@ -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 { onMount, onCleanup, createSignal } from 'solid-js';
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,18 @@ const Control = props => {
17
17
  case 'geolocate':
18
18
  return new mapboxgl.GeolocateControl(options);
19
19
  case 'fullscreen':
20
- return new mapboxgl.FullscreenControl(options || { container: map().container });
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
- onMount(() => {
27
+ createEffect(() => {
27
28
  const control = getControl(props.type, props.options);
28
- control && map().addControl(control, props.position);
29
+ control && map()?.addControl(control, props.position);
29
30
  setControl(control);
30
31
  });
31
32
  onCleanup(() => map().removeControl(control()));
32
33
  return props.children;
33
34
  };
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,17 @@
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
+ map().setFog(props.style);
8
+ });
9
+ // Remove Fog Layer
10
+ onCleanup(() => map().setFog(null));
11
+ // Update Visibility
12
+ createEffect(() => {
13
+ props.visible !== undefined &&
14
+ map().setFog(props.visible ? props.style : null);
15
+ });
16
+ return props.children;
17
+ };
@@ -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,11 @@
1
- import { onMount, onCleanup, createEffect } from 'solid-js';
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
- onMount(async () => {
7
- !map().isStyleLoaded() && (await map().once('styledata'));
6
+ createEffect(() => {
8
7
  if (props.url) {
9
- map().loadImage(props.url, (error, image) => {
10
- if (error)
11
- throw error;
12
- !map().hasImage(props.id) && map().addImage(props.id, image);
13
- });
8
+ map().loadImage(props.url, (_, image) => !map().hasImage(props.id) && map().addImage(props.id, image));
14
9
  }
15
10
  else {
16
11
  !map().hasImage(props.id) &&
@@ -38,4 +33,3 @@ const Image = props => {
38
33
  });
39
34
  return <></>;
40
35
  };
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 { onMount, onCleanup, createEffect, createUniqueId, } from 'solid-js';
1
+ import { onCleanup, createEffect, createUniqueId } from 'solid-js';
2
2
  import { useMap } from '../MapGL';
3
- import { useSource } from '../Source';
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,42 @@ 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 source = useSource();
17
+ const sourceId = useSourceId();
18
18
  props.id = props.id || createUniqueId();
19
19
  // Add Layer
20
- onMount(async () => {
21
- !map().isStyleLoaded() && (await map().once('styledata'));
22
- if (map().getLayer(props.id))
23
- return;
24
- map().addLayer(props.customLayer || {
25
- ...props.style,
26
- id: props.id,
27
- source: source.id,
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);
20
+ createEffect(() => {
21
+ !map().getLayer(props.id) &&
22
+ map().addLayer(props.customLayer || {
23
+ ...props.style,
24
+ id: props.id,
25
+ source: sourceId,
26
+ metadata: {
27
+ smg: { beforeType: props.beforeType, beforeId: props.beforeId },
28
+ },
29
+ }, props.beforeType
30
+ ? map()
31
+ ?.getStyle()
32
+ .layers.find(l => l.type === props.beforeType).id
33
+ : props.beforeId);
36
34
  });
37
- onCleanup(() => map().removeLayer(props.id));
35
+ //Remove Layer
36
+ onCleanup(() => map().getLayer(props.id) && map().removeLayer(props.id));
38
37
  // Hook up events
39
38
  createEffect(() => layerEvents.forEach(item => {
40
39
  if (props[item]) {
41
40
  const event = item.slice(2).toLowerCase();
42
41
  const callback = e => props[item](e);
43
- map().on(event, props.id, callback);
44
- onCleanup(() => map().off(event, props.id, callback));
42
+ map()?.on(event, props.id, callback);
43
+ onCleanup(() => map()?.off(event, props.id, callback));
45
44
  }
46
45
  }));
47
46
  // Update Style
48
47
  createEffect((prev) => {
49
48
  if (!props.style ||
50
49
  !map().style ||
51
- !map().getSource(source.id) ||
50
+ !map().getSource(sourceId) ||
52
51
  !map().getLayer(props.id))
53
52
  return;
54
53
  if (props.style.layout !== prev?.layout)
@@ -66,7 +65,7 @@ const Layer = props => {
66
65
  createEffect((prev) => {
67
66
  if (props.visible === undefined ||
68
67
  props.visible === prev ||
69
- !map().getSource(source.id) ||
68
+ !map().getSource(sourceId) ||
70
69
  !map().getLayer(props.id))
71
70
  return;
72
71
  map().setLayoutProperty(props.id, 'visibility', props.visible ? 'visible' : 'none', { validate: false });
@@ -85,15 +84,14 @@ const Layer = props => {
85
84
  return;
86
85
  !map().isStyleLoaded() && (await map().once('styledata'));
87
86
  map().removeFeatureState({
88
- source: source.id,
87
+ source: sourceId,
89
88
  sourceLayer: props.style['source-layer'],
90
89
  });
91
90
  map().setFeatureState({
92
- source: source.id,
91
+ source: sourceId,
93
92
  sourceLayer: props.style['source-layer'],
94
93
  id: props.featureState.id,
95
94
  }, props.featureState.state);
96
95
  });
97
96
  return props.children;
98
97
  };
99
- export default Layer;
@@ -14,27 +14,44 @@ export declare type Viewport = {
14
14
  bearing?: number;
15
15
  padding?: PaddingOptions;
16
16
  };
17
- declare const useMap: () => MapboxMap;
18
- declare const MapGL: Component<{
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
- children?: Element | Element[];
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 };