solid-map-gl 1.1.11 → 1.1.14
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 +5 -9
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/source/components/Control/index.jsx +20 -26
- package/dist/source/components/Layer/index.jsx +12 -1
- package/dist/source/components/MapGL/index.jsx +55 -51
- package/dist/source/{components/MapGL/events.js → events.js} +29 -9
- package/dist/types/components/MapGL/index.d.ts +7 -2
- package/dist/types/events.d.ts +3 -0
- package/dist/types/index.d.ts +0 -1
- package/package.json +20 -10
- package/dist/types/components/MapGL/events.d.ts +0 -2
package/README.md
CHANGED
|
@@ -10,6 +10,9 @@
|
|
|
10
10
|
|
|
11
11
|
[Solid](https://www.solidjs.com/) Component Library for [Mapbox GL JS.](https://github.com/mapbox/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.](https://docs.mapbox.com/mapbox-gl-js/api/)
|
|
12
12
|
|
|
13
|
+
### [Examples & Playground](https://determined-mirzakhani-29bbc7.netlify.app/)
|
|
14
|
+
<br>
|
|
15
|
+
|
|
13
16
|
- [Installation](#installation)
|
|
14
17
|
- [Components](#components)
|
|
15
18
|
- [Usage](#usage)
|
|
@@ -17,7 +20,6 @@
|
|
|
17
20
|
- [Interactive Map](#interactive-map)
|
|
18
21
|
- [Map with Source and Layer](#map-with-source-and-layer)
|
|
19
22
|
- [Map with GeoJSON Source](#map-with-geojson-source)
|
|
20
|
-
- [Examples](#examples)
|
|
21
23
|
- [Roadmap](#roadmap)
|
|
22
24
|
|
|
23
25
|
<br>
|
|
@@ -246,13 +248,6 @@ const myDeckLayer = new MapboxLayer({
|
|
|
246
248
|
<Layer customLayer={myDeckLayer} />
|
|
247
249
|
</MapGL>
|
|
248
250
|
```
|
|
249
|
-
|
|
250
|
-
## Examples
|
|
251
|
-
|
|
252
|
-
#### Coming Soon
|
|
253
|
-
|
|
254
|
-
<br>
|
|
255
|
-
|
|
256
251
|
## Roadmap
|
|
257
252
|
|
|
258
253
|
- [x] Basic Mapbox GL Functionality
|
|
@@ -260,5 +255,6 @@ const myDeckLayer = new MapboxLayer({
|
|
|
260
255
|
- [x] Include Fog, Sky, and Terrain
|
|
261
256
|
- [x] Include Popup and Markers
|
|
262
257
|
- [x] Minify bundle & reduce size
|
|
263
|
-
- [
|
|
258
|
+
- [x] Add basemap switching
|
|
259
|
+
- [x] Include event handling
|
|
264
260
|
- [ ] Add edit functionality
|
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{template,createComponent,memo,effect,classList,insert}from"solid-js/web";import{useTransition,createContext,useContext,onMount,onCleanup,createEffect,createUniqueId
|
|
1
|
+
import{template,createComponent,memo,effect,classList,insert}from"solid-js/web";import{useTransition,createSignal,createContext,useContext,onMount,onCleanup,createEffect,createUniqueId}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","onMouseMove","onMouseEnter","onMouseLeave","onClick","onDblClick","onContextMenu","onTouchStart","onTouchEnd","onTouchCancel"],_tmpl$$2=template("<section></section>",2),[pending,start]=useTransition(),[isInternal,setInternal]=createSignal(!1),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(()=>n.remove()),createEffect(()=>mapEvents.forEach(t=>{if(a[t]){const e=t.slice(2).toLowerCase(),o=e=>a[t](e);n.on(e,o),onCleanup(()=>n().off(e,o))}})),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(e=>{e!==a.options.projection&&n.setProjection(a.options.projection)},a.options.projection),createEffect(()=>{const e=e=>{e.originalEvent&&(setInternal(!0),a.onViewportChange({center:n.getCenter(),zoom:n.getZoom(),pitch:n.getPitch(),bearing:n.getBearing(),padding:a.viewport.padding,bounds:a.viewport.bounds}))},t=e=>setInternal(!1);n.on("move",e).on("moveend",t),onCleanup(()=>n().off("move",e).off("moveend",t))}),createEffect(e=>(a.viewport.bounds!=e&&a.onViewportChange({...a.viewport,...n.cameraForBounds(a.viewport.bounds,{padding:a.viewport.padding})}),a.viewport.bounds),a.viewport.bounds),createEffect(()=>{if(!isInternal())switch(console.log(a.transitionType,a.viewport),a.transitionType){case"easeTo":n.stop().easeTo(a.viewport);case"jumpTo":n.stop().jumpTo(a.viewport);default:n.stop().flyTo(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=n=>{const a=useMap(),t=useSource();return n.id=n.id||createUniqueId(),onMount(async()=>{a().isStyleLoaded()||await a().once("styledata"),a().getLayer(n.id)||a().addLayer(n.layer||{...n.style,id:n.id,source:t.id},n.beforeType?a().getStyle().layers.find(e=>e.type===n.beforeType).id:n.beforeId)}),onCleanup(()=>a().removeLayer(n.id)),createEffect(()=>layerEvents.forEach(t=>{if(n[t]){const e=t.slice(2).toLowerCase(),o=e=>n[t](e);a().on(e,n.id,o),onCleanup(()=>a().off(e,n.id,o))}})),createEffect(e=>{if(n.style&&a().style&&a().getSource(t.id)&&a().getLayer(n.id))return n.style.layout!==(null==e?void 0:e.layout)&&diff(n.style.layout,null==e?void 0:e.layout).forEach(([e,t])=>a().setLayoutProperty(n.id,e,t,{validate:!1})),n.style.paint!==(null==e?void 0:e.paint)&&diff(n.style.paint,null==e?void 0:e.paint).forEach(([e,t])=>a().setPaintProperty(n.id,e,t,{validate:!1})),n.style.minzoom===(null==e?void 0:e.minzoom)&&n.style.maxzoom===(null==e?void 0:e.maxzoom)||a().setLayerZoomRange(n.id,n.style.minzoom,n.style.maxzoom),n.style.filter!==(null==e?void 0:e.filter)&&a().setFilter(n.id,n.style.filter,{validate:!1}),n.style},n.style),createEffect(e=>{if(void 0!==n.visible&&n.visible!==e&&a().getSource(t.id)&&a().getLayer(n.id))return a().setLayoutProperty(n.id,"visibility",n.visible?"visible":"none",{validate:!1}),n.visible},n.visible),createEffect(async()=>{n.filter&&(a().isStyleLoaded()||await a().once("styledata"),a().setFilter(n.id,n.filter))}),createEffect(async()=>{n.featureState&&n.featureState.id&&(a().isStyleLoaded()||await a().once("styledata"),a().removeFeatureState({source:t.id,sourceLayer:n.style["source-layer"]}),a().setFeatureState({source:t.id,sourceLayer:n.style["source-layer"],id:n.featureState.id},n.featureState.state))}),n.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(()=>{var e=((e,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"fullscreen":return new mapboxgl.FullscreenControl(t||{container:o().container});case"geolocate":return new mapboxgl.GeolocateControl(t)}})(t.type,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
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/components/MapGL/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 events = [\n 'onResize',\n 'onRemove',\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseOver',\n 'onMouseMove',\n 'onClick',\n 'onDblClick',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onMouseOut',\n 'onContextMenu',\n 'onTouchStart',\n 'onTouchEnd',\n 'onTouchMove',\n 'onTouchCancel',\n 'onMoveStart',\n 'onMove',\n 'onMoveEnd',\n 'onDragStart',\n 'onDrag',\n 'onDragEnd',\n 'onZoomStart',\n 'onZoom',\n 'onZoomEnd',\n 'onRotateStart',\n 'onRotate',\n 'onRotateEnd',\n 'onPitchStart',\n 'onPitch',\n 'onPitchEnd',\n 'onBoxZoomStart',\n 'onBoxZoomEnd',\n 'onBoxZoomCancel',\n 'onWebglContextLost',\n 'onWebglContextRestored',\n 'onLoad',\n 'onError',\n 'onData',\n 'onStyleData',\n 'onSourceData',\n 'onDataLoading',\n 'onStyleDataLoading',\n 'onSourceDataLoading',\n]\n\nexport { events as default }\n","import {\n createEffect,\n onMount,\n onCleanup,\n createContext,\n useContext,\n Component,\n useTransition,\n} from 'solid-js'\nimport events 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}> = 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(() => map.remove())\n\n // Hook up events\n createEffect(() =>\n events.forEach(item => {\n props[item] && map.on(item.slice(2).toLowerCase(), e => props[item](e))\n })\n )\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 [\n 'dragend',\n 'moveend',\n 'zoomend',\n 'pitchend',\n 'rotateend',\n 'boxzoomend',\n ].forEach(item =>\n map.on(item, 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 })\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 {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 { 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().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":["events","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","remove","createEffect","forEach","item","on","slice","toLowerCase","e","prev","style","setStyle","evt","isInternal","getCenter","getZoom","getPitch","getBearing","camera","cameraForBounds","vp","nvp","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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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/events.ts","../../src/components/MapGL/index.tsx","../../src/components/Source/index.tsx","../../src/components/Layer/index.tsx","../../src/components/Fog/index.tsx","../../src/components/Sky/index.tsx","../../src/components/Terrain/index.tsx","../../src/components/Control/index.tsx","../../src/components/Marker/index.tsx","../../src/components/Popup/index.tsx","../../src/components/Image/index.tsx"],"sourcesContent":["const mapEvents: string[] = [\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseOver',\n 'onMouseOut',\n 'onMouseMove',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onPreClick',\n 'onClick',\n 'onDblClick',\n 'onContextMenu',\n 'onTouchStart',\n 'onTouchEnd',\n 'onTouchCancel',\n 'onWheel',\n 'onResize',\n 'onRemove',\n 'onTouchMove',\n 'onMoveStart',\n 'onMove',\n 'onMoveEnd',\n 'onDragStart',\n 'onDrag',\n 'onDragEnd',\n 'onZoomStart',\n 'onZoom',\n 'onZoomEnd',\n 'onRotateStart',\n 'onRotate',\n 'onRotatEnd',\n 'onPitchStart',\n 'onPitch',\n 'onPitchEnd',\n 'onBoxZoomStart',\n 'onBoxZoomEnd',\n 'onBoxZoomCancel',\n 'onWebglContextLost',\n 'onWebglContextRestored',\n 'onLoad',\n 'onRender',\n 'onIdle',\n 'onError',\n 'onData',\n 'onStyleData',\n 'onSourceData',\n 'onDataLoading',\n 'onStyleDataLoading',\n 'onSourceDataLoading',\n 'onStyleImageMissing',\n]\n\nconst layerEvents: string[] = [\n 'onMouseDown',\n 'onMouseUp',\n 'onMouseOver',\n 'onMouseOut',\n 'onMouseMove',\n 'onMouseEnter',\n 'onMouseLeave',\n 'onClick',\n 'onDblClick',\n 'onContextMenu',\n 'onTouchStart',\n 'onTouchEnd',\n 'onTouchCancel',\n]\n\nexport { mapEvents, layerEvents }\n","import {\n createSignal,\n createEffect,\n onMount,\n onCleanup,\n createContext,\n useContext,\n Component,\n useTransition,\n} from 'solid-js'\nimport { mapEvents } 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 { 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()\nconst [isInternal, setInternal] = createSignal(false)\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 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(() => map.remove())\n\n // Hook up events\n createEffect(() =>\n mapEvents.forEach(item => {\n if (props[item]) {\n const event = item.slice(2).toLowerCase()\n const callback = e => props[item](e)\n map.on(event, callback)\n onCleanup(() => map().off(event, callback))\n }\n })\n )\n\n // Update debug features\n createEffect(() => (map.showTileBoundaries = props.showTileBoundaries))\n createEffect(() => (map.showTerrainWireframe = props.showTerrainWireframe))\n createEffect(() => (map.showPadding = props.showPadding))\n createEffect(() => (map.showCollisionBoxes = props.showCollisionBoxes))\n createEffect(() => (map.showOverdrawInspector = props.showOverdrawInspector))\n createEffect(() => (map.getCanvas().style.cursor = props.cursorStyle))\n\n // Update map style\n createEffect(prev => {\n prev !== props.options.style && map.setStyle(props.options.style)\n }, props.options.style)\n\n // Update projection\n createEffect(prev => {\n prev !== props.options.projection &&\n map.setProjection(props.options.projection)\n }, props.options.projection)\n\n // Hook up viewport events\n createEffect(() => {\n const callback = event => {\n if (event.originalEvent) {\n setInternal(true)\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 const callEnd = event => setInternal(false)\n\n map.on('move', callback).on('moveend', callEnd)\n onCleanup(() => map().off('move', callback).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 (isInternal()) return\n console.log(props.transitionType, props.viewport)\n switch (props.transitionType) {\n case 'easeTo':\n map.stop().easeTo(props.viewport)\n case 'jumpTo':\n map.stop().jumpTo(props.viewport)\n default:\n map.stop().flyTo(props.viewport)\n }\n })\n\n let index = 0\n\n createEffect(() => {\n if (props.triggerResize) {\n index = 0\n window.requestAnimationFrame(function loop() {\n if (index < 15) {\n index++\n window.requestAnimationFrame(loop)\n start(() => map.resize())\n }\n })\n }\n })\n\n return (\n <MapContext.Provider value={() => map}>\n {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(() => map().removeLayer(props.id))\n\n // Hook up events\n createEffect(() =>\n layerEvents.forEach(item => {\n if (props[item]) {\n const event = item.slice(2).toLowerCase()\n const callback = e => props[item](e)\n map().on(event, props.id, callback)\n onCleanup(() => map().off(event, props.id, callback))\n }\n })\n )\n\n // Update Style\n createEffect((prev: StyleSpecification) => {\n if (\n !props.style ||\n !map().style ||\n !map().getSource(source.id) ||\n !map().getLayer(props.id)\n )\n return\n\n if (props.style.layout !== prev?.layout)\n diff(props.style.layout, prev?.layout).forEach(([key, value]) =>\n map().setLayoutProperty(props.id, key, value, { validate: false })\n )\n\n if (props.style.paint !== prev?.paint)\n diff(props.style.paint, prev?.paint).forEach(([key, value]) =>\n map().setPaintProperty(props.id, key, value, { validate: false })\n )\n\n if (\n props.style.minzoom !== prev?.minzoom ||\n props.style.maxzoom !== prev?.maxzoom\n )\n map().setLayerZoomRange(\n props.id,\n props.style.minzoom,\n props.style.maxzoom\n )\n\n if (props.style.filter !== prev?.filter)\n map().setFilter(props.id, props.style.filter, { validate: false })\n\n return props.style\n }, props.style)\n\n // Update Visibility\n createEffect((prev: boolean) => {\n if (\n props.visible === undefined ||\n props.visible === prev ||\n !map().getSource(source.id) ||\n !map().getLayer(props.id)\n )\n return\n\n map().setLayoutProperty(\n props.id,\n 'visibility',\n props.visible ? 'visible' : 'none',\n { validate: false }\n )\n return props.visible\n }, props.visible)\n\n // Update Filter\n createEffect(async () => {\n if (!props.filter) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFilter(props.id, props.filter)\n })\n\n // Update Feature State\n createEffect(async () => {\n if (!props.featureState || !props.featureState.id) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n\n map().removeFeatureState({\n source: source.id,\n sourceLayer: props.style['source-layer'],\n })\n map().setFeatureState(\n {\n source: source.id,\n sourceLayer: props.style['source-layer'],\n id: props.featureState.id,\n },\n props.featureState.state\n )\n })\n\n return props.children\n}\n\nexport default Layer\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { FogSpecification } from 'mapbox-gl/src/style-spec/types.js'\n\nconst Fog: Component<{\n style: FogSpecification\n visible?: boolean\n}> = props => {\n const map: MapboxMap = useMap()\n // Add Fog Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFog(props.style)\n })\n // Remove Fog Layer\n onCleanup(() => map().setFog(null))\n\n // Update Visibility\n createEffect(async () => {\n if (props.visible === undefined) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setFog(props.visible ? props.style : null)\n })\n\n return props.children\n}\n\nexport default Fog\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { StyleSpecification } from 'mapbox-gl/src/style-spec/types.js'\n\nconst Sky: Component<{\n style: StyleSpecification\n visible?: boolean\n}> = props => {\n const map: MapboxMap = useMap()\n const layerId = '_sky'\n // Add Sky Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n !map().getLayer(layerId) && map().addLayer({ ...props.style, id: layerId })\n })\n\n // Remove Sky Layer\n onCleanup(() => map().getLayer(layerId) && map().removeLayer(layerId))\n\n // Update Visibility\n createEffect(async () => {\n if (props.visible === undefined) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setLayoutProperty(\n layerId,\n 'visibility',\n props.visible ? 'visible' : 'none'\n )\n })\n\n return props.children\n}\n\nexport default Sky\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport { useSource } from '../Source'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n TerrainSpecification,\n SourceSpecification,\n} from 'mapbox-gl/src/style-spec/types.js'\n\nconst Terrain: Component<{\n style: TerrainSpecification\n visible?: boolean\n}> = props => {\n const map: MapboxMap = useMap()\n const source: SourceSpecification = useSource()\n\n // Add Terrain Layer\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setTerrain({ ...props.style, source: source.id })\n })\n\n // Remove Terrain Layer\n onCleanup(() => map().setTerrain(null))\n\n // Update Visibility\n createEffect(async () => {\n if (props.visible === undefined) return\n\n !map().isStyleLoaded() && (await map().once('styledata'))\n map().setTerrain(props.visible ? props.style : null)\n })\n\n return props.children\n}\n\nexport default Terrain\n","import { onMount, onCleanup, createSignal, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { Options as AttributionOptions } from 'mapbox-gl/src/ui/control/attribution_control'\nimport type { Options as FullscreenOptions } from 'mapbox-gl/src/ui/control/fullscreen_control'\nimport type { Options as GeolocateOptions } from 'mapbox-gl/src/ui/control/geolocate_control'\nimport type { Options as NavigationOptions } from 'mapbox-gl/src/ui/control/navigation_control'\nimport type { Options as ScaleOptions } from 'mapbox-gl/src/ui/control/scale_control'\n\nconst Control: Component<{\n type:\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\n const getControl = (type, 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 'fullscreen':\n return new mapboxgl.FullscreenControl(\n options || { container: map().container }\n )\n case 'geolocate':\n return new mapboxgl.GeolocateControl(options)\n // case 'language':\n // try {\n // const MapboxLanguage = require('@mapbox/mapbox-gl-language').default\n // return new MapboxLanguage(options)\n // } catch (e) {}\n // case 'traffic':\n // try {\n // const MapboxTraffic = require('@mapbox/mapbox-gl-traffic').default\n // require('@mapbox/mapbox-gl-traffic/mapbox-gl-traffic.css')\n // return new MapboxTraffic(options)\n // } catch (e) {}\n }\n }\n\n // Add Control\n onMount(() => {\n const control = getControl(props.type, props.options)\n control && map().addControl(control, props.position)\n setControl(control)\n })\n\n onCleanup(() => map().removeControl(control()))\n\n return props.children\n}\n\nexport default Control\n","import { onMount, onCleanup, createEffect, Component, children } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { MarkerSpecification } from 'mapbox-gl/src/style-spec/types.js'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\n\nconst Marker: Component<{\n options?: MarkerSpecification\n lnglat: LngLatLike\n}> = props => {\n const map: MapboxMap = useMap()\n let marker = null\n\n // Add Marker\n onMount(async () => {\n marker = new mapboxgl.Marker(props.options)\n .setLngLat(props.lnglat)\n .setPopup(\n props.children\n ? new mapboxgl.Popup().setDOMContent(<div>{props.children}</div>)\n : null\n )\n .addTo(map())\n })\n // Remove Marker\n onCleanup(() => marker.remove())\n\n // Update Position\n createEffect(() => marker.setLngLat(props.lnglat))\n\n return <></>\n}\n\nexport default Marker\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport mapboxgl from 'mapbox-gl'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type { PopupSpecification } from 'mapbox-gl/src/style-spec/types.js'\nimport type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js'\n\nconst Popup: Component<{\n options?: PopupSpecification\n lnglat: LngLatLike\n}> = props => {\n const map: MapboxMap = useMap()\n let popup = null\n\n // Add Popup\n onMount(async () => {\n popup = new mapboxgl.Popup(props.options)\n .setLngLat(props.lnglat)\n .setDOMContent(<div>{props.children}</div>)\n .addTo(map())\n })\n // Remove Popup\n onCleanup(() => popup.remove())\n\n // Update Position\n createEffect(() => popup.setLngLat(props.lnglat))\n\n // Update Content\n createEffect(() => popup.setDOMContent(<div>{props.children}</div>))\n\n return <></>\n}\n\nexport default Popup\n","import { onMount, onCleanup, createEffect, Component } from 'solid-js'\nimport { useMap } from '../MapGL'\nimport type MapboxMap from 'mapbox-gl/src/ui/map'\nimport type {\n StyleImageInterface,\n StyleImageMetadata,\n} from 'mapbox-gl/src/style/style_image'\n\nconst Image: Component<{\n id: string\n url?: string\n image?:\n | HTMLImageElement\n | ImageBitmap\n | ImageData\n | { width: number; height: number; data: Uint8Array | Uint8ClampedArray }\n | StyleImageInterface\n options?: StyleImageMetadata\n}> = props => {\n const map: MapboxMap = useMap()\n // Add Image\n onMount(async () => {\n !map().isStyleLoaded() && (await map().once('styledata'))\n if (props.url) {\n map().loadImage(props.url, (error, image) => {\n if (error) throw error\n !map().hasImage(props.id) && map().addImage(props.id, image)\n })\n } else {\n !map().hasImage(props.id) &&\n map().addImage(props.id, props.image, props.options)\n }\n })\n // Remove Image\n onCleanup(() => map().hasImage(props.id) && map().removeImage(props.id))\n\n // Update Image\n createEffect(async () => {\n if (props.image && props.url) return\n\n if (props.url) {\n map().loadImage(props.url, (error, image) => {\n if (error) throw error\n !map().hasImage(props.id) && map().updateImage(props.id, image)\n })\n } else {\n map().style &&\n map().hasImage(props.id) &&\n map().updateImage(props.id, props.image)\n }\n })\n\n return <></>\n}\n\nexport default Image\n"],"names":["mapEvents","layerEvents","pending","start","useTransition","isInternal","setInternal","createSignal","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","remove","createEffect","forEach","item","event","slice","toLowerCase","callback","e","on","off","showTileBoundaries","showTerrainWireframe","showPadding","showCollisionBoxes","showOverdrawInspector","getCanvas","style","cursor","cursorStyle","prev","setStyle","projection","setProjection","originalEvent","getCenter","getZoom","getPitch","getBearing","callEnd","cameraForBounds","console","log","transitionType","stop","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","Object","keys","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","NavigationControl","ScaleControl","AttributionControl","FullscreenControl","GeolocateControl","getControl","addControl","position","removeControl","Marker","marker","setLngLat","lnglat","setPopup","Popup","setDOMContent","addTo","popup","Image","url","loadImage","error","image","hasImage","addImage","removeImage","updateImage"],"mappings":"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"}
|
|
@@ -4,40 +4,34 @@ import mapboxgl from 'mapbox-gl';
|
|
|
4
4
|
const Control = props => {
|
|
5
5
|
const map = useMap();
|
|
6
6
|
const [control, setControl] = createSignal(null);
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
let control;
|
|
10
|
-
switch (props.type) {
|
|
7
|
+
const getControl = (type, options) => {
|
|
8
|
+
switch (type) {
|
|
11
9
|
case 'navigation':
|
|
12
|
-
|
|
13
|
-
break;
|
|
10
|
+
return new mapboxgl.NavigationControl(options);
|
|
14
11
|
case 'scale':
|
|
15
|
-
|
|
16
|
-
break;
|
|
12
|
+
return new mapboxgl.ScaleControl(options);
|
|
17
13
|
case 'attribution':
|
|
18
|
-
|
|
19
|
-
break;
|
|
14
|
+
return new mapboxgl.AttributionControl(options);
|
|
20
15
|
case 'fullscreen':
|
|
21
|
-
|
|
22
|
-
break;
|
|
16
|
+
return new mapboxgl.FullscreenControl(options || { container: map().container });
|
|
23
17
|
case 'geolocate':
|
|
24
|
-
|
|
25
|
-
break;
|
|
18
|
+
return new mapboxgl.GeolocateControl(options);
|
|
26
19
|
// case 'language':
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
// break
|
|
20
|
+
// try {
|
|
21
|
+
// const MapboxLanguage = require('@mapbox/mapbox-gl-language').default
|
|
22
|
+
// return new MapboxLanguage(options)
|
|
23
|
+
// } catch (e) {}
|
|
32
24
|
// case 'traffic':
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
// .
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
// control = new MapboxTraffic(props.options)
|
|
39
|
-
// break
|
|
25
|
+
// try {
|
|
26
|
+
// const MapboxTraffic = require('@mapbox/mapbox-gl-traffic').default
|
|
27
|
+
// require('@mapbox/mapbox-gl-traffic/mapbox-gl-traffic.css')
|
|
28
|
+
// return new MapboxTraffic(options)
|
|
29
|
+
// } catch (e) {}
|
|
40
30
|
}
|
|
31
|
+
};
|
|
32
|
+
// Add Control
|
|
33
|
+
onMount(() => {
|
|
34
|
+
const control = getControl(props.type, props.options);
|
|
41
35
|
control && map().addControl(control, props.position);
|
|
42
36
|
setControl(control);
|
|
43
37
|
});
|
|
@@ -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,6 +31,16 @@ const Layer = props => {
|
|
|
30
31
|
.layers.find(l => l.type === props.beforeType).id
|
|
31
32
|
: props.beforeId);
|
|
32
33
|
});
|
|
34
|
+
onCleanup(() => map().removeLayer(props.id));
|
|
35
|
+
// Hook up events
|
|
36
|
+
createEffect(() => layerEvents.forEach(item => {
|
|
37
|
+
if (props[item]) {
|
|
38
|
+
const event = item.slice(2).toLowerCase();
|
|
39
|
+
const callback = e => props[item](e);
|
|
40
|
+
map().on(event, props.id, callback);
|
|
41
|
+
onCleanup(() => map().off(event, props.id, callback));
|
|
42
|
+
}
|
|
43
|
+
}));
|
|
33
44
|
// Update Style
|
|
34
45
|
createEffect((prev) => {
|
|
35
46
|
if (!props.style ||
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { createEffect, onMount, onCleanup, createContext, useContext, useTransition, } from 'solid-js';
|
|
2
|
-
import
|
|
1
|
+
import { createSignal, createEffect, onMount, onCleanup, createContext, useContext, useTransition, } from 'solid-js';
|
|
2
|
+
import { mapEvents } from '../../events';
|
|
3
3
|
import mapboxgl from 'mapbox-gl';
|
|
4
4
|
import 'mapbox-gl/dist/mapbox-gl.css';
|
|
5
5
|
const [pending, start] = useTransition();
|
|
6
|
+
const [isInternal, setInternal] = createSignal(false);
|
|
6
7
|
const MapContext = createContext();
|
|
7
8
|
const useMap = () => useContext(MapContext);
|
|
8
9
|
const MapGL = props => {
|
|
@@ -12,7 +13,7 @@ const MapGL = props => {
|
|
|
12
13
|
map = new mapboxgl.Map({
|
|
13
14
|
...props.options,
|
|
14
15
|
container: mapRef,
|
|
15
|
-
interactive: props.onViewportChange,
|
|
16
|
+
interactive: !!props.onViewportChange,
|
|
16
17
|
bounds: props.viewport.bounds,
|
|
17
18
|
center: props.viewport.center,
|
|
18
19
|
zoom: props.viewport.zoom || null,
|
|
@@ -23,71 +24,74 @@ const MapGL = props => {
|
|
|
23
24
|
});
|
|
24
25
|
onCleanup(() => map.remove());
|
|
25
26
|
// Hook up events
|
|
26
|
-
createEffect(() =>
|
|
27
|
-
|
|
27
|
+
createEffect(() => mapEvents.forEach(item => {
|
|
28
|
+
if (props[item]) {
|
|
29
|
+
const event = item.slice(2).toLowerCase();
|
|
30
|
+
const callback = e => props[item](e);
|
|
31
|
+
map.on(event, callback);
|
|
32
|
+
onCleanup(() => map().off(event, callback));
|
|
33
|
+
}
|
|
28
34
|
}));
|
|
35
|
+
// Update debug features
|
|
36
|
+
createEffect(() => (map.showTileBoundaries = props.showTileBoundaries));
|
|
37
|
+
createEffect(() => (map.showTerrainWireframe = props.showTerrainWireframe));
|
|
38
|
+
createEffect(() => (map.showPadding = props.showPadding));
|
|
39
|
+
createEffect(() => (map.showCollisionBoxes = props.showCollisionBoxes));
|
|
40
|
+
createEffect(() => (map.showOverdrawInspector = props.showOverdrawInspector));
|
|
41
|
+
createEffect(() => (map.getCanvas().style.cursor = props.cursorStyle));
|
|
29
42
|
// Update map style
|
|
30
|
-
createEffect(prev =>
|
|
31
|
-
|
|
43
|
+
createEffect(prev => {
|
|
44
|
+
prev !== props.options.style && map.setStyle(props.options.style);
|
|
45
|
+
}, props.options.style);
|
|
46
|
+
// Update projection
|
|
47
|
+
createEffect(prev => {
|
|
48
|
+
prev !== props.options.projection &&
|
|
49
|
+
map.setProjection(props.options.projection);
|
|
50
|
+
}, props.options.projection);
|
|
51
|
+
// Hook up viewport events
|
|
32
52
|
createEffect(() => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
'zoomend',
|
|
38
|
-
'pitchend',
|
|
39
|
-
'rotateend',
|
|
40
|
-
'boxzoomend',
|
|
41
|
-
].forEach(item => map.on(item, evt => {
|
|
42
|
-
if (evt.isInternal)
|
|
43
|
-
return;
|
|
44
|
-
const viewport = {
|
|
53
|
+
const callback = event => {
|
|
54
|
+
if (event.originalEvent) {
|
|
55
|
+
setInternal(true);
|
|
56
|
+
props.onViewportChange({
|
|
45
57
|
center: map.getCenter(),
|
|
46
58
|
zoom: map.getZoom(),
|
|
47
59
|
pitch: map.getPitch(),
|
|
48
60
|
bearing: map.getBearing(),
|
|
49
61
|
padding: props.viewport.padding,
|
|
50
62
|
bounds: props.viewport.bounds,
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const callEnd = event => setInternal(false);
|
|
67
|
+
map.on('move', callback).on('moveend', callEnd);
|
|
68
|
+
onCleanup(() => map().off('move', callback).off('moveend', callEnd));
|
|
54
69
|
});
|
|
70
|
+
// Update boundaries
|
|
55
71
|
createEffect(prev => {
|
|
56
|
-
if (props.viewport.bounds != prev)
|
|
57
|
-
const camera = map.cameraForBounds(props.viewport.bounds, {
|
|
58
|
-
padding: props.viewport.padding,
|
|
59
|
-
});
|
|
72
|
+
if (props.viewport.bounds != prev)
|
|
60
73
|
props.onViewportChange({
|
|
61
74
|
...props.viewport,
|
|
62
|
-
...
|
|
75
|
+
...map.cameraForBounds(props.viewport.bounds, {
|
|
76
|
+
padding: props.viewport.padding,
|
|
77
|
+
}),
|
|
63
78
|
});
|
|
64
|
-
}
|
|
65
79
|
return props.viewport.bounds;
|
|
66
80
|
}, props.viewport.bounds);
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
map.stop();
|
|
80
|
-
switch (props.transitionType) {
|
|
81
|
-
case 'easeTo':
|
|
82
|
-
map.easeTo(nvp, { isInternal: true });
|
|
83
|
-
case 'jumpTo':
|
|
84
|
-
map.jumpTo(nvp, { isInternal: true });
|
|
85
|
-
default:
|
|
86
|
-
map.flyTo(nvp, { isInternal: true });
|
|
87
|
-
}
|
|
81
|
+
// Update Viewport
|
|
82
|
+
createEffect(() => {
|
|
83
|
+
if (isInternal())
|
|
84
|
+
return;
|
|
85
|
+
console.log(props.transitionType, props.viewport);
|
|
86
|
+
switch (props.transitionType) {
|
|
87
|
+
case 'easeTo':
|
|
88
|
+
map.stop().easeTo(props.viewport);
|
|
89
|
+
case 'jumpTo':
|
|
90
|
+
map.stop().jumpTo(props.viewport);
|
|
91
|
+
default:
|
|
92
|
+
map.stop().flyTo(props.viewport);
|
|
88
93
|
}
|
|
89
|
-
|
|
90
|
-
}, props.viewport);
|
|
94
|
+
});
|
|
91
95
|
let index = 0;
|
|
92
96
|
createEffect(() => {
|
|
93
97
|
if (props.triggerResize) {
|
|
@@ -1,20 +1,22 @@
|
|
|
1
|
-
const
|
|
2
|
-
'onResize',
|
|
3
|
-
'onRemove',
|
|
1
|
+
const mapEvents = [
|
|
4
2
|
'onMouseDown',
|
|
5
3
|
'onMouseUp',
|
|
6
4
|
'onMouseOver',
|
|
5
|
+
'onMouseOut',
|
|
7
6
|
'onMouseMove',
|
|
8
|
-
'onClick',
|
|
9
|
-
'onDblClick',
|
|
10
7
|
'onMouseEnter',
|
|
11
8
|
'onMouseLeave',
|
|
12
|
-
'
|
|
9
|
+
'onPreClick',
|
|
10
|
+
'onClick',
|
|
11
|
+
'onDblClick',
|
|
13
12
|
'onContextMenu',
|
|
14
13
|
'onTouchStart',
|
|
15
14
|
'onTouchEnd',
|
|
16
|
-
'onTouchMove',
|
|
17
15
|
'onTouchCancel',
|
|
16
|
+
'onWheel',
|
|
17
|
+
'onResize',
|
|
18
|
+
'onRemove',
|
|
19
|
+
'onTouchMove',
|
|
18
20
|
'onMoveStart',
|
|
19
21
|
'onMove',
|
|
20
22
|
'onMoveEnd',
|
|
@@ -26,7 +28,7 @@ const events = [
|
|
|
26
28
|
'onZoomEnd',
|
|
27
29
|
'onRotateStart',
|
|
28
30
|
'onRotate',
|
|
29
|
-
'
|
|
31
|
+
'onRotatEnd',
|
|
30
32
|
'onPitchStart',
|
|
31
33
|
'onPitch',
|
|
32
34
|
'onPitchEnd',
|
|
@@ -36,6 +38,8 @@ const events = [
|
|
|
36
38
|
'onWebglContextLost',
|
|
37
39
|
'onWebglContextRestored',
|
|
38
40
|
'onLoad',
|
|
41
|
+
'onRender',
|
|
42
|
+
'onIdle',
|
|
39
43
|
'onError',
|
|
40
44
|
'onData',
|
|
41
45
|
'onStyleData',
|
|
@@ -43,5 +47,21 @@ const events = [
|
|
|
43
47
|
'onDataLoading',
|
|
44
48
|
'onStyleDataLoading',
|
|
45
49
|
'onSourceDataLoading',
|
|
50
|
+
'onStyleImageMissing',
|
|
51
|
+
];
|
|
52
|
+
const layerEvents = [
|
|
53
|
+
'onMouseDown',
|
|
54
|
+
'onMouseUp',
|
|
55
|
+
'onMouseOver',
|
|
56
|
+
'onMouseOut',
|
|
57
|
+
'onMouseMove',
|
|
58
|
+
'onMouseEnter',
|
|
59
|
+
'onMouseLeave',
|
|
60
|
+
'onClick',
|
|
61
|
+
'onDblClick',
|
|
62
|
+
'onContextMenu',
|
|
63
|
+
'onTouchStart',
|
|
64
|
+
'onTouchEnd',
|
|
65
|
+
'onTouchCancel',
|
|
46
66
|
];
|
|
47
|
-
export {
|
|
67
|
+
export { mapEvents, layerEvents };
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Component } from 'solid-js';
|
|
2
2
|
import 'mapbox-gl/dist/mapbox-gl.css';
|
|
3
3
|
import type MapboxOptions from 'mapbox-gl/src/ui/map';
|
|
4
|
-
import type MapMouseEvent from 'mapbox-gl/src/ui/events';
|
|
5
4
|
import type { LngLatLike } from 'mapbox-gl/src/geo/lng_lat.js';
|
|
6
5
|
import type { LngLatBounds } from 'mapbox-gl/src/geo/lng_lat_bounds.js';
|
|
7
6
|
import type { PaddingOptions } from 'mapbox-gl/src/geo/edge_insets.js';
|
|
@@ -24,7 +23,13 @@ declare const MapGL: Component<{
|
|
|
24
23
|
children?: Element | Element[];
|
|
25
24
|
triggerResize?: boolean;
|
|
26
25
|
transitionType?: 'flyTo' | 'easeTo' | 'jumpTo';
|
|
27
|
-
onMouseMove?: (event: MapMouseEvent) => void;
|
|
28
26
|
onViewportChange?: (viewport: Viewport) => void;
|
|
27
|
+
showTileBoundaries?: boolean;
|
|
28
|
+
showTerrainWireframe?: boolean;
|
|
29
|
+
showPadding?: boolean;
|
|
30
|
+
showCollisionBoxes?: boolean;
|
|
31
|
+
showOverdrawInspector?: boolean;
|
|
32
|
+
repaint?: boolean;
|
|
33
|
+
cursorStyle?: string;
|
|
29
34
|
}>;
|
|
30
35
|
export { MapGL as default, useMap };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -9,4 +9,3 @@ 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,8 +1,27 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.1.
|
|
2
|
+
"version": "1.1.14",
|
|
3
3
|
"name": "solid-map-gl",
|
|
4
4
|
"description": "Solid Component Library for Mapbox GL JS",
|
|
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.",
|
|
6
|
+
"homepage": "https://determined-mirzakhani-29bbc7.netlify.app",
|
|
5
7
|
"author": "kaihuebner",
|
|
8
|
+
"contributors": [
|
|
9
|
+
{
|
|
10
|
+
"name": "Kai Huebner",
|
|
11
|
+
"email": "kai.huebner@gmail.com"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"keywords": [
|
|
15
|
+
"gis",
|
|
16
|
+
"map",
|
|
17
|
+
"webgl",
|
|
18
|
+
"mapbox-gl",
|
|
19
|
+
"mapbox-gl-js",
|
|
20
|
+
"mapbox",
|
|
21
|
+
"solidjs",
|
|
22
|
+
"solidhack",
|
|
23
|
+
"best_ecosystem"
|
|
24
|
+
],
|
|
6
25
|
"license": "MIT",
|
|
7
26
|
"type": "module",
|
|
8
27
|
"files": [
|
|
@@ -24,15 +43,6 @@
|
|
|
24
43
|
"type": "git",
|
|
25
44
|
"url": "git+https://github.com/gishub4/solid-map-gl.git"
|
|
26
45
|
},
|
|
27
|
-
"keywords": [
|
|
28
|
-
"map",
|
|
29
|
-
"webgl",
|
|
30
|
-
"mapbox-gl",
|
|
31
|
-
"mapbox-gl-js",
|
|
32
|
-
"mapbox",
|
|
33
|
-
"solidjs"
|
|
34
|
-
],
|
|
35
|
-
"homepage": "https://github.com/gishub4/solid-map-gl#readme",
|
|
36
46
|
"browserList": [
|
|
37
47
|
"defaults",
|
|
38
48
|
"not ie 11"
|