winga-chart-plotter-signalk 0.4.0 → 0.5.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.
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.projection-picker.svelte-c20cna{z-index:10;flex-direction:column;align-items:flex-start;gap:3px;display:flex;position:absolute;top:200px;left:10px}.proj-btn.svelte-c20cna{color:#fff;cursor:pointer;background:#000000b3;border:none;border-radius:6px;padding:6px 10px;font-size:16px;transition:background .15s}.proj-btn.svelte-c20cna:hover{background:#282850e6}.proj-btn--manual.svelte-c20cna{color:#f59e0b}.north-indicator.svelte-c20cna{z-index:10;cursor:pointer;opacity:0;pointer-events:none;background:0 0;border:none;border-radius:50%;padding:0;transition:opacity .3s;position:absolute;top:80px;right:10px}.north-indicator--visible.svelte-c20cna{opacity:1;pointer-events:auto}.north-indicator.svelte-c20cna:hover circle:where(.svelte-c20cna){fill:#1e1e46d9}.ais-popup{color:#e0e0f0;min-width:180px;font-family:system-ui,sans-serif;font-size:12px}.ais-popup-title{color:#f59e0b;border-bottom:1px solid #444;margin-bottom:8px;padding-bottom:5px;font-size:13px;font-weight:600}.ais-popup table{border-collapse:collapse;width:100%}.ais-popup td{vertical-align:top;padding:2px 6px 2px 0}.ais-popup td:first-child{color:#888;white-space:nowrap;padding-right:12px}.ais-section{color:#666;text-transform:uppercase;letter-spacing:.08em;padding-top:8px;font-size:10px;font-weight:600}.ais-links{border-top:1px solid #333;gap:8px;margin-top:8px;padding-top:8px;display:flex}.ais-links a{color:#60a5fa;text-align:center;background:#60a5fa1a;border-radius:4px;flex:1;padding:3px 0;font-size:11px;text-decoration:none}.ais-links a:hover{background:#60a5fa33}.maplibregl-popup-content{background:#1e1e2e;border-radius:8px;padding:12px 14px;box-shadow:0 4px 20px #0009}.ais-disambig-list{margin:0;padding:0;list-style:none}.ais-disambig-item{cursor:pointer;color:#e0e0f0;white-space:nowrap;border-radius:4px;padding:6px 8px;font-size:12px;transition:background .12s}.ais-disambig-item:hover{color:#93c5fd;background:#60a5fa2e}.maplibregl-popup-tip{border-top-color:#1e1e2e}.maplibregl-popup-close-button{color:#888;font-size:16px}.maplibregl-popup{z-index:10}.gear-btn.svelte-1u3w06f{z-index:10;color:#fff;cursor:pointer;background:#000000b3;border:none;border-radius:6px;padding:6px 10px;font-size:16px;position:absolute;top:44px;left:10px}.backdrop.svelte-1u3w06f{z-index:20;background:#00000080;position:fixed;inset:0}.modal.svelte-1u3w06f{z-index:21;color:#fff;background:#1e1e2e;border-radius:10px;min-width:440px;max-height:90vh;padding:24px;font-family:system-ui,sans-serif;position:fixed;top:50%;left:50%;overflow-y:auto;transform:translate(-50%,-50%);box-shadow:0 8px 32px #00000080}h2.svelte-1u3w06f{margin:0 0 16px;font-size:16px;font-weight:600}.tabs.svelte-1u3w06f{border-bottom:1px solid #335;margin-bottom:20px;display:flex}.tab.svelte-1u3w06f{color:#a0a0c0;cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-1px;padding:8px 18px;font-size:13px}.tab.active.svelte-1u3w06f{color:#fff;border-bottom-color:#4a6cf7}.section-title.svelte-1u3w06f{color:#668;text-transform:uppercase;letter-spacing:.08em;margin:16px 0 10px;font-size:11px;font-weight:600}.row.svelte-1u3w06f{align-items:center;gap:12px;margin-bottom:10px;display:flex}.row.svelte-1u3w06f>label:where(.svelte-1u3w06f){color:#a0a0c0;flex-shrink:0;width:72px;font-size:13px}.field.svelte-1u3w06f{flex:1;align-items:center;gap:8px;display:flex}.unit.svelte-1u3w06f{color:#668;font-size:12px}.hint.svelte-1u3w06f{color:#668;word-break:break-all;margin:2px 0 12px 84px;font-size:11px}input[type=text].svelte-1u3w06f,input[type=number].svelte-1u3w06f,select.svelte-1u3w06f{color:#fff;box-sizing:border-box;background:#2a2a3e;border:1px solid #446;border-radius:6px;padding:6px 8px;font-size:13px}input[type=text].svelte-1u3w06f{flex:1}input[type=number].svelte-1u3w06f{-moz-appearance:textfield;width:80px}select.svelte-1u3w06f{cursor:pointer}input[type=color].svelte-1u3w06f{cursor:pointer;background:0 0;border:1px solid #446;border-radius:6px;width:40px;height:30px;padding:2px}.actions.svelte-1u3w06f{justify-content:flex-end;gap:10px;margin-top:24px;display:flex}.btn.svelte-1u3w06f{cursor:pointer;border-radius:6px;padding:7px 16px;font-size:13px}.btn-cancel.svelte-1u3w06f{color:#a0a0c0;background:0 0;border:1px solid #446}.btn-save.svelte-1u3w06f{color:#fff;background:#4a6cf7;border:none}.fps-field.svelte-1u3w06f{flex:1;align-items:center;gap:8px;display:flex}.fps-slider.svelte-1u3w06f{cursor:pointer;flex:1;min-width:100px}.fps-target.svelte-1u3w06f{text-align:right;font-variant-numeric:tabular-nums;min-width:5rem;font-size:13px}.fps-actual.svelte-1u3w06f{color:#668;text-align:right;font-variant-numeric:tabular-nums;min-width:3.5rem;font-size:11px}.charts-btn.svelte-1mbfew2{z-index:10;color:#fff;cursor:pointer;background:#000000b3;border:none;border-radius:6px;padding:6px 10px;font-size:16px;transition:background .15s;position:absolute;top:80px;left:10px}.charts-btn.svelte-1mbfew2:hover{background:#282850e6}.charts-btn.active.svelte-1mbfew2{background:#2563ebd9;border:1px solid #3b82f6}.backdrop.svelte-1mbfew2{z-index:20;position:fixed;inset:0}.panel.svelte-1mbfew2{z-index:21;color:#fff;background:#1e1e2e;border-radius:10px;flex-direction:column;min-width:280px;max-width:360px;max-height:70vh;padding:0;font-family:system-ui,sans-serif;display:flex;position:absolute;top:44px;left:50px;overflow:hidden;box-shadow:0 8px 32px #00000080}.panel-header.svelte-1mbfew2{border-bottom:1px solid #2a2a3e;flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 16px 10px;display:flex}.panel-title.svelte-1mbfew2{color:#fff;text-transform:uppercase;letter-spacing:.06em;font-size:13px;font-weight:600}.close-btn.svelte-1mbfew2{color:#668;cursor:pointer;background:0 0;border:none;padding:0 2px;font-size:14px}.close-btn.svelte-1mbfew2:hover{color:#fff}.hint-row.svelte-1mbfew2{color:#668;padding:10px 16px;font-size:12px;list-style:none}.hint-row.error.svelte-1mbfew2{color:#f87171}.chart-list.svelte-1mbfew2{margin:0;padding:0;list-style:none;overflow-y:auto}.chart-row.svelte-1mbfew2{border-bottom:1px solid #2a2a3e;align-items:flex-start;gap:10px;padding:10px 16px;display:flex}.chart-row.svelte-1mbfew2:last-child{border-bottom:none}.chart-row.svelte-1mbfew2 input[type=checkbox]:where(.svelte-1mbfew2){cursor:pointer;flex-shrink:0;margin-top:3px}.chart-info.svelte-1mbfew2{flex-direction:column;gap:2px;min-width:0;display:flex}.chart-name.svelte-1mbfew2{color:#fff;cursor:pointer;flex-wrap:wrap;align-items:center;gap:6px;font-size:13px;display:flex}.chart-desc.svelte-1mbfew2{color:#a0a0c0;font-size:11px}.chart-meta.svelte-1mbfew2{color:#668;font-size:11px}.badge.svelte-1mbfew2{color:#7b8cde;text-transform:uppercase;letter-spacing:.05em;background:#2a2a4e;border-radius:4px;padding:1px 5px;font-size:9px;font-weight:700}.wmts-warning.svelte-1mbfew2{color:#f59e0b;margin-top:4px;font-size:11px}.wmts-manual.svelte-1mbfew2{gap:6px;margin-top:4px;display:flex}.wmts-input.svelte-1mbfew2{color:#fff;background:#2a2a3e;border:1px solid #446;border-radius:4px;flex:1;min-width:0;padding:3px 6px;font-size:11px}.wmts-apply.svelte-1mbfew2{color:#fff;cursor:pointer;white-space:nowrap;background:#2563eb;border:none;border-radius:4px;padding:3px 8px;font-size:11px}.wmts-apply.svelte-1mbfew2:hover{background:#1d4ed8}.wmts-ok.svelte-1mbfew2{color:#34d399;margin-top:2px;font-size:11px}.wmts-clear.svelte-1mbfew2{color:#668;cursor:pointer;background:0 0;border:1px solid #446;border-radius:4px;align-self:flex-start;margin-top:2px;padding:1px 6px;font-size:10px}.wmts-clear.svelte-1mbfew2:hover{color:#f87171;border-color:#f87171}.wmts-layer-row.svelte-1mbfew2{align-items:center;gap:6px;margin-top:4px;display:flex}.wmts-layer-label.svelte-1mbfew2{color:#668;flex-shrink:0;font-size:11px}.wmts-layer-select.svelte-1mbfew2{color:#fff;cursor:pointer;background:#2a2a3e;border:1px solid #446;border-radius:4px;flex:1;padding:2px 4px;font-size:11px}.wmts-showall-label.svelte-1mbfew2{color:#668;cursor:pointer;white-space:nowrap;flex-shrink:0;align-items:center;gap:3px;font-size:11px;display:flex}.wmts-showall-label.svelte-1mbfew2:hover{color:#a0a0c0}
|
|
@@ -3445,13 +3445,13 @@ isInside = step(-1.0, vPathPosition.x) * step(vPathPosition.x, 1.0);
|
|
|
3445
3445
|
if (isInside == 0.0) {
|
|
3446
3446
|
discard;
|
|
3447
3447
|
}
|
|
3448
|
-
`}},aL={getDashArray:{type:`accessor`,value:[0,0]},getOffset:{type:`accessor`,value:0},dashJustified:!1,dashGapPickable:!1},oL=class extends FP{constructor({dash:e=!1,offset:t=!1,highPrecisionDash:n=!1}={}){super({dash:e||n,offset:t,highPrecisionDash:n})}getLayerType(e){if(`pathTesselator`in e.state)return`path`;let t=e.constructor.layerName;return t===`ScatterplotLayer`?`scatterplot`:t===`TextBackgroundLayer`?`textBackground`:null}isEnabled(e){return this.getLayerType(e)!==null}getShaders(e){let t=e.getLayerType(this);if(!t)return null;if(t===`scatterplot`||t===`textBackground`)return e.opts.dash?{modules:[{name:`pathStyle`,inject:t===`scatterplot`?nL.inject:rL.inject,uniformTypes:{dashGapPickable:`i32`}}]}:null;let n={},r={};e.opts.dash&&(n=RN(n,tL),e.opts.highPrecisionDash&&(r.HIGH_PRECISION_DASH=!0)),e.opts.offset&&(n=RN(n,iL));let{inject:i}=n;return{modules:[{name:`pathStyle`,inject:i,uniformTypes:{dashAlignMode:`f32`,dashGapPickable:`i32`}}],defines:r}}initializeState(e,t){let n=this.getAttributeManager(),r=t.getLayerType(this);!n||!r||(t.opts.dash&&n.addInstanced({instanceDashArrays:{size:2,accessor:`getDashArray`},...r===`path`&&t.opts.highPrecisionDash?{instanceDashOffsets:{size:1,accessor:`getPath`,transform:t.getDashOffsets.bind(this)}}:{}}),r===`path`&&t.opts.offset&&n.addInstanced({instanceOffsets:{size:1,accessor:`getOffset`}}))}updateState(e,t){if(t.isEnabled(this)&&t.opts.dash){let e=t.getLayerType(this);if(e===`scatterplot`||e===`textBackground`){let e={dashGapPickable:!!this.props.dashGapPickable};this.setShaderModuleProps({pathStyle:e})}else{let e={dashAlignMode:+!!this.props.dashJustified,dashGapPickable:!!this.props.dashGapPickable};this.setShaderModuleProps({pathStyle:e})}}}getDashOffsets(e){let t=[0],n=this.props.positionFormat===`XY`?2:3,r=Array.isArray(e[0]),i=r?e.length:e.length/n,a,o;for(let s=0;s<i-1;s++)a=r?e[s]:e.slice(s*n,s*n+n),a=this.projectPosition(a),s>0&&(t[s]=t[s-1]+ev(o,a)),o=a;return t[i-1]=0,t}};oL.defaultProps=aL,oL.extensionName=`PathStyleExtension`;function sL(e,t,n,r){let i=t*Math.PI/180,a=r*Math.PI/180,o=(n-e)*Math.PI/180,s=Math.sin(o)*Math.cos(a),c=Math.cos(i)*Math.sin(a)-Math.sin(i)*Math.cos(a)*Math.cos(o);return(Math.atan2(s,c)*180/Math.PI+360)%360}function cL(e,t,n,r){let i=t*Math.PI/180,a=r*Math.PI/180,o=(r-t)*Math.PI/180,s=(n-e)*Math.PI/180,c=Math.sin(o/2)**2+Math.cos(i)*Math.cos(a)*Math.sin(s/2)**2;return 2*Math.atan2(Math.sqrt(c),Math.sqrt(1-c))*3440.065}function lL(e,t,n,r,i=64){let a=t*Math.PI/180,o=e*Math.PI/180,s=r*Math.PI/180,c=n*Math.PI/180,l=2*Math.asin(Math.sqrt(Math.sin((s-a)/2)**2+Math.cos(a)*Math.cos(s)*Math.sin((c-o)/2)**2));if(l<1e-10)return[[e,t],[n,r]];let u=[],d=o;for(let e=0;e<=i;e++){let t=e/i,n=Math.sin((1-t)*l)/Math.sin(l),r=Math.sin(t*l)/Math.sin(l),f=n*Math.cos(a)*Math.cos(o)+r*Math.cos(s)*Math.cos(c),p=n*Math.cos(a)*Math.sin(o)+r*Math.cos(s)*Math.sin(c),m=n*Math.sin(a)+r*Math.sin(s),h=Math.atan2(m,Math.sqrt(f*f+p*p)),g=Math.atan2(p,f)-d,_=d+g-Math.round(g/(2*Math.PI))*2*Math.PI;d=_,u.push([_*180/Math.PI,h*180/Math.PI])}return u}function uL(e){return sL(e.a.lon,e.a.lat,e.b.lon,e.b.lat).toFixed(0).padStart(3,`0`)+`° T`}function dL(e){let t=cL(e.a.lon,e.a.lat,e.b.lon,e.b.lat);return(t<10?t.toFixed(2):t.toFixed(1))+` NM`}function fL(){return Math.random().toString(36).slice(2,9)}function pL(){let e=P(ln([]));return{get rulers(){return B(e)},add(t,n,r,i){F(e,[...B(e),{id:fL(),a:{lon:t,lat:n},b:{lon:r,lat:i}}],!0)},remove(t){F(e,B(e).filter(e=>e.id!==t),!0)},moveEndpoint(t,n,r,i){F(e,B(e).map(e=>{if(e.id!==t)return e;let a={lon:r,lat:i};return{...e,[n]:a}}),!0)},snapEndpoint(t,n,r,i,a){F(e,B(e).map(e=>{if(e.id!==t)return e;let o=r?{lon:i,lat:a,snapId:r}:{lon:i,lat:a};return{...e,[n]:o}}),!0)},syncSnapped(t){let n=new Map(t.map(e=>[e.id,e])),r=!1,i=B(e).map(e=>{let{a:t,b:i}=e;if(t.snapId){let e=n.get(t.snapId);e?.position&&(e.position.longitude!==t.lon||e.position.latitude!==t.lat)&&(t={...t,lon:e.position.longitude,lat:e.position.latitude},r=!0)}if(i.snapId){let e=n.get(i.snapId);e?.position&&(e.position.longitude!==i.lon||e.position.latitude!==i.lat)&&(i={...i,lon:e.position.longitude,lat:e.position.latitude},r=!0)}return r?{...e,a:t,b:i}:e});r&&F(e,i,!0)}}}var mL=pL();async function
|
|
3448
|
+
`}},aL={getDashArray:{type:`accessor`,value:[0,0]},getOffset:{type:`accessor`,value:0},dashJustified:!1,dashGapPickable:!1},oL=class extends FP{constructor({dash:e=!1,offset:t=!1,highPrecisionDash:n=!1}={}){super({dash:e||n,offset:t,highPrecisionDash:n})}getLayerType(e){if(`pathTesselator`in e.state)return`path`;let t=e.constructor.layerName;return t===`ScatterplotLayer`?`scatterplot`:t===`TextBackgroundLayer`?`textBackground`:null}isEnabled(e){return this.getLayerType(e)!==null}getShaders(e){let t=e.getLayerType(this);if(!t)return null;if(t===`scatterplot`||t===`textBackground`)return e.opts.dash?{modules:[{name:`pathStyle`,inject:t===`scatterplot`?nL.inject:rL.inject,uniformTypes:{dashGapPickable:`i32`}}]}:null;let n={},r={};e.opts.dash&&(n=RN(n,tL),e.opts.highPrecisionDash&&(r.HIGH_PRECISION_DASH=!0)),e.opts.offset&&(n=RN(n,iL));let{inject:i}=n;return{modules:[{name:`pathStyle`,inject:i,uniformTypes:{dashAlignMode:`f32`,dashGapPickable:`i32`}}],defines:r}}initializeState(e,t){let n=this.getAttributeManager(),r=t.getLayerType(this);!n||!r||(t.opts.dash&&n.addInstanced({instanceDashArrays:{size:2,accessor:`getDashArray`},...r===`path`&&t.opts.highPrecisionDash?{instanceDashOffsets:{size:1,accessor:`getPath`,transform:t.getDashOffsets.bind(this)}}:{}}),r===`path`&&t.opts.offset&&n.addInstanced({instanceOffsets:{size:1,accessor:`getOffset`}}))}updateState(e,t){if(t.isEnabled(this)&&t.opts.dash){let e=t.getLayerType(this);if(e===`scatterplot`||e===`textBackground`){let e={dashGapPickable:!!this.props.dashGapPickable};this.setShaderModuleProps({pathStyle:e})}else{let e={dashAlignMode:+!!this.props.dashJustified,dashGapPickable:!!this.props.dashGapPickable};this.setShaderModuleProps({pathStyle:e})}}}getDashOffsets(e){let t=[0],n=this.props.positionFormat===`XY`?2:3,r=Array.isArray(e[0]),i=r?e.length:e.length/n,a,o;for(let s=0;s<i-1;s++)a=r?e[s]:e.slice(s*n,s*n+n),a=this.projectPosition(a),s>0&&(t[s]=t[s-1]+ev(o,a)),o=a;return t[i-1]=0,t}};oL.defaultProps=aL,oL.extensionName=`PathStyleExtension`;function sL(e,t,n,r){let i=t*Math.PI/180,a=r*Math.PI/180,o=(n-e)*Math.PI/180,s=Math.sin(o)*Math.cos(a),c=Math.cos(i)*Math.sin(a)-Math.sin(i)*Math.cos(a)*Math.cos(o);return(Math.atan2(s,c)*180/Math.PI+360)%360}function cL(e,t,n,r){let i=t*Math.PI/180,a=r*Math.PI/180,o=(r-t)*Math.PI/180,s=(n-e)*Math.PI/180,c=Math.sin(o/2)**2+Math.cos(i)*Math.cos(a)*Math.sin(s/2)**2;return 2*Math.atan2(Math.sqrt(c),Math.sqrt(1-c))*3440.065}function lL(e,t,n,r,i=64){let a=t*Math.PI/180,o=e*Math.PI/180,s=r*Math.PI/180,c=n*Math.PI/180,l=2*Math.asin(Math.sqrt(Math.sin((s-a)/2)**2+Math.cos(a)*Math.cos(s)*Math.sin((c-o)/2)**2));if(l<1e-10)return[[e,t],[n,r]];let u=[],d=o;for(let e=0;e<=i;e++){let t=e/i,n=Math.sin((1-t)*l)/Math.sin(l),r=Math.sin(t*l)/Math.sin(l),f=n*Math.cos(a)*Math.cos(o)+r*Math.cos(s)*Math.cos(c),p=n*Math.cos(a)*Math.sin(o)+r*Math.cos(s)*Math.sin(c),m=n*Math.sin(a)+r*Math.sin(s),h=Math.atan2(m,Math.sqrt(f*f+p*p)),g=Math.atan2(p,f)-d,_=d+g-Math.round(g/(2*Math.PI))*2*Math.PI;d=_,u.push([_*180/Math.PI,h*180/Math.PI])}return u}function uL(e){return sL(e.a.lon,e.a.lat,e.b.lon,e.b.lat).toFixed(0).padStart(3,`0`)+`° T`}function dL(e){let t=cL(e.a.lon,e.a.lat,e.b.lon,e.b.lat);return(t<10?t.toFixed(2):t.toFixed(1))+` NM`}function fL(){return Math.random().toString(36).slice(2,9)}function pL(){let e=P(ln([]));return{get rulers(){return B(e)},add(t,n,r,i){F(e,[...B(e),{id:fL(),a:{lon:t,lat:n},b:{lon:r,lat:i}}],!0)},remove(t){F(e,B(e).filter(e=>e.id!==t),!0)},moveEndpoint(t,n,r,i){F(e,B(e).map(e=>{if(e.id!==t)return e;let a={lon:r,lat:i};return{...e,[n]:a}}),!0)},snapEndpoint(t,n,r,i,a){F(e,B(e).map(e=>{if(e.id!==t)return e;let o=r?{lon:i,lat:a,snapId:r}:{lon:i,lat:a};return{...e,[n]:o}}),!0)},syncSnapped(t){let n=new Map(t.map(e=>[e.id,e])),r=!1,i=B(e).map(e=>{let{a:t,b:i}=e;if(t.snapId){let e=n.get(t.snapId);e?.position&&(e.position.longitude!==t.lon||e.position.latitude!==t.lat)&&(t={...t,lon:e.position.longitude,lat:e.position.latitude},r=!0)}if(i.snapId){let e=n.get(i.snapId);e?.position&&(e.position.longitude!==i.lon||e.position.latitude!==i.lat)&&(i={...i,lon:e.position.longitude,lat:e.position.latitude},r=!0)}return r?{...e,a:t,b:i}:e});r&&F(e,i,!0)}}}var mL=pL(),hL={"Open Sans Regular":`Roboto Regular`,"Open Sans Bold":`Roboto Bold`,"Open Sans SemiBold":`Roboto Medium`,"Open Sans Italic":`Roboto Italic`,"Open Sans Bold Italic":`Roboto Bold`,"Arial Unicode MS Regular":`Roboto Regular`,"Arial Unicode MS Bold":`Roboto Bold`,"Arial Unicode MS":`Roboto Regular`};function gL(e){if(typeof e==`string`)return hL[e]??e;if(Array.isArray(e))return e.map(gL);if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=gL(r);return t}return e}async function _L(e){let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch style ${e}: ${t.status} ${t.statusText}`);let n=gL(await t.json()),r=n.schema,i=new Map;if(r)for(let[e,t]of Object.entries(r))i.set(e,t.default);let a=yL(n,i),o=a.sources,s=new Set;if(o)for(let[e,t]of Object.entries(o))typeof t.url==`string`&&t.url.startsWith(`mapbox://`)&&(s.add(e),delete o[e]);return Array.isArray(a.layers)&&(a.layers=a.layers.filter(e=>e.type!==`slot`&&!s.has(e.source))),a}var vL=new Set([`pitch`,`distance-from-center`]);function yL(e,t){if(!Array.isArray(e)){if(typeof e==`object`&&e){let n={};for(let[r,i]of Object.entries(e))n[r]=yL(i,t);return n}return e}let n=e[0];return n===`config`&&e.length===2&&typeof e[1]==`string`?t.has(e[1])?t.get(e[1]):null:typeof n==`string`&&vL.has(n)&&e.length===1?0:bL(e.map(e=>yL(e,t)))}function bL(e){let t=e[0];if(typeof t!=`string`)return e;if(t.includes(` `)&&e.every(e=>typeof e==`string`))return[`literal`,e];if(e.length<2)return e;let n=e.slice(1);if(n.every(e=>typeof e==`number`)){let r=n;switch(t){case`*`:return r.reduce((e,t)=>e*t);case`/`:return r.length===2&&r[1]!==0?r[0]/r[1]:e;case`+`:return r.reduce((e,t)=>e+t);case`-`:return r.length===2?r[0]-r[1]:e;case`^`:return r.length===2?r[0]**+r[1]:e;case`min`:return Math.min(...r);case`max`:return Math.max(...r);case`abs`:return r.length===1?Math.abs(r[0]):e;case`ceil`:return r.length===1?Math.ceil(r[0]):e;case`floor`:return r.length===1?Math.floor(r[0]):e;case`round`:return r.length===1?Math.round(r[0]):e}}if(t===`coalesce`){let e=n.find(e=>e!=null);if(e!==void 0)return e}if(t===`step`){let t=[...e];for(let e=2;e<t.length;e+=2)t[e]=xL(t[e]);return t}if(t===`match`){let t=[...e];for(let e=3;e<t.length-1;e+=2)t[e]=xL(t[e]);return t[t.length-1]=xL(t[t.length-1]),t}if(t===`case`){let t=[...e];for(let e=2;e<t.length-1;e+=2)t[e]=xL(t[e]);return t[t.length-1]=xL(t[t.length-1]),t}return e}function xL(e){return Array.isArray(e)&&e.length>0&&e.every(e=>typeof e==`string`)&&typeof e[0]==`string`&&e[0].includes(` `)?[`literal`,e]:e}var SL=`uniform aisHullUniforms {
|
|
3449
3449
|
float timeSinceUpload;
|
|
3450
3450
|
float zoom;
|
|
3451
3451
|
float settingsIconSize;
|
|
3452
3452
|
float opacity;
|
|
3453
3453
|
} aisHull;
|
|
3454
|
-
`,
|
|
3454
|
+
`,CL={name:`aisHull`,vs:SL,fs:SL,uniformTypes:{timeSinceUpload:`f32`,zoom:`f32`,settingsIconSize:`f32`,opacity:`f32`}},wL=`#version 300 es
|
|
3455
3455
|
#define SHADER_NAME ais-hull-layer-vertex-shader
|
|
3456
3456
|
|
|
3457
3457
|
in vec3 positions; // hull vertex in local space (X=sb, Y=bow, unit [-1,1])
|
|
@@ -3564,7 +3564,7 @@ void main(void) {
|
|
|
3564
3564
|
geometry.pickingColor = instancePickingColors;
|
|
3565
3565
|
DECKGL_FILTER_COLOR(vColor, geometry);
|
|
3566
3566
|
}
|
|
3567
|
-
`,
|
|
3567
|
+
`,TL=`#version 300 es
|
|
3568
3568
|
precision highp float;
|
|
3569
3569
|
#define SHADER_NAME ais-hull-layer-fragment-shader
|
|
3570
3570
|
|
|
@@ -3575,7 +3575,7 @@ void main(void) {
|
|
|
3575
3575
|
fragColor = vColor;
|
|
3576
3576
|
DECKGL_FILTER_COLOR(fragColor, geometry);
|
|
3577
3577
|
}
|
|
3578
|
-
`,
|
|
3578
|
+
`,EL=new Float32Array([0,1,0,1,.6,0,1,-1,0,0,1,0,1,-1,0,-1,-1,0,0,1,0,-1,-1,0,-1,.6,0]),DL=9,OL={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:50},getBeam:{type:`accessor`,value:10},getColor:{type:`accessor`,value:[0,100,200,220]},uploadTimestamp:0,selfAnimate:!1,settingsIconSize:1,opacity:1},kL=class extends xP{static layerName=`AisHullLayer`;static defaultProps=OL;getShaders(){return super.getShaders({vs:wL,fs:TL,modules:[lw,tT,CL]})}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:50},instanceBeam:{size:1,accessor:`getBeam`,defaultValue:10},instanceColor:{size:4,type:`unorm8`,accessor:`getColor`,defaultValue:[0,100,200,220]}})}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({aisHull:{timeSinceUpload:a,zoom:o,settingsIconSize:r??1,opacity:i??1}}),s.draw(this.context.renderPass),n&&this.setNeedsRedraw()}_getModel(){return new cD(this.context.device,{...this.getShaders(),id:this.props.id,bufferLayout:this.getAttributeManager().getBufferLayouts(),geometry:new dD({topology:`triangle-list`,attributes:{positions:{size:3,value:EL}},vertexCount:DL}),isInstanced:!0})}},AL=`#version 300 es
|
|
3579
3579
|
#define SHADER_NAME ais-hull-decoration-vertex-shader
|
|
3580
3580
|
|
|
3581
3581
|
in vec3 positions;
|
|
@@ -3636,7 +3636,7 @@ void main(void) {
|
|
|
3636
3636
|
float t01 = clamp((aisHull.zoom - transitionZoom + 1.0) / 2.0, 0.0, 1.0);
|
|
3637
3637
|
vOpacity = t01;
|
|
3638
3638
|
}
|
|
3639
|
-
`,
|
|
3639
|
+
`,jL=`#version 300 es
|
|
3640
3640
|
precision highp float;
|
|
3641
3641
|
#define SHADER_NAME ais-hull-decoration-fragment-shader
|
|
3642
3642
|
|
|
@@ -3647,13 +3647,13 @@ void main(void) {
|
|
|
3647
3647
|
fragColor = vec4(0.0, 0.0, 0.0, vOpacity);
|
|
3648
3648
|
DECKGL_FILTER_COLOR(fragColor, geometry);
|
|
3649
3649
|
}
|
|
3650
|
-
`;function
|
|
3650
|
+
`;function ML(e){return{positions:new Float32Array(e),vertexCount:e.length/3}}function NL(e,t,n,r){let i=[];for(let a=0;a<r;a++){let o=a/r*2*Math.PI,s=(a+1)/r*2*Math.PI;i.push(e,t,0,e+n*Math.sin(o),t+n*Math.cos(o),0,e+n*Math.sin(s),t+n*Math.cos(s),0)}return i}function PL(e,t,n,r){return[e,t,0,n,t,0,n,r,0,e,t,0,n,r,0,e,r,0]}function FL(e,t,n){let r=[];for(let i=0;i<n;i++){let a=i/n*2*Math.PI,o=(i+1)/n*2*Math.PI;r.push(e*Math.sin(a),e*Math.cos(a),0,t*Math.sin(a),t*Math.cos(a),0,t*Math.sin(o),t*Math.cos(o),0,e*Math.sin(a),e*Math.cos(a),0,t*Math.sin(o),t*Math.cos(o),0,e*Math.sin(o),e*Math.cos(o),0)}return r}function IL(e,t,n,r){return[e,t,0,e,t+r,0,e+n,t,0,e,t,0,e+n,t,0,e,t-r,0,e,t,0,e,t-r,0,e-n,t,0,e,t,0,e-n,t,0,e,t+r,0]}function LL(e,t,n,r,i){let a=n-e,o=r-t,s=Math.sqrt(a*a+o*o),c=-o/s*i,l=a/s*i;return[e+c,t+l,0,e-c,t-l,0,n-c,r-l,0,e+c,t+l,0,n-c,r-l,0,n+c,r+l,0]}function RL(e,t,n,r,i,a,o){let s=[];for(let c=0;c<o;c++){let l=c/o,u=(c+1)/o,d=(i+(a-i)*l)*Math.PI/180,f=(i+(a-i)*u)*Math.PI/180,p=Math.sin(d),m=Math.cos(d),h=Math.sin(f),g=Math.cos(f);s.push(e+n*p,t+n*m,0,e+r*p,t+r*m,0,e+r*h,t+r*g,0,e+n*p,t+n*m,0,e+r*h,t+r*g,0,e+n*h,t+n*g,0)}return s}var zL=ML(NL(0,.65,.12,8)),BL=ML([...PL(-1.35,-.55,-1.1,.22),...PL(1.1,-.55,1.35,.22)]),VL=ML(FL(1.3,1.5,16)),HL=ML([...LL(-.8,0,-1.5,-.5,.055),...LL(.8,0,1.5,-.5,.055),...RL(0,.3,1.62,1.78,242,118,18)]),UL=ML([...NL(0,.45,.1,10),...NL(0,.12,.1,10)]),WL=ML([...NL(0,.55,.09,10),...IL(0,.15,.13,.13),...NL(0,-.25,.09,10)]),GL=ML([...PL(-1.35,-.85,-1.1,.85),...PL(1.1,-.85,1.35,.85)]),KL={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:50},getBeam:{type:`accessor`,value:10},uploadTimestamp:0,selfAnimate:!1,settingsIconSize:1,decoration:{type:`object`,value:zL}},qL=class extends xP{static layerName=`AisHullDecorationLayer`;static defaultProps=KL;getShaders(){return super.getShaders({vs:AL,fs:jL,modules:[lw,CL]})}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:50},instanceBeam:{size:1,accessor:`getBeam`,defaultValue:10}})}updateState(e){super.updateState(e),(e.changeFlags.extensionsChanged||e.changeFlags.propsChanged&&e.oldProps.decoration!==e.props.decoration)&&(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}=this.props,i=n?Math.max(0,(Date.now()-(t??0))/1e3):0,a=this.context.viewport.zoom,o=this.state.model;o.shaderInputs.setProps({aisHull:{timeSinceUpload:i,zoom:a,settingsIconSize:r??1,opacity:1}}),o.draw(this.context.renderPass),n&&this.setNeedsRedraw()}_getModel(){let{positions:e,vertexCount:t}=this.props.decoration;return new cD(this.context.device,{...this.getShaders(),id:this.props.id,bufferLayout:this.getAttributeManager().getBufferLayouts(),geometry:new dD({topology:`triangle-list`,attributes:{positions:{size:3,value:e}},vertexCount:t}),isInstanced:!0})}},JL=`uniform aisIconUniforms {
|
|
3651
3651
|
float timeSinceUpload;
|
|
3652
3652
|
float zoom;
|
|
3653
3653
|
float settingsIconSize;
|
|
3654
3654
|
float opacity;
|
|
3655
3655
|
} aisIcon;
|
|
3656
|
-
`,
|
|
3656
|
+
`,YL={name:`aisIcon`,vs:JL,fs:JL,uniformTypes:{timeSinceUpload:`f32`,zoom:`f32`,settingsIconSize:`f32`,opacity:`f32`}},XL=`#version 300 es
|
|
3657
3657
|
#define SHADER_NAME ais-icon-layer-vertex-shader
|
|
3658
3658
|
|
|
3659
3659
|
// Per-vertex: arrow mesh in local space (bow = +Y, starboard = +X, range [-1, 1])
|
|
@@ -3781,7 +3781,7 @@ void main(void) {
|
|
|
3781
3781
|
geometry.pickingColor = instancePickingColors;
|
|
3782
3782
|
DECKGL_FILTER_COLOR(vColor, geometry);
|
|
3783
3783
|
}
|
|
3784
|
-
`,
|
|
3784
|
+
`,ZL=`#version 300 es
|
|
3785
3785
|
precision highp float;
|
|
3786
3786
|
#define SHADER_NAME ais-icon-layer-fragment-shader
|
|
3787
3787
|
|
|
@@ -3792,7 +3792,7 @@ void main(void) {
|
|
|
3792
3792
|
fragColor = vColor;
|
|
3793
3793
|
DECKGL_FILTER_COLOR(fragColor, geometry);
|
|
3794
3794
|
}
|
|
3795
|
-
`,XL=[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];function ZL(e,t,n,r){let i=[];for(let a=0;a<r;a++){let o=a/r*2*Math.PI,s=(a+1)/r*2*Math.PI;i.push(e,t,0,e+n*Math.sin(o),t+n*Math.cos(o),0,e+n*Math.sin(s),t+n*Math.cos(s),0)}return i}function QL(e,t,n,r){return[e,t,0,n,t,0,n,r,0,e,t,0,n,r,0,e,r,0]}function $L(e,t,n,r,i){let a=n-e,o=r-t,s=Math.sqrt(a*a+o*o),c=-o/s*i,l=a/s*i;return[e+c,t+l,0,e-c,t-l,0,n-c,r-l,0,e+c,t+l,0,n-c,r-l,0,n+c,r+l,0]}function eR(e,t,n,r){return[e,t,0,e,t+r,0,e+n,t,0,e,t,0,e+n,t,0,e,t-r,0,e,t,0,e,t-r,0,e-n,t,0,e,t,0,e-n,t,0,e,t+r,0]}function tR(e,t,n,r){let i=[];for(let a=0;a<r;a++){let o=-Math.PI/2+Math.PI*a/r,s=-Math.PI/2+Math.PI*(a+1)/r;i.push(e,t,0,e+n*Math.sin(o),t+n*Math.cos(o),0,e+n*Math.sin(s),t+n*Math.cos(s),0)}return i}function nR(e,t,n,r,i,a,o){let s=[];for(let c=0;c<o;c++){let l=(i+(a-i)*(c/o))*Math.PI/180,u=(i+(a-i)*((c+1)/o))*Math.PI/180,d=Math.sin(l),f=Math.cos(l),p=Math.sin(u),m=Math.cos(u);s.push(e+n*d,t+n*f,0,e+r*d,t+r*f,0,e+r*p,t+r*m,0,e+n*d,t+n*f,0,e+r*p,t+r*m,0,e+n*p,t+n*m,0)}return s}function rR(e,t=[]){let n=e.length/3,r=t.length/3,i=n+r;return{positions:new Float32Array([...e,...t,...e,...t]),isOutline:new Float32Array([...Array(i).fill(1),...Array(i).fill(0)]),isIndicator:new Float32Array([...Array(i).fill(0),...Array(n).fill(0),...Array(r).fill(1)]),vertexCount:i*2}}var iR=rR(XL),aR=rR([],ZL(0,.65,.18,8)),oR=(()=>{let e=1.55,t=1.35,n=[];for(let r=0;r<16;r++){let i=r/16*2*Math.PI,a=(r+1)/16*2*Math.PI;n.push(t*Math.sin(i),t*Math.cos(i),0,e*Math.sin(i),e*Math.cos(i),0,e*Math.sin(a),e*Math.cos(a),0,t*Math.sin(i),t*Math.cos(i),0,e*Math.sin(a),e*Math.cos(a),0,t*Math.sin(a),t*Math.cos(a),0)}return rR([],n)})(),sR=rR([],[...QL(-1.38,-.55,-1.13,.22),...QL(1.13,-.55,1.38,.22)]),cR=rR([],[...$L(-.8,0,-1.5,-.5,.08),...$L(.8,0,1.5,-.5,.08),...nR(0,.3,1.6,1.78,242,118,14)]),lR=rR([],[...ZL(0,.45,.15,10),...ZL(0,.1,.15,10)]),uR=rR([],[...ZL(0,.57,.13,10),...eR(0,.15,.17,.17),...ZL(0,-.28,.13,10)]),dR=rR([],[...QL(-1,-.8,-.75,.85),...QL(.75,-.8,1,.85)]),fR=rR(ZL(0,0,1.1,16),[...ZL(0,.62,.2,12),...$L(-.19,.32,-.78,.5,.08),...$L(.19,.32,.78,.5,.08),...QL(-.15,-.3,.15,.32),...tR(-.42,-.55,.18,8),...tR(.42,-.55,.18,8),...QL(-.83,-.8,.83,-.55)]),pR={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},mR=class extends xP{static layerName=`AisIconLayer`;static defaultProps=pR;getShaders(){return super.getShaders({vs:JL,fs:YL,modules:[lw,tT,qL]})}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||e.props.iconGeometry!==e.oldProps.iconGeometry)&&(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(){let e=this.props.iconGeometry??iR;return new cD(this.context.device,{...this.getShaders(),id:this.props.id,bufferLayout:this.getAttributeManager().getBufferLayouts(),geometry:new dD({topology:`triangle-list`,attributes:{positions:{size:3,value:e.positions},aIsOutline:{size:1,value:e.isOutline},aIsIndicator:{size:1,value:e.isIndicator}},vertexCount:e.vertexCount}),isInstanced:!0})}};function hR(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 gR(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 _R(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 gR(r,e,t),n}function vR(e,t){return _R(e,t).getContext(`2d`).getImageData(0,0,e,e)}var yR=H(`<div style="width: 100%; height: 100%;"></div> <div class="projection-picker svelte-c20cna"><button> </button> <button class="proj-btn svelte-c20cna"><!></button> <button class="proj-btn svelte-c20cna"><!></button></div>`,1);function bR(e,t){Ge(t,!0);let n=()=>dt(au,`$vesselState`,r),[r,i]=ft(),a={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`}]},o,s,c=P(!!document.fullscreenElement),l=()=>{};function u(){document.fullscreenElement?document.exitFullscreen().catch(()=>{}):document.documentElement.requestFullscreen().catch(()=>{})}function d(){if(hu.following){hu.following=!1;return}hu.following=!0}let f=P(!1),p=P(10),m=P(0),h=P(`mercator`),g=null,_=!1,v=!1,y=null,b=null,x=0,S=null,C=null;function w(e){if(e!==`globe`&&B(h)===`globe`){let e=s?.style?.projection?._verticalPerspectiveProjection;e&&(g=e._errorCorrectionUsable)}if(F(h,e,!0),s?.setProjection({type:e}),e===`globe`&&g!==null){let e=s?.style?.projection?._verticalPerspectiveProjection;e&&(e._errorCorrectionUsable=g,e._errorCorrectionPreviousValue=g,e._errorMeasurementLastValue=-g),_=!0,requestAnimationFrame(()=>{if(!_)return;_=!1;let e=s?.style?.projection?._verticalPerspectiveProjection;e?._errorMeasurement&&g!==null&&(e._errorMeasurement._measuredError=-g,e._errorMeasurementLastValue=-g,e._errorMeasurementLastChangeTime=performance.now()-1e4)})}else _=!1}let T=`vessel`,E=`vessel-cog`,ee=`vessel-hdg`,te=`vessel-gc`,ne=`ais-targets`,D={type:`FeatureCollection`,features:[]},O=new Map,k=null;function re(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 ie(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 ae(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]=ie(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 oe(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 se(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 ce(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 le(){if(!s)return;let e=o.clientWidth,t=o.clientHeight,n=e/2,r=t*.75,i=e/8,a=s.unproject([n-i,r]),c=s.unproject([n+i,r]);mL.add(a.lng,a.lat,c.lng,c.lat)}let ue=null,de=!1;function fe(e){e!==de&&(de=e,o.style.cursor=e?`grab`:``,e?s?.dragPan.disable():ue||s?.dragPan.enable())}function pe(e){if(!ve||!s)return;let t=o.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=ve.pickObject({x:n,y:r,radius:12,layerIds:[`ruler-delete`]});if(i?.object){let t=i.object;mL.remove(t.rulerId),e.stopPropagation();return}let a=ve.pickObject({x:n,y:r,radius:10,layerIds:[`ruler-handles`]});if(!a?.object)return;let c=a.object;ue={rulerId:c.rulerId,endpoint:c.endpoint},s.dragPan.disable(),o.style.cursor=`grabbing`,o.setPointerCapture(e.pointerId),e.stopPropagation()}function me(e){if(!s)return;let t=o.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;if(!ue){ve&&fe(!!ve.pickObject({x:n,y:r,radius:10,layerIds:[`ruler-handles`]})?.object);return}let i=s.unproject([n,r]);mL.moveEndpoint(ue.rulerId,ue.endpoint,i.lng,i.lat),e.stopPropagation()}function he(e){if(!ue||!s)return;let t=o.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=s.unproject([n,r]),a,c=i.lng,l=i.lat;for(let e of _e){let t=s.project([e.position.longitude,e.position.latitude]);if(Math.hypot(t.x-n,t.y-r)<ge){a=e.id,c=e.position.longitude,l=e.position.latitude;break}}mL.snapEndpoint(ue.rulerId,ue.endpoint,a,c,l),ue=null,o.style.cursor=de?`grab`:``,de||s.dragPan.enable(),o.releasePointerCapture(e.pointerId)}let ge=24,_e=[],ve=null,ye=null,be=[],xe=0,Se=[],Ce=[];function we(){ve?.setProps({layers:[...Se,...Ce]})}let Te=0,Ee=null,De=[];Pn(()=>{q.targetFps,cancelAnimationFrame(Te),clearTimeout(Te),De.length=0,pu.set(0),Ee?.()}),qr(()=>{s=new iu.default.Map({container:o,style:a,center:[10.75,59.91],zoom:10,maxPitch:85}),s.addControl(new iu.default.NavigationControl({showCompass:!1}),`top-right`),s.addControl(new iu.default.ScaleControl,`bottom-left`),ve=new nF({layers:[],interleaved:!1,parameters:{depthCompare:`always`,cullMode:`none`}}),s.addControl(ve),we();function e(){let e=performance.now();De.push(e);let n=e-3e3;for(;De.length>2&&De[0]<n;)De.shift();if(De.length>=2){let e=De[De.length-1]-De[0];pu.set((De.length-1)/(e/1e3))}if(ve!==null){let e=Date.now(),t=ct(au).position;{let n=e,r=[];if(ye&&be.length>0){let e=ye,t=be,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=xe-e[a*7+6]*1e3,[d,f]=hR(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}}),_e=r,mL.syncSnapped(_e)}let n=mL.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),o=n.flatMap(e=>{if(s){let t=s.project([e.a.lon,e.a.lat]),n=s.project([e.b.lon,e.b.lat]);if(Math.hypot(n.x-t.x,n.y-t.y)<100)return[]}let t=lL(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(s){let t=s.project([e.a.lon,e.a.lat]),n=s.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}]});Ce=[new rI({id:`ruler-line`,data:n.map(e=>({ruler:e})),getPath:e=>lL(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 MF({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 eL({id:`ruler-labels`,data:o,getText:e=>`${uL(e.ruler)} · ${dL(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`,characterSet:[...`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 °·.,'-/T`],pickable:!1,updateTriggers:{getText:[n],getPosition:[n]}}),new eL({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`,characterSet:[`✕`],pickable:!0,updateTriggers:{getPosition:[n]}})],we()}else Ce.length>0&&(Ce=[],we())}t()}function t(){let t=1e3/q.targetFps;Te=t<=17?requestAnimationFrame(e):setTimeout(e,t)}Ee=t,t(),o.addEventListener(`pointerdown`,pe,{capture:!0}),o.addEventListener(`pointermove`,me,{capture:!0}),o.addEventListener(`pointerup`,he,{capture:!0}),o.addEventListener(`pointercancel`,he,{capture:!0}),l=()=>{F(c,!!document.fullscreenElement)},document.addEventListener(`fullscreenchange`,l),s.on(`zoom`,()=>{F(p,s?.getZoom()??B(p),!0)}),s.on(`rotate`,()=>{F(m,s?.getBearing()??B(m),!0)}),s.on(`movestart`,e=>{e.originalEvent&&(v=!0)}),s.on(`moveend`,()=>{v=!1}),s.on(`dragstart`,()=>{ue||(hu.following=!1)}),s.on(`rotatestart`,e=>{e.originalEvent&&yu.setManual()}),s.on(`click`,e=>{if(!ve)return;let{x:t,y:n}=e.point,r=ve.pickMultipleObjects({x:t,y:n,radius:5,layerIds:[`ais-confirmed-icon`,`ais-hull-ghost`,`ais-hull-confirmed`,`ais-ghost-icon`,`ais-mob-icon`]}),i=new Set,a=[];for(let e of r){let t=e.object;t!=null&&(i.has(t)||(i.add(t),e.coordinate&&a.push({idx:t,coordinate:e.coordinate})))}if(a.length===0)return;let o=a[0].coordinate;if(a.length===1){let e=Qu.getTarget(a[0].idx);if(!e?.position)return;je(o,e);return}A(o,a.map(e=>e.idx))}),s.on(`style.load`,()=>{let e=s;if(!e)return;let t=q.appearance;e.addImage(`vessel-icon`,{width:64,height:64,data:vR(64,t.vesselColor).data}),e.addSource(T,{type:`geojson`,data:D}),e.addSource(E,{type:`geojson`,data:D}),e.addSource(ee,{type:`geojson`,data:D}),e.addSource(te,{type:`geojson`,data:D}),e.addSource(ne,{type:`geojson`,data:D}),e.addLayer({id:`vessel-gc-line`,type:`line`,source:te,paint:{"line-color":t.gc.color,"line-width":t.gc.width,...re(t.gc.style,t.gc.width)!==null&&{"line-dasharray":re(t.gc.style,t.gc.width)}}}),e.addLayer({id:`ais-label`,type:`symbol`,source:ne,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:E,paint:{"line-color":t.cog.color,"line-width":t.cog.width,...re(t.cog.style,t.cog.width)!==null&&{"line-dasharray":re(t.cog.style,t.cog.width)}}}),e.addLayer({id:`vessel-hdg-line`,type:`line`,source:ee,paint:{"line-color":t.heading.color,"line-width":t.heading.width}}),e.addLayer({id:`vessel-icon`,type:`symbol`,source:T,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}}),F(p,s.getZoom(),!0),F(m,s.getBearing(),!0),F(f,!0)}),s.on(`webglcontextlost`,()=>{console.warn(`[map] WebGL context lost`),F(f,!1),O.clear(),k=null}),s.on(`webglcontextrestored`,()=>{console.info(`[map] WebGL context restored`)}),s.on(`error`,e=>{console.error(`[map] error`,e.error??e)})}),Jr(()=>{cancelAnimationFrame(Te),clearTimeout(Te),ve?.finalize(),document.removeEventListener(`fullscreenchange`,l),o.removeEventListener(`pointerdown`,pe,{capture:!0}),o.removeEventListener(`pointermove`,me,{capture:!0}),o.removeEventListener(`pointerup`,he,{capture:!0}),o.removeEventListener(`pointercancel`,he,{capture:!0}),s?.remove()});function Oe(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">
|
|
3795
|
+
`,QL=[0,1,0,.5,.333,0,.5,-.75,0,0,1,0,.5,-.75,0,0,-.5,0,0,1,0,0,-.5,0,-.5,-.75,0,0,1,0,-.5,-.75,0,-.5,.333,0];function $L(e,t,n,r){let i=[];for(let a=0;a<r;a++){let o=a/r*2*Math.PI,s=(a+1)/r*2*Math.PI;i.push(e,t,0,e+n*Math.sin(o),t+n*Math.cos(o),0,e+n*Math.sin(s),t+n*Math.cos(s),0)}return i}function eR(e,t,n,r){return[e,t,0,n,t,0,n,r,0,e,t,0,n,r,0,e,r,0]}function tR(e,t,n,r,i){let a=n-e,o=r-t,s=Math.sqrt(a*a+o*o),c=-o/s*i,l=a/s*i;return[e+c,t+l,0,e-c,t-l,0,n-c,r-l,0,e+c,t+l,0,n-c,r-l,0,n+c,r+l,0]}function nR(e,t,n,r){return[e,t,0,e,t+r,0,e+n,t,0,e,t,0,e+n,t,0,e,t-r,0,e,t,0,e,t-r,0,e-n,t,0,e,t,0,e-n,t,0,e,t+r,0]}function rR(e,t,n,r){let i=[];for(let a=0;a<r;a++){let o=-Math.PI/2+Math.PI*a/r,s=-Math.PI/2+Math.PI*(a+1)/r;i.push(e,t,0,e+n*Math.sin(o),t+n*Math.cos(o),0,e+n*Math.sin(s),t+n*Math.cos(s),0)}return i}function iR(e,t,n,r,i,a,o){let s=[];for(let c=0;c<o;c++){let l=(i+(a-i)*(c/o))*Math.PI/180,u=(i+(a-i)*((c+1)/o))*Math.PI/180,d=Math.sin(l),f=Math.cos(l),p=Math.sin(u),m=Math.cos(u);s.push(e+n*d,t+n*f,0,e+r*d,t+r*f,0,e+r*p,t+r*m,0,e+n*d,t+n*f,0,e+r*p,t+r*m,0,e+n*p,t+n*m,0)}return s}function aR(e,t=[]){let n=e.length/3,r=t.length/3,i=n+r;return{positions:new Float32Array([...e,...t,...e,...t]),isOutline:new Float32Array([...Array(i).fill(1),...Array(i).fill(0)]),isIndicator:new Float32Array([...Array(i).fill(0),...Array(n).fill(0),...Array(r).fill(1)]),vertexCount:i*2}}var oR=aR(QL),sR=aR([],$L(0,.65,.18,8)),cR=(()=>{let e=1.55,t=1.35,n=[];for(let r=0;r<16;r++){let i=r/16*2*Math.PI,a=(r+1)/16*2*Math.PI;n.push(t*Math.sin(i),t*Math.cos(i),0,e*Math.sin(i),e*Math.cos(i),0,e*Math.sin(a),e*Math.cos(a),0,t*Math.sin(i),t*Math.cos(i),0,e*Math.sin(a),e*Math.cos(a),0,t*Math.sin(a),t*Math.cos(a),0)}return aR([],n)})(),lR=aR([],[...eR(-1.38,-.55,-1.13,.22),...eR(1.13,-.55,1.38,.22)]),uR=aR([],[...tR(-.8,0,-1.5,-.5,.08),...tR(.8,0,1.5,-.5,.08),...iR(0,.3,1.6,1.78,242,118,14)]),dR=aR([],[...$L(0,.45,.15,10),...$L(0,.1,.15,10)]),fR=aR([],[...$L(0,.57,.13,10),...nR(0,.15,.17,.17),...$L(0,-.28,.13,10)]),pR=aR([],[...eR(-1,-.8,-.75,.85),...eR(.75,-.8,1,.85)]),mR=aR($L(0,0,1.1,16),[...$L(0,.62,.2,12),...tR(-.19,.32,-.78,.5,.08),...tR(.19,.32,.78,.5,.08),...eR(-.15,-.3,.15,.32),...rR(-.42,-.55,.18,8),...rR(.42,-.55,.18,8),...eR(-.83,-.8,.83,-.55)]),hR={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},gR=class extends xP{static layerName=`AisIconLayer`;static defaultProps=hR;getShaders(){return super.getShaders({vs:XL,fs:ZL,modules:[lw,tT,YL]})}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||e.props.iconGeometry!==e.oldProps.iconGeometry)&&(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(){let e=this.props.iconGeometry??oR;return new cD(this.context.device,{...this.getShaders(),id:this.props.id,bufferLayout:this.getAttributeManager().getBufferLayouts(),geometry:new dD({topology:`triangle-list`,attributes:{positions:{size:3,value:e.positions},aIsOutline:{size:1,value:e.isOutline},aIsIndicator:{size:1,value:e.isIndicator}},vertexCount:e.vertexCount}),isInstanced:!0})}};function _R(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 vR(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 yR(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 vR(r,e,t),n}function bR(e,t){return yR(e,t).getContext(`2d`).getImageData(0,0,e,e)}var xR=H(`<div style="width: 100%; height: 100%;"></div> <div class="projection-picker svelte-c20cna"><button> </button> <button class="proj-btn svelte-c20cna"><!></button> <button class="proj-btn svelte-c20cna"><!></button></div> <button aria-label="Reset to North-Up"><svg width="44" height="44" viewBox="0 0 44 44" aria-hidden="true"><circle cx="22" cy="22" r="21" fill="rgba(0,0,0,0.72)" stroke="rgba(255,255,255,0.18)" stroke-width="1" class="svelte-c20cna"></circle><g><polygon points="22,5 17,23 22,20 27,23" fill="#e53e3e"></polygon><polygon points="22,39 17,21 22,24 27,21" fill="rgba(200,200,200,0.75)"></polygon></g><text x="22" y="15.5" text-anchor="middle" font-size="7" font-family="system-ui,sans-serif" fill="rgba(255,255,255,0.55)">N</text></svg></button>`,1);function SR(e,t){Ge(t,!0);let n=()=>dt(au,`$vesselState`,r),[r,i]=ft(),a={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`}]},o,s,c=P(!!document.fullscreenElement),l=()=>{};function u(){document.fullscreenElement?document.exitFullscreen().catch(()=>{}):document.documentElement.requestFullscreen().catch(()=>{})}function d(){if(hu.following){hu.following=!1;return}hu.following=!0}let f=P(!1),p=P(10),m=P(0),h=P(`mercator`),g=null,_=!1,v=!1,y=null,b=null,x=0,S=null,C=null;function w(e){if(e!==`globe`&&B(h)===`globe`){let e=s?.style?.projection?._verticalPerspectiveProjection;e&&(g=e._errorCorrectionUsable)}if(F(h,e,!0),s?.setProjection({type:e}),e===`globe`&&g!==null){let e=s?.style?.projection?._verticalPerspectiveProjection;e&&(e._errorCorrectionUsable=g,e._errorCorrectionPreviousValue=g,e._errorMeasurementLastValue=-g),_=!0,requestAnimationFrame(()=>{if(!_)return;_=!1;let e=s?.style?.projection?._verticalPerspectiveProjection;e?._errorMeasurement&&g!==null&&(e._errorMeasurement._measuredError=-g,e._errorMeasurementLastValue=-g,e._errorMeasurementLastChangeTime=performance.now()-1e4)})}else _=!1}let T=`vessel`,E=`vessel-cog`,ee=`vessel-hdg`,te=`vessel-gc`,ne=`ais-targets`,D={type:`FeatureCollection`,features:[]},O=new Map,k=null;function re(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 ie(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 ae(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]=ie(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 oe(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 se(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 ce(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 le(){if(!s)return;let e=o.clientWidth,t=o.clientHeight,n=e/2,r=t*.75,i=e/8,a=s.unproject([n-i,r]),c=s.unproject([n+i,r]);mL.add(a.lng,a.lat,c.lng,c.lat)}let ue=null,de=!1;function fe(e){e!==de&&(de=e,o.style.cursor=e?`grab`:``,e?s?.dragPan.disable():ue||s?.dragPan.enable())}function pe(e){if(!ve||!s)return;let t=o.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=ve.pickObject({x:n,y:r,radius:12,layerIds:[`ruler-delete`]});if(i?.object){let t=i.object;mL.remove(t.rulerId),e.stopPropagation();return}let a=ve.pickObject({x:n,y:r,radius:10,layerIds:[`ruler-handles`]});if(!a?.object)return;let c=a.object;ue={rulerId:c.rulerId,endpoint:c.endpoint},s.dragPan.disable(),o.style.cursor=`grabbing`,o.setPointerCapture(e.pointerId),e.stopPropagation()}function me(e){if(!s)return;let t=o.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;if(!ue){ve&&fe(!!ve.pickObject({x:n,y:r,radius:10,layerIds:[`ruler-handles`]})?.object);return}let i=s.unproject([n,r]);mL.moveEndpoint(ue.rulerId,ue.endpoint,i.lng,i.lat),e.stopPropagation()}function he(e){if(!ue||!s)return;let t=o.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=s.unproject([n,r]),a,c=i.lng,l=i.lat;for(let e of _e){let t=s.project([e.position.longitude,e.position.latitude]);if(Math.hypot(t.x-n,t.y-r)<ge){a=e.id,c=e.position.longitude,l=e.position.latitude;break}}mL.snapEndpoint(ue.rulerId,ue.endpoint,a,c,l),ue=null,o.style.cursor=de?`grab`:``,de||s.dragPan.enable(),o.releasePointerCapture(e.pointerId)}let ge=24,_e=[],ve=null,ye=null,be=[],xe=0,Se=[],Ce=[];function we(){ve?.setProps({layers:[...Se,...Ce]})}let Te=0,Ee=null,De=[];Pn(()=>{q.targetFps,cancelAnimationFrame(Te),clearTimeout(Te),De.length=0,pu.set(0),Ee?.()}),qr(()=>{s=new iu.default.Map({container:o,style:a,center:[10.75,59.91],zoom:10,maxPitch:85,bearingSnap:0}),s.addControl(new iu.default.NavigationControl({showCompass:!1}),`top-right`),s.addControl(new iu.default.ScaleControl,`bottom-left`),ve=new nF({layers:[],interleaved:!1,parameters:{depthCompare:`always`,cullMode:`none`}}),s.addControl(ve),we();function e(){let e=performance.now();De.push(e);let n=e-3e3;for(;De.length>2&&De[0]<n;)De.shift();if(De.length>=2){let e=De[De.length-1]-De[0];pu.set((De.length-1)/(e/1e3))}if(ve!==null){let e=Date.now(),t=ct(au).position;{let n=e,r=[];if(ye&&be.length>0){let e=ye,t=be,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=xe-e[a*7+6]*1e3,[d,f]=_R(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}}),_e=r,mL.syncSnapped(_e)}let n=mL.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),o=n.flatMap(e=>{if(s){let t=s.project([e.a.lon,e.a.lat]),n=s.project([e.b.lon,e.b.lat]);if(Math.hypot(n.x-t.x,n.y-t.y)<100)return[]}let t=lL(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(s){let t=s.project([e.a.lon,e.a.lat]),n=s.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}]});Ce=[new rI({id:`ruler-line`,data:n.map(e=>({ruler:e})),getPath:e=>lL(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 MF({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 eL({id:`ruler-labels`,data:o,getText:e=>`${uL(e.ruler)} · ${dL(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`,characterSet:[...`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 °·.,'-/T`],pickable:!1,updateTriggers:{getText:[n],getPosition:[n]}}),new eL({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`,characterSet:[`✕`],pickable:!0,updateTriggers:{getPosition:[n]}})],we()}else Ce.length>0&&(Ce=[],we())}t()}function t(){let t=1e3/q.targetFps;Te=t<=17?requestAnimationFrame(e):setTimeout(e,t)}Ee=t,t(),o.addEventListener(`pointerdown`,pe,{capture:!0}),o.addEventListener(`pointermove`,me,{capture:!0}),o.addEventListener(`pointerup`,he,{capture:!0}),o.addEventListener(`pointercancel`,he,{capture:!0}),l=()=>{F(c,!!document.fullscreenElement)},document.addEventListener(`fullscreenchange`,l),s.on(`zoom`,()=>{F(p,s?.getZoom()??B(p),!0)}),s.on(`rotate`,()=>{F(m,s?.getBearing()??B(m),!0)}),s.on(`movestart`,e=>{e.originalEvent&&(v=!0)}),s.on(`moveend`,()=>{v=!1}),s.on(`dragstart`,()=>{ue||(hu.following=!1)}),s.on(`rotatestart`,e=>{e.originalEvent&&yu.setManual()}),s.on(`click`,e=>{if(!ve)return;let{x:t,y:n}=e.point,r=ve.pickMultipleObjects({x:t,y:n,radius:5,layerIds:[`ais-confirmed-icon`,`ais-hull-ghost`,`ais-hull-confirmed`,`ais-ghost-icon`,`ais-mob-icon`]}),i=new Set,a=[];for(let e of r){let t=e.object;t!=null&&(i.has(t)||(i.add(t),e.coordinate&&a.push({idx:t,coordinate:e.coordinate})))}if(a.length===0)return;let o=a[0].coordinate;if(a.length===1){let e=Qu.getTarget(a[0].idx);if(!e?.position)return;je(o,e);return}A(o,a.map(e=>e.idx))}),s.on(`style.load`,()=>{let e=s;if(!e)return;let t=q.appearance;e.hasImage(`vessel-icon`)||e.addImage(`vessel-icon`,{width:64,height:64,data:bR(64,t.vesselColor).data}),e.getSource(T)||e.addSource(T,{type:`geojson`,data:D}),e.getSource(E)||e.addSource(E,{type:`geojson`,data:D}),e.getSource(ee)||e.addSource(ee,{type:`geojson`,data:D}),e.getSource(te)||e.addSource(te,{type:`geojson`,data:D}),e.getSource(ne)||e.addSource(ne,{type:`geojson`,data:D}),e.getLayer(`vessel-gc-line`)||e.addLayer({id:`vessel-gc-line`,type:`line`,source:te,paint:{"line-color":t.gc.color,"line-width":t.gc.width,...re(t.gc.style,t.gc.width)!==null&&{"line-dasharray":re(t.gc.style,t.gc.width)}}}),e.getLayer(`ais-label`)||e.addLayer({id:`ais-label`,type:`symbol`,source:ne,layout:{"text-field":[`get`,`label`],"text-font":[`Roboto Regular`],"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.getLayer(`vessel-cog-line`)||e.addLayer({id:`vessel-cog-line`,type:`line`,source:E,paint:{"line-color":t.cog.color,"line-width":t.cog.width,...re(t.cog.style,t.cog.width)!==null&&{"line-dasharray":re(t.cog.style,t.cog.width)}}}),e.getLayer(`vessel-hdg-line`)||e.addLayer({id:`vessel-hdg-line`,type:`line`,source:ee,paint:{"line-color":t.heading.color,"line-width":t.heading.width}}),e.getLayer(`vessel-icon`)||e.addLayer({id:`vessel-icon`,type:`symbol`,source:T,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}}),F(p,s.getZoom(),!0),F(m,s.getBearing(),!0),F(f,!0)}),s.on(`webglcontextlost`,()=>{console.warn(`[map] WebGL context lost`),F(f,!1),O.clear(),k=null}),s.on(`webglcontextrestored`,()=>{console.info(`[map] WebGL context restored`)}),s.on(`error`,e=>{console.error(`[map] error`,e.error??e)})}),Jr(()=>{cancelAnimationFrame(Te),clearTimeout(Te),ve?.finalize(),document.removeEventListener(`fullscreenchange`,l),o.removeEventListener(`pointerdown`,pe,{capture:!0}),o.removeEventListener(`pointermove`,me,{capture:!0}),o.removeEventListener(`pointerup`,he,{capture:!0}),o.removeEventListener(`pointercancel`,he,{capture:!0}),s?.remove()});function Oe(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">
|
|
3796
3796
|
<a href="https://www.vesselfinder.com/vessels/details/${e.mmsi}" target="_blank" rel="noopener">VesselFinder</a>
|
|
3797
3797
|
<a href="https://www.myshiptracking.com/?mmsi=${e.mmsi}" target="_blank" rel="noopener">MyShipTracking</a>
|
|
3798
3798
|
</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=Ae(s);return`
|
|
@@ -3825,7 +3825,7 @@ void main(void) {
|
|
|
3825
3825
|
<div class="ais-disambig">
|
|
3826
3826
|
<div class="ais-popup-title">Multiple vessels</div>
|
|
3827
3827
|
<ul class="ais-disambig-list">${n.map(({idx:e,target:t})=>`<li class="ais-disambig-item" data-idx="${e}">${t.name??t.mmsi??`Unknown vessel`}</li>`).join(``)}</ul>
|
|
3828
|
-
</div>`,i=new iu.default.Popup({closeButton:!0,maxWidth:`220px`}).setLngLat(e).setHTML(r).addTo(s);i.getElement().addEventListener(`click`,t=>{let n=t.target.closest(`[data-idx]`);if(!n)return;let r=Number(n.dataset.idx),a=Qu.getTarget(r);a?.position&&(i.remove(),je(e,a))})}Pn(()=>{if(!s||!B(f))return;let e=s,t=Gu.selected,n=Gu.available,r=Object.values(n).find(e=>t.has(e.identifier)&&!!e.style),i=r?Gu.styleUrl(r):null;if(i!==k){F(f,!1),O.clear(),k=i,i?hL(i).then(t=>e.setStyle(t,{diff:!1})).catch(e=>console.error(`[map] Failed to load style`,i,e)):e.setStyle(a);return}for(let r of Object.keys(n)){if(t.has(r)&&!n[r].style)continue;let i=`chart-layer-${r}`,a=`chart-${r}`;e.getLayer(i)&&e.removeLayer(i),e.getSource(a)&&e.removeSource(a),O.delete(r)}for(let[r,i]of Object.entries(n)){if(!t.has(r)||i.style)continue;let n=Gu.tileUrl(i);if(!n)continue;let a=`chart-${r}`,o=`chart-layer-${r}`;if(O.get(r)!==n&&(e.getLayer(o)&&e.removeLayer(o),e.getSource(a)&&e.removeSource(a),O.set(r,n)),!e.getSource(a)){let t=n.includes(`{-y}`),r=t?n.replace(`{-y}`,`{y}`):n;i.format===`pbf`?e.addSource(a,{type:`vector`,tiles:[r]}):e.addSource(a,{type:`raster`,tiles:[r],tileSize:256,scheme:t?`tms`:`xyz`,minzoom:i.minzoom??0,maxzoom:i.maxzoom??22})}if(!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(!s||!B(f))return;let e=Xu.enabled;for(let t of Ku)s.getLayer(t.id)&&s.setLayoutProperty(t.id,`visibility`,e.has(t.id)?`visible`:`none`)}),Pn(()=>{if(!s||!B(f))return;let e=vR(64,q.appearance.vesselColor);s.updateImage(`vessel-icon`,{width:64,height:64,data:e.data})}),Pn(()=>{!s||!B(f)||s.setPaintProperty(`ais-label`,`text-color`,q.appearance.ais.vesselColor)}),Pn(()=>{if(!s||!B(f))return;let e=s.getSource(ne);if(!(e instanceof iu.default.GeoJSONSource))return;let t=Qu.hotData,n=Qu.ids,r=Qu.coldMap;Qu.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=()=>{x=Date.now(),e.setData({type:`FeatureCollection`,features:i}),window.__mapDiag&&window.__mapDiag.aisLabels++};C=a;let o=1e3-(Date.now()-x);o<=0?(S!==null&&(clearTimeout(S),S=null),a(),C=null):S===null&&(S=setTimeout(()=>{S=null,C?.(),C=null},o))}),Pn(()=>{let e=Qu.hotData,t=Qu.ids,n=Qu.coldMap;Qu.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){Se=[],we(),ye=null,be=[],xe=0;return}let u=t.length,d=[],f=[],p=[],m=[],h=[],g=[],_=[],v=[],y=[],b=[],x=[],S=[],C=[],w=[],T=[],E=[],ee=[],te=[],ne=[];for(let r=0;r<u;r++){let i=n.get(t[r]),a=i?.navState?.toLowerCase()??``;if(a.includes(`sart`)||a.includes(`transponder`)){S.push(r);continue}d.push(r);let o=e[r*7+3],s=e[r*7+2];!isNaN(s)&&!isNaN(o)&&o>.1&&(f.push(r),p.push(r));let c=e[r*7+4],l=!isNaN(c)&&(i?.lengthM??0)>0&&(i?.beamM??0)>0;l&&m.push(r),a.includes(`aground`)?(g.push(r),l&&w.push(r)):a.includes(`anchor`)?(h.push(r),l&&C.push(r)):a.includes(`moor`)?(_.push(r),l&&T.push(r)):a.includes(`fishing`)?(v.push(r),l&&E.push(r)):a.includes(`command`)?(y.push(r),l&&ee.push(r)):a.includes(`restrict`)?(b.push(r),l&&te.push(r)):a.includes(`draught`)&&(x.push(r),l&&ne.push(r))}ye=e,be=t,xe=a;let D=se(r.vesselColor,220),O=se(r.vesselColor,130),k=t=>[e[t*7+0],e[t*7+1],0],re=t=>{let n=e[t*7+3];return isNaN(n)?0:n},ie=t=>{let n=e[t*7+2];return isNaN(n)?0:n},ae=t=>{let n=e[t*7+4];if(!isNaN(n))return n;let r=e[t*7+2];return isNaN(r)?0:r},oe=t=>{let n=e[t*7+4];return isNaN(n)?0:n},le=t=>{let n=e[t*7+5];return isNaN(n)?0:n},ue=t=>e[t*7+6],de=(e,r)=>n.get(t[e])?.lengthM??r,fe=(e,r)=>n.get(t[e])?.beamM??r,pe=f.length>0?new mR({id:`ais-ghost-icon`,data:f,getPosition:k,getSog:re,getCog:ie,getHeading:ae,getRot:le,getAgeAtUpload:ue,getLength:e=>de(e,0),getColor:O,uploadTimestamp:a,selfAnimate:!0,settingsIconSize:i,pickable:!0}):null,me=new mR({id:`ais-confirmed-icon`,data:d,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,pickable:!0}),he=h.length>0?new mR({id:`ais-anchored-icon`,data:h,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:aR,pickable:!1}):null,ge=_.length>0?new mR({id:`ais-moored-icon`,data:_,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:sR,pickable:!1}):null,_e=g.length>0?new mR({id:`ais-aground-icon`,data:g,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:oR,pickable:!1}):null,ve=v.length>0?new mR({id:`ais-fishing-icon`,data:v,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:cR,pickable:!1}):null,Ce=y.length>0?new mR({id:`ais-nuc-icon`,data:y,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:lR,pickable:!1}):null,Te=b.length>0?new mR({id:`ais-restricted-icon`,data:b,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:uR,pickable:!1}):null,Ee=x.length>0?new mR({id:`ais-draught-icon`,data:x,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:dR,pickable:!1}):null,De=S.length>0?new mR({id:`ais-mob-icon`,data:S,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:()=>0,getRot:()=>0,getAgeAtUpload:()=>0,getLength:()=>0,getColor:()=>[255,40,40,220],uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:fR,pickable:!0}):null,Oe=m.length>0?new DL({id:`ais-hull-ghost`,data:m,getPosition:k,getSog:re,getCog:ie,getHeading:oe,getRot:le,getAgeAtUpload:ue,getLength:e=>de(e,50),getBeam:e=>fe(e,10),getColor:D,uploadTimestamp:a,selfAnimate:!0,settingsIconSize:i,opacity:.75,pickable:!0}):null,ke=m.length>0?new DL({id:`ais-hull-confirmed`,data:m,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:oe,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,50),getBeam:e=>fe(e,10),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,opacity:1,pickable:!0}):null,Ae=(e,t,n,r)=>t.length>0?new GL({id:e,data:t,getPosition:k,getSog:r?re:()=>0,getCog:r?ie:()=>0,getHeading:oe,getRot:r?le:()=>0,getAgeAtUpload:r?ue:()=>0,getLength:e=>de(e,50),getBeam:e=>fe(e,10),uploadTimestamp:a,selfAnimate:r,settingsIconSize:i,decoration:n}):null,je=Ae(`ais-anchored-hull`,C,LL,!1),A=Ae(`ais-moored-hull`,T,RL,!1),Me=Ae(`ais-aground-hull`,w,zL,!1),j=Ae(`ais-fishing-hull`,E,BL,!1),Ne=Ae(`ais-nuc-hull`,ee,VL,!1),Pe=Ae(`ais-restricted-hull`,te,HL,!1),M=Ae(`ais-draught-hull`,ne,UL,!1),Fe=Ae(`ais-anchored-hull-ghost`,C,LL,!0),Ie=Ae(`ais-moored-hull-ghost`,T,RL,!0),Le=Ae(`ais-aground-hull-ghost`,w,zL,!0),Re=Ae(`ais-fishing-hull-ghost`,E,BL,!0),ze=Ae(`ais-nuc-hull-ghost`,ee,VL,!0),Be=Ae(`ais-restricted-hull-ghost`,te,HL,!0),Ve=Ae(`ais-draught-hull-ghost`,ne,UL,!0);Se=[...ke?[ke]:[],...je?[je]:[],...A?[A]:[],...Me?[Me]:[],...j?[j]:[],...Ne?[Ne]:[],...Pe?[Pe]:[],...M?[M]:[],...Oe?[Oe]:[],...Fe?[Fe]:[],...Ie?[Ie]:[],...Le?[Le]:[],...Re?[Re]:[],...ze?[ze]:[],...Be?[Be]:[],...Ve?[Ve]:[],new rI({id:`ais-cog`,data:p,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]=hR(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]=hR(n,r,i,isNaN(a)?0:a,c,0,s*t/24*1e3);return[o,l]})},getColor:()=>se(o,200),getWidth:s,getDashArray:ce(c,s),widthUnits:`pixels`,widthMinPixels:1,pickable:!1,extensions:[new oL({dash:!0})],updateTriggers:{getPath:[l],getColor:[o],getWidth:[s],getDashArray:[c,s]}}),...pe?[pe]:[],me,...he?[he]:[],..._e?[_e]:[],...ge?[ge]:[],...ve?[ve]:[],...Ce?[Ce]:[],...Te?[Te]:[],...Ee?[Ee]:[],...De?[De]:[]],we()}),Pn(()=>{let e=q.appearance,t=n(),r=B(p);if(!s||!B(f)||(s.setPaintProperty(`vessel-gc-line`,`line-color`,e.gc.color),s.setPaintProperty(`vessel-gc-line`,`line-width`,e.gc.width),s.setPaintProperty(`vessel-gc-line`,`line-dasharray`,re(e.gc.style,e.gc.width)??void 0),s.setPaintProperty(`vessel-cog-line`,`line-color`,e.cog.color),s.setPaintProperty(`vessel-cog-line`,`line-width`,e.cog.width),s.setPaintProperty(`vessel-cog-line`,`line-dasharray`,re(e.cog.style,e.cog.width)??void 0),s.setPaintProperty(`vessel-hdg-line`,`line-color`,e.heading.color),s.setPaintProperty(`vessel-hdg-line`,`line-width`,e.heading.width),s.setPaintProperty(`vessel-hdg-line`,`line-dasharray`,re(e.heading.style,e.heading.width)??void 0),s.setLayoutProperty(`vessel-icon`,`icon-size`,e.vesselSize/64),!t.position))return;let{longitude:i,latitude:a}=t.position;function o(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}}]},d=t.cog===null?D:{type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`LineString`,coordinates:ae(i,a,t.cog,o(e.cog,t.sog))},properties:{}}]},m=t.cog===null?D:{type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`LineString`,coordinates:oe(i,a,t.cog,o(e.gc,t.sog))},properties:{}}]},g=t.heading===null?D:{type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`LineString`,coordinates:(B(h)===`globe`?oe:ae)(i,a,t.heading,o(e.heading,t.sog))},properties:{}}]},_=s;b=()=>{let e=_.getSource(T),t=_.getSource(E),n=_.getSource(te),r=_.getSource(ee);e instanceof iu.default.GeoJSONSource&&t instanceof iu.default.GeoJSONSource&&n instanceof iu.default.GeoJSONSource&&r instanceof iu.default.GeoJSONSource&&(e.setData(u),t.setData(d),n.setData(m),r.setData(g),window.__mapDiag&&window.__mapDiag.ownVessel++)},y===null&&(y=requestAnimationFrame(()=>{y=null,b?.(),b=null}))}),Pn(()=>{if(!s)return;let e=n(),t=e.position,r=yu.mode,i;if(r===`north`?i=0:r===`cog`&&e.cog!==null?i=e.cog*180/Math.PI:r===`heading`&&e.heading!==null&&(i=e.heading*180/Math.PI),t&&hu.following){let e=s.getCenter(),n=Math.hypot(e.lng-t.longitude,e.lat-t.latitude),r=i===void 0?{}:{bearing:i};n>1?s.flyTo({center:[t.longitude,t.latitude],speed:1.5,...r}):s.easeTo({center:[t.longitude,t.latitude],duration:1e3,...r})}else i!==void 0&&!v&&s.easeTo({bearing:i,duration:300})});var Me={flyToVessel:d,addRuler:le},j=yR(),Ne=bn(j);Pi(Ne,e=>o=e,()=>o);var Pe=L(Ne,2),Fe=I(Pe);let Ie;var Le=I(Fe,!0);M(Fe);var Re=L(Fe,2),ze=I(Re);{let e=Gt(()=>B(h)===`mercator`?eu:Zl);Yl(ze,{get icon(){return B(e)}})}M(Re);var Be=L(Re,2),Ve=I(Be);{let e=Gt(()=>B(c)?tu:Xl);Yl(Ve,{get icon(){return B(e)}})}M(Be),M(Pe),Bn(()=>{Ie=fi(Fe,1,`proj-btn svelte-c20cna`,null,Ie,{"proj-btn--manual":yu.mode===`manual`}),Ei(Fe,`title`,`Rotation mode: ${yu.label??``}`),Vr(Le,yu.label),Ei(Re,`title`,`Switch to ${B(h)===`mercator`?`Globe`:`Mercator`}`),Ei(Be,`title`,B(c)?`Exit fullscreen`:`Enter fullscreen`)}),V(`click`,Fe,()=>yu.toggle(n().heading!==null,!1)),V(`click`,Re,()=>{w(B(h)===`mercator`?`globe`:`mercator`)}),V(`click`,Be,u),U(e,j);var He=Ke(Me);return i(),He}jr([`click`]);var xR=H(`<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),SR=H(`<p class="section-title svelte-1u3w06f">Rhumb Line predictor</p>`),CR=H(`<p class="section-title svelte-1u3w06f">Great Circle predictor</p>`),wR=H(`<p class="section-title svelte-1u3w06f">AIS targets</p>`),TR=H(`<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),ER=H(`<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> <p class="section-title svelte-1u3w06f">Performance</p> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Frame rate</label> <div class="fps-field svelte-1u3w06f"><input type="range" class="fps-slider svelte-1u3w06f" min="0" max="1000"/> <span class="fps-target svelte-1u3w06f"> </span> <span class="fps-actual svelte-1u3w06f"> </span></div></div>`,1),DR=H(`<button class="btn btn-cancel svelte-1u3w06f">Cancel</button> <button class="btn btn-save svelte-1u3w06f">Save & reconnect</button>`,1),OR=H(`<button class="btn btn-cancel svelte-1u3w06f">Cancel</button> <button class="btn btn-save svelte-1u3w06f">Close</button>`,1),kR=H(`<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),AR=H(`<button title="Settings" class="gear-btn svelte-1u3w06f"><!></button> <!>`,1);function jR(e,t){Ge(t,!0);let n=P(!1),r=P(`connection`),i=P(ln({protocol:q.protocol,host:q.host,port:q.port})),a=``;function o(e){return Math.round((Math.log10(e)+1)/(Math.log10(60)+1)*1e3)}function s(e){let t=10**(-1+e/1e3*(Math.log10(60)+1));return t>=10?Math.round(t):Math.round(t*10)/10}function c(e){return e>=10?`${Math.round(e)} fps`:e>=1?`${e.toFixed(1)} fps`:`every ${Math.round(1/e)}s`}function l(e){return e<=0?``:e>=10?`${Math.round(e)} fps`:`${e.toFixed(1)} fps`}function u(){F(i,{protocol:q.protocol,host:q.host,port:q.port},!0),a=JSON.stringify({appearance:q.appearance,targetFps:q.targetFps}),F(r,`connection`),F(n,!0)}function d(){q.apply({signalkProtocol:B(i).protocol,signalkHost:B(i).host,signalkPort:B(i).port,appearance:q.appearance,targetFps:q.targetFps}),F(n,!1)}function f(){let e=JSON.parse(a);q.apply({signalkProtocol:q.protocol,signalkHost:q.host,signalkPort:q.port,appearance:e.appearance,targetFps:e.targetFps}),F(n,!1)}function p(){F(n,!1)}function m(){q.apply({signalkProtocol:q.protocol,signalkHost:q.host,signalkPort:q.port,appearance:q.appearance,targetFps:q.targetFps})}var h=AR(),g=bn(h);Yl(I(g),{get icon(){return Ql}}),M(g);var _=L(g,2),v=e=>{var t=kR(),n=bn(t),a=L(n,2),u=L(I(a),2),h=I(u);let g;var _=L(h,2);let v;M(u);var y=L(u,2),b=e=>{var t=xR(),n=L(bn(t),2),r=L(I(n),2),a=I(r),o=I(a);o.value=o.__value=`ws`;var s=L(o);s.value=s.__value=`wss`,M(a),M(r),M(n);var c=L(n,2),l=L(I(c),2),u=I(l);Ci(u),M(l),M(c);var d=L(c,2),f=L(I(d),2),p=I(f);Ci(p),M(f),M(d);var m=L(d,2),h=I(m);M(m),Bn(()=>Vr(h,`→ ${B(i).protocol??``}://${B(i).host??``}:${B(i).port??``}/signalk/v1/stream?subscribe=self`)),_i(a,()=>B(i).protocol,e=>B(i).protocol=e),Ai(u,()=>B(i).host,e=>B(i).host=e),Ai(p,()=>B(i).port,e=>B(i).port=e),U(e,t)};Xr(y,e=>{B(r)===`connection`&&e(b)});var x=L(y,2),S=e=>{var t=ER(),n=L(bn(t),2),r=L(I(n),2),i=I(r);Ci(i),M(r),M(n);var a=L(n,2),u=L(I(a),2),d=I(u);Ci(d),Fe(2),M(u),M(a);var f=L(a,4);ei(f,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=TR(),a=bn(i),o=L(I(a),2),s=I(o);Ci(s),M(o),M(a);var c=L(a,2),l=L(I(c),2),u=I(l);Ci(u),Fe(2),M(l),M(c);var d=L(c,2),f=L(I(d),2),p=I(f),h=I(p);h.value=h.__value=`solid`;var g=L(h);g.value=g.__value=`dashed`;var _=L(g);_.value=_.__value=`dotted`;var v=L(_);v.value=v.__value=`dash-dot`,M(p),M(f),M(d);var y=L(d,2),b=L(I(y),2),x=I(b);Ci(x);var S=L(x,2),C=I(S);C.value=C.__value=`nm`;var w=L(C);w.value=w.__value=`min`;var T=L(w);T.value=T.__value=`px`,M(S),M(b),M(y);var E=L(y,2),ee=e=>{U(e,SR())},te=e=>{U(e,CR())},ne=e=>{U(e,wR())};Xr(E,e=>{n()===`heading`?e(ee):n()===`cog`?e(te,1):n()===`gc`&&e(ne,2)}),V(`input`,s,m),Ai(s,()=>B(r).color,e=>B(r).color=e),V(`input`,u,m),Ai(u,()=>B(r).width,e=>B(r).width=e),V(`change`,p,m),_i(p,()=>B(r).style,e=>B(r).style=e),V(`input`,x,m),Ai(x,()=>B(r).lengthValue,e=>B(r).lengthValue=e),V(`change`,S,m),_i(S,()=>B(r).lengthUnit,e=>B(r).lengthUnit=e),U(e,i)});var p=L(f,2),h=L(I(p),2),g=I(h);Ci(g),M(h),M(p);var _=L(p,2),v=L(I(_),2),y=I(v);Ci(y),Fe(2),M(v),M(_);var b=L(_,4),x=L(I(b),2),S=I(x);Ci(S),M(x),M(b);var C=L(b,2),w=L(I(C),2),T=I(w);Ci(T),Fe(2),M(w),M(C);var E=L(C,2),ee=L(I(E),2),te=I(ee),ne=I(te);ne.value=ne.__value=`solid`;var D=L(ne);D.value=D.__value=`dashed`;var O=L(D);O.value=O.__value=`dotted`;var k=L(O);k.value=k.__value=`dash-dot`,M(te),M(ee),M(E);var re=L(E,2),ie=L(I(re),2),ae=I(ie);Ci(ae),Fe(2),M(ie),M(re);var oe=L(re,4),se=L(I(oe),2),ce=I(se);Ci(ce),M(se),M(oe);var le=L(oe,2),ue=L(I(le),2),de=I(ue);Ci(de),Fe(2),M(ue),M(le);var fe=L(le,4),pe=L(I(fe),2),me=I(pe);Ci(me);var he=L(me,2),ge=I(he,!0);M(he);var _e=L(he,2),ve=I(_e,!0);M(_e),M(pe),M(fe),Bn((e,t,n)=>{wi(me,e),Vr(ge,t),Vr(ve,n)},[()=>o(q.targetFps),()=>c(q.targetFps),()=>l(pu.value)]),V(`input`,i,m),Ai(i,()=>q.appearance.vesselColor,e=>q.appearance.vesselColor=e),V(`input`,d,m),Ai(d,()=>q.appearance.vesselSize,e=>q.appearance.vesselSize=e),V(`input`,g,m),Ai(g,()=>q.appearance.ais.vesselColor,e=>q.appearance.ais.vesselColor=e),V(`input`,y,m),Ai(y,()=>q.appearance.ais.vesselSize,e=>q.appearance.ais.vesselSize=e),V(`input`,S,m),Ai(S,()=>q.appearance.ais.cog.color,e=>q.appearance.ais.cog.color=e),V(`input`,T,m),Ai(T,()=>q.appearance.ais.cog.width,e=>q.appearance.ais.cog.width=e),V(`change`,te,m),_i(te,()=>q.appearance.ais.cog.style,e=>q.appearance.ais.cog.style=e),V(`input`,ae,m),Ai(ae,()=>q.appearance.ais.cog.lengthMinutes,e=>q.appearance.ais.cog.lengthMinutes=e),V(`input`,ce,m),Ai(ce,()=>q.appearance.ruler.color,e=>q.appearance.ruler.color=e),V(`input`,de,m),Ai(de,()=>q.appearance.ruler.width,e=>q.appearance.ruler.width=e),V(`input`,me,e=>q.setTargetFps(s(+e.target.value))),U(e,t)};Xr(x,e=>{B(r)===`appearance`&&e(S)});var C=L(x,2),w=I(C),T=e=>{var t=DR(),n=bn(t),r=L(n,2);V(`click`,n,f),V(`click`,r,d),U(e,t)},E=e=>{var t=OR(),n=bn(t),r=L(n,2);V(`click`,n,f),V(`click`,r,p),U(e,t)};Xr(w,e=>{B(r)===`connection`?e(T):e(E,-1)}),M(C),M(a),Bn(()=>{g=fi(h,1,`tab svelte-1u3w06f`,null,g,{active:B(r)===`connection`}),v=fi(_,1,`tab svelte-1u3w06f`,null,v,{active:B(r)===`appearance`})}),V(`click`,n,p),V(`click`,h,()=>F(r,`connection`)),V(`click`,_,()=>F(r,`appearance`)),U(e,t)};Xr(_,e=>{B(n)&&e(v)}),V(`click`,g,u),U(e,h),Ke()}jr([`click`,`input`,`change`]);var MR=H(`<li class="chart-row svelte-1mbfew2"><input type="checkbox" class="svelte-1mbfew2"/> <label class="chart-name svelte-1mbfew2"> </label></li>`),NR=H(`<li class="chart-row hint-row svelte-1mbfew2">Loading charts…</li>`),PR=H(`<li class="chart-row hint-row error svelte-1mbfew2"> </li>`),FR=H(`<span class="badge svelte-1mbfew2">WMS</span>`),IR=H(`<span class="badge svelte-1mbfew2">WMTS</span>`),LR=H(`<span class="chart-desc svelte-1mbfew2"> </span>`),RR=H(`<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),zR=H(`<span class="wmts-ok svelte-1mbfew2">✓ Custom URL active</span> <button class="wmts-clear svelte-1mbfew2">Clear</button>`,1),BR=H(`<option> </option>`),VR=H(`<label class="wmts-showall-label svelte-1mbfew2" title="Show all layers from capabilities"><input type="checkbox" class="svelte-1mbfew2"/> All</label>`),HR=H(`<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>`),UR=H(`<span class="wmts-ok svelte-1mbfew2"> </span>`),WR=H(`<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>`),GR=H(`<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),KR=H(`<button title="Charts"><!></button> <!>`,1);function qR(e,t){Ge(t,!0);let n=P(!1),r=ln({});function i(){F(n,!B(n))}function a(){F(n,!1)}function o(e){Gu.setOverride(e,r[e]??``)}var s=KR(),c=bn(s);let l;Yl(I(c),{get icon(){return ru}}),M(c);var u=L(c,2),d=e=>{var t=GR(),n=bn(t),i=L(n,2),s=I(i),c=L(I(s),2);M(s);var l=L(s,2),u=I(l);ei(u,17,()=>Ku,e=>e.id,(e,t)=>{var n=MR(),r=I(n);Ci(r);var i=L(r,2),a=I(i,!0);M(i),M(n),Bn(e=>{Ei(r,`id`,`base-${B(t).id??``}`),Ti(r,e),Ei(i,`for`,`base-${B(t).id??``}`),Vr(a,B(t).name)},[()=>Xu.enabled.has(B(t).id)]),V(`change`,r,()=>{Xu.toggle(B(t).id)}),U(e,n)});var d=L(u,2),f=e=>{U(e,NR())},p=e=>{var t=PR(),n=I(t);M(t),Bn(()=>Vr(n,`⚠ ${Gu.error??``}`)),U(e,t)},m=e=>{var t=Rr();ei(bn(t),17,()=>Object.entries(Gu.available),([e,t])=>e,(e,t)=>{var n=Gt(()=>S(B(t),2));let i=()=>B(n)[0],a=()=>B(n)[1];var s=WR(),c=I(s);Ci(c);var l=L(c,2),u=I(l),d=I(u),f=L(d),p=e=>{U(e,FR())};Xr(f,e=>{a().type===`WMS`&&e(p)});var m=L(f,2),h=e=>{U(e,IR())};Xr(m,e=>{a().type===`WMTS`&&e(h)}),M(u);var g=L(u,2),_=e=>{var t=LR(),n=I(t,!0);M(t),Bn(()=>Vr(n,a().description)),U(e,t)};Xr(g,e=>{a().description&&e(_)});var v=L(g,2),y=I(v);M(v);var b=L(v,2),x=e=>{var t=RR(),n=L(bn(t),2),a=I(n);Ci(a),Ei(a,`placeholder`,`https://…/{z}/{x}/{y}.png`);var s=L(a,2);M(n),Bn(e=>wi(a,e),[()=>r[i()]??Gu.getOverride(i())]),V(`input`,a,e=>{r[i()]=e.target.value}),V(`keydown`,a,e=>{e.key===`Enter`&&o(i())}),V(`click`,s,()=>o(i())),U(e,t)},C=Gt(()=>Gu.needsManualUrl(i())),w=e=>{var t=zR();V(`click`,L(bn(t),2),()=>{Gu.setOverride(i(),``),r[i()]=``}),U(e,t)},T=Gt(()=>a().type===`WMTS`&&Gu.getOverride(i())),E=e=>{var t=Rr(),n=bn(t),r=e=>{var t=HR(),n=I(t),r=L(n,2);ei(r,21,()=>Gu.visibleLayers(i()),e=>e.id,(e,t)=>{var n=BR(),r=I(n,!0);M(n);var i={};Bn(()=>{Vr(r,B(t).title),i!==(i=B(t).id)&&(n.value=(n.__value=B(t).id)??``)}),U(e,n)}),M(r);var a;gi(r);var o=L(r,2),s=e=>{var t=VR(),n=I(t);Ci(n),Fe(),M(t),Bn(e=>Ti(n,e),[()=>Gu.isShowingAll(i())]),V(`change`,n,()=>Gu.toggleShowAll(i())),U(e,t)},c=Gt(()=>Gu.hasFilter(i()));Xr(o,e=>{B(c)&&e(s)}),M(t),Bn(e=>{Ei(n,`for`,`wmts-layer-${i()??``}`),Ei(r,`id`,`wmts-layer-${i()??``}`),a!==(a=e)&&(r.value=(r.__value=e)??``,hi(r,e))},[()=>Gu.getLayerSel(i())]),V(`change`,r,e=>{Gu.selectLayer(i(),e.target.value)}),U(e,t)},a=Gt(()=>Gu.visibleLayers(i()).length>1),o=e=>{var t=UR(),n=I(t);M(t),Bn(e=>Vr(n,`Layer: ${e??``}`),[()=>Gu.visibleLayers(i())[0]?.title]),U(e,t)},s=Gt(()=>Gu.visibleLayers(i()).length===1);Xr(n,e=>{B(a)?e(r):B(s)&&e(o,1)}),U(e,t)};Xr(b,e=>{B(C)?e(x):B(T)?e(w,1):a().type===`WMTS`&&e(E,2)}),M(l),M(s),Bn((e,t,n,r)=>{Ei(c,`id`,`cp-chart-${i()??``}`),Ti(c,e),c.disabled=t,Ei(u,`for`,`cp-chart-${i()??``}`),Vr(d,`${a().name??``} `),Vr(y,`${n??``}${r??``}`)},[()=>Gu.selected.has(i()),()=>Gu.needsManualUrl(i()),()=>a().format.toUpperCase(),()=>a().scale?` · 1:${a().scale.toLocaleString()}`:``]),V(`change`,c,()=>{Gu.toggle(i())}),U(e,s)}),U(e,t)};Xr(d,e=>{Gu.loading?e(f):Gu.error?e(p,1):e(m,-1)}),M(l),M(i),V(`click`,n,a),V(`keydown`,n,a),V(`click`,c,a),U(e,t)};Xr(u,e=>{B(n)&&e(d)}),Bn(()=>l=fi(c,1,`charts-btn svelte-1mbfew2`,null,l,{active:B(n)})),V(`click`,c,i),U(e,s),Ke()}jr([`click`,`keydown`,`change`,`input`]);var JR=H(`<span style="color: #f87171"> </span>`),YR=H(`<div style="position: relative; width: 100%; height: 100%;"><!> <!> <!> <div style="
|
|
3828
|
+
</div>`,i=new iu.default.Popup({closeButton:!0,maxWidth:`220px`}).setLngLat(e).setHTML(r).addTo(s);i.getElement().addEventListener(`click`,t=>{let n=t.target.closest(`[data-idx]`);if(!n)return;let r=Number(n.dataset.idx),a=Qu.getTarget(r);a?.position&&(i.remove(),je(e,a))})}Pn(()=>{if(!s||!B(f))return;let e=s,t=Gu.selected,n=Gu.available,r=Object.values(n).find(e=>t.has(e.identifier)&&!!e.style),i=r?Gu.styleUrl(r):null;if(i!==k){F(f,!1),O.clear(),k=i,i?_L(i).then(t=>e.setStyle(t,{diff:!1})).catch(e=>console.error(`[map] Failed to load style`,i,e)):e.setStyle(a,{diff:!1});return}for(let r of Object.keys(n)){if(t.has(r)&&!n[r].style)continue;let i=`chart-layer-${r}`,a=`chart-${r}`;e.getLayer(i)&&e.removeLayer(i),e.getSource(a)&&e.removeSource(a),O.delete(r)}for(let[r,i]of Object.entries(n)){if(!t.has(r)||i.style)continue;let n=Gu.tileUrl(i);if(!n)continue;let a=`chart-${r}`,o=`chart-layer-${r}`;if(O.get(r)!==n&&(e.getLayer(o)&&e.removeLayer(o),e.getSource(a)&&e.removeSource(a),O.set(r,n)),!e.getSource(a)){let t=n.includes(`{-y}`),r=t?n.replace(`{-y}`,`{y}`):n;i.format===`pbf`?e.addSource(a,{type:`vector`,tiles:[r]}):e.addSource(a,{type:`raster`,tiles:[r],tileSize:256,scheme:t?`tms`:`xyz`,minzoom:i.minzoom??0,maxzoom:i.maxzoom??22})}if(!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(!s||!B(f))return;let e=Xu.enabled;for(let t of Ku)s.getLayer(t.id)&&s.setLayoutProperty(t.id,`visibility`,e.has(t.id)?`visible`:`none`)}),Pn(()=>{if(!s||!B(f))return;let e=bR(64,q.appearance.vesselColor);s.updateImage(`vessel-icon`,{width:64,height:64,data:e.data})}),Pn(()=>{!s||!B(f)||s.setPaintProperty(`ais-label`,`text-color`,q.appearance.ais.vesselColor)}),Pn(()=>{if(!s||!B(f))return;let e=s.getSource(ne);if(!(e instanceof iu.default.GeoJSONSource))return;let t=Qu.hotData,n=Qu.ids,r=Qu.coldMap;Qu.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=()=>{x=Date.now(),e.setData({type:`FeatureCollection`,features:i}),window.__mapDiag&&window.__mapDiag.aisLabels++};C=a;let o=1e3-(Date.now()-x);o<=0?(S!==null&&(clearTimeout(S),S=null),a(),C=null):S===null&&(S=setTimeout(()=>{S=null,C?.(),C=null},o))}),Pn(()=>{let e=Qu.hotData,t=Qu.ids,n=Qu.coldMap;Qu.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){Se=[],we(),ye=null,be=[],xe=0;return}let u=t.length,d=[],f=[],p=[],m=[],h=[],g=[],_=[],v=[],y=[],b=[],x=[],S=[],C=[],w=[],T=[],E=[],ee=[],te=[],ne=[];for(let r=0;r<u;r++){let i=n.get(t[r]),a=i?.navState?.toLowerCase()??``;if(a.includes(`sart`)||a.includes(`transponder`)){S.push(r);continue}d.push(r);let o=e[r*7+3],s=e[r*7+2];!isNaN(s)&&!isNaN(o)&&o>.1&&(f.push(r),p.push(r));let c=e[r*7+4],l=!isNaN(c)&&(i?.lengthM??0)>0&&(i?.beamM??0)>0;l&&m.push(r),a.includes(`aground`)?(g.push(r),l&&w.push(r)):a.includes(`anchor`)?(h.push(r),l&&C.push(r)):a.includes(`moor`)?(_.push(r),l&&T.push(r)):a.includes(`fishing`)?(v.push(r),l&&E.push(r)):a.includes(`command`)?(y.push(r),l&&ee.push(r)):a.includes(`restrict`)?(b.push(r),l&&te.push(r)):a.includes(`draught`)&&(x.push(r),l&&ne.push(r))}ye=e,be=t,xe=a;let D=se(r.vesselColor,220),O=se(r.vesselColor,130),k=t=>[e[t*7+0],e[t*7+1],0],re=t=>{let n=e[t*7+3];return isNaN(n)?0:n},ie=t=>{let n=e[t*7+2];return isNaN(n)?0:n},ae=t=>{let n=e[t*7+4];if(!isNaN(n))return n;let r=e[t*7+2];return isNaN(r)?0:r},oe=t=>{let n=e[t*7+4];return isNaN(n)?0:n},le=t=>{let n=e[t*7+5];return isNaN(n)?0:n},ue=t=>e[t*7+6],de=(e,r)=>n.get(t[e])?.lengthM??r,fe=(e,r)=>n.get(t[e])?.beamM??r,pe=f.length>0?new gR({id:`ais-ghost-icon`,data:f,getPosition:k,getSog:re,getCog:ie,getHeading:ae,getRot:le,getAgeAtUpload:ue,getLength:e=>de(e,0),getColor:O,uploadTimestamp:a,selfAnimate:!0,settingsIconSize:i,pickable:!0}):null,me=new gR({id:`ais-confirmed-icon`,data:d,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,pickable:!0}),he=h.length>0?new gR({id:`ais-anchored-icon`,data:h,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:sR,pickable:!1}):null,ge=_.length>0?new gR({id:`ais-moored-icon`,data:_,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:lR,pickable:!1}):null,_e=g.length>0?new gR({id:`ais-aground-icon`,data:g,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:cR,pickable:!1}):null,ve=v.length>0?new gR({id:`ais-fishing-icon`,data:v,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:uR,pickable:!1}):null,Ce=y.length>0?new gR({id:`ais-nuc-icon`,data:y,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:dR,pickable:!1}):null,Te=b.length>0?new gR({id:`ais-restricted-icon`,data:b,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:fR,pickable:!1}):null,Ee=x.length>0?new gR({id:`ais-draught-icon`,data:x,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:ae,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,0),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:pR,pickable:!1}):null,De=S.length>0?new gR({id:`ais-mob-icon`,data:S,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:()=>0,getRot:()=>0,getAgeAtUpload:()=>0,getLength:()=>0,getColor:()=>[255,40,40,220],uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,iconGeometry:mR,pickable:!0}):null,Oe=m.length>0?new kL({id:`ais-hull-ghost`,data:m,getPosition:k,getSog:re,getCog:ie,getHeading:oe,getRot:le,getAgeAtUpload:ue,getLength:e=>de(e,50),getBeam:e=>fe(e,10),getColor:D,uploadTimestamp:a,selfAnimate:!0,settingsIconSize:i,opacity:.75,pickable:!0}):null,ke=m.length>0?new kL({id:`ais-hull-confirmed`,data:m,getPosition:k,getSog:()=>0,getCog:()=>0,getHeading:oe,getRot:()=>0,getAgeAtUpload:()=>0,getLength:e=>de(e,50),getBeam:e=>fe(e,10),getColor:D,uploadTimestamp:a,selfAnimate:!1,settingsIconSize:i,opacity:1,pickable:!0}):null,Ae=(e,t,n,r)=>t.length>0?new qL({id:e,data:t,getPosition:k,getSog:r?re:()=>0,getCog:r?ie:()=>0,getHeading:oe,getRot:r?le:()=>0,getAgeAtUpload:r?ue:()=>0,getLength:e=>de(e,50),getBeam:e=>fe(e,10),uploadTimestamp:a,selfAnimate:r,settingsIconSize:i,decoration:n}):null,je=Ae(`ais-anchored-hull`,C,zL,!1),A=Ae(`ais-moored-hull`,T,BL,!1),Me=Ae(`ais-aground-hull`,w,VL,!1),j=Ae(`ais-fishing-hull`,E,HL,!1),Ne=Ae(`ais-nuc-hull`,ee,UL,!1),Pe=Ae(`ais-restricted-hull`,te,WL,!1),M=Ae(`ais-draught-hull`,ne,GL,!1),Fe=Ae(`ais-anchored-hull-ghost`,C,zL,!0),Ie=Ae(`ais-moored-hull-ghost`,T,BL,!0),Le=Ae(`ais-aground-hull-ghost`,w,VL,!0),Re=Ae(`ais-fishing-hull-ghost`,E,HL,!0),ze=Ae(`ais-nuc-hull-ghost`,ee,UL,!0),Be=Ae(`ais-restricted-hull-ghost`,te,WL,!0),Ve=Ae(`ais-draught-hull-ghost`,ne,GL,!0);Se=[...ke?[ke]:[],...je?[je]:[],...A?[A]:[],...Me?[Me]:[],...j?[j]:[],...Ne?[Ne]:[],...Pe?[Pe]:[],...M?[M]:[],...Oe?[Oe]:[],...Fe?[Fe]:[],...Ie?[Ie]:[],...Le?[Le]:[],...Re?[Re]:[],...ze?[ze]:[],...Be?[Be]:[],...Ve?[Ve]:[],new rI({id:`ais-cog`,data:p,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]=_R(n,r,i,isNaN(a)?0:a,0,0,s*1e3);return[[n,r],[e,t]]}let u=2*Math.PI/Math.abs(c),d=Math.min(s,u);return Array.from({length:25},(e,t)=>{let[o,s]=_R(n,r,i,isNaN(a)?0:a,c,0,d*t/24*1e3);return[o,s]})},getColor:()=>se(o,200),getWidth:s,getDashArray:ce(c,s),widthUnits:`pixels`,widthMinPixels:1,pickable:!1,extensions:[new oL({dash:!0})],updateTriggers:{getPath:[l],getColor:[o],getWidth:[s],getDashArray:[c,s]}}),...pe?[pe]:[],me,...he?[he]:[],..._e?[_e]:[],...ge?[ge]:[],...ve?[ve]:[],...Ce?[Ce]:[],...Te?[Te]:[],...Ee?[Ee]:[],...De?[De]:[]],we()}),Pn(()=>{let e=q.appearance,t=n(),r=B(p);if(!s||!B(f)||(s.setPaintProperty(`vessel-gc-line`,`line-color`,e.gc.color),s.setPaintProperty(`vessel-gc-line`,`line-width`,e.gc.width),s.setPaintProperty(`vessel-gc-line`,`line-dasharray`,re(e.gc.style,e.gc.width)??void 0),s.setPaintProperty(`vessel-cog-line`,`line-color`,e.cog.color),s.setPaintProperty(`vessel-cog-line`,`line-width`,e.cog.width),s.setPaintProperty(`vessel-cog-line`,`line-dasharray`,re(e.cog.style,e.cog.width)??void 0),s.setPaintProperty(`vessel-hdg-line`,`line-color`,e.heading.color),s.setPaintProperty(`vessel-hdg-line`,`line-width`,e.heading.width),s.setPaintProperty(`vessel-hdg-line`,`line-dasharray`,re(e.heading.style,e.heading.width)??void 0),s.setLayoutProperty(`vessel-icon`,`icon-size`,e.vesselSize/64),!t.position))return;let{longitude:i,latitude:a}=t.position;function o(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}}]},d=t.cog===null?D:{type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`LineString`,coordinates:ae(i,a,t.cog,o(e.cog,t.sog))},properties:{}}]},m=t.cog===null?D:{type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`LineString`,coordinates:oe(i,a,t.cog,o(e.gc,t.sog))},properties:{}}]},g=t.heading===null?D:{type:`FeatureCollection`,features:[{type:`Feature`,geometry:{type:`LineString`,coordinates:(B(h)===`globe`?oe:ae)(i,a,t.heading,o(e.heading,t.sog))},properties:{}}]},_=s;b=()=>{let e=_.getSource(T),t=_.getSource(E),n=_.getSource(te),r=_.getSource(ee);e instanceof iu.default.GeoJSONSource&&t instanceof iu.default.GeoJSONSource&&n instanceof iu.default.GeoJSONSource&&r instanceof iu.default.GeoJSONSource&&(e.setData(u),t.setData(d),n.setData(m),r.setData(g),window.__mapDiag&&window.__mapDiag.ownVessel++)},y===null&&(y=requestAnimationFrame(()=>{y=null,b?.(),b=null}))}),Pn(()=>{if(!s)return;let e=n(),t=e.position,r=yu.mode,i;if(r===`north`?i=0:r===`cog`&&e.cog!==null?i=e.cog*180/Math.PI:r===`heading`&&e.heading!==null&&(i=e.heading*180/Math.PI),t&&hu.following){let e=s.getCenter(),n=Math.hypot(e.lng-t.longitude,e.lat-t.latitude),r=i===void 0?{}:{bearing:i};n>1?s.flyTo({center:[t.longitude,t.latitude],speed:1.5,...r}):s.easeTo({center:[t.longitude,t.latitude],duration:1e3,...r})}else i!==void 0&&!v&&s.easeTo({bearing:i,duration:300})});var Me={flyToVessel:d,addRuler:le},j=xR(),Ne=bn(j);Pi(Ne,e=>o=e,()=>o);var Pe=L(Ne,2),Fe=I(Pe);let Ie;var Le=I(Fe,!0);M(Fe);var Re=L(Fe,2),ze=I(Re);{let e=Gt(()=>B(h)===`mercator`?eu:Zl);Yl(ze,{get icon(){return B(e)}})}M(Re);var Be=L(Re,2),Ve=I(Be);{let e=Gt(()=>B(c)?tu:Xl);Yl(Ve,{get icon(){return B(e)}})}M(Be),M(Pe);var He=L(Pe,2);let Ue;var We=I(He),qe=L(I(We)),Je=L(qe);M(We),M(He),Bn((e,t)=>{Ie=fi(Fe,1,`proj-btn svelte-c20cna`,null,Ie,{"proj-btn--manual":yu.mode===`manual`}),Ei(Fe,`title`,`Rotation mode: ${yu.label??``}`),Vr(Le,yu.label),Ei(Re,`title`,`Switch to ${B(h)===`mercator`?`Globe`:`Mercator`}`),Ei(Be,`title`,B(c)?`Exit fullscreen`:`Enter fullscreen`),Ue=fi(He,1,`north-indicator svelte-c20cna`,null,Ue,e),Ei(He,`title`,`Tap to reset to North-Up (bearing ${t??``}°)`),Ei(qe,`transform`,`rotate(${-B(m)}, 22, 22)`),Ei(Je,`transform`,`rotate(${-B(m)}, 22, 22)`)},[()=>({"north-indicator--visible":Math.abs(B(m))>.5}),()=>B(m).toFixed(1)]),V(`click`,Fe,()=>yu.toggle(n().heading!==null,!1)),V(`click`,Re,()=>{w(B(h)===`mercator`?`globe`:`mercator`)}),V(`click`,Be,u),V(`click`,He,()=>s?.easeTo({bearing:0,duration:300})),U(e,j);var Ye=Ke(Me);return i(),Ye}jr([`click`]);var CR=H(`<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),wR=H(`<p class="section-title svelte-1u3w06f">Rhumb Line predictor</p>`),TR=H(`<p class="section-title svelte-1u3w06f">Great Circle predictor</p>`),ER=H(`<p class="section-title svelte-1u3w06f">AIS targets</p>`),DR=H(`<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),OR=H(`<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> <p class="section-title svelte-1u3w06f">Performance</p> <div class="row svelte-1u3w06f"><label class="svelte-1u3w06f">Frame rate</label> <div class="fps-field svelte-1u3w06f"><input type="range" class="fps-slider svelte-1u3w06f" min="0" max="1000"/> <span class="fps-target svelte-1u3w06f"> </span> <span class="fps-actual svelte-1u3w06f"> </span></div></div>`,1),kR=H(`<button class="btn btn-cancel svelte-1u3w06f">Cancel</button> <button class="btn btn-save svelte-1u3w06f">Save & reconnect</button>`,1),AR=H(`<button class="btn btn-cancel svelte-1u3w06f">Cancel</button> <button class="btn btn-save svelte-1u3w06f">Close</button>`,1),jR=H(`<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),MR=H(`<button title="Settings" class="gear-btn svelte-1u3w06f"><!></button> <!>`,1);function NR(e,t){Ge(t,!0);let n=P(!1),r=P(`connection`),i=P(ln({protocol:q.protocol,host:q.host,port:q.port})),a=``;function o(e){return Math.round((Math.log10(e)+1)/(Math.log10(60)+1)*1e3)}function s(e){let t=10**(-1+e/1e3*(Math.log10(60)+1));return t>=10?Math.round(t):Math.round(t*10)/10}function c(e){return e>=10?`${Math.round(e)} fps`:e>=1?`${e.toFixed(1)} fps`:`every ${Math.round(1/e)}s`}function l(e){return e<=0?``:e>=10?`${Math.round(e)} fps`:`${e.toFixed(1)} fps`}function u(){F(i,{protocol:q.protocol,host:q.host,port:q.port},!0),a=JSON.stringify({appearance:q.appearance,targetFps:q.targetFps}),F(r,`connection`),F(n,!0)}function d(){q.apply({signalkProtocol:B(i).protocol,signalkHost:B(i).host,signalkPort:B(i).port,appearance:q.appearance,targetFps:q.targetFps}),F(n,!1)}function f(){let e=JSON.parse(a);q.apply({signalkProtocol:q.protocol,signalkHost:q.host,signalkPort:q.port,appearance:e.appearance,targetFps:e.targetFps}),F(n,!1)}function p(){F(n,!1)}function m(){q.apply({signalkProtocol:q.protocol,signalkHost:q.host,signalkPort:q.port,appearance:q.appearance,targetFps:q.targetFps})}var h=MR(),g=bn(h);Yl(I(g),{get icon(){return Ql}}),M(g);var _=L(g,2),v=e=>{var t=jR(),n=bn(t),a=L(n,2),u=L(I(a),2),h=I(u);let g;var _=L(h,2);let v;M(u);var y=L(u,2),b=e=>{var t=CR(),n=L(bn(t),2),r=L(I(n),2),a=I(r),o=I(a);o.value=o.__value=`ws`;var s=L(o);s.value=s.__value=`wss`,M(a),M(r),M(n);var c=L(n,2),l=L(I(c),2),u=I(l);Ci(u),M(l),M(c);var d=L(c,2),f=L(I(d),2),p=I(f);Ci(p),M(f),M(d);var m=L(d,2),h=I(m);M(m),Bn(()=>Vr(h,`→ ${B(i).protocol??``}://${B(i).host??``}:${B(i).port??``}/signalk/v1/stream?subscribe=self`)),_i(a,()=>B(i).protocol,e=>B(i).protocol=e),Ai(u,()=>B(i).host,e=>B(i).host=e),Ai(p,()=>B(i).port,e=>B(i).port=e),U(e,t)};Xr(y,e=>{B(r)===`connection`&&e(b)});var x=L(y,2),S=e=>{var t=OR(),n=L(bn(t),2),r=L(I(n),2),i=I(r);Ci(i),M(r),M(n);var a=L(n,2),u=L(I(a),2),d=I(u);Ci(d),Fe(2),M(u),M(a);var f=L(a,4);ei(f,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=DR(),a=bn(i),o=L(I(a),2),s=I(o);Ci(s),M(o),M(a);var c=L(a,2),l=L(I(c),2),u=I(l);Ci(u),Fe(2),M(l),M(c);var d=L(c,2),f=L(I(d),2),p=I(f),h=I(p);h.value=h.__value=`solid`;var g=L(h);g.value=g.__value=`dashed`;var _=L(g);_.value=_.__value=`dotted`;var v=L(_);v.value=v.__value=`dash-dot`,M(p),M(f),M(d);var y=L(d,2),b=L(I(y),2),x=I(b);Ci(x);var S=L(x,2),C=I(S);C.value=C.__value=`nm`;var w=L(C);w.value=w.__value=`min`;var T=L(w);T.value=T.__value=`px`,M(S),M(b),M(y);var E=L(y,2),ee=e=>{U(e,wR())},te=e=>{U(e,TR())},ne=e=>{U(e,ER())};Xr(E,e=>{n()===`heading`?e(ee):n()===`cog`?e(te,1):n()===`gc`&&e(ne,2)}),V(`input`,s,m),Ai(s,()=>B(r).color,e=>B(r).color=e),V(`input`,u,m),Ai(u,()=>B(r).width,e=>B(r).width=e),V(`change`,p,m),_i(p,()=>B(r).style,e=>B(r).style=e),V(`input`,x,m),Ai(x,()=>B(r).lengthValue,e=>B(r).lengthValue=e),V(`change`,S,m),_i(S,()=>B(r).lengthUnit,e=>B(r).lengthUnit=e),U(e,i)});var p=L(f,2),h=L(I(p),2),g=I(h);Ci(g),M(h),M(p);var _=L(p,2),v=L(I(_),2),y=I(v);Ci(y),Fe(2),M(v),M(_);var b=L(_,4),x=L(I(b),2),S=I(x);Ci(S),M(x),M(b);var C=L(b,2),w=L(I(C),2),T=I(w);Ci(T),Fe(2),M(w),M(C);var E=L(C,2),ee=L(I(E),2),te=I(ee),ne=I(te);ne.value=ne.__value=`solid`;var D=L(ne);D.value=D.__value=`dashed`;var O=L(D);O.value=O.__value=`dotted`;var k=L(O);k.value=k.__value=`dash-dot`,M(te),M(ee),M(E);var re=L(E,2),ie=L(I(re),2),ae=I(ie);Ci(ae),Fe(2),M(ie),M(re);var oe=L(re,4),se=L(I(oe),2),ce=I(se);Ci(ce),M(se),M(oe);var le=L(oe,2),ue=L(I(le),2),de=I(ue);Ci(de),Fe(2),M(ue),M(le);var fe=L(le,4),pe=L(I(fe),2),me=I(pe);Ci(me);var he=L(me,2),ge=I(he,!0);M(he);var _e=L(he,2),ve=I(_e,!0);M(_e),M(pe),M(fe),Bn((e,t,n)=>{wi(me,e),Vr(ge,t),Vr(ve,n)},[()=>o(q.targetFps),()=>c(q.targetFps),()=>l(pu.value)]),V(`input`,i,m),Ai(i,()=>q.appearance.vesselColor,e=>q.appearance.vesselColor=e),V(`input`,d,m),Ai(d,()=>q.appearance.vesselSize,e=>q.appearance.vesselSize=e),V(`input`,g,m),Ai(g,()=>q.appearance.ais.vesselColor,e=>q.appearance.ais.vesselColor=e),V(`input`,y,m),Ai(y,()=>q.appearance.ais.vesselSize,e=>q.appearance.ais.vesselSize=e),V(`input`,S,m),Ai(S,()=>q.appearance.ais.cog.color,e=>q.appearance.ais.cog.color=e),V(`input`,T,m),Ai(T,()=>q.appearance.ais.cog.width,e=>q.appearance.ais.cog.width=e),V(`change`,te,m),_i(te,()=>q.appearance.ais.cog.style,e=>q.appearance.ais.cog.style=e),V(`input`,ae,m),Ai(ae,()=>q.appearance.ais.cog.lengthMinutes,e=>q.appearance.ais.cog.lengthMinutes=e),V(`input`,ce,m),Ai(ce,()=>q.appearance.ruler.color,e=>q.appearance.ruler.color=e),V(`input`,de,m),Ai(de,()=>q.appearance.ruler.width,e=>q.appearance.ruler.width=e),V(`input`,me,e=>q.setTargetFps(s(+e.target.value))),U(e,t)};Xr(x,e=>{B(r)===`appearance`&&e(S)});var C=L(x,2),w=I(C),T=e=>{var t=kR(),n=bn(t),r=L(n,2);V(`click`,n,f),V(`click`,r,d),U(e,t)},E=e=>{var t=AR(),n=bn(t),r=L(n,2);V(`click`,n,f),V(`click`,r,p),U(e,t)};Xr(w,e=>{B(r)===`connection`?e(T):e(E,-1)}),M(C),M(a),Bn(()=>{g=fi(h,1,`tab svelte-1u3w06f`,null,g,{active:B(r)===`connection`}),v=fi(_,1,`tab svelte-1u3w06f`,null,v,{active:B(r)===`appearance`})}),V(`click`,n,p),V(`click`,h,()=>F(r,`connection`)),V(`click`,_,()=>F(r,`appearance`)),U(e,t)};Xr(_,e=>{B(n)&&e(v)}),V(`click`,g,u),U(e,h),Ke()}jr([`click`,`input`,`change`]);var PR=H(`<li class="chart-row svelte-1mbfew2"><input type="checkbox" class="svelte-1mbfew2"/> <label class="chart-name svelte-1mbfew2"> </label></li>`),FR=H(`<li class="chart-row hint-row svelte-1mbfew2">Loading charts…</li>`),IR=H(`<li class="chart-row hint-row error svelte-1mbfew2"> </li>`),LR=H(`<span class="badge svelte-1mbfew2">WMS</span>`),RR=H(`<span class="badge svelte-1mbfew2">WMTS</span>`),zR=H(`<span class="chart-desc svelte-1mbfew2"> </span>`),BR=H(`<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),VR=H(`<span class="wmts-ok svelte-1mbfew2">✓ Custom URL active</span> <button class="wmts-clear svelte-1mbfew2">Clear</button>`,1),HR=H(`<option> </option>`),UR=H(`<label class="wmts-showall-label svelte-1mbfew2" title="Show all layers from capabilities"><input type="checkbox" class="svelte-1mbfew2"/> All</label>`),WR=H(`<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>`),GR=H(`<span class="wmts-ok svelte-1mbfew2"> </span>`),KR=H(`<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>`),qR=H(`<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),JR=H(`<button title="Charts"><!></button> <!>`,1);function YR(e,t){Ge(t,!0);let n=P(!1),r=ln({});function i(){F(n,!B(n))}function a(){F(n,!1)}function o(e){Gu.setOverride(e,r[e]??``)}var s=JR(),c=bn(s);let l;Yl(I(c),{get icon(){return ru}}),M(c);var u=L(c,2),d=e=>{var t=qR(),n=bn(t),i=L(n,2),s=I(i),c=L(I(s),2);M(s);var l=L(s,2),u=I(l);ei(u,17,()=>Ku,e=>e.id,(e,t)=>{var n=PR(),r=I(n);Ci(r);var i=L(r,2),a=I(i,!0);M(i),M(n),Bn(e=>{Ei(r,`id`,`base-${B(t).id??``}`),Ti(r,e),Ei(i,`for`,`base-${B(t).id??``}`),Vr(a,B(t).name)},[()=>Xu.enabled.has(B(t).id)]),V(`change`,r,()=>{Xu.toggle(B(t).id)}),U(e,n)});var d=L(u,2),f=e=>{U(e,FR())},p=e=>{var t=IR(),n=I(t);M(t),Bn(()=>Vr(n,`⚠ ${Gu.error??``}`)),U(e,t)},m=e=>{var t=Rr();ei(bn(t),17,()=>Object.entries(Gu.available),([e,t])=>e,(e,t)=>{var n=Gt(()=>S(B(t),2));let i=()=>B(n)[0],a=()=>B(n)[1];var s=KR(),c=I(s);Ci(c);var l=L(c,2),u=I(l),d=I(u),f=L(d),p=e=>{U(e,LR())};Xr(f,e=>{a().type===`WMS`&&e(p)});var m=L(f,2),h=e=>{U(e,RR())};Xr(m,e=>{a().type===`WMTS`&&e(h)}),M(u);var g=L(u,2),_=e=>{var t=zR(),n=I(t,!0);M(t),Bn(()=>Vr(n,a().description)),U(e,t)};Xr(g,e=>{a().description&&e(_)});var v=L(g,2),y=I(v);M(v);var b=L(v,2),x=e=>{var t=BR(),n=L(bn(t),2),a=I(n);Ci(a),Ei(a,`placeholder`,`https://…/{z}/{x}/{y}.png`);var s=L(a,2);M(n),Bn(e=>wi(a,e),[()=>r[i()]??Gu.getOverride(i())]),V(`input`,a,e=>{r[i()]=e.target.value}),V(`keydown`,a,e=>{e.key===`Enter`&&o(i())}),V(`click`,s,()=>o(i())),U(e,t)},C=Gt(()=>Gu.needsManualUrl(i())),w=e=>{var t=VR();V(`click`,L(bn(t),2),()=>{Gu.setOverride(i(),``),r[i()]=``}),U(e,t)},T=Gt(()=>a().type===`WMTS`&&Gu.getOverride(i())),E=e=>{var t=Rr(),n=bn(t),r=e=>{var t=WR(),n=I(t),r=L(n,2);ei(r,21,()=>Gu.visibleLayers(i()),e=>e.id,(e,t)=>{var n=HR(),r=I(n,!0);M(n);var i={};Bn(()=>{Vr(r,B(t).title),i!==(i=B(t).id)&&(n.value=(n.__value=B(t).id)??``)}),U(e,n)}),M(r);var a;gi(r);var o=L(r,2),s=e=>{var t=UR(),n=I(t);Ci(n),Fe(),M(t),Bn(e=>Ti(n,e),[()=>Gu.isShowingAll(i())]),V(`change`,n,()=>Gu.toggleShowAll(i())),U(e,t)},c=Gt(()=>Gu.hasFilter(i()));Xr(o,e=>{B(c)&&e(s)}),M(t),Bn(e=>{Ei(n,`for`,`wmts-layer-${i()??``}`),Ei(r,`id`,`wmts-layer-${i()??``}`),a!==(a=e)&&(r.value=(r.__value=e)??``,hi(r,e))},[()=>Gu.getLayerSel(i())]),V(`change`,r,e=>{Gu.selectLayer(i(),e.target.value)}),U(e,t)},a=Gt(()=>Gu.visibleLayers(i()).length>1),o=e=>{var t=GR(),n=I(t);M(t),Bn(e=>Vr(n,`Layer: ${e??``}`),[()=>Gu.visibleLayers(i())[0]?.title]),U(e,t)},s=Gt(()=>Gu.visibleLayers(i()).length===1);Xr(n,e=>{B(a)?e(r):B(s)&&e(o,1)}),U(e,t)};Xr(b,e=>{B(C)?e(x):B(T)?e(w,1):a().type===`WMTS`&&e(E,2)}),M(l),M(s),Bn((e,t,n,r)=>{Ei(c,`id`,`cp-chart-${i()??``}`),Ti(c,e),c.disabled=t,Ei(u,`for`,`cp-chart-${i()??``}`),Vr(d,`${a().name??``} `),Vr(y,`${n??``}${r??``}`)},[()=>Gu.selected.has(i()),()=>Gu.needsManualUrl(i()),()=>a().format.toUpperCase(),()=>a().scale?` · 1:${a().scale.toLocaleString()}`:``]),V(`change`,c,()=>{Gu.toggle(i())}),U(e,s)}),U(e,t)};Xr(d,e=>{Gu.loading?e(f):Gu.error?e(p,1):e(m,-1)}),M(l),M(i),V(`click`,n,a),V(`keydown`,n,a),V(`click`,c,a),U(e,t)};Xr(u,e=>{B(n)&&e(d)}),Bn(()=>l=fi(c,1,`charts-btn svelte-1mbfew2`,null,l,{active:B(n)})),V(`click`,c,i),U(e,s),Ke()}jr([`click`,`keydown`,`change`,`input`]);var XR=H(`<span style="color: #f87171"> </span>`),ZR=H(`<div style="position: relative; width: 100%; height: 100%;"><!> <!> <!> <div style="
|
|
3829
3829
|
position: absolute; top: 10px; left: 10px; z-index: 10;
|
|
3830
3830
|
background: rgba(0,0,0,0.7); color: white;
|
|
3831
3831
|
padding: 6px 12px; border-radius: 6px; font: 12px monospace;
|
|
@@ -3835,7 +3835,7 @@ void main(void) {
|
|
|
3835
3835
|
background: rgba(0,0,0,0.7); border: 1px solid transparent; color: white;
|
|
3836
3836
|
padding: 6px 10px; border-radius: 6px; cursor: pointer;
|
|
3837
3837
|
font-size: 16px;
|
|
3838
|
-
"><!></button></div>`);function
|
|
3838
|
+
"><!></button></div>`);function QR(e,t){Ge(t,!0);let n=()=>dt(au,`$vesselState`,r),[r,i]=ft(),a=P(null),o=P(!1),s=P(null),c=null,l=null,u=2e3;function d(){l===null&&(l=setTimeout(()=>{l=null;let e=q.signalkUrl;e&&c?.postMessage({type:`connect`,url:e})},u),u=Math.min(u*2,3e4))}qr(()=>{c=new Worker(new URL(``+new URL(`signalk.worker-oIy9vdMV.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),c.onmessage=e=>{let t=e.data;if(t.type===`state`){let e=t.state.position;e&&au.set({position:{longitude:e.longitude,latitude:e.latitude},cog:t.state.cog??null,sog:t.state.sog??null,heading:t.state.heading??null})}else t.type===`status`?(F(o,t.status===1),t.status===1?u=2e3:(t.status===2||t.status===3)&&(t.status===3&&F(s,`Connection error`),d()),t.status===2&&F(s,null)):t.type===`ais`?Qu.updateBinary(t.hot,t.ids,t.cold):(F(s,`Signal K client failed: ${t.message}`),console.error(`[signalk] worker error`,t.message))};let e=()=>{if(document.visibilityState===`visible`&&!B(o)){l!==null&&(clearTimeout(l),l=null);let e=q.signalkUrl;e&&c?.postMessage({type:`connect`,url:e})}};return document.addEventListener(`visibilitychange`,e),()=>{document.removeEventListener(`visibilitychange`,e),l!==null&&clearTimeout(l),c?.postMessage({type:`disconnect`}),c?.terminate()}});let f=``,p=null;Pn(()=>{let e=q.signalkHttpUrl;if(e===f)return;f=e,Gu.load(e),p!==null&&clearInterval(p);let t=()=>void Ou(e).then(e=>Qu.setInfoCache(e));return t(),p=setInterval(t,18e4),()=>{p!==null&&clearInterval(p)}});let m=``;Pn(()=>{let e=q.signalkUrl;e!==m&&(m=e,F(o,!1),F(s,null),u=2e3,l!==null&&(clearTimeout(l),l=null),c?.postMessage({type:`connect`,url:e}))});var h=ZR(),g=I(h);Pi(SR(g,{}),e=>F(a,e,!0),()=>B(a));var _=L(g,2);NR(_,{});var v=L(_,2);YR(v,{});var y=L(v,2),b=I(y),x=L(b,2),S=e=>{var t=XR(),n=I(t);M(t),Bn(()=>Vr(n,`⚠ ${B(s)??``}`)),U(e,t)};Xr(x,e=>{B(s)&&e(S)}),M(y);var C=L(y,2);Yl(I(C),{get icon(){return nu}}),M(C);var w=L(C,2);Yl(I(w),{get icon(){return $l}}),M(w),M(h),Bn(()=>{mi(b,`color: ${B(o)?`#4ade80`:`#f87171`}`),Ei(C,`title`,hu.following?`Stop following vessel`:`Follow vessel`),C.disabled=!n().position,mi(C,`
|
|
3839
3839
|
position: absolute; top: 120px; left: 10px; z-index: 10;
|
|
3840
3840
|
background: ${hu.following?`rgba(255,255,255,0.9)`:`rgba(0,0,0,0.7)`};
|
|
3841
3841
|
border: none;
|
|
@@ -3843,4 +3843,4 @@ void main(void) {
|
|
|
3843
3843
|
padding: 6px 10px; border-radius: 6px; cursor: pointer;
|
|
3844
3844
|
font-size: 16px; transition: background 0.15s, color 0.15s;
|
|
3845
3845
|
opacity: ${n().position?1:.35};
|
|
3846
|
-
`)}),V(`click`,C,()=>B(a)?.flyToVessel()),V(`click`,w,()=>B(a)?.addRuler()),U(e,h),Ke(),i()}jr([`click`]);var
|
|
3846
|
+
`)}),V(`click`,C,()=>B(a)?.flyToVessel()),V(`click`,w,()=>B(a)?.addRuler()),U(e,h),Ke(),i()}jr([`click`]);var $R=document.getElementById(`app`);if(!$R)throw Error(`No #app element found`);Hr(QR,{target:$R});
|
package/public/index.html
CHANGED
|
@@ -10,11 +10,11 @@
|
|
|
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-ChWbB-vT.js"></script>
|
|
14
14
|
<link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-QTnfLwEv.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="./assets/maplibre-gl-TciDBW6i.js">
|
|
16
16
|
<link rel="stylesheet" crossorigin href="./assets/maplibre-gl-B2k4QVOw.css">
|
|
17
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
17
|
+
<link rel="stylesheet" crossorigin href="./assets/index-C4cruxr4.css">
|
|
18
18
|
<script id="vite-plugin-pwa:register-sw" src="./registerSW.js"></script></head>
|
|
19
19
|
<body>
|
|
20
20
|
<div id="app"></div>
|
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),u={module:{uri:l},exports:o,require:t};s[l]=Promise.all(n.map(e=>u[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),u={module:{uri:l},exports:o,require:t};s[l]=Promise.all(n.map(e=>u[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:"0a2fcb837905fd6dcfa99ff153bb2969"},{url:"icon-512.png",revision:"0657088dc11293c0b742467b3d9aa0e6"},{url:"icon-192.png",revision:"63ee319f3a9e92cea460048feeeacc26"},{url:"favicon.png",revision:"8a0854348265db4022235b1c95e57bbd"},{url:"assets/signalk_chart_core_bg-231oCTjv.wasm",revision:null},{url:"assets/signalk.worker-oIy9vdMV.js",revision:null},{url:"assets/rolldown-runtime-QTnfLwEv.js",revision:null},{url:"assets/maplibre-gl-TciDBW6i.js",revision:null},{url:"assets/maplibre-gl-B2k4QVOw.css",revision:null},{url:"assets/index-ChWbB-vT.js",revision:null},{url:"assets/index-C4cruxr4.css",revision:null}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/tiles\//,/^\/signalk\//,/^\/v1\//]}))});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.projection-picker.svelte-c20cna{z-index:10;flex-direction:column;align-items:flex-start;gap:3px;display:flex;position:absolute;top:200px;left:10px}.proj-btn.svelte-c20cna{color:#fff;cursor:pointer;background:#000000b3;border:none;border-radius:6px;padding:6px 10px;font-size:16px;transition:background .15s}.proj-btn.svelte-c20cna:hover{background:#282850e6}.proj-btn--manual.svelte-c20cna{color:#f59e0b}.ais-popup{color:#e0e0f0;min-width:180px;font-family:system-ui,sans-serif;font-size:12px}.ais-popup-title{color:#f59e0b;border-bottom:1px solid #444;margin-bottom:8px;padding-bottom:5px;font-size:13px;font-weight:600}.ais-popup table{border-collapse:collapse;width:100%}.ais-popup td{vertical-align:top;padding:2px 6px 2px 0}.ais-popup td:first-child{color:#888;white-space:nowrap;padding-right:12px}.ais-section{color:#666;text-transform:uppercase;letter-spacing:.08em;padding-top:8px;font-size:10px;font-weight:600}.ais-links{border-top:1px solid #333;gap:8px;margin-top:8px;padding-top:8px;display:flex}.ais-links a{color:#60a5fa;text-align:center;background:#60a5fa1a;border-radius:4px;flex:1;padding:3px 0;font-size:11px;text-decoration:none}.ais-links a:hover{background:#60a5fa33}.maplibregl-popup-content{background:#1e1e2e;border-radius:8px;padding:12px 14px;box-shadow:0 4px 20px #0009}.ais-disambig-list{margin:0;padding:0;list-style:none}.ais-disambig-item{cursor:pointer;color:#e0e0f0;white-space:nowrap;border-radius:4px;padding:6px 8px;font-size:12px;transition:background .12s}.ais-disambig-item:hover{color:#93c5fd;background:#60a5fa2e}.maplibregl-popup-tip{border-top-color:#1e1e2e}.maplibregl-popup-close-button{color:#888;font-size:16px}.maplibregl-popup{z-index:10}.gear-btn.svelte-1u3w06f{z-index:10;color:#fff;cursor:pointer;background:#000000b3;border:none;border-radius:6px;padding:6px 10px;font-size:16px;position:absolute;top:44px;left:10px}.backdrop.svelte-1u3w06f{z-index:20;background:#00000080;position:fixed;inset:0}.modal.svelte-1u3w06f{z-index:21;color:#fff;background:#1e1e2e;border-radius:10px;min-width:440px;max-height:90vh;padding:24px;font-family:system-ui,sans-serif;position:fixed;top:50%;left:50%;overflow-y:auto;transform:translate(-50%,-50%);box-shadow:0 8px 32px #00000080}h2.svelte-1u3w06f{margin:0 0 16px;font-size:16px;font-weight:600}.tabs.svelte-1u3w06f{border-bottom:1px solid #335;margin-bottom:20px;display:flex}.tab.svelte-1u3w06f{color:#a0a0c0;cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-1px;padding:8px 18px;font-size:13px}.tab.active.svelte-1u3w06f{color:#fff;border-bottom-color:#4a6cf7}.section-title.svelte-1u3w06f{color:#668;text-transform:uppercase;letter-spacing:.08em;margin:16px 0 10px;font-size:11px;font-weight:600}.row.svelte-1u3w06f{align-items:center;gap:12px;margin-bottom:10px;display:flex}.row.svelte-1u3w06f>label:where(.svelte-1u3w06f){color:#a0a0c0;flex-shrink:0;width:72px;font-size:13px}.field.svelte-1u3w06f{flex:1;align-items:center;gap:8px;display:flex}.unit.svelte-1u3w06f{color:#668;font-size:12px}.hint.svelte-1u3w06f{color:#668;word-break:break-all;margin:2px 0 12px 84px;font-size:11px}input[type=text].svelte-1u3w06f,input[type=number].svelte-1u3w06f,select.svelte-1u3w06f{color:#fff;box-sizing:border-box;background:#2a2a3e;border:1px solid #446;border-radius:6px;padding:6px 8px;font-size:13px}input[type=text].svelte-1u3w06f{flex:1}input[type=number].svelte-1u3w06f{-moz-appearance:textfield;width:80px}select.svelte-1u3w06f{cursor:pointer}input[type=color].svelte-1u3w06f{cursor:pointer;background:0 0;border:1px solid #446;border-radius:6px;width:40px;height:30px;padding:2px}.actions.svelte-1u3w06f{justify-content:flex-end;gap:10px;margin-top:24px;display:flex}.btn.svelte-1u3w06f{cursor:pointer;border-radius:6px;padding:7px 16px;font-size:13px}.btn-cancel.svelte-1u3w06f{color:#a0a0c0;background:0 0;border:1px solid #446}.btn-save.svelte-1u3w06f{color:#fff;background:#4a6cf7;border:none}.fps-field.svelte-1u3w06f{flex:1;align-items:center;gap:8px;display:flex}.fps-slider.svelte-1u3w06f{cursor:pointer;flex:1;min-width:100px}.fps-target.svelte-1u3w06f{text-align:right;font-variant-numeric:tabular-nums;min-width:5rem;font-size:13px}.fps-actual.svelte-1u3w06f{color:#668;text-align:right;font-variant-numeric:tabular-nums;min-width:3.5rem;font-size:11px}.charts-btn.svelte-1mbfew2{z-index:10;color:#fff;cursor:pointer;background:#000000b3;border:none;border-radius:6px;padding:6px 10px;font-size:16px;transition:background .15s;position:absolute;top:80px;left:10px}.charts-btn.svelte-1mbfew2:hover{background:#282850e6}.charts-btn.active.svelte-1mbfew2{background:#2563ebd9;border:1px solid #3b82f6}.backdrop.svelte-1mbfew2{z-index:20;position:fixed;inset:0}.panel.svelte-1mbfew2{z-index:21;color:#fff;background:#1e1e2e;border-radius:10px;flex-direction:column;min-width:280px;max-width:360px;max-height:70vh;padding:0;font-family:system-ui,sans-serif;display:flex;position:absolute;top:44px;left:50px;overflow:hidden;box-shadow:0 8px 32px #00000080}.panel-header.svelte-1mbfew2{border-bottom:1px solid #2a2a3e;flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 16px 10px;display:flex}.panel-title.svelte-1mbfew2{color:#fff;text-transform:uppercase;letter-spacing:.06em;font-size:13px;font-weight:600}.close-btn.svelte-1mbfew2{color:#668;cursor:pointer;background:0 0;border:none;padding:0 2px;font-size:14px}.close-btn.svelte-1mbfew2:hover{color:#fff}.hint-row.svelte-1mbfew2{color:#668;padding:10px 16px;font-size:12px;list-style:none}.hint-row.error.svelte-1mbfew2{color:#f87171}.chart-list.svelte-1mbfew2{margin:0;padding:0;list-style:none;overflow-y:auto}.chart-row.svelte-1mbfew2{border-bottom:1px solid #2a2a3e;align-items:flex-start;gap:10px;padding:10px 16px;display:flex}.chart-row.svelte-1mbfew2:last-child{border-bottom:none}.chart-row.svelte-1mbfew2 input[type=checkbox]:where(.svelte-1mbfew2){cursor:pointer;flex-shrink:0;margin-top:3px}.chart-info.svelte-1mbfew2{flex-direction:column;gap:2px;min-width:0;display:flex}.chart-name.svelte-1mbfew2{color:#fff;cursor:pointer;flex-wrap:wrap;align-items:center;gap:6px;font-size:13px;display:flex}.chart-desc.svelte-1mbfew2{color:#a0a0c0;font-size:11px}.chart-meta.svelte-1mbfew2{color:#668;font-size:11px}.badge.svelte-1mbfew2{color:#7b8cde;text-transform:uppercase;letter-spacing:.05em;background:#2a2a4e;border-radius:4px;padding:1px 5px;font-size:9px;font-weight:700}.wmts-warning.svelte-1mbfew2{color:#f59e0b;margin-top:4px;font-size:11px}.wmts-manual.svelte-1mbfew2{gap:6px;margin-top:4px;display:flex}.wmts-input.svelte-1mbfew2{color:#fff;background:#2a2a3e;border:1px solid #446;border-radius:4px;flex:1;min-width:0;padding:3px 6px;font-size:11px}.wmts-apply.svelte-1mbfew2{color:#fff;cursor:pointer;white-space:nowrap;background:#2563eb;border:none;border-radius:4px;padding:3px 8px;font-size:11px}.wmts-apply.svelte-1mbfew2:hover{background:#1d4ed8}.wmts-ok.svelte-1mbfew2{color:#34d399;margin-top:2px;font-size:11px}.wmts-clear.svelte-1mbfew2{color:#668;cursor:pointer;background:0 0;border:1px solid #446;border-radius:4px;align-self:flex-start;margin-top:2px;padding:1px 6px;font-size:10px}.wmts-clear.svelte-1mbfew2:hover{color:#f87171;border-color:#f87171}.wmts-layer-row.svelte-1mbfew2{align-items:center;gap:6px;margin-top:4px;display:flex}.wmts-layer-label.svelte-1mbfew2{color:#668;flex-shrink:0;font-size:11px}.wmts-layer-select.svelte-1mbfew2{color:#fff;cursor:pointer;background:#2a2a3e;border:1px solid #446;border-radius:4px;flex:1;padding:2px 4px;font-size:11px}.wmts-showall-label.svelte-1mbfew2{color:#668;cursor:pointer;white-space:nowrap;flex-shrink:0;align-items:center;gap:3px;font-size:11px;display:flex}.wmts-showall-label.svelte-1mbfew2:hover{color:#a0a0c0}
|