ocearo-ui 2.0.1 → 2.1.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/404.html +1 -1
- package/README.fr.md +23 -3
- package/README.md +23 -3
- package/__next.__PAGE__.txt +3 -3
- package/__next._full.txt +3 -3
- package/__next._tree.txt +2 -2
- package/_next/static/chunks/0-jqvc-r0kh0c.js +1 -0
- package/_next/static/chunks/{2g-xpe7xnropn.js → 05do10p9ldt1p.js} +1 -1
- package/_next/static/chunks/07gn9z0d6clzs.js +1 -0
- package/_next/static/chunks/{2w44atvyp9o_w.js → 096zaxs1gf_3q.js} +2 -1
- package/_next/static/chunks/0b3cus8izqkmg.js +119 -0
- package/_next/static/chunks/0j11dppxb9l0b.js +1 -0
- package/_next/static/chunks/0jucaltuccn03.js +1 -0
- package/_next/static/chunks/{1gt2hhqk1821k.js → 0zvzu5fnwh4_a.js} +3 -3
- package/_next/static/chunks/1_g85m2d7jjpo.css +3 -0
- package/_next/static/chunks/1arvue9o-atui.js +739 -0
- package/_next/static/chunks/1bo0ke8gjc1c2.js +1 -0
- package/_next/static/chunks/1cp1kkarm5gxz.js +1 -0
- package/_next/static/chunks/1e-w_-usen7fy.js +3 -0
- package/_next/static/chunks/1hz_mzl8l35j8.js +1 -0
- package/_next/static/chunks/1k72cpd0x8veh.js +1 -0
- package/_next/static/chunks/1mtfh1vqpvit2.js +1 -0
- package/_next/static/chunks/1u6o5_s2b39xh.js +1 -0
- package/_next/static/chunks/{1exvcc71cgr4t.js → 2aivnrnff0avu.js} +1 -1
- package/_next/static/chunks/2fe99e03gnvg9.js +1 -0
- package/_next/static/chunks/{3nm7o0eq5abhg.js → 2fthh9f57zzm2.js} +1 -1
- package/_next/static/chunks/{0jfox92up1jvy.js → 2gr1d26f-ymoh.js} +1 -1
- package/_next/static/chunks/2r98jty3a4wel.js +564 -0
- package/_next/static/chunks/2v6ebsavxlgyw.js +1 -0
- package/_next/static/chunks/{1w1xks0hp_tlr.js → 33u782y6vhw-f.js} +9 -9
- package/_next/static/chunks/3qik_nv7zlj4e.js +1 -0
- package/_next/static/chunks/3qzb9nvvw-b-k.js +1 -0
- package/_next/static/chunks/41mro59si-xxc.js +1 -0
- package/_next/static/chunks/41odv061mfm6t.js +1 -0
- package/_not-found/__next._full.txt +2 -2
- package/_not-found/__next._not-found.__PAGE__.txt +2 -2
- package/_not-found/__next._tree.txt +2 -2
- package/_not-found.html +1 -1
- package/_not-found.txt +2 -2
- package/docs/index.json +10 -5
- package/docs/signalk-server.html +3751 -0
- package/docs/signalk-specification.html +8507 -0
- package/guide/anchor.jpg +0 -0
- package/guide/bathymetry.jpg +0 -0
- package/guide/dashboard.jpg +0 -0
- package/guide/hero.jpg +0 -0
- package/guide/logbook.jpg +0 -0
- package/guide/mob.jpg +0 -0
- package/guide/parking.jpg +0 -0
- package/guide/polars.jpg +0 -0
- package/guide/traffic.jpg +0 -0
- package/guide/weather.jpg +0 -0
- package/index.html +1 -1
- package/index.txt +3 -3
- package/package.json +5 -7
- package/settings/__next._full.txt +3 -3
- package/settings/__next._tree.txt +2 -2
- package/settings/__next.settings.__PAGE__.txt +3 -3
- package/settings.html +1 -1
- package/settings.txt +3 -3
- package/_next/static/chunks/0iqdztntvxh3c.js +0 -119
- package/_next/static/chunks/0iztd835j5p1n.js +0 -700
- package/_next/static/chunks/0voiofm58khqd.js +0 -1
- package/_next/static/chunks/0w_skktmh3e48.js +0 -1
- package/_next/static/chunks/0zwc9m4qgtwle.js +0 -1
- package/_next/static/chunks/144mjqdrx42lq.js +0 -1
- package/_next/static/chunks/1ed7ayfg19cjb.js +0 -1
- package/_next/static/chunks/1epya-yh2wvj2.js +0 -1
- package/_next/static/chunks/1gq4t2dyr7rq3.js +0 -1
- package/_next/static/chunks/1ptj3mv8b_tzs.js +0 -1
- package/_next/static/chunks/1y35unwvy8p98.js +0 -1
- package/_next/static/chunks/1zm03hw2ylxw8.js +0 -1
- package/_next/static/chunks/2aq8orcir5h03.js +0 -1
- package/_next/static/chunks/2kmptoy43h0mx.js +0 -1
- package/_next/static/chunks/2kwn4iymxaom3.js +0 -1
- package/_next/static/chunks/2rebcvig176xk.js +0 -564
- package/_next/static/chunks/2ryo_bbmt6t74.css +0 -3
- package/_next/static/chunks/3--qzv1u6c7_7.js +0 -1
- package/_next/static/chunks/37t6vg8fb1-z8.js +0 -1
- package/_next/static/chunks/3p9ziqn6r35qf.js +0 -1
- package/_next/static/chunks/3q8o52_juxmdp.js +0 -1
- package/docs/opencpn.pdf +0 -0
- package/docs/signalk.pdf +0 -0
- /package/_next/static/{01VWnAYjs9QwBnnMyWbQF → EuchA2ImhjrwCnR5WjCLX}/_buildManifest.js +0 -0
- /package/_next/static/{01VWnAYjs9QwBnnMyWbQF → EuchA2ImhjrwCnR5WjCLX}/_clientMiddlewareManifest.js +0 -0
- /package/_next/static/{01VWnAYjs9QwBnnMyWbQF → EuchA2ImhjrwCnR5WjCLX}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,20705,e=>{"use strict";let t=["north","east","south","west"],r=["port","starboard","preferred_channel_port","preferred_channel_starboard"],n=e=>{let n=Number(e);return n>=9&&n<=12?{kind:"cardinal",beacon:!0,category:t[n-9]}:n>=13&&n<=16?{kind:"lateral",beacon:!0,category:r[n-13]}:17===n?{kind:"isolated_danger",beacon:!0}:18===n?{kind:"safe_water",beacon:!0}:19===n?{kind:"special_purpose",beacon:!0}:n>=20&&n<=23?{kind:"cardinal",beacon:!1,category:t[n-20]}:n>=24&&n<=27?{kind:"lateral",beacon:!1,category:r[n-24]}:28===n?{kind:"isolated_danger",beacon:!1}:29===n?{kind:"safe_water",beacon:!1}:30===n?{kind:"special_purpose",beacon:!1}:4===n?{kind:"special_purpose",beacon:!1,colours:["blue","yellow"],pattern:"vertical",topmark:{shape:"cross",colours:["yellow"]}}:{kind:"station",beacon:!0}},i=e=>{let t=n(e.atonType);return{id:`ais:${e.id}`,lat:e.latitude,lon:e.longitude,name:e.name||"",kind:t.kind,beacon:t.beacon,category:t.category||"",shape:"",colours:t.colours||[],pattern:t.pattern||"",system:"",height:null,topmark:t.topmark||null,light:null,ais:!0,virtual:e.virtual,offPosition:e.offPosition}},a=(e,t)=>Math.hypot((t.lat-e.lat)*111320,(t.lon-e.lon)*111320*Math.cos(e.lat*Math.PI/180));e.s(["atonKind",0,n,"mergeAtons",0,(e,t)=>{if(!t.length)return e;let r=e.map(e=>({...e})),n=[];for(let e of t){if(!Number.isFinite(e.latitude)||!Number.isFinite(e.longitude))continue;let t=i(e),o=!t.virtual&&r.find(e=>!e.ais&&("station"===t.kind||e.kind===t.kind)&&60>=a(e,t));o?(o.ais=!0,o.offPosition=t.offPosition,o.name||(o.name=t.name)):n.push(t)}return[...r,...n]}])},77291,24752,e=>{"use strict";var t=e.i(71645),r=e.i(62588),n=e.i(85709),i=e.i(61969),a=e.i(539);let o=Math.PI/180,s={power:1,sail:2,fishing:3,restricted:4},l=e=>{let t=String(e.navState||"").toLowerCase();if(/not under command|restricted|constrained/.test(t))return"restricted";if(/fishing/.test(t))return"fishing";if(/sailing/.test(t))return"sail";if(/motoring|engine/.test(t))return"power";let r=Number(e.shipType);return 36===r?"sail":30===r?"fishing":33===r?"restricted":"power"},u=(e,t,r)=>(0,a.wrapPi)(Math.atan2(t.x-e.x,t.y-e.y)-r),d=(e,t,r)=>{let n={x:0,y:0},i=u(n,t,e.course),l=u(t,n,t.course),d=Math.sign(l)||1,g=e=>Math.abs(e)>112.5*o;if(g(i)&&t.speed>e.speed)return{ownRole:"stand-on",rule:"13",reason:"overtakenByTarget",targetTurn:0};if(g(l)&&e.speed>t.speed)return{ownRole:"give-way",rule:"13",reason:"overtaking",targetTurn:0};let c=s[e.category]??1,p=s[t.category]??1;if(c!==p)return c<p?{ownRole:"give-way",rule:"18",reason:`giveWayTo_${t.category}`,targetTurn:0}:{ownRole:"stand-on",rule:"18",reason:`standOnFrom_${t.category}`,targetTurn:d};if("sail"===e.category&&Number.isFinite(r)){let n=(0,a.wrapPi)(r-e.course)>=0?"starboard":"port";return n!==((0,a.wrapPi)(r-t.course)>=0?"starboard":"port")?"port"===n?{ownRole:"give-way",rule:"12a-i",reason:"portTack",targetTurn:0}:{ownRole:"stand-on",rule:"12a-i",reason:"targetPortTack",targetTurn:d}:t.x*Math.sin(r)+t.y*Math.cos(r)>0?{ownRole:"stand-on",rule:"12a-ii",reason:"targetWindward",targetTurn:d}:{ownRole:"give-way",rule:"12a-ii",reason:"ownWindward",targetTurn:0}}return Math.abs((0,a.wrapPi)(t.course-e.course-Math.PI))<10*o&&Math.abs(i)<6*o?{ownRole:"both",rule:"14",reason:"headOn",targetTurn:1}:i>0?{ownRole:"give-way",rule:"15",reason:"crossingStarboard",targetTurn:0}:{ownRole:"stand-on",rule:"15",reason:"crossingPort",targetTurn:d}};e.s(["rightOfWay",0,d,"targetCategory",0,l],24752);var g=e.i(83402),c=e.i(67561);let p=[],m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,({always:e=!1}={})=>{let a,o,{targets:s}=(0,r.useAIS)({passive:!0}),{states:u}=(0,c.useOcearoContext)(),h=e||u.ais?s:p,{twd:b,heading:f}=(0,i.default)(),v=(0,n.useSignalKPaths)(m),w=(a=(0,n.useSignalKPrefix)("propulsion."),o=g.default.get("ownVesselCategory"),(0,t.useMemo)(()=>"sail"===o||"power"===o?o:Object.entries(a).some(([e,t])=>e.endsWith(".revolutions")&&Number(t)>.5||e.endsWith(".state")&&"started"===t)?"power":"sail",[a,o])),y=g.default.get("aisLengthScalingFactor")||.7;return(0,t.useMemo)(()=>{let e=v["navigation.courseOverGroundTrue"]??f,t=v["navigation.speedOverGround"]??0,r=[];if(Number.isFinite(e))for(let n of h){if("danger"!==n.risk)continue;let i=n.cog??n.cogMagnetic??n.heading;if(!Number.isFinite(i)||null===n.sceneX)continue;let a=d({course:e,speed:t,category:w},{x:n.sceneX/y,y:-n.sceneZ/y,course:i,speed:n.sog??0,category:l(n)},b);r.push({target:{...n},role:a})}r.sort((e,t)=>(e.target.tcpaSeconds??1/0)-(t.target.tcpaSeconds??1/0));let n={};for(let e of h)"close"===e.risk?n[e.mmsi]="close":"danger"===e.risk&&(n[e.mmsi]="giveWay");for(let e of r)n[e.target.mmsi]="stand-on"===e.role.ownRole?"yields":"giveWay";let i=r.filter(e=>"stand-on"!==e.role.ownRole);return{ownCategory:w,encounters:r,statuses:n,giveWay:i.length>0,giveWayTo:i[0]||null,primary:r[0]||null}},[h,b,f,v,w,y])}],77291)},61969,e=>{"use strict";var t=e.i(71645),r=e.i(85709),n=e.i(539);let i=180/Math.PI,a=["navigation.speedThroughWater","navigation.speedOverGround","navigation.headingTrue","navigation.courseOverGroundTrue","environment.wind.speedTrue","environment.wind.angleTrueWater","environment.wind.directionTrue","performance.polarSpeed","performance.polarSpeedRatio","navigation.courseGreatCircle.nextPoint.bearingTrue"];e.s(["default",0,()=>{let e=(0,r.useSignalKPaths)(a);return(0,t.useMemo)(()=>{let t=e["navigation.speedThroughWater"]??e["navigation.speedOverGround"]??null,r=e["navigation.headingTrue"]??e["navigation.courseOverGroundTrue"]??null,a=e["environment.wind.speedTrue"]??null,o=e["environment.wind.angleTrueWater"]??null,s=e["environment.wind.directionTrue"]??null;null===s&&Number.isFinite(o)&&Number.isFinite(r)&&(s=(0,n.wrapPi)(r+o));let l=e["performance.polarSpeed"]??(Number.isFinite(a)&&Number.isFinite(o)?(0,n.polarSpeedSi)(a,o):null),u=e["performance.polarSpeedRatio"]??null;null===u&&Number.isFinite(t)&&Number.isFinite(l)&&l>.2&&(u=t/l);let d=Number.isFinite(t)&&Number.isFinite(l)?(t-l)*1.943844:null,g=null,c=null,p=!Number.isFinite(o)||Math.abs(o)<Math.PI/2;if(Number.isFinite(a)){let e=p?(0,n.optimalUpwind)(1.943844*a):(0,n.optimalDownwind)(1.943844*a);e&&(g=e.twa/i,Number.isFinite(s)&&Number.isFinite(o)&&(c=(0,n.wrapPi)(s-Math.sign(o||1)*g)))}let m=e["navigation.courseGreatCircle.nextPoint.bearingTrue"],h=null;if(Number.isFinite(m)&&Number.isFinite(s)&&Number.isFinite(a)){let e=(0,n.bestVmcHeading)({twd:s,tws:a,bearing:m}),t=Number.isFinite(r)?(0,n.vmcForHeading)({twd:s,tws:a,bearing:m,heading:r}):null;h=e?{bearing:m,best:e,current:t}:null}return{ratio:u,polarSpeed:l,boatSpeed:t,deltaKn:d,heading:r,twd:s,tws:a,twa:o,targetTwa:g,targetHeading:c,upwind:p,vmc:h}},[e])}])},83646,e=>{"use strict";var t=e.i(67561);e.s(["default",0,()=>(0,t.useOcearoContext)().tokens])},74452,(e,t,r)=>{t.exports={vpp:{angles:[52,60,75,90,110,120,135,150],speeds:[6,8,10,12,14,16,20],52:[4.98,5.86,6.31,6.45,6.51,6.52,6.41],60:[5.25,6.11,6.56,6.73,6.79,6.82,6.79],75:[5.45,6.33,6.77,7.01,7.13,7.2,7.24],90:[5.66,6.55,7,7.25,7.38,7.53,7.7],110:[5.49,6.49,7.04,7.4,7.69,7.97,8.38],120:[5.32,6.36,6.97,7.39,7.77,8.1,8.6],135:[4.81,5.92,6.68,7.15,7.55,7.95,8.85],150:[4.09,5.17,6.04,6.61,6.99,7.31,7.93],beat_angle:[43.6,42,41.2,41.2,41.7,42.1,44.2],beat_vmg:[3.26,3.91,4.24,4.34,4.36,4.34,4.16],run_angle:[144.8,147.8,148.5,149.6,171.8,175.4,177.2],run_vmg:[3.54,4.48,5.23,5.73,6.17,6.67,7.36]}}},539,e=>{"use strict";var t=e.i(74452);let r=180/Math.PI,n=t.default.vpp,i=(e,t,r)=>e+(t-e)*r,a=(e,t)=>{if(t<=e[0])return[0,0];let r=e.length-1;if(t>=e[r])return[r-1,1];let n=0;for(;t>e[n+1];)n++;return[n,(t-e[n])/(e[n+1]-e[n])]},o=n.speeds.map((e,t)=>(e=>{let t=n.beat_angle[e],i=n.run_angle[e],a=n.beat_vmg[e]/Math.cos(t/r),o=n.run_vmg[e]/Math.abs(Math.cos(i/r)),s=[[0,0],[.7*t,.55*a],[t,a]];for(let r of n.angles)r>t&&r<i&&s.push([r,n[String(r)][e]]);return s.push([i,o]),i<180&&s.push([180,n.run_vmg[e]]),s})(t)),s=(e,t)=>{let[r,n]=a(e.map(e=>e[0]),t);return i(e[r][1],e[r+1][1],n)},l=(e,t)=>{if(!Number.isFinite(e)||!Number.isFinite(t)||e<=0)return null;let r=Math.min(180,Math.abs((t+540)%360-180)),l=n.speeds;if(e<l[0])return s(o[0],r)*(e/l[0]);let[u,d]=a(l,e);return i(s(o[u],r),s(o[u+1],r),d)},u=(e,t)=>{let[r,o]=a(n.speeds,t);return i(e[r],e[r+1],o)},d=(e,t)=>{let n=l(1.943844*e,t*r);return null===n?null:n/1.943844},g=e=>{let t=(e+Math.PI)%(2*Math.PI);return t<0&&(t+=2*Math.PI),t-Math.PI};e.s(["bestVmcHeading",0,({twd:e,tws:t,bearing:n})=>{if(![e,t,n].every(Number.isFinite)||t<=0)return null;let i=null;for(let a=-100;a<=100;a++){let o=n+a/r,s=d(t,g(e-o));if(null===s)continue;let l=s*Math.cos(o-n);(!i||l>i.vmc)&&(i={heading:g(o),speed:s,vmc:l})}return i},"optimalDownwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let t=u(n.run_angle,e),i=l(e,t);return{twa:t,speed:i,vmg:-i*Math.cos(t/r)}},"optimalUpwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let t=u(n.beat_angle,e),i=l(e,t);return{twa:t,speed:i,vmg:i*Math.cos(t/r)}},"polarSpeed",0,l,"polarSpeedSi",0,d,"vmcForHeading",0,({twd:e,tws:t,bearing:r,heading:n})=>{if(![e,t,r,n].every(Number.isFinite))return null;let i=d(t,g(e-n));return null===i?null:i*Math.cos(n-r)},"wrapPi",0,g])}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,9229,e=>{"use strict";var t=e.i(43476),i=e.i(71645),l=e.i(78954);e.i(85269);var n=e.i(22831),s=e.i(95430);let o={BACKGROUND:"bg-oGreen",TEXT:"text-oGreen"},a={BACKGROUND:"bg-oYellow",TEXT:"text-oYellow"};e.s(["default",0,()=>{let{t:e}=(0,n.useTranslation)(),[r,u]=(0,i.useState)(240),m=(0,l.default)(),h=(0,i.useCallback)(e=>{if(!e)return null;if("string"==typeof e&&(e.includes("T")||e.includes("-"))){let t=new Date(e);if(!isNaN(t.getTime()))return t.toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit",hour12:!1})}return e},[]),d=(0,i.useCallback)((e,t,i)=>i<=t||!e?0:Math.min(100,Math.max(0,(e-t)/(i-t)*100)),[]);(0,i.useEffect)(()=>{let e=()=>{let e=window.innerHeight;u(e<640?Math.min(.25*e,240):Math.min(.35*e,240))};return e(),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[]);let{level:c,high:g,low:p,timeLow:f,timeHigh:v,coefficient:x,isRising:w}=(0,i.useMemo)(()=>{let{hasData:e,chartData:t,coefficient:i,timeLow:l,timeHigh:n}=m;if(!e||t.length<2)return{level:null,high:null,low:null,timeLow:null,timeHigh:null,coefficient:null,isRising:null};let o=t[0].ms,a=t[t.length-1].ms,r=Math.min(1,Math.max(0,((0,s.vesselNow)().getTime()-o)/(a-o)))*(t.length-1),u=Math.min(t.length-2,Math.floor(r)),h=t[u].height+(t[u+1].height-t[u].height)*(r-u),d=t.map(e=>e.height);return{level:Number.isFinite(m.level)?m.level:h,high:m.high??Math.max(...d),low:m.low??Math.min(...d),timeLow:l,timeHigh:n,coefficient:i,isRising:m.isRising}},[m]),N="text-hud-main",T=w?o:a,b=(0,i.useMemo)(()=>d(c,p,g),[c,p,g,d]);return null===c||null===g||null===p?null:(0,t.jsxs)("div",{className:"flex flex-col items-center group p-3 transition-all duration-300",children:[(0,t.jsx)("div",{className:`text-caption font-semibold uppercase tracking-[0.2em] mb-1 opacity-40 group-hover:opacity-100 transition-opacity ${N}`,children:e("indicators.tide")}),(0,t.jsxs)("div",{className:`text-caption font-semibold uppercase tracking-widest mb-4 ${N} flex items-center gap-1.5 opacity-60`,children:[(0,t.jsx)("span",{className:"text-oBlue",children:h(v)}),(0,t.jsx)("span",{className:`inline-block transform ${!w&&"rotate-180"} ${T.TEXT} text-caption`,children:"▲"}),null!=x&&(0,t.jsxs)("span",{className:"text-hud-muted",children:["C",x]})]}),(0,t.jsxs)("div",{className:"relative flex flex-col w-12",style:{height:r},children:[(0,t.jsx)("div",{className:"absolute left-0 top-0 w-1.5 h-full bg-hud-elevated rounded-full overflow-hidden",children:(0,t.jsx)("div",{role:"progressbar",className:`${T.BACKGROUND} w-full rounded-full transition-all duration-1000 ease-in-out absolute bottom-0 left-0`,"aria-valuenow":b,"aria-valuemin":"0","aria-valuemax":"100","aria-label":`Tide level: ${c.toFixed(2)} meters`,style:{height:`${b}%`}})}),(0,t.jsxs)("div",{className:"ml-4 h-full relative",children:[(0,t.jsxs)("span",{className:`absolute ${N} text-caption font-semibold uppercase tracking-tighter opacity-30`,style:{top:"0%"},children:[Number(g).toFixed(1),"m"]}),b>10&&b<90&&(0,t.jsxs)("div",{className:"absolute transition-all duration-500 flex items-center space-x-1",style:{bottom:`${b}%`,transform:"translateY(50%)"},children:[(0,t.jsx)("div",{className:`w-2 h-[1px] ${T.BACKGROUND} opacity-50`}),(0,t.jsxs)("span",{className:`${N} text-caption font-semibold tracking-tight`,children:[c.toFixed(2),"m"]})]}),(0,t.jsxs)("span",{className:`absolute ${N} text-caption font-semibold uppercase tracking-tighter opacity-30`,style:{bottom:"0%"},children:[Number(p).toFixed(1),"m"]})]})]}),(0,t.jsx)("div",{className:`text-caption font-semibold uppercase tracking-widest mt-4 opacity-40 ${N}`,children:h(f)})]})}])},58166,function(e){e.n(e.i(9229))},78954,e=>{"use strict";var t=e.i(71645),i=e.i(11426),l=e.i(85709),n=e.i(83402),s=e.i(83646),o=e.i(95430);let a=(e,t,i,l,n)=>{let s=i.getTime(),o=((e,t,i,l)=>{let n=i.getTime(),s=l.getTime(),o=i=>"high"===i?e:t,a=e=>"high"===e?"low":"high",r=n<s?{time:n,type:"high"}:{time:s,type:"low"},u=n<s?{time:s,type:"low"}:{time:n,type:"high"},m=[];for(let e=5;e>=1;e--){let t=e%2?a(r.type):r.type;m.push({time:r.time-22356e3*e,height:o(t),type:t})}m.push({...r,height:o(r.type)},{...u,height:o(u.type)});for(let e=1;e<=5;e++){let t=e%2?a(u.type):u.type;m.push({time:u.time+22356e3*e,height:o(t),type:t})}return m})(e,t,l,n);for(let i=0;i<o.length-1;i++)if(s>=o[i].time&&s<=o[i+1].time){let l=o[i].height,n=o[i+1].height,a=o[i+1].time-o[i].time;if(a<=0)return(e+t)/2;return parseFloat((l+(n-l)*((1-Math.cos((s-o[i].time)/a*Math.PI))/2)).toFixed(2))}return(e+t)/2},r=e=>{if(!e)return null;if(e.includes("T")||e.includes("-")){let t=new Date(e);return isNaN(t.getTime())?null:t}let t=e.split(":").map(Number);if(t.length<2)return null;let i=(0,o.vesselNow)();return i.setHours(t[0],t[1],0,0),i};e.s(["default",0,()=>{let e=(0,s.default)(),u=n.default.get("debugMode"),m=(0,t.useMemo)(()=>["environment.tide.heightNow","environment.tide.heightHigh","environment.tide.heightLow","environment.tide.timeLow","environment.tide.timeHigh","environment.tide.coeffNow"],[]),h=(0,l.useSignalKPaths)(m),{tideData:d}=(0,i.useTide)(),c=h["environment.tide.heightNow"]??d?.level??null,g=h["environment.tide.heightHigh"]??d?.high??null,p=h["environment.tide.heightLow"]??d?.low??null,f=h["environment.tide.timeLow"]??d?.timeLow??null,v=h["environment.tide.timeHigh"]??d?.timeHigh??null,x=h["environment.tide.coeffNow"]??d?.coefficient??null,w=null!==c||null!==g||null!==p||u,N=(0,t.useMemo)(()=>r(v),[v]),T=(0,t.useMemo)(()=>r(f),[f]),b=(0,t.useMemo)(()=>{let e,t,i=g||4.2,l=p||.8,n=N||((e=(0,o.vesselNow)()).setHours(14,0,0,0),e),s=T||((t=(0,o.vesselNow)()).setHours(8,0,0,0),t),r=[],u=(0,o.vesselNow)(),m=new Date(u);m.setHours(0,0,0,0);for(let e=0;e<=48;e++){let t=new Date(m.getTime()+30*e*6e4),o=a(i,l,t,n,s);r.push({time:t.toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit",hour12:!1}),height:o,ms:t.getTime(),isNow:9e5>Math.abs(t.getTime()-u.getTime())})}return r},[g,p,N,T]),y=(0,t.useMemo)(()=>{if(N&&T)return N.getTime()<T.getTime();let e=(0,o.vesselNow)().getTime(),t=b.findIndex(t=>t.ms>e);return!(t<=0)&&b[t].height>b[t-1].height},[N,T,b]),M=y?e.ok:e.accent;return{hasData:w,level:c,high:g,low:p,timeHigh:v,timeLow:f,coefficient:x,isRising:y,tideColor:M,chartData:b}},"formatTideTime",0,e=>{if(!e)return null;if(e.includes("T")||e.includes("-")){let t=new Date(e);if(!isNaN(t.getTime()))return t.toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit",hour12:!1})}return e}])},83646,e=>{"use strict";var t=e.i(67561);e.s(["default",0,()=>(0,t.useOcearoContext)().tokens])}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,13181,e=>{e.v(t=>Promise.all(["static/chunks/2v6ebsavxlgyw.js","static/chunks/096zaxs1gf_3q.js","static/chunks/0ohleay4roayh.js","static/chunks/2gr1d26f-ymoh.js"].map(t=>e.l(t))).then(()=>t(23595)))},62588,90669,e=>{"use strict";var t=e.i(43476),n=e.i(71645),i=e.i(83402),a=e.i(66799),r=e.i(67561),l=e.i(85709);let s=()=>({cpaMeters:1852*(Number(i.default.get("cpaAlarmNM"))||.5),tcpaSeconds:60*(Number(i.default.get("tcpaAlarmMinutes"))||20)}),o=(e,t)=>({x:e*Math.sin(t),y:e*Math.cos(t)}),u=({rx:e,ry:t,ownSog:n,ownCog:i,targetSog:a,targetCog:r})=>{if(![e,t,n,i,a,r].every(Number.isFinite))return null;let l=o(n,i),s=o(a,r),u=s.x-l.x,c=s.y-l.y,d=u*u+c*c,g=d<1e-9?0:-(e*u+t*c)/d,f=Math.max(0,g);return{cpa:Math.hypot(e+u*f,t+c*f),tcpa:g,own:{x:l.x*f,y:l.y*f},target:{x:e+s.x*f,y:t+s.y*f}}},c=(e,t,n=s())=>{let i=!e||e.tcpa>0;return e&&e.tcpa>0&&e.tcpa<=n.tcpaSeconds&&e.cpa<n.cpaMeters||Number.isFinite(t)&&t<100&&i?"danger":Number.isFinite(t)&&t<Math.max(200,.3*n.cpaMeters)?"close":"none"};e.s(["closestApproach",0,u,"collisionRisk",0,c,"getCollisionThresholds",0,s],90669);let d=(0,n.createContext)(null),g=[],f=[...["navigation.position","navigation.speedOverGround","navigation.courseOverGroundTrue","navigation.courseOverGroundMagnetic","navigation.headingTrue","navigation.headingMagnetic"].map(e=>({path:e,policy:"instant"})),...["name","design.aisShipType","design.length","design.beam","communication.callsignVhf","navigation.state"].map(e=>({path:e}))],h=["navigation.position","atonType","name","virtual","offPosition"].map(e=>({path:e})),p=(e,t)=>t.split(".").reduce((e,t)=>e?.[t],e),m=e=>"string"==typeof e?e:"string"==typeof e?.value?e.value:null,v=e=>(e||"").replace(/^vessels\./,""),b=e=>/mmsi:(\d{9})$/.exec(e||"")?.[1]||null,y=e=>{let t=b(e);return!t||!t.startsWith("99")&&!t.startsWith("00")&&!t.startsWith("111")},w=e=>b(e)?.startsWith("99")??!1,S=e=>({id:e,mmsi:b(e),name:"",latitude:null,longitude:null,atonType:null,virtual:!1,offPosition:!1,distanceMeters:null,lastUpdate:0}),M=(e,t,n)=>{switch(t){case"navigation.position":n&&Number.isFinite(n.latitude)&&(e.latitude=n.latitude,e.longitude=n.longitude);break;case"atonType":e.atonType=n?.id??n??null;break;case"name":e.name=m(n)??e.name;break;case"virtual":e.virtual=!0===n;break;case"offPosition":e.offPosition=!0===n;break;case"":n?.name&&(e.name=m(n.name)??e.name)}},P=e=>({mmsi:e,name:"unknown",latitude:null,longitude:null,sog:null,cog:null,cogMagnetic:null,heading:null,headingMagnetic:null,length:null,beam:null,shipType:null,callsign:null,navState:null,distanceMeters:null,sceneX:null,sceneZ:null,cpaMeters:null,tcpaSeconds:null,risk:"none",cpaScene:null,rotationAngleY:0,visible:!1,lastUpdate:0,positionAt:0}),x=(e,t,n)=>{switch(t){case"name":return e.name=m(n)??e.name,!1;case"navigation.position":if(!n)return!1;return e.latitude=n.latitude,e.longitude=n.longitude,e.positionAt=Date.now(),!0;case"navigation.speedOverGround":return e.sog=n,!0;case"navigation.courseOverGroundTrue":return e.cog=n,!0;case"navigation.courseOverGroundMagnetic":return e.cogMagnetic=n,!0;case"navigation.headingTrue":return e.heading=n,!0;case"navigation.headingMagnetic":return e.headingMagnetic=n,!0;case"design.aisShipType":return e.shipType=n?.id??n,!1;case"design.length":return e.length=n?.overall??n,!1;case"design.beam":return e.beam=n,!1;case"communication.callsignVhf":return e.callsign=n,!1;case"navigation.state":return e.navState=n,!1;default:return!1}};e.s(["AISProvider",0,({children:e})=>{let{convertLatLonToXY:o}=(0,r.useOcearoContext)(),b=(0,l.useSignalKPath)("navigation.position"),C=(0,l.useSignalKPath)("navigation.speedOverGround"),T=(0,l.useSignalKPath)("navigation.courseOverGroundTrue"),j=(0,l.useSignalKPath)("navigation.headingTrue"),O=(0,n.useRef)({sog:null,cog:null}),k=(0,n.useRef)({vx:0,vy:0,fixAt:0,scale:.7}),[R]=(0,n.useState)(s),A=(0,n.useRef)({}),F=(0,n.useRef)({}),N=(0,n.useRef)(null),_=(0,n.useRef)(b),D=(0,n.useRef)(!1),U=(0,n.useRef)(""),[I,W]=(0,n.useState)(0),[E,K]=(0,n.useState)({aisData:{},vesselIds:g,targets:g,atons:g}),B=(0,n.useCallback)(()=>(W(e=>e+1),()=>W(e=>e-1)),[]),L=(0,n.useCallback)(e=>{let t=_.current;if(!Number.isFinite(e.latitude)||!Number.isFinite(e.longitude)||!Number.isFinite(t?.latitude)||!Number.isFinite(t?.longitude)){e.visible=!1,e.distanceMeters=null;return}let n=i.default.get("aisLengthScalingFactor")||.7,{x:a,y:r}=o({lat:e.latitude,lon:e.longitude},{lat:t.latitude,lon:t.longitude});e.sceneX=a*n,e.sceneZ=-r*n,e.rotationAngleY=e.heading??e.headingMagnetic??e.cog??e.cogMagnetic??0,e.distanceMeters=Math.hypot(a,r),e.visible=e.distanceMeters>10&&e.distanceMeters<=5e3;let l=O.current,s=u({rx:a,ry:r,ownSog:l.sog,ownCog:l.cog,targetSog:e.sog,targetCog:e.cog??e.cogMagnetic});e.cpaMeters=s?s.cpa:null,e.tcpaSeconds=s?s.tcpa:null,e.risk=c(s,e.distanceMeters,R),e.cpaScene=s&&s.tcpa>0?{targetX:s.target.x*n,targetZ:-s.target.y*n,ownX:s.own.x*n,ownZ:-s.own.y*n}:null},[o,R]),G=(0,n.useCallback)(e=>{let t=_.current;if(!Number.isFinite(e.latitude)||!Number.isFinite(t?.latitude)){e.distanceMeters=null;return}let{x:n,y:i}=o({lat:e.latitude,lon:e.longitude},{lat:t.latitude,lon:t.longitude});e.east=n,e.north=i,e.distanceMeters=Math.hypot(n,i)},[o]);(0,n.useEffect)(()=>{_.current=b,O.current={sog:C,cog:T??j};let e=T??j;k.current={vx:Number.isFinite(C)&&Number.isFinite(e)?C*Math.sin(e):0,vy:Number.isFinite(C)&&Number.isFinite(e)?C*Math.cos(e):0,fixAt:Date.now(),scale:i.default.get("aisLengthScalingFactor")||.7},Object.values(A.current).forEach(L),Object.values(F.current).forEach(G),D.current=!0},[b,C,T,j,L,G]),(0,n.useEffect)(()=>{if(0===I)return;let e=()=>{let e=Date.now(),t=A.current;for(let[n,i]of Object.entries(t))e-i.lastUpdate>6e5&&(delete t[n],D.current=!0);for(let[t,n]of Object.entries(F.current))e-n.lastUpdate>24e5&&(delete F.current[t],D.current=!0);if(!D.current)return;D.current=!1;let n=Object.values(t).filter(e=>null!==e.distanceMeters).sort((e,t)=>e.distanceMeters-t.distanceMeters),i=n.filter(e=>e.visible),a=i.map(e=>`${e.mmsi}|${e.shipType}|${e.length}|${e.beam}`).join(","),r=a!==U.current;U.current=a;let l=Object.values(F.current).filter(e=>null!==e.distanceMeters).sort((e,t)=>e.distanceMeters-t.distanceMeters).map(e=>({...e}));K(e=>({aisData:{...t},targets:n,vesselIds:r?i:e.vesselIds,atons:l}))};e();let t=setInterval(e,250);return()=>clearInterval(t)},[I]),(0,n.useEffect)(()=>{if(0===I)return;let e=!1,t=null,n=e=>"self"===e||N.current&&e===N.current,i=(e,t)=>{let n=F.current[e]||(F.current[e]=S(e));for(let e of(n.lastUpdate=Date.now(),t))for(let{path:t,value:i}of e.values||[])M(n,t,i);G(n),D.current=!0},r=e=>{let t;if(!e?.updates)return;if(t=e.context,/^atons\./.test(t||""))return void i(e.context.replace(/^atons\./,""),e.updates);let a=v(e?.context);if(a&&w(a))return void i(a,e.updates);if(!a||n(a)||!y(a)||!e.updates)return;let r=A.current,l=r[a]||(r[a]=P(a));l.lastUpdate=Date.now();let s=!1;for(let t of e.updates)if(t.values)for(let{path:e,value:n}of t.values)x(l,e,n)&&(s=!0);s&&L(l),D.current=!0},l=async t=>{let n=await t.get("/atons").catch(()=>null);if(e||!n)return;let i=Date.now();for(let[e,t]of Object.entries(n)){let n=F.current[e]||(F.current[e]=S(e)),a=p(t,"navigation.position.value");Number.isFinite(a?.latitude)&&(n.latitude=a.latitude,n.longitude=a.longitude),n.atonType=p(t,"atonType.value.id")??n.atonType,n.name=m(t.name)??n.name,n.virtual=!0===p(t,"virtual.value")||!0===t.virtual,n.offPosition=!0===p(t,"offPosition.value")||!0===t.offPosition,n.lastUpdate=i,G(n)}D.current=!0},s=async()=>{let a=await t.API();l(a);let r=await a.vessels();if(e||!r)return;let s=A.current,o=Date.now();for(let[e,t]of Object.entries(r)){if(n(e))continue;if(w(e)){let n=p(t,"navigation.position.value"),a=[{path:"name",value:t.name}];n&&a.push({path:"navigation.position",value:n}),i(e,[{values:a}]);continue}if(!y(e))continue;let a=s[e]||(s[e]=P(e)),r=(e,n)=>{let i=p(t,n);void 0!==i&&(a[e]=i)},l=m(t.name);l&&(a.name=l),r("latitude","navigation.position.value.latitude"),r("longitude","navigation.position.value.longitude"),r("sog","navigation.speedOverGround.value"),r("cog","navigation.courseOverGroundTrue.value"),r("cogMagnetic","navigation.courseOverGroundMagnetic.value"),r("heading","navigation.headingTrue.value"),r("headingMagnetic","navigation.headingMagnetic.value"),r("length","design.length.value.overall"),r("beam","design.beam.value"),r("callsign","communication.callsignVhf"),r("navState","navigation.state.value"),r("shipType","design.aisShipType.value.id"),a.lastUpdate=o,L(a)}D.current=!0};return(async()=>{try{if((t=a.default.createClient({deltaStreamBehaviour:"none",sendMeta:null,subscriptions:[{context:"vessels.*",subscribe:f},{context:"atons.*",subscribe:h}]})).on("self",e=>{N.current=v(e)}),t.on("delta",r),await t.connect(),e)return;N.current=v(t.self)||N.current,await s()}catch(t){e||console.warn("AIS: SignalK connection failed:",t?.message||t)}})(),()=>{e=!0,t?.removeAllListeners?.("delta"),t?.disconnect()}},[I>0,L,G]);let $=(0,n.useMemo)(()=>({...E,targetsRef:A,motionRef:k,register:B}),[E,B]);return(0,t.jsx)(d.Provider,{value:$,children:e})},"predictScenePosition",0,(e,t,n)=>{let i=e.cog??e.cogMagnetic??e.heading,a=Number.isFinite(e.sog)?e.sog:0,r=Math.min(180,Math.max(0,(n-(e.positionAt||n))/1e3)),l=Math.min(180,Math.max(0,(n-t.fixAt)/1e3)),s=-(t.vx*l),o=-(t.vy*l);return Number.isFinite(i)&&a>.05&&(s+=a*Math.sin(i)*r,o+=a*Math.cos(i)*r),{x:e.sceneX+s*t.scale,z:e.sceneZ-o*t.scale}},"useAIS",0,({passive:e=!1}={})=>{let t=(0,n.useContext)(d),i=e?null:t?.register;return(0,n.useEffect)(()=>i?.(),[i]),t||{aisData:{},vesselIds:g,targets:g,atons:g,targetsRef:{current:{}},motionRef:{current:{vx:0,vy:0,fixAt:0,scale:.7}}}}],62588)},49063,e=>{e.v(t=>Promise.all(["static/chunks/0m7wbuocx-b4_.js","static/chunks/2gr1d26f-ymoh.js","static/chunks/11awvgcou7v4r.js"].map(t=>e.l(t))).then(()=>t(85626)))},10520,e=>{e.v(t=>Promise.all(["static/chunks/41odv061mfm6t.js","static/chunks/2gr1d26f-ymoh.js"].map(t=>e.l(t))).then(()=>t(61891)))},45344,e=>{e.v(t=>Promise.all(["static/chunks/0zvzu5fnwh4_a.js","static/chunks/11awvgcou7v4r.js"].map(t=>e.l(t))).then(()=>t(42602)))},83934,e=>{"use strict";var t=e.i(43476),n=e.i(71645),i=e.i(66799),a=e.i(85709),r=e.i(46991);let l=(0,n.createContext)();e.s(["WeatherContextProvider",0,({children:e})=>{let s=(0,a.useSignalKPath)("navigation.position"),o=(0,n.useMemo)(()=>["environment.outside.temperature","environment.outside.relativeHumidity","environment.outside.pressure","environment.wind.speedTrue","environment.wind.directionTrue","environment.wind.gust"],[]),u=(0,a.useSignalKPaths)(o),[c,d]=(0,n.useState)(u),g=(0,n.useRef)(u);g.current=u;let f=(0,n.useRef)(null);(0,n.useEffect)(()=>{f.current||(f.current=setTimeout(()=>{f.current=null,d(g.current)},2e3))},[u]),(0,n.useEffect)(()=>()=>clearTimeout(f.current),[]);let[h,p]=(0,n.useState)([]),[m,v]=(0,n.useState)(!1),[b,y]=(0,n.useState)(null),[w,S]=(0,n.useState)(null),[M,P]=(0,n.useState)(null),x=(0,n.useRef)(null),C=(0,n.useRef)(null),T=(0,n.useRef)(s);T.current=s;let j=(0,n.useRef)(!1),O=Number.isFinite(s?.latitude)&&Number.isFinite(s?.longitude),k=(0,n.useCallback)(async()=>{let e=T.current;if(Number.isFinite(e?.latitude)&&Number.isFinite(e?.longitude)){j.current=!0,v(!0),y(null);try{let t=i.default.isWeatherApiAvailable();if(null===t&&(t=await i.default.checkWeatherApiAvailability()),S(t),!t)return void y("Weather API not available on SignalK server");let n=await i.default.getWeatherForecast(e.latitude,e.longitude),a=i.default.parseWeatherForecast(n);p(a),P(new Date)}catch(e){e.message&&e.message.includes("400")?(console.warn("WeatherContext: Weather forecast not supported by this server"),S(!1)):console.warn("WeatherContext: Failed to fetch forecast:",e.message),y(e.message)}finally{v(!1)}}},[]),R=(0,n.useCallback)(e=>{if(!h||0===h.length)return null;let t=Math.min(Math.floor(e),h.length-1);return h[t]||null},[h]),A=(0,n.useCallback)(()=>{let e=h.length>0?h[0]:null,t=c["environment.outside.temperature"]??(e?.temperature!=null?e.temperature+273.15:null),n=c["environment.outside.relativeHumidity"]??e?.humidity??null,i=c["environment.outside.pressure"]??e?.pressure??null,a=(0,r.finite)(c["environment.wind.speedTrue"])??(0,r.finite)((0,r.knotsToMs)(e?.wind?.speed)),l=(0,r.finite)(c["environment.wind.directionTrue"])??(0,r.finite)((0,r.degToRad)(e?.wind?.direction)),s=Object.values(c).some(e=>null!==(0,r.finite)(e)),o=e?.clouds;return{source:null!==t||null!==n||null!==i||null!==a?s?"sensors":"forecast":null,temperature:t,humidity:n,pressure:i,windSpeed:a,windDirection:l,cloudCover:null!=o?o>1?o/100:o:null,rain:e?.rain??null,description:e?.description||null}},[c,h]),F=(0,n.useCallback)(()=>{let e=h.length>0?h[0]:null,t=(0,r.finite)(c["environment.wind.speedTrue"])??(0,r.finite)((0,r.knotsToMs)(e?.wind?.speed)),n=(0,r.finite)(c["environment.wind.directionTrue"])??(0,r.finite)((0,r.degToRad)(e?.wind?.direction)),i=(0,r.finite)(c["environment.wind.gust"])??(0,r.finite)((0,r.knotsToMs)(e?.wind?.gust)),a=null!==(0,r.finite)(c["environment.wind.speedTrue"])||null!==(0,r.finite)(c["environment.wind.directionTrue"]);return{source:null!==t||null!==n?a?"sensors":"forecast":null,speed:t,direction:n,gust:i}},[c,h]);(0,n.useEffect)(()=>(x.current=setTimeout(()=>{k()},5e3),C.current=setInterval(()=>{k()},18e5),()=>{x.current&&clearTimeout(x.current),C.current&&clearInterval(C.current)}),[k]),(0,n.useEffect)(()=>{O&&!j.current&&k()},[O,k]);let N=(0,n.useMemo)(()=>({forecasts:h,isLoading:m,error:b,weatherApiAvailable:w,lastFetchTime:M,fetchWeatherForecast:k,getForecastForTime:R,getCurrentWeather:A,getWindData:F}),[h,m,b,w,M,k,R,A,F]);return(0,t.jsx)(l.Provider,{value:N,children:e})},"useWeather",0,()=>{let e=(0,n.useContext)(l);if(!e)throw Error("useWeather must be used within a WeatherContextProvider");return e}])},23e3,e=>{e.v(t=>Promise.all(["static/chunks/15imr2-f_8n-x.js","static/chunks/2gr1d26f-ymoh.js"].map(t=>e.l(t))).then(()=>t(50637)))},30206,e=>{"use strict";let t=new Set,n={active:!1,playing:!1,speed:30,time:0,start:0,end:0,voyage:null},i=[],a=null,r=0,l=null,s=()=>t.forEach(e=>e(n)),o=e=>{n={...n,...e},s()},u=(e,t,n)=>e+(t-e)*n,c=(e,t,n)=>{let i=Math.atan2(Math.sin(t-e),Math.cos(t-e));return e+i*n},d=new Set(["hdg","cog","twa","twd","awa","rud","roll"]),g=e=>{if(!i.length)return null;let t=0,n=i.length-1;if(e<=i[0].t)return i[0];if(e>=i[n].t)return i[n];for(;n-t>1;){let a=t+n>>1;i[a].t<=e?t=a:n=a}let a=i[t],r=i[n],l=(e-a.t)/Math.max(1,r.t-a.t),s={t:e};for(let e of Object.keys(a)){if("t"===e)continue;let t=a[e],n=r[e];if(!Number.isFinite(t)||!Number.isFinite(n)){s[e]=t??n;continue}s[e]=d.has(e)?c(t,n,l):u(t,n,l)}return s},f=e=>{let t={},n=(e,n)=>{null!=n&&("number"!=typeof n||Number.isFinite(n))&&(t[e]=n)};return Number.isFinite(e.lat)&&Number.isFinite(e.lon)&&(t["navigation.position"]={latitude:e.lat,longitude:e.lon}),n("navigation.headingTrue",e.hdg),n("navigation.courseOverGroundTrue",e.cog??e.hdg),n("navigation.speedOverGround",e.sog),n("navigation.speedThroughWater",e.stw??e.sog),n("environment.wind.speedTrue",e.tws),n("environment.wind.angleTrueWater",e.twa),n("environment.wind.directionTrue",e.twd),n("environment.wind.speedApparent",e.aws),n("environment.wind.angleApparent",e.awa),n("steering.rudderAngle",e.rud),n("environment.depth.belowKeel",e.depth),Number.isFinite(e.roll)&&(t["navigation.attitude"]={roll:e.roll,pitch:0,yaw:e.hdg??0}),t},h=()=>{let e=Date.now(),t=e-r;if(r=e,!n.playing)return;let i=n.time+t*n.speed;i>=n.end&&(i=n.end,o({playing:!1})),n={...n,time:i};let a=g(i);a&&l&&l(f(a)),s()},p=()=>{a&&clearInterval(a),a=null,i=[],o({active:!1,playing:!1,voyage:null})};e.s(["getReplayState",0,()=>n,"isReplaying",0,()=>n.active,"seekReplay",0,e=>{if(!n.active)return;let t=Math.max(n.start,Math.min(n.end,e));o({time:t});let i=g(t);i&&l&&l(f(i))},"setReplaySink",0,e=>{l=e},"setReplaySpeed",0,e=>o({speed:e}),"startReplay",0,(e,t)=>{p(),i=t,o({active:!0,playing:!0,time:e.start,start:e.start,end:e.end,voyage:e});let n=g(e.start);n&&l&&l(f(n)),r=Date.now(),a=setInterval(h,100)},"stopReplay",0,p,"subscribeReplay",0,e=>(t.add(e),()=>t.delete(e)),"togglePlay",0,()=>{n.active&&(r=Date.now(),o({playing:!n.playing,time:n.time>=n.end?n.start:n.time}))}])},44485,e=>{"use strict";let t="samples",n=null,i=async(e,i)=>{let a=await ("u"<typeof indexedDB?Promise.reject(Error("IndexedDB unavailable")):(!n&&(n=new Promise((e,i)=>{let a=indexedDB.open("ocearo-voyages",1);a.onupgradeneeded=()=>{let e=a.result;e.objectStoreNames.contains(t)||e.createObjectStore(t,{keyPath:"t"})},a.onsuccess=()=>e(a.result),a.onerror=()=>{n=null,i(a.error)}})),n));return new Promise((n,r)=>{let l,s=a.transaction(t,e);Promise.resolve(i(s.objectStore(t))).then(e=>{l=e}),s.oncomplete=()=>n(l),s.onerror=()=>r(s.error),s.onabort=()=>r(s.error)})},a=e=>new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)}),r=e=>e*Math.PI/180,l=(e,t)=>6371e3*Math.hypot(r(t.lat-e.lat),r(t.lon-e.lon)*Math.cos(r((e.lat+t.lat)/2))),s=async()=>{let e=await i("readonly",e=>a(e.getAll())),t=[],n=null;for(let i of e)!n||i.t-n.end>18e5?(n={id:i.t,start:i.t,end:i.t,distanceM:0,maxSog:0,samples:0,last:i},t.push(n)):n.distanceM+=l(n.last,i),n.end=i.t,n.samples+=1,n.maxSog=Math.max(n.maxSog,i.sog||0),n.last=i;return t.filter(e=>e.end-e.start>=3e5&&e.distanceM>100).map(({last:e,...t})=>t).reverse()};e.s(["addSample",0,e=>i("readwrite",t=>{t.put(e)}),"getSamples",0,(e,t)=>i("readonly",n=>a(n.getAll(IDBKeyRange.bound(e,t)))),"listVoyages",0,s,"trimSamples",0,()=>i("readwrite",async e=>{let t=await a(e.count());t<=4e5||(await a(e.getAllKeys(null,t-4e5))).forEach(t=>e.delete(t))})])},90317,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var i={bindSnapshot:function(){return u},createAsyncLocalStorage:function(){return o},createSnapshot:function(){return c}};for(var a in i)Object.defineProperty(n,a,{enumerable:!0,get:i[a]});let r=Object.defineProperty(Error("Invariant: AsyncLocalStorage accessed in runtime where it is not available"),"__NEXT_ERROR_CODE",{value:"E504",enumerable:!1,configurable:!0});class l{disable(){throw r}getStore(){}run(){throw r}exit(){throw r}enterWith(){throw r}static bind(e){return e}}let s="u">typeof globalThis&&globalThis.AsyncLocalStorage;function o(){return s?new s:new l}function u(e){return s?s.bind(e):l.bind(e)}function c(){return s?s.snapshot():function(e,...t){return e(...t)}}},42344,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"workAsyncStorageInstance",{enumerable:!0,get:function(){return i}});let i=(0,e.r(90317).createAsyncLocalStorage)()},63599,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"workAsyncStorage",{enumerable:!0,get:function(){return i.workAsyncStorageInstance}});let i=e.r(42344)},9885,(e,t,n)=>{"use strict";function i(e){return e.split("/").map(e=>encodeURIComponent(e)).join("/")}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"encodeURIPath",{enumerable:!0,get:function(){return i}})},67585,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"BailoutToCSR",{enumerable:!0,get:function(){return a}});let i=e.r(32061);function a({reason:e,children:t}){if("u"<typeof window)throw Object.defineProperty(new i.BailoutToCSRError(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return t}},52157,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"PreloadChunks",{enumerable:!0,get:function(){return o}});let i=e.r(43476),a=e.r(74080),r=e.r(63599),l=e.r(9885),s=e.r(43369);function o({moduleIds:e}){if("u">typeof window)return null;let t=r.workAsyncStorage.getStore();if(void 0===t)return null;let n=[];if(t.reactLoadableManifest&&e){let i=t.reactLoadableManifest;for(let t of e){if(!i[t])continue;let e=i[t].files;n.push(...e)}}if(0===n.length)return null;let u=(0,s.getAssetTokenQuery)();return(0,i.jsx)(i.Fragment,{children:n.map(e=>{let n=`${t.assetPrefix}/_next/${(0,l.encodeURIPath)(e)}${u}`;return e.endsWith(".css")?(0,i.jsx)("link",{precedence:"dynamic",href:n,rel:"stylesheet",as:"style",nonce:t.nonce},e):((0,a.preload)(n,{as:"script",fetchPriority:"low",nonce:t.nonce}),null)})})}},69093,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return u}});let i=e.r(43476),a=e.r(71645),r=e.r(67585),l=e.r(52157);function s(e){return{default:e&&"default"in e?e.default:e}}let o={loader:()=>Promise.resolve(s(()=>null)),loading:null,ssr:!0},u=function(e){let t={...o,...e},n=(0,a.lazy)(()=>t.loader().then(s)),u=t.loading;function c(e){let s=u?(0,i.jsx)(u,{isLoading:!0,pastDelay:!0,error:null}):null,o=!t.ssr||!!t.loading,c=o?a.Suspense:a.Fragment,d=t.ssr?(0,i.jsxs)(i.Fragment,{children:["u"<typeof window?(0,i.jsx)(l.PreloadChunks,{moduleIds:t.modules}):null,(0,i.jsx)(n,{...e})]}):(0,i.jsx)(r.BailoutToCSR,{reason:"next/dynamic",children:(0,i.jsx)(n,{...e})});return(0,i.jsx)(c,{...o?{fallback:s}:{},children:d})}return c.displayName="LoadableComponent",c}},70703,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return a}});let i=e.r(55682)._(e.r(69093));function a(e,t){let n={};"function"==typeof e&&(n.loader=e);let a={...n,...t};return(0,i.default)({...a,modules:a.loadableGenerated?.modules})}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},79866,(e,t,n)=>{t.exports={boats:[{name:"Default",modelPath:"default",capabilities:["navigation","rudder","sail","color"]},{name:"Racer 10.8",modelPath:"racer",capabilities:["navigation","sail","color"]},{name:"Catamaran 14",modelPath:"catamaran",capabilities:["navigation","sail","color"]},{name:"Optimist",modelPath:"optimist",capabilities:["navigation","ais"]},{name:"Sailboat",modelPath:"sailboat",capabilities:["navigation","ais"]},{name:"Ship",modelPath:"ship",capabilities:["navigation","ais"]},{name:"Windsurf",modelPath:"windsurf",capabilities:["navigation","ais"]}]}},83402,e=>{"use strict";var t=e.i(79866);let n=new class{constructor(){this.defaultConfig={signalkUrl:"http://localhost:3000",username:"",password:"",useAuthentication:!1,signalKUrlSet:!1,debugMode:!1,selectedBoat:"Racer 10.8",primaryColor:null,metallicEffect:!1,aisLengthScalingFactor:.7,compassNorthUp:!1,hide3DCompass:!1,hideTrueWind:!1,showCustomUrls:!1,customExternalUrls:{},currentView:"default",theme:"dark",language:"en",distanceUnits:"nm",depthUnits:"m",speedUnits:"kn",temperatureUnits:"C",positionFormat:"DD",preferTrueValues:!0,preferredWindSpeedPath:"speedTrue",preferredWindDirectionPath:"directionTrue",preferredHeadingPath:"courseOverGroundTrue",debugWindOverride:!1,debugWindSpeed:10,debugWindDirection:0,debugShowAxes:!1,showSailTrimSliders:!0,showRigging:!0,showSeamarks3D:!0,seamarksOverpass:!0},this.configKey="ocearoConfig",this.inMemoryConfig={...this.defaultConfig},this.config=this.loadConfig()}isLocalStorageAvailable(){try{return"u">typeof localStorage}catch{return!1}}loadConfig(){if(this.isLocalStorageAvailable()){let e=localStorage.getItem(this.configKey);if(!e)return this.saveConfig(this.defaultConfig),{...this.defaultConfig};try{let t={...this.defaultConfig,...JSON.parse(e)};return(t.boatChosen||"Default"!==t.selectedBoat)&&"RM1080"!==t.selectedBoat||(t.selectedBoat="Racer 10.8"),t}catch(e){return console.error("Failed to parse stored configuration:",e),{...this.defaultConfig}}}return{...this.inMemoryConfig}}saveConfig(e){this.config={...this.config,...e},this.isLocalStorageAvailable()?localStorage.setItem(this.configKey,JSON.stringify(this.config)):this.inMemoryConfig={...this.config}}get(e){return this.config[e]}set(e,t){this.config[e]=t,this.saveConfig(this.config)}resetConfig(){this.config={...this.defaultConfig},this.isLocalStorageAvailable()?localStorage.setItem(this.configKey,JSON.stringify(this.config)):this.inMemoryConfig={...this.defaultConfig}}getAll(){return{...this.config}}getDefaultConfig(){return{...this.defaultConfig}}getSelectedBoat(){let e=this.config.selectedBoat;return e?this.getBoatsData().find(t=>t.name===e):null}getBoatsData(){return t.default.boats}getSignalKUrl(){return this.config.signalKUrlSet&&this.config.signalkUrl?this.normalizeSignalKUrl(this.config.signalkUrl):this.getComputedSignalKUrl()}normalizeSignalKUrl(e){let t=String(e).trim().replace(/\/+$/,"");if(!t)return t;t=t.replace(/^wss:\/\//i,"https://").replace(/^ws:\/\//i,"http://");let n="https:"===window.location.protocol;return/^https?:\/\//i.test(t)||(t=`${n?"https":"http"}://${t}`),t=t.replace(/^https?:/i,e=>e.toLowerCase()),n&&t.startsWith("http://")&&(t="https://"+t.slice(7).replace(/:80(?=\/|$)/,"")),t}getComputedSignalKUrl(){return this.config.debugMode?"https://demo.signalk.org:443":`${window.location.protocol}//${window.location.hostname}${window.location.port?":"+window.location.port:""}`}getCurrentView(){return this.config.currentView||this.defaultConfig.currentView}setCurrentView(e){this.set("currentView",e)}};e.s(["default",0,n])}]);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,78461,e=>{"use strict";var t=e.i(71645),n=e.i(85709),i=e.i(67561);let r=["navigation.headingTrue","navigation.headingMagnetic","navigation.courseOverGroundTrue","navigation.courseOverGroundMagnetic","navigation.position"],a=null;e.s(["default",0,()=>{let{convertLatLonToXY:e}=(0,i.useOcearoContext)(),o=(0,n.useSignalKPaths)(r),s=o["navigation.headingTrue"]??o["navigation.headingMagnetic"]??o["navigation.courseOverGroundTrue"]??o["navigation.courseOverGroundMagnetic"],l=Number.isFinite(s),u=o["navigation.position"],c=Number.isFinite(u?.latitude)&&Number.isFinite(u?.longitude);return{heading:l?s:0,offset:(0,t.useMemo)(()=>{if(!c)return{x:0,y:0};let t={lat:u.latitude,lon:u.longitude};return e(t,(a||(a=t),a))},[u,c,e]),hasFix:c,hasHeading:l}}])},5941,e=>{"use strict";let t=[1,.8,.6];function n(e){return t[Math.min(Math.max(e,0),2)]}function i(e,t){return Math.max(.05,Math.min(1,1-.6*e-.3*t))}function r(e,t){return Math.PI/6*Math.max(0,1-1.9438444924574*t/30)*(1-e)}function a(e,t,n){let i=Math.min(1,1.9438444924574*(e.tws||0)/30),r=t.tension||.5;switch(n){case"mainSheet":return Math.min(1,.5*i+.3*r+.3*t.mainCar);case"jibSheet":return Math.min(1,.5*i+.3*r+.3*t.jibCar);case"vang":return Math.min(1,.6*i+.4*r);case"cunningham":return Math.min(1,.4*i+.6*r);case"backstay":return Math.min(1,Math.max(0,1-Math.abs(Math.atan2(Math.sin(e.awa||0),Math.cos(e.awa||0)))/Math.PI)*i*.9+.3*r);default:return r}}function o(e){let t=Math.max(0,Math.min(1,e));if(t<=.5){let e=2*t;return{r:e,g:1-.3*e,b:0}}return{r:1,g:.7*(1-(t-.5)*2),b:0}}e.s(["getReefHeightFactor",0,n,"tensionToColor",0,o,"updateSailTrim",0,function({tws:e=0,twa:t=0,awa:s=0,mainCar:l=.5,jibCar:u=.5,tension:c=.5}){let d,f=(d=1.9438444924574*e)>25?2:+(d>18),p=n(f),m=i(l,c),h=i(u,c),v=r(l,e),g=r(u,e),y={tws:e,twa:t,awa:s},b={mainCar:l,jibCar:u,tension:c},x={mainSheet:a(y,b,"mainSheet"),jibSheet:a(y,b,"jibSheet"),vang:a(y,b,"vang"),cunningham:a(y,b,"cunningham"),backstay:a(y,b,"backstay")},w={mainSheet:o(x.mainSheet),jibSheet:o(x.jibSheet),vang:o(x.vang),cunningham:o(x.cunningham),backstay:o(x.backstay)};return{reefLevel:f,reefHeightFactor:p,mainCamber:m,jibCamber:h,mainTwist:v,jibTwist:g,tensions:x,tensionColors:w}}])},77291,e=>{"use strict";var t=e.i(71645),n=e.i(62588),i=e.i(85709),r=e.i(61969),a=e.i(539);let o=Math.PI/180,s={power:1,sail:2,fishing:3,restricted:4},l=e=>{let t=String(e.navState||"").toLowerCase();if(/not under command|restricted|constrained/.test(t))return"restricted";if(/fishing/.test(t))return"fishing";if(/sailing/.test(t))return"sail";if(/motoring|engine/.test(t))return"power";let n=Number(e.shipType);return 36===n?"sail":30===n?"fishing":33===n?"restricted":"power"},u=(e,t,n)=>(0,a.wrapPi)(Math.atan2(t.x-e.x,t.y-e.y)-n),c=(e,t,n)=>{let i={x:0,y:0},r=u(i,t,e.course),l=u(t,i,t.course),c=Math.sign(l)||1,d=e=>Math.abs(e)>112.5*o;if(d(r)&&t.speed>e.speed)return{ownRole:"stand-on",rule:"13",reason:"overtakenByTarget",targetTurn:0};if(d(l)&&e.speed>t.speed)return{ownRole:"give-way",rule:"13",reason:"overtaking",targetTurn:0};let f=s[e.category]??1,p=s[t.category]??1;if(f!==p)return f<p?{ownRole:"give-way",rule:"18",reason:`giveWayTo_${t.category}`,targetTurn:0}:{ownRole:"stand-on",rule:"18",reason:`standOnFrom_${t.category}`,targetTurn:c};if("sail"===e.category&&Number.isFinite(n)){let i=(0,a.wrapPi)(n-e.course)>=0?"starboard":"port";return i!==((0,a.wrapPi)(n-t.course)>=0?"starboard":"port")?"port"===i?{ownRole:"give-way",rule:"12a-i",reason:"portTack",targetTurn:0}:{ownRole:"stand-on",rule:"12a-i",reason:"targetPortTack",targetTurn:c}:t.x*Math.sin(n)+t.y*Math.cos(n)>0?{ownRole:"stand-on",rule:"12a-ii",reason:"targetWindward",targetTurn:c}:{ownRole:"give-way",rule:"12a-ii",reason:"ownWindward",targetTurn:0}}return Math.abs((0,a.wrapPi)(t.course-e.course-Math.PI))<10*o&&Math.abs(r)<6*o?{ownRole:"both",rule:"14",reason:"headOn",targetTurn:1}:r>0?{ownRole:"give-way",rule:"15",reason:"crossingStarboard",targetTurn:0}:{ownRole:"stand-on",rule:"15",reason:"crossingPort",targetTurn:c}};var d=e.i(83402),f=e.i(67561);let p=[],m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,({always:e=!1}={})=>{let a,o,{targets:s}=(0,n.useAIS)({passive:!0}),{states:u}=(0,f.useOcearoContext)(),h=e||u.ais?s:p,{twd:v,heading:g}=(0,r.default)(),y=(0,i.useSignalKPaths)(m),b=(a=(0,i.useSignalKPrefix)("propulsion."),o=d.default.get("ownVesselCategory"),(0,t.useMemo)(()=>"sail"===o||"power"===o?o:Object.entries(a).some(([e,t])=>e.endsWith(".revolutions")&&Number(t)>.5||e.endsWith(".state")&&"started"===t)?"power":"sail",[a,o])),x=d.default.get("aisLengthScalingFactor")||.7;return(0,t.useMemo)(()=>{let e=y["navigation.courseOverGroundTrue"]??g,t=y["navigation.speedOverGround"]??0,n=[];if(Number.isFinite(e))for(let i of h){if("danger"!==i.risk)continue;let r=i.cog??i.cogMagnetic??i.heading;if(!Number.isFinite(r)||null===i.sceneX)continue;let a=c({course:e,speed:t,category:b},{x:i.sceneX/x,y:-i.sceneZ/x,course:r,speed:i.sog??0,category:l(i)},v);n.push({target:{...i},role:a})}n.sort((e,t)=>(e.target.tcpaSeconds??1/0)-(t.target.tcpaSeconds??1/0));let i={};for(let e of h)"close"===e.risk?i[e.mmsi]="close":"danger"===e.risk&&(i[e.mmsi]="giveWay");for(let e of n)i[e.target.mmsi]="stand-on"===e.role.ownRole?"yields":"giveWay";let r=n.filter(e=>"stand-on"!==e.role.ownRole);return{ownCategory:b,encounters:n,statuses:i,giveWay:r.length>0,giveWayTo:r[0]||null,primary:n[0]||null}},[h,v,g,y,b,x])}],77291)},61969,e=>{"use strict";var t=e.i(71645),n=e.i(85709),i=e.i(539);let r=180/Math.PI,a=["navigation.speedThroughWater","navigation.speedOverGround","navigation.headingTrue","navigation.courseOverGroundTrue","environment.wind.speedTrue","environment.wind.angleTrueWater","environment.wind.directionTrue","performance.polarSpeed","performance.polarSpeedRatio","navigation.courseGreatCircle.nextPoint.bearingTrue"];e.s(["default",0,()=>{let e=(0,n.useSignalKPaths)(a);return(0,t.useMemo)(()=>{let t=e["navigation.speedThroughWater"]??e["navigation.speedOverGround"]??null,n=e["navigation.headingTrue"]??e["navigation.courseOverGroundTrue"]??null,a=e["environment.wind.speedTrue"]??null,o=e["environment.wind.angleTrueWater"]??null,s=e["environment.wind.directionTrue"]??null;null===s&&Number.isFinite(o)&&Number.isFinite(n)&&(s=(0,i.wrapPi)(n+o));let l=e["performance.polarSpeed"]??(Number.isFinite(a)&&Number.isFinite(o)?(0,i.polarSpeedSi)(a,o):null),u=e["performance.polarSpeedRatio"]??null;null===u&&Number.isFinite(t)&&Number.isFinite(l)&&l>.2&&(u=t/l);let c=Number.isFinite(t)&&Number.isFinite(l)?(t-l)*1.943844:null,d=null,f=null,p=!Number.isFinite(o)||Math.abs(o)<Math.PI/2;if(Number.isFinite(a)){let e=p?(0,i.optimalUpwind)(1.943844*a):(0,i.optimalDownwind)(1.943844*a);e&&(d=e.twa/r,Number.isFinite(s)&&Number.isFinite(o)&&(f=(0,i.wrapPi)(s-Math.sign(o||1)*d)))}let m=e["navigation.courseGreatCircle.nextPoint.bearingTrue"],h=null;if(Number.isFinite(m)&&Number.isFinite(s)&&Number.isFinite(a)){let e=(0,i.bestVmcHeading)({twd:s,tws:a,bearing:m}),t=Number.isFinite(n)?(0,i.vmcForHeading)({twd:s,tws:a,bearing:m,heading:n}):null;h=e?{bearing:m,best:e,current:t}:null}return{ratio:u,polarSpeed:l,boatSpeed:t,deltaKn:c,heading:n,twd:s,tws:a,twa:o,targetTwa:d,targetHeading:f,upwind:p,vmc:h}},[e])}])},83646,e=>{"use strict";var t=e.i(67561);e.s(["default",0,()=>(0,t.useOcearoContext)().tokens])},31067,e=>{"use strict";function t(){return(t=Object.assign.bind()).apply(null,arguments)}e.s(["default",()=>t])},43216,e=>{"use strict";let t,n;var i=e.i(31067),r=e.i(71645),a=e.i(90072),o=e.i(90874),s=a,l=e.i(32533),u=a,c=e.i(8560),d=e.i(31497);class f extends u.ShaderMaterial{constructor(e){super({type:"LineMaterial",uniforms:u.UniformsUtils.clone(u.UniformsUtils.merge([c.UniformsLib.common,c.UniformsLib.fog,{worldUnits:{value:1},linewidth:{value:1},resolution:{value:new u.Vector2(1,1)},dashOffset:{value:0},dashScale:{value:1},dashSize:{value:1},gapSize:{value:1}}])),vertexShader:`
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,78461,e=>{"use strict";var t=e.i(71645),n=e.i(85709),i=e.i(67561);let r=["navigation.headingTrue","navigation.headingMagnetic","navigation.courseOverGroundTrue","navigation.courseOverGroundMagnetic","navigation.position"],a=null;e.s(["default",0,()=>{let{convertLatLonToXY:e}=(0,i.useOcearoContext)(),o=(0,n.useSignalKPaths)(r),s=o["navigation.headingTrue"]??o["navigation.headingMagnetic"]??o["navigation.courseOverGroundTrue"]??o["navigation.courseOverGroundMagnetic"],l=Number.isFinite(s),u=o["navigation.position"],c=Number.isFinite(u?.latitude)&&Number.isFinite(u?.longitude);return{heading:l?s:0,offset:(0,t.useMemo)(()=>{if(!c)return{x:0,y:0};let t={lat:u.latitude,lon:u.longitude};return e(t,(a||(a=t),a))},[u,c,e]),hasFix:c,hasHeading:l}},"getSessionOrigin",0,()=>a])},5941,e=>{"use strict";let t=[1,.8,.6];function n(e){return t[Math.min(Math.max(e,0),2)]}function i(e,t){return Math.max(.05,Math.min(1,1-.6*e-.3*t))}function r(e,t){return Math.PI/6*Math.max(0,1-1.9438444924574*t/30)*(1-e)}function a(e,t,n){let i=Math.min(1,1.9438444924574*(e.tws||0)/30),r=t.tension||.5;switch(n){case"mainSheet":return Math.min(1,.5*i+.3*r+.3*t.mainCar);case"jibSheet":return Math.min(1,.5*i+.3*r+.3*t.jibCar);case"vang":return Math.min(1,.6*i+.4*r);case"cunningham":return Math.min(1,.4*i+.6*r);case"backstay":return Math.min(1,Math.max(0,1-Math.abs(Math.atan2(Math.sin(e.awa||0),Math.cos(e.awa||0)))/Math.PI)*i*.9+.3*r);default:return r}}function o(e){let t=Math.max(0,Math.min(1,e));if(t<=.5){let e=2*t;return{r:e,g:1-.3*e,b:0}}return{r:1,g:.7*(1-(t-.5)*2),b:0}}e.s(["getReefHeightFactor",0,n,"tensionToColor",0,o,"updateSailTrim",0,function({tws:e=0,twa:t=0,awa:s=0,mainCar:l=.5,jibCar:u=.5,tension:c=.5}){let d,f=(d=1.9438444924574*e)>25?2:+(d>18),p=n(f),m=i(l,c),h=i(u,c),v=r(l,e),g=r(u,e),y={tws:e,twa:t,awa:s},b={mainCar:l,jibCar:u,tension:c},x={mainSheet:a(y,b,"mainSheet"),jibSheet:a(y,b,"jibSheet"),vang:a(y,b,"vang"),cunningham:a(y,b,"cunningham"),backstay:a(y,b,"backstay")},w={mainSheet:o(x.mainSheet),jibSheet:o(x.jibSheet),vang:o(x.vang),cunningham:o(x.cunningham),backstay:o(x.backstay)};return{reefLevel:f,reefHeightFactor:p,mainCamber:m,jibCamber:h,mainTwist:v,jibTwist:g,tensions:x,tensionColors:w}}])},77291,24752,e=>{"use strict";var t=e.i(71645),n=e.i(62588),i=e.i(85709),r=e.i(61969),a=e.i(539);let o=Math.PI/180,s={power:1,sail:2,fishing:3,restricted:4},l=e=>{let t=String(e.navState||"").toLowerCase();if(/not under command|restricted|constrained/.test(t))return"restricted";if(/fishing/.test(t))return"fishing";if(/sailing/.test(t))return"sail";if(/motoring|engine/.test(t))return"power";let n=Number(e.shipType);return 36===n?"sail":30===n?"fishing":33===n?"restricted":"power"},u=(e,t,n)=>(0,a.wrapPi)(Math.atan2(t.x-e.x,t.y-e.y)-n),c=(e,t,n)=>{let i={x:0,y:0},r=u(i,t,e.course),l=u(t,i,t.course),c=Math.sign(l)||1,d=e=>Math.abs(e)>112.5*o;if(d(r)&&t.speed>e.speed)return{ownRole:"stand-on",rule:"13",reason:"overtakenByTarget",targetTurn:0};if(d(l)&&e.speed>t.speed)return{ownRole:"give-way",rule:"13",reason:"overtaking",targetTurn:0};let f=s[e.category]??1,p=s[t.category]??1;if(f!==p)return f<p?{ownRole:"give-way",rule:"18",reason:`giveWayTo_${t.category}`,targetTurn:0}:{ownRole:"stand-on",rule:"18",reason:`standOnFrom_${t.category}`,targetTurn:c};if("sail"===e.category&&Number.isFinite(n)){let i=(0,a.wrapPi)(n-e.course)>=0?"starboard":"port";return i!==((0,a.wrapPi)(n-t.course)>=0?"starboard":"port")?"port"===i?{ownRole:"give-way",rule:"12a-i",reason:"portTack",targetTurn:0}:{ownRole:"stand-on",rule:"12a-i",reason:"targetPortTack",targetTurn:c}:t.x*Math.sin(n)+t.y*Math.cos(n)>0?{ownRole:"stand-on",rule:"12a-ii",reason:"targetWindward",targetTurn:c}:{ownRole:"give-way",rule:"12a-ii",reason:"ownWindward",targetTurn:0}}return Math.abs((0,a.wrapPi)(t.course-e.course-Math.PI))<10*o&&Math.abs(r)<6*o?{ownRole:"both",rule:"14",reason:"headOn",targetTurn:1}:r>0?{ownRole:"give-way",rule:"15",reason:"crossingStarboard",targetTurn:0}:{ownRole:"stand-on",rule:"15",reason:"crossingPort",targetTurn:c}};e.s(["rightOfWay",0,c,"targetCategory",0,l],24752);var d=e.i(83402),f=e.i(67561);let p=[],m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,({always:e=!1}={})=>{let a,o,{targets:s}=(0,n.useAIS)({passive:!0}),{states:u}=(0,f.useOcearoContext)(),h=e||u.ais?s:p,{twd:v,heading:g}=(0,r.default)(),y=(0,i.useSignalKPaths)(m),b=(a=(0,i.useSignalKPrefix)("propulsion."),o=d.default.get("ownVesselCategory"),(0,t.useMemo)(()=>"sail"===o||"power"===o?o:Object.entries(a).some(([e,t])=>e.endsWith(".revolutions")&&Number(t)>.5||e.endsWith(".state")&&"started"===t)?"power":"sail",[a,o])),x=d.default.get("aisLengthScalingFactor")||.7;return(0,t.useMemo)(()=>{let e=y["navigation.courseOverGroundTrue"]??g,t=y["navigation.speedOverGround"]??0,n=[];if(Number.isFinite(e))for(let i of h){if("danger"!==i.risk)continue;let r=i.cog??i.cogMagnetic??i.heading;if(!Number.isFinite(r)||null===i.sceneX)continue;let a=c({course:e,speed:t,category:b},{x:i.sceneX/x,y:-i.sceneZ/x,course:r,speed:i.sog??0,category:l(i)},v);n.push({target:{...i},role:a})}n.sort((e,t)=>(e.target.tcpaSeconds??1/0)-(t.target.tcpaSeconds??1/0));let i={};for(let e of h)"close"===e.risk?i[e.mmsi]="close":"danger"===e.risk&&(i[e.mmsi]="giveWay");for(let e of n)i[e.target.mmsi]="stand-on"===e.role.ownRole?"yields":"giveWay";let r=n.filter(e=>"stand-on"!==e.role.ownRole);return{ownCategory:b,encounters:n,statuses:i,giveWay:r.length>0,giveWayTo:r[0]||null,primary:n[0]||null}},[h,v,g,y,b,x])}],77291)},61969,e=>{"use strict";var t=e.i(71645),n=e.i(85709),i=e.i(539);let r=180/Math.PI,a=["navigation.speedThroughWater","navigation.speedOverGround","navigation.headingTrue","navigation.courseOverGroundTrue","environment.wind.speedTrue","environment.wind.angleTrueWater","environment.wind.directionTrue","performance.polarSpeed","performance.polarSpeedRatio","navigation.courseGreatCircle.nextPoint.bearingTrue"];e.s(["default",0,()=>{let e=(0,n.useSignalKPaths)(a);return(0,t.useMemo)(()=>{let t=e["navigation.speedThroughWater"]??e["navigation.speedOverGround"]??null,n=e["navigation.headingTrue"]??e["navigation.courseOverGroundTrue"]??null,a=e["environment.wind.speedTrue"]??null,o=e["environment.wind.angleTrueWater"]??null,s=e["environment.wind.directionTrue"]??null;null===s&&Number.isFinite(o)&&Number.isFinite(n)&&(s=(0,i.wrapPi)(n+o));let l=e["performance.polarSpeed"]??(Number.isFinite(a)&&Number.isFinite(o)?(0,i.polarSpeedSi)(a,o):null),u=e["performance.polarSpeedRatio"]??null;null===u&&Number.isFinite(t)&&Number.isFinite(l)&&l>.2&&(u=t/l);let c=Number.isFinite(t)&&Number.isFinite(l)?(t-l)*1.943844:null,d=null,f=null,p=!Number.isFinite(o)||Math.abs(o)<Math.PI/2;if(Number.isFinite(a)){let e=p?(0,i.optimalUpwind)(1.943844*a):(0,i.optimalDownwind)(1.943844*a);e&&(d=e.twa/r,Number.isFinite(s)&&Number.isFinite(o)&&(f=(0,i.wrapPi)(s-Math.sign(o||1)*d)))}let m=e["navigation.courseGreatCircle.nextPoint.bearingTrue"],h=null;if(Number.isFinite(m)&&Number.isFinite(s)&&Number.isFinite(a)){let e=(0,i.bestVmcHeading)({twd:s,tws:a,bearing:m}),t=Number.isFinite(n)?(0,i.vmcForHeading)({twd:s,tws:a,bearing:m,heading:n}):null;h=e?{bearing:m,best:e,current:t}:null}return{ratio:u,polarSpeed:l,boatSpeed:t,deltaKn:c,heading:n,twd:s,tws:a,twa:o,targetTwa:d,targetHeading:f,upwind:p,vmc:h}},[e])}])},83646,e=>{"use strict";var t=e.i(67561);e.s(["default",0,()=>(0,t.useOcearoContext)().tokens])},31067,e=>{"use strict";function t(){return(t=Object.assign.bind()).apply(null,arguments)}e.s(["default",()=>t])},43216,e=>{"use strict";let t,n;var i=e.i(31067),r=e.i(71645),a=e.i(90072),o=e.i(90874),s=a,l=e.i(32533),u=a,c=e.i(8560),d=e.i(31497);class f extends u.ShaderMaterial{constructor(e){super({type:"LineMaterial",uniforms:u.UniformsUtils.clone(u.UniformsUtils.merge([c.UniformsLib.common,c.UniformsLib.fog,{worldUnits:{value:1},linewidth:{value:1},resolution:{value:new u.Vector2(1,1)},dashOffset:{value:0},dashScale:{value:1},dashSize:{value:1},gapSize:{value:1}}])),vertexShader:`
|
|
2
2
|
#include <common>
|
|
3
3
|
#include <fog_pars_vertex>
|
|
4
4
|
#include <logdepthbuf_pars_vertex>
|