winga-chart-plotter-signalk 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -4461,7 +4461,7 @@ void main(void) {
|
|
|
4461
4461
|
fragColor = vColor;
|
|
4462
4462
|
DECKGL_FILTER_COLOR(fragColor, geometry);
|
|
4463
4463
|
}
|
|
4464
|
-
`,OL=[0,1,0,1,.333,0,1,-.75,0,0,1,0,1,-.75,0,0,-.5,0,0,1,0,0,-.5,0,-1,-.75,0,0,1,0,-1,-.75,0,-1,.333,0],kL=new Float32Array([...OL,...OL]),AL=24,jL=new Float32Array([1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0]),ML={getPosition:{type:`accessor`,value:[0,0]},getSog:{type:`accessor`,value:0},getCog:{type:`accessor`,value:0},getHeading:{type:`accessor`,value:0},getRot:{type:`accessor`,value:0},getAgeAtUpload:{type:`accessor`,value:0},getLength:{type:`accessor`,value:0},getColor:{type:`accessor`,value:[255,255,255,255]},uploadTimestamp:0,selfAnimate:!1,settingsIconSize:1,opacity:1},NL=class extends SP{static layerName=`AisIconLayer`;static defaultProps=ML;getShaders(){return super.getShaders({vs:EL,fs:DL,modules:[uw,nT,TL]})}initializeState(){this.getAttributeManager().addInstanced({instancePositions:{size:3,type:`float64`,fp64:this.use64bitPositions(),transition:!0,accessor:`getPosition`,defaultValue:[0,0,0]},instanceSog:{size:1,accessor:`getSog`,defaultValue:0},instanceCog:{size:1,accessor:`getCog`,defaultValue:0},instanceHeading:{size:1,accessor:`getHeading`,defaultValue:0},instanceRot:{size:1,accessor:`getRot`,defaultValue:0},instanceAgeAtUpload:{size:1,accessor:`getAgeAtUpload`,defaultValue:0},instanceLength:{size:1,accessor:`getLength`,defaultValue:0},instanceColor:{size:4,type:`unorm8`,accessor:`getColor`,defaultValue:[255,255,255,255]}})}updateState(e){super.updateState(e),e.changeFlags.extensionsChanged&&(this.state.model?.destroy(),this.state.model=this._getModel(),this.getAttributeManager().invalidateAll()),e.changeFlags.propsChanged&&this.setNeedsRedraw()}draw({uniforms:e}){let{uploadTimestamp:t,selfAnimate:n,settingsIconSize:r,opacity:i}=this.props,a=n?Math.max(0,(Date.now()-(t??0))/1e3):0,o=this.context.viewport.zoom,s=this.state.model;s.shaderInputs.setProps({aisIcon:{timeSinceUpload:a,zoom:o,settingsIconSize:r??1,opacity:i??1}}),s.draw(this.context.renderPass),n&&this.setNeedsRedraw()}_getModel(){return new lD(this.context.device,{...this.getShaders(),id:this.props.id,bufferLayout:this.getAttributeManager().getBufferLayouts(),geometry:new fD({topology:`triangle-list`,attributes:{positions:{size:3,value:kL},aIsOutline:{size:1,value:jL}},vertexCount:AL}),isInstanced:!0})}};function PL(e,t,n,r,i,a,o){let s=(o-a)/1e3;if(s===0||r<.01)return[e,t];let c,l;if(Math.abs(i)>1e-4){let e=n+i*s,t=r/i;c=t*(Math.cos(n)-Math.cos(e)),l=t*(Math.sin(e)-Math.sin(n))}else c=r*s*Math.sin(n),l=r*s*Math.cos(n);let u=111320*Math.cos(t*Math.PI/180);return[e+c/u,t+l/111320]}function FL(e,t,n){let r=t/2,i=t/2,a=t/32;e.beginPath(),e.moveTo(r,i-12*a),e.lineTo(r+8*a,i-4*a),e.lineTo(r+8*a,i+9*a),e.lineTo(r,i+6*a),e.lineTo(r-8*a,i+9*a),e.lineTo(r-8*a,i-4*a),e.closePath(),e.fillStyle=n,e.fill(),e.strokeStyle=`#ffffff`,e.lineWidth=1.5*a,e.lineJoin=`round`,e.stroke()}function IL(e,t){let n=document.createElement(`canvas`);n.width=e,n.height=e;let r=n.getContext(`2d`);if(!r)throw Error(`Could not get 2D canvas context`);return FL(r,e,t),n}function LL(e,t){return IL(e,t).getContext(`2d`).getImageData(0,0,e,e)}var RL=Vr(`<div style="width: 100%; height: 100%;"></div> <div class="projection-picker svelte-c20cna"><button class="proj-btn svelte-c20cna"><!></button> <button class="proj-btn svelte-c20cna"><!></button></div>`,1);function zL(e,t){Ze(t,!0);let n=()=>ft(su,`$vesselState`,r),[r,i]=pt(),a,o,s=nn(!!document.fullscreenElement),c=()=>{};function l(){document.fullscreenElement?document.exitFullscreen().catch(()=>{}):document.documentElement.requestFullscreen().catch(()=>{})}function u(){if(hu.following){hu.following=!1;return}hu.following=!0}let d=nn(!1),f=nn(10),p=nn(0),m=nn(`mercator`),h=null,g=!1,_=null,v=null,y=0,b=null,x=null;function S(e){if(e!==`globe`&&G(m)===`globe`){let e=o?.style?.projection?._verticalPerspectiveProjection;e&&(h=e._errorCorrectionUsable)}if(V(m,e,!0),o?.setProjection({type:e}),e===`globe`&&h!==null){let e=o?.style?.projection?._verticalPerspectiveProjection;e&&(e._errorCorrectionUsable=h,e._errorCorrectionPreviousValue=h,e._errorMeasurementLastValue=-h),g=!0,requestAnimationFrame(()=>{if(!g)return;g=!1;let e=o?.style?.projection?._verticalPerspectiveProjection;e?._errorMeasurement&&h!==null&&(e._errorMeasurement._measuredError=-h,e._errorMeasurementLastValue=-h,e._errorMeasurementLastChangeTime=performance.now()-1e4)})}else g=!1}let C=`vessel`,w=`vessel-cog`,T=`vessel-hdg`,E=`vessel-gc`,D=`ais-targets`,O={type:`FeatureCollection`,features:[]},k=new Map;function A(e,t){let n=Math.max(1,t);switch(e){case`dashed`:return[5,3];case`dotted`:return[n/n,3];case`dash-dot`:return[5,3,1,3];default:return[1,0]}}function j(e,t,n,r){let i=r/6371e3,a=t*Math.PI/180,o=a+i*Math.cos(n),s=Math.log(Math.tan(o/2+Math.PI/4)/Math.tan(a/2+Math.PI/4)),c=Math.abs(s)>1e-10?(o-a)/s:Math.cos(a);return[(e*Math.PI/180+i*Math.sin(n)/c)*180/Math.PI,o*180/Math.PI]}function M(e,t,n,r){let i=t*Math.PI/180,a=Math.cos(n);if(Math.abs(a)>1e-10){let e=((a>0?85*Math.PI/180:-(85*Math.PI)/180)-i)/a*6371e3;e>0&&e<r&&(r=e)}let o=[],s=e*Math.PI/180;for(let i=0;i<=256;i++){let[a,c]=j(e,t,n,i/256*r),l=a*Math.PI/180-s,u=s+l-Math.round(l/(2*Math.PI))*2*Math.PI;s=u,o.push([u*180/Math.PI,c])}return o}function ee(e,t,n,r){let i=t*Math.PI/180,a=e*Math.PI/180,o=[],s=a;for(let e=0;e<=256;e++){let t=e/256*r/6371e3,c=Math.asin(Math.sin(i)*Math.cos(t)+Math.cos(i)*Math.sin(t)*Math.cos(n)),l=a+Math.atan2(Math.sin(n)*Math.sin(t)*Math.cos(i),Math.cos(t)-Math.sin(i)*Math.sin(c))-s,u=s+l-Math.round(l/(2*Math.PI))*2*Math.PI;s=u,o.push([u*180/Math.PI,c*180/Math.PI])}return o}function te(e,t=255){let n=e.replace(`#`,``),r=parseInt(n.slice(0,2),16),i=parseInt(n.slice(2,4),16),a=parseInt(n.slice(4,6),16);return[isNaN(r)?0:r,isNaN(i)?0:i,isNaN(a)?0:a,t]}function ne(e,t){let n=Math.max(1,t);switch(e){case`dashed`:return[6*n,3*n];case`dotted`:return[n,2*n];case`dash-dot`:return[6*n,2*n];default:return[0,0]}}function re(){if(!o)return;let e=a.clientWidth,t=a.clientHeight,n=e/2,r=t*.75,i=e/8,s=o.unproject([n-i,r]),c=o.unproject([n+i,r]);hL.add(s.lng,s.lat,c.lng,c.lat)}let ie=null,ae=!1;function oe(e){e!==ae&&(ae=e,a.style.cursor=e?`grab`:``,e?o?.dragPan.disable():ie||o?.dragPan.enable())}function se(e){if(!fe||!o)return;let t=a.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=fe.pickObject({x:n,y:r,radius:12,layerIds:[`ruler-delete`]});if(i?.object){let t=i.object;hL.remove(t.rulerId),e.stopPropagation();return}let s=fe.pickObject({x:n,y:r,radius:10,layerIds:[`ruler-handles`]});if(!s?.object)return;let c=s.object;ie={rulerId:c.rulerId,endpoint:c.endpoint},o.dragPan.disable(),a.style.cursor=`grabbing`,a.setPointerCapture(e.pointerId),e.stopPropagation()}function ce(e){if(!o)return;let t=a.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;if(!ie){fe&&oe(!!fe.pickObject({x:n,y:r,radius:10,layerIds:[`ruler-handles`]})?.object);return}let i=o.unproject([n,r]);hL.moveEndpoint(ie.rulerId,ie.endpoint,i.lng,i.lat),e.stopPropagation()}function le(e){if(!ie||!o)return;let t=a.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=o.unproject([n,r]),s,c=i.lng,l=i.lat;for(let e of de){let t=o.project([e.position.longitude,e.position.latitude]);if(Math.hypot(t.x-n,t.y-r)<ue){s=e.id,c=e.position.longitude,l=e.position.latitude;break}}hL.snapEndpoint(ie.rulerId,ie.endpoint,s,c,l),ie=null,a.style.cursor=ae?`grab`:``,ae||o.dragPan.enable(),a.releasePointerCapture(e.pointerId)}let ue=24,de=[],fe=null,pe=null,me=[],he=0,ge=[],_e=[];function ve(){fe?.setProps({layers:[...ge,..._e]})}let ye=0;Qr(()=>{o=new ou.default.Map({container:a,style:{version:8,projection:{type:`mercator`},sources:{"osm-tiles":{type:`raster`,tiles:[`https://tile.openstreetmap.org/{z}/{x}/{y}.png`],tileSize:256,attribution:`© OpenStreetMap contributors`},openseamap:{type:`raster`,tiles:[`https://tiles.openseamap.org/seamark/{z}/{x}/{y}.png`],tileSize:256}},layers:[{id:`osm`,type:`raster`,source:`osm-tiles`},{id:`seamarks`,type:`raster`,source:`openseamap`}]},center:[10.75,59.91],zoom:10}),o.addControl(new ou.default.NavigationControl,`top-right`),o.addControl(new ou.default.ScaleControl,`bottom-left`),fe=new rF({layers:[],interleaved:!1,parameters:{depthCompare:`always`,cullMode:`none`}}),o.addControl(fe),ve();function e(){if(fe!==null){let e=Date.now(),t=lt(su).position;{let n=e,r=[];if(pe&&me.length>0){let e=pe,t=me,i=t.length;for(let a=0;a<i;a++){let i=e[a*7+0],o=e[a*7+1];r.push({id:t[a],position:{longitude:i,latitude:o}});let s=e[a*7+2],c=e[a*7+3];if(!isNaN(s)&&!isNaN(c)&&c>.1){let l=e[a*7+5],u=he-e[a*7+6]*1e3,[d,f]=PL(i,o,s,c,isNaN(l)?0:l,u,n);r.push({id:t[a]+`:ghost`,position:{longitude:d,latitude:f}})}}}t&&r.push({id:`own-vessel`,position:{longitude:t.longitude,latitude:t.latitude}}),de=r,hL.syncSnapped(de)}let n=hL.rulers;if(n.length>0){let e=Q.appearance.ruler.color,t=Q.appearance.ruler.width;function r(e,t){let n=parseInt(e.replace(`#`,``),16);return[n>>16&255,n>>8&255,n&255,Math.round(t*255)]}let i=r(e,.87),a=r(e,.9),s=n.flatMap(e=>{if(o){let t=o.project([e.a.lon,e.a.lat]),n=o.project([e.b.lon,e.b.lat]);if(Math.hypot(n.x-t.x,n.y-t.y)<100)return[]}let t=uL(e.a.lon,e.a.lat,e.b.lon,e.b.lat),n=t[Math.floor(t.length/2)];return[{ruler:e,lon:n[0],lat:n[1]}]}),c=n.flatMap(e=>[{rulerId:e.id,endpoint:`a`,lon:e.a.lon,lat:e.a.lat,snapId:e.a.snapId},{rulerId:e.id,endpoint:`b`,lon:e.b.lon,lat:e.b.lat,snapId:e.b.snapId}]),l=n.flatMap(e=>{if(o){let t=o.project([e.a.lon,e.a.lat]),n=o.project([e.b.lon,e.b.lat]);if(Math.hypot(n.x-t.x,n.y-t.y)<100)return[]}return[{rulerId:e.id,endpoint:`b`,lon:e.b.lon,lat:e.b.lat}]});_e=[new iI({id:`ruler-line`,data:n.map(e=>({ruler:e})),getPath:e=>uL(e.ruler.a.lon,e.ruler.a.lat,e.ruler.b.lon,e.ruler.b.lat),getColor:()=>i,getWidth:t,widthUnits:`pixels`,widthMinPixels:1,pickable:!1,updateTriggers:{getPath:[n]}}),new NF({id:`ruler-handles`,data:c,getPosition:e=>[e.lon,e.lat,0],getRadius:7,radiusUnits:`pixels`,getFillColor:e=>e.snapId?[255,100,50,230]:a,getLineColor:[255,255,255,180],lineWidthUnits:`pixels`,getLineWidth:1.5,stroked:!0,pickable:!0,updateTriggers:{getPosition:[n],getFillColor:[n,e]}}),new tL({id:`ruler-labels`,data:s,getText:e=>`${dL(e.ruler)} · ${fL(e.ruler)}`,getPosition:e=>[e.lon,e.lat,0],getSize:13,getColor:[255,240,180,230],getBackgroundColor:[0,0,0,160],background:!0,backgroundPadding:[4,2,4,2],getTextAnchor:`middle`,getAlignmentBaseline:`center`,fontFamily:`monospace`,pickable:!1,updateTriggers:{getText:[n],getPosition:[n]}}),new tL({id:`ruler-delete`,data:l,getText:()=>`✕`,getPosition:e=>[e.lon,e.lat,0],getPixelOffset:[14,-14],getSize:11,getColor:[255,100,100,220],getBackgroundColor:[30,10,10,180],background:!0,backgroundPadding:[3,1,3,1],getTextAnchor:`middle`,getAlignmentBaseline:`center`,pickable:!0,updateTriggers:{getPosition:[n]}})],ve()}else _e.length>0&&(_e=[],ve())}ye=requestAnimationFrame(e)}ye=requestAnimationFrame(e),a.addEventListener(`pointerdown`,se,{capture:!0}),a.addEventListener(`pointermove`,ce,{capture:!0}),a.addEventListener(`pointerup`,le,{capture:!0}),a.addEventListener(`pointercancel`,le,{capture:!0}),c=()=>{V(s,!!document.fullscreenElement)},document.addEventListener(`fullscreenchange`,c),o.on(`zoom`,()=>{V(f,o?.getZoom()??G(f),!0)}),o.on(`rotate`,()=>{V(p,o?.getBearing()??G(p),!0)}),o.on(`dragstart`,()=>{ie||(hu.following=!1)}),o.on(`click`,e=>{if(!fe)return;let{x:t,y:n}=e.point,r=fe.pickObject({x:t,y:n,radius:5,layerIds:[`ais-confirmed-icon`,`ais-hull-ghost`,`ais-hull-confirmed`,`ais-ghost-icon`]});if(r===null)return;let i=r.object;if(i==null)return;let a=Ju.getTarget(i);!a?.position||!r.coordinate||xe({...r,object:a})}),o.on(`style.load`,()=>{let e=o;if(!e)return;let t=Q.appearance;e.addImage(`vessel-icon`,{width:64,height:64,data:LL(64,t.vesselColor).data}),e.addSource(C,{type:`geojson`,data:O}),e.addSource(w,{type:`geojson`,data:O}),e.addSource(T,{type:`geojson`,data:O}),e.addSource(E,{type:`geojson`,data:O}),e.addSource(D,{type:`geojson`,data:O}),e.addLayer({id:`vessel-gc-line`,type:`line`,source:E,paint:{"line-color":t.gc.color,"line-width":t.gc.width,"line-dasharray":A(t.gc.style,t.gc.width)}}),e.addLayer({id:`ais-label`,type:`symbol`,source:D,layout:{"text-field":[`get`,`label`],"text-size":10,"text-anchor":`top`,"text-offset":[0,.8],"text-optional":!0},paint:{"text-color":Q.appearance.ais.vesselColor,"text-halo-color":`#000`,"text-halo-width":1}}),e.addLayer({id:`vessel-cog-line`,type:`line`,source:w,paint:{"line-color":t.cog.color,"line-width":t.cog.width,"line-dasharray":A(t.cog.style,t.cog.width)}}),e.addLayer({id:`vessel-hdg-line`,type:`line`,source:T,paint:{"line-color":t.heading.color,"line-width":t.heading.width}}),e.addLayer({id:`vessel-icon`,type:`symbol`,source:C,layout:{"icon-image":`vessel-icon`,"icon-size":t.vesselSize/64,"icon-rotate":[`get`,`bearing_deg`],"icon-rotation-alignment":`map`,"icon-allow-overlap":!0,"icon-ignore-placement":!0}}),V(f,o.getZoom(),!0),V(p,o.getBearing(),!0),V(d,!0)}),o.on(`webglcontextlost`,()=>{console.warn(`[map] WebGL context lost`),V(d,!1),k.clear()}),o.on(`webglcontextrestored`,()=>{console.info(`[map] WebGL context restored`)}),o.on(`error`,e=>{console.error(`[map] error`,e.error??e)})}),$r(()=>{cancelAnimationFrame(ye),fe?.finalize(),document.removeEventListener(`fullscreenchange`,c),a.removeEventListener(`pointerdown`,se,{capture:!0}),a.removeEventListener(`pointermove`,ce,{capture:!0}),a.removeEventListener(`pointerup`,le,{capture:!0}),a.removeEventListener(`pointercancel`,le,{capture:!0}),o?.remove()});function be(e){let t=(e,t,n=``)=>`<tr><td>${e}</td><td><b>${t===null?`<span style="opacity:0.4">—</span>`:`${String(t)}${n}`}</b></td></tr>`,n=e.rot===void 0?null:e.rot*180/Math.PI*60,r=n===null?null:`${n>0?`▶ `:n<0?`◀ `:``}${Math.abs(n).toFixed(1)}°/min`,i=e.mmsi?`<div class="ais-links">
|
|
4464
|
+
`,OL=[0,1,0,1,.333,0,1,-.75,0,0,1,0,1,-.75,0,0,-.5,0,0,1,0,0,-.5,0,-1,-.75,0,0,1,0,-1,-.75,0,-1,.333,0],kL=new Float32Array([...OL,...OL]),AL=24,jL=new Float32Array([1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0]),ML={getPosition:{type:`accessor`,value:[0,0]},getSog:{type:`accessor`,value:0},getCog:{type:`accessor`,value:0},getHeading:{type:`accessor`,value:0},getRot:{type:`accessor`,value:0},getAgeAtUpload:{type:`accessor`,value:0},getLength:{type:`accessor`,value:0},getColor:{type:`accessor`,value:[255,255,255,255]},uploadTimestamp:0,selfAnimate:!1,settingsIconSize:1,opacity:1},NL=class extends SP{static layerName=`AisIconLayer`;static defaultProps=ML;getShaders(){return super.getShaders({vs:EL,fs:DL,modules:[uw,nT,TL]})}initializeState(){this.getAttributeManager().addInstanced({instancePositions:{size:3,type:`float64`,fp64:this.use64bitPositions(),transition:!0,accessor:`getPosition`,defaultValue:[0,0,0]},instanceSog:{size:1,accessor:`getSog`,defaultValue:0},instanceCog:{size:1,accessor:`getCog`,defaultValue:0},instanceHeading:{size:1,accessor:`getHeading`,defaultValue:0},instanceRot:{size:1,accessor:`getRot`,defaultValue:0},instanceAgeAtUpload:{size:1,accessor:`getAgeAtUpload`,defaultValue:0},instanceLength:{size:1,accessor:`getLength`,defaultValue:0},instanceColor:{size:4,type:`unorm8`,accessor:`getColor`,defaultValue:[255,255,255,255]}})}updateState(e){super.updateState(e),e.changeFlags.extensionsChanged&&(this.state.model?.destroy(),this.state.model=this._getModel(),this.getAttributeManager().invalidateAll()),e.changeFlags.propsChanged&&this.setNeedsRedraw()}draw({uniforms:e}){let{uploadTimestamp:t,selfAnimate:n,settingsIconSize:r,opacity:i}=this.props,a=n?Math.max(0,(Date.now()-(t??0))/1e3):0,o=this.context.viewport.zoom,s=this.state.model;s.shaderInputs.setProps({aisIcon:{timeSinceUpload:a,zoom:o,settingsIconSize:r??1,opacity:i??1}}),s.draw(this.context.renderPass),n&&this.setNeedsRedraw()}_getModel(){return new lD(this.context.device,{...this.getShaders(),id:this.props.id,bufferLayout:this.getAttributeManager().getBufferLayouts(),geometry:new fD({topology:`triangle-list`,attributes:{positions:{size:3,value:kL},aIsOutline:{size:1,value:jL}},vertexCount:AL}),isInstanced:!0})}};function PL(e,t,n,r,i,a,o){let s=(o-a)/1e3;if(s===0||r<.01)return[e,t];let c,l;if(Math.abs(i)>1e-4){let e=n+i*s,t=r/i;c=t*(Math.cos(n)-Math.cos(e)),l=t*(Math.sin(e)-Math.sin(n))}else c=r*s*Math.sin(n),l=r*s*Math.cos(n);let u=111320*Math.cos(t*Math.PI/180);return[e+c/u,t+l/111320]}function FL(e,t,n){let r=t/2,i=t/2,a=t/32;e.beginPath(),e.moveTo(r,i-12*a),e.lineTo(r+8*a,i-4*a),e.lineTo(r+8*a,i+9*a),e.lineTo(r,i+6*a),e.lineTo(r-8*a,i+9*a),e.lineTo(r-8*a,i-4*a),e.closePath(),e.fillStyle=n,e.fill(),e.strokeStyle=`#ffffff`,e.lineWidth=1.5*a,e.lineJoin=`round`,e.stroke()}function IL(e,t){let n=document.createElement(`canvas`);n.width=e,n.height=e;let r=n.getContext(`2d`);if(!r)throw Error(`Could not get 2D canvas context`);return FL(r,e,t),n}function LL(e,t){return IL(e,t).getContext(`2d`).getImageData(0,0,e,e)}var RL=Vr(`<div style="width: 100%; height: 100%;"></div> <div class="projection-picker svelte-c20cna"><button class="proj-btn svelte-c20cna"><!></button> <button class="proj-btn svelte-c20cna"><!></button></div>`,1);function zL(e,t){Ze(t,!0);let n=()=>ft(su,`$vesselState`,r),[r,i]=pt(),a,o,s=nn(!!document.fullscreenElement),c=()=>{};function l(){document.fullscreenElement?document.exitFullscreen().catch(()=>{}):document.documentElement.requestFullscreen().catch(()=>{})}function u(){if(hu.following){hu.following=!1;return}hu.following=!0}let d=nn(!1),f=nn(10),p=nn(0),m=nn(`mercator`),h=null,g=!1,_=null,v=null,y=0,b=null,x=null;function S(e){if(e!==`globe`&&G(m)===`globe`){let e=o?.style?.projection?._verticalPerspectiveProjection;e&&(h=e._errorCorrectionUsable)}if(V(m,e,!0),o?.setProjection({type:e}),e===`globe`&&h!==null){let e=o?.style?.projection?._verticalPerspectiveProjection;e&&(e._errorCorrectionUsable=h,e._errorCorrectionPreviousValue=h,e._errorMeasurementLastValue=-h),g=!0,requestAnimationFrame(()=>{if(!g)return;g=!1;let e=o?.style?.projection?._verticalPerspectiveProjection;e?._errorMeasurement&&h!==null&&(e._errorMeasurement._measuredError=-h,e._errorMeasurementLastValue=-h,e._errorMeasurementLastChangeTime=performance.now()-1e4)})}else g=!1}let C=`vessel`,w=`vessel-cog`,T=`vessel-hdg`,E=`vessel-gc`,D=`ais-targets`,O={type:`FeatureCollection`,features:[]},k=new Map;function A(e,t){let n=Math.max(1,t);switch(e){case`dashed`:return[5,3];case`dotted`:return[n,3];case`dash-dot`:return[5,3,1,3];default:return null}}function j(e,t,n,r){let i=r/6371e3,a=t*Math.PI/180,o=a+i*Math.cos(n),s=Math.log(Math.tan(o/2+Math.PI/4)/Math.tan(a/2+Math.PI/4)),c=Math.abs(s)>1e-10?(o-a)/s:Math.cos(a);return[(e*Math.PI/180+i*Math.sin(n)/c)*180/Math.PI,o*180/Math.PI]}function M(e,t,n,r){let i=t*Math.PI/180,a=Math.cos(n);if(Math.abs(a)>1e-10){let e=((a>0?85*Math.PI/180:-(85*Math.PI)/180)-i)/a*6371e3;e>0&&e<r&&(r=e)}let o=[],s=e*Math.PI/180;for(let i=0;i<=256;i++){let[a,c]=j(e,t,n,i/256*r),l=a*Math.PI/180-s,u=s+l-Math.round(l/(2*Math.PI))*2*Math.PI;s=u,o.push([u*180/Math.PI,c])}return o}function ee(e,t,n,r){let i=t*Math.PI/180,a=e*Math.PI/180,o=[],s=a;for(let e=0;e<=256;e++){let t=e/256*r/6371e3,c=Math.asin(Math.sin(i)*Math.cos(t)+Math.cos(i)*Math.sin(t)*Math.cos(n)),l=a+Math.atan2(Math.sin(n)*Math.sin(t)*Math.cos(i),Math.cos(t)-Math.sin(i)*Math.sin(c))-s,u=s+l-Math.round(l/(2*Math.PI))*2*Math.PI;s=u,o.push([u*180/Math.PI,c*180/Math.PI])}return o}function te(e,t=255){let n=e.replace(`#`,``),r=parseInt(n.slice(0,2),16),i=parseInt(n.slice(2,4),16),a=parseInt(n.slice(4,6),16);return[isNaN(r)?0:r,isNaN(i)?0:i,isNaN(a)?0:a,t]}function ne(e,t){let n=Math.max(1,t);switch(e){case`dashed`:return[6*n,3*n];case`dotted`:return[n,2*n];case`dash-dot`:return[6*n,2*n];default:return[0,0]}}function re(){if(!o)return;let e=a.clientWidth,t=a.clientHeight,n=e/2,r=t*.75,i=e/8,s=o.unproject([n-i,r]),c=o.unproject([n+i,r]);hL.add(s.lng,s.lat,c.lng,c.lat)}let ie=null,ae=!1;function oe(e){e!==ae&&(ae=e,a.style.cursor=e?`grab`:``,e?o?.dragPan.disable():ie||o?.dragPan.enable())}function se(e){if(!fe||!o)return;let t=a.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=fe.pickObject({x:n,y:r,radius:12,layerIds:[`ruler-delete`]});if(i?.object){let t=i.object;hL.remove(t.rulerId),e.stopPropagation();return}let s=fe.pickObject({x:n,y:r,radius:10,layerIds:[`ruler-handles`]});if(!s?.object)return;let c=s.object;ie={rulerId:c.rulerId,endpoint:c.endpoint},o.dragPan.disable(),a.style.cursor=`grabbing`,a.setPointerCapture(e.pointerId),e.stopPropagation()}function ce(e){if(!o)return;let t=a.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;if(!ie){fe&&oe(!!fe.pickObject({x:n,y:r,radius:10,layerIds:[`ruler-handles`]})?.object);return}let i=o.unproject([n,r]);hL.moveEndpoint(ie.rulerId,ie.endpoint,i.lng,i.lat),e.stopPropagation()}function le(e){if(!ie||!o)return;let t=a.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=o.unproject([n,r]),s,c=i.lng,l=i.lat;for(let e of de){let t=o.project([e.position.longitude,e.position.latitude]);if(Math.hypot(t.x-n,t.y-r)<ue){s=e.id,c=e.position.longitude,l=e.position.latitude;break}}hL.snapEndpoint(ie.rulerId,ie.endpoint,s,c,l),ie=null,a.style.cursor=ae?`grab`:``,ae||o.dragPan.enable(),a.releasePointerCapture(e.pointerId)}let ue=24,de=[],fe=null,pe=null,me=[],he=0,ge=[],_e=[];function ve(){fe?.setProps({layers:[...ge,..._e]})}let ye=0;Qr(()=>{o=new ou.default.Map({container:a,style:{version:8,projection:{type:`mercator`},sources:{"osm-tiles":{type:`raster`,tiles:[`https://tile.openstreetmap.org/{z}/{x}/{y}.png`],tileSize:256,attribution:`© OpenStreetMap contributors`},openseamap:{type:`raster`,tiles:[`https://tiles.openseamap.org/seamark/{z}/{x}/{y}.png`],tileSize:256}},layers:[{id:`osm`,type:`raster`,source:`osm-tiles`},{id:`seamarks`,type:`raster`,source:`openseamap`}]},center:[10.75,59.91],zoom:10}),o.addControl(new ou.default.NavigationControl,`top-right`),o.addControl(new ou.default.ScaleControl,`bottom-left`),fe=new rF({layers:[],interleaved:!1,parameters:{depthCompare:`always`,cullMode:`none`}}),o.addControl(fe),ve();function e(){if(fe!==null){let e=Date.now(),t=lt(su).position;{let n=e,r=[];if(pe&&me.length>0){let e=pe,t=me,i=t.length;for(let a=0;a<i;a++){let i=e[a*7+0],o=e[a*7+1];r.push({id:t[a],position:{longitude:i,latitude:o}});let s=e[a*7+2],c=e[a*7+3];if(!isNaN(s)&&!isNaN(c)&&c>.1){let l=e[a*7+5],u=he-e[a*7+6]*1e3,[d,f]=PL(i,o,s,c,isNaN(l)?0:l,u,n);r.push({id:t[a]+`:ghost`,position:{longitude:d,latitude:f}})}}}t&&r.push({id:`own-vessel`,position:{longitude:t.longitude,latitude:t.latitude}}),de=r,hL.syncSnapped(de)}let n=hL.rulers;if(n.length>0){let e=Q.appearance.ruler.color,t=Q.appearance.ruler.width;function r(e,t){let n=parseInt(e.replace(`#`,``),16);return[n>>16&255,n>>8&255,n&255,Math.round(t*255)]}let i=r(e,.87),a=r(e,.9),s=n.flatMap(e=>{if(o){let t=o.project([e.a.lon,e.a.lat]),n=o.project([e.b.lon,e.b.lat]);if(Math.hypot(n.x-t.x,n.y-t.y)<100)return[]}let t=uL(e.a.lon,e.a.lat,e.b.lon,e.b.lat),n=t[Math.floor(t.length/2)];return[{ruler:e,lon:n[0],lat:n[1]}]}),c=n.flatMap(e=>[{rulerId:e.id,endpoint:`a`,lon:e.a.lon,lat:e.a.lat,snapId:e.a.snapId},{rulerId:e.id,endpoint:`b`,lon:e.b.lon,lat:e.b.lat,snapId:e.b.snapId}]),l=n.flatMap(e=>{if(o){let t=o.project([e.a.lon,e.a.lat]),n=o.project([e.b.lon,e.b.lat]);if(Math.hypot(n.x-t.x,n.y-t.y)<100)return[]}return[{rulerId:e.id,endpoint:`b`,lon:e.b.lon,lat:e.b.lat}]});_e=[new iI({id:`ruler-line`,data:n.map(e=>({ruler:e})),getPath:e=>uL(e.ruler.a.lon,e.ruler.a.lat,e.ruler.b.lon,e.ruler.b.lat),getColor:()=>i,getWidth:t,widthUnits:`pixels`,widthMinPixels:1,pickable:!1,updateTriggers:{getPath:[n]}}),new NF({id:`ruler-handles`,data:c,getPosition:e=>[e.lon,e.lat,0],getRadius:7,radiusUnits:`pixels`,getFillColor:e=>e.snapId?[255,100,50,230]:a,getLineColor:[255,255,255,180],lineWidthUnits:`pixels`,getLineWidth:1.5,stroked:!0,pickable:!0,updateTriggers:{getPosition:[n],getFillColor:[n,e]}}),new tL({id:`ruler-labels`,data:s,getText:e=>`${dL(e.ruler)} · ${fL(e.ruler)}`,getPosition:e=>[e.lon,e.lat,0],getSize:13,getColor:[255,240,180,230],getBackgroundColor:[0,0,0,160],background:!0,backgroundPadding:[4,2,4,2],getTextAnchor:`middle`,getAlignmentBaseline:`center`,fontFamily:`monospace`,pickable:!1,updateTriggers:{getText:[n],getPosition:[n]}}),new tL({id:`ruler-delete`,data:l,getText:()=>`✕`,getPosition:e=>[e.lon,e.lat,0],getPixelOffset:[14,-14],getSize:11,getColor:[255,100,100,220],getBackgroundColor:[30,10,10,180],background:!0,backgroundPadding:[3,1,3,1],getTextAnchor:`middle`,getAlignmentBaseline:`center`,pickable:!0,updateTriggers:{getPosition:[n]}})],ve()}else _e.length>0&&(_e=[],ve())}ye=requestAnimationFrame(e)}ye=requestAnimationFrame(e),a.addEventListener(`pointerdown`,se,{capture:!0}),a.addEventListener(`pointermove`,ce,{capture:!0}),a.addEventListener(`pointerup`,le,{capture:!0}),a.addEventListener(`pointercancel`,le,{capture:!0}),c=()=>{V(s,!!document.fullscreenElement)},document.addEventListener(`fullscreenchange`,c),o.on(`zoom`,()=>{V(f,o?.getZoom()??G(f),!0)}),o.on(`rotate`,()=>{V(p,o?.getBearing()??G(p),!0)}),o.on(`dragstart`,()=>{ie||(hu.following=!1)}),o.on(`click`,e=>{if(!fe)return;let{x:t,y:n}=e.point,r=fe.pickObject({x:t,y:n,radius:5,layerIds:[`ais-confirmed-icon`,`ais-hull-ghost`,`ais-hull-confirmed`,`ais-ghost-icon`]});if(r===null)return;let i=r.object;if(i==null)return;let a=Ju.getTarget(i);!a?.position||!r.coordinate||xe({...r,object:a})}),o.on(`style.load`,()=>{let e=o;if(!e)return;let t=Q.appearance;e.addImage(`vessel-icon`,{width:64,height:64,data:LL(64,t.vesselColor).data}),e.addSource(C,{type:`geojson`,data:O}),e.addSource(w,{type:`geojson`,data:O}),e.addSource(T,{type:`geojson`,data:O}),e.addSource(E,{type:`geojson`,data:O}),e.addSource(D,{type:`geojson`,data:O}),e.addLayer({id:`vessel-gc-line`,type:`line`,source:E,paint:{"line-color":t.gc.color,"line-width":t.gc.width,...A(t.gc.style,t.gc.width)!==null&&{"line-dasharray":A(t.gc.style,t.gc.width)}}}),e.addLayer({id:`ais-label`,type:`symbol`,source:D,layout:{"text-field":[`get`,`label`],"text-size":10,"text-anchor":`top`,"text-offset":[0,.8],"text-optional":!0},paint:{"text-color":Q.appearance.ais.vesselColor,"text-halo-color":`#000`,"text-halo-width":1}}),e.addLayer({id:`vessel-cog-line`,type:`line`,source:w,paint:{"line-color":t.cog.color,"line-width":t.cog.width,...A(t.cog.style,t.cog.width)!==null&&{"line-dasharray":A(t.cog.style,t.cog.width)}}}),e.addLayer({id:`vessel-hdg-line`,type:`line`,source:T,paint:{"line-color":t.heading.color,"line-width":t.heading.width}}),e.addLayer({id:`vessel-icon`,type:`symbol`,source:C,layout:{"icon-image":`vessel-icon`,"icon-size":t.vesselSize/64,"icon-rotate":[`get`,`bearing_deg`],"icon-rotation-alignment":`map`,"icon-allow-overlap":!0,"icon-ignore-placement":!0}}),V(f,o.getZoom(),!0),V(p,o.getBearing(),!0),V(d,!0)}),o.on(`webglcontextlost`,()=>{console.warn(`[map] WebGL context lost`),V(d,!1),k.clear()}),o.on(`webglcontextrestored`,()=>{console.info(`[map] WebGL context restored`)}),o.on(`error`,e=>{console.error(`[map] error`,e.error??e)})}),$r(()=>{cancelAnimationFrame(ye),fe?.finalize(),document.removeEventListener(`fullscreenchange`,c),a.removeEventListener(`pointerdown`,se,{capture:!0}),a.removeEventListener(`pointermove`,ce,{capture:!0}),a.removeEventListener(`pointerup`,le,{capture:!0}),a.removeEventListener(`pointercancel`,le,{capture:!0}),o?.remove()});function be(e){let t=(e,t,n=``)=>`<tr><td>${e}</td><td><b>${t===null?`<span style="opacity:0.4">—</span>`:`${String(t)}${n}`}</b></td></tr>`,n=e.rot===void 0?null:e.rot*180/Math.PI*60,r=n===null?null:`${n>0?`▶ `:n<0?`◀ `:``}${Math.abs(n).toFixed(1)}°/min`,i=e.mmsi?`<div class="ais-links">
|
|
4465
4465
|
<a href="https://www.vesselfinder.com/vessels/details/${e.mmsi}" target="_blank" rel="noopener">VesselFinder</a>
|
|
4466
4466
|
<a href="https://www.myshiptracking.com/?mmsi=${e.mmsi}" target="_blank" rel="noopener">MyShipTracking</a>
|
|
4467
4467
|
</div>`:``,a=e.position?.longitude,o=e.position?.latitude,s=e.lastPositionUpdateMs,c=new Date(s).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`,second:`2-digit`}),l=Math.round((Date.now()-s)/1e3),u=l<60?`${l}s ago`:l<3600?`${Math.floor(l/60)}m ${l%60}s ago`:`${Math.floor(l/3600)}h ${Math.floor(l%3600/60)}m ago`;return`
|
|
@@ -4483,7 +4483,7 @@ void main(void) {
|
|
|
4483
4483
|
${t(`Draft`,e.draftM??null,` m`)}
|
|
4484
4484
|
</table>
|
|
4485
4485
|
${i}
|
|
4486
|
-
</div>`}function xe(e){let t=e.object;return!t?.position||!e.coordinate?!1:(new ou.default.Popup({closeButton:!0,maxWidth:`280px`}).setLngLat(e.coordinate).setHTML(be(t)).addTo(o),!0)}Pn(()=>{if(!o||!G(d))return;let e=o,t=Vu.selected,n=Vu.available;for(let r of Object.keys(n))if(!t.has(r)){let t=`chart-layer-${r}`,n=`chart-${r}`;e.getLayer(t)&&e.removeLayer(t),e.getSource(n)&&e.removeSource(n),k.delete(r)}for(let[r,i]of Object.entries(n)){if(!t.has(r))continue;let n=Vu.tileUrl(i);if(!n)continue;let a=`chart-${r}`,o=`chart-layer-${r}`;if(k.get(r)!==n&&(e.getLayer(o)&&e.removeLayer(o),e.getSource(a)&&e.removeSource(a),k.set(r,n)),e.getSource(a)||(i.format===`pbf`?e.addSource(a,{type:`vector`,tiles:[n]}):e.addSource(a,{type:`raster`,tiles:[n],tileSize:256,minzoom:i.minzoom??0,maxzoom:i.maxzoom??22})),!e.getLayer(o))if(i.format===`pbf`){let t=i.layers?.[0]??r;e.addLayer({id:o,type:`fill`,source:a,"source-layer":t},`vessel-gc-line`)}else e.addLayer({id:o,type:`raster`,source:a},`vessel-gc-line`)}}),Pn(()=>{if(!o||!G(d))return;let e=Ku.enabled;for(let t of Hu)o.setLayoutProperty(t.id,`visibility`,e.has(t.id)?`visible`:`none`)}),Pn(()=>{if(!o||!G(d))return;let e=LL(64,Q.appearance.vesselColor);o.updateImage(`vessel-icon`,{width:64,height:64,data:e.data})}),Pn(()=>{!o||!G(d)||o.setPaintProperty(`ais-label`,`text-color`,Q.appearance.ais.vesselColor)}),Pn(()=>{if(!o||!G(d))return;let e=o.getSource(D);if(!(e instanceof ou.default.GeoJSONSource))return;let t=Ju.hotData,n=Ju.ids,r=Ju.coldMap;Ju.coldVersion;let i=[];if(t&&n.length>0)for(let e=0;e<n.length;e++)i.push({type:`Feature`,geometry:{type:`Point`,coordinates:[t[e*7+0],t[e*7+1]]},properties:{label:r.get(n[e])?.name??``}});let a=()=>{y=Date.now(),e.setData({type:`FeatureCollection`,features:i}),window.__mapDiag&&window.__mapDiag.aisLabels++};x=a;let s=1e3-(Date.now()-y);s<=0?(b!==null&&(clearTimeout(b),b=null),a(),x=null):b===null&&(b=setTimeout(()=>{b=null,x?.(),x=null},s))}),Pn(()=>{let e=Ju.hotData,t=Ju.ids,n=Ju.coldMap;Ju.coldVersion;let r=Q.appearance.ais,i=r.vesselSize/64,a=Date.now(),o=r.cog.color,s=r.cog.width,c=r.cog.style,l=r.cog.lengthMinutes;if(!e||t.length===0){ge=[],ve(),pe=null,me=[],he=0;return}let u=t.length,d=[],f=[],p=[],m=[];for(let r=0;r<u;r++){d.push(r);let i=e[r*7+2],a=e[r*7+3];!isNaN(i)&&!isNaN(a)&&a>.1&&(f.push(r),m.push(r));let o=e[r*7+4],s=n.get(t[r]);!isNaN(o)&&(s?.lengthM??0)>0&&(s?.beamM??0)>0&&p.push(r)}pe=e,me=t,he=a;let h=te(r.vesselColor,220),g=te(r.vesselColor,130),_=t=>[e[t*7+0],e[t*7+1],0],v=t=>{let n=e[t*7+3];return isNaN(n)?0:n},y=t=>{let n=e[t*7+2];return isNaN(n)?0:n},b=t=>{let n=e[t*7+4];if(!isNaN(n))return n;let r=e[t*7+2];return isNaN(r)?0:r},x=t=>{let n=e[t*7+4];return isNaN(n)?0:n},S=t=>{let n=e[t*7+5];return isNaN(n)?0:n},C=t=>e[t*7+6],w=(e,r)=>n.get(t[e])?.lengthM??r,T=(e,r)=>n.get(t[e])?.beamM??r,E=f.length>0?new NL({id:`ais-ghost-icon`,data:f,getPosition:_,getSog:v,getCog:y,getHeading:b,getRot:S,getAgeAtUpload:C,getLength:e=>w(e,0),getColor:g,uploadTimestamp:a,selfAnimate:!0,settingsIconSize:i,pickable:!0}):null,D=d.length>0?new NL({id:`ais-confirmed-icon`,data:d,getPosition:_,getSog:()=>0,getCog:()=>0,getHeading:b,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>w(e,0),getColor:h,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,pickable:!0}):null,O=p.length>0?new CL({id:`ais-hull-ghost`,data:p,getPosition:_,getSog:v,getCog:y,getHeading:x,getRot:S,getAgeAtUpload:C,getLength:e=>w(e,50),getBeam:e=>T(e,10),getColor:h,uploadTimestamp:a,selfAnimate:!0,settingsIconSize:i,opacity:.75,pickable:!0}):null,k=p.length>0?new CL({id:`ais-hull-confirmed`,data:p,getPosition:_,getSog:()=>0,getCog:()=>0,getHeading:x,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>w(e,50),getBeam:e=>T(e,10),getColor:h,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,opacity:1,pickable:!0}):null;ge=[...k?[k]:[],...O?[O]:[],new iI({id:`ais-cog`,data:m,getPath:t=>{let n=e[t*7+0],r=e[t*7+1],i=e[t*7+2],a=e[t*7+3],o=e[t*7+5],s=l*60,c=isNaN(o)?0:o;if(Math.abs(c)<1e-4){let[e,t]=PL(n,r,i,isNaN(a)?0:a,0,0,s*1e3);return[[n,r],[e,t]]}return Array.from({length:25},(e,t)=>{let[o,l]=PL(n,r,i,isNaN(a)?0:a,c,0,s*t/24*1e3);return[o,l]})},getColor:()=>te(o,200),getWidth:s,getDashArray:ne(c,s),widthUnits:`pixels`,widthMinPixels:1,pickable:!1,extensions:[new sL({dash:!0})],updateTriggers:{getPath:[l],getColor:[o],getWidth:[s],getDashArray:[c,s]}}),...E?[E]:[],...D?[D]:[]],ve()}),Pn(()=>{let e=Q.appearance,t=n(),r=G(f);if(!o||!G(d)||(o.setPaintProperty(`vessel-gc-line`,`line-color`,e.gc.color),o.setPaintProperty(`vessel-gc-line`,`line-width`,e.gc.width),o.setPaintProperty(`vessel-gc-line`,`line-dasharray`,A(e.gc.style,e.gc.width)),o.setPaintProperty(`vessel-cog-line`,`line-color`,e.cog.color),o.setPaintProperty(`vessel-cog-line`,`line-width`,e.cog.width),o.setPaintProperty(`vessel-cog-line`,`line-dasharray`,A(e.cog.style,e.cog.width)),o.setPaintProperty(`vessel-hdg-line`,`line-color`,e.heading.color),o.setPaintProperty(`vessel-hdg-line`,`line-width`,e.heading.width),o.setPaintProperty(`vessel-hdg-line`,`line-dasharray`,A(e.heading.style,e.heading.width)),o.setLayoutProperty(`vessel-icon`,`icon-size`,e.vesselSize/64),!t.position))return;let{longitude:i,latitude:a}=t.position;function s(e,t){if(e.lengthUnit===`nm`)return e.lengthValue*1852;if(e.lengthUnit===`min`)return t===null?0:e.lengthValue*60*t;let n=Math.cos(a*Math.PI/180)*40075016.686/(512*2**r);return e.lengthValue*n}let c=t.heading??t.cog??null,l=c===null?0:c*180/Math.PI,u={type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`Point`,coordinates:[i,a]},properties:{bearing_deg:l}}]},p=t.cog===null?O:{type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`LineString`,coordinates:M(i,a,t.cog,s(e.cog,t.sog))},properties:{}}]},h=t.cog===null?O:{type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`LineString`,coordinates:ee(i,a,t.cog,s(e.gc,t.sog))},properties:{}}]},g=t.heading===null?O:{type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`LineString`,coordinates:(G(m)===`globe`?ee:M)(i,a,t.heading,s(e.heading,t.sog))},properties:{}}]},y=o;v=()=>{let e=y.getSource(C),t=y.getSource(w),n=y.getSource(E),r=y.getSource(T);e instanceof ou.default.GeoJSONSource&&t instanceof ou.default.GeoJSONSource&&n instanceof ou.default.GeoJSONSource&&r instanceof ou.default.GeoJSONSource&&(e.setData(u),t.setData(p),n.setData(h),r.setData(g),window.__mapDiag&&window.__mapDiag.ownVessel++)},_===null&&(_=requestAnimationFrame(()=>{_=null,v?.(),v=null}))}),Pn(()=>{let e=n().position;if(!e||!o||!hu.following)return;let t=o.getCenter();Math.hypot(t.lng-e.longitude,t.lat-e.latitude)>1?o.flyTo({center:[e.longitude,e.latitude],speed:1.5}):o.easeTo({center:[e.longitude,e.latitude],duration:1e3})});var Se={flyToVessel:u,addRuler:re},Ce=RL(),we=bn(Ce);zi(we,e=>a=e,()=>a);var Te=W(we,2),Ee=U(Te),De=U(Ee);{let e=Gt(()=>G(m)===`mercator`?nu:$l);Zl(De,{get icon(){return G(e)}})}N(Ee);var Oe=W(Ee,2),ke=U(Oe);{let e=Gt(()=>G(s)?ru:Ql);Zl(ke,{get icon(){return G(e)}})}N(Oe),N(Te),Bn(()=>{ji(Ee,`title`,`Switch to ${G(m)===`mercator`?`Globe`:`Mercator`}`),ji(Oe,`title`,G(s)?`Exit fullscreen`:`Enter fullscreen`)}),Nr(`click`,Ee,()=>{S(G(m)===`mercator`?`globe`:`mercator`)}),Nr(`click`,Oe,l),Ur(e,Ce);var Ae=P(Se);return i(),Ae}Pr([`click`]);var BL=Vr(`<p class="section-title svelte-1u3w06f">Signal K server</p> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Protocol</label> <div class="field svelte-1u3w06f"><select class="svelte-1u3w06f"><option>ws://</option><option>wss://</option></select></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Host</label> <div class="field svelte-1u3w06f"><input type="text" placeholder="192.168.1.1" style="flex:1; font-family: monospace;" class="svelte-1u3w06f"/></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Port</label> <div class="field svelte-1u3w06f"><input type="number" min="1" max="65535" class="svelte-1u3w06f"/></div></div> <p class="hint svelte-1u3w06f"> </p>`,1),VL=Vr(`<p class="section-title svelte-1u3w06f">Rhumb Line predictor</p>`),HL=Vr(`<p class="section-title svelte-1u3w06f">Great Circle predictor</p>`),UL=Vr(`<p class="section-title svelte-1u3w06f">AIS targets</p>`),WL=Vr(`<div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Color</label> <div class="field svelte-1u3w06f"><input type="color" class="svelte-1u3w06f"/></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Width</label> <div class="field svelte-1u3w06f"><input type="number" min="1" max="8" step="0.5" class="svelte-1u3w06f"/> <span class="unit svelte-1u3w06f">px</span></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Style</label> <div class="field svelte-1u3w06f"><select class="svelte-1u3w06f"><option>Solid</option><option>Dashed</option><option>Dotted</option><option>Dash-dot</option></select></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Length</label> <div class="field svelte-1u3w06f"><input type="number" min="0" step="0.1" style="width:72px" class="svelte-1u3w06f"/> <select class="svelte-1u3w06f"><option>nm</option><option>min at SOG</option><option>px</option></select></div></div> <!>`,1),GL=Vr(`<p class="section-title svelte-1u3w06f">Vessel</p> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Color</label> <div class="field svelte-1u3w06f"><input type="color" class="svelte-1u3w06f"/></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Size</label> <div class="field svelte-1u3w06f"><input type="number" min="8" max="64" step="2" class="svelte-1u3w06f"/> <span class="unit svelte-1u3w06f">px</span></div></div> <p class="section-title svelte-1u3w06f">Heading line</p> <!> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Color</label> <div class="field svelte-1u3w06f"><input type="color" class="svelte-1u3w06f"/></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Size</label> <div class="field svelte-1u3w06f"><input type="number" min="8" max="48" step="2" class="svelte-1u3w06f"/> <span class="unit svelte-1u3w06f">px</span></div></div> <p class="section-title svelte-1u3w06f">AIS COG line</p> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Color</label> <div class="field svelte-1u3w06f"><input type="color" class="svelte-1u3w06f"/></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Width</label> <div class="field svelte-1u3w06f"><input type="number" min="1" max="8" step="0.5" class="svelte-1u3w06f"/> <span class="unit svelte-1u3w06f">px</span></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Style</label> <div class="field svelte-1u3w06f"><select class="svelte-1u3w06f"><option>Solid</option><option>Dashed</option><option>Dotted</option><option>Dash-dot</option></select></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Length</label> <div class="field svelte-1u3w06f"><input type="number" min="1" max="60" step="1" class="svelte-1u3w06f"/> <span class="unit svelte-1u3w06f">min</span></div></div> <p class="section-title svelte-1u3w06f">Ruler</p> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Color</label> <div class="field svelte-1u3w06f"><input type="color" class="svelte-1u3w06f"/></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Width</label> <div class="field svelte-1u3w06f"><input type="number" min="1" max="8" step="0.5" class="svelte-1u3w06f"/> <span class="unit svelte-1u3w06f">px</span></div></div>`,1),KL=Vr(`<button class="btn btn-cancel svelte-1u3w06f">Cancel</button> <button class="btn btn-save svelte-1u3w06f">Save & reconnect</button>`,1),qL=Vr(`<button class="btn btn-cancel svelte-1u3w06f">Cancel</button> <button class="btn btn-save svelte-1u3w06f">Close</button>`,1),JL=Vr(`<div class="backdrop svelte-1u3w06f"></div> <div class="modal svelte-1u3w06f"><h2 class="svelte-1u3w06f">Settings</h2> <div class="tabs svelte-1u3w06f"><button>Connection</button> <button>Appearance</button></div> <!> <!> <div class="actions svelte-1u3w06f"><!></div></div>`,1),YL=Vr(`<button title="Settings" class="gear-btn svelte-1u3w06f"><!></button> <!>`,1);function XL(e,t){Ze(t,!0);let n=nn(!1),r=nn(`connection`),i=nn(H({protocol:Q.protocol,host:Q.host,port:Q.port})),a=``;function o(){V(i,{protocol:Q.protocol,host:Q.host,port:Q.port},!0),a=JSON.stringify(Q.appearance),V(r,`connection`),V(n,!0)}function s(){Q.apply({signalkProtocol:G(i).protocol,signalkHost:G(i).host,signalkPort:G(i).port,appearance:Q.appearance}),V(n,!1)}function c(){Q.apply({signalkProtocol:Q.protocol,signalkHost:Q.host,signalkPort:Q.port,appearance:JSON.parse(a)}),V(n,!1)}function l(){V(n,!1)}function u(){Q.apply({signalkProtocol:Q.protocol,signalkHost:Q.host,signalkPort:Q.port,appearance:Q.appearance})}var d=YL(),f=bn(d);Zl(U(f),{get icon(){return eu}}),N(f);var p=W(f,2),m=e=>{var t=JL(),n=bn(t),a=W(n,2),o=W(U(a),2),d=U(o);let f;var p=W(d,2);let m;N(o);var h=W(o,2),g=e=>{var t=BL(),n=W(bn(t),2),r=W(U(n),2),a=U(r),o=U(a);o.value=o.__value=`ws`;var s=W(o);s.value=s.__value=`wss`,N(a),N(r),N(n);var c=W(n,2),l=W(U(c),2),u=U(l);Oi(u),N(l),N(c);var d=W(c,2),f=W(U(d),2),p=U(f);Oi(p),N(f),N(d);var m=W(d,2),h=U(m);N(m),Bn(()=>Kr(h,`→ ${G(i).protocol??``}://${G(i).host??``}:${G(i).port??``}/signalk/v1/stream?subscribe=self`)),Si(a,()=>G(i).protocol,e=>G(i).protocol=e),Fi(u,()=>G(i).host,e=>G(i).host=e),Fi(p,()=>G(i).port,e=>G(i).port=e),Ur(e,t)};ti(h,e=>{G(r)===`connection`&&e(g)});var _=W(h,2),v=e=>{var t=GL(),n=W(bn(t),2),r=W(U(n),2),i=U(r);Oi(i),N(r),N(n);var a=W(n,2),o=W(U(a),2),s=U(o);Oi(s),Ve(2),N(o),N(a);var c=W(a,4);ai(c,16,()=>[{key:`heading`},{key:`cog`},{key:`gc`}],({key:e})=>e,(e,t)=>{let n=()=>t.key,r=Gt(()=>n()===`heading`?Q.appearance.heading:n()===`cog`?Q.appearance.cog:Q.appearance.gc);var i=WL(),a=bn(i),o=W(U(a),2),s=U(o);Oi(s),N(o),N(a);var c=W(a,2),l=W(U(c),2),d=U(l);Oi(d),Ve(2),N(l),N(c);var f=W(c,2),p=W(U(f),2),m=U(p),h=U(m);h.value=h.__value=`solid`;var g=W(h);g.value=g.__value=`dashed`;var _=W(g);_.value=_.__value=`dotted`;var v=W(_);v.value=v.__value=`dash-dot`,N(m),N(p),N(f);var y=W(f,2),b=W(U(y),2),x=U(b);Oi(x);var S=W(x,2),C=U(S);C.value=C.__value=`nm`;var w=W(C);w.value=w.__value=`min`;var T=W(w);T.value=T.__value=`px`,N(S),N(b),N(y);var E=W(y,2),D=e=>{Ur(e,VL())},O=e=>{Ur(e,HL())},k=e=>{Ur(e,UL())};ti(E,e=>{n()===`heading`?e(D):n()===`cog`?e(O,1):n()===`gc`&&e(k,2)}),Nr(`input`,s,u),Fi(s,()=>G(r).color,e=>G(r).color=e),Nr(`input`,d,u),Fi(d,()=>G(r).width,e=>G(r).width=e),Nr(`change`,m,u),Si(m,()=>G(r).style,e=>G(r).style=e),Nr(`input`,x,u),Fi(x,()=>G(r).lengthValue,e=>G(r).lengthValue=e),Nr(`change`,S,u),Si(S,()=>G(r).lengthUnit,e=>G(r).lengthUnit=e),Ur(e,i)});var l=W(c,2),d=W(U(l),2),f=U(d);Oi(f),N(d),N(l);var p=W(l,2),m=W(U(p),2),h=U(m);Oi(h),Ve(2),N(m),N(p);var g=W(p,4),_=W(U(g),2),v=U(_);Oi(v),N(_),N(g);var y=W(g,2),b=W(U(y),2),x=U(b);Oi(x),Ve(2),N(b),N(y);var S=W(y,2),C=W(U(S),2),w=U(C),T=U(w);T.value=T.__value=`solid`;var E=W(T);E.value=E.__value=`dashed`;var D=W(E);D.value=D.__value=`dotted`;var O=W(D);O.value=O.__value=`dash-dot`,N(w),N(C),N(S);var k=W(S,2),A=W(U(k),2),j=U(A);Oi(j),Ve(2),N(A),N(k);var M=W(k,4),ee=W(U(M),2),te=U(ee);Oi(te),N(ee),N(M);var ne=W(M,2),re=W(U(ne),2),ie=U(re);Oi(ie),Ve(2),N(re),N(ne),Nr(`input`,i,u),Fi(i,()=>Q.appearance.vesselColor,e=>Q.appearance.vesselColor=e),Nr(`input`,s,u),Fi(s,()=>Q.appearance.vesselSize,e=>Q.appearance.vesselSize=e),Nr(`input`,f,u),Fi(f,()=>Q.appearance.ais.vesselColor,e=>Q.appearance.ais.vesselColor=e),Nr(`input`,h,u),Fi(h,()=>Q.appearance.ais.vesselSize,e=>Q.appearance.ais.vesselSize=e),Nr(`input`,v,u),Fi(v,()=>Q.appearance.ais.cog.color,e=>Q.appearance.ais.cog.color=e),Nr(`input`,x,u),Fi(x,()=>Q.appearance.ais.cog.width,e=>Q.appearance.ais.cog.width=e),Nr(`change`,w,u),Si(w,()=>Q.appearance.ais.cog.style,e=>Q.appearance.ais.cog.style=e),Nr(`input`,j,u),Fi(j,()=>Q.appearance.ais.cog.lengthMinutes,e=>Q.appearance.ais.cog.lengthMinutes=e),Nr(`input`,te,u),Fi(te,()=>Q.appearance.ruler.color,e=>Q.appearance.ruler.color=e),Nr(`input`,ie,u),Fi(ie,()=>Q.appearance.ruler.width,e=>Q.appearance.ruler.width=e),Ur(e,t)};ti(_,e=>{G(r)===`appearance`&&e(v)});var y=W(_,2),b=U(y),x=e=>{var t=KL(),n=bn(t),r=W(n,2);Nr(`click`,n,c),Nr(`click`,r,s),Ur(e,t)},S=e=>{var t=qL(),n=bn(t),r=W(n,2);Nr(`click`,n,c),Nr(`click`,r,l),Ur(e,t)};ti(b,e=>{G(r)===`connection`?e(x):e(S,-1)}),N(y),N(a),Bn(()=>{f=_i(d,1,`tab svelte-1u3w06f`,null,f,{active:G(r)===`connection`}),m=_i(p,1,`tab svelte-1u3w06f`,null,m,{active:G(r)===`appearance`})}),Nr(`click`,n,l),Nr(`click`,d,()=>V(r,`connection`)),Nr(`click`,p,()=>V(r,`appearance`)),Ur(e,t)};ti(p,e=>{G(n)&&e(m)}),Nr(`click`,f,o),Ur(e,d),P()}Pr([`click`,`input`,`change`]);var ZL=Vr(`<li class="chart-row svelte-1mbfew2"><input type="checkbox" class="svelte-1mbfew2"/> <label class="chart-name svelte-1mbfew2"> </label></li>`),QL=Vr(`<li class="chart-row hint-row svelte-1mbfew2">Loading charts…</li>`),$L=Vr(`<li class="chart-row hint-row error svelte-1mbfew2"> </li>`),eR=Vr(`<span class="badge svelte-1mbfew2">WMS</span>`),tR=Vr(`<span class="badge svelte-1mbfew2">WMTS</span>`),nR=Vr(`<span class="chart-desc svelte-1mbfew2"> </span>`),rR=Vr(`<span class="wmts-warning svelte-1mbfew2">⚠ Cannot auto-discover tile URL (CORS). Enter template manually:</span> <div class="wmts-manual svelte-1mbfew2"><input type="text" class="wmts-input svelte-1mbfew2"/> <button class="wmts-apply svelte-1mbfew2">Apply</button></div>`,1),iR=Vr(`<span class="wmts-ok svelte-1mbfew2">✓ Custom URL active</span> <button class="wmts-clear svelte-1mbfew2">Clear</button>`,1),aR=Vr(`<option> </option>`),oR=Vr(`<label class="wmts-showall-label svelte-1mbfew2" title="Show all layers from capabilities"><input type="checkbox" class="svelte-1mbfew2"/> All</label>`),sR=Vr(`<div class="wmts-layer-row svelte-1mbfew2"><label class="wmts-layer-label svelte-1mbfew2">Layer</label> <select class="wmts-layer-select svelte-1mbfew2"></select> <!></div>`),cR=Vr(`<span class="wmts-ok svelte-1mbfew2"> </span>`),lR=Vr(`<li class="chart-row svelte-1mbfew2"><input type="checkbox" class="svelte-1mbfew2"/> <div class="chart-info svelte-1mbfew2"><label class="chart-name svelte-1mbfew2"> <!> <!></label> <!> <span class="chart-meta svelte-1mbfew2"> </span> <!></div></li>`),uR=Vr(`<div class="backdrop svelte-1mbfew2"></div> <div class="panel svelte-1mbfew2"><div class="panel-header svelte-1mbfew2"><span class="panel-title svelte-1mbfew2">Layers</span> <button class="close-btn svelte-1mbfew2" title="Close">✕</button></div> <ul class="chart-list svelte-1mbfew2"><!> <!></ul></div>`,1),dR=Vr(`<button title="Charts"><!></button> <!>`,1);function fR(e,t){Ze(t,!0);let n=nn(!1),r=H({});function i(){V(n,!G(n))}function a(){V(n,!1)}function o(e){Vu.setOverride(e,r[e]??``)}var s=dR(),c=bn(s);let l;Zl(U(c),{get icon(){return au}}),N(c);var u=W(c,2),d=e=>{var t=uR(),n=bn(t),i=W(n,2),s=U(i),c=W(U(s),2);N(s);var l=W(s,2),u=U(l);ai(u,17,()=>Hu,e=>e.id,(e,t)=>{var n=ZL(),r=U(n);Oi(r);var i=W(r,2),a=U(i,!0);N(i),N(n),Bn(e=>{ji(r,`id`,`base-${G(t).id??``}`),Ai(r,e),ji(i,`for`,`base-${G(t).id??``}`),Kr(a,G(t).name)},[()=>Ku.enabled.has(G(t).id)]),Nr(`change`,r,()=>{Ku.toggle(G(t).id)}),Ur(e,n)});var d=W(u,2),f=e=>{Ur(e,QL())},p=e=>{var t=$L(),n=U(t);N(t),Bn(()=>Kr(n,`⚠ ${Vu.error??``}`)),Ur(e,t)},m=e=>{var t=Hr();ai(bn(t),17,()=>Object.entries(Vu.available),([e,t])=>e,(e,t)=>{var n=Gt(()=>k(G(t),2));let i=()=>G(n)[0],a=()=>G(n)[1];var s=lR(),c=U(s);Oi(c);var l=W(c,2),u=U(l),d=U(u),f=W(d),p=e=>{Ur(e,eR())};ti(f,e=>{a().type===`WMS`&&e(p)});var m=W(f,2),h=e=>{Ur(e,tR())};ti(m,e=>{a().type===`WMTS`&&e(h)}),N(u);var g=W(u,2),_=e=>{var t=nR(),n=U(t,!0);N(t),Bn(()=>Kr(n,a().description)),Ur(e,t)};ti(g,e=>{a().description&&e(_)});var v=W(g,2),y=U(v);N(v);var b=W(v,2),x=e=>{var t=rR(),n=W(bn(t),2),a=U(n);Oi(a),ji(a,`placeholder`,`https://…/{z}/{x}/{y}.png`);var s=W(a,2);N(n),Bn(e=>ki(a,e),[()=>r[i()]??Vu.getOverride(i())]),Nr(`input`,a,e=>{r[i()]=e.target.value}),Nr(`keydown`,a,e=>{e.key===`Enter`&&o(i())}),Nr(`click`,s,()=>o(i())),Ur(e,t)},S=Gt(()=>Vu.needsManualUrl(i())),C=e=>{var t=iR();Nr(`click`,W(bn(t),2),()=>{Vu.setOverride(i(),``),r[i()]=``}),Ur(e,t)},w=Gt(()=>a().type===`WMTS`&&Vu.getOverride(i())),T=e=>{var t=Hr(),n=bn(t),r=e=>{var t=sR(),n=U(t),r=W(n,2);ai(r,21,()=>Vu.visibleLayers(i()),e=>e.id,(e,t)=>{var n=aR(),r=U(n,!0);N(n);var i={};Bn(()=>{Kr(r,G(t).title),i!==(i=G(t).id)&&(n.value=(n.__value=G(t).id)??``)}),Ur(e,n)}),N(r);var a;xi(r);var o=W(r,2),s=e=>{var t=oR(),n=U(t);Oi(n),Ve(),N(t),Bn(e=>Ai(n,e),[()=>Vu.isShowingAll(i())]),Nr(`change`,n,()=>Vu.toggleShowAll(i())),Ur(e,t)},c=Gt(()=>Vu.hasFilter(i()));ti(o,e=>{G(c)&&e(s)}),N(t),Bn(e=>{ji(n,`for`,`wmts-layer-${i()??``}`),ji(r,`id`,`wmts-layer-${i()??``}`),a!==(a=e)&&(r.value=(r.__value=e)??``,bi(r,e))},[()=>Vu.getLayerSel(i())]),Nr(`change`,r,e=>{Vu.selectLayer(i(),e.target.value)}),Ur(e,t)},a=Gt(()=>Vu.visibleLayers(i()).length>1),o=e=>{var t=cR(),n=U(t);N(t),Bn(e=>Kr(n,`Layer: ${e??``}`),[()=>Vu.visibleLayers(i())[0]?.title]),Ur(e,t)},s=Gt(()=>Vu.visibleLayers(i()).length===1);ti(n,e=>{G(a)?e(r):G(s)&&e(o,1)}),Ur(e,t)};ti(b,e=>{G(S)?e(x):G(w)?e(C,1):a().type===`WMTS`&&e(T,2)}),N(l),N(s),Bn((e,t,n,r)=>{ji(c,`id`,`cp-chart-${i()??``}`),Ai(c,e),c.disabled=t,ji(u,`for`,`cp-chart-${i()??``}`),Kr(d,`${a().name??``} `),Kr(y,`${n??``}${r??``}`)},[()=>Vu.selected.has(i()),()=>Vu.needsManualUrl(i()),()=>a().format.toUpperCase(),()=>a().scale?` · 1:${a().scale.toLocaleString()}`:``]),Nr(`change`,c,()=>{Vu.toggle(i())}),Ur(e,s)}),Ur(e,t)};ti(d,e=>{Vu.loading?e(f):Vu.error?e(p,1):e(m,-1)}),N(l),N(i),Nr(`click`,n,a),Nr(`keydown`,n,a),Nr(`click`,c,a),Ur(e,t)};ti(u,e=>{G(n)&&e(d)}),Bn(()=>l=_i(c,1,`charts-btn svelte-1mbfew2`,null,l,{active:G(n)})),Nr(`click`,c,i),Ur(e,s),P()}Pr([`click`,`keydown`,`change`,`input`]);var pR=Vr(`<span style="color: #f87171"> </span>`),mR=Vr(`<div style="position: relative; width: 100%; height: 100%;"><!> <!> <!> <div style="
|
|
4486
|
+
</div>`}function xe(e){let t=e.object;return!t?.position||!e.coordinate?!1:(new ou.default.Popup({closeButton:!0,maxWidth:`280px`}).setLngLat(e.coordinate).setHTML(be(t)).addTo(o),!0)}Pn(()=>{if(!o||!G(d))return;let e=o,t=Vu.selected,n=Vu.available;for(let r of Object.keys(n))if(!t.has(r)){let t=`chart-layer-${r}`,n=`chart-${r}`;e.getLayer(t)&&e.removeLayer(t),e.getSource(n)&&e.removeSource(n),k.delete(r)}for(let[r,i]of Object.entries(n)){if(!t.has(r))continue;let n=Vu.tileUrl(i);if(!n)continue;let a=`chart-${r}`,o=`chart-layer-${r}`;if(k.get(r)!==n&&(e.getLayer(o)&&e.removeLayer(o),e.getSource(a)&&e.removeSource(a),k.set(r,n)),e.getSource(a)||(i.format===`pbf`?e.addSource(a,{type:`vector`,tiles:[n]}):e.addSource(a,{type:`raster`,tiles:[n],tileSize:256,minzoom:i.minzoom??0,maxzoom:i.maxzoom??22})),!e.getLayer(o))if(i.format===`pbf`){let t=i.layers?.[0]??r;e.addLayer({id:o,type:`fill`,source:a,"source-layer":t},`vessel-gc-line`)}else e.addLayer({id:o,type:`raster`,source:a},`vessel-gc-line`)}}),Pn(()=>{if(!o||!G(d))return;let e=Ku.enabled;for(let t of Hu)o.setLayoutProperty(t.id,`visibility`,e.has(t.id)?`visible`:`none`)}),Pn(()=>{if(!o||!G(d))return;let e=LL(64,Q.appearance.vesselColor);o.updateImage(`vessel-icon`,{width:64,height:64,data:e.data})}),Pn(()=>{!o||!G(d)||o.setPaintProperty(`ais-label`,`text-color`,Q.appearance.ais.vesselColor)}),Pn(()=>{if(!o||!G(d))return;let e=o.getSource(D);if(!(e instanceof ou.default.GeoJSONSource))return;let t=Ju.hotData,n=Ju.ids,r=Ju.coldMap;Ju.coldVersion;let i=[];if(t&&n.length>0)for(let e=0;e<n.length;e++)i.push({type:`Feature`,geometry:{type:`Point`,coordinates:[t[e*7+0],t[e*7+1]]},properties:{label:r.get(n[e])?.name??``}});let a=()=>{y=Date.now(),e.setData({type:`FeatureCollection`,features:i}),window.__mapDiag&&window.__mapDiag.aisLabels++};x=a;let s=1e3-(Date.now()-y);s<=0?(b!==null&&(clearTimeout(b),b=null),a(),x=null):b===null&&(b=setTimeout(()=>{b=null,x?.(),x=null},s))}),Pn(()=>{let e=Ju.hotData,t=Ju.ids,n=Ju.coldMap;Ju.coldVersion;let r=Q.appearance.ais,i=r.vesselSize/64,a=Date.now(),o=r.cog.color,s=r.cog.width,c=r.cog.style,l=r.cog.lengthMinutes;if(!e||t.length===0){ge=[],ve(),pe=null,me=[],he=0;return}let u=t.length,d=[],f=[],p=[],m=[];for(let r=0;r<u;r++){d.push(r);let i=e[r*7+2],a=e[r*7+3];!isNaN(i)&&!isNaN(a)&&a>.1&&(f.push(r),m.push(r));let o=e[r*7+4],s=n.get(t[r]);!isNaN(o)&&(s?.lengthM??0)>0&&(s?.beamM??0)>0&&p.push(r)}pe=e,me=t,he=a;let h=te(r.vesselColor,220),g=te(r.vesselColor,130),_=t=>[e[t*7+0],e[t*7+1],0],v=t=>{let n=e[t*7+3];return isNaN(n)?0:n},y=t=>{let n=e[t*7+2];return isNaN(n)?0:n},b=t=>{let n=e[t*7+4];if(!isNaN(n))return n;let r=e[t*7+2];return isNaN(r)?0:r},x=t=>{let n=e[t*7+4];return isNaN(n)?0:n},S=t=>{let n=e[t*7+5];return isNaN(n)?0:n},C=t=>e[t*7+6],w=(e,r)=>n.get(t[e])?.lengthM??r,T=(e,r)=>n.get(t[e])?.beamM??r,E=f.length>0?new NL({id:`ais-ghost-icon`,data:f,getPosition:_,getSog:v,getCog:y,getHeading:b,getRot:S,getAgeAtUpload:C,getLength:e=>w(e,0),getColor:g,uploadTimestamp:a,selfAnimate:!0,settingsIconSize:i,pickable:!0}):null,D=d.length>0?new NL({id:`ais-confirmed-icon`,data:d,getPosition:_,getSog:()=>0,getCog:()=>0,getHeading:b,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>w(e,0),getColor:h,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,pickable:!0}):null,O=p.length>0?new CL({id:`ais-hull-ghost`,data:p,getPosition:_,getSog:v,getCog:y,getHeading:x,getRot:S,getAgeAtUpload:C,getLength:e=>w(e,50),getBeam:e=>T(e,10),getColor:h,uploadTimestamp:a,selfAnimate:!0,settingsIconSize:i,opacity:.75,pickable:!0}):null,k=p.length>0?new CL({id:`ais-hull-confirmed`,data:p,getPosition:_,getSog:()=>0,getCog:()=>0,getHeading:x,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>w(e,50),getBeam:e=>T(e,10),getColor:h,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,opacity:1,pickable:!0}):null;ge=[...k?[k]:[],...O?[O]:[],new iI({id:`ais-cog`,data:m,getPath:t=>{let n=e[t*7+0],r=e[t*7+1],i=e[t*7+2],a=e[t*7+3],o=e[t*7+5],s=l*60,c=isNaN(o)?0:o;if(Math.abs(c)<1e-4){let[e,t]=PL(n,r,i,isNaN(a)?0:a,0,0,s*1e3);return[[n,r],[e,t]]}return Array.from({length:25},(e,t)=>{let[o,l]=PL(n,r,i,isNaN(a)?0:a,c,0,s*t/24*1e3);return[o,l]})},getColor:()=>te(o,200),getWidth:s,getDashArray:ne(c,s),widthUnits:`pixels`,widthMinPixels:1,pickable:!1,extensions:[new sL({dash:!0})],updateTriggers:{getPath:[l],getColor:[o],getWidth:[s],getDashArray:[c,s]}}),...E?[E]:[],...D?[D]:[]],ve()}),Pn(()=>{let e=Q.appearance,t=n(),r=G(f);if(!o||!G(d)||(o.setPaintProperty(`vessel-gc-line`,`line-color`,e.gc.color),o.setPaintProperty(`vessel-gc-line`,`line-width`,e.gc.width),o.setPaintProperty(`vessel-gc-line`,`line-dasharray`,A(e.gc.style,e.gc.width)??void 0),o.setPaintProperty(`vessel-cog-line`,`line-color`,e.cog.color),o.setPaintProperty(`vessel-cog-line`,`line-width`,e.cog.width),o.setPaintProperty(`vessel-cog-line`,`line-dasharray`,A(e.cog.style,e.cog.width)??void 0),o.setPaintProperty(`vessel-hdg-line`,`line-color`,e.heading.color),o.setPaintProperty(`vessel-hdg-line`,`line-width`,e.heading.width),o.setPaintProperty(`vessel-hdg-line`,`line-dasharray`,A(e.heading.style,e.heading.width)??void 0),o.setLayoutProperty(`vessel-icon`,`icon-size`,e.vesselSize/64),!t.position))return;let{longitude:i,latitude:a}=t.position;function s(e,t){if(e.lengthUnit===`nm`)return e.lengthValue*1852;if(e.lengthUnit===`min`)return t===null?0:e.lengthValue*60*t;let n=Math.cos(a*Math.PI/180)*40075016.686/(512*2**r);return e.lengthValue*n}let c=t.heading??t.cog??null,l=c===null?0:c*180/Math.PI,u={type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`Point`,coordinates:[i,a]},properties:{bearing_deg:l}}]},p=t.cog===null?O:{type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`LineString`,coordinates:M(i,a,t.cog,s(e.cog,t.sog))},properties:{}}]},h=t.cog===null?O:{type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`LineString`,coordinates:ee(i,a,t.cog,s(e.gc,t.sog))},properties:{}}]},g=t.heading===null?O:{type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`LineString`,coordinates:(G(m)===`globe`?ee:M)(i,a,t.heading,s(e.heading,t.sog))},properties:{}}]},y=o;v=()=>{let e=y.getSource(C),t=y.getSource(w),n=y.getSource(E),r=y.getSource(T);e instanceof ou.default.GeoJSONSource&&t instanceof ou.default.GeoJSONSource&&n instanceof ou.default.GeoJSONSource&&r instanceof ou.default.GeoJSONSource&&(e.setData(u),t.setData(p),n.setData(h),r.setData(g),window.__mapDiag&&window.__mapDiag.ownVessel++)},_===null&&(_=requestAnimationFrame(()=>{_=null,v?.(),v=null}))}),Pn(()=>{let e=n().position;if(!e||!o||!hu.following)return;let t=o.getCenter();Math.hypot(t.lng-e.longitude,t.lat-e.latitude)>1?o.flyTo({center:[e.longitude,e.latitude],speed:1.5}):o.easeTo({center:[e.longitude,e.latitude],duration:1e3})});var Se={flyToVessel:u,addRuler:re},Ce=RL(),we=bn(Ce);zi(we,e=>a=e,()=>a);var Te=W(we,2),Ee=U(Te),De=U(Ee);{let e=Gt(()=>G(m)===`mercator`?nu:$l);Zl(De,{get icon(){return G(e)}})}N(Ee);var Oe=W(Ee,2),ke=U(Oe);{let e=Gt(()=>G(s)?ru:Ql);Zl(ke,{get icon(){return G(e)}})}N(Oe),N(Te),Bn(()=>{ji(Ee,`title`,`Switch to ${G(m)===`mercator`?`Globe`:`Mercator`}`),ji(Oe,`title`,G(s)?`Exit fullscreen`:`Enter fullscreen`)}),Nr(`click`,Ee,()=>{S(G(m)===`mercator`?`globe`:`mercator`)}),Nr(`click`,Oe,l),Ur(e,Ce);var Ae=P(Se);return i(),Ae}Pr([`click`]);var BL=Vr(`<p class="section-title svelte-1u3w06f">Signal K server</p> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Protocol</label> <div class="field svelte-1u3w06f"><select class="svelte-1u3w06f"><option>ws://</option><option>wss://</option></select></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Host</label> <div class="field svelte-1u3w06f"><input type="text" placeholder="192.168.1.1" style="flex:1; font-family: monospace;" class="svelte-1u3w06f"/></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Port</label> <div class="field svelte-1u3w06f"><input type="number" min="1" max="65535" class="svelte-1u3w06f"/></div></div> <p class="hint svelte-1u3w06f"> </p>`,1),VL=Vr(`<p class="section-title svelte-1u3w06f">Rhumb Line predictor</p>`),HL=Vr(`<p class="section-title svelte-1u3w06f">Great Circle predictor</p>`),UL=Vr(`<p class="section-title svelte-1u3w06f">AIS targets</p>`),WL=Vr(`<div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Color</label> <div class="field svelte-1u3w06f"><input type="color" class="svelte-1u3w06f"/></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Width</label> <div class="field svelte-1u3w06f"><input type="number" min="1" max="8" step="0.5" class="svelte-1u3w06f"/> <span class="unit svelte-1u3w06f">px</span></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Style</label> <div class="field svelte-1u3w06f"><select class="svelte-1u3w06f"><option>Solid</option><option>Dashed</option><option>Dotted</option><option>Dash-dot</option></select></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Length</label> <div class="field svelte-1u3w06f"><input type="number" min="0" step="0.1" style="width:72px" class="svelte-1u3w06f"/> <select class="svelte-1u3w06f"><option>nm</option><option>min at SOG</option><option>px</option></select></div></div> <!>`,1),GL=Vr(`<p class="section-title svelte-1u3w06f">Vessel</p> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Color</label> <div class="field svelte-1u3w06f"><input type="color" class="svelte-1u3w06f"/></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Size</label> <div class="field svelte-1u3w06f"><input type="number" min="8" max="64" step="2" class="svelte-1u3w06f"/> <span class="unit svelte-1u3w06f">px</span></div></div> <p class="section-title svelte-1u3w06f">Heading line</p> <!> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Color</label> <div class="field svelte-1u3w06f"><input type="color" class="svelte-1u3w06f"/></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Size</label> <div class="field svelte-1u3w06f"><input type="number" min="8" max="48" step="2" class="svelte-1u3w06f"/> <span class="unit svelte-1u3w06f">px</span></div></div> <p class="section-title svelte-1u3w06f">AIS COG line</p> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Color</label> <div class="field svelte-1u3w06f"><input type="color" class="svelte-1u3w06f"/></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Width</label> <div class="field svelte-1u3w06f"><input type="number" min="1" max="8" step="0.5" class="svelte-1u3w06f"/> <span class="unit svelte-1u3w06f">px</span></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Style</label> <div class="field svelte-1u3w06f"><select class="svelte-1u3w06f"><option>Solid</option><option>Dashed</option><option>Dotted</option><option>Dash-dot</option></select></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Length</label> <div class="field svelte-1u3w06f"><input type="number" min="1" max="60" step="1" class="svelte-1u3w06f"/> <span class="unit svelte-1u3w06f">min</span></div></div> <p class="section-title svelte-1u3w06f">Ruler</p> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Color</label> <div class="field svelte-1u3w06f"><input type="color" class="svelte-1u3w06f"/></div></div> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Width</label> <div class="field svelte-1u3w06f"><input type="number" min="1" max="8" step="0.5" class="svelte-1u3w06f"/> <span class="unit svelte-1u3w06f">px</span></div></div>`,1),KL=Vr(`<button class="btn btn-cancel svelte-1u3w06f">Cancel</button> <button class="btn btn-save svelte-1u3w06f">Save & reconnect</button>`,1),qL=Vr(`<button class="btn btn-cancel svelte-1u3w06f">Cancel</button> <button class="btn btn-save svelte-1u3w06f">Close</button>`,1),JL=Vr(`<div class="backdrop svelte-1u3w06f"></div> <div class="modal svelte-1u3w06f"><h2 class="svelte-1u3w06f">Settings</h2> <div class="tabs svelte-1u3w06f"><button>Connection</button> <button>Appearance</button></div> <!> <!> <div class="actions svelte-1u3w06f"><!></div></div>`,1),YL=Vr(`<button title="Settings" class="gear-btn svelte-1u3w06f"><!></button> <!>`,1);function XL(e,t){Ze(t,!0);let n=nn(!1),r=nn(`connection`),i=nn(H({protocol:Q.protocol,host:Q.host,port:Q.port})),a=``;function o(){V(i,{protocol:Q.protocol,host:Q.host,port:Q.port},!0),a=JSON.stringify(Q.appearance),V(r,`connection`),V(n,!0)}function s(){Q.apply({signalkProtocol:G(i).protocol,signalkHost:G(i).host,signalkPort:G(i).port,appearance:Q.appearance}),V(n,!1)}function c(){Q.apply({signalkProtocol:Q.protocol,signalkHost:Q.host,signalkPort:Q.port,appearance:JSON.parse(a)}),V(n,!1)}function l(){V(n,!1)}function u(){Q.apply({signalkProtocol:Q.protocol,signalkHost:Q.host,signalkPort:Q.port,appearance:Q.appearance})}var d=YL(),f=bn(d);Zl(U(f),{get icon(){return eu}}),N(f);var p=W(f,2),m=e=>{var t=JL(),n=bn(t),a=W(n,2),o=W(U(a),2),d=U(o);let f;var p=W(d,2);let m;N(o);var h=W(o,2),g=e=>{var t=BL(),n=W(bn(t),2),r=W(U(n),2),a=U(r),o=U(a);o.value=o.__value=`ws`;var s=W(o);s.value=s.__value=`wss`,N(a),N(r),N(n);var c=W(n,2),l=W(U(c),2),u=U(l);Oi(u),N(l),N(c);var d=W(c,2),f=W(U(d),2),p=U(f);Oi(p),N(f),N(d);var m=W(d,2),h=U(m);N(m),Bn(()=>Kr(h,`→ ${G(i).protocol??``}://${G(i).host??``}:${G(i).port??``}/signalk/v1/stream?subscribe=self`)),Si(a,()=>G(i).protocol,e=>G(i).protocol=e),Fi(u,()=>G(i).host,e=>G(i).host=e),Fi(p,()=>G(i).port,e=>G(i).port=e),Ur(e,t)};ti(h,e=>{G(r)===`connection`&&e(g)});var _=W(h,2),v=e=>{var t=GL(),n=W(bn(t),2),r=W(U(n),2),i=U(r);Oi(i),N(r),N(n);var a=W(n,2),o=W(U(a),2),s=U(o);Oi(s),Ve(2),N(o),N(a);var c=W(a,4);ai(c,16,()=>[{key:`heading`},{key:`cog`},{key:`gc`}],({key:e})=>e,(e,t)=>{let n=()=>t.key,r=Gt(()=>n()===`heading`?Q.appearance.heading:n()===`cog`?Q.appearance.cog:Q.appearance.gc);var i=WL(),a=bn(i),o=W(U(a),2),s=U(o);Oi(s),N(o),N(a);var c=W(a,2),l=W(U(c),2),d=U(l);Oi(d),Ve(2),N(l),N(c);var f=W(c,2),p=W(U(f),2),m=U(p),h=U(m);h.value=h.__value=`solid`;var g=W(h);g.value=g.__value=`dashed`;var _=W(g);_.value=_.__value=`dotted`;var v=W(_);v.value=v.__value=`dash-dot`,N(m),N(p),N(f);var y=W(f,2),b=W(U(y),2),x=U(b);Oi(x);var S=W(x,2),C=U(S);C.value=C.__value=`nm`;var w=W(C);w.value=w.__value=`min`;var T=W(w);T.value=T.__value=`px`,N(S),N(b),N(y);var E=W(y,2),D=e=>{Ur(e,VL())},O=e=>{Ur(e,HL())},k=e=>{Ur(e,UL())};ti(E,e=>{n()===`heading`?e(D):n()===`cog`?e(O,1):n()===`gc`&&e(k,2)}),Nr(`input`,s,u),Fi(s,()=>G(r).color,e=>G(r).color=e),Nr(`input`,d,u),Fi(d,()=>G(r).width,e=>G(r).width=e),Nr(`change`,m,u),Si(m,()=>G(r).style,e=>G(r).style=e),Nr(`input`,x,u),Fi(x,()=>G(r).lengthValue,e=>G(r).lengthValue=e),Nr(`change`,S,u),Si(S,()=>G(r).lengthUnit,e=>G(r).lengthUnit=e),Ur(e,i)});var l=W(c,2),d=W(U(l),2),f=U(d);Oi(f),N(d),N(l);var p=W(l,2),m=W(U(p),2),h=U(m);Oi(h),Ve(2),N(m),N(p);var g=W(p,4),_=W(U(g),2),v=U(_);Oi(v),N(_),N(g);var y=W(g,2),b=W(U(y),2),x=U(b);Oi(x),Ve(2),N(b),N(y);var S=W(y,2),C=W(U(S),2),w=U(C),T=U(w);T.value=T.__value=`solid`;var E=W(T);E.value=E.__value=`dashed`;var D=W(E);D.value=D.__value=`dotted`;var O=W(D);O.value=O.__value=`dash-dot`,N(w),N(C),N(S);var k=W(S,2),A=W(U(k),2),j=U(A);Oi(j),Ve(2),N(A),N(k);var M=W(k,4),ee=W(U(M),2),te=U(ee);Oi(te),N(ee),N(M);var ne=W(M,2),re=W(U(ne),2),ie=U(re);Oi(ie),Ve(2),N(re),N(ne),Nr(`input`,i,u),Fi(i,()=>Q.appearance.vesselColor,e=>Q.appearance.vesselColor=e),Nr(`input`,s,u),Fi(s,()=>Q.appearance.vesselSize,e=>Q.appearance.vesselSize=e),Nr(`input`,f,u),Fi(f,()=>Q.appearance.ais.vesselColor,e=>Q.appearance.ais.vesselColor=e),Nr(`input`,h,u),Fi(h,()=>Q.appearance.ais.vesselSize,e=>Q.appearance.ais.vesselSize=e),Nr(`input`,v,u),Fi(v,()=>Q.appearance.ais.cog.color,e=>Q.appearance.ais.cog.color=e),Nr(`input`,x,u),Fi(x,()=>Q.appearance.ais.cog.width,e=>Q.appearance.ais.cog.width=e),Nr(`change`,w,u),Si(w,()=>Q.appearance.ais.cog.style,e=>Q.appearance.ais.cog.style=e),Nr(`input`,j,u),Fi(j,()=>Q.appearance.ais.cog.lengthMinutes,e=>Q.appearance.ais.cog.lengthMinutes=e),Nr(`input`,te,u),Fi(te,()=>Q.appearance.ruler.color,e=>Q.appearance.ruler.color=e),Nr(`input`,ie,u),Fi(ie,()=>Q.appearance.ruler.width,e=>Q.appearance.ruler.width=e),Ur(e,t)};ti(_,e=>{G(r)===`appearance`&&e(v)});var y=W(_,2),b=U(y),x=e=>{var t=KL(),n=bn(t),r=W(n,2);Nr(`click`,n,c),Nr(`click`,r,s),Ur(e,t)},S=e=>{var t=qL(),n=bn(t),r=W(n,2);Nr(`click`,n,c),Nr(`click`,r,l),Ur(e,t)};ti(b,e=>{G(r)===`connection`?e(x):e(S,-1)}),N(y),N(a),Bn(()=>{f=_i(d,1,`tab svelte-1u3w06f`,null,f,{active:G(r)===`connection`}),m=_i(p,1,`tab svelte-1u3w06f`,null,m,{active:G(r)===`appearance`})}),Nr(`click`,n,l),Nr(`click`,d,()=>V(r,`connection`)),Nr(`click`,p,()=>V(r,`appearance`)),Ur(e,t)};ti(p,e=>{G(n)&&e(m)}),Nr(`click`,f,o),Ur(e,d),P()}Pr([`click`,`input`,`change`]);var ZL=Vr(`<li class="chart-row svelte-1mbfew2"><input type="checkbox" class="svelte-1mbfew2"/> <label class="chart-name svelte-1mbfew2"> </label></li>`),QL=Vr(`<li class="chart-row hint-row svelte-1mbfew2">Loading charts…</li>`),$L=Vr(`<li class="chart-row hint-row error svelte-1mbfew2"> </li>`),eR=Vr(`<span class="badge svelte-1mbfew2">WMS</span>`),tR=Vr(`<span class="badge svelte-1mbfew2">WMTS</span>`),nR=Vr(`<span class="chart-desc svelte-1mbfew2"> </span>`),rR=Vr(`<span class="wmts-warning svelte-1mbfew2">⚠ Cannot auto-discover tile URL (CORS). Enter template manually:</span> <div class="wmts-manual svelte-1mbfew2"><input type="text" class="wmts-input svelte-1mbfew2"/> <button class="wmts-apply svelte-1mbfew2">Apply</button></div>`,1),iR=Vr(`<span class="wmts-ok svelte-1mbfew2">✓ Custom URL active</span> <button class="wmts-clear svelte-1mbfew2">Clear</button>`,1),aR=Vr(`<option> </option>`),oR=Vr(`<label class="wmts-showall-label svelte-1mbfew2" title="Show all layers from capabilities"><input type="checkbox" class="svelte-1mbfew2"/> All</label>`),sR=Vr(`<div class="wmts-layer-row svelte-1mbfew2"><label class="wmts-layer-label svelte-1mbfew2">Layer</label> <select class="wmts-layer-select svelte-1mbfew2"></select> <!></div>`),cR=Vr(`<span class="wmts-ok svelte-1mbfew2"> </span>`),lR=Vr(`<li class="chart-row svelte-1mbfew2"><input type="checkbox" class="svelte-1mbfew2"/> <div class="chart-info svelte-1mbfew2"><label class="chart-name svelte-1mbfew2"> <!> <!></label> <!> <span class="chart-meta svelte-1mbfew2"> </span> <!></div></li>`),uR=Vr(`<div class="backdrop svelte-1mbfew2"></div> <div class="panel svelte-1mbfew2"><div class="panel-header svelte-1mbfew2"><span class="panel-title svelte-1mbfew2">Layers</span> <button class="close-btn svelte-1mbfew2" title="Close">✕</button></div> <ul class="chart-list svelte-1mbfew2"><!> <!></ul></div>`,1),dR=Vr(`<button title="Charts"><!></button> <!>`,1);function fR(e,t){Ze(t,!0);let n=nn(!1),r=H({});function i(){V(n,!G(n))}function a(){V(n,!1)}function o(e){Vu.setOverride(e,r[e]??``)}var s=dR(),c=bn(s);let l;Zl(U(c),{get icon(){return au}}),N(c);var u=W(c,2),d=e=>{var t=uR(),n=bn(t),i=W(n,2),s=U(i),c=W(U(s),2);N(s);var l=W(s,2),u=U(l);ai(u,17,()=>Hu,e=>e.id,(e,t)=>{var n=ZL(),r=U(n);Oi(r);var i=W(r,2),a=U(i,!0);N(i),N(n),Bn(e=>{ji(r,`id`,`base-${G(t).id??``}`),Ai(r,e),ji(i,`for`,`base-${G(t).id??``}`),Kr(a,G(t).name)},[()=>Ku.enabled.has(G(t).id)]),Nr(`change`,r,()=>{Ku.toggle(G(t).id)}),Ur(e,n)});var d=W(u,2),f=e=>{Ur(e,QL())},p=e=>{var t=$L(),n=U(t);N(t),Bn(()=>Kr(n,`⚠ ${Vu.error??``}`)),Ur(e,t)},m=e=>{var t=Hr();ai(bn(t),17,()=>Object.entries(Vu.available),([e,t])=>e,(e,t)=>{var n=Gt(()=>k(G(t),2));let i=()=>G(n)[0],a=()=>G(n)[1];var s=lR(),c=U(s);Oi(c);var l=W(c,2),u=U(l),d=U(u),f=W(d),p=e=>{Ur(e,eR())};ti(f,e=>{a().type===`WMS`&&e(p)});var m=W(f,2),h=e=>{Ur(e,tR())};ti(m,e=>{a().type===`WMTS`&&e(h)}),N(u);var g=W(u,2),_=e=>{var t=nR(),n=U(t,!0);N(t),Bn(()=>Kr(n,a().description)),Ur(e,t)};ti(g,e=>{a().description&&e(_)});var v=W(g,2),y=U(v);N(v);var b=W(v,2),x=e=>{var t=rR(),n=W(bn(t),2),a=U(n);Oi(a),ji(a,`placeholder`,`https://…/{z}/{x}/{y}.png`);var s=W(a,2);N(n),Bn(e=>ki(a,e),[()=>r[i()]??Vu.getOverride(i())]),Nr(`input`,a,e=>{r[i()]=e.target.value}),Nr(`keydown`,a,e=>{e.key===`Enter`&&o(i())}),Nr(`click`,s,()=>o(i())),Ur(e,t)},S=Gt(()=>Vu.needsManualUrl(i())),C=e=>{var t=iR();Nr(`click`,W(bn(t),2),()=>{Vu.setOverride(i(),``),r[i()]=``}),Ur(e,t)},w=Gt(()=>a().type===`WMTS`&&Vu.getOverride(i())),T=e=>{var t=Hr(),n=bn(t),r=e=>{var t=sR(),n=U(t),r=W(n,2);ai(r,21,()=>Vu.visibleLayers(i()),e=>e.id,(e,t)=>{var n=aR(),r=U(n,!0);N(n);var i={};Bn(()=>{Kr(r,G(t).title),i!==(i=G(t).id)&&(n.value=(n.__value=G(t).id)??``)}),Ur(e,n)}),N(r);var a;xi(r);var o=W(r,2),s=e=>{var t=oR(),n=U(t);Oi(n),Ve(),N(t),Bn(e=>Ai(n,e),[()=>Vu.isShowingAll(i())]),Nr(`change`,n,()=>Vu.toggleShowAll(i())),Ur(e,t)},c=Gt(()=>Vu.hasFilter(i()));ti(o,e=>{G(c)&&e(s)}),N(t),Bn(e=>{ji(n,`for`,`wmts-layer-${i()??``}`),ji(r,`id`,`wmts-layer-${i()??``}`),a!==(a=e)&&(r.value=(r.__value=e)??``,bi(r,e))},[()=>Vu.getLayerSel(i())]),Nr(`change`,r,e=>{Vu.selectLayer(i(),e.target.value)}),Ur(e,t)},a=Gt(()=>Vu.visibleLayers(i()).length>1),o=e=>{var t=cR(),n=U(t);N(t),Bn(e=>Kr(n,`Layer: ${e??``}`),[()=>Vu.visibleLayers(i())[0]?.title]),Ur(e,t)},s=Gt(()=>Vu.visibleLayers(i()).length===1);ti(n,e=>{G(a)?e(r):G(s)&&e(o,1)}),Ur(e,t)};ti(b,e=>{G(S)?e(x):G(w)?e(C,1):a().type===`WMTS`&&e(T,2)}),N(l),N(s),Bn((e,t,n,r)=>{ji(c,`id`,`cp-chart-${i()??``}`),Ai(c,e),c.disabled=t,ji(u,`for`,`cp-chart-${i()??``}`),Kr(d,`${a().name??``} `),Kr(y,`${n??``}${r??``}`)},[()=>Vu.selected.has(i()),()=>Vu.needsManualUrl(i()),()=>a().format.toUpperCase(),()=>a().scale?` · 1:${a().scale.toLocaleString()}`:``]),Nr(`change`,c,()=>{Vu.toggle(i())}),Ur(e,s)}),Ur(e,t)};ti(d,e=>{Vu.loading?e(f):Vu.error?e(p,1):e(m,-1)}),N(l),N(i),Nr(`click`,n,a),Nr(`keydown`,n,a),Nr(`click`,c,a),Ur(e,t)};ti(u,e=>{G(n)&&e(d)}),Bn(()=>l=_i(c,1,`charts-btn svelte-1mbfew2`,null,l,{active:G(n)})),Nr(`click`,c,i),Ur(e,s),P()}Pr([`click`,`keydown`,`change`,`input`]);var pR=Vr(`<span style="color: #f87171"> </span>`),mR=Vr(`<div style="position: relative; width: 100%; height: 100%;"><!> <!> <!> <div style="
|
|
4487
4487
|
position: absolute; top: 10px; left: 10px; z-index: 10;
|
|
4488
4488
|
background: rgba(0,0,0,0.7); color: white;
|
|
4489
4489
|
padding: 6px 12px; border-radius: 6px; font: 12px monospace;
|
package/public/favicon.png
CHANGED
|
Binary file
|
package/public/icon-192.png
CHANGED
|
Binary file
|
package/public/icon-512.png
CHANGED
|
Binary file
|
package/public/index.html
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
11
11
|
html, body, #app { width: 100%; height: 100%; overflow: hidden; }
|
|
12
12
|
</style>
|
|
13
|
-
<script type="module" crossorigin src="./assets/index-
|
|
13
|
+
<script type="module" crossorigin src="./assets/index-spfsXYTQ.js"></script>
|
|
14
14
|
<link rel="stylesheet" crossorigin href="./assets/index-DBxFB3St.css">
|
|
15
15
|
<script id="vite-plugin-pwa:register-sw" src="./registerSW.js"></script></head>
|
|
16
16
|
<body>
|
package/public/sw.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,r)=>{const l=e||("document"in self?document.currentScript.src:"")||location.href;if(s[l])return;let o={};const t=e=>i(e,l),c={module:{uri:l},exports:o,require:t};s[l]=Promise.all(n.map(e=>c[e]||t(e))).then(e=>(r(...e),o))}}define(["./workbox-9c191d2f"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"registerSW.js",revision:"402b66900e731ca748771b6fc5e7a068"},{url:"index.html",revision:"
|
|
1
|
+
if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,r)=>{const l=e||("document"in self?document.currentScript.src:"")||location.href;if(s[l])return;let o={};const t=e=>i(e,l),c={module:{uri:l},exports:o,require:t};s[l]=Promise.all(n.map(e=>c[e]||t(e))).then(e=>(r(...e),o))}}define(["./workbox-9c191d2f"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"registerSW.js",revision:"402b66900e731ca748771b6fc5e7a068"},{url:"index.html",revision:"e894ef681df89c199bd1e125914a9668"},{url:"icon-512.png",revision:"0657088dc11293c0b742467b3d9aa0e6"},{url:"icon-192.png",revision:"63ee319f3a9e92cea460048feeeacc26"},{url:"favicon.png",revision:"8a0854348265db4022235b1c95e57bbd"},{url:"assets/signalk_chart_core_bg-leOhlBKH.wasm",revision:null},{url:"assets/signalk.worker-dgQh6yBR.js",revision:null},{url:"assets/index-spfsXYTQ.js",revision:null},{url:"assets/index-DBxFB3St.css",revision:null}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/tiles\//,/^\/signalk\//,/^\/v1\//]}))});
|