solid-map-gl 1.13.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +157 -30
  2. package/dist/index.d.ts +489 -0
  3. package/dist/index.js +11 -0
  4. package/dist/index.jsx +2320 -0
  5. package/package.json +46 -35
  6. package/dist/esm/index.js +0 -2
  7. package/dist/esm/index.js.map +0 -1
  8. package/dist/esm/styles.css +0 -1
  9. package/dist/source/components/Atmosphere/index.jsx +0 -13
  10. package/dist/source/components/Camera/index.jsx +0 -108
  11. package/dist/source/components/Control/index.jsx +0 -33
  12. package/dist/source/components/Draw/drawingStyles.jsx +0 -225
  13. package/dist/source/components/Draw/index.jsx +0 -52
  14. package/dist/source/components/Draw/modes/line_string.js +0 -43
  15. package/dist/source/components/Draw/modes/measurements.js +0 -76
  16. package/dist/source/components/Draw/modes/multi_point.js +0 -37
  17. package/dist/source/components/Draw/modes/point.js +0 -25
  18. package/dist/source/components/Draw/modes/polygon.js +0 -25
  19. package/dist/source/components/Draw/modes/radius.js +0 -138
  20. package/dist/source/components/Draw/modes/rectangle.js +0 -118
  21. package/dist/source/components/Draw/modes/rectangle_assisted.js +0 -233
  22. package/dist/source/components/Image/index.jsx +0 -135
  23. package/dist/source/components/Layer/index.jsx +0 -125
  24. package/dist/source/components/Layer3D/index.jsx +0 -330
  25. package/dist/source/components/Light/index.jsx +0 -10
  26. package/dist/source/components/MapGL/index.jsx +0 -273
  27. package/dist/source/components/MapProvider/index.jsx +0 -9
  28. package/dist/source/components/Marker/index.jsx +0 -57
  29. package/dist/source/components/Popup/index.jsx +0 -38
  30. package/dist/source/components/Source/index.jsx +0 -89
  31. package/dist/source/components/Terrain/index.jsx +0 -30
  32. package/dist/source/events.js +0 -78
  33. package/dist/source/index.jsx +0 -14
  34. package/dist/source/mapStyles.js +0 -116
  35. package/dist/source/styles.js +0 -62
  36. package/dist/types/components/Atmosphere/index.d.ts +0 -8
  37. package/dist/types/components/Camera/index.d.ts +0 -54
  38. package/dist/types/components/Control/index.d.ts +0 -15
  39. package/dist/types/components/Draw/drawingStyles.d.ts +0 -20
  40. package/dist/types/components/Draw/index.d.ts +0 -16
  41. package/dist/types/components/Draw/modes/line_string.d.ts +0 -2
  42. package/dist/types/components/Draw/modes/multi_point.d.ts +0 -2
  43. package/dist/types/components/Draw/modes/point.d.ts +0 -2
  44. package/dist/types/components/Draw/modes/polygon.d.ts +0 -2
  45. package/dist/types/components/Draw/modes/radius.d.ts +0 -2
  46. package/dist/types/components/Draw/modes/rectangle.d.ts +0 -2
  47. package/dist/types/components/Draw/modes/rectangle_assisted.d.ts +0 -18
  48. package/dist/types/components/Image/index.d.ts +0 -28
  49. package/dist/types/components/Layer/index.d.ts +0 -32
  50. package/dist/types/components/Layer3D/index.d.ts +0 -22
  51. package/dist/types/components/Light/index.d.ts +0 -8
  52. package/dist/types/components/MapGL/index.d.ts +0 -96
  53. package/dist/types/components/MapProvider/index.d.ts +0 -11
  54. package/dist/types/components/Marker/index.d.ts +0 -28
  55. package/dist/types/components/Popup/index.d.ts +0 -18
  56. package/dist/types/components/Source/index.d.ts +0 -13
  57. package/dist/types/components/Terrain/index.d.ts +0 -7
  58. package/dist/types/events.d.ts +0 -103
  59. package/dist/types/index.d.ts +0 -16
  60. package/dist/types/mapStyles.d.ts +0 -2
  61. package/dist/types/styles.d.ts +0 -2
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
- "version": "1.13.0",
2
+ "version": "2.0.0",
3
3
  "name": "solid-map-gl",
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.",
4
+ "description": "SolidJS Component Library for Mapbox GL JS & MapLibre GL JS",
5
+ "info": "SolidJS Component Library for Mapbox GL JS & MapLibre GL JS. Mapbox GL JS and MapLibre GL JS are JavaScript libraries that render interactive maps from vector tiles and map styles using WebGL. This project is intended to be as close as possible to the Mapbox GL JS API.",
6
6
  "homepage": "https://gis-hub.gitbook.io/solid-map-gl",
7
7
  "author": "kaihuebner",
8
8
  "contributors": [
@@ -26,23 +26,24 @@
26
26
  "files": [
27
27
  "dist"
28
28
  ],
29
- "source": "dist/index/index.jsx",
30
- "main": "dist/esm/index.js",
31
- "module": "dist/esm/index.js",
32
- "types": "dist/types/index.d.ts",
29
+ "source": "./dist/index.jsx",
30
+ "main": "./dist/index.js",
31
+ "module": "./dist/index.js",
32
+ "types": "./dist/index.d.ts",
33
33
  "exports": {
34
- ".": {
35
- "solid": "./dist/source/index.jsx",
36
- "default": "./dist/esm/index.js",
37
- "types": "./dist/types/index.d.ts"
34
+ "solid": "./dist/index.jsx",
35
+ "import": {
36
+ "types": "./dist/index.d.ts",
37
+ "default": "./dist/index.js"
38
38
  }
39
39
  },
40
40
  "scripts": {
41
- "build": "rollup -c",
42
- "watch": "rollup -c -w",
43
- "pub": "rollup -c && npm version patch && npm publish",
41
+ "build": "tsup",
42
+ "watch": "tsup --watch",
43
+ "pub": "tsup && npm version patch && npm publish",
44
44
  "test": "vitest",
45
- "coverage": "vitest run --coverage"
45
+ "coverage": "vitest run --coverage",
46
+ "docs:api": "typedoc"
46
47
  },
47
48
  "repository": {
48
49
  "type": "git",
@@ -53,40 +54,50 @@
53
54
  "not ie 11"
54
55
  ],
55
56
  "devDependencies": {
56
- "@rollup/plugin-terser": "^0.4.4",
57
57
  "@solidjs/testing-library": "^0.8.10",
58
- "@testing-library/jest-dom": "^6.8.0",
59
- "@types/mapbox-gl": "^3.4.1",
60
- "@vitest/coverage-v8": "^3.2.4",
61
- "jsdom": "^26.1.0",
58
+ "@testing-library/jest-dom": "^7.0.1",
59
+ "@vitest/coverage-v8": "^4.1.11",
60
+ "jsdom": "^30.0.1",
62
61
  "jsdom-worker": "^0.3.0",
63
- "rollup": "^4.47.1",
64
- "rollup-plugin-import-css": "^4.0.2",
65
- "rollup-preset-solid": "^3.0.0",
66
- "typescript": "^5.9.2",
67
- "vite": "^7.1.3",
68
- "vite-plugin-solid": "^2.11.8",
69
- "vitest": "^3.2.4"
62
+ "mapbox-gl": "^3.30.0",
63
+ "maplibre-gl": "^6.7.0",
64
+ "tsup": "^8.5.1",
65
+ "tsup-preset-solid": "^2.2.0",
66
+ "typedoc": "^0.28.20",
67
+ "typedoc-plugin-markdown": "^4.13.0",
68
+ "typescript": "^6.0.3",
69
+ "vite": "^8.2.2",
70
+ "vite-plugin-solid": "^2.11.10",
71
+ "vitest": "^4.1.11"
70
72
  },
71
73
  "peerDependencies": {
72
74
  "@babylonjs/core": "^6.24.0",
73
- "mapbox-gl": "*",
74
- "solid-js": "*",
75
+ "mapbox-gl": "^3.0.0",
76
+ "maplibre-gl": "^4.0.0 || ^5.0.0 || ^6.0.0",
77
+ "solid-js": "^1.8.0 <2.0.0",
75
78
  "three": "^0.157.0"
76
79
  },
77
80
  "peerDependenciesMeta": {
78
81
  "@babylonjs/core": {
79
82
  "optional": true
80
83
  },
84
+ "mapbox-gl": {
85
+ "optional": true
86
+ },
87
+ "maplibre-gl": {
88
+ "optional": true
89
+ },
81
90
  "three": {
82
91
  "optional": true
83
92
  }
84
93
  },
85
94
  "dependencies": {
86
- "@turf/area": "^7.2.0",
87
- "@turf/center-of-mass": "^7.2.0",
88
- "@turf/centroid": "^7.2.0",
89
- "@turf/length": "^7.2.0",
90
- "@turf/midpoint": "^7.2.0"
91
- }
95
+ "@turf/area": "^7.3.4",
96
+ "@turf/center-of-mass": "^7.3.4",
97
+ "@turf/centroid": "^7.3.4",
98
+ "@turf/length": "^7.3.4",
99
+ "@turf/midpoint": "^7.3.4"
100
+ },
101
+ "browser": {},
102
+ "typesVersions": {}
92
103
  }
package/dist/esm/index.js DELETED
@@ -1,2 +0,0 @@
1
- import{createComponent as e,template as t,use as o,insert as a,memo as n,effect as r,setAttribute as i,className as s,classList as l,style as p}from"solid-js/web";import{createContext as c,useContext as d,createSignal as m,onMount as g,createEffect as u,on as h,onCleanup as y,createUniqueId as b,splitProps as w,untrack as f}from"solid-js";import{createStore as v}from"solid-js/store";const[x,k]=v({map:null}),M=c([x]),L=()=>d(M),$=t=>(t.map&&k("map",t.map),e(M.Provider,{value:[x],get children(){return t.children}})),S=["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"],j=["onMouseDown","onMouseUp","onMouseOver","onMouseOut","onMouseMove","onMouseEnter","onMouseLeave","onClick","onDblClick","onContextMenu","onTouchStart","onTouchEnd","onTouchCancel"],C=["onCreate","onDelete","onCombine","onUncombine","onUpdate","onSelectionchange","onModechange","onRender","onActionable"],z="mapbox://styles/mapbox",_="https://raw.githubusercontent.com/",E="https://raw.githubusercontent.com/GIShub4/map-styles/main/",I="https://assets.vector.hereapi.com/styles/",P={mb:{standard:`${z}/standard`,light:`${z}/light-v11`,dark:`${z}/dark-v11`,street:`${z}/streets-v12`,outdoor:`${z}/outdoors-v12`,sat:`${z}/satellite-v9`,sat_street:`${z}/satellite-streets-v12`,nav_base:`${z}/navigation-guidance-day-v4`,nav_base_night:`${z}/navigation-guidance-night-v4`,nav:`${z}/navigation-day-v1`,nav_night:`${z}/navigation-night-v1`,basic:`${z}/cjf4m44iw0uza2spb3q0a7s41`,monochrome:`${z}/cjv6rzz4j3m4b1fqcchuxclhb`,leshine:`${z}/cjcunv5ae262f2sm9tfwg8i0w`,icecream:`${z}/cj7t3i5yj0unt2rmt3y4b5e32`,cali:`${z}/cjerxnqt3cgvp2rmyuxbeqme7`,northstar:`${z}/cj44mfrt20f082snokim4ungi`,mineral:`${z}/cjtep62gq54l21frr1whf27ak`,moonlight:`${z}/cj3kbeqzo00022smj7akz3o1e`,frank:`${z}-map-design/ckshxkppe0gge18nz20i0nrwq`,minimo:`${z}-map-design/cksjc2nsq1bg117pnekb655h1`,decimal:`${z}-map-design/ck4014y110wt61ctt07egsel6`,stand:`${z}-map-design/ckr0svm3922ki18qntevm857n`,blueprint:`${z}-map-design/cks97e1e37nsd17nzg7p0308g`,bubble:`${z}-map-design/cksysy2nl62zp17quosctdtcc`,pencil:`${z}-map-design/cks9iema71es417mlrft4go2k`,swiss_ski:`${_}mapbox/mapbox-gl-swiss-ski-style/master/cij1zoclj002y8rkkdjl69psd.json`,vintage:`${_}mapbox/mapbox-gl-vintage-style/master/cif5p01n202nisaktvljx9mv3.json`,whaam:`${_}mapbox/mapbox-gl-whaam-style/master/cii8323c8004w0nlvtss3dbm2.json`,neon:`${_}NatEvatt/awesome-mapbox-gl-styles/master/styles/Neon/style.json`,camoflauge:`${_}jingsam/mapbox-gl-styles/master/Camouflage.json`,emerald:`${_}jingsam/mapbox-gl-styles/master/Emerald.json`,runner:`${_}jingsam/mapbox-gl-styles/master/Runner.json`,x_ray:`${_}jingsam/mapbox-gl-styles/master/X-ray.json`},here:{base:`${I}berlin/base/mapbox/tilezen?apikey={apikey}`,day:`${I}berlin/day/mapbox/tilezen?apikey={apikey}`,night:`${I}berlin/night/mapbox/tilezen?apikey={apikey}`},esri:{blueprint:`${E}esri:blueprint.json`,charted_territory:`${E}esri:charted-territory.json`,colored_pencil:`${E}esri:colored-pencil.json`,community:`${E}esri:community.json`,mid_century:`${E}esri:mid-century.json`,modern_antique:`${E}esri:modern-antique.json`,nat_geo:`${E}esri:national-geographic.json`,newspaper:`${E}esri:newspaper.json`,open_street_map:`${E}esri:open-street-map.json`,light_gray_canvas:`${E}esri:light-gray-canvas.json`,dark_gray_canvas:`${E}esri:dark-gray-canvas.json`,human_geo_light:`${E}esri:human-geography-light.json`,human_geo_dark:`${E}esri:human-geography-dark.json`,world_navigation:`${E}esri:world-navigation.json`,world_street:`${E}esri:world-street.json`,world_street_night:`${E}esri:world-street-night.json`,world_terrain:`${E}esri:world-terrain.json`,world_terrain_hybrid:`${E}esri:world-terrain-hybrid.json`,world_topographic:`${E}esri:world-topographic.json`,chromium:`${E}esri:chromium.json`,dreamcatcher:`${E}esri:dreamcatcher.json`,seahaven:`${E}esri:seahaven.json`,sangria:`${E}esri:sangria.json`,mercurial:`${E}esri:mercurial.json`,imagery:`${E}esri:imagery.json`,imagery_hybrid:`${E}esri:imagery-hybrid.json`,firefly:`${E}esri:firefly.json`,firefly_hybrid:`${E}esri:firefly-hybrid.json`,oceans:`${E}esri:oceans.json`}},T="https://{s}.basemaps.cartocdn.com/rastertiles/",O="https://stamen-tiles-{s}.a.ssl.fastly.net/",A="https://{s}.tile.thunderforest.com/",D={osm:{org:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",human:"https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png",cycle:"https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png",topo:"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",_copy:'<a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap</a>'},carto:{voyager:`${T}voyager_labels_under/{z}/{x}/{y}{r}.png`,positron:`${T}light_all/{z}/{x}/{y}{r}.png`,dark:`${T}dark_all/{z}/{x}/{y}{r}.png`,_copy:'<a href="https://carto.com/attribution" target="_blank">&copy; Carto</a>'},stamen:{toner:`${O}toner/{z}/{x}/{y}{r}.png`,toner_lite:`${O}toner-lite/{z}/{x}/{y}{r}.png`,watercolor:`${O}watercolor/{z}/{x}/{y}.png`,terrain:`${O}terrain/{z}/{x}/{y}{r}.png`,_copy:'<a href="https://stamen.com/privacy-policy" target="_blank">&copy; Stamen Design</a>'},tf:{cycle:`${A}cycle/{z}/{x}/{y}{r}.png?apikey={apikey}`,trans:`${A}transport/{z}/{x}/{y}{r}.png?apikey={apikey}`,trans_dark:`${A}transport-dark/{z}/{x}/{y}{r}.png?apikey={apikey}`,landscape:`${A}landscape/{z}/{x}/{y}{r}.png?apikey={apikey}`,outdoors:`${A}outdoors/{z}/{x}/{y}{r}.png?apikey={apikey}`,neighbourhood:`${A}neighbourhood/{z}/{x}/{y}{r}.png?apikey={apikey}`,spinal:`${A}spinal-map/{z}/{x}/{y}{r}.png?apikey={apikey}`,pioneer:`${A}pioneer/{z}/{x}/{y}{r}.png?apikey={apikey}`,atlas:`${A}atlas/{z}/{x}/{y}{r}.png?apikey={apikey}`,mobile:`${A}mobile-atlas/{z}/{x}/{y}{r}.png?apikey={apikey}`,_copy:'<a href="https://thunderforest.com/privacy" target="_blank">&copy; Thunderforest</a>'}};var R=t("<div>"),V=t("<style>.overlay{position:relative;width:100%;height:100%;pointer-events:none}.overlay>*{pointer-events:auto}"),Z=t("<div class=overlay>");const q=t=>{let c,d,b,w;const[f,v]=m(null),[x,k]=m("undefined"!=typeof window&&window.matchMedia("(prefers-color-scheme: dark)").matches||"undefined"!=typeof document&&document.body.classList.contains("dark")),[M,L]=m(!1),j=(e,o)=>(t.debug||t.debugEvents)&&console.debug("%c[MapGL]","color: #0ea5e9",e,o||""),C=(e,o)=>{const a=x()&&o?o:e;return("string"==typeof a||a instanceof String)&&a?.split(":").reduce((e,t)=>e&&e[t],P)?.replace("{apikey}",t.apikey||import.meta.env.VITE_VECTOR_API_KEY)||a};g(async()=>{let e=t.mapLib||await import("mapbox-gl");if(e.Map||(e=window.maplibregl||window.mapboxgl),"function"==typeof e.supported&&!e.supported())throw new Error("Mapbox GL not supported");j(`Map (v${e.version}) loading...`),c=new e.Map({accessToken:t.options?.accessToken||import.meta.env.VITE_MAPBOX_ACCESS_TOKEN,interactive:t.options?.interactive||!!t.onViewportChange,...t.options,...t.viewport,projection:t.options?.projection,container:d,style:C(t.options?.style,t.darkStyle),fitBoundsOptions:{padding:t.viewport?.padding}}),c.debug=t.debug,c.debugEvents=t.debugEvents,c.sourceIdList=[],c.layerIdList=[],window.MapLib=e,S.forEach(e=>{const o=t[e];if(o){const a=e.slice(2).toLowerCase();"function"==typeof o?c.on(a,e=>{setTimeout(()=>{e.clickOnLayer||(o(e),t.debugEvents&&j(`Map '${a}' event:`,e))},0)}):Object.keys(o).forEach(e=>{c.on(a,e,n=>{setTimeout(()=>{n.clickOnLayer||(o[e](n),t.debugEvents&&j(`Map '${a}' event on '${e}':`,n))},0)})})}}),c.once("load",()=>{v(c),j("Map loaded"),["mousedown","touchstart","wheel"].forEach(e=>c.on(e,e=>!e.rotate&&t.onUserInteraction?.(!0))),["moveend","mouseup","touchend"].forEach(e=>c.on(e,e=>!e.rotate&&t.onUserInteraction?.(!1)));const e="undefined"!=typeof window&&window?.matchMedia("(prefers-color-scheme: dark)");e?.addEventListener("change",()=>{k(e.matches),j("Set dark theme to:",e.matches?.toString())}),w=new MutationObserver(()=>{const e=document.body.classList.contains("dark");k(e),j("Set theme to:",e)}),w.observe(document.body,{attributes:!0}),t.disableResize||(b=new ResizeObserver(()=>{setTimeout(()=>{c?.resize()},0),j("Map resized")}),b.observe(d)),u(()=>{for(const e in t.config){if(!e||"id"===e)continue;const o=t.config?.id||"basemap",a=t.config[e];c?.setConfigProperty(o,e,a),j(`Set Config (${o}:${e}) to:`,a)}}),c.on("move",e=>{const o={...t.viewport,id:t.id,point:{x:e.originalEvent?.x,y:e.originalEvent?.y},center:t.viewport?.center?.lat?c.getCenter():[c.getCenter().lng,c.getCenter().lat],zoom:c.getZoom(),pitch:c.getPitch(),bearing:c.getBearing(),inTransit:!0,bounds:null};L(!0),!e.viewport&&t.onViewportChange?.(o)}),c.on("moveend",e=>{!e.rotate&&t.onViewportChange?.({...t.viewport,inTransit:!1}),L(!1)})})}),u(h(()=>t.viewport,e=>{if(t.id!==e?.id||M())return;const o={...e,...e.bounds?c.cameraForBounds(e.bounds,{bearing:e?.bearing,pitch:e?.pitch,padding:e?.padding}):null};c.stop()[t.transitionType||"flyTo"](o),j(`Update Viewport (${t.transitionType||"flyTo"}):`,o)},{defer:!0})),u(()=>{const e=t.options?.projection;c&&e&&(c.setProjection(e),j("Set Projection to:",e))}),u(()=>{const e=t.cursorStyle;c&&e&&(c.getCanvas().style.cursor=e,j("Set Cursor to:",e))});return u(e=>{const o=C(t.options?.style,t.darkStyle);if(c?.isStyleLoaded()&&e!==o){const e=c.getStyle(),t=e.layers.filter(e=>c.layerIdList.includes(e.id)),a=Object.keys(e.sources).filter(e=>c.sourceIdList.includes(e)).reduce((t,o)=>({...t,[o]:e.sources[o]}),{});c.setStyle(o),c.once("styledata",()=>{if(!t)return;const n=c.getStyle();var r,i;c.setStyle({...n,sources:{...n.sources,...a},layers:(r=n.layers,i=t,i.forEach(e=>{const t=r.findIndex(t=>e.metadata.smg.beforeType?t.type===e.metadata.smg.beforeType:t.id===e.metadata.smg.beforeId);r=-1===t?[...r,e]:[...r.slice(0,t),e,...r.slice(t+1)]}),r),fog:e.fog,terrain:e.terrain}),j("Set Mapstyle to:",o)})}return o},t.options?.style),["showTileBoundaries","showTerrainWireframe","showCollisionBoxes","showPadding","showOverdrawInspector"].forEach(e=>{u(()=>{const o=t[e];c&&o&&(c[e]=o,j(`Set ${e} to:`,o))})}),y(()=>{b?.disconnect(),w?.disconnect(),c?.remove(),j("Map removed")}),_=R(),"function"==typeof d?o(d,_):d=_,a(_,(z=n(()=>!!f()),()=>z()&&e($,{get map(){return f()},get children(){return[V(),(e=Z(),a(e,()=>t.children),e)];var e}}))),r(e=>{var o=t.id,a=t?.class,n=t?.classList,r=t?.class||t?.classList?null:t.style||{position:"absolute",inset:0,"z-index":-1};return o!==e.e&&i(_,"id",e.e=o),a!==e.t&&s(_,e.t=a),e.a=l(_,n,e.a),e.o=p(_,r,e.o),e},{e:void 0,t:void 0,a:void 0,o:void 0}),_;var z,_},U=c(),F=()=>d(U),G=t=>{const[o]=L();t.id??=b();const a=(e,t)=>{o.map.debug&&console.debug("%c[MapGL]","color: #ec4899",e,t||"")},n=e=>{const o=e?.split(":").reduce((e,t)=>e&&e[t],D),a=o?{...t.source,url:"",tiles:[o.replace("{apikey}",t.source.apikey||import.meta.env.VITE_RASTER_API_KEY).replace("{r}",window.devicePixelRatio>1?"@2x":"")],attribution:D[e.split(":")[0]]._copy}:t.source;return a.tiles&&(a.tiles=["a","b","c"].map(e=>a.tiles[0].replace("{s}",e))),a};o.map.addSource(t.id,n(t.source.url)),o.map.sourceIdList.push(t.id),a("Add Source:",t.id);const r=o.map.getSource(t.id);switch(t.source.type){case"geojson":u(()=>{const e=t.source.data;o.map.isSourceLoaded(t.id)&&(r.setData(e||{}),a("Update GeoJSON Data:",t.id))});break;case"image":u(()=>{const e=t.source.url,n=t.source.coordinates;o.map.isSourceLoaded(t.id)&&(r.updateImage(e,n),a("Update Image Data:",t.id))});break;case"vector":u(()=>{const e=t.source.url,n=t.source.tiles;o.map.isSourceLoaded(t.id)&&(e?r.setUrl(e):r.setTiles(n),a("Update Vector Data:",t.id))});break;case"raster":u(()=>{const e=n(t.source.url);o.map.isSourceLoaded(t.id)&&(e.url?r.setUrl(e.url):r.setTiles(e.tiles),a("Update Raster Data:",t.id))})}return y(()=>{o.map?.getStyle().layers.forEach(e=>e.source===t.id&&o.map.removeLayer(e.id)),o.map?.getSource(t.id)&&o.map?.removeSource(t.id),a("Remove Source:",t.id)}),e(U.Provider,{get value(){return t.id},get children(){return t.children}})},W=["id","type","filter","source","source-layer","minzoom","metadata","maxzoom","paint","layout"],B=["visibility","line-join","line-cap","line-miter-limit","line-round-limit","line-sort-key","circle-sort-key","symbol-avoid-edges","symbol-placement","symbol-sort-key","symbol-spacing","symbol-z-order","icon-allow-overlap","icon-anchor","icon-ignore-placement","icon-image","icon-keep-upright","icon-offset","icon-optional","icon-padding","icon-pitch-alignment","icon-rotate","icon-rotation-alignment","icon-size","icon-text-fit","icon-text-fit-padding","text-allow-overlap","text-anchor","text-field","text-font","text-ignore-placement","text-justify","text-keep-upright","text-letter-spacing","text-line-height","text-max-angle","text-max-width","text-offset","text-optional","text-padding","text-pitch-alignment","text-radial-offset","text-rotate","text-rotation-alignment","text-size","text-transform","text-variable-anchor","text-writing-mode"],H=(e={},t={})=>[...new Set([...Object.keys(e),...Object.keys(t)])].reduce((o,a)=>{const n=e[a];return n!==t[a]&&o.push([a,n]),o},[]),N=(e,t)=>(e.startsWith(t)||e.startsWith("icon")||e.startsWith("text")?"":t+"-")+e.replace(/[A-Z]/g,e=>"-"+e.toLowerCase()),X=e=>{if(!e)return;let t={},o={},a={};return Object.entries(e).forEach(([n,r])=>{if(W.includes(n))a[n]=r;else{const a=N(n,e.type);B.includes(a)?t[a]=r:o[a]=r}}),e.paint&&Object.entries(e.paint).forEach(([t,a])=>o[N(t,e.type)]=a),e.layout&&Object.entries(e.layout).forEach(([o,a])=>t[N(o,e.type)]=a),{...a,paint:o,layout:t}},Y=e=>{const[t]=L(),o=e.sourceId||e.style?.source||F(),a=e.id||e.customLayer?.id||b(),n=(e,o)=>{(t.map.debug||t.map.debugEvents)&&console.debug("%c[MapGL]","color: #10b981",e,o||"")};return t.map.addLayer(e.customLayer||{...X(e.style),id:a,source:o,slot:e.slot||"",metadata:{smg:{beforeType:e.beforeType,beforeId:e.beforeId}}},e.beforeType?t.map.getStyle().layers.find(t=>t.type===e.beforeType)?.id:e.beforeId),t.map.layerIdList.push(a),e.customLayer&&t.map.fire("load"),n("Add Layer:",a),j.forEach(o=>{if(e[o]){const r=o.slice(2).toLowerCase();t.map.on(r,a,i=>{i.clickOnLayer=!0,e[o](i),t.map.debugEvent&&n(`Layer '${r}' event on '${a}':`,i)})}}),u(o=>{const r=X(e.style);if(r!==o)return r.layout!==o?.layout&&H(r.layout,o?.layout).forEach(([e,o])=>t.map.setLayoutProperty(a,e,o,{validate:!1})),r.paint!==o?.paint&&H(r.paint,o?.paint).forEach(([e,o])=>t.map.setPaintProperty(a,e,o,{validate:!1})),r.minzoom===o?.minzoom&&r.maxzoom===o?.maxzoom||t.map.setLayerZoomRange(a,r.minzoom,r.maxzoom),r.filter!==o?.filter&&t.map.setFilter(a,r.filter,{validate:!1}),n("Update Layer Style:",a),r},X(e.style)),u(o=>{if(e.visible!==o)return t.map.setLayoutProperty(a,"visibility",e.visible?"visible":"none",{validate:!1}),n(`Update Visibility (${a}):`,e.visible.toString()),e.visible},e.visible),u(async()=>{e.filter&&(!t.map.isStyleLoaded()&&await t.map.once("styledata"),t.map.setFilter(a,e.filter),n(`Update Filter (${a}):`,e.filter))}),u(async()=>{e.featureState&&null!==e.featureState.id&&(!t.map.isStyleLoaded()&&await t.map.once("styledata"),t.map.removeFeatureState({source:o,sourceLayer:e.style["source-layer"]}),t.map.setFeatureState({source:o,sourceLayer:e.style["source-layer"],id:e.featureState.id},e.featureState.state))}),y(()=>t.map?.getLayer(a)&&t.map?.removeLayer(a)),e.children},K=c(),J=()=>d(K),Q=t=>{const[o]=L(),[a,n]=m(null);return g(async()=>{t.id=t.id||b();const e=window.MapLib.MercatorCoordinate.fromLngLat([t.origin[0]||0,t.origin[1]||0],t.origin[2]||0),a=e.meterInMercatorCoordinateUnits(),{x:r,y:i,z:s}=e;let l=null,p=null,c=null;t.babylon?(p=await import("@babylonjs/core"),l=p.Matrix.Compose(new p.Vector3(a,a,a),p.Quaternion.FromEulerAngles(Math.PI/2,0,0),new p.Vector3(r,i,s))):(c=await import("three"),l={translateX:r,translateY:i,translateZ:s,rotateX:Math.PI/2,rotateY:0,rotateZ:0,scale:a}),o.map.addLayer({id:t.id,type:"custom",renderingMode:"3d",onAdd(e,o){if(t.babylon){const e=new p.Engine(o,!0,{useHighPrecisionMatrix:!0},!0);this.scene=new p.Scene(e),this.scene.autoClear=!1,this.scene.preventDefaultOnPointerDown=!1,this.scene.preventDefaultOnPointerUp=!1;const a=new p.UniversalCamera("Camera",p.Vector3.Zero());a.mode=p.Camera.ORTHOGRAPHIC_CAMERA,a.inertia=0,this.scene.ambientColor=new p.Color3(1,1,1),t.defaultLight&&new p.HemisphericLight("Light",new p.Vector3(100,10,0),this.scene)}else this.camera=new c.Camera,this.scene=new c.Scene,t.defaultLight&&(this.light=new c.DirectionalLight(16777215),this.light.position.set(100,0,0).normalize(),this.scene.add(this.light)),this.renderer=new c.WebGLRenderer({canvas:e.getCanvas(),context:o,antialias:!0}),this.renderer.autoClear=!1;this.map=e,t.onAdd&&t.onAdd(this.scene,this.map,o),n(this.scene)},render(e,a){if(t.babylon)this.scene.activeCamera.freezeProjectionMatrix(l.multiply(p.Matrix.FromArray(a))),this.map.getPitch(),Math.PI,this.map.getBearing(),Math.PI,this.scene.render(!1);else{const e=(new c.Matrix4).makeRotationAxis(new c.Vector3(1,0,0),l.rotateX),t=(new c.Matrix4).makeRotationAxis(new c.Vector3(0,1,0),l.rotateY),o=(new c.Matrix4).makeRotationAxis(new c.Vector3(0,0,1),l.rotateZ),n=(new c.Matrix4).fromArray(a),r=(new c.Matrix4).makeTranslation(l.translateX,l.translateY,l.translateZ).scale(new c.Vector3(l.scale,-l.scale,l.scale)).multiply(e).multiply(t).multiply(o);this.camera.projectionMatrix=n.multiply(r),this.renderer.resetState(),this.renderer.render(this.scene,this.camera)}t.onRender&&t.onRender(e,a),o.map.triggerRepaint()}},t.beforeId)}),y(()=>{o.map.getLayer(t.id)&&o.map.removeLayer(t.id)}),e(K.Provider,{value:a,get children(){return a()&&t.children}})},ee=e=>{const[t]=L();return u(()=>t.map.setFog(e.style||{})),y(()=>{t.map.getFog()&&t.map.setFog(null)}),null},te=e=>{const[t]=L();let o=F();return o||e?.source||(o=b(),t.map.addSource(o,{type:"raster-dem",url:t.map.isMapLibre?"https://demotiles.maplibre.org/terrain-tiles/tiles.json":"mapbox://mapbox.terrain-rgb",tileSize:t.map.isMapLibre?256:512,maxzoom:t.map.isMapLibre?void 0:14}),t.map.sourceIdList.push(o)),u(()=>{t.map.setTerrain({exaggeration:e.exaggeration||1,source:e?.source||o})}),y(()=>t.map?.setTerrain(null)),null},oe=e=>{const[t]=L(),[o,a]=w(e,["position"]),[n,r]=m(null),i=new Map([["navigation",window.MapLib.NavigationControl],["scale",window.MapLib.ScaleControl],["attribution",window.MapLib.AttributionControl],["geolocate",window.MapLib.GeolocateControl],["fullscreen",window.MapLib.FullscreenControl],["logo",window.MapLib.LogoControl],["terrain",window.MapLib.TerrainControl]]);return u(()=>{f(()=>n()&&t.map.hasControl(n())&&t.map.removeControl(n())),r(a.custom||new(i.get(a.type||"navigation"))(a.options))}),u(()=>{t.map.hasControl(n())&&t.map.removeControl(n()),t.map.addControl(n(),o.position)}),y(()=>{t.map.hasControl(n())&&t.map.removeControl(n())}),null},ae=e=>{if(!e.lngLat)throw new Error("Marker - lngLat is required");const[t,o,a]=w(e,["lngLat","children","showPopup","draggable"],["popup","onOpen","onClose"]),[n]=L();let r=null,i=null;const s=t.lngLat;return u(()=>{n.map&&(i?.remove(),i=new window.MapLib.Popup({closeOnClick:!1,focusAfterOpen:!1,...o.popup}).on("open",()=>o.onOpen?.()).on("close",()=>o.onClose?.()),u(()=>{void 0!==t.children&&("string"==typeof t.children?i?.setHTML(t.children):i?.setDOMContent(t.children),r?.setPopup(i))}),u(()=>t.showPopup!==i?.isOpen()&&r?.togglePopup()))}),u(()=>{n.map&&(r?.remove(),r=new window.MapLib.Marker(a.options).on("dragstart",()=>a.onDragStart?.()).on("dragend",()=>a.onDragEnd?.()).on("drag",()=>a.onDrag?.(r?.getLngLat().toArray())).setPopup(i).setLngLat(s).addTo(n.map),u(()=>t.showPopup!==i?.isOpen()&&r?.togglePopup()))}),u(()=>r?.setLngLat(t.lngLat)),u(()=>r?.setDraggable(t.draggable)),y(()=>r?.remove()),null},ne=e=>{if(!e.trackPointer&&!e.lngLat)throw new Error("Popup - lngLat or trackPointer is required");const[t,o]=w(e,["lngLat","children","trackPointer"]),[a]=L();let n;return u(()=>{a.map&&(n?.remove(),n=new window.MapLib.Popup({closeOnClick:!1,focusAfterOpen:!1,...o.options}).on("open",()=>o.onOpen?.()).on("close",()=>o.onClose?.()).addTo(a.map),u(()=>t.trackPointer?n.trackPointer():n.setLngLat(t.lngLat)),u(()=>"string"==typeof t.children?n.setHTML(t.children):n.setDOMContent(t.children)))}),y(()=>n?.remove()),null},re={diagonal_l:{size:20,path:"M20 0 0 20M-10 10 10-10M10 30 30 10"},diagonal_r:{size:20,path:"M0 0 20 20M30 10 10-10M10 30-10 10"},horizontal:{size:14,path:"M7 0V20"},vertical:{size:14,path:"M0 7H20"},cross:{size:18,path:"M9 0V18M0 9H18"},hash:{size:30,path:"M15 0 30 15 15 30 0 15Z"},chevron_h:{size:20,path:"M-5 5 0 10 10 0 20 10 25 5M0 30 10 20 20 30"},chevron_v:{size:20,path:"M5-5 10 0 0 10 10 20 5 25M25 15 20 10 25 5"},square:{size:20,path:"M8 8H12V12H8Z",fill:!0},hex:{size:50,path:"M0 0V50L50 25ZM50 0V50L0 25ZM25 0V50"},circle:{size:25,path:"M8 10A2.5 2.5 0 118.01 10M18 15A2.5 2.5 0 1018.01 15",fill:!0}},ie=Object.keys(re),se=e=>{const[t]=L(),[o,a]=m({width:0,height:0}),n=(e,o)=>{t.map.debug&&console.debug("%c[MapGL]","color: #10b981",e,o||"")};y(()=>{t.map?.hasImage(e.id)&&t.map?.removeImage(e.id),n("Remove Image:",e.id)}),u(()=>{if(!e.id)throw new Error("Image - ID is required");if(!e.source&&!e.pattern)throw new Error("Image - Image or Pattern is required");const s=e.pattern?{pixelRatio:2,...e.options}:e.options;r(e.source||i(e.pattern),r=>{const{width:i,height:l}=r;t.map&&!t.map.hasImage(e.id)&&t.map.addImage(e.id,r,s),!e.pattern&&f(()=>i===o().width&&l===o().height)?(t.map.updateImage(e.id,r),t.map.triggerRepaint()):(t.map.removeImage(e.id),t.map.addImage(e.id,r,s)),a({width:i,height:l}),n("Add Image:",e.id),t.map.on("style.load",()=>{t.map.hasImage(e.id)||(t.map.addImage(e.id,r,s),n("Re-Add Image:",e.id))})})});const r=(o,a)=>{if("string"==typeof o&&o?.trimStart().startsWith("<svg")&&(o=(new DOMParser).parseFromString(o,"image/svg+xml").childNodes[0]),o instanceof SVGElement&&(e.options?.fill&&o.setAttribute("fill",e.options.fill),e.options?.stroke&&o.setAttribute("stroke",e.options.stroke),o=(new XMLSerializer).serializeToString(o)),"string"!=typeof o)return a(o);t.map.loadImage(o,async(t,n)=>{if(!t)return a(n);{"string"==typeof o&&o?.trimEnd().endsWith(".svg")&&(o=await(await fetch(o)).text(),(o=(new DOMParser).parseFromString(o,"image/svg+xml").childNodes[0]).setAttribute("fill",e.options.fill),o.setAttribute("stroke",e.options.stroke),o.setAttribute("transform",e.options.transform),o=(new XMLSerializer).serializeToString(o));const t=new Image;t.crossOrigin="Anonymous",t.onload=()=>{const e=document.createElement("canvas");e.width=Math.max(t.width,50),e.height=Math.max(t.height,50);const o=e.getContext("2d");return o.imageSmoothingEnabled=!0,o.drawImage(t,0,0,e.width,e.height),a(o.getImageData(0,0,e.width,e.height))},t.src=o.trimStart().startsWith("<svg")?"data:image/svg+xml;charset=utf-8,"+o:o}})},i=e=>{const t=re[e.type];return{width:t.size,height:t.size,data:new Uint8Array(t.size*t.size*4),onAdd:function(){let e=document.createElement("canvas");e.width=e.height=t.size,this.ctx=e.getContext("2d",{willReadFrequently:!0})},render:function(){return this.ctx.fillStyle=e.background||"transparent",this.ctx.fillRect(0,0,this.width,this.height),this.ctx.strokeStyle=this.ctx.fillStyle=e.color||"black",this.ctx.lineWidth=e.lineWith||1,this.ctx.stroke(new Path2D(t.path)),t.fill&&this.ctx.fill(new Path2D(t.path)),this.data=this.ctx.getImageData(0,0,this.width,this.height).data,!0}}};return null},le={in:e=>e*e,out:e=>1-(1-e)*(1-e),inOut:e=>e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2},pe=e=>{const[t]=L();let o=.1,a=!1;const[n,r]=m(!1);["mousedown","touchstart","wheel"].forEach(e=>t.map.on(e,e=>!e.rotate&&r(!0))),["moveend","mouseup","touchend"].forEach(e=>t.map.on(e,e=>!e.rotate&&r(!1)));const i=()=>{e.translate&&window.requestAnimationFrame(i);const n=[e.translate.start,e.translate.end,e.translate.easing?le[e.translate.easing](o):o];(async([e,o,a],n)=>{const r=t.map.getFreeCameraOptions();r.position=window.MapLib.MercatorCoordinate.fromLngLat([e,o],a),r.lookAtPoint(n),t.map.setFreeCameraOptions(r)})("line"===e.translate.type?((e,t,o)=>e.map((a,n)=>(1-o)*e[n]+o*t[n]))(...n):((e,t,o)=>{const a=e.map((o,a)=>e[a]*t[a]).reduce((e,t)=>e+t),n=Math.acos(a);return e.map((a,r)=>Math.sin((1-o)*n)/Math.sin(n)*e[r]+Math.sin(o*n)/Math.sin(n)*t[r])})(...n),e.translate.target),!e.translate.loop&&(o>1||o<0)&&(a=!a),o=a?o-.001:o+.001};u(()=>{e.translate&&window.requestAnimationFrame(i)});const s={duration:1e3,easing:e=>e},l=()=>{if(n())return;const{secPerRev:o=120,maxSpinZoom:a=5,slowSpinZoom:r=3}=e.rotateGlobe,i=t.map.getZoom();if(i>a)return;let l=360/o;i>r&&(l*=(a-i)/(a-r));const p=t.map.getCenter();p.lng=e.reverse?p.lng+l:p.lng-l,t.map.easeTo({center:p,...s},{rotate:!0})},p=()=>{if(!e.rotateViewport||n())return void t.map.stop();const o=e.rotateViewport,a=o?.secPerRev||60,r=e.reverse?t.map.getBearing()+360/a:t.map.getBearing()-360/a,i=o?.pitch||60,l=o?.around;t.map.easeTo({bearing:r,pitch:i,around:l,...s},{rotate:!0})},c=()=>e.rotateGlobe?l():p();let d;return t.map.on("moveend",c).on("dragend",c),u(()=>{null!=e.rotateGlobe&&(e.rotateGlobe?(d=t.map.getCenter(),l()):e.resetWhenStopped?t.map.stop().easeTo({center:d}):t.map.stop())}),u(()=>{null!=e.rotateViewport&&(e.rotateViewport?p():e.resetWhenStopped?t.map.stop().resetNorthPitch():t.map.stop())}),y(()=>t.map.off("moveend",c).off("dragend",c)),e.children},ce=e=>{const[t]=L();return u(()=>t.map.setLight(e.style||{})),y(()=>t.map?.setLight(null)),null};var de=[{id:"measure-label",type:"symbol",filter:["all",["==","$type","Point"],["==","user_type","measure"]],layout:{"text-field":["get","user_value"],"text-anchor":["get","user_anchor"],"text-offset":["match",["get","user_anchor"],"bottom",[0,-.5],[0,0]],"text-size":12,"text-allow-overlap":!0,"text-ignore-placement":!0},paint:{"text-halo-color":"rgba(255,255,255,0.75)","text-halo-width":2,"text-halo-blur":1,"text-color":"#000"}}];const me=e=>{const[t]=L(),o=new e.lib({styles:[...e.lib.lib.theme,...de],modes:{...e.lib.modes},userProperties:{showLength:e.showLength||!1,showArea:e.showArea||!1},...e.options});t.map.addControl(o,e.position||"top-right"),e.getInstance&&e.getInstance(o);const a={};return C.forEach(o=>{if(e[o]){const n=`draw.${o.slice(2).toLowerCase()}`,r=t=>e[o](t);a[n]=r,t.map.on(n,r)}}),y(()=>{Object.keys(a).forEach(e=>t.map.off(e,a[e])),t.map?.removeControl(o)}),null};export{ee as Atmosphere,pe as Camera,oe as Control,me as Draw,se as Image,Y as Layer,Q as Layer3D,ce as Light,$ as MapProvider,ae as Marker,ne as Popup,G as Source,te as Terrain,q as default,ie as patternList,L as useMapContext,J as useScene,F as useSourceId};
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../src/components/MapProvider/index.tsx","../../src/events.ts","../../src/mapStyles.ts","../../src/components/MapGL/index.tsx","../../src/components/Source/index.tsx","../../src/styles.ts","../../src/components/Layer/index.tsx","../../src/components/Layer3D/index.tsx","../../src/components/Atmosphere/index.tsx","../../src/components/Terrain/index.tsx","../../src/components/Control/index.tsx","../../src/components/Marker/index.tsx","../../src/components/Popup/index.tsx","../../src/components/Image/index.tsx","../../src/components/Camera/index.tsx","../../src/components/Light/index.tsx","../../src/components/Draw/drawingStyles.jsx","../../src/components/Draw/index.tsx"],"sourcesContent":["import { createContext, useContext, ParentComponent } from 'solid-js'\nimport { createStore } from 'solid-js/store'\nimport type { Map } from '../MapGL'\n\nconst [state, setState] = createStore({ map: null })\n\nexport const MapContext = createContext([state])\n\nexport const useMapContext = () => useContext(MapContext)\n\nexport const MapProvider: ParentComponent<{\n map?: Map\n}> = (props) => {\n props.map && setState('map', props.map)\n\n return (\n <MapContext.Provider value={[state]}>{props.children}</MapContext.Provider>\n )\n}\n","import type {\n MapMouseEvent,\n MapTouchEvent,\n MapWheelEvent,\n MapDataEvent,\n MapBoxZoomEvent,\n} from 'mapbox-gl'\n\ntype mapEventTypes = {\n onMouseDown?: (event: MapMouseEvent) => void\n onMouseUp?: (event: MapMouseEvent) => void\n onMouseOver?: (event: MapMouseEvent) => void\n onMouseOut?: (event: MapMouseEvent) => void\n onMouseMove?: (event: MapMouseEvent) => void\n onMouseEnter?: (event: MapMouseEvent) => void\n onMouseLeave?: (event: MapMouseEvent) => void\n onPreClick?: (event: MapMouseEvent) => void\n onClick?: (event: MapMouseEvent) => void\n onDblClick?: (event: MapMouseEvent) => void\n onContextMenu?: (event: MapMouseEvent) => void\n onTouchStart?: (event: MapTouchEvent) => void\n onTouchEnd?: (event: MapTouchEvent) => void\n onTouchCancel?: (event: MapTouchEvent) => void\n onTouchMove?: (event: MapTouchEvent) => void\n onWheel?: (event: MapWheelEvent) => void\n onResize?: () => void\n onRemove?: () => void\n onMoveStart?: (event: DragEvent) => void\n onMove?: (event: MapMouseEvent | MapTouchEvent) => void\n onMoveEnd?: (event: DragEvent) => void\n onDragStart?: (event: DragEvent) => void\n onDrag?: (event: MapMouseEvent | MapTouchEvent) => void\n onDragEnd?: (event: DragEvent) => void\n onZoomStart?: (event: MapMouseEvent | MapTouchEvent) => void\n onZoom?: (event: MapMouseEvent | MapTouchEvent) => void\n onZoomEnd?: (event: MapMouseEvent | MapTouchEvent) => void\n onRotateStart?: (event: MapMouseEvent | MapTouchEvent) => void\n onRotate?: (event: MapMouseEvent | MapTouchEvent) => void\n onRotatEnd?: (event: MapMouseEvent | MapTouchEvent) => void\n onPitchStart?: (event: MapDataEvent) => void\n onPitch?: (event: MapDataEvent) => void\n onPitchEnd?: (event: MapDataEvent) => void\n onBoxZoomStart?: (event: MapBoxZoomEvent) => void\n onBoxZoomEnd?: (event: MapBoxZoomEvent) => void\n onBoxZoomCancel?: (event: MapBoxZoomEvent) => void\n onWebglContextLost?: () => void\n onWebglContextRestored?: () => void\n onLoad?: (event: any) => void\n onRender?: () => void\n onIdle?: () => void\n onError?: (error: string) => void\n onData?: (event: MapDataEvent) => void\n onStyleData?: (event: MapDataEvent) => void\n onSourceData?: (event: MapDataEvent) => void\n onDataLoading?: (event: MapDataEvent) => void\n onStyleDataLoading?: (event: MapDataEvent) => void\n onSourceDataLoading?: (event: MapDataEvent) => void\n onStyleImageMissing?: (event: MapDataEvent) => void\n}\n\nconst 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\ntype layerEventTypes = {\n onMouseDown?: (event: MapMouseEvent) => void\n /** called when the mouse button is pressed down on the layer */\n onMouseUp?: (event: MapMouseEvent) => void\n /** called when the mouse button is released after a mouse down event on the layer */\n onMouseOver?: (event: MapMouseEvent) => void\n /** called when the mouse enters the layer */\n onMouseOut?: (event: MapMouseEvent) => void\n /** called when the mouse leaves the layer */\n onMouseMove?: (event: MapMouseEvent) => void\n /** called when the mouse is moved over the layer */\n onMouseEnter?: (event: MapMouseEvent) => void\n /** called when the mouse enters the layer */\n onMouseLeave?: (event: MapMouseEvent) => void\n /** called when the mouse leaves the layer */\n onClick?: (event: MapMouseEvent) => void\n /** called when the layer is clicked */\n onDblClick?: (event: MapMouseEvent) => void\n /** called when the layer is double-clicked */\n onContextMenu?: (event: MapMouseEvent) => void\n /** called when the context menu is triggered on the layer */\n onTouchStart?: (event: MapTouchEvent) => void\n /** called when a touch event is started on the layer */\n onTouchEnd?: (event: MapTouchEvent) => void\n /** called when a touch event is ended on the layer */\n onTouchCancel?: (event: MapTouchEvent) => void\n /** called when a touch event is cancelled on the layer */\n}\n\nconst layerEvents: any[] = [\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\nconst drawEvents: any[] = [\n 'onCreate',\n 'onDelete',\n 'onCombine',\n 'onUncombine',\n 'onUpdate',\n 'onSelectionchange',\n 'onModechange',\n 'onRender',\n 'onActionable',\n]\n\ntype drawEventTypes = {\n onCreate?: (event: Object) => void\n /** called when a feature is created */\n onDelete?: (event: Object) => void\n /** called when a feature is deleted */\n onCombine?: (event: Object) => void\n /** called when features are combined */\n onUncombine?: (event: Object) => void\n /** called when features are uncombined */\n onUpdate?: (event: Object) => void\n /** called when a feature is updated */\n onSelectionchange?: (event: Object) => void\n /** called when the selected features change */\n onModechange?: (event: Object) => void\n /** called when the draw mode changes */\n onRender?: (event: Object) => void\n /** called when the draw canvas is re-rendered */\n onActionable?: (event: Object) => void\n /** called when the state of the draw controls changes */\n}\n\nexport { mapEvents, layerEvents, drawEvents }\nexport type { mapEventTypes, layerEventTypes, drawEventTypes }\n","const mapBase = 'mapbox://styles/mapbox'\nconst gitBase = 'https://raw.githubusercontent.com/'\nconst gishub = 'https://raw.githubusercontent.com/GIShub4/map-styles/main/'\nconst hereBase = 'https://assets.vector.hereapi.com/styles/'\n\nexport const vectorStyleList: object = {\n mb: {\n standard: `${mapBase}/standard`,\n light: `${mapBase}/light-v11`,\n dark: `${mapBase}/dark-v11`,\n street: `${mapBase}/streets-v12`,\n outdoor: `${mapBase}/outdoors-v12`,\n sat: `${mapBase}/satellite-v9`,\n sat_street: `${mapBase}/satellite-streets-v12`,\n nav_base: `${mapBase}/navigation-guidance-day-v4`,\n nav_base_night: `${mapBase}/navigation-guidance-night-v4`,\n nav: `${mapBase}/navigation-day-v1`,\n nav_night: `${mapBase}/navigation-night-v1`,\n basic: `${mapBase}/cjf4m44iw0uza2spb3q0a7s41`,\n monochrome: `${mapBase}/cjv6rzz4j3m4b1fqcchuxclhb`,\n leshine: `${mapBase}/cjcunv5ae262f2sm9tfwg8i0w`,\n icecream: `${mapBase}/cj7t3i5yj0unt2rmt3y4b5e32`,\n cali: `${mapBase}/cjerxnqt3cgvp2rmyuxbeqme7`,\n northstar: `${mapBase}/cj44mfrt20f082snokim4ungi`,\n mineral: `${mapBase}/cjtep62gq54l21frr1whf27ak`,\n moonlight: `${mapBase}/cj3kbeqzo00022smj7akz3o1e`,\n frank: `${mapBase}-map-design/ckshxkppe0gge18nz20i0nrwq`,\n minimo: `${mapBase}-map-design/cksjc2nsq1bg117pnekb655h1`,\n decimal: `${mapBase}-map-design/ck4014y110wt61ctt07egsel6`,\n stand: `${mapBase}-map-design/ckr0svm3922ki18qntevm857n`,\n blueprint: `${mapBase}-map-design/cks97e1e37nsd17nzg7p0308g`,\n bubble: `${mapBase}-map-design/cksysy2nl62zp17quosctdtcc`,\n pencil: `${mapBase}-map-design/cks9iema71es417mlrft4go2k`,\n swiss_ski: `${gitBase}mapbox/mapbox-gl-swiss-ski-style/master/cij1zoclj002y8rkkdjl69psd.json`,\n vintage: `${gitBase}mapbox/mapbox-gl-vintage-style/master/cif5p01n202nisaktvljx9mv3.json`,\n whaam: `${gitBase}mapbox/mapbox-gl-whaam-style/master/cii8323c8004w0nlvtss3dbm2.json`,\n neon: `${gitBase}NatEvatt/awesome-mapbox-gl-styles/master/styles/Neon/style.json`,\n camoflauge: `${gitBase}jingsam/mapbox-gl-styles/master/Camouflage.json`,\n emerald: `${gitBase}jingsam/mapbox-gl-styles/master/Emerald.json`,\n runner: `${gitBase}jingsam/mapbox-gl-styles/master/Runner.json`,\n x_ray: `${gitBase}jingsam/mapbox-gl-styles/master/X-ray.json`,\n },\n here: {\n base: `${hereBase}berlin/base/mapbox/tilezen?apikey={apikey}`,\n day: `${hereBase}berlin/day/mapbox/tilezen?apikey={apikey}`,\n night: `${hereBase}berlin/night/mapbox/tilezen?apikey={apikey}`,\n },\n esri: {\n blueprint: `${gishub}esri:blueprint.json`,\n charted_territory: `${gishub}esri:charted-territory.json`,\n colored_pencil: `${gishub}esri:colored-pencil.json`,\n community: `${gishub}esri:community.json`,\n mid_century: `${gishub}esri:mid-century.json`,\n modern_antique: `${gishub}esri:modern-antique.json`,\n nat_geo: `${gishub}esri:national-geographic.json`,\n newspaper: `${gishub}esri:newspaper.json`,\n open_street_map: `${gishub}esri:open-street-map.json`,\n light_gray_canvas: `${gishub}esri:light-gray-canvas.json`,\n dark_gray_canvas: `${gishub}esri:dark-gray-canvas.json`,\n human_geo_light: `${gishub}esri:human-geography-light.json`,\n human_geo_dark: `${gishub}esri:human-geography-dark.json`,\n world_navigation: `${gishub}esri:world-navigation.json`,\n world_street: `${gishub}esri:world-street.json`,\n world_street_night: `${gishub}esri:world-street-night.json`,\n world_terrain: `${gishub}esri:world-terrain.json`,\n world_terrain_hybrid: `${gishub}esri:world-terrain-hybrid.json`,\n world_topographic: `${gishub}esri:world-topographic.json`,\n chromium: `${gishub}esri:chromium.json`,\n dreamcatcher: `${gishub}esri:dreamcatcher.json`,\n seahaven: `${gishub}esri:seahaven.json`,\n sangria: `${gishub}esri:sangria.json`,\n mercurial: `${gishub}esri:mercurial.json`,\n imagery: `${gishub}esri:imagery.json`,\n imagery_hybrid: `${gishub}esri:imagery-hybrid.json`,\n firefly: `${gishub}esri:firefly.json`,\n firefly_hybrid: `${gishub}esri:firefly-hybrid.json`,\n oceans: `${gishub}esri:oceans.json`,\n },\n}\nconst carto = 'https://{s}.basemaps.cartocdn.com/rastertiles/'\nconst stamen = 'https://stamen-tiles-{s}.a.ssl.fastly.net/'\nconst tf = 'https://{s}.tile.thunderforest.com/'\n\nexport const rasterStyleList: object = {\n osm: {\n org: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n human: 'https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png',\n cycle: 'https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png',\n topo: 'https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png',\n _copy:\n '<a href=\"https://www.openstreetmap.org/copyright\" target=\"_blank\">&copy; OpenStreetMap</a>',\n },\n carto: {\n voyager: `${carto}voyager_labels_under/{z}/{x}/{y}{r}.png`,\n positron: `${carto}light_all/{z}/{x}/{y}{r}.png`,\n dark: `${carto}dark_all/{z}/{x}/{y}{r}.png`,\n _copy:\n '<a href=\"https://carto.com/attribution\" target=\"_blank\">&copy; Carto</a>',\n },\n stamen: {\n toner: `${stamen}toner/{z}/{x}/{y}{r}.png`,\n toner_lite: `${stamen}toner-lite/{z}/{x}/{y}{r}.png`,\n watercolor: `${stamen}watercolor/{z}/{x}/{y}.png`,\n terrain: `${stamen}terrain/{z}/{x}/{y}{r}.png`,\n _copy:\n '<a href=\"https://stamen.com/privacy-policy\" target=\"_blank\">&copy; Stamen Design</a>',\n },\n tf: {\n cycle: `${tf}cycle/{z}/{x}/{y}{r}.png?apikey={apikey}`,\n trans: `${tf}transport/{z}/{x}/{y}{r}.png?apikey={apikey}`,\n trans_dark: `${tf}transport-dark/{z}/{x}/{y}{r}.png?apikey={apikey}`,\n landscape: `${tf}landscape/{z}/{x}/{y}{r}.png?apikey={apikey}`,\n outdoors: `${tf}outdoors/{z}/{x}/{y}{r}.png?apikey={apikey}`,\n neighbourhood: `${tf}neighbourhood/{z}/{x}/{y}{r}.png?apikey={apikey}`,\n spinal: `${tf}spinal-map/{z}/{x}/{y}{r}.png?apikey={apikey}`,\n pioneer: `${tf}pioneer/{z}/{x}/{y}{r}.png?apikey={apikey}`,\n atlas: `${tf}atlas/{z}/{x}/{y}{r}.png?apikey={apikey}`,\n mobile: `${tf}mobile-atlas/{z}/{x}/{y}{r}.png?apikey={apikey}`,\n _copy:\n '<a href=\"https://thunderforest.com/privacy\" target=\"_blank\">&copy; Thunderforest</a>',\n },\n}\n","import {\n createSignal,\n createEffect,\n onMount,\n onCleanup,\n Component,\n on,\n} from \"solid-js\";\nimport \"mapbox-gl/dist/mapbox-gl.css\";\nimport { MapProvider } from \"../MapProvider\";\nimport { mapEvents } from \"../../events\";\nimport { vectorStyleList } from \"../../mapStyles\";\nimport type { mapEventTypes } from \"../../events\";\nimport type mapboxgl from \"mapbox-gl\";\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\";\nimport type { StyleSpecification } from \"mapbox-gl/src/style-spec/types.js\";\nimport type { JSX } from \"solid-js\";\n\ndeclare global {\n interface Window {\n MapLib?: any;\n }\n}\n\nexport type Map = mapboxgl.Map & {\n debug: boolean;\n debugEvents: boolean;\n sourceIdList: string[];\n layerIdList: string[];\n};\n\nexport type Viewport = {\n id?: string;\n point?: { x: number; y: number };\n center?: LngLatLike;\n bounds?: LngLatBounds;\n zoom?: number;\n pitch?: number;\n bearing?: number;\n padding?: PaddingOptions;\n inTransit?: boolean;\n};\n\ntype Props = {\n /** ID for the map container element */\n id?: string;\n /** Map Container CSS Style */\n style?: JSX.CSSProperties;\n /** Map Container CSS Class */\n class?: string;\n /** SolidJS Class List for Map Container */\n classList?: {\n [k: string]: boolean | undefined;\n };\n /** Current Map View */\n viewport?: Viewport;\n /** Mapbox Options\n * @see https://docs.mapbox.com/mapbox-gl-js/api/map/#map-parameters\n */\n options?: MapboxOptions;\n /** Mapbox Style Configuration\n * @see https://docs.mapbox.com/mapbox-gl-js/guides/styles/#configure-a-style\n */\n config?: {\n id?: string;\n lightPreset?: \"dawn\" | \"day\" | \"dusk\" | \"night\" | string;\n showPlaceLabels?: boolean;\n showRoadLabels?: boolean;\n showPointOfInterestLabels?: boolean;\n showTransitLabels?: boolean;\n font?: string[];\n [key: string]: boolean | string | string[];\n };\n /** Type for pan, move and zoom transitions */\n transitionType?: \"flyTo\" | \"easeTo\" | \"jumpTo\" | string;\n /** Event listener for Viewport updates */\n onViewportChange?: (viewport: Viewport) => void;\n /** Event listener for User Interaction */\n onUserInteraction?: (user: boolean) => void;\n /** Displays Map Tile Borders */\n showTileBoundaries?: boolean;\n /** Displays Wireframe if Terrain is visible */\n showTerrainWireframe?: boolean;\n /** Displays Borders if Padding is set */\n showPadding?: boolean;\n /** Displays Label Collision Boxes */\n showCollisionBoxes?: boolean;\n /** Displays all feature outlines even if normally not drawn by style rules */\n showOverdrawInspector?: boolean;\n /** Mouse Cursor Style */\n cursorStyle?: string;\n //** Dark Map Style */\n darkStyle?: StyleSpecification | string;\n //** Disable automatic map resize */\n disableResize?: boolean;\n //** MapLibre library */\n mapLib?: any;\n //** APIkey for vector service */\n apikey?: string;\n //** Debug Message Mode */\n debug?: boolean;\n //** Debug Events */\n debugEvents?: boolean;\n ref?: HTMLDivElement;\n /** Children within the Map Container */\n children?: any;\n} & mapEventTypes;\n\n/** Creates a new Map Container */\nexport const MapGL: Component<Props> = (props) => {\n let map: Map;\n let mapRef: HTMLDivElement;\n let resizeObserver: ResizeObserver;\n let mutationObserver: MutationObserver;\n\n const [mapLoaded, setMapLoaded] = createSignal(null);\n const [darkMode, setDarkMode] = createSignal(\n (typeof window !== \"undefined\" &&\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches) ||\n (typeof document !== \"undefined\" &&\n document.body.classList.contains(\"dark\")),\n );\n const [internal, setInternal] = createSignal(false);\n\n const debug = (text: string, value?: any) =>\n (props.debug || props.debugEvents) &&\n console.debug(\"%c[MapGL]\", \"color: #0ea5e9\", text, value || \"\");\n\n const getStyle = (light: any, dark: any) => {\n const style = darkMode() && dark ? dark : light;\n return typeof style === \"string\" || style instanceof String\n ? style\n ?.split(\":\")\n .reduce((p, c) => p && p[c], vectorStyleList)\n ?.replace(\n \"{apikey}\",\n //@ts-ignore\n props.apikey || import.meta.env.VITE_VECTOR_API_KEY,\n ) || style\n : style;\n };\n\n onMount(async () => {\n let mapLib = props.mapLib || (await import(\"mapbox-gl\"));\n if (!mapLib.Map) mapLib = window[\"maplibregl\"] || window[\"mapboxgl\"];\n\n if (typeof mapLib.supported === \"function\" && !mapLib.supported())\n throw new Error(\"Mapbox GL not supported\");\n\n debug(`Map (v${mapLib.version}) loading...`);\n map = new mapLib.Map({\n accessToken:\n //@ts-ignore\n props.options?.accessToken || import.meta.env.VITE_MAPBOX_ACCESS_TOKEN,\n interactive: props.options?.interactive || !!props.onViewportChange,\n ...props.options,\n ...props.viewport,\n projection: props.options?.projection,\n container: mapRef,\n style: getStyle(props.options?.style, props.darkStyle),\n fitBoundsOptions: { padding: props.viewport?.padding },\n } as MapboxOptions);\n\n map.debug = props.debug;\n map.debugEvents = props.debugEvents;\n map.sourceIdList = [];\n map.layerIdList = [];\n window.MapLib = mapLib;\n\n // Hook up events\n mapEvents.forEach((item) => {\n const prop = props[item];\n if (prop) {\n const event = item.slice(2).toLowerCase();\n if (typeof prop === \"function\") {\n map.on(event, (evt) => {\n setTimeout(() => {\n if (evt.clickOnLayer) return;\n prop(evt);\n props.debugEvents && debug(`Map '${event}' event:`, evt);\n }, 0);\n });\n } else {\n Object.keys(prop).forEach((layerId) => {\n map.on(event as any, layerId, (evt) => {\n setTimeout(() => {\n if (evt.clickOnLayer) return;\n prop[layerId](evt);\n props.debugEvents &&\n debug(`Map '${event}' event on '${layerId}':`, evt);\n }, 0);\n });\n });\n }\n }\n });\n\n map.once(\"load\", () => {\n setMapLoaded(map);\n debug(\"Map loaded\");\n\n // Handle User Interaction\n [\"mousedown\", \"touchstart\", \"wheel\"].forEach((event) =>\n map.on(event, (evt) => !evt.rotate && props.onUserInteraction?.(true)),\n );\n [\"moveend\", \"mouseup\", \"touchend\"].forEach((event) =>\n map.on(event, (evt) => !evt.rotate && props.onUserInteraction?.(false)),\n );\n\n // Listen to dark theme changes\n const darkTheme =\n typeof window !== \"undefined\" &&\n window?.matchMedia(\"(prefers-color-scheme: dark)\");\n darkTheme?.addEventListener(\"change\", () => {\n setDarkMode(darkTheme.matches);\n debug(\"Set dark theme to:\", darkTheme.matches?.toString());\n });\n mutationObserver = new MutationObserver(() => {\n const darkTheme = document.body.classList.contains(\"dark\");\n setDarkMode(darkTheme);\n debug(\"Set theme to:\", darkTheme);\n });\n mutationObserver.observe(document.body, { attributes: true });\n\n // Listen to map container size changes\n if (!props.disableResize) {\n resizeObserver = new ResizeObserver(() => {\n setTimeout(() => {\n map?.resize();\n }, 0);\n debug(\"Map resized\");\n });\n resizeObserver.observe(mapRef as Element);\n }\n\n // Update Configuration\n createEffect(() => {\n for (const key in props.config) {\n if (!key || key === \"id\") continue;\n const id = props.config?.id || \"basemap\";\n const value = props.config[key];\n //@ts-ignore\n map?.setConfigProperty(id, key, value);\n debug(`Set Config (${id}:${key}) to:`, value);\n }\n });\n\n // Update Viewport\n map.on(\"move\", (event) => {\n const viewport: Viewport = {\n ...props.viewport,\n id: props.id,\n point: {\n x: (event as any).originalEvent?.x,\n y: (event as any).originalEvent?.y,\n },\n center: props.viewport?.center?.lat\n ? map.getCenter()\n : [map.getCenter().lng, map.getCenter().lat],\n zoom: map.getZoom(),\n pitch: map.getPitch(),\n bearing: map.getBearing(),\n inTransit: true,\n bounds: null,\n // !internal()\n // ? props.viewport?.center?.lat\n // ? map.getBounds()\n // : [\n // [\n // map.getBounds().getNorthEast().lng,\n // map.getBounds().getNorthEast().lat,\n // ],\n // [\n // map.getBounds().getSouthWest().lng,\n // map.getBounds().getSouthWest().lat,\n // ],\n // ]\n // : null,\n };\n setInternal(true);\n !event.viewport && props.onViewportChange?.(viewport);\n });\n\n map.on(\"moveend\", (event) => {\n !event.rotate &&\n props.onViewportChange?.({ ...props.viewport, inTransit: false });\n setInternal(false);\n });\n });\n });\n\n // Hook up viewport event\n createEffect(\n on(\n () => props.viewport,\n (vp) => {\n if (props.id !== vp?.id || internal()) return;\n const viewport = {\n ...vp,\n ...(vp.bounds\n ? map.cameraForBounds(vp.bounds, {\n bearing: vp?.bearing,\n pitch: vp?.pitch,\n padding: vp?.padding,\n })\n : null),\n };\n map.stop()[props.transitionType || \"flyTo\"](viewport);\n debug(\n `Update Viewport (${props.transitionType || \"flyTo\"}):`,\n viewport,\n );\n },\n { defer: true },\n ),\n );\n\n // Update Projection\n createEffect(() => {\n const proj = props.options?.projection;\n if (!map || !proj) return;\n map.setProjection(proj);\n debug(\"Set Projection to:\", proj);\n });\n\n // Update Cursor\n createEffect(() => {\n const cur = props.cursorStyle;\n if (!map || !cur) return;\n map.getCanvas().style.cursor = cur;\n debug(\"Set Cursor to:\", cur);\n });\n\n const insertLayers = (list, layers) => {\n layers.forEach((layer) => {\n const index = list.findIndex((i) =>\n layer.metadata.smg.beforeType\n ? i.type === layer.metadata.smg.beforeType\n : i.id === layer.metadata.smg.beforeId,\n );\n list =\n index === -1\n ? [...list, layer]\n : [...list.slice(0, index), layer, ...list.slice(index + 1)];\n });\n return list;\n };\n\n // Update map style\n createEffect((prev) => {\n const style = getStyle(props.options?.style, props.darkStyle);\n if (map?.isStyleLoaded() && prev !== style) {\n const oldStyle = map.getStyle();\n const oldLayers = oldStyle.layers.filter((l) =>\n map.layerIdList.includes(l.id),\n );\n const oldSources = Object.keys(oldStyle.sources)\n .filter((s) => map.sourceIdList.includes(s))\n .reduce((obj, key) => ({ ...obj, [key]: oldStyle.sources[key] }), {});\n\n map.setStyle(style);\n map.once(\"styledata\", () => {\n if (!oldLayers) return;\n const newStyle = map.getStyle();\n map.setStyle({\n ...newStyle,\n sources: { ...newStyle.sources, ...oldSources },\n layers: insertLayers(newStyle.layers, oldLayers),\n fog: oldStyle.fog,\n terrain: oldStyle.terrain,\n });\n debug(\"Set Mapstyle to:\", style);\n });\n }\n return style;\n }, props.options?.style);\n\n // Update debug features\n [\n \"showTileBoundaries\",\n \"showTerrainWireframe\",\n \"showCollisionBoxes\",\n \"showPadding\",\n \"showOverdrawInspector\",\n ].forEach((item) => {\n createEffect(() => {\n const prop = props[item];\n if (!map || !prop) return;\n map[item] = prop;\n debug(`Set ${item} to:`, prop);\n });\n });\n\n onCleanup(() => {\n resizeObserver?.disconnect();\n mutationObserver?.disconnect();\n map?.remove();\n debug(\"Map removed\");\n });\n\n return (\n <div\n ref={mapRef}\n id={props.id}\n class={props?.class}\n classList={props?.classList}\n style={\n props?.class || props?.classList\n ? null\n : props.style || {\n position: \"absolute\",\n inset: 0,\n \"z-index\": -1,\n }\n }\n >\n {mapLoaded() && (\n <MapProvider map={mapLoaded()}>\n <style>{`.overlay{position:relative;width:100%;height:100%;pointer-events:none}.overlay>*{pointer-events:auto}`}</style>\n <div class=\"overlay\">{props.children}</div>\n </MapProvider>\n )}\n </div>\n );\n};\n","import {\n onCleanup,\n createEffect,\n Component,\n createContext,\n useContext,\n createUniqueId,\n} from 'solid-js'\nimport { useMapContext } from '../MapProvider'\nimport type { SourceSpecification } from 'mapbox-gl/src/style-spec/types.js'\nimport { rasterStyleList } from '../../mapStyles'\n\nconst SourceContext = createContext<string>()\nexport const useSourceId = (): string => useContext(SourceContext)\n\ntype Props = {\n /** @optional Source ID for referencing non nexted Layers */\n id?: string\n /** @see https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/ */\n source: SourceSpecification\n /** The map layers associated with this source */\n children?: any\n}\n\nexport const Source: Component<Props> = props => {\n const [ctx] = useMapContext()\n props.id ??= createUniqueId()\n\n const debug = (text, value?) => {\n ctx.map.debug &&\n console.debug('%c[MapGL]', 'color: #ec4899', text, value || '')\n }\n\n const lookup = url => {\n const s = url?.split(':').reduce((p, c) => p && p[c], rasterStyleList)\n const source = s\n ? {\n ...props.source,\n url: '',\n tiles: [\n s\n .replace(\n '{apikey}', //@ts-ignore\n props.source.apikey || import.meta.env.VITE_RASTER_API_KEY\n )\n .replace('{r}', window.devicePixelRatio > 1 ? '@2x' : ''),\n ],\n attribution: rasterStyleList[url.split(':')[0]]._copy,\n }\n : props.source\n\n source.tiles &&\n (source.tiles = ['a', 'b', 'c'].map(i =>\n source.tiles[0].replace('{s}', i)\n ))\n\n return source\n }\n\n // Add Source\n ctx.map.addSource(props.id, lookup(props.source.url))\n ctx.map.sourceIdList.push(props.id)\n debug('Add Source:', props.id)\n\n // Update Data\n const source = ctx.map.getSource(props.id)\n switch (props.source.type) {\n case 'geojson':\n createEffect(() => {\n const data = props.source.data\n if (!ctx.map.isSourceLoaded(props.id)) return\n source.setData(data || {})\n debug('Update GeoJSON Data:', props.id)\n })\n break\n case 'image':\n createEffect(() => {\n const url = props.source.url\n const coords = props.source.coordinates\n if (!ctx.map.isSourceLoaded(props.id)) return\n source.updateImage(url, coords)\n debug('Update Image Data:', props.id)\n })\n break\n case 'vector':\n createEffect(() => {\n const url = props.source.url\n const tiles = props.source.tiles\n if (!ctx.map.isSourceLoaded(props.id)) return\n url ? source.setUrl(url) : source.setTiles(tiles)\n debug('Update Vector Data:', props.id)\n })\n break\n case 'raster':\n createEffect(() => {\n const src = lookup(props.source.url)\n if (!ctx.map.isSourceLoaded(props.id)) return\n src.url ? source.setUrl(src.url) : source.setTiles(src.tiles)\n debug('Update Raster Data:', props.id)\n })\n break\n }\n\n // Remove Source\n onCleanup(() => {\n ctx.map\n ?.getStyle()\n .layers.forEach(\n layer => layer.source === props.id && ctx.map.removeLayer(layer.id)\n )\n ctx.map?.getSource(props.id) && ctx.map?.removeSource(props.id)\n debug('Remove Source:', props.id)\n })\n\n return (\n <SourceContext.Provider value={props.id}>\n {props.children}\n </SourceContext.Provider>\n )\n}\n","export const baseStyle = [\n 'id',\n 'type',\n 'filter',\n 'source',\n 'source-layer',\n 'minzoom',\n 'metadata',\n 'maxzoom',\n 'paint',\n 'layout'\n ]\n\nexport const layoutStyles = [\n 'visibility',\n 'line-join',\n 'line-cap',\n 'line-miter-limit',\n 'line-round-limit',\n 'line-sort-key',\n 'circle-sort-key',\n 'symbol-avoid-edges',\n 'symbol-placement',\n 'symbol-sort-key',\n 'symbol-spacing',\n 'symbol-z-order',\n 'icon-allow-overlap',\n 'icon-anchor',\n 'icon-ignore-placement',\n 'icon-image',\n 'icon-keep-upright',\n 'icon-offset',\n 'icon-optional',\n 'icon-padding',\n 'icon-pitch-alignment',\n 'icon-rotate',\n 'icon-rotation-alignment',\n 'icon-size',\n 'icon-text-fit',\n 'icon-text-fit-padding',\n 'text-allow-overlap',\n 'text-anchor',\n 'text-field',\n 'text-font',\n 'text-ignore-placement',\n 'text-justify',\n 'text-keep-upright',\n 'text-letter-spacing',\n 'text-line-height',\n 'text-max-angle',\n 'text-max-width',\n 'text-offset',\n 'text-optional',\n 'text-padding',\n 'text-pitch-alignment',\n 'text-radial-offset',\n 'text-rotate',\n 'text-rotation-alignment',\n 'text-size',\n 'text-transform',\n 'text-variable-anchor',\n 'text-writing-mode'\n]","import { onCleanup, createEffect, Component, createUniqueId } from \"solid-js\";\nimport { useMapContext } from \"../MapProvider\";\nimport { useSourceId } from \"../Source\";\nimport { layerEvents } from \"../../events\";\nimport { baseStyle, layoutStyles } from \"../../styles\";\nimport type { layerEventTypes } from \"../../events\";\nimport type {\n FilterSpecification,\n StyleSpecification,\n} from \"mapbox-gl/src/style-spec/types.js\";\nimport type { CustomLayerInterface } from \"mapbox-gl/src/style/style_layer/custom_style_layer\";\n\nconst diff = (\n newProps: StyleSpecification = {},\n prevProps: StyleSpecification = {},\n): [string, any][] => {\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\ntype Props = {\n id?: string;\n /** A string that uniquely identifies the layer. If not provided, a unique ID will be generated. */\n style?: StyleSpecification;\n /** A Mapbox Style Specification object that defines the visual appearance of the layer. */\n customLayer?: CustomLayerInterface;\n /** An object that implements the `CustomLayerInterface` interface, which allows you to create custom layers using WebGL. */\n filter?: FilterSpecification;\n /** A Mapbox filter specification that defines which features of the layer to include or exclude from the layer. */\n visible?: boolean;\n /** A boolean that determines whether the layer is visible or not. */\n sourceId?: string;\n /** A string that specifies the ID of the source that the layer uses for its data. */\n slot?: \"bottom\" | \"middle\" | \"top\" | string;\n /** A string that specifies the slot to which the layer belongs. */\n beforeType?:\n | \"background\"\n | \"fill\"\n | \"line\"\n | \"symbol\"\n | \"raster\"\n | \"circle\"\n | \"fill-extrusion\"\n | \"heatmap\"\n | \"hillshade\"\n | \"sky\"\n | string;\n /** A string that specifies the type of layer before which the current layer should be inserted. */\n beforeId?: string;\n /** A string that specifies the ID of the layer before which the current layer should be inserted. */\n featureState?: { id: number | string; state: object };\n /** An object that specifies the state of a feature in the layer. The object consists of an ID (either a number or a string) and an object containing the state. */\n children?: any;\n /** Any content that should be rendered within the layer. */\n} & layerEventTypes;\n\nconst newKey = (key, type) =>\n (key.startsWith(type) || key.startsWith(\"icon\") || key.startsWith(\"text\")\n ? \"\"\n : type + \"-\") + key.replace(/[A-Z]/g, (s) => \"-\" + s.toLowerCase());\n\nconst updateStyle = (oldStyle) => {\n if (!oldStyle) return;\n let layout = {};\n let paint = {};\n let style = {};\n\n Object.entries(oldStyle).forEach(([key, value]) => {\n if (baseStyle.includes(key)) style[key] = value;\n else {\n const nk = newKey(key, oldStyle.type);\n layoutStyles.includes(nk) ? (layout[nk] = value) : (paint[nk] = value);\n }\n });\n if (oldStyle.paint)\n Object.entries(oldStyle.paint).forEach(\n ([key, value]) => (paint[newKey(key, oldStyle.type)] = value),\n );\n if (oldStyle.layout)\n Object.entries(oldStyle.layout).forEach(\n ([key, value]) => (layout[newKey(key, oldStyle.type)] = value),\n );\n return { ...style, paint, layout } as StyleSpecification;\n};\n\nexport const Layer: Component<Props> = (props) => {\n const [ctx] = useMapContext();\n const sourceId: string =\n props.sourceId || props.style?.source || useSourceId();\n const layerId: string = props.id || props.customLayer?.id || createUniqueId();\n\n const debug = (text, value?) => {\n (ctx.map.debug || ctx.map.debugEvents) &&\n console.debug(\"%c[MapGL]\", \"color: #10b981\", text, value || \"\");\n };\n\n // Add Layer\n ctx.map.addLayer(\n props.customLayer || {\n ...updateStyle(props.style),\n id: layerId,\n source: sourceId,\n slot: props.slot || \"\",\n metadata: {\n smg: { beforeType: props.beforeType, beforeId: props.beforeId },\n },\n },\n props.beforeType\n ? ctx.map.getStyle().layers.find((l) => l.type === props.beforeType)?.id\n : props.beforeId,\n );\n ctx.map.layerIdList.push(layerId);\n if (props.customLayer) ctx.map.fire(\"load\");\n debug(\"Add Layer:\", layerId);\n\n // Hook up events\n layerEvents.forEach((item) => {\n if (props[item]) {\n const event = item.slice(2).toLowerCase();\n ctx.map.on(event, layerId, (evt) => {\n evt.clickOnLayer = true;\n props[item](evt);\n ctx.map.debugEvent &&\n debug(`Layer '${event}' event on '${layerId}':`, evt);\n });\n }\n });\n\n // Update Style\n createEffect((prev: StyleSpecification) => {\n const style = updateStyle(props.style);\n if (style === prev) return;\n\n if (style.layout !== prev?.layout)\n diff(style.layout, prev?.layout).forEach(([key, value]) =>\n ctx.map.setLayoutProperty(layerId, key, value, { validate: false }),\n );\n\n if (style.paint !== prev?.paint)\n diff(style.paint, prev?.paint).forEach(([key, value]) =>\n ctx.map.setPaintProperty(layerId, key, value, { validate: false }),\n );\n\n if (style.minzoom !== prev?.minzoom || style.maxzoom !== prev?.maxzoom)\n ctx.map.setLayerZoomRange(layerId, style.minzoom, style.maxzoom);\n\n if (style.filter !== prev?.filter)\n ctx.map.setFilter(layerId, style.filter, { validate: false });\n\n debug(\"Update Layer Style:\", layerId);\n return style;\n }, updateStyle(props.style));\n\n // Update Visibility\n createEffect((prev: boolean) => {\n if (props.visible === prev) return;\n\n ctx.map.setLayoutProperty(\n layerId,\n \"visibility\",\n props.visible ? \"visible\" : \"none\",\n { validate: false },\n );\n debug(`Update Visibility (${layerId}):`, props.visible.toString());\n return props.visible;\n }, props.visible);\n\n // Update Filter\n createEffect(async () => {\n if (!props.filter) return;\n\n !ctx.map.isStyleLoaded() && (await ctx.map.once(\"styledata\"));\n ctx.map.setFilter(layerId, props.filter);\n debug(`Update Filter (${layerId}):`, props.filter);\n });\n\n // Update Feature State\n createEffect(async () => {\n if (!props.featureState || props.featureState.id === null) return;\n\n !ctx.map.isStyleLoaded() && (await ctx.map.once(\"styledata\"));\n\n ctx.map.removeFeatureState({\n source: sourceId,\n sourceLayer: props.style[\"source-layer\"],\n });\n ctx.map.setFeatureState(\n {\n source: sourceId,\n sourceLayer: props.style[\"source-layer\"],\n id: props.featureState.id,\n },\n props.featureState.state,\n );\n });\n\n //Remove Layer\n onCleanup(() => ctx.map?.getLayer(layerId) && ctx.map?.removeLayer(layerId));\n\n return props.children;\n};\n","import {\n onCleanup,\n Component,\n createUniqueId,\n createSignal,\n onMount,\n createContext,\n useContext,\n JSX,\n} from \"solid-js\";\nimport { unwrap } from \"solid-js/store\";\nimport { useMapContext } from \"../MapProvider\";\nimport mapboxgl from \"mapbox-gl\";\nimport { Logger } from \"@babylonjs/core\";\n\ndeclare global {\n interface Window {\n BABYLON?: any;\n THREE?: any;\n }\n}\n\ntype Props = {\n id?: string;\n origin?: [number, number, number?]; // [lng, lat, altitude]\n defaultLight?: boolean;\n babylon?: boolean;\n onAdd?: (scene: any, map: any, gl: any) => void;\n onRender?: (gl: any, matrix: any) => void;\n children?: JSX.Element | JSX.Element[];\n /** A string that specifies the type of layer before which the current layer should be inserted. */\n beforeId?: string;\n disableProjectionMatrix?: boolean;\n};\n\nconst deg2rad = (degrees: number) => {\n return (degrees * Math.PI) / 180;\n};\n\nconst latLng2Mercator = (lat: number, lng: number, altitude: number) => {\n const R = 6378137.0; // earth radius in meters\n const x = R * deg2rad(lng);\n const y = R * Math.log(Math.tan(Math.PI / 4 + deg2rad(lat) / 2));\n return [x, y, altitude];\n};\n\nconst latLng2Cartesian = ({ lat, lng }, altitude: number = 0) => {\n const R = 6378137.0; // earth radius in meters\n const x = R * Math.cos(deg2rad(lat)) * Math.cos(deg2rad(lng));\n const y = R * Math.cos(deg2rad(lat)) * Math.sin(deg2rad(lng));\n const z = altitude; // + R * Math.sin(deg2rad(lat));\n return { x, y, z };\n};\n\nconst LayerContext = createContext<any>();\nexport const useScene = (): any => useContext(LayerContext);\n\nexport const Layer3D: Component<Props> = (props) => {\n const [ctx] = useMapContext();\n const [scene, setScene] = createSignal(null);\n\n onMount(async () => {\n props.id = props.id || createUniqueId();\n\n const worldOriginMercator = window.MapLib.MercatorCoordinate.fromLngLat(\n [props.origin[0] || 0, props.origin[1] || 0],\n props.origin[2] || 0,\n );\n const worldScale = worldOriginMercator.meterInMercatorCoordinateUnits();\n const { x, y, z } = worldOriginMercator;\n\n let worldMatrix = null;\n let BABYLON = null;\n let THREE = null;\n\n if (props.babylon) {\n BABYLON = await import(\"@babylonjs/core\");\n worldMatrix = BABYLON.Matrix.Compose(\n new BABYLON.Vector3(worldScale, worldScale, worldScale),\n BABYLON.Quaternion.FromEulerAngles(Math.PI / 2, 0, 0),\n new BABYLON.Vector3(x, y, z),\n );\n } else {\n THREE = await import(\"three\");\n worldMatrix = {\n translateX: x,\n translateY: y,\n translateZ: z,\n rotateX: Math.PI / 2,\n rotateY: 0,\n rotateZ: 0,\n scale: worldScale,\n };\n }\n\n ctx.map.addLayer(\n {\n id: props.id,\n type: \"custom\",\n renderingMode: \"3d\",\n onAdd(map, gl) {\n if (props.babylon) {\n const engine = new BABYLON.Engine(\n gl,\n true,\n {\n useHighPrecisionMatrix: true,\n },\n true,\n );\n // this.index = 0;\n\n this.scene = new BABYLON.Scene(engine);\n this.scene.autoClear = false;\n // this.scene.autoClearDepthAndStencil = false;\n // this.scene.detachControl();\n this.scene.preventDefaultOnPointerDown = false;\n this.scene.preventDefaultOnPointerUp = false;\n // this.scene.beforeRender = () => engine.wipeCaches(true);\n const camera = new BABYLON.UniversalCamera(\n \"Camera\",\n BABYLON.Vector3.Zero(),\n );\n camera.mode = BABYLON.Camera.ORTHOGRAPHIC_CAMERA;\n camera.inertia = 0;\n // this.scene.activeCamera.setTarget(new BABYLON.Vector3(-1, 0, 0));\n // this.scene.activeCamera.rotationQuaternion =\n // BABYLON.Quaternion.Identity();\n // this.scene.activeCamera.updateUpVectorFromRotation = true;\n\n // this.scene.activeCamera.noRotationConstraint = true;\n // this.scene.activeCamera.inputs.addMouseWheel();\n // this.scene.activeCamera.setTarget(BABYLON.Vector3.Zero());\n // setTimeout(() => {\n // this.scene.activeCamera.setPosition(\n // new BABYLON.Vector3(100, 100, 100),\n // );\n // }, 2000);\n // this.scene.activeCamera.attachControl(gl.canvas, true);\n this.scene.ambientColor = new BABYLON.Color3(1, 1, 1);\n if (props.defaultLight)\n new BABYLON.HemisphericLight(\n \"Light\",\n new BABYLON.Vector3(100, 10, 0),\n this.scene,\n );\n // this.scene.root_node = new BABYLON.TransformNode(\"rootNode\");\n // this.scene.root_node.lookAt(BABYLON.Vector3.Down());\n // this.scene.root_node.addRotation(0, 0, Math.PI / 2);\n // const axis = new BABYLON.AxesViewer(this.scene, 100);\n } else {\n this.camera = new THREE.Camera();\n this.scene = new THREE.Scene();\n if (props.defaultLight) {\n this.light = new THREE.DirectionalLight(0xffffff);\n this.light.position.set(100, 0, 0).normalize();\n this.scene.add(this.light);\n }\n\n this.renderer = new THREE.WebGLRenderer({\n canvas: map.getCanvas(),\n context: gl,\n antialias: true,\n });\n this.renderer.autoClear = false;\n }\n this.map = map;\n props.onAdd && props.onAdd(this.scene, this.map, gl);\n setScene(this.scene);\n },\n render(gl, matrix) {\n if (props.babylon) {\n this.scene.activeCamera.freezeProjectionMatrix(\n // props.disableProjectionMatrix\n // ? BABYLON.Matrix.FromArray(matrix)\n worldMatrix.multiply(BABYLON.Matrix.FromArray(matrix)),\n );\n\n // this.scene.activeCamera.position =\n // BABYLON.Vector3.TransformCoordinates(\n // new BABYLON.Vector3(),\n // worldMatrix.multiply(BABYLON.Matrix.FromArray(matrix)).invert(),\n // );\n\n // this.scene.activeCamera.rotation.z = matrix[0];\n // this.scene.activeCamera.rotation.x = matrix[1];\n // this.scene.activeCamera.rotation.y = matrix[2];\n\n // console.log(this.scene.activeCamera.getProjectionMatrix(), matrix);\n\n // const m = matrix;\n\n // const transform = BABYLON.Matrix.FromArray(matrix);\n // console.log(transform);\n //\n // const center = this.map.getCenter();\n // const zoom = this.map.getZoom();\n // const scale = Math.pow(2, zoom);\n // const centerX = center.lng * scale;\n // const centerZ = center.lat * scale;\n // this.scene.activeCamera.position.x = centerX;\n // this.scene.activeCamera.position.z = centerZ;\n\n // this.scene.activeCamera.getWorldMatrix().copyFrom(transform);\n\n const pitch = this.map.getPitch() * (Math.PI / 180);\n const bearing = this.map.getBearing() * (Math.PI / 180);\n\n // this.scene.activeCamera.rotation.x = Math.asin(pitch);\n // this.scene.activeCamera.rotation.y = Math.atan(bearing / pitch);\n // this.scene.activeCamera.rotation.z = -bearing;\n\n // this.scene.activeCamera\n // .getWorldMatrix()\n // .invertToRef(this.scene.activeCamera.getViewMatrix());\n\n // const cameraMatrix = BABYLON.Matrix.FromArray(matrix); //.invert();\n // const scaling = BABYLON.Vector3.Zero(),\n // rotation = BABYLON.Vector3.Zero(),\n // transform = BABYLON.Vector3.Zero();\n // cameraMatrix.decompose(scaling, rotation, transform);\n // const scaling2 = BABYLON.Vector3.Zero(),\n // rotation2 = BABYLON.Vector3.Zero(),\n // transform2 = BABYLON.Vector3.Zero();\n // worldMatrix.decompose(scaling2, rotation2, transform2);\n\n // const lng2 =\n // props.origin[0] -\n // this.map.getFreeCameraOptions().position.toLngLat().lng;\n // const lat2 =\n // props.origin[1] -\n // this.map.getFreeCameraOptions().position.toLngLat().lat;\n //\n // const pos = this.map.getFreeCameraOptions().position.toLngLat();\n // const orient = this.map.getFreeCameraOptions().orientation;\n\n // const camPos = latLng2Cartesian(\n // this.map.getFreeCameraOptions().position.toLngLat(),\n // this.map.getFreeCameraOptions().position.toAltitude(),\n // );\n // const orgPos = latLng2Cartesian({\n // lng: props.origin[0],\n // lat: props.origin[1],\n // });\n\n // const o = this.map.getFreeCameraOptions().orientation;\n // const orient = latLng2Cartesian(\n // new window.MapLib.MercatorCoordinate(\n // ...this.map.getFreeCameraOptions().orientation,\n // ).toLngLat(),\n // );\n\n // console\n // .log\n // this.map.getFreeCameraOptions().orientation,\n // this.map.getFreeCameraOptions().position.toLngLat(),\n // orgX,\n // camX,\n // camPos,\n // orgPos,\n // x,\n // this.scene.activeCamera.minZ,\n // this.scene.activeCamera.maxZ,\n // this.map.getFreeCameraOptions(),\n // this.map.getFreeCameraOptions().position.toAltitude(),\n // camPos.z,\n // orgPos.z,\n // camPos.z - orgPos.z,\n // this.scene.activeCamera.rotationQuaternion,\n // matrix,\n // camPos.z - orgPos.z,\n // camPos.x - orgPos.x,\n // camPos.y - orgPos.y,\n // camPos.z - orgPos.z,\n // this.index,\n // orient,\n // orient.x - orgPos.x,\n // new BABYLON.Vector3(...orient),\n // camY,\n // camZ,\n // pos.lng,\n // x2,\n // y2,\n // z2,\n // transform,\n // matrix,\n // cameraMatrix._m,\n // cameraMatrix,\n // new mapboxgl.MercatorCoordinate(\n // transform.x,\n // transform.y,\n // transform.z,\n // ).toLngLat(),\n // worldOriginMercator.toLngLat(),\n // this.map.getFreeCameraOptions().position.toLngLat(),\n // this.map.getFreeCameraOptions().orientation,\n // BABYLON.Quaternion.FromArray(\n // this.map.getFreeCameraOptions().orientation,\n // ),\n // this.scene.activeCamera.rotationQuaternion,\n // BABYLON.Vector3.FromArray(\n // this.map.getFreeCameraOptions().orientation,\n // ),\n // ();\n // this.scene.activeCamera.freezeProjectionMatrix(\n // props.disableProjectionMatrix\n // ? BABYLON.Matrix.FromArray(matrix)\n // : worldMatrix.multiply(BABYLON.Matrix.FromArray(matrix)),\n // );\n //\n // const { x, y } = this.map.project(\n // new mapboxgl.MercatorCoordinate(pos.x, pos.y, pos.z).toLngLat(),\n // );\n // this.scene.activeCamera.position.y = 0; //-(camPos.x - orgPos.x);\n // this.scene.activeCamera.position.x = 0; //-(camPos.y - orgPos.y);\n // this.scene.activeCamera.position.z = -camPos.z; // - orgPos.z;\n // console.log(this.scene.activeCamera.position);\n\n // const [x, y, z, w] = this.map.getFreeCameraOptions().orientation;\n\n // let rotation_y = Math.atan(z / x);\n // if (x < 0) rotation_y += Math.PI;\n // rotation_y = Math.PI / 2 - rotation_y;\n // const rotation_x = Math.asin(-y);\n // const camera_up_before_rotatez = new BABYLON.Vector3(\n // -Math.cos(rotation_y),\n // 0,\n // Math.sin(rotation_y),\n // );\n // const rotation_z = Math.acos(\n // camera_up.x * camera_up_before_rotatez.x +\n // camera_up.y * camera_up_before_rotatez.y +\n // camera_up.z * camera_up_before_rotatez.z,\n // );\n // rotation_z = Math.PI / 2 - rotation_z;\n // if (camera_up.y < 0) rotation_z = Math.PI - rotation_z;\n //\n // this.scene.activeCamera.rotation.x = rotation_x;\n // this.scene.activeCamera.rotation.y = rotation_y;\n\n // this.scene.activeCamera.rotationQuaternion =\n // // BABYLON.Quaternion.Identity();\n // // BABYLON.Quaternion.FromEulerAngles(1, 0, 0);\n // BABYLON.Quaternion.FromArray([-x, y, -z, w]);\n // this.scene.activeCamera.alpha = -z;\n // this.scene.activeCamera.alpha = -z;\n // this.scene.activeCamera.radius = x; //Math.PI / 2 + this.index;\n // this.scene.activeCamera.radius = y;\n\n // this.index += 0.001;\n // BABYLON.Quaternion.RotationYawPitchRoll(-1, 1, -1);\n // BABYLON.Vector3.Zero();\n // BABYLON.Vector3.FromArray(\n // this.map.getFreeCameraOptions().orientation,\n // );\n // this.scene.activeCamera.setTarget(\n // BABYLON.Vector3.Zero(),\n // // new BABYLON.Vector3(\n // // orient.x - orgPos.x,\n // // 0, // orient.y - orgPos.y,\n // // 0, // orient.z - orgPos.z,\n // // ),\n // );\n // const o2 = this.map.project(\n // new mapboxgl.MercatorCoordinate(\n // orient[0],\n // orient[1],\n // orient[2],\n // ).toLngLat(),\n // );\n // this.camera.setTarget(new BABYLON.Vector3(o2.x, o2.y, o2.z));\n // console.log(\n // this.map.getCamera(),\n // this.map.project(\n // new mapboxgl.MercatorCoordinate(pos.x, pos.y, pos.z).toLngLat(),\n // ),\n // this.map.getFreeCameraOptions().orientation,\n // );\n // console.log(this.scene.activeCamera.position);\n // this.camera.position = BABYLON.Vector3.TransformCoordinates(\n // new BABYLON.Vector3(x, y, z),\n // this.scene.activeCamera.getProjectionMatrix().clone().invert(),\n // );\n this.scene.render(false);\n } else {\n const rotationX = new THREE.Matrix4().makeRotationAxis(\n new THREE.Vector3(1, 0, 0),\n worldMatrix.rotateX,\n );\n const rotationY = new THREE.Matrix4().makeRotationAxis(\n new THREE.Vector3(0, 1, 0),\n worldMatrix.rotateY,\n );\n const rotationZ = new THREE.Matrix4().makeRotationAxis(\n new THREE.Vector3(0, 0, 1),\n worldMatrix.rotateZ,\n );\n\n const m = new THREE.Matrix4().fromArray(matrix);\n const l = new THREE.Matrix4()\n .makeTranslation(\n worldMatrix.translateX,\n worldMatrix.translateY,\n worldMatrix.translateZ,\n )\n .scale(\n new THREE.Vector3(\n worldMatrix.scale,\n -worldMatrix.scale,\n worldMatrix.scale,\n ),\n )\n .multiply(rotationX)\n .multiply(rotationY)\n .multiply(rotationZ);\n this.camera.projectionMatrix = m.multiply(l);\n this.renderer.resetState();\n this.renderer.render(this.scene, this.camera);\n }\n props.onRender && props.onRender(gl, matrix);\n ctx.map.triggerRepaint();\n },\n },\n props.beforeId,\n );\n });\n\n onCleanup(() => {\n ctx.map.getLayer(props.id) && ctx.map.removeLayer(props.id);\n });\n\n return (\n <LayerContext.Provider value={scene}>\n {scene() && props.children}\n </LayerContext.Provider>\n );\n};\n","import { onCleanup, createEffect, VoidComponent } from \"solid-js\";\nimport { useMapContext } from \"../MapProvider\";\nimport type { Fog } from \"mapbox-gl\";\n\ninterface AtmosphereProps {\n /** Fog/Atmosphere Specifications */\n style?: Fog;\n}\n\nexport const Atmosphere: VoidComponent<AtmosphereProps> = (props) => {\n const [ctx] = useMapContext();\n\n // Add or Update Atmosphere Layer\n createEffect(() => ctx.map.setFog(props.style || {}));\n\n // Remove Atmosphere Layer\n onCleanup(() => {\n if (ctx.map.getFog()) ctx.map.setFog(null);\n });\n\n return null;\n};\n","import {\n createEffect,\n VoidComponent,\n createUniqueId,\n onCleanup,\n} from 'solid-js'\nimport { useMapContext } from '../MapProvider'\nimport { useSourceId } from '../Source'\n\ninterface TerrainSpecification {\n source?: string\n exaggeration?: number | undefined\n}\n\nexport const Terrain: VoidComponent<TerrainSpecification> = (\n props?: TerrainSpecification\n) => {\n const [ctx] = useMapContext()\n let sourceId: string = useSourceId()\n\n // Add Terrain Source if not already defined\n if (!sourceId && !props?.source) {\n sourceId = createUniqueId()\n ctx.map.addSource(sourceId, {\n type: 'raster-dem',\n url: ctx.map.isMapLibre\n ? 'https://demotiles.maplibre.org/terrain-tiles/tiles.json'\n : 'mapbox://mapbox.terrain-rgb',\n tileSize: ctx.map.isMapLibre ? 256 : 512,\n maxzoom: ctx.map.isMapLibre ? undefined : 14,\n })\n ctx.map.sourceIdList.push(sourceId)\n }\n\n // Add or Update Terrain Layer\n createEffect(() => {\n ctx.map.setTerrain({\n exaggeration: props.exaggeration || 1,\n source: props?.source || sourceId,\n })\n })\n\n //Remove Terrain\n onCleanup(() => ctx.map?.setTerrain(null))\n\n return null\n}\n","import {\n createSignal,\n createEffect,\n onCleanup,\n splitProps,\n untrack,\n VoidComponent,\n} from \"solid-js\";\nimport { useMapContext } from \"../MapProvider\";\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\ntype ControlType =\n | \"navigation\"\n | \"scale\"\n | \"attribution\"\n | \"fullscreen\"\n | \"geolocate\"\n | \"logo\"\n | \"terrain\";\n\ntype Props = {\n type?: ControlType;\n options?:\n | NavigationOptions\n | ScaleOptions\n | AttributionOptions\n | FullscreenOptions\n | GeolocateOptions\n | object;\n custom?: any;\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n};\n\nexport const Control: VoidComponent<Props> = (props) => {\n const [ctx] = useMapContext();\n const [update, create] = splitProps(props, [\"position\"]);\n const [control, setControl] = createSignal<any>(null);\n\n const controlClasses = new Map<ControlType, any>([\n [\"navigation\", window.MapLib.NavigationControl],\n [\"scale\", window.MapLib.ScaleControl],\n [\"attribution\", window.MapLib.AttributionControl],\n [\"geolocate\", window.MapLib.GeolocateControl],\n [\"fullscreen\", window.MapLib.FullscreenControl],\n [\"logo\", window.MapLib.LogoControl],\n [\"terrain\", window.MapLib.TerrainControl],\n ]);\n\n // Add Control\n createEffect(() => {\n untrack(\n () =>\n control() &&\n ctx.map.hasControl(control()) &&\n ctx.map.removeControl(control()),\n );\n setControl(\n create.custom ||\n new (controlClasses.get(create.type || \"navigation\"))(create.options),\n );\n });\n\n // Update Position\n createEffect(() => {\n ctx.map.hasControl(control()) && ctx.map.removeControl(control());\n ctx.map.addControl(control(), update.position);\n });\n\n onCleanup(() => {\n ctx.map.hasControl(control()) && ctx.map.removeControl(control());\n });\n\n return null;\n};\n","import { onCleanup, createEffect, Component, splitProps } from 'solid-js'\nimport { useMapContext } from '../MapProvider'\nimport type {\n Popup as PopupType,\n PopupOptions,\n Marker as MarkerType,\n MarkerOptions,\n LngLatLike,\n} from 'mapbox-gl'\n\ntype Props = {\n /** The geographical location to place the marker */\n lngLat: LngLatLike\n /** Options for the Mapbox GL JS marker */\n options?: MarkerOptions\n /** Options for the Mapbox GL JS popup that is associated with the marker */\n popup?: PopupOptions\n /** Whether the marker's associated popup should be open */\n showPopup?: boolean\n /** Whether the marker is draggable */\n draggable?: boolean\n /** A function that is called when the marker's associated popup is opened */\n onOpen?: () => void\n /** A function that is called when the marker's associated popup is closed */\n onClose?: () => void\n /** A function that is called when the marker starts being dragged */\n onDragStart?: () => void\n /** A function that is called when the marker stops being dragged */\n onDragEnd?: () => void\n /** A function that is called when the marker is being dragged */\n onDrag?: (lngLat: number[]) => void\n /** The content to be displayed in the marker's associated popup */\n children?: any\n}\n\nexport const Marker: Component<Props> = (props: Props) => {\n if (!props.lngLat) throw new Error('Marker - lngLat is required')\n const [update, create_popup, create_marker] = splitProps(\n props,\n ['lngLat', 'children', 'showPopup', 'draggable'],\n ['popup', 'onOpen', 'onClose']\n )\n\n const [ctx] = useMapContext()\n let marker: MarkerType = null\n let popup: PopupType = null\n const LNGLAT = update.lngLat\n\n // Add or Update Popup\n createEffect(() => {\n if (!ctx.map) return\n popup?.remove()\n popup = new window.MapLib.Popup({\n closeOnClick: false,\n focusAfterOpen: false,\n ...create_popup.popup,\n })\n .on('open', () => create_popup.onOpen?.())\n .on('close', () => create_popup.onClose?.())\n\n // Update Popup Content\n createEffect(() => {\n if (update.children === undefined) return\n typeof update.children === 'string'\n ? popup?.setHTML(update.children)\n : popup?.setDOMContent(update.children)\n marker?.setPopup(popup)\n })\n\n // Toggle Popup\n createEffect(\n () => update.showPopup !== popup?.isOpen() && marker?.togglePopup()\n )\n })\n\n // Add or Update Marker\n createEffect(() => {\n if (!ctx.map) return\n marker?.remove()\n marker = new window.MapLib.Marker(create_marker.options)\n .on('dragstart', () => create_marker.onDragStart?.())\n .on('dragend', () => create_marker.onDragEnd?.())\n .on('drag', () => create_marker.onDrag?.(marker?.getLngLat().toArray()))\n .setPopup(popup)\n .setLngLat(LNGLAT)\n .addTo(ctx.map)\n\n // Toggle Popup\n createEffect(\n () => update.showPopup !== popup?.isOpen() && marker?.togglePopup()\n )\n })\n\n // Update Position\n createEffect(() => marker?.setLngLat(update.lngLat))\n\n // Update Draggable\n createEffect(() => marker?.setDraggable(update.draggable))\n\n // Remove Marker\n onCleanup(() => marker?.remove())\n\n return null\n}\n","import { onCleanup, createEffect, Component, splitProps } from \"solid-js\";\nimport { useMapContext } from \"../MapProvider\";\nimport type { Popup as PopupType, PopupOptions, LngLatLike } from \"mapbox-gl\";\n\ntype Props = {\n /** Options for configuring the popup */\n options?: PopupOptions;\n /** Flag for tracking the mouse pointer */\n trackPointer?: boolean;\n /** Longitude and latitude for the popup */\n lngLat?: LngLatLike;\n /** Callback for when the popup is opened */\n onOpen?: () => void;\n /** Callback for when the popup is closed */\n onClose?: () => void;\n /** Children to display within the popup */\n children?: any;\n};\n\nexport const Popup: Component<Props> = (props: Props) => {\n if (!props.trackPointer && !props.lngLat)\n throw new Error(\"Popup - lngLat or trackPointer is required\");\n\n const [update, create] = splitProps(props, [\n \"lngLat\",\n \"children\",\n \"trackPointer\",\n ]);\n const [ctx] = useMapContext();\n let popup: PopupType | undefined;\n\n // Update Popup\n createEffect(() => {\n if (!ctx.map) return;\n popup?.remove();\n popup = new window.MapLib.Popup({\n closeOnClick: false,\n focusAfterOpen: false,\n ...create.options,\n })\n .on(\"open\", () => create.onOpen?.())\n .on(\"close\", () => create.onClose?.())\n .addTo(ctx.map);\n\n // Update Position\n createEffect(() =>\n update.trackPointer\n ? popup.trackPointer()\n : popup.setLngLat(update.lngLat),\n );\n\n // Update Content\n createEffect(() =>\n typeof update.children === \"string\"\n ? popup.setHTML(update.children)\n : popup.setDOMContent(update.children),\n );\n });\n\n // Remove Popup\n onCleanup(() => popup?.remove());\n\n return null;\n};\n","import {\n onCleanup,\n createSignal,\n createEffect,\n VoidComponent,\n untrack,\n} from 'solid-js'\nimport { useMapContext } from '../MapProvider'\nimport type {\n StyleImageInterface,\n StyleImageMetadata,\n} from 'mapbox-gl/src/style/style_image'\n\nconst PATTERN = {\n diagonal_l: { size: 20, path: 'M20 0 0 20M-10 10 10-10M10 30 30 10' },\n diagonal_r: { size: 20, path: 'M0 0 20 20M30 10 10-10M10 30-10 10' },\n horizontal: { size: 14, path: 'M7 0V20' },\n vertical: { size: 14, path: 'M0 7H20' },\n cross: { size: 18, path: 'M9 0V18M0 9H18' },\n hash: { size: 30, path: 'M15 0 30 15 15 30 0 15Z' },\n chevron_h: { size: 20, path: 'M-5 5 0 10 10 0 20 10 25 5M0 30 10 20 20 30' },\n chevron_v: { size: 20, path: 'M5-5 10 0 0 10 10 20 5 25M25 15 20 10 25 5' },\n square: { size: 20, path: 'M8 8H12V12H8Z', fill: true },\n hex: { size: 50, path: 'M0 0V50L50 25ZM50 0V50L0 25ZM25 0V50' },\n circle: {\n size: 25,\n path: 'M8 10A2.5 2.5 0 118.01 10M18 15A2.5 2.5 0 1018.01 15',\n fill: true,\n },\n}\n\nexport const patternList = Object.keys(PATTERN)\n\nexport type Color =\n | `#${string}`\n | `rgb(${number}, ${number}, ${number})`\n | `rgba(${number}, ${number}, ${number}, ${number})`\n | `hsl(${number}, ${number}%, ${number}%)`\n | `hsla(${number}, ${number}%, ${number}%, ${number})`\n\ntype Props = {\n id: string\n /** The unique identifier for the image. */\n source?:\n | HTMLImageElement\n | ImageBitmap\n | ImageData\n | SVGElement\n | { width: number; height: number; data: Uint8Array | Uint8ClampedArray }\n | StyleImageInterface\n | string\n /** The image to be used for the image component. */\n options?: StyleImageMetadata & {\n fill?: Color\n stroke?: Color\n transform?: string\n }\n /** The options for the image */\n pattern?: {\n type: string\n color: Color\n background: Color\n lineWith: number\n }\n /** The pattern to be used for the image component. */\n}\n\nexport const MGL_Image: VoidComponent<Props> = props => {\n const [ctx] = useMapContext()\n const [size, setSize] = createSignal({ width: 0, height: 0 })\n\n const debug = (text, value?) => {\n ctx.map.debug &&\n console.debug('%c[MapGL]', 'color: #10b981', text, value || '')\n }\n\n // Remove Image\n onCleanup(() => {\n ctx.map?.hasImage(props.id) && ctx.map?.removeImage(props.id)\n debug('Remove Image:', props.id)\n })\n\n // Add or Update Image\n createEffect(() => {\n if (!props.id) throw new Error('Image - ID is required')\n if (!props.source && !props.pattern)\n throw new Error('Image - Image or Pattern is required')\n\n const ops = props.pattern\n ? { pixelRatio: 2, ...props.options }\n : props.options\n\n _loadImage(props.source || _createPattern(props.pattern), data => {\n const { width, height } = data\n if (ctx.map && !ctx.map.hasImage(props.id))\n ctx.map.addImage(props.id, data, ops)\n if (\n !props.pattern &&\n untrack(() => width === size().width && height === size().height)\n ) {\n ctx.map.updateImage(props.id, data)\n ctx.map.triggerRepaint()\n } else {\n ctx.map.removeImage(props.id)\n ctx.map.addImage(props.id, data, ops)\n }\n setSize({ width, height })\n debug('Add Image:', props.id)\n ctx.map.on('style.load', () => {\n if (ctx.map.hasImage(props.id)) return\n ctx.map.addImage(props.id, data, ops)\n debug('Re-Add Image:', props.id)\n })\n })\n })\n\n // Load Image / SVG\n const _loadImage = (image, callback) => {\n if (typeof image == 'string' && image?.trimStart().startsWith('<svg')) {\n image = new DOMParser().parseFromString(image, 'image/svg+xml')\n .childNodes[0]\n }\n if (image instanceof SVGElement) {\n props.options?.fill && image.setAttribute('fill', props.options.fill)\n props.options?.stroke &&\n image.setAttribute('stroke', props.options.stroke)\n image = new XMLSerializer().serializeToString(image)\n }\n if (typeof image !== 'string') return callback(image)\n ctx.map.loadImage(image, async (error, imageData) => {\n if (error) {\n if (typeof image == 'string' && image?.trimEnd().endsWith('.svg')) {\n image = await (await fetch(image)).text()\n image = new DOMParser().parseFromString(image, 'image/svg+xml')\n .childNodes[0]\n image.setAttribute('fill', props.options.fill)\n image.setAttribute('stroke', props.options.stroke)\n image.setAttribute('transform', props.options.transform)\n image = new XMLSerializer().serializeToString(image)\n }\n const img = new Image()\n img.crossOrigin = 'Anonymous'\n img.onload = () => {\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(img.width, 50)\n canvas.height = Math.max(img.height, 50)\n const ctx = canvas.getContext('2d')\n ctx.imageSmoothingEnabled = true\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\n return callback(ctx.getImageData(0, 0, canvas.width, canvas.height))\n }\n img.src = image.trimStart().startsWith('<svg')\n ? 'data:image/svg+xml;charset=utf-8,' + image\n : image\n } else {\n return callback(imageData)\n }\n })\n }\n\n const _createPattern = pattern => {\n const p = PATTERN[pattern.type]\n return {\n width: p.size,\n height: p.size,\n data: new Uint8Array(p.size * p.size * 4),\n onAdd: function () {\n let canvas = document.createElement('canvas')\n canvas.width = canvas.height = p.size\n this.ctx = canvas.getContext('2d', { willReadFrequently: true })\n },\n render: function () {\n this.ctx.fillStyle = pattern.background || 'transparent'\n this.ctx.fillRect(0, 0, this.width, this.height)\n this.ctx.strokeStyle = this.ctx.fillStyle = pattern.color || 'black'\n this.ctx.lineWidth = pattern.lineWith || 1\n this.ctx.stroke(new Path2D(p.path))\n if (p.fill) this.ctx.fill(new Path2D(p.path))\n this.data = this.ctx.getImageData(0, 0, this.width, this.height).data\n return true\n },\n }\n }\n\n return null\n}\n","import { createEffect, Component, onCleanup, createSignal } from 'solid-js'\nimport { useMapContext } from '../MapProvider'\nimport type { LngLatLike } from 'mapbox-gl'\n\n// linearly interpolate between two positions [x,y,z] based on time\nconst lerp = (a: number[], b: number[], t: number): number[] =>\n a.map((_, idx) => (1.0 - t) * a[idx] + t * b[idx])\n\n// sphericaly interpolate between two positions [x,y,z] based on time\nconst slerp = (a: number[], b: number[], t: number): number[] => {\n const dotProduct = a.map((_, idx) => a[idx] * b[idx]).reduce((m, n) => m + n)\n const theta = Math.acos(dotProduct)\n\n return a.map(\n (_, idx) =>\n (Math.sin((1 - t) * theta) / Math.sin(theta)) * a[idx] +\n (Math.sin(t * theta) / Math.sin(theta)) * b[idx]\n )\n}\n\n// calculations from: https://easings.net\nconst easeQuad = {\n in: (x: number): number => x * x,\n out: (x: number): number => 1 - (1 - x) * (1 - x),\n inOut: (x: number): number =>\n x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2,\n}\n\n/** Options for rotating the globe. */\ninterface RotateGlobeOptions {\n /** The number of seconds per revolution. */\n secPerRev?: number\n /** The maximum zoom level for spinning the globe. */\n maxSpinZoom?: number\n /** The zoom level at which the spinning slows down. */\n slowSpinZoom?: number\n}\n\n/** Options for rotating the viewport. */\ninterface RotateViewportOptions {\n /** The number of seconds per revolution. */\n secPerRev?: number\n /** The pitch angle in degrees. */\n pitch?: number\n /** The center of rotation. */\n around?: LngLatLike\n}\n\n/** Props for the component. */\ntype Props = {\n /** Whether to rotate the globe. */\n rotateGlobe?: boolean | RotateGlobeOptions\n /** Whether to rotate the viewport. */\n rotateViewport?: boolean | RotateViewportOptions\n /** Whether to reverse the rotation direction. */\n reverse?: boolean\n /** Whether to reset the rotation when stopped. */\n resetWhenStopped?: boolean\n /** Translation options. */\n translate?: {\n /** The type of translation. */\n type?: 'line' | 'sphere'\n /** The starting position. */\n start: [number, number, number]\n /** The ending position. */\n end: [number, number, number]\n /** The target position. */\n target: LngLatLike\n /** The ending target position. */\n targetEnd?: LngLatLike\n /** The easing function to use. */\n easing?: 'in' | 'out' | 'inOut'\n /** Whether to loop the translation. */\n loop?: boolean\n /** The duration of the translation in milliseconds. */\n duration: number\n }\n /** The children to render. */\n children?: any\n}\n\nexport const Camera: Component<Props> = (props) => {\n const [ctx] = useMapContext()\n let animationTime = 0.1\n let isReverse = false\n\n // Handle User Interaction\n const [userInteraction, setUserInteraction] = createSignal(false)\n ;['mousedown', 'touchstart', 'wheel'].forEach((event) =>\n ctx.map.on(event, (evt) => !evt.rotate && setUserInteraction(true))\n )\n ;['moveend', 'mouseup', 'touchend'].forEach((event) =>\n ctx.map.on(event, (evt) => !evt.rotate && setUserInteraction(false))\n )\n\n const updateCameraPosition = async (\n [lng, lat, alt]: number[],\n target: LngLatLike\n ) => {\n const camera = ctx.map.getFreeCameraOptions()\n camera.position = window.MapLib.MercatorCoordinate.fromLngLat(\n [lng, lat],\n alt\n )\n camera.lookAtPoint(target)\n ctx.map.setFreeCameraOptions(camera)\n }\n\n const frame = () => {\n props.translate && window.requestAnimationFrame(frame)\n const params = [\n props.translate.start,\n props.translate.end,\n props.translate.easing\n ? easeQuad[props.translate.easing](animationTime)\n : animationTime,\n ] as const\n const position =\n props.translate.type === 'line' ? lerp(...params) : slerp(...params)\n\n updateCameraPosition(position, props.translate.target)\n\n if (!props.translate.loop && (animationTime > 1.0 || animationTime < 0.0))\n isReverse = !isReverse\n animationTime = isReverse ? animationTime - 0.001 : animationTime + 0.001\n }\n\n createEffect(() => {\n props.translate && window.requestAnimationFrame(frame)\n })\n\n const options = { duration: 1000, easing: (n) => n }\n\n const rotateGlobe = (): void => {\n if (userInteraction()) return\n const {\n secPerRev = 120,\n maxSpinZoom = 5,\n slowSpinZoom = 3,\n }: RotateGlobeOptions = props.rotateGlobe as RotateGlobeOptions\n\n const zoom: number = ctx.map.getZoom()\n if (zoom > maxSpinZoom) return\n let distancePerSecond: number = 360 / secPerRev\n if (zoom > slowSpinZoom)\n distancePerSecond *= (maxSpinZoom - zoom) / (maxSpinZoom - slowSpinZoom)\n const center: mapboxgl.LngLat = ctx.map.getCenter()\n center.lng = props.reverse\n ? center.lng + distancePerSecond\n : center.lng - distancePerSecond\n ctx.map.easeTo({ center, ...options }, { rotate: true })\n }\n\n const rotateViewport = (): void => {\n if (!props.rotateViewport || userInteraction()) {\n ctx.map.stop()\n return\n }\n const rotateViewport = props.rotateViewport as RotateViewportOptions\n const secPerRev = rotateViewport?.secPerRev || 60\n const bearing = props.reverse\n ? ctx.map.getBearing() + 360 / secPerRev\n : ctx.map.getBearing() - 360 / secPerRev\n const pitch = rotateViewport?.pitch || 60\n const around = rotateViewport?.around\n ctx.map.easeTo({ bearing, pitch, around, ...options }, { rotate: true })\n }\n\n const onEnd = () => (props.rotateGlobe ? rotateGlobe() : rotateViewport())\n ctx.map.on('moveend', onEnd).on('dragend', onEnd)\n\n let originalCenter: mapboxgl.LngLatLike\n createEffect(() => {\n if (props.rotateGlobe == undefined) return\n if (props.rotateGlobe) {\n originalCenter = ctx.map.getCenter()\n rotateGlobe()\n } else {\n props.resetWhenStopped\n ? ctx.map.stop().easeTo({ center: originalCenter })\n : ctx.map.stop()\n }\n })\n\n createEffect(() => {\n if (props.rotateViewport == undefined) return\n props.rotateViewport\n ? rotateViewport()\n : props.resetWhenStopped\n ? ctx.map.stop().resetNorthPitch()\n : ctx.map.stop()\n })\n\n onCleanup(() => ctx.map.off('moveend', onEnd).off('dragend', onEnd))\n\n return props.children\n}\n","import { onCleanup, createEffect, VoidComponent } from 'solid-js'\nimport { useMapContext } from '../MapProvider'\nimport type { Light as LightSpecification } from 'mapbox-gl'\n\ntype Props = {\n /** Light Specifications */\n style: LightSpecification\n}\nexport const Light: VoidComponent<Props> = (props: Props) => {\n const [ctx] = useMapContext()\n\n // Add or Update Light Layer\n createEffect(() => ctx.map.setLight(props.style || {}))\n\n // Remove Light Layer\n onCleanup(() => ctx.map?.setLight(null))\n\n return null\n}\n","export default [\n // point active\n // {\n // id: \"points-active-halo\",\n // type: \"circle\",\n // filter: [\n // \"all\",\n // [\"==\", \"$type\", \"Point\"],\n // [\"==\", \"meta\", \"feature\"],\n // [\"==\", \"active\", \"true\"],\n // ],\n // paint: {\n // \"circle-radius\": 9,\n // \"circle-color\": \"#f7ad3b\",\n // \"circle-opacity\": 0.75,\n // },\n // },\n // {\n // id: \"highlight-active-points\",\n // type: \"circle\",\n // filter: [\n // \"all\",\n // [\"==\", \"$type\", \"Point\"],\n // [\"==\", \"meta\", \"feature\"],\n // [\"==\", \"active\", \"true\"],\n // ],\n // paint: {\n // \"circle-radius\": 5,\n // \"circle-color\": [\"get\", \"user_color\"],\n // },\n // },\n // // point inactive\n // {\n // id: \"points-inactive-halo\",\n // type: \"circle\",\n // filter: [\n // \"all\",\n // [\"==\", \"$type\", \"Point\"],\n // [\"==\", \"meta\", \"feature\"],\n // [\"==\", \"active\", \"false\"],\n // [\"!has\", \"user_label\"],\n // ],\n // paint: {\n // \"circle-radius\": 8,\n // \"circle-color\": \"#FFFFFF\",\n // \"circle-opacity\": 0.75,\n // },\n // },\n // {\n // id: \"points-inactive\",\n // type: \"circle\",\n // filter: [\n // \"all\",\n // [\"==\", \"$type\", \"Point\"],\n // [\"==\", \"meta\", \"feature\"],\n // [\"==\", \"active\", \"false\"],\n // [\"!has\", \"user_label\"],\n // ],\n // paint: {\n // \"circle-radius\": 5,\n // \"circle-color\": [\"get\", \"user_color\"],\n // },\n // },\n // {\n // id: \"points-inactive-label\",\n // type: \"symbol\",\n // filter: [\n // \"all\",\n // [\"==\", \"$type\", \"Point\"],\n // [\"==\", \"meta\", \"feature\"],\n // [\"==\", \"active\", \"false\"],\n // [\"has\", \"user_label\"],\n // ],\n // layout: {\n // \"text-field\": [\"get\", \"user_label\"],\n // \"text-font\": [\"Arial Regular\"],\n // \"text-anchor\": \"bottom\",\n // \"text-size\": 20,\n // },\n // paint: {\n // \"text-halo-color\": \"rgba(255,255,255,0.75)\",\n // \"text-halo-width\": 2,\n // \"text-halo-blur\": 1,\n // \"text-color\": [\"get\", \"user_color\"],\n // },\n // },\n\n // // line avtive (being drawn)\n // {\n // id: \"gl-draw-line-active\",\n // type: \"line\",\n // filter: [\"all\", [\"==\", \"$type\", \"LineString\"], [\"==\", \"active\", \"true\"]],\n // layout: {\n // \"line-cap\": \"round\",\n // \"line-join\": \"round\",\n // },\n // paint: {\n // \"line-color\": \"#f7ad3b\",\n // \"line-dasharray\": [0.2, 2],\n // \"line-width\": 3,\n // },\n // },\n // {\n // id: \"gl-draw-line-inactive\",\n // type: \"line\",\n // filter: [\"all\", [\"==\", \"$type\", \"LineString\"], [\"==\", \"active\", \"false\"]],\n // layout: {\n // \"line-cap\": \"round\",\n // \"line-join\": \"round\",\n // },\n // paint: {\n // \"line-color\": [\n // \"case\",\n // [\"has\", \"user_color\"],\n // [\"get\", \"user_color\"],\n // \"#f7ad3b\",\n // ],\n // \"line-width\": 2,\n // },\n // },\n // // vertex point halos\n // {\n // id: \"gl-draw-polygon-and-line-vertex-halo-active\",\n // type: \"circle\",\n // filter: [\n // \"all\",\n // [\"==\", \"meta\", \"vertex\"],\n // [\"==\", \"$type\", \"Point\"],\n // [\"!=\", \"mode\", \"static\"],\n // ],\n // paint: {\n // \"circle-radius\": 5,\n // \"circle-color\": \"#FFF\",\n // \"circle-opacity\": 0.75,\n // },\n // },\n // // vertex points\n // {\n // id: \"gl-draw-polygon-and-line-vertex-active\",\n // type: \"circle\",\n // filter: [\n // \"all\",\n // [\"==\", \"meta\", \"vertex\"],\n // [\"==\", \"$type\", \"Point\"],\n // [\"!=\", \"mode\", \"static\"],\n // ],\n // paint: {\n // \"circle-radius\": 3,\n // \"circle-color\": \"#f7ad3b\",\n // },\n // },\n // // polygon fill\n // {\n // id: \"gl-draw-polygon-fill-inactive\",\n // type: \"fill\",\n // filter: [\"==\", \"$type\", \"Polygon\"],\n // paint: {\n // \"fill-color\": [\n // \"case\",\n // [\"has\", \"user_color\"],\n // [\"get\", \"user_color\"],\n // \"#f7ad3b\",\n // ],\n // \"fill-opacity\": 0.1,\n // },\n // },\n // // polygon outline stroke\n // // This doesn't style the first edge of the polygon, which uses the line stroke styling instead\n // {\n // id: \"gl-draw-polygon-stroke-active\",\n // type: \"line\",\n // filter: [\"all\", [\"==\", \"$type\", \"Polygon\"], [\"==\", \"active\", \"true\"]],\n // layout: {\n // \"line-cap\": \"round\",\n // \"line-join\": \"round\",\n // },\n // paint: {\n // \"line-color\": \"#f7ad3b\",\n // \"line-dasharray\": [0.5, 2],\n // \"line-width\": 2,\n // },\n // },\n // {\n // id: \"gl-draw-polygon-stroke-inactive\",\n // type: \"line\",\n // filter: [\"all\", [\"==\", \"$type\", \"Polygon\"], [\"==\", \"active\", \"false\"]],\n // layout: {\n // \"line-cap\": \"round\",\n // \"line-join\": \"round\",\n // },\n // paint: {\n // \"line-color\": [\n // \"case\",\n // [\"has\", \"user_color\"],\n // [\"get\", \"user_color\"],\n // \"#f7ad3b\",\n // ],\n // \"line-width\": 2,\n // },\n // },\n {\n id: \"measure-label\",\n type: \"symbol\",\n filter: [\"all\", [\"==\", \"$type\", \"Point\"], [\"==\", \"user_type\", \"measure\"]],\n layout: {\n \"text-field\": [\"get\", \"user_value\"],\n \"text-anchor\": [\"get\", \"user_anchor\"],\n \"text-offset\": [\n \"match\",\n [\"get\", \"user_anchor\"],\n \"bottom\",\n [0, -0.5],\n [0, 0],\n ],\n \"text-size\": 12,\n \"text-allow-overlap\": true,\n \"text-ignore-placement\": true,\n },\n paint: {\n \"text-halo-color\": \"rgba(255,255,255,0.75)\",\n \"text-halo-width\": 2,\n \"text-halo-blur\": 1,\n \"text-color\": \"#000\",\n },\n },\n];\n","import { onCleanup, VoidComponent } from \"solid-js\";\nimport { useMapContext } from \"../MapProvider\";\nimport { drawEvents } from \"../../events\";\nimport type { drawEventTypes } from \"../../events\";\nimport MultiPointMode from \"./modes/multi_point\";\nimport LineStringeMode from \"./modes/line_string\";\nimport PointMode from \"./modes/point\";\nimport PolygonMode from \"./modes/polygon\";\nimport RadiusMode from \"./modes/radius\";\nimport RectangleMode from \"./modes/rectangle\";\nimport RectangleAssistedMode from \"./modes/rectangle_assisted\";\nimport styles from \"./drawingStyles\";\n// import {\n// draw_point,\n// draw_line_string,\n// draw_polygon,\n// // draw_circle,\n// draw_radius,\n// draw_rectangle,\n// } from \"./modes/index\";\n\ntype Props = {\n /** Draw Library */\n lib: any;\n /** Draw Options */\n options?: object;\n /** Draw Control Position */\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n /** Draw Control Instance */\n getInstance?: (object) => void;\n showLength?: boolean;\n showArea?: boolean;\n} & drawEventTypes;\n\nexport const Draw: VoidComponent<Props> = (props: Props) => {\n const [ctx] = useMapContext();\n\n // const modes = props.lib.modes;\n // modes.point = PointMode;\n // modes.multi_point = MultiPointMode;\n // modes.line_string = LineStringeMode;\n // modes.draw_polygon = PolygonMode;\n // modes.radius = RadiusMode;\n // modes.rectangle = RectangleMode;\n // modes.rectangle_assisted = RectangleAssistedMode;\n\n // Add Draw Control\n const draw = new props.lib({\n styles: [...props.lib.lib.theme, ...styles],\n modes: {\n ...props.lib.modes,\n // draw_point,\n // draw_line_string,\n // draw_polygon,\n // draw_radius,\n // draw_rectangle,\n },\n userProperties: {\n showLength: props.showLength || false,\n showArea: props.showArea || false,\n },\n ...props.options,\n });\n ctx.map.addControl(draw, props.position || \"top-right\");\n props.getInstance && props.getInstance(draw);\n\n // Hook up events\n const eventList: Record<string, (evt: any) => void> = {};\n drawEvents.forEach((item) => {\n if (props[item]) {\n const event = `draw.${item.slice(2).toLowerCase()}`;\n const fn = (evt) => props[item](evt);\n eventList[event] = fn;\n ctx.map.on(event, fn);\n }\n });\n\n // Remove Draw Control\n onCleanup(() => {\n // Remove Events\n Object.keys(eventList).forEach((event) =>\n ctx.map.off(event, eventList[event]),\n );\n // Remove Control\n ctx.map?.removeControl(draw);\n });\n\n return null;\n};\n"],"names":["state","setState","createStore","map","MapContext","createContext","useMapContext","useContext","MapProvider","props","_$createComponent","Provider","value","children","mapEvents","layerEvents","drawEvents","mapBase","gitBase","gishub","hereBase","vectorStyleList","mb","standard","light","dark","street","outdoor","sat","sat_street","nav_base","nav_base_night","nav","nav_night","basic","monochrome","leshine","icecream","cali","northstar","mineral","moonlight","frank","minimo","decimal","stand","blueprint","bubble","pencil","swiss_ski","vintage","whaam","neon","camoflauge","emerald","runner","x_ray","here","base","day","night","esri","charted_territory","colored_pencil","community","mid_century","modern_antique","nat_geo","newspaper","open_street_map","light_gray_canvas","dark_gray_canvas","human_geo_light","human_geo_dark","world_navigation","world_street","world_street_night","world_terrain","world_terrain_hybrid","world_topographic","chromium","dreamcatcher","seahaven","sangria","mercurial","imagery","imagery_hybrid","firefly","firefly_hybrid","oceans","carto","stamen","tf","rasterStyleList","osm","org","human","cycle","topo","_copy","voyager","positron","toner","toner_lite","watercolor","terrain","trans","trans_dark","landscape","outdoors","neighbourhood","spinal","pioneer","atlas","mobile","MapGL","mapRef","resizeObserver","mutationObserver","mapLoaded","setMapLoaded","createSignal","darkMode","setDarkMode","window","matchMedia","matches","document","body","classList","contains","internal","setInternal","debug","text","debugEvents","console","getStyle","style","String","split","reduce","p","c","replace","apikey","env","VITE_VECTOR_API_KEY","onMount","async","mapLib","import","Map","supported","Error","version","accessToken","options","VITE_MAPBOX_ACCESS_TOKEN","interactive","onViewportChange","viewport","projection","container","darkStyle","fitBoundsOptions","padding","sourceIdList","layerIdList","MapLib","forEach","item","prop","event","slice","toLowerCase","on","evt","setTimeout","clickOnLayer","Object","keys","layerId","once","rotate","onUserInteraction","darkTheme","addEventListener","toString","MutationObserver","observe","attributes","disableResize","ResizeObserver","resize","createEffect","key","config","id","setConfigProperty","point","x","originalEvent","y","center","lat","getCenter","lng","zoom","getZoom","pitch","getPitch","bearing","getBearing","inTransit","bounds","vp","cameraForBounds","stop","transitionType","defer","proj","setProjection","cur","cursorStyle","getCanvas","cursor","prev","isStyleLoaded","oldStyle","oldLayers","layers","filter","l","includes","oldSources","sources","s","obj","setStyle","newStyle","insertLayers","list","layer","index","findIndex","i","metadata","smg","beforeType","type","beforeId","fog","onCleanup","disconnect","remove","_el$","_tmpl$","_$use","_$insert","_c$","_$memo","_tmpl$2","_el$3","_tmpl$3","_$effect","_p$","_v$","_v$2","class","_v$3","_v$4","position","inset","e","_$setAttribute","t","_$className","a","_$classList","o","_$style","undefined","SourceContext","useSourceId","Source","ctx","createUniqueId","lookup","url","source","tiles","VITE_RASTER_API_KEY","devicePixelRatio","attribution","addSource","push","getSource","data","isSourceLoaded","setData","coords","coordinates","updateImage","setUrl","setTiles","src","removeLayer","removeSource","baseStyle","layoutStyles","diff","newProps","prevProps","Set","acc","newKey","startsWith","updateStyle","layout","paint","entries","nk","Layer","sourceId","customLayer","addLayer","slot","find","fire","debugEvent","setLayoutProperty","validate","setPaintProperty","minzoom","maxzoom","setLayerZoomRange","setFilter","visible","featureState","removeFeatureState","sourceLayer","setFeatureState","getLayer","LayerContext","useScene","Layer3D","scene","setScene","worldOriginMercator","MercatorCoordinate","fromLngLat","origin","worldScale","meterInMercatorCoordinateUnits","z","worldMatrix","BABYLON","THREE","babylon","Matrix","Compose","Vector3","Quaternion","FromEulerAngles","Math","PI","translateX","translateY","translateZ","rotateX","rotateY","rotateZ","scale","renderingMode","onAdd","gl","engine","Engine","useHighPrecisionMatrix","this","Scene","autoClear","preventDefaultOnPointerDown","preventDefaultOnPointerUp","camera","UniversalCamera","Zero","mode","Camera","ORTHOGRAPHIC_CAMERA","inertia","ambientColor","Color3","defaultLight","HemisphericLight","DirectionalLight","set","normalize","add","renderer","WebGLRenderer","canvas","context","antialias","render","matrix","activeCamera","freezeProjectionMatrix","multiply","FromArray","rotationX","Matrix4","makeRotationAxis","rotationY","rotationZ","m","fromArray","makeTranslation","projectionMatrix","resetState","onRender","triggerRepaint","Atmosphere","setFog","getFog","Terrain","isMapLibre","tileSize","setTerrain","exaggeration","Control","update","create","splitProps","control","setControl","controlClasses","NavigationControl","ScaleControl","AttributionControl","GeolocateControl","FullscreenControl","LogoControl","TerrainControl","untrack","hasControl","removeControl","custom","get","addControl","Marker","lngLat","create_popup","create_marker","marker","popup","LNGLAT","Popup","closeOnClick","focusAfterOpen","onOpen","onClose","setHTML","setDOMContent","setPopup","showPopup","isOpen","togglePopup","onDragStart","onDragEnd","onDrag","getLngLat","toArray","setLngLat","addTo","setDraggable","draggable","trackPointer","PATTERN","diagonal_l","size","path","diagonal_r","horizontal","vertical","cross","hash","chevron_h","chevron_v","square","fill","hex","circle","patternList","MGL_Image","setSize","width","height","hasImage","removeImage","pattern","ops","pixelRatio","_loadImage","_createPattern","addImage","image","callback","trimStart","DOMParser","parseFromString","childNodes","SVGElement","setAttribute","stroke","XMLSerializer","serializeToString","loadImage","error","imageData","trimEnd","endsWith","fetch","transform","img","Image","crossOrigin","onload","createElement","max","getContext","imageSmoothingEnabled","drawImage","getImageData","Uint8Array","willReadFrequently","fillStyle","background","fillRect","strokeStyle","color","lineWidth","lineWith","Path2D","easeQuad","in","out","inOut","pow","animationTime","isReverse","userInteraction","setUserInteraction","frame","translate","requestAnimationFrame","params","start","end","easing","alt","target","getFreeCameraOptions","lookAtPoint","setFreeCameraOptions","updateCameraPosition","lerp","b","_","idx","slerp","dotProduct","n","theta","acos","sin","loop","duration","rotateGlobe","secPerRev","maxSpinZoom","slowSpinZoom","distancePerSecond","reverse","easeTo","rotateViewport","around","onEnd","originalCenter","resetWhenStopped","resetNorthPitch","off","Light","setLight","styles","Draw","draw","lib","theme","modes","userProperties","showLength","showArea","getInstance","eventList","fn"],"mappings":"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"}