solid-map-gl 1.1.9 → 1.1.12

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/dist/esm/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{template,createComponent,insert,effect,classList}from"solid-js/web";import{useTransition,createContext,useContext,onCleanup,onMount,createEffect,createUniqueId,createSignal}from"solid-js";import mapboxgl from"mapbox-gl";const _tmpl$$2=template("<main><div></div></main>",4),[pending,start]=useTransition(),MapContext=createContext(),useMap=()=>useContext(MapContext),MapGL=n=>{let a,r,i;onCleanup(()=>a.remove()),onMount(()=>{a=new mapboxgl.Map({...n.options,container:r,bounds:n.viewport.bounds,center:n.viewport.center,zoom:n.viewport.zoom||null,pitch:n.viewport.pitch||null,bearing:n.viewport.bearing||null,fitBoundsOptions:{padding:n.viewport.padding}}),a.container=i}),createEffect(()=>n.onMouseMove&&a.on("mousemove",e=>n.onMouseMove(e.lngLat)));const e=e=>{e.isInternal||(e={center:a.getCenter(),zoom:a.getZoom(),pitch:a.getPitch(),bearing:a.getBearing(),padding:n.viewport.padding,bounds:n.viewport.bounds},n.onViewportChange(e))};createEffect(()=>n.onViewportChange&&a.on("dragend",e).on("moveend",e).on("zoomend",e).on("rotateend",e).on("pitchend",e).on("boxzoomend",e)),createEffect(e=>{return n.viewport.bounds!=e&&(e=a.cameraForBounds(n.viewport.bounds,{padding:n.viewport.padding}),n.onViewportChange({...n.viewport,...e})),n.viewport.bounds},n.viewport.bounds),createEffect(async e=>{var t=n.viewport,o={...t.zoom!=e.zoom&&{zoom:t.zoom},...t.padding!=e.padding&&{padding:t.padding},...t.bearing!=e.bearing&&{bearing:t.bearing},...t.pitch!=e.pitch&&{pitch:t.pitch},...t.center!=e.center&&{center:t.center.lng?[t.center.lng,t.center.lat]:t.center}};if(Object.keys(o).length)switch(a.stop(),n.transitionType){case"easeTo":a.easeTo(o,{isInternal:!0});case"jumpTo":a.jumpTo(o,{isInternal:!0});default:a.flyTo(o,{isInternal:!0})}return t},n.viewport);let t=0;return createEffect(()=>{n.triggerResize&&(t=0,window.requestAnimationFrame(function e(){t<15&&(t++,window.requestAnimationFrame(e),start(()=>a.resize()))}))}),createComponent(MapContext.Provider,{value:()=>a,get children(){const e=_tmpl$$2.cloneNode(!0),a=e.firstChild,t=i,o=("function"==typeof t?t(e):i=e,e.style.setProperty("height","100%"),e.style.setProperty("width","100%"),insert(e,()=>n.children,a),r);return"function"==typeof o?o(a):r=a,a.style.setProperty("height","100%"),a.style.setProperty("width","100%"),effect(e=>{var t=n.class||"",o=n.classList;return t!==e._v$&&(a.className=e._v$=t),e._v$2=classList(a,o,e._v$2),e},{_v$:void 0,_v$2:void 0}),e}})},SourceContext=createContext(),useSource=()=>useContext(SourceContext),SourceComponent=t=>{const o=useMap();return t.id=t.id||createUniqueId(),onMount(async()=>{o().isStyleLoaded()||await o().once("styledata"),o().getSource(t.id)||o().addSource(t.id,t.source)}),onCleanup(()=>{o().getStyle().layers.forEach(e=>e.source===t.id&&o().removeLayer(e.id)),o().getSource(t.id)&&o().removeSource(t.id)}),createEffect(async()=>{("geojson"===t.source.type||t.source.data)&&o().getSource(t.id)&&o().getSource(t.id).setData(t.source.data)}),createComponent(SourceContext.Provider,{get value(){return{id:t.id}},get children(){return t.children}})},diff=(a={},n={})=>{return[...new Set([...Object.keys(a),...Object.keys(n)])].reduce((e,t)=>{var o=a[t];return o!==n[t]&&e.push([t,o]),e},[])},Layer=o=>{const a=useMap(),t=useSource();return o.id=o.id||createUniqueId(),onMount(async()=>{a().isStyleLoaded()||await a().once("styledata"),a().getLayer(o.id)||a().addLayer(o.layer||{...o.style,id:o.id,source:t.id},o.beforeType?a().getStyle().layers.find(e=>e.type===o.beforeType).id:o.beforeId)}),createEffect(e=>{if(o.style&&a().getSource(t.id)&&a().getLayer(o.id))return o.style.layout!==(null==e?void 0:e.layout)&&diff(o.style.layout,null==e?void 0:e.layout).forEach(([e,t])=>a().setLayoutProperty(o.id,e,t,{validate:!1})),o.style.paint!==(null==e?void 0:e.paint)&&diff(o.style.paint,null==e?void 0:e.paint).forEach(([e,t])=>a().setPaintProperty(o.id,e,t,{validate:!1})),o.style.minzoom===(null==e?void 0:e.minzoom)&&o.style.maxzoom===(null==e?void 0:e.maxzoom)||a().setLayerZoomRange(o.id,o.style.minzoom,o.style.maxzoom),o.style.filter!==(null==e?void 0:e.filter)&&a().setFilter(o.id,o.style.filter,{validate:!1}),o.style},o.style),createEffect(e=>{if(void 0!==o.visible&&o.visible!==e&&a().getSource(t.id)&&a().getLayer(o.id))return a().setLayoutProperty(o.id,"visibility",o.visible?"visible":"none",{validate:!1}),o.visible},o.visible),createEffect(async()=>{o.filter&&(a().isStyleLoaded()||await a().once("styledata"),a().setFilter(o.id,o.filter))}),createEffect(async()=>{o.featureState&&o.featureState.id&&(a().isStyleLoaded()||await a().once("styledata"),a().removeFeatureState({source:t.id,sourceLayer:o.style["source-layer"]}),a().setFeatureState({source:t.id,sourceLayer:o.style["source-layer"],id:o.featureState.id},o.featureState.state))}),o.children},Fog=e=>{const t=useMap();return onMount(async()=>{t().isStyleLoaded()||await t().once("styledata"),t().setFog(e.style)}),onCleanup(()=>t().setFog(null)),createEffect(async()=>{void 0!==e.visible&&(t().isStyleLoaded()||await t().once("styledata"),t().setFog(e.visible?e.style:null))}),e.children},Sky=e=>{const t=useMap(),o="_sky";return onMount(async()=>{t().isStyleLoaded()||await t().once("styledata"),t().getLayer(o)||t().addLayer({...e.style,id:o})}),onCleanup(()=>t().getLayer(o)&&t().removeLayer(o)),createEffect(async()=>{void 0!==e.visible&&(t().isStyleLoaded()||await t().once("styledata"),t().setLayoutProperty(o,"visibility",e.visible?"visible":"none"))}),e.children},Terrain=e=>{const t=useMap(),o=useSource();return onMount(async()=>{t().isStyleLoaded()||await t().once("styledata"),t().setTerrain({...e.style,source:o.id})}),onCleanup(()=>t().setTerrain(null)),createEffect(async()=>{void 0!==e.visible&&(t().isStyleLoaded()||await t().once("styledata"),t().setTerrain(e.visible?e.style:null))}),e.children},Control=t=>{const o=useMap(),[e,a]=createSignal(null);return onMount(async()=>{let e;switch(t.type){case"navigation":e=new mapboxgl.NavigationControl(t.options);break;case"scale":e=new mapboxgl.ScaleControl(t.options);break;case"attribution":e=new mapboxgl.AttributionControl(t.options);break;case"fullscreen":e=new mapboxgl.FullscreenControl(t.options||{container:o().container});break;case"geolocate":e=new mapboxgl.GeolocateControl(t.options)}e&&o().addControl(e,t.position),a(e)}),onCleanup(()=>o().removeControl(e())),t.children},_tmpl$$1=template("<div></div>",2),Marker=t=>{const o=useMap();let a=null;return onMount(async()=>{var e;a=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(o())}),onCleanup(()=>a.remove()),createEffect(()=>a.setLngLat(t.lnglat)),[]},_tmpl$=template("<div></div>",2),Popup=t=>{const o=useMap();let a=null;return onMount(async()=>{var e;a=new mapboxgl.Popup(t.options).setLngLat(t.lnglat).setDOMContent((e=_tmpl$.cloneNode(!0),insert(e,()=>t.children),e)).addTo(o())}),onCleanup(()=>a.remove()),createEffect(()=>a.setLngLat(t.lnglat)),createEffect(()=>a.setDOMContent((()=>{var e=_tmpl$.cloneNode(!0);return insert(e,()=>t.children),e})())),[]},Image=o=>{const a=useMap();return onMount(async()=>{a().isStyleLoaded()||await a().once("styledata"),o.url?a().loadImage(o.url,(e,t)=>{if(e)throw e;a().hasImage(o.id)||a().addImage(o.id,t)}):a().hasImage(o.id)||a().addImage(o.id,o.image,o.options)}),onCleanup(()=>a().hasImage(o.id)&&a().removeImage(o.id)),createEffect(async()=>{o.image&&o.url||(o.url?a().loadImage(o.url,(e,t)=>{if(e)throw e;a().hasImage(o.id)||a().updateImage(o.id,t)}):a().hasImage(o.id)&&a().updateImage(o.id,o.image))}),[]};export{Control,Fog,Image,Layer,Marker,Popup,Sky,SourceComponent as Source,Terrain,MapGL as default,useMap};
1
+ import{template,createComponent,memo,effect,classList,insert}from"solid-js/web";import{useTransition,createContext,useContext,onMount,onCleanup,createEffect,createUniqueId,createSignal}from"solid-js";import mapboxgl 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","onMouseOnMove","onMouseEnter","onMouseLeave","onClick","onDblClick","onContextMenu","onTouchStart","onTouchEnd","onTouchCancel"],viewportEvents=["dragend","moveend","zoomend","pitchend","rotateend","boxzoomend"],_tmpl$$2=template("<section></section>",2),[pending,start]=useTransition(),MapContext=createContext(),useMap=()=>useContext(MapContext),MapGL=a=>{let n,t,o=(onMount(()=>{n=new mapboxgl.Map({...a.options,container:t,interactive:!!a.onViewportChange,bounds:a.viewport.bounds,center:a.viewport.center,zoom:a.viewport.zoom||null,pitch:a.viewport.pitch||null,bearing:a.viewport.bearing||null,fitBoundsOptions:{padding:a.viewport.padding}})}),onCleanup(()=>{mapEvents.forEach(t=>{a[t]&&n.off(t.slice(2).toLowerCase(),e=>a[t](e))}),n.remove()}),createEffect(()=>mapEvents.forEach(t=>{var e;a[t]&&(e=t.slice(2).toLowerCase(),n.off(e,e=>a[t](e)).on(e,e=>a[t](e)))})),createEffect(()=>n.showTileBoundaries=a.showTileBoundaries),createEffect(()=>n.showTerrainWireframe=a.showTerrainWireframe),createEffect(()=>n.showPadding=a.showPadding),createEffect(()=>n.showCollisionBoxes=a.showCollisionBoxes),createEffect(()=>n.showOverdrawInspector=a.showOverdrawInspector),createEffect(()=>n.getCanvas().style.cursor=a.cursorStyle),createEffect(e=>e!==a.options.style&&n.setStyle(a.options.style),a.options.style),createEffect(()=>{a.onViewportChange&&viewportEvents.forEach(e=>n.on(e,e=>{e.originalEvent&&a.onViewportChange({center:n.getCenter(),zoom:n.getZoom(),pitch:n.getPitch(),bearing:n.getBearing(),padding:a.viewport.padding,bounds:a.viewport.bounds})}))}),createEffect(e=>{return a.viewport.bounds!=e&&(e=n.cameraForBounds(a.viewport.bounds,{padding:a.viewport.padding}),a.onViewportChange({...a.viewport,...e})),a.viewport.bounds},a.viewport.bounds),createEffect(async e=>{var t=a.viewport,o={...t.zoom!=e.zoom&&{zoom:t.zoom},...t.padding!=e.padding&&{padding:t.padding},...t.bearing!=e.bearing&&{bearing:t.bearing},...t.pitch!=e.pitch&&{pitch:t.pitch},...t.center!=e.center&&{center:t.center.lng?[t.center.lng,t.center.lat]:t.center}};if(Object.keys(o).length)switch(n.stop(),a.transitionType){case"easeTo":n.easeTo(o);case"jumpTo":n.jumpTo(o);default:n.flyTo(o)}return o},a.viewport),0);return createEffect(()=>{a.triggerResize&&(o=0,window.requestAnimationFrame(function e(){o<15&&(o++,window.requestAnimationFrame(e),start(()=>n.resize()))}))}),createComponent(MapContext.Provider,{value:()=>n,get children(){return[memo(()=>a.children),(()=>{const n=_tmpl$$2.cloneNode(!0),e=t;return"function"==typeof e?e(n):t=n,n.style.setProperty("height","100%"),n.style.setProperty("width","100%"),effect(e=>{var t=a.class||"",o=a.classList;return t!==e._v$&&(n.className=e._v$=t),e._v$2=classList(n,o,e._v$2),e},{_v$:void 0,_v$2:void 0}),n})()]}})},SourceContext=createContext(),useSource=()=>useContext(SourceContext),SourceComponent=t=>{const o=useMap();return t.id=t.id||createUniqueId(),onMount(async()=>{o().isStyleLoaded()||await o().once("styledata"),o().getSource(t.id)||o().addSource(t.id,t.source)}),onCleanup(()=>{o().getStyle().layers.forEach(e=>e.source===t.id&&o().removeLayer(e.id)),o().getSource(t.id)&&o().removeSource(t.id)}),createEffect(async()=>{("geojson"===t.source.type||t.source.data)&&o().style&&o().getSource(t.id)&&o().getSource(t.id).setData(t.source.data)}),createComponent(SourceContext.Provider,{get value(){return{id:t.id}},get children(){return t.children}})},diff=(n={},a={})=>{return[...new Set([...Object.keys(n),...Object.keys(a)])].reduce((e,t)=>{var o=n[t];return o!==a[t]&&e.push([t,o]),e},[])},Layer=o=>{const n=useMap(),t=useSource();return o.id=o.id||createUniqueId(),onMount(async()=>{n().isStyleLoaded()||await n().once("styledata"),n().getLayer(o.id)||n().addLayer(o.layer||{...o.style,id:o.id,source:t.id},o.beforeType?n().getStyle().layers.find(e=>e.type===o.beforeType).id:o.beforeId)}),onCleanup(()=>{const e=n().getLayer(o.id);e&&(layerEvents.forEach(t=>{o[t]&&e.off(t.slice(2).toLowerCase(),e=>o[t](e))}),n().removeLayer(o.id))}),createEffect(()=>layerEvents.forEach(t=>{var e;o[t]&&(e=t.slice(2).toLowerCase(),n().off(e,o.id,e=>o[t](e)).on(e,o.id,e=>o[t](e)))})),createEffect(e=>{if(o.style&&n().style&&n().getSource(t.id)&&n().getLayer(o.id))return o.style.layout!==(null==e?void 0:e.layout)&&diff(o.style.layout,null==e?void 0:e.layout).forEach(([e,t])=>n().setLayoutProperty(o.id,e,t,{validate:!1})),o.style.paint!==(null==e?void 0:e.paint)&&diff(o.style.paint,null==e?void 0:e.paint).forEach(([e,t])=>n().setPaintProperty(o.id,e,t,{validate:!1})),o.style.minzoom===(null==e?void 0:e.minzoom)&&o.style.maxzoom===(null==e?void 0:e.maxzoom)||n().setLayerZoomRange(o.id,o.style.minzoom,o.style.maxzoom),o.style.filter!==(null==e?void 0:e.filter)&&n().setFilter(o.id,o.style.filter,{validate:!1}),o.style},o.style),createEffect(e=>{if(void 0!==o.visible&&o.visible!==e&&n().getSource(t.id)&&n().getLayer(o.id))return n().setLayoutProperty(o.id,"visibility",o.visible?"visible":"none",{validate:!1}),o.visible},o.visible),createEffect(async()=>{o.filter&&(n().isStyleLoaded()||await n().once("styledata"),n().setFilter(o.id,o.filter))}),createEffect(async()=>{o.featureState&&o.featureState.id&&(n().isStyleLoaded()||await n().once("styledata"),n().removeFeatureState({source:t.id,sourceLayer:o.style["source-layer"]}),n().setFeatureState({source:t.id,sourceLayer:o.style["source-layer"],id:o.featureState.id},o.featureState.state))}),o.children},Fog=e=>{const t=useMap();return onMount(async()=>{t().isStyleLoaded()||await t().once("styledata"),t().setFog(e.style)}),onCleanup(()=>t().setFog(null)),createEffect(async()=>{void 0!==e.visible&&(t().isStyleLoaded()||await t().once("styledata"),t().setFog(e.visible?e.style:null))}),e.children},Sky=e=>{const t=useMap(),o="_sky";return onMount(async()=>{t().isStyleLoaded()||await t().once("styledata"),t().getLayer(o)||t().addLayer({...e.style,id:o})}),onCleanup(()=>t().getLayer(o)&&t().removeLayer(o)),createEffect(async()=>{void 0!==e.visible&&(t().isStyleLoaded()||await t().once("styledata"),t().setLayoutProperty(o,"visibility",e.visible?"visible":"none"))}),e.children},Terrain=e=>{const t=useMap(),o=useSource();return onMount(async()=>{t().isStyleLoaded()||await t().once("styledata"),t().setTerrain({...e.style,source:o.id})}),onCleanup(()=>t().setTerrain(null)),createEffect(async()=>{void 0!==e.visible&&(t().isStyleLoaded()||await t().once("styledata"),t().setTerrain(e.visible?e.style:null))}),e.children},Control=t=>{const o=useMap(),[e,n]=createSignal(null);return onMount(async()=>{let e;switch(t.type){case"navigation":e=new mapboxgl.NavigationControl(t.options);break;case"scale":e=new mapboxgl.ScaleControl(t.options);break;case"attribution":e=new mapboxgl.AttributionControl(t.options);break;case"fullscreen":e=new mapboxgl.FullscreenControl(t.options||{container:o().container});break;case"geolocate":e=new mapboxgl.GeolocateControl(t.options)}e&&o().addControl(e,t.position),n(e)}),onCleanup(()=>o().removeControl(e())),t.children},_tmpl$$1=template("<div></div>",2),Marker=t=>{const o=useMap();let n=null;return onMount(async()=>{var e;n=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(o())}),onCleanup(()=>n.remove()),createEffect(()=>n.setLngLat(t.lnglat)),[]},_tmpl$=template("<div></div>",2),Popup=t=>{const o=useMap();let n=null;return onMount(async()=>{var e;n=new mapboxgl.Popup(t.options).setLngLat(t.lnglat).setDOMContent((e=_tmpl$.cloneNode(!0),insert(e,()=>t.children),e)).addTo(o())}),onCleanup(()=>n.remove()),createEffect(()=>n.setLngLat(t.lnglat)),createEffect(()=>n.setDOMContent((()=>{var e=_tmpl$.cloneNode(!0);return insert(e,()=>t.children),e})())),[]},Image=o=>{const n=useMap();return onMount(async()=>{n().isStyleLoaded()||await n().once("styledata"),o.url?n().loadImage(o.url,(e,t)=>{if(e)throw e;n().hasImage(o.id)||n().addImage(o.id,t)}):n().hasImage(o.id)||n().addImage(o.id,o.image,o.options)}),onCleanup(()=>n().hasImage(o.id)&&n().removeImage(o.id)),createEffect(async()=>{o.image&&o.url||(o.url?n().loadImage(o.url,(e,t)=>{if(e)throw e;n().hasImage(o.id)||n().updateImage(o.id,t)}):n().style&&n().hasImage(o.id)&&n().updateImage(o.id,o.image))}),[]};export{Control,Fog,Image,Layer,Marker,Popup,Sky,SourceComponent as Source,Terrain,MapGL as default,useMap};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/components/MapGL/index.tsx","../../src/components/Source/index.tsx","../../src/components/Layer/index.tsx","../../src/components/Fog/index.tsx","../../src/components/Sky/index.tsx","../../src/components/Terrain/index.tsx","../../src/components/Control/index.tsx","../../src/components/Marker/index.tsx","../../src/components/Popup/index.tsx","../../src/components/Image/index.tsx"],"sourcesContent":["import {\n createEffect,\n onMount,\n onCleanup,\n createContext,\n useContext,\n Component,\n useTransition,\n} from 'solid-js'\nimport mapboxgl from 'mapbox-gl'\nimport 'mapbox-gl/dist/mapbox-gl.css'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type MapboxOptions from 'mapbox-gl/src/ui/map'\nimport type MapMouseEvent from 'mapbox-gl/src/ui/events'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\nimport type { LngLatBounds } from 'mapbox-gl/src/geo/lng_lat_bounds.js'\n\nexport type Viewport = {\n center?: LngLatLike\n bounds?: LngLatBounds\n zoom?: number\n pitch?: number\n bearing?: number\n padding?: number\n}\n\nconst [pending, start] = useTransition()\n\nconst MapContext = createContext<MapboxMap>()\nconst useMap = () => useContext(MapContext)\n\nconst MapGL: Component<{\n class?: string\n classList?: {\n [k: string]: boolean | undefined\n }\n viewport?: Viewport\n options?: MapboxOptions\n children?: Element[]\n triggerResize?: boolean\n transitionType?: 'flyTo' | 'easeTo' | 'jumpTo'\n onMouseMove?: (event: MapMouseEvent) => void\n onViewportChange?: (viewport: Viewport) => void\n}> = props => {\n let map: MapboxMap\n let mapRef: HTMLDivElement\n let containerRef: HTMLElement\n\n onCleanup(() => map.remove())\n\n onMount(() => {\n map = new mapboxgl.Map({\n ...props.options,\n container: mapRef,\n bounds: props.viewport.bounds,\n center: props.viewport.center,\n zoom: props.viewport.zoom || null,\n pitch: props.viewport.pitch || null,\n bearing: props.viewport.bearing || null,\n fitBoundsOptions: { padding: props.viewport.padding },\n } as MapboxOptions)\n \n map.container = containerRef\n })\n\n createEffect(\n () =>\n props.onMouseMove &&\n map.on('mousemove', event => props.onMouseMove(event.lngLat))\n )\n\n const _onViewportChange = evt => {\n if (evt.isInternal) return\n const viewport: Viewport = {\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 props.onViewportChange(viewport)\n }\n\n createEffect(\n () =>\n props.onViewportChange &&\n map\n .on('dragend', _onViewportChange)\n .on('moveend', _onViewportChange)\n .on('zoomend', _onViewportChange)\n .on('rotateend', _onViewportChange)\n .on('pitchend', _onViewportChange)\n .on('boxzoomend', _onViewportChange)\n )\n\n createEffect(prev => {\n if (props.viewport.bounds != prev) {\n const camera = map.cameraForBounds(props.viewport.bounds, {\n padding: props.viewport.padding,\n })\n props.onViewportChange({\n ...props.viewport,\n ...camera,\n })\n }\n return props.viewport.bounds\n }, props.viewport.bounds)\n\n createEffect(async (prev: Viewport) => {\n const vp: Viewport = props.viewport\n const nvp: Viewport = {\n ...(vp.zoom != prev.zoom && { zoom: vp.zoom }),\n ...(vp.padding != prev.padding && { padding: vp.padding }),\n ...(vp.bearing != prev.bearing && { bearing: vp.bearing }),\n ...(vp.pitch != prev.pitch && { pitch: vp.pitch }),\n ...(vp.center != prev.center && {\n center: vp.center.lng ? [vp.center.lng, vp.center.lat] : vp.center,\n }),\n }\n if (Object.keys(nvp).length) {\n map.stop()\n switch (props.transitionType) {\n case 'easeTo':\n map.easeTo(nvp, { isInternal: true })\n case 'jumpTo':\n map.jumpTo(nvp, { isInternal: true })\n default:\n map.flyTo(nvp, { isInternal: true })\n }\n }\n return vp\n }, props.viewport)\n\n let index = 0\n\n createEffect(() => {\n if (props.triggerResize) {\n index = 0\n window.requestAnimationFrame(function loop() {\n if (index < 15) {\n index++\n window.requestAnimationFrame(loop)\n start(() => map.resize())\n }\n })\n }\n })\n\n return (\n <MapContext.Provider value={() => map}>\n <main ref={containerRef} style={{ height: '100%', width: '100%' }}>\n {props.children}\n <div\n ref={mapRef}\n class={props.class || ''}\n classList={props.classList}\n style={{ height: '100%', width: '100%' }}></div>\n </main>\n </MapContext.Provider>\n )\n}\n\nexport { MapGL as default, useMap }\n","import {\n onMount,\n onCleanup,\n createEffect,\n Component,\n createContext,\n useContext,\n createUniqueId,\n} from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n Source,\n SourceSpecification,\n} from 'mapbox-gl/src/style-spec/types.js'\n\nconst SourceContext = createContext<Source>()\n\nconst useSource = (): Source => useContext(SourceContext)\n\nconst SourceComponent: Component<{\n id?: string\n source: SourceSpecification\n}> = props => {\n const map: MapboxMap = useMap()\n props.id = props.id || createUniqueId()\n // Add Source\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n !map().getSource(props.id) && map().addSource(props.id, props.source)\n })\n\n // Remove Source\n onCleanup(() => {\n map()\n .getStyle()\n .layers.forEach(\n layer => layer.source === props.id && map().removeLayer(layer.id)\n )\n map().getSource(props.id) && map().removeSource(props.id)\n })\n\n // Update GeoJSON Data\n createEffect(async () => {\n if (props.source.type !== 'geojson' && !props.source.data) return\n\n map().getSource(props.id) &&\n map().getSource(props.id).setData(props.source.data)\n })\n\n return (\n <SourceContext.Provider value={{ id: props.id }}>\n {props.children}\n </SourceContext.Provider>\n )\n}\n\nexport { SourceComponent as default, useSource }\n","import { onMount, createEffect, Component, createUniqueId } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport { useSource } from '../Source'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n FilterSpecification,\n StyleSpecification,\n SourceSpecification,\n} from 'mapbox-gl/src/style-spec/types.js'\nimport type { CustomLayerInterface } from 'mapbox-gl/src/style/style_layer/custom_style_layer'\n\nconst diff = (\n newProps: StyleSpecification = {},\n prevProps: StyleSpecification = {}\n) => {\n const keys = new Set([...Object.keys(newProps), ...Object.keys(prevProps)])\n return [...keys].reduce((acc, key: string) => {\n const value = newProps[key]\n if (value !== prevProps[key]) {\n acc.push([key, value])\n }\n return acc\n }, [])\n}\n\nconst Layer: Component<{\n id?: string\n style?: StyleSpecification\n layer?: CustomLayerInterface\n filter?: FilterSpecification\n visible?: boolean\n sourceId?: string\n beforeType?:\n | 'background'\n | 'fill'\n | 'line'\n | 'symbol'\n | 'raster'\n | 'circle'\n | 'fill-extrusion'\n | 'heatmap'\n | 'hillshade'\n | 'sky'\n beforeId?: string\n featureState?: { id: number | string; state: object }\n}> = props => {\n const map: MapboxMap = useMap()\n const source: SourceSpecification = useSource()\n props.id = props.id || createUniqueId()\n // Add Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n\n if (map().getLayer(props.id)) return\n\n map().addLayer(\n props.layer || {\n ...props.style,\n id: props.id,\n source: source.id,\n },\n props.beforeType\n ? map()\n .getStyle()\n .layers.find(l => l.type === props.beforeType).id\n : props.beforeId\n )\n })\n\n // Update Style\n createEffect((prev: StyleSpecification) => {\n if (\n !props.style ||\n !map().getSource(source.id) ||\n !map().getLayer(props.id)\n )\n return\n\n if (props.style.layout !== prev?.layout)\n diff(props.style.layout, prev?.layout).forEach(([key, value]) =>\n map().setLayoutProperty(props.id, key, value, { validate: false })\n )\n\n if (props.style.paint !== prev?.paint)\n diff(props.style.paint, prev?.paint).forEach(([key, value]) =>\n map().setPaintProperty(props.id, key, value, { validate: false })\n )\n\n if (\n props.style.minzoom !== prev?.minzoom ||\n props.style.maxzoom !== prev?.maxzoom\n )\n map().setLayerZoomRange(\n props.id,\n props.style.minzoom,\n props.style.maxzoom\n )\n\n if (props.style.filter !== prev?.filter)\n map().setFilter(props.id, props.style.filter, { validate: false })\n\n return props.style\n }, props.style)\n\n // Update Visibility\n createEffect((prev: boolean) => {\n if (\n props.visible === undefined ||\n props.visible === prev ||\n !map().getSource(source.id) ||\n !map().getLayer(props.id)\n )\n return\n\n map().setLayoutProperty(\n props.id,\n 'visibility',\n props.visible ? 'visible' : 'none',\n { validate: false }\n )\n return props.visible\n }, props.visible)\n\n // Update Filter\n createEffect(async () => {\n if (!props.filter) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFilter(props.id, props.filter)\n })\n\n // Update Feature State\n createEffect(async () => {\n if (!props.featureState || !props.featureState.id) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n\n map().removeFeatureState({\n source: source.id,\n sourceLayer: props.style['source-layer'],\n })\n map().setFeatureState(\n {\n source: source.id,\n sourceLayer: props.style['source-layer'],\n id: props.featureState.id,\n },\n props.featureState.state\n )\n })\n\n return props.children\n}\n\nexport default Layer\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { FogSpecification } from 'mapbox-gl/src/style-spec/types.js'\n\nconst Fog: Component<{\n style: FogSpecification\n visible?: boolean\n}> = props => {\n const map: MapboxMap = useMap()\n // Add Fog Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFog(props.style)\n })\n // Remove Fog Layer\n onCleanup(() => map().setFog(null))\n\n // Update Visibility\n createEffect(async () => {\n if (props.visible === undefined) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFog(props.visible ? props.style : null)\n })\n\n return props.children\n}\n\nexport default Fog\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { StyleSpecification } from 'mapbox-gl/src/style-spec/types.js'\n\nconst Sky: Component<{\n style: StyleSpecification\n visible?: boolean\n}> = props => {\n const map: MapboxMap = useMap()\n const layerId = '_sky'\n // Add Sky Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n !map().getLayer(layerId) && map().addLayer({ ...props.style, id: layerId })\n })\n\n // Remove Sky Layer\n onCleanup(() => map().getLayer(layerId) && map().removeLayer(layerId))\n\n // Update Visibility\n createEffect(async () => {\n if (props.visible === undefined) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setLayoutProperty(\n layerId,\n 'visibility',\n props.visible ? 'visible' : 'none'\n )\n })\n\n return props.children\n}\n\nexport default Sky\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport { useSource } from '../Source'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n TerrainSpecification,\n SourceSpecification,\n} from 'mapbox-gl/src/style-spec/types.js'\n\nconst Terrain: Component<{\n style: TerrainSpecification\n visible?: boolean\n}> = props => {\n const map: MapboxMap = useMap()\n const source: SourceSpecification = useSource()\n\n // Add Terrain Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setTerrain({ ...props.style, source: source.id })\n })\n\n // Remove Terrain Layer\n onCleanup(() => map().setTerrain(null))\n\n // Update Visibility\n createEffect(async () => {\n if (props.visible === undefined) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setTerrain(props.visible ? props.style : null)\n })\n\n return props.children\n}\n\nexport default Terrain\n","import { onMount, onCleanup, createSignal, Component, lazy } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { Options as AttributionOptions } from 'mapbox-gl/src/ui/control/attribution_control'\nimport type { Options as FullscreenOptions } from 'mapbox-gl/src/ui/control/fullscreen_control'\nimport type { Options as GeolocateOptions } from 'mapbox-gl/src/ui/control/geolocate_control'\nimport type { Options as NavigationOptions } from 'mapbox-gl/src/ui/control/navigation_control'\nimport type { Options as ScaleOptions } from 'mapbox-gl/src/ui/control/scale_control'\n\nconst Control: Component<{\n type:\n | 'navigation'\n | 'scale'\n | 'attribution'\n | 'fullscreen'\n | 'geolocate'\n | 'language'\n | 'traffic'\n options?:\n | NavigationOptions\n | ScaleOptions\n | AttributionOptions\n | FullscreenOptions\n | GeolocateOptions\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n}> = props => {\n const map: MapboxMap = useMap()\n const [control, setControl] = createSignal(null)\n // Add Control\n onMount(async () => {\n let control\n\n switch (props.type) {\n case 'navigation':\n control = new mapboxgl.NavigationControl(props.options)\n break\n case 'scale':\n control = new mapboxgl.ScaleControl(props.options)\n break\n case 'attribution':\n control = new mapboxgl.AttributionControl(props.options)\n break\n case 'fullscreen':\n control = new mapboxgl.FullscreenControl(\n props.options || { container: map().container }\n )\n break\n case 'geolocate':\n control = new mapboxgl.GeolocateControl(props.options)\n break\n // case 'language':\n // // @ts-ignore\n // const MapboxLanguage = (await import('@mapbox/mapbox-gl-language'))\n // .default\n // control = new MapboxLanguage(props.options)\n // break\n // case 'traffic':\n // // @ts-ignore\n // const MapboxTraffic = (await import('@mapbox/mapbox-gl-traffic'))\n // .default\n // // @ts-ignore\n // await import('@mapbox/mapbox-gl-traffic/mapbox-gl-traffic.css')\n // control = new MapboxTraffic(props.options)\n // break\n }\n control && map().addControl(control, props.position)\n setControl(control)\n })\n\n onCleanup(() => map().removeControl(control()))\n\n return props.children\n}\n\nexport default Control\n","import { onMount, onCleanup, createEffect, Component, children } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { MarkerSpecification } from 'mapbox-gl/src/style-spec/types.js'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\n\nconst Marker: Component<{\n options?: MarkerSpecification\n lnglat: LngLatLike\n}> = props => {\n const map: MapboxMap = useMap()\n let marker = null\n\n // Add Marker\n onMount(async () => {\n marker = new mapboxgl.Marker(props.options)\n .setLngLat(props.lnglat)\n .setPopup(\n props.children\n ? new mapboxgl.Popup().setDOMContent(<div>{props.children}</div>)\n : null\n )\n .addTo(map())\n })\n // Remove Marker\n onCleanup(() => marker.remove())\n\n // Update Position\n createEffect(() => marker.setLngLat(props.lnglat))\n\n return <></>\n}\n\nexport default Marker\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { PopupSpecification } from 'mapbox-gl/src/style-spec/types.js'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\n\nconst Popup: Component<{\n options?: PopupSpecification\n lnglat: LngLatLike\n}> = props => {\n const map: MapboxMap = useMap()\n let popup = null\n\n // Add Popup\n onMount(async () => {\n popup = new mapboxgl.Popup(props.options)\n .setLngLat(props.lnglat)\n .setDOMContent(<div>{props.children}</div>)\n .addTo(map())\n })\n // Remove Popup\n onCleanup(() => popup.remove())\n\n // Update Position\n createEffect(() => popup.setLngLat(props.lnglat))\n\n // Update Content\n createEffect(() => popup.setDOMContent(<div>{props.children}</div>))\n\n return <></>\n}\n\nexport default Popup\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n StyleImageInterface,\n StyleImageMetadata,\n} from 'mapbox-gl/src/style/style_image'\n\nconst Image: Component<{\n id: string\n url?: string\n image?:\n | HTMLImageElement\n | ImageBitmap\n | ImageData\n | { width: number; height: number; data: Uint8Array | Uint8ClampedArray }\n | StyleImageInterface\n options?: StyleImageMetadata\n}> = props => {\n const map: MapboxMap = useMap()\n // Add Image\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n if (props.url) {\n map().loadImage(props.url, (error, image) => {\n if (error) throw error\n !map().hasImage(props.id) && map().addImage(props.id, image)\n })\n } else {\n !map().hasImage(props.id) &&\n map().addImage(props.id, props.image, props.options)\n }\n })\n // Remove Image\n onCleanup(() => map().hasImage(props.id) && map().removeImage(props.id))\n\n // Update Image\n createEffect(async () => {\n if (props.image && props.url) return\n\n if (props.url) {\n map().loadImage(props.url, (error, image) => {\n if (error) throw error\n !map().hasImage(props.id) && map().updateImage(props.id, image)\n })\n } else {\n map().hasImage(props.id) && map().updateImage(props.id, props.image)\n }\n })\n\n return <></>\n}\n\nexport default Image\n"],"names":["pending","start","useTransition","MapContext","createContext","useMap","useContext","MapGL","props","map","mapRef","containerRef","onCleanup","remove","onMount","mapboxgl","Map","options","container","bounds","viewport","center","zoom","pitch","bearing","fitBoundsOptions","padding","createEffect","onMouseMove","on","event","lngLat","_onViewportChange","evt","isInternal","getCenter","getZoom","getPitch","getBearing","onViewportChange","prev","camera","cameraForBounds","vp","nvp","lng","lat","Object","keys","length","stop","transitionType","easeTo","jumpTo","flyTo","index","triggerResize","window","requestAnimationFrame","loop","resize","Provider","value","children","class","classList","SourceContext","useSource","SourceComponent","id","createUniqueId","async","isStyleLoaded","once","getSource","addSource","source","getStyle","layers","forEach","layer","removeLayer","removeSource","type","data","setData","diff","newProps","prevProps","Set","reduce","acc","key","push","Layer","getLayer","addLayer","style","beforeType","find","l","beforeId","layout","setLayoutProperty","validate","paint","setPaintProperty","minzoom","maxzoom","setLayerZoomRange","filter","setFilter","undefined","visible","featureState","removeFeatureState","sourceLayer","setFeatureState","state","Fog","setFog","Sky","layerId","Terrain","setTerrain","Control","control","setControl","createSignal","NavigationControl","ScaleControl","AttributionControl","FullscreenControl","GeolocateControl","addControl","position","removeControl","Marker","marker","setLngLat","lnglat","setPopup","Popup","setDOMContent","addTo","popup","Image","url","loadImage","error","image","hasImage","addImage","removeImage","updateImage"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/events.ts","../../src/components/MapGL/index.tsx","../../src/components/Source/index.tsx","../../src/components/Layer/index.tsx","../../src/components/Fog/index.tsx","../../src/components/Sky/index.tsx","../../src/components/Terrain/index.tsx","../../src/components/Control/index.tsx","../../src/components/Marker/index.tsx","../../src/components/Popup/index.tsx","../../src/components/Image/index.tsx"],"sourcesContent":["const mapEvents: string[] = [\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseOver',\n 'onMouseOut',\n 'onMouseMove',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onPreClick',\n 'onClick',\n 'onDblClick',\n 'onContextMenu',\n 'onTouchStart',\n 'onTouchEnd',\n 'onTouchCancel',\n 'onWheel',\n 'onResize',\n 'onRemove',\n 'onTouchMove',\n 'onMoveStart',\n 'onMove',\n 'onMoveEnd',\n 'onDragStart',\n 'onDrag',\n 'onDragEnd',\n 'onZoomStart',\n 'onZoom',\n 'onZoomEnd',\n 'onRotateStart',\n 'onRotate',\n 'onRotatEnd',\n 'onPitchStart',\n 'onPitch',\n 'onPitchEnd',\n 'onBoxZoomStart',\n 'onBoxZoomEnd',\n 'onBoxZoomCancel',\n 'onWebglContextLost',\n 'onWebglContextRestored',\n 'onLoad',\n 'onRender',\n 'onIdle',\n 'onError',\n 'onData',\n 'onStyleData',\n 'onSourceData',\n 'onDataLoading',\n 'onStyleDataLoading',\n 'onSourceDataLoading',\n 'onStyleImageMissing',\n]\n\nconst layerEvents: string[] = [\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseOver',\n 'onMouseOut',\n 'onMouseOnMove',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onClick',\n 'onDblClick',\n 'onContextMenu',\n 'onTouchStart',\n 'onTouchEnd',\n 'onTouchCancel',\n]\n\nconst viewportEvents: string[] = [\n 'dragend',\n 'moveend',\n 'zoomend',\n 'pitchend',\n 'rotateend',\n 'boxzoomend',\n]\n\nexport { mapEvents, layerEvents, viewportEvents }\n","import {\n createEffect,\n onMount,\n onCleanup,\n createContext,\n useContext,\n Component,\n useTransition,\n} from 'solid-js'\nimport { mapEvents, viewportEvents } from '../../events'\nimport mapboxgl from 'mapbox-gl'\nimport 'mapbox-gl/dist/mapbox-gl.css'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type MapboxOptions from 'mapbox-gl/src/ui/map'\nimport type MapMouseEvent from 'mapbox-gl/src/ui/events'\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'\n\nexport type Viewport = {\n center?: LngLatLike\n bounds?: LngLatBounds\n zoom?: number\n pitch?: number\n bearing?: number\n padding?: PaddingOptions\n}\n\nconst [pending, start] = useTransition()\n\nconst MapContext = createContext<MapboxMap>()\nconst useMap = () => useContext(MapContext)\n\nconst MapGL: Component<{\n class?: string\n classList?: {\n [k: string]: boolean | undefined\n }\n viewport?: Viewport\n options?: MapboxOptions\n children?: Element | Element[]\n triggerResize?: boolean\n transitionType?: 'flyTo' | 'easeTo' | 'jumpTo'\n onMouseMove?: (event: MapMouseEvent) => void\n onViewportChange?: (viewport: Viewport) => void\n showTileBoundaries?: boolean\n showTerrainWireframe?: boolean\n showPadding?: boolean\n showCollisionBoxes?: boolean\n showOverdrawInspector?: boolean\n repaint?: boolean\n cursorStyle?: string\n}> = props => {\n let map: MapboxMap\n let mapRef: HTMLDivElement\n\n onMount(() => {\n map = new mapboxgl.Map({\n ...props.options,\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\n onCleanup(() => {\n mapEvents.forEach(item => {\n props[item] && map.off(item.slice(2).toLowerCase(), e => props[item](e))\n })\n map.remove()\n })\n\n // Hook up events\n createEffect(() =>\n mapEvents.forEach(item => {\n if (props[item]) {\n const eventString = item.slice(2).toLowerCase()\n map\n .off(eventString, e => props[item](e))\n .on(eventString, e => props[item](e))\n }\n })\n )\n\n // Update debug features\n createEffect(() => (map.showTileBoundaries = props.showTileBoundaries))\n createEffect(() => (map.showTerrainWireframe = props.showTerrainWireframe))\n createEffect(() => (map.showPadding = props.showPadding))\n createEffect(() => (map.showCollisionBoxes = props.showCollisionBoxes))\n createEffect(() => (map.showOverdrawInspector = props.showOverdrawInspector))\n createEffect(() => (map.getCanvas().style.cursor = props.cursorStyle))\n\n // Update map style\n createEffect(\n prev => prev !== props.options.style && map.setStyle(props.options.style),\n props.options.style\n )\n\n // Update Viewport\n createEffect(() => {\n props.onViewportChange &&\n viewportEvents.forEach(item =>\n map.on(item, evt => {\n if (!evt.originalEvent) return\n props.onViewportChange({\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 )\n })\n\n // Update boundaries\n createEffect(prev => {\n if (props.viewport.bounds != prev) {\n const camera = map.cameraForBounds(props.viewport.bounds, {\n padding: props.viewport.padding,\n })\n props.onViewportChange({\n ...props.viewport,\n ...camera,\n })\n }\n return props.viewport.bounds\n }, props.viewport.bounds)\n\n createEffect(async (prev: Viewport) => {\n const viewport: Viewport = props.viewport\n const newViewport: Viewport = {\n ...(viewport.zoom != prev.zoom && { zoom: viewport.zoom }),\n ...(viewport.padding != prev.padding && { padding: viewport.padding }),\n ...(viewport.bearing != prev.bearing && { bearing: viewport.bearing }),\n ...(viewport.pitch != prev.pitch && { pitch: viewport.pitch }),\n ...(viewport.center != prev.center && {\n center: viewport.center.lng\n ? [viewport.center.lng, viewport.center.lat]\n : viewport.center,\n }),\n }\n if (Object.keys(newViewport).length) {\n map.stop()\n switch (props.transitionType) {\n case 'easeTo':\n map.easeTo(newViewport)\n case 'jumpTo':\n map.jumpTo(newViewport)\n default:\n map.flyTo(newViewport)\n }\n }\n return newViewport\n }, props.viewport)\n\n let index = 0\n\n createEffect(() => {\n if (props.triggerResize) {\n index = 0\n window.requestAnimationFrame(function loop() {\n if (index < 15) {\n index++\n window.requestAnimationFrame(loop)\n start(() => map.resize())\n }\n })\n }\n })\n\n return (\n <MapContext.Provider value={() => map}>\n {props.children}\n <section\n ref={mapRef}\n class={props.class || ''}\n classList={props.classList}\n style={{ height: '100%', width: '100%' }}></section>\n </MapContext.Provider>\n )\n}\n\nexport { MapGL as default, useMap }\n","import {\n onMount,\n onCleanup,\n createEffect,\n Component,\n createContext,\n useContext,\n createUniqueId,\n} from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n Source,\n SourceSpecification,\n} from 'mapbox-gl/src/style-spec/types.js'\n\nconst SourceContext = createContext<Source>()\n\nconst useSource = (): Source => useContext(SourceContext)\n\nconst SourceComponent: Component<{\n id?: string\n source: SourceSpecification\n}> = props => {\n const map: MapboxMap = useMap()\n props.id = props.id || createUniqueId()\n // Add Source\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n !map().getSource(props.id) && map().addSource(props.id, props.source)\n })\n\n // Remove Source\n onCleanup(() => {\n map()\n .getStyle()\n .layers.forEach(\n layer => layer.source === props.id && map().removeLayer(layer.id)\n )\n map().getSource(props.id) && map().removeSource(props.id)\n })\n\n // Update GeoJSON Data\n createEffect(async () => {\n if (props.source.type !== 'geojson' && !props.source.data) return\n\n map().style &&\n map().getSource(props.id) &&\n map().getSource(props.id).setData(props.source.data)\n })\n\n return (\n <SourceContext.Provider value={{ id: props.id }}>\n {props.children}\n </SourceContext.Provider>\n )\n}\n\nexport { SourceComponent as default, useSource }\n","import {\n onMount,\n onCleanup,\n createEffect,\n Component,\n createUniqueId,\n} from 'solid-js'\nimport { useMap } from '../MapGL'\nimport { useSource } from '../Source'\nimport { layerEvents } from '../../events'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n FilterSpecification,\n StyleSpecification,\n SourceSpecification,\n} from 'mapbox-gl/src/style-spec/types.js'\nimport type { CustomLayerInterface } from 'mapbox-gl/src/style/style_layer/custom_style_layer'\n\nconst diff = (\n newProps: StyleSpecification = {},\n prevProps: StyleSpecification = {}\n) => {\n const keys = new Set([...Object.keys(newProps), ...Object.keys(prevProps)])\n return [...keys].reduce((acc, key: string) => {\n const value = newProps[key]\n if (value !== prevProps[key]) {\n acc.push([key, value])\n }\n return acc\n }, [])\n}\n\nconst Layer: Component<{\n id?: string\n style?: StyleSpecification\n layer?: CustomLayerInterface\n filter?: FilterSpecification\n visible?: boolean\n sourceId?: string\n beforeType?:\n | 'background'\n | 'fill'\n | 'line'\n | 'symbol'\n | 'raster'\n | 'circle'\n | 'fill-extrusion'\n | 'heatmap'\n | 'hillshade'\n | 'sky'\n beforeId?: string\n featureState?: { id: number | string; state: object }\n}> = props => {\n const map: MapboxMap = useMap()\n const source: SourceSpecification = useSource()\n props.id = props.id || createUniqueId()\n // Add Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n\n if (map().getLayer(props.id)) return\n\n map().addLayer(\n props.layer || {\n ...props.style,\n id: props.id,\n source: source.id,\n },\n props.beforeType\n ? map()\n .getStyle()\n .layers.find(l => l.type === props.beforeType).id\n : props.beforeId\n )\n })\n\n onCleanup(() => {\n const layer = map().getLayer(props.id)\n if (!layer) return\n layerEvents.forEach(item => {\n props[item] && layer.off(item.slice(2).toLowerCase(), e => props[item](e))\n })\n map().removeLayer(props.id)\n })\n\n // Hook up events\n createEffect(() =>\n layerEvents.forEach(item => {\n if (props[item]) {\n const eventString = item.slice(2).toLowerCase()\n map()\n .off(eventString, props.id, e => props[item](e))\n .on(eventString, props.id, e => props[item](e))\n }\n })\n )\n\n // Update Style\n createEffect((prev: StyleSpecification) => {\n if (\n !props.style ||\n !map().style ||\n !map().getSource(source.id) ||\n !map().getLayer(props.id)\n )\n return\n\n if (props.style.layout !== prev?.layout)\n diff(props.style.layout, prev?.layout).forEach(([key, value]) =>\n map().setLayoutProperty(props.id, key, value, { validate: false })\n )\n\n if (props.style.paint !== prev?.paint)\n diff(props.style.paint, prev?.paint).forEach(([key, value]) =>\n map().setPaintProperty(props.id, key, value, { validate: false })\n )\n\n if (\n props.style.minzoom !== prev?.minzoom ||\n props.style.maxzoom !== prev?.maxzoom\n )\n map().setLayerZoomRange(\n props.id,\n props.style.minzoom,\n props.style.maxzoom\n )\n\n if (props.style.filter !== prev?.filter)\n map().setFilter(props.id, props.style.filter, { validate: false })\n\n return props.style\n }, props.style)\n\n // Update Visibility\n createEffect((prev: boolean) => {\n if (\n props.visible === undefined ||\n props.visible === prev ||\n !map().getSource(source.id) ||\n !map().getLayer(props.id)\n )\n return\n\n map().setLayoutProperty(\n props.id,\n 'visibility',\n props.visible ? 'visible' : 'none',\n { validate: false }\n )\n return props.visible\n }, props.visible)\n\n // Update Filter\n createEffect(async () => {\n if (!props.filter) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFilter(props.id, props.filter)\n })\n\n // Update Feature State\n createEffect(async () => {\n if (!props.featureState || !props.featureState.id) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n\n map().removeFeatureState({\n source: source.id,\n sourceLayer: props.style['source-layer'],\n })\n map().setFeatureState(\n {\n source: source.id,\n sourceLayer: props.style['source-layer'],\n id: props.featureState.id,\n },\n props.featureState.state\n )\n })\n\n return props.children\n}\n\nexport default Layer\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { FogSpecification } from 'mapbox-gl/src/style-spec/types.js'\n\nconst Fog: Component<{\n style: FogSpecification\n visible?: boolean\n}> = props => {\n const map: MapboxMap = useMap()\n // Add Fog Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFog(props.style)\n })\n // Remove Fog Layer\n onCleanup(() => map().setFog(null))\n\n // Update Visibility\n createEffect(async () => {\n if (props.visible === undefined) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFog(props.visible ? props.style : null)\n })\n\n return props.children\n}\n\nexport default Fog\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { StyleSpecification } from 'mapbox-gl/src/style-spec/types.js'\n\nconst Sky: Component<{\n style: StyleSpecification\n visible?: boolean\n}> = props => {\n const map: MapboxMap = useMap()\n const layerId = '_sky'\n // Add Sky Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n !map().getLayer(layerId) && map().addLayer({ ...props.style, id: layerId })\n })\n\n // Remove Sky Layer\n onCleanup(() => map().getLayer(layerId) && map().removeLayer(layerId))\n\n // Update Visibility\n createEffect(async () => {\n if (props.visible === undefined) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setLayoutProperty(\n layerId,\n 'visibility',\n props.visible ? 'visible' : 'none'\n )\n })\n\n return props.children\n}\n\nexport default Sky\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport { useSource } from '../Source'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n TerrainSpecification,\n SourceSpecification,\n} from 'mapbox-gl/src/style-spec/types.js'\n\nconst Terrain: Component<{\n style: TerrainSpecification\n visible?: boolean\n}> = props => {\n const map: MapboxMap = useMap()\n const source: SourceSpecification = useSource()\n\n // Add Terrain Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setTerrain({ ...props.style, source: source.id })\n })\n\n // Remove Terrain Layer\n onCleanup(() => map().setTerrain(null))\n\n // Update Visibility\n createEffect(async () => {\n if (props.visible === undefined) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setTerrain(props.visible ? props.style : null)\n })\n\n return props.children\n}\n\nexport default Terrain\n","import { onMount, onCleanup, createSignal, Component, lazy } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { Options as AttributionOptions } from 'mapbox-gl/src/ui/control/attribution_control'\nimport type { Options as FullscreenOptions } from 'mapbox-gl/src/ui/control/fullscreen_control'\nimport type { Options as GeolocateOptions } from 'mapbox-gl/src/ui/control/geolocate_control'\nimport type { Options as NavigationOptions } from 'mapbox-gl/src/ui/control/navigation_control'\nimport type { Options as ScaleOptions } from 'mapbox-gl/src/ui/control/scale_control'\n\nconst Control: Component<{\n type:\n | 'navigation'\n | 'scale'\n | 'attribution'\n | 'fullscreen'\n | 'geolocate'\n | 'language'\n | 'traffic'\n options?:\n | NavigationOptions\n | ScaleOptions\n | AttributionOptions\n | FullscreenOptions\n | GeolocateOptions\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n}> = props => {\n const map: MapboxMap = useMap()\n const [control, setControl] = createSignal(null)\n // Add Control\n onMount(async () => {\n let control\n\n switch (props.type) {\n case 'navigation':\n control = new mapboxgl.NavigationControl(props.options)\n break\n case 'scale':\n control = new mapboxgl.ScaleControl(props.options)\n break\n case 'attribution':\n control = new mapboxgl.AttributionControl(props.options)\n break\n case 'fullscreen':\n control = new mapboxgl.FullscreenControl(\n props.options || { container: map().container }\n )\n break\n case 'geolocate':\n control = new mapboxgl.GeolocateControl(props.options)\n break\n // case 'language':\n // // @ts-ignore\n // const MapboxLanguage = (await import('@mapbox/mapbox-gl-language'))\n // .default\n // control = new MapboxLanguage(props.options)\n // break\n // case 'traffic':\n // // @ts-ignore\n // const MapboxTraffic = (await import('@mapbox/mapbox-gl-traffic'))\n // .default\n // // @ts-ignore\n // await import('@mapbox/mapbox-gl-traffic/mapbox-gl-traffic.css')\n // control = new MapboxTraffic(props.options)\n // break\n }\n control && map().addControl(control, props.position)\n setControl(control)\n })\n\n onCleanup(() => map().removeControl(control()))\n\n return props.children\n}\n\nexport default Control\n","import { onMount, onCleanup, createEffect, Component, children } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { MarkerSpecification } from 'mapbox-gl/src/style-spec/types.js'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\n\nconst Marker: Component<{\n options?: MarkerSpecification\n lnglat: LngLatLike\n}> = props => {\n const map: MapboxMap = useMap()\n let marker = null\n\n // Add Marker\n onMount(async () => {\n marker = new mapboxgl.Marker(props.options)\n .setLngLat(props.lnglat)\n .setPopup(\n props.children\n ? new mapboxgl.Popup().setDOMContent(<div>{props.children}</div>)\n : null\n )\n .addTo(map())\n })\n // Remove Marker\n onCleanup(() => marker.remove())\n\n // Update Position\n createEffect(() => marker.setLngLat(props.lnglat))\n\n return <></>\n}\n\nexport default Marker\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { PopupSpecification } from 'mapbox-gl/src/style-spec/types.js'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\n\nconst Popup: Component<{\n options?: PopupSpecification\n lnglat: LngLatLike\n}> = props => {\n const map: MapboxMap = useMap()\n let popup = null\n\n // Add Popup\n onMount(async () => {\n popup = new mapboxgl.Popup(props.options)\n .setLngLat(props.lnglat)\n .setDOMContent(<div>{props.children}</div>)\n .addTo(map())\n })\n // Remove Popup\n onCleanup(() => popup.remove())\n\n // Update Position\n createEffect(() => popup.setLngLat(props.lnglat))\n\n // Update Content\n createEffect(() => popup.setDOMContent(<div>{props.children}</div>))\n\n return <></>\n}\n\nexport default Popup\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n StyleImageInterface,\n StyleImageMetadata,\n} from 'mapbox-gl/src/style/style_image'\n\nconst Image: Component<{\n id: string\n url?: string\n image?:\n | HTMLImageElement\n | ImageBitmap\n | ImageData\n | { width: number; height: number; data: Uint8Array | Uint8ClampedArray }\n | StyleImageInterface\n options?: StyleImageMetadata\n}> = props => {\n const map: MapboxMap = useMap()\n // Add Image\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n if (props.url) {\n map().loadImage(props.url, (error, image) => {\n if (error) throw error\n !map().hasImage(props.id) && map().addImage(props.id, image)\n })\n } else {\n !map().hasImage(props.id) &&\n map().addImage(props.id, props.image, props.options)\n }\n })\n // Remove Image\n onCleanup(() => map().hasImage(props.id) && map().removeImage(props.id))\n\n // Update Image\n createEffect(async () => {\n if (props.image && props.url) return\n\n if (props.url) {\n map().loadImage(props.url, (error, image) => {\n if (error) throw error\n !map().hasImage(props.id) && map().updateImage(props.id, image)\n })\n } else {\n map().style &&\n map().hasImage(props.id) &&\n map().updateImage(props.id, props.image)\n }\n })\n\n return <></>\n}\n\nexport default Image\n"],"names":["mapEvents","layerEvents","viewportEvents","pending","start","useTransition","MapContext","createContext","useMap","useContext","MapGL","props","map","mapRef","index","onMount","mapboxgl","Map","options","container","interactive","onViewportChange","bounds","viewport","center","zoom","pitch","bearing","fitBoundsOptions","padding","onCleanup","forEach","item","off","slice","toLowerCase","e","remove","createEffect","eventString","on","showTileBoundaries","showTerrainWireframe","showPadding","showCollisionBoxes","showOverdrawInspector","getCanvas","style","cursor","cursorStyle","prev","setStyle","evt","originalEvent","getCenter","getZoom","getPitch","getBearing","camera","cameraForBounds","newViewport","lng","lat","Object","keys","length","stop","transitionType","easeTo","jumpTo","flyTo","triggerResize","window","requestAnimationFrame","loop","resize","Provider","value","children","class","classList","SourceContext","useSource","SourceComponent","id","createUniqueId","async","isStyleLoaded","once","getSource","addSource","source","getStyle","layers","layer","removeLayer","removeSource","type","data","setData","diff","newProps","prevProps","Set","reduce","acc","key","push","Layer","getLayer","addLayer","beforeType","find","l","beforeId","layout","setLayoutProperty","validate","paint","setPaintProperty","minzoom","maxzoom","setLayerZoomRange","filter","setFilter","undefined","visible","featureState","removeFeatureState","sourceLayer","setFeatureState","state","Fog","setFog","Sky","layerId","Terrain","setTerrain","Control","control","setControl","createSignal","NavigationControl","ScaleControl","AttributionControl","FullscreenControl","GeolocateControl","addControl","position","removeControl","Marker","marker","setLngLat","lnglat","setPopup","Popup","setDOMContent","addTo","popup","Image","url","loadImage","error","image","hasImage","addImage","removeImage","updateImage"],"mappings":"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"}
@@ -31,7 +31,9 @@ const Image = props => {
31
31
  });
32
32
  }
33
33
  else {
34
- map().hasImage(props.id) && map().updateImage(props.id, props.image);
34
+ map().style &&
35
+ map().hasImage(props.id) &&
36
+ map().updateImage(props.id, props.image);
35
37
  }
36
38
  });
37
39
  return <></>;
@@ -1,6 +1,7 @@
1
- import { onMount, createEffect, createUniqueId } from 'solid-js';
1
+ import { onMount, onCleanup, createEffect, createUniqueId, } from 'solid-js';
2
2
  import { useMap } from '../MapGL';
3
3
  import { useSource } from '../Source';
4
+ import { layerEvents } from '../../events';
4
5
  const diff = (newProps = {}, prevProps = {}) => {
5
6
  const keys = new Set([...Object.keys(newProps), ...Object.keys(prevProps)]);
6
7
  return [...keys].reduce((acc, key) => {
@@ -30,9 +31,28 @@ const Layer = props => {
30
31
  .layers.find(l => l.type === props.beforeType).id
31
32
  : props.beforeId);
32
33
  });
34
+ onCleanup(() => {
35
+ const layer = map().getLayer(props.id);
36
+ if (!layer)
37
+ return;
38
+ layerEvents.forEach(item => {
39
+ props[item] && layer.off(item.slice(2).toLowerCase(), e => props[item](e));
40
+ });
41
+ map().removeLayer(props.id);
42
+ });
43
+ // Hook up events
44
+ createEffect(() => layerEvents.forEach(item => {
45
+ if (props[item]) {
46
+ const eventString = item.slice(2).toLowerCase();
47
+ map()
48
+ .off(eventString, props.id, e => props[item](e))
49
+ .on(eventString, props.id, e => props[item](e));
50
+ }
51
+ }));
33
52
  // Update Style
34
53
  createEffect((prev) => {
35
54
  if (!props.style ||
55
+ !map().style ||
36
56
  !map().getSource(source.id) ||
37
57
  !map().getLayer(props.id))
38
58
  return;
@@ -1,4 +1,5 @@
1
1
  import { createEffect, onMount, onCleanup, createContext, useContext, useTransition, } from 'solid-js';
2
+ import { mapEvents, viewportEvents } from '../../events';
2
3
  import mapboxgl from 'mapbox-gl';
3
4
  import 'mapbox-gl/dist/mapbox-gl.css';
4
5
  const [pending, start] = useTransition();
@@ -7,12 +8,11 @@ const useMap = () => useContext(MapContext);
7
8
  const MapGL = props => {
8
9
  let map;
9
10
  let mapRef;
10
- let containerRef;
11
- onCleanup(() => map.remove());
12
11
  onMount(() => {
13
12
  map = new mapboxgl.Map({
14
13
  ...props.options,
15
14
  container: mapRef,
15
+ interactive: !!props.onViewportChange,
16
16
  bounds: props.viewport.bounds,
17
17
  center: props.viewport.center,
18
18
  zoom: props.viewport.zoom || null,
@@ -20,31 +20,48 @@ const MapGL = props => {
20
20
  bearing: props.viewport.bearing || null,
21
21
  fitBoundsOptions: { padding: props.viewport.padding },
22
22
  });
23
- map.container = containerRef;
24
23
  });
25
- createEffect(() => props.onMouseMove &&
26
- map.on('mousemove', event => props.onMouseMove(event.lngLat)));
27
- const _onViewportChange = evt => {
28
- if (evt.isInternal)
29
- return;
30
- const viewport = {
31
- center: map.getCenter(),
32
- zoom: map.getZoom(),
33
- pitch: map.getPitch(),
34
- bearing: map.getBearing(),
35
- padding: props.viewport.padding,
36
- bounds: props.viewport.bounds,
37
- };
38
- props.onViewportChange(viewport);
39
- };
40
- createEffect(() => props.onViewportChange &&
41
- map
42
- .on('dragend', _onViewportChange)
43
- .on('moveend', _onViewportChange)
44
- .on('zoomend', _onViewportChange)
45
- .on('rotateend', _onViewportChange)
46
- .on('pitchend', _onViewportChange)
47
- .on('boxzoomend', _onViewportChange));
24
+ onCleanup(() => {
25
+ mapEvents.forEach(item => {
26
+ props[item] && map.off(item.slice(2).toLowerCase(), e => props[item](e));
27
+ });
28
+ map.remove();
29
+ });
30
+ // Hook up events
31
+ createEffect(() => mapEvents.forEach(item => {
32
+ if (props[item]) {
33
+ const eventString = item.slice(2).toLowerCase();
34
+ map
35
+ .off(eventString, e => props[item](e))
36
+ .on(eventString, e => props[item](e));
37
+ }
38
+ }));
39
+ // Update debug features
40
+ createEffect(() => (map.showTileBoundaries = props.showTileBoundaries));
41
+ createEffect(() => (map.showTerrainWireframe = props.showTerrainWireframe));
42
+ createEffect(() => (map.showPadding = props.showPadding));
43
+ createEffect(() => (map.showCollisionBoxes = props.showCollisionBoxes));
44
+ createEffect(() => (map.showOverdrawInspector = props.showOverdrawInspector));
45
+ createEffect(() => (map.getCanvas().style.cursor = props.cursorStyle));
46
+ // Update map style
47
+ createEffect(prev => prev !== props.options.style && map.setStyle(props.options.style), props.options.style);
48
+ // Update Viewport
49
+ createEffect(() => {
50
+ props.onViewportChange &&
51
+ viewportEvents.forEach(item => map.on(item, evt => {
52
+ if (!evt.originalEvent)
53
+ return;
54
+ props.onViewportChange({
55
+ center: map.getCenter(),
56
+ zoom: map.getZoom(),
57
+ pitch: map.getPitch(),
58
+ bearing: map.getBearing(),
59
+ padding: props.viewport.padding,
60
+ bounds: props.viewport.bounds,
61
+ });
62
+ }));
63
+ });
64
+ // Update boundaries
48
65
  createEffect(prev => {
49
66
  if (props.viewport.bounds != prev) {
50
67
  const camera = map.cameraForBounds(props.viewport.bounds, {
@@ -58,28 +75,30 @@ const MapGL = props => {
58
75
  return props.viewport.bounds;
59
76
  }, props.viewport.bounds);
60
77
  createEffect(async (prev) => {
61
- const vp = props.viewport;
62
- const nvp = {
63
- ...(vp.zoom != prev.zoom && { zoom: vp.zoom }),
64
- ...(vp.padding != prev.padding && { padding: vp.padding }),
65
- ...(vp.bearing != prev.bearing && { bearing: vp.bearing }),
66
- ...(vp.pitch != prev.pitch && { pitch: vp.pitch }),
67
- ...(vp.center != prev.center && {
68
- center: vp.center.lng ? [vp.center.lng, vp.center.lat] : vp.center,
78
+ const viewport = props.viewport;
79
+ const newViewport = {
80
+ ...(viewport.zoom != prev.zoom && { zoom: viewport.zoom }),
81
+ ...(viewport.padding != prev.padding && { padding: viewport.padding }),
82
+ ...(viewport.bearing != prev.bearing && { bearing: viewport.bearing }),
83
+ ...(viewport.pitch != prev.pitch && { pitch: viewport.pitch }),
84
+ ...(viewport.center != prev.center && {
85
+ center: viewport.center.lng
86
+ ? [viewport.center.lng, viewport.center.lat]
87
+ : viewport.center,
69
88
  }),
70
89
  };
71
- if (Object.keys(nvp).length) {
90
+ if (Object.keys(newViewport).length) {
72
91
  map.stop();
73
92
  switch (props.transitionType) {
74
93
  case 'easeTo':
75
- map.easeTo(nvp, { isInternal: true });
94
+ map.easeTo(newViewport);
76
95
  case 'jumpTo':
77
- map.jumpTo(nvp, { isInternal: true });
96
+ map.jumpTo(newViewport);
78
97
  default:
79
- map.flyTo(nvp, { isInternal: true });
98
+ map.flyTo(newViewport);
80
99
  }
81
100
  }
82
- return vp;
101
+ return newViewport;
83
102
  }, props.viewport);
84
103
  let index = 0;
85
104
  createEffect(() => {
@@ -95,10 +114,8 @@ const MapGL = props => {
95
114
  }
96
115
  });
97
116
  return (<MapContext.Provider value={() => map}>
98
- <main ref={containerRef} style={{ height: '100%', width: '100%' }}>
99
- {props.children}
100
- <div ref={mapRef} class={props.class || ''} classList={props.classList} style={{ height: '100%', width: '100%' }}></div>
101
- </main>
117
+ {props.children}
118
+ <section ref={mapRef} class={props.class || ''} classList={props.classList} style={{ height: '100%', width: '100%' }}></section>
102
119
  </MapContext.Provider>);
103
120
  };
104
121
  export { MapGL as default, useMap };
@@ -21,7 +21,8 @@ const SourceComponent = props => {
21
21
  createEffect(async () => {
22
22
  if (props.source.type !== 'geojson' && !props.source.data)
23
23
  return;
24
- map().getSource(props.id) &&
24
+ map().style &&
25
+ map().getSource(props.id) &&
25
26
  map().getSource(props.id).setData(props.source.data);
26
27
  });
27
28
  return (<SourceContext.Provider value={{ id: props.id }}>
@@ -0,0 +1,75 @@
1
+ const mapEvents = [
2
+ 'onMouseDown',
3
+ 'onMouseUp',
4
+ 'onMouseOver',
5
+ 'onMouseOut',
6
+ 'onMouseMove',
7
+ 'onMouseEnter',
8
+ 'onMouseLeave',
9
+ 'onPreClick',
10
+ 'onClick',
11
+ 'onDblClick',
12
+ 'onContextMenu',
13
+ 'onTouchStart',
14
+ 'onTouchEnd',
15
+ 'onTouchCancel',
16
+ 'onWheel',
17
+ 'onResize',
18
+ 'onRemove',
19
+ 'onTouchMove',
20
+ 'onMoveStart',
21
+ 'onMove',
22
+ 'onMoveEnd',
23
+ 'onDragStart',
24
+ 'onDrag',
25
+ 'onDragEnd',
26
+ 'onZoomStart',
27
+ 'onZoom',
28
+ 'onZoomEnd',
29
+ 'onRotateStart',
30
+ 'onRotate',
31
+ 'onRotatEnd',
32
+ 'onPitchStart',
33
+ 'onPitch',
34
+ 'onPitchEnd',
35
+ 'onBoxZoomStart',
36
+ 'onBoxZoomEnd',
37
+ 'onBoxZoomCancel',
38
+ 'onWebglContextLost',
39
+ 'onWebglContextRestored',
40
+ 'onLoad',
41
+ 'onRender',
42
+ 'onIdle',
43
+ 'onError',
44
+ 'onData',
45
+ 'onStyleData',
46
+ 'onSourceData',
47
+ 'onDataLoading',
48
+ 'onStyleDataLoading',
49
+ 'onSourceDataLoading',
50
+ 'onStyleImageMissing',
51
+ ];
52
+ const layerEvents = [
53
+ 'onMouseDown',
54
+ 'onMouseUp',
55
+ 'onMouseOver',
56
+ 'onMouseOut',
57
+ 'onMouseOnMove',
58
+ 'onMouseEnter',
59
+ 'onMouseLeave',
60
+ 'onClick',
61
+ 'onDblClick',
62
+ 'onContextMenu',
63
+ 'onTouchStart',
64
+ 'onTouchEnd',
65
+ 'onTouchCancel',
66
+ ];
67
+ const viewportEvents = [
68
+ 'dragend',
69
+ 'moveend',
70
+ 'zoomend',
71
+ 'pitchend',
72
+ 'rotateend',
73
+ 'boxzoomend',
74
+ ];
75
+ export { mapEvents, layerEvents, viewportEvents };
@@ -4,13 +4,14 @@ import type MapboxOptions from 'mapbox-gl/src/ui/map';
4
4
  import type MapMouseEvent from 'mapbox-gl/src/ui/events';
5
5
  import type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js';
6
6
  import type { LngLatBounds } from 'mapbox-gl/src/geo/lng_lat_bounds.js';
7
+ import type { PaddingOptions } from 'mapbox-gl/src/geo/edge_insets.js';
7
8
  export declare type Viewport = {
8
9
  center?: LngLatLike;
9
10
  bounds?: LngLatBounds;
10
11
  zoom?: number;
11
12
  pitch?: number;
12
13
  bearing?: number;
13
- padding?: number;
14
+ padding?: PaddingOptions;
14
15
  };
15
16
  declare const useMap: () => MapboxMap;
16
17
  declare const MapGL: Component<{
@@ -20,10 +21,17 @@ declare const MapGL: Component<{
20
21
  };
21
22
  viewport?: Viewport;
22
23
  options?: MapboxOptions;
23
- children?: Element[];
24
+ children?: Element | Element[];
24
25
  triggerResize?: boolean;
25
26
  transitionType?: 'flyTo' | 'easeTo' | 'jumpTo';
26
27
  onMouseMove?: (event: MapMouseEvent) => void;
27
28
  onViewportChange?: (viewport: Viewport) => void;
29
+ showTileBoundaries?: boolean;
30
+ showTerrainWireframe?: boolean;
31
+ showPadding?: boolean;
32
+ showCollisionBoxes?: boolean;
33
+ showOverdrawInspector?: boolean;
34
+ repaint?: boolean;
35
+ cursorStyle?: string;
28
36
  }>;
29
37
  export { MapGL as default, useMap };
@@ -0,0 +1,4 @@
1
+ declare const mapEvents: string[];
2
+ declare const layerEvents: string[];
3
+ declare const viewportEvents: string[];
4
+ export { mapEvents, layerEvents, viewportEvents };
@@ -9,3 +9,4 @@ export { default as Marker } from './components/Marker';
9
9
  export { default as Popup } from './components/Popup';
10
10
  export { default as Image } from './components/Image';
11
11
  export type { Viewport } from './components/MapGL';
12
+ export type { TransitionType } from './components/MapGL';
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.9",
2
+ "version": "1.1.12",
3
3
  "name": "solid-map-gl",
4
4
  "description": "Solid Component Library for Mapbox GL JS",
5
5
  "author": "kaihuebner",
@@ -39,14 +39,14 @@
39
39
  ],
40
40
  "dependencies": {
41
41
  "mapbox-gl": "^2.7.0",
42
- "solid-js": "^1.3.7"
42
+ "solid-js": "^1.3.9"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/mapbox-gl": "^2.6.1",
46
- "rollup": "^2.67.2",
46
+ "rollup": "^2.68.0",
47
47
  "rollup-plugin-import-css": "^3.0.2",
48
48
  "rollup-plugin-uglify": "^6.0.4",
49
- "rollup-preset-solid": "^1.2.2",
49
+ "rollup-preset-solid": "^1.4.0",
50
50
  "typescript": "^4.5.5"
51
51
  }
52
52
  }