ocearo-ui 2.0.2 → 2.1.1
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/{1exvcc71cgr4t.js → 2aivnrnff0avu.js} +1 -1
- 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/2mzecccvvbjr1.js +1 -0
- 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/3r8nellt-dsed.js +1 -0
- package/_next/static/chunks/41odv061mfm6t.js +1 -0
- package/_next/static/chunks/432vtxrssprta.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 +1 -1
- 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/{_UKzzvfzAh-9NIsngWWio → QMD1VkISjzTIQCzLSHPpB}/_buildManifest.js +0 -0
- /package/_next/static/{_UKzzvfzAh-9NIsngWWio → QMD1VkISjzTIQCzLSHPpB}/_clientMiddlewareManifest.js +0 -0
- /package/_next/static/{_UKzzvfzAh-9NIsngWWio → QMD1VkISjzTIQCzLSHPpB}/_ssgManifest.js +0 -0
|
@@ -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,staleDataTimeout:30},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])}]);
|