solid-map-gl 1.2.18 → 1.3.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.
package/README.md CHANGED
@@ -13,6 +13,10 @@ layout: landing
13
13
  [start.md](docs/start.md)
14
14
  {% endcontent-ref %}
15
15
 
16
+ {% content-ref url="docs/examples.md" %}
17
+ [examples.md](docs/examples.md)
18
+ {% endcontent-ref %}
19
+
16
20
  ## Code example
17
21
 
18
22
  ```jsx
package/dist/esm/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{effect,className,classList,style,createComponent,memo,insert,template}from"solid-js/web";import{createContext,useContext,createUniqueId,createSignal,useTransition,onMount,onCleanup,createEffect,untrack}from"solid-js";import mapboxgl,{MercatorCoordinate}from"mapbox-gl";const mapEvents=["onMouseDown","onMouseUp","onMouseOver","onMouseOut","onMouseMove","onMouseEnter","onMouseLeave","onPreClick","onClick","onDblClick","onContextMenu","onTouchStart","onTouchEnd","onTouchCancel","onWheel","onResize","onRemove","onTouchMove","onMoveStart","onMove","onMoveEnd","onDragStart","onDrag","onDragEnd","onZoomStart","onZoom","onZoomEnd","onRotateStart","onRotate","onRotatEnd","onPitchStart","onPitch","onPitchEnd","onBoxZoomStart","onBoxZoomEnd","onBoxZoomCancel","onWebglContextLost","onWebglContextRestored","onLoad","onRender","onIdle","onError","onData","onStyleData","onSourceData","onDataLoading","onStyleDataLoading","onSourceDataLoading","onStyleImageMissing"],layerEvents=["onMouseDown","onMouseUp","onMouseOver","onMouseOut","onMouseMove","onMouseEnter","onMouseLeave","onClick","onDblClick","onContextMenu","onTouchStart","onTouchEnd","onTouchCancel"],mapBase="mapbox://styles/mapbox",gitBase="https://raw.githubusercontent.com",vectorStyleList={"mb:light":mapBase+"/light-v10","mb:dark":mapBase+"/dark-v10","mb:streets":mapBase+"/streets-v11","mb:outdoor":mapBase+"/outdoors-v11","mb:sat":mapBase+"/satellite-v9","mb:sat-streets":mapBase+"/satellite-streets-v11","mb:nav":mapBase+"/navigation-guidance-day-v4","mb:nav-night":mapBase+"/navigation-guidance-night-v4","mb:basic":mapBase+"/cjf4m44iw0uza2spb3q0a7s41","mb:monochrome":mapBase+"/cjv6rzz4j3m4b1fqcchuxclhb","mb:leshine":mapBase+"/cjcunv5ae262f2sm9tfwg8i0w","mb:icecream":mapBase+"/cj7t3i5yj0unt2rmt3y4b5e32","mb:cali":mapBase+"/cjerxnqt3cgvp2rmyuxbeqme7","mb:northstar":mapBase+"/cj44mfrt20f082snokim4ungi","mb:mineral":mapBase+"/cjtep62gq54l21frr1whf27ak","mb:moonlight":mapBase+"/cj3kbeqzo00022smj7akz3o1e","mb:frank":mapBase+"-map-design/ckshxkppe0gge18nz20i0nrwq","mb:minimo":mapBase+"-map-design/cksjc2nsq1bg117pnekb655h1","mb:decimal":mapBase+"-map-design/ck4014y110wt61ctt07egsel6","mb:standard":mapBase+"-map-design/ckr0svm3922ki18qntevm857n","mb:blueprint":mapBase+"-map-design/cks97e1e37nsd17nzg7p0308g","mb:bubble":mapBase+"-map-design/cksysy2nl62zp17quosctdtcc","mb:pencil":mapBase+"-map-design/cks9iema71es417mlrft4go2k","mb:swiss-ski":gitBase+"/mapbox/mapbox-gl-swiss-ski-style/master/cij1zoclj002y8rkkdjl69psd.json","mb:vintage":gitBase+"/mapbox/mapbox-gl-vintage-style/master/cif5p01n202nisaktvljx9mv3.json","mb:whaam":gitBase+"/mapbox/mapbox-gl-whaam-style/master/cii8323c8004w0nlvtss3dbm2.json","mb:neon":gitBase+"/NatEvatt/awesome-mapbox-gl-styles/master/styles/Neon/style.json","mb:camoflauge":gitBase+"/jingsam/mapbox-gl-styles/master/Camouflage.json","mb:emerald":gitBase+"/jingsam/mapbox-gl-styles/master/Emerald.json","mb:runner":gitBase+"/jingsam/mapbox-gl-styles/master/Runner.json","mb:x-ray":gitBase+"/jingsam/mapbox-gl-styles/master/X-ray.json"},rasterStyleList={"osm:org":["https://tile.openstreetmap.org/{z}/{x}/{y}.png",'Map &copy; <a href="https://www.openstreetmap.org"><em>OpenStreetMap</em></a>'],"osm:human":["https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png",'Map &copy; <a href="http://hot.openstreetmap.org"><em>Humanitarian OpenStreetMap Team</em></a>'],"osm:cycle":["https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png",'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>'],"carto:voyager":["https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png",'Maps &copy; <a href="https://carto.com/attribution"><em>Carto</em></a>'],"carto:positron":["https://{s}.basemaps.cartocdn.com/rastertiles/light_all/{z}/{x}/{y}.png",'Maps &copy; <a href="https://carto.com/attribution"><em>Carto</em></a>'],"carto:dark":["https://{s}.basemaps.cartocdn.com/rastertiles/dark_all/{z}/{x}/{y}.png",'Maps &copy; <a href="https://carto.com/attribution"><em>Carto</em></a>'],"open:topo":["https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",'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>'],"stamen:toner":["https://stamen-tiles-{s}.a.ssl.fastly.net/toner/{z}/{x}/{y}.png",'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>'],"stamen:toner-lite":["https://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.png",'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>'],"stamen:watercolor":["https://stamen-tiles-{s}.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.jpg",'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>'],"stamen:terrain":["https://stamen-tiles-{s}.a.ssl.fastly.net/terrain/{z}/{x}/{y}.jpg",'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>'],"tf:cycle":["https://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}@2x.png?apikey={apikey}",'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>'],"tf:trans":["https://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:trans-dark":["https://{s}.tile.thunderforest.com/transport-dark/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:landscape":["https://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:outdoors":["https://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:neighbourhood":["https://{s}.tile.thunderforest.com/neighbourhood/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:spinal":["https://{s}.tile.thunderforest.com/spinal-map/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:pioneer":["https://{s}.tile.thunderforest.com/pioneer/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:atlas":["https://{s}.tile.thunderforest.com/atlas/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:mobile":["https://{s}.tile.thunderforest.com/mobile-atlas/{z}/{x}/{y}.png?apikey={apikey}",'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>']},_tmpl$$2=template("<div></div>",2),MapContext=createContext(),useMap=()=>useContext(MapContext),MapGL=n=>{n.id=n.id||createUniqueId();const[e,a]=createSignal(null),[o,s]=(useTransition(),createSignal("flyTo")),i=(()=>{const r=_tmpl$$2.cloneNode(!0);return effect(e=>{var t=null==n?void 0:n.class,a=null==n?void 0:n.classList,o={position:"absolute",inset:0,...n.style};return t!==e._v$&&className(r,e._v$=t),e._v$2=classList(r,a,e._v$2),e._v$3=style(r,o,e._v$3),e},{_v$:void 0,_v$2:void 0,_v$3:void 0}),r})();return onMount(()=>{var e;const r=new mapboxgl.Map({...n.options,style:vectorStyleList[null==(e=n.options)?void 0:e.style]||(null==(e=n.options)?void 0:e.style)||{version:8,sources:{},layers:[]},container:i,interactive:!!n.onViewportChange,bounds:null==(e=n.viewport)?void 0:e.bounds,center:null==(e=n.viewport)?void 0:e.center,zoom:(null==(e=n.viewport)?void 0:e.zoom)||null,pitch:(null==(e=n.viewport)?void 0:e.pitch)||null,bearing:(null==(e=n.viewport)?void 0:e.bearing)||null,fitBoundsOptions:{padding:null==(e=n.viewport)?void 0:e.padding}}),t=(r.once("styledata").then(()=>a(r)),onCleanup(()=>r.remove()),new ResizeObserver(()=>r.resize()));t.observe(i),createEffect(()=>mapEvents.forEach(t=>{if(n[t]){const e=t.slice(2).toLowerCase(),a=e=>n[t](e);r.on(e,a),onCleanup(()=>r.off(e,a))}})),createEffect(()=>{r.showTileBoundaries=n.showTileBoundaries,r.showTerrainWireframe=n.showTerrainWireframe,r.showPadding=n.showPadding,r.showCollisionBoxes=n.showCollisionBoxes,r.showOverdrawInspector=n.showOverdrawInspector}),createEffect(()=>r.getCanvas().style.cursor=n.cursorStyle),createEffect(()=>s(n.transitionType)),createEffect(()=>{var e;return r.setProjection(null==(e=n.options)?void 0:e.projection)}),createEffect(()=>{var e=null==(e=n.options)?void 0:e.style;if(r.isStyleLoaded()){const a=r.getStyle(),t=a.layers.filter(e=>e.id.startsWith("cl-")),o=Object.keys(a.sources).filter(e=>e.startsWith("cl-")).reduce((e,t)=>({...e,[t]:a.sources[t]}),{});r.setStyle(vectorStyleList[e]||e||{version:8,sources:{},layers:[]}),r.once("styledata",()=>{var e=r.getStyle();r.setStyle({...e,sources:{...e.sources,...o},layers:[...e.layers,...t]})})}}),createEffect(()=>{var e;const t={id:null,center:r.getCenter(),zoom:r.getZoom(),pitch:r.getPitch(),bearing:r.getBearing(),padding:null==(e=n.viewport)?void 0:e.padding,bounds:null==(e=n.viewport)?void 0:e.bounds},a=e=>{e.originalEvent&&n.onViewportChange&&n.onViewportChange({...t,id:n.id}),s("jumpTo")},o=e=>{e.originalEvent&&n.onViewportChange&&n.onViewportChange(t),s(n.transitionType)};r.on("move",a).on("moveend",o),onCleanup(()=>r.off("move",a).off("moveend",o))}),createEffect(e=>{var t;return(null==(t=n.viewport)?void 0:t.bounds)!=e&&n.onViewportChange({...n.viewport,...r.cameraForBounds(null==(t=n.viewport)?void 0:t.bounds,{padding:null==(e=n.viewport)?void 0:e.padding})}),null==(t=n.viewport)?void 0:t.bounds},null==(e=n.viewport)?void 0:e.bounds),createEffect(()=>{var e;if(n.id!==(null==(e=n.viewport)?void 0:e.id)){var t={...n.viewport,padding:(null==(e=n.viewport)?void 0:e.padding)||0};switch(untrack(o)){case"easeTo":r.stop().easeTo(t);case"jumpTo":r.stop().jumpTo(t);default:r.stop().flyTo(t)}}})}),createComponent(MapContext.Provider,{value:e,get children(){return[memo(()=>memo(()=>!!e(),!0)()&&(()=>{const e=_tmpl$$2.cloneNode(!0);return e.style.setProperty("position","absolute"),e.style.setProperty("z-index","10"),insert(e,()=>n.children),e})()),i]}})},SourceContext=createContext(),useSourceId=()=>useContext(SourceContext),Source=o=>{const r=useMap(),n=(o.id=o.id||createUniqueId(),e=>rasterStyleList[e]?{...o.source,url:"",tiles:[rasterStyleList[e][0].replace("{apikey}",o.source.apikey)],attribution:rasterStyleList[e][1]}:o.source);return createEffect(()=>{const t=n(o.source.url);t.tiles&&(t.tiles=["a","b","c"].map(e=>t.tiles[0].replace("{s}",e))),r().getSource(o.id)||r().addSource(o.id,t)}),onCleanup(()=>{r().getStyle().layers.forEach(e=>e.source===o.id&&r().removeLayer(e.id)),r().getSource(o.id)&&r().removeSource(o.id)}),createEffect(()=>{const e=r().getSource(o.id);if(e&&("geojson"===o.source.type&&o.source.data&&e.setData(o.source.data),"image"===o.source.type&&(o.source.url||o.source.coordinates)&&e.updateImage(o.source.url,o.source.coordinates),"vector"===o.source.type&&(o.source.url||o.source.tiles)&&(o.source.url?e.setUrl(o.source.url):e.setTiles(o.source.tiles)),"raster"===o.source.type&&(o.source.url||o.source.tiles))){var t;const a=n(o.source.url);a.tiles&&(a.tiles=["a","b","c"].map(e=>a.tiles[0].replace("{s}",e))),null!=(t=e._tileJSONRequest)&&t.cancel(),e.url=a.url,e.scheme=a.scheme,e._options={...e._options,...a},null!=(t=r().style._sourceCaches["other:"+o.id])&&t.clearTiles(),e.load()}}),createComponent(SourceContext.Provider,{get value(){return o.id},get children(){return o.children}})},diff=(o={},r={})=>{return[...new Set([...Object.keys(o),...Object.keys(r)])].reduce((e,t)=>{var a=o[t];return a!==r[t]&&e.push([t,a]),e},[])},Layer=r=>{const n=useMap(),t=useSourceId();return r.id=r.id||createUniqueId(),createEffect(()=>{var e;n().getLayer(r.id)||n().addLayer(r.customLayer||{...r.style,id:r.id,source:t,metadata:{smg:{beforeType:r.beforeType,beforeId:r.beforeId}}},r.beforeType?null==(e=n())?void 0:e.getStyle().layers.find(e=>e.type===r.beforeType).id:r.beforeId)}),onCleanup(()=>n().getLayer(r.id)&&n().removeLayer(r.id)),createEffect(()=>layerEvents.forEach(t=>{if(r[t]){var e;const a=t.slice(2).toLowerCase(),o=e=>r[t](e);null!=(e=n())&&e.on(a,r.id,o),onCleanup(()=>{var e;return null==(e=n())?void 0:e.off(a,r.id,o)})}})),createEffect(e=>{if(r.style&&n().style&&n().getSource(t)&&n().getLayer(r.id))return r.style.layout!==(null==e?void 0:e.layout)&&diff(r.style.layout,null==e?void 0:e.layout).forEach(([e,t])=>n().setLayoutProperty(r.id,e,t,{validate:!1})),r.style.paint!==(null==e?void 0:e.paint)&&diff(r.style.paint,null==e?void 0:e.paint).forEach(([e,t])=>n().setPaintProperty(r.id,e,t,{validate:!1})),r.style.minzoom===(null==e?void 0:e.minzoom)&&r.style.maxzoom===(null==e?void 0:e.maxzoom)||n().setLayerZoomRange(r.id,r.style.minzoom,r.style.maxzoom),r.style.filter!==(null==e?void 0:e.filter)&&n().setFilter(r.id,r.style.filter,{validate:!1}),r.style},r.style),createEffect(e=>{if(void 0!==r.visible&&r.visible!==e&&n().getSource(t)&&n().getLayer(r.id))return n().setLayoutProperty(r.id,"visibility",r.visible?"visible":"none",{validate:!1}),r.visible},r.visible),createEffect(async()=>{r.filter&&(n().isStyleLoaded()||await n().once("styledata"),n().setFilter(r.id,r.filter))}),createEffect(async()=>{r.featureState&&r.featureState.id&&(n().isStyleLoaded()||await n().once("styledata"),n().removeFeatureState({source:t,sourceLayer:r.style["source-layer"]}),n().setFeatureState({source:t,sourceLayer:r.style["source-layer"],id:r.featureState.id},r.featureState.state))}),r.children},Fog=e=>{const t=useMap();return createEffect(()=>{t().setFog(e.style)}),onCleanup(()=>t().setFog(null)),createEffect(()=>{void 0!==e.visible&&t().setFog(e.visible?e.style:null)}),e.children},Sky=e=>{const t=useMap(),a="_sky";return createEffect(()=>{t().getLayer(a)&&t().addLayer({...e.style,id:a})}),onCleanup(()=>t().getLayer(a)&&t().removeLayer(a)),createEffect(()=>{void 0!==e.visible&&t().setLayoutProperty(a,"visibility",e.visible?"visible":"none")}),e.children},Terrain=e=>{const t=useMap(),a=useSourceId();return createEffect(()=>{t().setTerrain({...e.style,source:a})}),onCleanup(()=>t().setTerrain(null)),createEffect(()=>{void 0!==e.visible&&t().setTerrain(e.visible?e.style:null)}),e.children},Control=a=>{const o=useMap(),[e,r]=createSignal(null);return createEffect(()=>{var e,t=((e,t)=>{if(a.custom)return new a.custom(t);switch(e){case"navigation":return new mapboxgl.NavigationControl(t);case"scale":return new mapboxgl.ScaleControl(t);case"attribution":return new mapboxgl.AttributionControl(t);case"geolocate":return new mapboxgl.GeolocateControl(t);case"fullscreen":return new mapboxgl.FullscreenControl;default:throw new Error("Unknown control type: "+e)}})(a.type,a.options);t&&null!=(e=o())&&e.addControl(t,a.position),r(t)}),onCleanup(()=>o().removeControl(e())),a.children},_tmpl$$1=template("<div></div>",2),Marker=t=>{const a=useMap();let o=null;return createEffect(()=>{var e;o=new mapboxgl.Marker(t.options).setLngLat(t.lngLat).setPopup(t.children?(new mapboxgl.Popup).setDOMContent((e=_tmpl$$1.cloneNode(!0),insert(e,()=>t.children),e)):null).addTo(a())}),onCleanup(()=>o.remove()),createEffect(()=>o&&o.setLngLat(t.lngLat)),[]},_tmpl$=template("<div></div>",2),Popup=t=>{const a=useMap();let o=null;return createEffect(()=>{var e;o=new mapboxgl.Popup(t.options).setLngLat(t.lngLat).setDOMContent((e=_tmpl$.cloneNode(!0),insert(e,()=>t.children),e)).addTo(a())}),onCleanup(()=>o.remove()),createEffect(()=>o&&o.setLngLaL(t.lngLat)),createEffect(()=>o&&o.setDOMContent((()=>{var e=_tmpl$.cloneNode(!0);return insert(e,()=>t.children),e})())),[]},Image=a=>{const o=useMap();return createEffect(()=>{a.url?o().loadImage(a.url,(e,t)=>!o().hasImage(a.id)&&o().addImage(a.id,t)):o().hasImage(a.id)||o().addImage(a.id,a.image,a.options)}),onCleanup(()=>o().hasImage(a.id)&&o().removeImage(a.id)),createEffect(async()=>{a.image&&a.url||(a.url?o().loadImage(a.url,(e,t)=>{if(e)throw e;o().hasImage(a.id)||o().updateImage(a.id,t)}):o().style&&o().hasImage(a.id)&&o().updateImage(a.id,a.image))}),[]},lerp=(a,o,r)=>a.map((e,t)=>(1-r)*a[t]+r*o[t]),slerp=(a,o,r)=>{return a.map((e,t)=>Math.sin(.075*(1-r))/Math.sin(.075)*a[t]+Math.sin(.075*r)/Math.sin(.075)*o[t])},easeQuad={in:e=>e*e,out:e=>1-(1-e)*(1-e),inOut:e=>e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2},Camera=s=>{const i=useMap();let p=.1,l=!1;const c=e=>{s.animate&&window.requestAnimationFrame(c);var t=[s.translate.start,s.translate.end,s.translate.easing?easeQuad[s.translate.easing](p):p],t=("line"===s.translate.type?lerp:slerp)(...t);{var[[t,a,o],r]=[t,s.translate.target];const n=i().getFreeCameraOptions();n.position=MercatorCoordinate.fromLngLat([t,a],o),n.lookAtPoint(r),i().setFreeCameraOptions(n)}!s.translate.loop&&(1<p||p<0)&&(l=!l),p=l?p-.001:p+.001};return createEffect(async()=>{s.animate&&window.requestAnimationFrame(c)}),s.children};export{Camera,Control,Fog,Image,Layer,Marker,Popup,Sky,Source,Terrain,MapGL as default,useMap,useSourceId};
1
+ import{effect,setAttribute,className,classList,style,createComponent,memo,insert,template}from"solid-js/web";import{createContext,useContext,createUniqueId,createSignal,onMount,createEffect,onCleanup,untrack}from"solid-js";import mapboxgl,{MercatorCoordinate}from"mapbox-gl";const mapEvents=["onMouseDown","onMouseUp","onMouseOver","onMouseOut","onMouseMove","onMouseEnter","onMouseLeave","onPreClick","onClick","onDblClick","onContextMenu","onTouchStart","onTouchEnd","onTouchCancel","onWheel","onResize","onRemove","onTouchMove","onMoveStart","onMove","onMoveEnd","onDragStart","onDrag","onDragEnd","onZoomStart","onZoom","onZoomEnd","onRotateStart","onRotate","onRotatEnd","onPitchStart","onPitch","onPitchEnd","onBoxZoomStart","onBoxZoomEnd","onBoxZoomCancel","onWebglContextLost","onWebglContextRestored","onLoad","onRender","onIdle","onError","onData","onStyleData","onSourceData","onDataLoading","onStyleDataLoading","onSourceDataLoading","onStyleImageMissing"],layerEvents=["onMouseDown","onMouseUp","onMouseOver","onMouseOut","onMouseMove","onMouseEnter","onMouseLeave","onClick","onDblClick","onContextMenu","onTouchStart","onTouchEnd","onTouchCancel"],mapBase="mapbox://styles/mapbox",gitBase="https://raw.githubusercontent.com",gishub="https://raw.githubusercontent.com/GIShub4/map-styles/main",vectorStyleList={"mb:light":mapBase+"/light-v10","mb:dark":mapBase+"/dark-v10","mb:streets":mapBase+"/streets-v11","mb:outdoor":mapBase+"/outdoors-v11","mb:sat":mapBase+"/satellite-v9","mb:sat-streets":mapBase+"/satellite-streets-v11","mb:nav":mapBase+"/navigation-guidance-day-v4","mb:nav-night":mapBase+"/navigation-guidance-night-v4","mb:basic":mapBase+"/cjf4m44iw0uza2spb3q0a7s41","mb:monochrome":mapBase+"/cjv6rzz4j3m4b1fqcchuxclhb","mb:leshine":mapBase+"/cjcunv5ae262f2sm9tfwg8i0w","mb:icecream":mapBase+"/cj7t3i5yj0unt2rmt3y4b5e32","mb:cali":mapBase+"/cjerxnqt3cgvp2rmyuxbeqme7","mb:northstar":mapBase+"/cj44mfrt20f082snokim4ungi","mb:mineral":mapBase+"/cjtep62gq54l21frr1whf27ak","mb:moonlight":mapBase+"/cj3kbeqzo00022smj7akz3o1e","mb:frank":mapBase+"-map-design/ckshxkppe0gge18nz20i0nrwq","mb:minimo":mapBase+"-map-design/cksjc2nsq1bg117pnekb655h1","mb:decimal":mapBase+"-map-design/ck4014y110wt61ctt07egsel6","mb:standard":mapBase+"-map-design/ckr0svm3922ki18qntevm857n","mb:blueprint":mapBase+"-map-design/cks97e1e37nsd17nzg7p0308g","mb:bubble":mapBase+"-map-design/cksysy2nl62zp17quosctdtcc","mb:pencil":mapBase+"-map-design/cks9iema71es417mlrft4go2k","mb:swiss-ski":gitBase+"/mapbox/mapbox-gl-swiss-ski-style/master/cij1zoclj002y8rkkdjl69psd.json","mb:vintage":gitBase+"/mapbox/mapbox-gl-vintage-style/master/cif5p01n202nisaktvljx9mv3.json","mb:whaam":gitBase+"/mapbox/mapbox-gl-whaam-style/master/cii8323c8004w0nlvtss3dbm2.json","mb:neon":gitBase+"/NatEvatt/awesome-mapbox-gl-styles/master/styles/Neon/style.json","mb:camoflauge":gitBase+"/jingsam/mapbox-gl-styles/master/Camouflage.json","mb:emerald":gitBase+"/jingsam/mapbox-gl-styles/master/Emerald.json","mb:runner":gitBase+"/jingsam/mapbox-gl-styles/master/Runner.json","mb:x-ray":gitBase+"/jingsam/mapbox-gl-styles/master/X-ray.json","esri:blueprint":gishub+"/esri:blueprint.json","esri:charted-territory":gishub+"/esri:charted-territory.json","esri:colored-pencil":gishub+"/esri:colored-pencil.json","esri:community":gishub+"/esri:community.json","esri:mid-century":gishub+"/esri:mid-century.json","esri:modern-antique":gishub+"/esri:modern-antique.json","esri:national-geographic":gishub+"/esri:national-geographic.json","esri:newspaper":gishub+"/esri:newspaper.json","esri:open-street-map":gishub+"/esri:open-street-map.json","esri:light-gray-canvas":gishub+"/esri:light-gray-canvas.json","esri:dark-gray-canvas":gishub+"/esri:dark-gray-canvas.json","esri:human-geography-light":gishub+"/esri:human-geography-light.json","esri:human-geography-dark":gishub+"/esri:human-geography-dark.json","esri:world-navigation-map":gishub+"/esri:world-navigation-map.json","esri:world-street-map":gishub+"/esri:world-street-map.json","esri:world-street-map-night":gishub+"/esri:world-street-map-night.json","esri:world-terrain-base":gishub+"/esri:world-terrain-base.json","esri:world-topographic-map":gishub+"/esri:world-topographic-map.json","esri:chromium":gishub+"/esri:chromium.json","esri:dreamcatcher":gishub+"/esri:dreamcatcher.json","esri:seahaven":gishub+"/esri:seahaven.json","esri:sangria":gishub+"/esri:sangria.json","esri:mercurial":gishub+"/esri:mercurial.json"},rasterStyleList={"osm:org":["https://tile.openstreetmap.org/{z}/{x}/{y}.png",'Map &copy; <a href="https://www.openstreetmap.org"><em>OpenStreetMap</em></a>'],"osm:human":["https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png",'Map &copy; <a href="http://hot.openstreetmap.org"><em>Humanitarian OpenStreetMap Team</em></a>'],"osm:cycle":["https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png",'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>'],"carto:voyager":["https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}.png",'Maps &copy; <a href="https://carto.com/attribution"><em>Carto</em></a>'],"carto:positron":["https://{s}.basemaps.cartocdn.com/rastertiles/light_all/{z}/{x}/{y}.png",'Maps &copy; <a href="https://carto.com/attribution"><em>Carto</em></a>'],"carto:dark":["https://{s}.basemaps.cartocdn.com/rastertiles/dark_all/{z}/{x}/{y}.png",'Maps &copy; <a href="https://carto.com/attribution"><em>Carto</em></a>'],"open:topo":["https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",'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>'],"stamen:toner":["https://stamen-tiles-{s}.a.ssl.fastly.net/toner/{z}/{x}/{y}.png",'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>'],"stamen:toner-lite":["https://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.png",'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>'],"stamen:watercolor":["https://stamen-tiles-{s}.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.jpg",'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>'],"stamen:terrain":["https://stamen-tiles-{s}.a.ssl.fastly.net/terrain/{z}/{x}/{y}.jpg",'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>'],"tf:cycle":["https://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}@2x.png?apikey={apikey}",'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>'],"tf:trans":["https://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:trans-dark":["https://{s}.tile.thunderforest.com/transport-dark/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:landscape":["https://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:outdoors":["https://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:neighbourhood":["https://{s}.tile.thunderforest.com/neighbourhood/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:spinal":["https://{s}.tile.thunderforest.com/spinal-map/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:pioneer":["https://{s}.tile.thunderforest.com/pioneer/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:atlas":["https://{s}.tile.thunderforest.com/atlas/{z}/{x}/{y}.png?apikey={apikey}",'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>'],"tf:mobile":["https://{s}.tile.thunderforest.com/mobile-atlas/{z}/{x}/{y}.png?apikey={apikey}",'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>']},_tmpl$$2=template("<div></div>",2),MapContext=createContext(),useMap=()=>useContext(MapContext),MapGL=n=>{n.id=n.id||createUniqueId();const[e,r]=createSignal(),[i,p]=createSignal("flyTo"),[l,c]=createSignal(window.matchMedia("(prefers-color-scheme: dark)").matches||document.body.classList.contains("dark")),m=(e,t)=>n.debug&&console.debug(e+": %c"+t,"color: #00F"),u=(()=>{const s=_tmpl$$2.cloneNode(!0);return effect(e=>{var t=n.id,a=null==n?void 0:n.class,o=null==n?void 0:n.classList,r={position:"absolute",inset:0,...n.style};return t!==e._v$&&setAttribute(s,"id",e._v$=t),a!==e._v$2&&className(s,e._v$2=a),e._v$3=classList(s,o,e._v$3),e._v$4=style(s,r,e._v$4),e},{_v$:void 0,_v$2:void 0,_v$3:void 0,_v$4:void 0}),s})();return onMount(()=>{var e=l()?n.darkStyle||(null==(e=n.options)?void 0:e.style):null==(e=n.options)?void 0:e.style;const s=new mapboxgl.Map({...n.options,style:vectorStyleList[e]||e||{version:8,sources:{},layers:[]},container:u,interactive:!!n.onViewportChange,bounds:null==(e=n.viewport)?void 0:e.bounds,center:null==(e=n.viewport)?void 0:e.center,zoom:(null==(e=n.viewport)?void 0:e.zoom)||null,pitch:(null==(e=n.viewport)?void 0:e.pitch)||null,bearing:(null==(e=n.viewport)?void 0:e.bearing)||null,fitBoundsOptions:{padding:null==(e=n.viewport)?void 0:e.padding}}),t=(s.debug=n.debug,s.once("styledata").then(()=>r(s)),new ResizeObserver(()=>s.resize())),a=(createEffect(()=>n.disableResize?t.disconnect():t.observe(u)),window.matchMedia("(prefers-color-scheme: dark)")),o=(a.addEventListener("change",()=>c(a.matches)),new MutationObserver(()=>c(document.body.classList.contains("dark"))));o.observe(document.body,{attributes:!0}),createEffect(()=>mapEvents.forEach(t=>{if(n[t]){const e=t.slice(2).toLowerCase(),a=e=>n[t](e);s.on(e,a),onCleanup(()=>s.off(e,a))}})),createEffect(()=>{s.showTileBoundaries=n.showTileBoundaries,s.showTerrainWireframe=n.showTerrainWireframe,s.showPadding=n.showPadding,s.showCollisionBoxes=n.showCollisionBoxes,s.showOverdrawInspector=n.showOverdrawInspector}),createEffect(e=>{if(n.cursorStyle!==e)return m("Update Cursor to",n.cursorStyle),s.getCanvas().style.cursor=n.cursorStyle,n.cursorStyle}),createEffect(e=>{if(n.transitionType!==e)return m("Update Transition to",n.transitionType),p(n.transitionType),n.transitionType}),createEffect(e=>{var t;if((null==(t=n.options)?void 0:t.projection)!==e)return m("Update Projection to",null==(t=n.options)?void 0:t.projection.name),s.setProjection(null==(e=n.options)?void 0:e.projection),null==(t=n.options)?void 0:t.projection}),createEffect(e=>{var o=l()?n.darkStyle||(null==(o=n.options)?void 0:o.style):null==(o=n.options)?void 0:o.style;if(o!==e){let t=[],a={};if(m("Update Mapstyle to",o),s.isStyleLoaded()){const r=s.getStyle();t=r.layers.filter(e=>e.id.startsWith("cl-")),a=Object.keys(r.sources).filter(e=>e.startsWith("cl-")).reduce((e,t)=>({...e,[t]:r.sources[t]}),{})}return s.setStyle(vectorStyleList[o]||o||{version:8,sources:{},layers:[]}),s.once("styledata",()=>{var e=s.getStyle();s.setStyle({...e,sources:{...e.sources,...a},layers:[...e.layers,...t]})}),o}},null==(e=n.options)?void 0:e.style),createEffect(()=>{var e;const t={id:null,center:s.getCenter(),zoom:s.getZoom(),pitch:s.getPitch(),bearing:s.getBearing(),padding:null==(e=n.viewport)?void 0:e.padding,bounds:null==(e=n.viewport)?void 0:e.bounds},a=e=>{e.originalEvent&&n.onViewportChange&&n.onViewportChange({...t,id:n.id}),p("jumpTo")},o=e=>{e.originalEvent&&n.onViewportChange&&n.onViewportChange(t),p(n.transitionType)};s.on("move",a).on("moveend",o),onCleanup(()=>s.off("move",a).off("moveend",o))}),createEffect(e=>{var t;return(null==(t=n.viewport)?void 0:t.bounds)!=e&&n.onViewportChange({...n.viewport,...s.cameraForBounds(null==(t=n.viewport)?void 0:t.bounds,{padding:null==(e=n.viewport)?void 0:e.padding})}),null==(t=n.viewport)?void 0:t.bounds},null==(e=n.viewport)?void 0:e.bounds),createEffect(()=>{var e;if(n.id!==(null==(e=n.viewport)?void 0:e.id)){var t={...n.viewport,padding:(null==(e=n.viewport)?void 0:e.padding)||0};switch(untrack(i)){case"easeTo":s.stop().easeTo(t);case"jumpTo":s.stop().jumpTo(t);default:s.stop().flyTo(t)}}})}),createComponent(MapContext.Provider,{value:e,get children(){return[memo(()=>memo(()=>!!e(),!0)()&&(()=>{const e=_tmpl$$2.cloneNode(!0);return e.style.setProperty("position","absolute"),e.style.setProperty("z-index","10"),insert(e,()=>n.children),e})()),u]}})},SourceContext=createContext(),useSourceId=()=>useContext(SourceContext),Source=o=>{const r=useMap(),s=(o.id=o.id||createUniqueId(),e=>rasterStyleList[e]?{...o.source,url:"",tiles:[rasterStyleList[e][0].replace("{apikey}",o.source.apikey)],attribution:rasterStyleList[e][1]}:o.source);return createEffect(()=>{const t=s(o.source.url);t.tiles&&(t.tiles=["a","b","c"].map(e=>t.tiles[0].replace("{s}",e))),r().getSource(o.id)||r().addSource(o.id,t)}),onCleanup(()=>{r().getStyle().layers.forEach(e=>e.source===o.id&&r().removeLayer(e.id)),r().getSource(o.id)&&r().removeSource(o.id)}),createEffect(()=>{const e=r().getSource(o.id);if(e&&("geojson"===o.source.type&&o.source.data&&e.setData(o.source.data),"image"===o.source.type&&(o.source.url||o.source.coordinates)&&e.updateImage(o.source.url,o.source.coordinates),"vector"===o.source.type&&(o.source.url||o.source.tiles)&&(o.source.url?e.setUrl(o.source.url):e.setTiles(o.source.tiles)),"raster"===o.source.type&&(o.source.url||o.source.tiles))){var t;const a=s(o.source.url);a.tiles&&(a.tiles=["a","b","c"].map(e=>a.tiles[0].replace("{s}",e))),null!=(t=e._tileJSONRequest)&&t.cancel(),e.url=a.url,e.scheme=a.scheme,e._options={...e._options,...a},null!=(t=r().style._sourceCaches["other:"+o.id])&&t.clearTiles(),e.load()}}),createComponent(SourceContext.Provider,{get value(){return o.id},get children(){return o.children}})},diff=(o={},r={})=>{return[...new Set([...Object.keys(o),...Object.keys(r)])].reduce((e,t)=>{var a=o[t];return a!==r[t]&&e.push([t,a]),e},[])},Layer=r=>{const s=useMap(),t=useSourceId();return r.id=r.id||createUniqueId(),createEffect(()=>{var e;s().getLayer(r.id)||s().addLayer(r.customLayer||{...r.style,id:r.id,source:t,metadata:{smg:{beforeType:r.beforeType,beforeId:r.beforeId}}},r.beforeType?null==(e=s())?void 0:e.getStyle().layers.find(e=>e.type===r.beforeType).id:r.beforeId)}),onCleanup(()=>s().getLayer(r.id)&&s().removeLayer(r.id)),createEffect(()=>layerEvents.forEach(t=>{if(r[t]){var e;const a=t.slice(2).toLowerCase(),o=e=>r[t](e);null!=(e=s())&&e.on(a,r.id,o),onCleanup(()=>{var e;return null==(e=s())?void 0:e.off(a,r.id,o)})}})),createEffect(e=>{if(r.style&&s().style&&s().getSource(t)&&s().getLayer(r.id))return r.style.layout!==(null==e?void 0:e.layout)&&diff(r.style.layout,null==e?void 0:e.layout).forEach(([e,t])=>s().setLayoutProperty(r.id,e,t,{validate:!1})),r.style.paint!==(null==e?void 0:e.paint)&&diff(r.style.paint,null==e?void 0:e.paint).forEach(([e,t])=>s().setPaintProperty(r.id,e,t,{validate:!1})),r.style.minzoom===(null==e?void 0:e.minzoom)&&r.style.maxzoom===(null==e?void 0:e.maxzoom)||s().setLayerZoomRange(r.id,r.style.minzoom,r.style.maxzoom),r.style.filter!==(null==e?void 0:e.filter)&&s().setFilter(r.id,r.style.filter,{validate:!1}),r.style},r.style),createEffect(e=>{if(void 0!==r.visible&&r.visible!==e&&s().getSource(t)&&s().getLayer(r.id))return s().setLayoutProperty(r.id,"visibility",r.visible?"visible":"none",{validate:!1}),r.visible},r.visible),createEffect(async()=>{r.filter&&(s().isStyleLoaded()||await s().once("styledata"),s().setFilter(r.id,r.filter))}),createEffect(async()=>{r.featureState&&r.featureState.id&&(s().isStyleLoaded()||await s().once("styledata"),s().removeFeatureState({source:t,sourceLayer:r.style["source-layer"]}),s().setFeatureState({source:t,sourceLayer:r.style["source-layer"],id:r.featureState.id},r.featureState.state))}),r.children},Fog=e=>{const t=useMap();return createEffect(()=>{t().setFog(e.style)}),onCleanup(()=>t().setFog(null)),createEffect(()=>{void 0!==e.visible&&t().setFog(e.visible?e.style:null)}),e.children},Sky=e=>{const t=useMap(),a="_sky";return createEffect(()=>{t().getLayer(a)&&t().addLayer({...e.style,id:a})}),onCleanup(()=>t().getLayer(a)&&t().removeLayer(a)),createEffect(()=>{void 0!==e.visible&&t().setLayoutProperty(a,"visibility",e.visible?"visible":"none")}),e.children},Terrain=e=>{const t=useMap(),a=useSourceId();return createEffect(()=>{t().setTerrain({...e.style,source:a})}),onCleanup(()=>t().setTerrain(null)),createEffect(()=>{void 0!==e.visible&&t().setTerrain(e.visible?e.style:null)}),e.children},Control=a=>{const o=useMap(),[e,r]=createSignal(null);return createEffect(()=>{var e,t=((e,t)=>{if(a.custom)return new a.custom(t);switch(e){case"navigation":return new mapboxgl.NavigationControl(t);case"scale":return new mapboxgl.ScaleControl(t);case"attribution":return new mapboxgl.AttributionControl(t);case"geolocate":return new mapboxgl.GeolocateControl(t);case"fullscreen":return new mapboxgl.FullscreenControl;default:throw new Error("Unknown control type: "+e)}})(a.type,a.options);t&&null!=(e=o())&&e.addControl(t,a.position),r(t)}),onCleanup(()=>o().removeControl(e())),a.children},_tmpl$$1=template("<div></div>",2),Marker=t=>{const a=useMap();let o=null;return createEffect(()=>{var e;o=new mapboxgl.Marker(t.options).setLngLat(t.lngLat).setPopup(t.children?(new mapboxgl.Popup).setDOMContent((e=_tmpl$$1.cloneNode(!0),insert(e,()=>t.children),e)):null).addTo(a())}),onCleanup(()=>o.remove()),createEffect(()=>o&&o.setLngLat(t.lngLat)),[]},_tmpl$=template("<div></div>",2),Popup=t=>{const a=useMap();let o=null;return createEffect(()=>{var e;o=new mapboxgl.Popup(t.options).setLngLat(t.lngLat).setDOMContent((e=_tmpl$.cloneNode(!0),insert(e,()=>t.children),e)).addTo(a())}),onCleanup(()=>o.remove()),createEffect(()=>o&&o.setLngLaL(t.lngLat)),createEffect(()=>o&&o.setDOMContent((()=>{var e=_tmpl$.cloneNode(!0);return insert(e,()=>t.children),e})())),[]},Image=a=>{const o=useMap();return createEffect(()=>{a.url?o().loadImage(a.url,(e,t)=>!o().hasImage(a.id)&&o().addImage(a.id,t)):o().hasImage(a.id)||o().addImage(a.id,a.image,a.options)}),onCleanup(()=>o().hasImage(a.id)&&o().removeImage(a.id)),createEffect(async()=>{a.image&&a.url||(a.url?o().loadImage(a.url,(e,t)=>{if(e)throw e;o().hasImage(a.id)||o().updateImage(a.id,t)}):o().style&&o().hasImage(a.id)&&o().updateImage(a.id,a.image))}),[]},lerp=(a,o,r)=>a.map((e,t)=>(1-r)*a[t]+r*o[t]),slerp=(a,o,r)=>{return a.map((e,t)=>Math.sin(.075*(1-r))/Math.sin(.075)*a[t]+Math.sin(.075*r)/Math.sin(.075)*o[t])},easeQuad={in:e=>e*e,out:e=>1-(1-e)*(1-e),inOut:e=>e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2},Camera=n=>{const i=useMap();let p=.1,l=!1;const c=e=>{n.animate&&window.requestAnimationFrame(c);var t=[n.translate.start,n.translate.end,n.translate.easing?easeQuad[n.translate.easing](p):p],t=("line"===n.translate.type?lerp:slerp)(...t);{var[[t,a,o],r]=[t,n.translate.target];const s=i().getFreeCameraOptions();s.position=MercatorCoordinate.fromLngLat([t,a],o),s.lookAtPoint(r),i().setFreeCameraOptions(s)}!n.translate.loop&&(1<p||p<0)&&(l=!l),p=l?p-.001:p+.001};return createEffect(async()=>{n.animate&&window.requestAnimationFrame(c)}),n.children};export{Camera,Control,Fog,Image,Layer,Marker,Popup,Sky,Source,Terrain,MapGL as default,useMap,useSourceId};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
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 /** Mouse Cursor Style */\n cursorStyle?: string\n ref?: HTMLDivElement\n /** Children within the Map Container */\n children?: Element | Element[] | null\n}> = props => {\n props.id = props.id || createUniqueId()\n\n const [mapRoot, setMapRoot] = createSignal<MapboxMap>(null)\n const [pending, start] = useTransition()\n const [transitionType, setTransitionType] = createSignal('flyTo')\n\n const mapRef = (\n <div\n class={props?.class}\n classList={props?.classList}\n style={{ position: 'absolute', inset: 0, ...props.style }}\n />\n )\n\n onMount(() => {\n const map: MapboxMap = 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 map.once('styledata').then(() => setMapRoot(map))\n\n onCleanup(() => map.remove())\n\n // Listen to map container size changes\n const resizeObserver = new ResizeObserver(() => map.resize())\n resizeObserver.observe(mapRef as Element)\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(() => map.setProjection(props.options?.projection))\n\n // Update map style\n createEffect(() => {\n const style = props.options?.style\n if (!map.isStyleLoaded()) return\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\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\n return (\n <MapContext.Provider value={mapRoot}>\n {mapRoot() && (\n <div style={{ position: 'absolute', 'z-index': 10 }}>\n {props.children}\n </div>\n )}\n {mapRef}\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.setLngLaL(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","id","createUniqueId","mapRoot","setMapRoot","createSignal","transitionType","setTransitionType","useTransition","mapRef","_el$","_tmpl$","cloneNode","_$effect","_p$","_v$","class","_v$2","classList","_v$3","position","inset","style","_$className","_$classList","_$style","undefined","onMount","_props$viewport13","map","mapboxgl","Map","options","_props$options","_props$options2","version","sources","layers","container","interactive","onViewportChange","bounds","viewport","_props$viewport","center","_props$viewport2","zoom","pitch","bearing","fitBoundsOptions","padding","_props$viewport6","resizeObserver","once","then","onCleanup","remove","ResizeObserver","resize","observe","createEffect","forEach","item","event","slice","toLowerCase","callback","e","on","off","showTileBoundaries","showTerrainWireframe","showPadding","showCollisionBoxes","showOverdrawInspector","getCanvas","cursor","cursorStyle","_props$options3","setProjection","projection","_props$options4","isStyleLoaded","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","_$createComponent","Provider","value","children","_$memo","_el$2","setProperty","_$insert","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","featureState","removeFeatureState","sourceLayer","setFeatureState","state","Fog","setFog","Sky","layerId","Terrain","setTerrain","Control","control","setControl","custom","NavigationControl","ScaleControl","AttributionControl","GeolocateControl","FullscreenControl","Error","getControl","addControl","removeControl","Marker","let","marker","setLngLat","lngLat","setPopup","Popup","setDOMContent","addTo","popup","setLngLaL","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","window","requestAnimationFrame","params","translate","start","end","easing","updateCameraPosition","lng","lat","alt","target","camera","getFreeCameraOptions","MercatorCoordinate","fromLngLat","lookAtPoint","setFreeCameraOptions","loop"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/events.ts","../../src/mapStyles.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'\nconst gishub = 'https://raw.githubusercontent.com/GIShub4/map-styles/main'\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 'esri:blueprint': `${gishub}/esri:blueprint.json`,\n 'esri:charted-territory': `${gishub}/esri:charted-territory.json`,\n 'esri:colored-pencil': `${gishub}/esri:colored-pencil.json`,\n 'esri:community': `${gishub}/esri:community.json`,\n 'esri:mid-century': `${gishub}/esri:mid-century.json`,\n 'esri:modern-antique': `${gishub}/esri:modern-antique.json`,\n 'esri:national-geographic': `${gishub}/esri:national-geographic.json`,\n 'esri:newspaper': `${gishub}/esri:newspaper.json`,\n 'esri:open-street-map': `${gishub}/esri:open-street-map.json`,\n 'esri:light-gray-canvas': `${gishub}/esri:light-gray-canvas.json`,\n 'esri:dark-gray-canvas': `${gishub}/esri:dark-gray-canvas.json`,\n 'esri:human-geography-light': `${gishub}/esri:human-geography-light.json`,\n 'esri:human-geography-dark': `${gishub}/esri:human-geography-dark.json`,\n 'esri:world-navigation-map': `${gishub}/esri:world-navigation-map.json`,\n 'esri:world-street-map': `${gishub}/esri:world-street-map.json`,\n 'esri:world-street-map-night': `${gishub}/esri:world-street-map-night.json`,\n 'esri:world-terrain-base': `${gishub}/esri:world-terrain-base.json`,\n 'esri:world-topographic-map': `${gishub}/esri:world-topographic-map.json`,\n 'esri:chromium': `${gishub}/esri:chromium.json`,\n 'esri:dreamcatcher': `${gishub}/esri:dreamcatcher.json`,\n 'esri:seahaven': `${gishub}/esri:seahaven.json`,\n 'esri:sangria': `${gishub}/esri:sangria.json`,\n 'esri:mercurial': `${gishub}/esri:mercurial.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 createUniqueId,\n untrack,\n} from 'solid-js'\nimport { mapEvents } from '../../events'\nimport { vectorStyleList } from '../../mapStyles'\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 { StyleSpecification } from 'mapbox-gl/src/style-spec/types.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 /** Mouse Cursor Style */\n cursorStyle?: string\n //** Dark Map Style */\n darkStyle?: StyleSpecification | string\n //** Disable automatic map resize */\n disableResize?: boolean\n //** Debug Mode */\n debug?: boolean\n ref?: HTMLDivElement\n /** Children within the Map Container */\n children?: any\n}> = props => {\n props.id = props.id || createUniqueId()\n\n const [mapRoot, setMapRoot] = createSignal<MapboxMap>()\n const [transitionType, setTransitionType] = createSignal('flyTo')\n const [darkMode, setDarkMode] = createSignal(\n window.matchMedia('(prefers-color-scheme: dark)').matches ||\n document.body.classList.contains('dark')\n )\n\n const debug = (text, value) =>\n props.debug && console.debug(`${text}: %c${value}`, 'color: #00F')\n\n const mapRef = (\n <div\n id={props.id}\n class={props?.class}\n classList={props?.classList}\n style={{ position: 'absolute', inset: 0, ...props.style }}\n />\n )\n\n onMount(() => {\n const style = darkMode()\n ? props.darkStyle || props.options?.style\n : props.options?.style\n\n const map: MapboxMap = new mapboxgl.Map({\n ...props.options,\n style: vectorStyleList[style] ||\n 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.debug = props.debug\n // map.container = containerRef\n\n map.once('styledata').then(() => setMapRoot(map))\n\n // onCleanup(() => map.remove())\n\n // Listen to map container size changes\n const resizeObserver = new ResizeObserver(() => map.resize())\n createEffect(() =>\n props.disableResize\n ? resizeObserver.disconnect()\n : resizeObserver.observe(mapRef as Element)\n )\n\n // Listen to dark theme changes\n const darkTheme = window.matchMedia('(prefers-color-scheme: dark)')\n darkTheme.addEventListener('change', () => setDarkMode(darkTheme.matches))\n\n const bodyClassObserver = new MutationObserver(() =>\n setDarkMode(document.body.classList.contains('dark'))\n )\n bodyClassObserver.observe(document.body, { attributes: true })\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(prev => {\n if (props.cursorStyle === prev) return\n debug('Update Cursor to', props.cursorStyle)\n map.getCanvas().style.cursor = props.cursorStyle\n return props.cursorStyle\n })\n\n //Update transition type\n createEffect(prev => {\n if (props.transitionType === prev) return\n debug('Update Transition to', props.transitionType)\n setTransitionType(props.transitionType)\n return props.transitionType\n })\n\n // Update projection\n createEffect(prev => {\n if (props.options?.projection === prev) return\n debug('Update Projection to', props.options?.projection.name)\n map.setProjection(props.options?.projection)\n return props.options?.projection\n })\n\n // Update map style\n createEffect(prev => {\n const style = darkMode()\n ? props.darkStyle || props.options?.style\n : props.options?.style\n if (style === prev) return\n let oldLayers = []\n let oldSources = {}\n debug('Update Mapstyle to', style)\n if (map.isStyleLoaded()) {\n const oldStyle = map.getStyle()\n oldLayers = oldStyle.layers.filter(l => l.id.startsWith('cl-'))\n oldSources = Object.keys(oldStyle.sources)\n .filter(s => s.startsWith('cl-'))\n .reduce((obj, key) => ({ ...obj, [key]: oldStyle.sources[key] }), {})\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 return style\n }, props.options?.style)\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\n return (\n <MapContext.Provider value={mapRoot}>\n {mapRoot() && (\n <div style={{ position: 'absolute', 'z-index': 10 }}>\n {props.children}\n </div>\n )}\n {mapRef}\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 '../../mapStyles'\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.setLngLaL(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","gishub","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","esri:blueprint","esri:charted-territory","esri:colored-pencil","esri:community","esri:mid-century","esri:modern-antique","esri:national-geographic","esri:newspaper","esri:open-street-map","esri:light-gray-canvas","esri:dark-gray-canvas","esri:human-geography-light","esri:human-geography-dark","esri:world-navigation-map","esri:world-street-map","esri:world-street-map-night","esri:world-terrain-base","esri:world-topographic-map","esri:chromium","esri:dreamcatcher","esri:seahaven","esri:sangria","esri:mercurial","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","id","createUniqueId","mapRoot","setMapRoot","createSignal","transitionType","setTransitionType","darkMode","setDarkMode","window","matchMedia","matches","document","body","classList","contains","debug","text","value","console","mapRef","_el$","_tmpl$","cloneNode","_$effect","_p$","_v$2","class","_v$3","_v$4","position","inset","style","_v$","_$setAttribute","_$className","_$classList","_$style","undefined","onMount","darkStyle","options","_props$options","_props$options2","map","mapboxgl","Map","version","sources","layers","container","interactive","onViewportChange","bounds","viewport","_props$viewport","center","_props$viewport2","zoom","pitch","bearing","fitBoundsOptions","padding","_props$viewport6","resizeObserver","once","then","ResizeObserver","resize","darkTheme","createEffect","disableResize","disconnect","observe","bodyClassObserver","addEventListener","MutationObserver","attributes","forEach","item","event","slice","toLowerCase","callback","e","on","onCleanup","off","showTileBoundaries","showTerrainWireframe","showPadding","showCollisionBoxes","showOverdrawInspector","prev","cursorStyle","getCanvas","cursor","_props$options6","_props$options3","projection","_props$options4","name","setProjection","_props$options5","_props$options7","_props$options8","let","oldLayers","oldSources","isStyleLoaded","oldStyle","getStyle","filter","l","startsWith","Object","keys","s","reduce","obj","key","setStyle","newStyle","_props$options9","_props$viewport8","getCenter","getZoom","getPitch","getBearing","_props$viewport7","callMove","originalEvent","callEnd","_props$viewport12","_props$viewport9","cameraForBounds","_props$viewport10","_props$viewport11","_props$viewport13","_props$viewport15","_props$viewport14","untrack","stop","easeTo","jumpTo","flyTo","_$createComponent","Provider","children","_$memo","_el$2","setProperty","_$insert","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","featureState","removeFeatureState","sourceLayer","setFeatureState","state","Fog","setFog","Sky","layerId","Terrain","setTerrain","Control","control","setControl","custom","NavigationControl","ScaleControl","AttributionControl","GeolocateControl","FullscreenControl","Error","getControl","addControl","removeControl","Marker","marker","setLngLat","lngLat","setPopup","Popup","setDOMContent","addTo","remove","popup","setLngLaL","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","requestAnimationFrame","params","translate","start","end","easing","updateCameraPosition","lng","lat","alt","target","camera","getFreeCameraOptions","MercatorCoordinate","fromLngLat","lookAtPoint","setFreeCameraOptions","loop"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { createSignal, createEffect, onMount, onCleanup, createContext, useContext, useTransition, createUniqueId, untrack, } from 'solid-js';
1
+ import { createSignal, createEffect, onMount, onCleanup, createContext, useContext, createUniqueId, untrack, } from 'solid-js';
2
2
  import { mapEvents } from '../../events';
3
- import { vectorStyleList } from '../../styles';
3
+ import { vectorStyleList } from '../../mapStyles';
4
4
  import mapboxgl from 'mapbox-gl';
5
5
  import 'mapbox-gl/dist/mapbox-gl.css';
6
6
  const MapContext = createContext();
@@ -9,15 +9,20 @@ export const useMap = () => useContext(MapContext);
9
9
  /** Creates a new Map Container */
10
10
  export const MapGL = props => {
11
11
  props.id = props.id || createUniqueId();
12
- const [mapRoot, setMapRoot] = createSignal(null);
13
- const [pending, start] = useTransition();
12
+ const [mapRoot, setMapRoot] = createSignal();
14
13
  const [transitionType, setTransitionType] = createSignal('flyTo');
15
- const mapRef = (<div class={props?.class} classList={props?.classList} style={{ position: 'absolute', inset: 0, ...props.style }}/>);
14
+ const [darkMode, setDarkMode] = createSignal(window.matchMedia('(prefers-color-scheme: dark)').matches ||
15
+ document.body.classList.contains('dark'));
16
+ const debug = (text, value) => props.debug && console.debug(`${text}: %c${value}`, 'color: #00F');
17
+ const mapRef = (<div id={props.id} class={props?.class} classList={props?.classList} style={{ position: 'absolute', inset: 0, ...props.style }}/>);
16
18
  onMount(() => {
19
+ const style = darkMode()
20
+ ? props.darkStyle || props.options?.style
21
+ : props.options?.style;
17
22
  const map = new mapboxgl.Map({
18
23
  ...props.options,
19
- style: vectorStyleList[props.options?.style] ||
20
- props.options?.style || { version: 8, sources: {}, layers: [] },
24
+ style: vectorStyleList[style] ||
25
+ style || { version: 8, sources: {}, layers: [] },
21
26
  container: mapRef,
22
27
  interactive: !!props.onViewportChange,
23
28
  bounds: props.viewport?.bounds,
@@ -27,12 +32,20 @@ export const MapGL = props => {
27
32
  bearing: props.viewport?.bearing || null,
28
33
  fitBoundsOptions: { padding: props.viewport?.padding },
29
34
  });
35
+ map.debug = props.debug;
30
36
  // map.container = containerRef
31
37
  map.once('styledata').then(() => setMapRoot(map));
32
- onCleanup(() => map.remove());
38
+ // onCleanup(() => map.remove())
33
39
  // Listen to map container size changes
34
40
  const resizeObserver = new ResizeObserver(() => map.resize());
35
- resizeObserver.observe(mapRef);
41
+ createEffect(() => props.disableResize
42
+ ? resizeObserver.disconnect()
43
+ : resizeObserver.observe(mapRef));
44
+ // Listen to dark theme changes
45
+ const darkTheme = window.matchMedia('(prefers-color-scheme: dark)');
46
+ darkTheme.addEventListener('change', () => setDarkMode(darkTheme.matches));
47
+ const bodyClassObserver = new MutationObserver(() => setDarkMode(document.body.classList.contains('dark')));
48
+ bodyClassObserver.observe(document.body, { attributes: true });
36
49
  // Hook up events
37
50
  createEffect(() => mapEvents.forEach(item => {
38
51
  if (props[item]) {
@@ -51,21 +64,46 @@ export const MapGL = props => {
51
64
  map.showOverdrawInspector = props.showOverdrawInspector;
52
65
  });
53
66
  // Update cursor
54
- createEffect(() => (map.getCanvas().style.cursor = props.cursorStyle));
67
+ createEffect(prev => {
68
+ if (props.cursorStyle === prev)
69
+ return;
70
+ debug('Update Cursor to', props.cursorStyle);
71
+ map.getCanvas().style.cursor = props.cursorStyle;
72
+ return props.cursorStyle;
73
+ });
55
74
  //Update transition type
56
- createEffect(() => setTransitionType(props.transitionType));
75
+ createEffect(prev => {
76
+ if (props.transitionType === prev)
77
+ return;
78
+ debug('Update Transition to', props.transitionType);
79
+ setTransitionType(props.transitionType);
80
+ return props.transitionType;
81
+ });
57
82
  // Update projection
58
- createEffect(() => map.setProjection(props.options?.projection));
83
+ createEffect(prev => {
84
+ if (props.options?.projection === prev)
85
+ return;
86
+ debug('Update Projection to', props.options?.projection.name);
87
+ map.setProjection(props.options?.projection);
88
+ return props.options?.projection;
89
+ });
59
90
  // Update map style
60
- createEffect(() => {
61
- const style = props.options?.style;
62
- if (!map.isStyleLoaded())
91
+ createEffect(prev => {
92
+ const style = darkMode()
93
+ ? props.darkStyle || props.options?.style
94
+ : props.options?.style;
95
+ if (style === prev)
63
96
  return;
64
- const oldStyle = map.getStyle();
65
- const oldLayers = oldStyle.layers.filter(l => l.id.startsWith('cl-'));
66
- const oldSources = Object.keys(oldStyle.sources)
67
- .filter(s => s.startsWith('cl-'))
68
- .reduce((obj, key) => ({ ...obj, [key]: oldStyle.sources[key] }), {});
97
+ let oldLayers = [];
98
+ let oldSources = {};
99
+ debug('Update Mapstyle to', style);
100
+ if (map.isStyleLoaded()) {
101
+ const oldStyle = map.getStyle();
102
+ oldLayers = oldStyle.layers.filter(l => l.id.startsWith('cl-'));
103
+ oldSources = Object.keys(oldStyle.sources)
104
+ .filter(s => s.startsWith('cl-'))
105
+ .reduce((obj, key) => ({ ...obj, [key]: oldStyle.sources[key] }), {});
106
+ }
69
107
  map.setStyle(vectorStyleList[style] ||
70
108
  style || { version: 8, sources: {}, layers: [] });
71
109
  map.once('styledata', () => {
@@ -76,7 +114,8 @@ export const MapGL = props => {
76
114
  layers: [...newStyle.layers, ...oldLayers],
77
115
  });
78
116
  });
79
- });
117
+ return style;
118
+ }, props.options?.style);
80
119
  // Hook up viewport events
81
120
  createEffect(() => {
82
121
  const viewport = {
@@ -1,6 +1,6 @@
1
1
  import { onCleanup, createEffect, createContext, useContext, createUniqueId, } from 'solid-js';
2
2
  import { useMap } from '../MapGL';
3
- import { rasterStyleList } from '../../styles';
3
+ import { rasterStyleList } from '../../mapStyles';
4
4
  const SourceContext = createContext();
5
5
  export const useSourceId = () => useContext(SourceContext);
6
6
  export const Source = props => {
@@ -1,5 +1,6 @@
1
1
  const mapBase = 'mapbox://styles/mapbox';
2
2
  const gitBase = 'https://raw.githubusercontent.com';
3
+ const gishub = 'https://raw.githubusercontent.com/GIShub4/map-styles/main';
3
4
  export const vectorStyleList = {
4
5
  'mb:light': `${mapBase}/light-v10`,
5
6
  'mb:dark': `${mapBase}/dark-v10`,
@@ -32,6 +33,29 @@ export const vectorStyleList = {
32
33
  'mb:emerald': `${gitBase}/jingsam/mapbox-gl-styles/master/Emerald.json`,
33
34
  'mb:runner': `${gitBase}/jingsam/mapbox-gl-styles/master/Runner.json`,
34
35
  'mb:x-ray': `${gitBase}/jingsam/mapbox-gl-styles/master/X-ray.json`,
36
+ 'esri:blueprint': `${gishub}/esri:blueprint.json`,
37
+ 'esri:charted-territory': `${gishub}/esri:charted-territory.json`,
38
+ 'esri:colored-pencil': `${gishub}/esri:colored-pencil.json`,
39
+ 'esri:community': `${gishub}/esri:community.json`,
40
+ 'esri:mid-century': `${gishub}/esri:mid-century.json`,
41
+ 'esri:modern-antique': `${gishub}/esri:modern-antique.json`,
42
+ 'esri:national-geographic': `${gishub}/esri:national-geographic.json`,
43
+ 'esri:newspaper': `${gishub}/esri:newspaper.json`,
44
+ 'esri:open-street-map': `${gishub}/esri:open-street-map.json`,
45
+ 'esri:light-gray-canvas': `${gishub}/esri:light-gray-canvas.json`,
46
+ 'esri:dark-gray-canvas': `${gishub}/esri:dark-gray-canvas.json`,
47
+ 'esri:human-geography-light': `${gishub}/esri:human-geography-light.json`,
48
+ 'esri:human-geography-dark': `${gishub}/esri:human-geography-dark.json`,
49
+ 'esri:world-navigation-map': `${gishub}/esri:world-navigation-map.json`,
50
+ 'esri:world-street-map': `${gishub}/esri:world-street-map.json`,
51
+ 'esri:world-street-map-night': `${gishub}/esri:world-street-map-night.json`,
52
+ 'esri:world-terrain-base': `${gishub}/esri:world-terrain-base.json`,
53
+ 'esri:world-topographic-map': `${gishub}/esri:world-topographic-map.json`,
54
+ 'esri:chromium': `${gishub}/esri:chromium.json`,
55
+ 'esri:dreamcatcher': `${gishub}/esri:dreamcatcher.json`,
56
+ 'esri:seahaven': `${gishub}/esri:seahaven.json`,
57
+ 'esri:sangria': `${gishub}/esri:sangria.json`,
58
+ 'esri:mercurial': `${gishub}/esri:mercurial.json`,
35
59
  };
36
60
  export const rasterStyleList = {
37
61
  'osm:org': [
@@ -4,6 +4,7 @@ import type { MapboxOptions } from 'mapbox-gl/src/ui/map';
4
4
  import type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js';
5
5
  import type { LngLatBounds } from 'mapbox-gl/src/geo/lng_lat_bounds.js';
6
6
  import type { PaddingOptions } from 'mapbox-gl/src/geo/edge_insets.js';
7
+ import type { StyleSpecification } from 'mapbox-gl/src/style-spec/types.js';
7
8
  import type { JSX } from 'solid-js';
8
9
  export declare type Viewport = {
9
10
  id?: string;
@@ -49,7 +50,10 @@ export declare const MapGL: Component<{
49
50
  showOverdrawInspector?: boolean;
50
51
  /** Mouse Cursor Style */
51
52
  cursorStyle?: string;
53
+ darkStyle?: StyleSpecification | string;
54
+ disableResize?: boolean;
55
+ debug?: boolean;
52
56
  ref?: HTMLDivElement;
53
57
  /** Children within the Map Container */
54
- children?: Element | Element[] | null;
58
+ children?: any;
55
59
  }>;
@@ -30,6 +30,29 @@ export declare const vectorStyleList: {
30
30
  'mb:emerald': string;
31
31
  'mb:runner': string;
32
32
  'mb:x-ray': string;
33
+ 'esri:blueprint': string;
34
+ 'esri:charted-territory': string;
35
+ 'esri:colored-pencil': string;
36
+ 'esri:community': string;
37
+ 'esri:mid-century': string;
38
+ 'esri:modern-antique': string;
39
+ 'esri:national-geographic': string;
40
+ 'esri:newspaper': string;
41
+ 'esri:open-street-map': string;
42
+ 'esri:light-gray-canvas': string;
43
+ 'esri:dark-gray-canvas': string;
44
+ 'esri:human-geography-light': string;
45
+ 'esri:human-geography-dark': string;
46
+ 'esri:world-navigation-map': string;
47
+ 'esri:world-street-map': string;
48
+ 'esri:world-street-map-night': string;
49
+ 'esri:world-terrain-base': string;
50
+ 'esri:world-topographic-map': string;
51
+ 'esri:chromium': string;
52
+ 'esri:dreamcatcher': string;
53
+ 'esri:seahaven': string;
54
+ 'esri:sangria': string;
55
+ 'esri:mercurial': string;
33
56
  };
34
57
  export declare const rasterStyleList: {
35
58
  'osm:org': string[];
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.2.18",
2
+ "version": "1.3.2",
3
3
  "name": "solid-map-gl",
4
4
  "description": "Solid Component Library for Mapbox GL JS",
5
5
  "info": "Solid Component Library for Mapbox GL JS. Mapbox GL JS is a JavaScript library that renders interactive maps from vector tiles and Mapbox styles using WebGL. This project is intended to be as close as possible to the Mapbox GL JS API.",
@@ -52,7 +52,7 @@
52
52
  "devDependencies": {
53
53
  "jsdom": "^19.0.0",
54
54
  "mapbox-gl": "^2.8.2",
55
- "rollup": "^2.75.3",
55
+ "rollup": "^2.75.5",
56
56
  "rollup-plugin-import-css": "^3.0.3",
57
57
  "rollup-plugin-uglify": "^6.0.4",
58
58
  "rollup-preset-solid": "^1.4.0",
@@ -61,7 +61,7 @@
61
61
  "typescript": "^4.7.2",
62
62
  "vite": "^2.9.9",
63
63
  "vite-plugin-solid": "^2.2.6",
64
- "vitest": "^0.13.0"
64
+ "vitest": "^0.13.1"
65
65
  },
66
66
  "peerDependencies": {
67
67
  "mapbox-gl": "^2.8.2",