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.
Files changed (86) hide show
  1. package/404.html +1 -1
  2. package/README.fr.md +23 -3
  3. package/README.md +23 -3
  4. package/__next.__PAGE__.txt +3 -3
  5. package/__next._full.txt +3 -3
  6. package/__next._tree.txt +2 -2
  7. package/_next/static/chunks/0-jqvc-r0kh0c.js +1 -0
  8. package/_next/static/chunks/{2g-xpe7xnropn.js → 05do10p9ldt1p.js} +1 -1
  9. package/_next/static/chunks/07gn9z0d6clzs.js +1 -0
  10. package/_next/static/chunks/{2w44atvyp9o_w.js → 096zaxs1gf_3q.js} +2 -1
  11. package/_next/static/chunks/0b3cus8izqkmg.js +119 -0
  12. package/_next/static/chunks/0j11dppxb9l0b.js +1 -0
  13. package/_next/static/chunks/0jucaltuccn03.js +1 -0
  14. package/_next/static/chunks/{1gt2hhqk1821k.js → 0zvzu5fnwh4_a.js} +3 -3
  15. package/_next/static/chunks/1_g85m2d7jjpo.css +3 -0
  16. package/_next/static/chunks/1arvue9o-atui.js +739 -0
  17. package/_next/static/chunks/1bo0ke8gjc1c2.js +1 -0
  18. package/_next/static/chunks/1cp1kkarm5gxz.js +1 -0
  19. package/_next/static/chunks/1e-w_-usen7fy.js +3 -0
  20. package/_next/static/chunks/1hz_mzl8l35j8.js +1 -0
  21. package/_next/static/chunks/1k72cpd0x8veh.js +1 -0
  22. package/_next/static/chunks/1mtfh1vqpvit2.js +1 -0
  23. package/_next/static/chunks/1u6o5_s2b39xh.js +1 -0
  24. package/_next/static/chunks/{1exvcc71cgr4t.js → 2aivnrnff0avu.js} +1 -1
  25. package/_next/static/chunks/2fe99e03gnvg9.js +1 -0
  26. package/_next/static/chunks/{3nm7o0eq5abhg.js → 2fthh9f57zzm2.js} +1 -1
  27. package/_next/static/chunks/{0jfox92up1jvy.js → 2gr1d26f-ymoh.js} +1 -1
  28. package/_next/static/chunks/2r98jty3a4wel.js +564 -0
  29. package/_next/static/chunks/2v6ebsavxlgyw.js +1 -0
  30. package/_next/static/chunks/{1w1xks0hp_tlr.js → 33u782y6vhw-f.js} +9 -9
  31. package/_next/static/chunks/3qik_nv7zlj4e.js +1 -0
  32. package/_next/static/chunks/3qzb9nvvw-b-k.js +1 -0
  33. package/_next/static/chunks/41mro59si-xxc.js +1 -0
  34. package/_next/static/chunks/41odv061mfm6t.js +1 -0
  35. package/_not-found/__next._full.txt +2 -2
  36. package/_not-found/__next._not-found.__PAGE__.txt +2 -2
  37. package/_not-found/__next._tree.txt +2 -2
  38. package/_not-found.html +1 -1
  39. package/_not-found.txt +2 -2
  40. package/docs/index.json +10 -5
  41. package/docs/signalk-server.html +3751 -0
  42. package/docs/signalk-specification.html +8507 -0
  43. package/guide/anchor.jpg +0 -0
  44. package/guide/bathymetry.jpg +0 -0
  45. package/guide/dashboard.jpg +0 -0
  46. package/guide/hero.jpg +0 -0
  47. package/guide/logbook.jpg +0 -0
  48. package/guide/mob.jpg +0 -0
  49. package/guide/parking.jpg +0 -0
  50. package/guide/polars.jpg +0 -0
  51. package/guide/traffic.jpg +0 -0
  52. package/guide/weather.jpg +0 -0
  53. package/index.html +1 -1
  54. package/index.txt +3 -3
  55. package/package.json +5 -7
  56. package/settings/__next._full.txt +3 -3
  57. package/settings/__next._tree.txt +2 -2
  58. package/settings/__next.settings.__PAGE__.txt +3 -3
  59. package/settings.html +1 -1
  60. package/settings.txt +3 -3
  61. package/_next/static/chunks/0iqdztntvxh3c.js +0 -119
  62. package/_next/static/chunks/0iztd835j5p1n.js +0 -700
  63. package/_next/static/chunks/0voiofm58khqd.js +0 -1
  64. package/_next/static/chunks/0w_skktmh3e48.js +0 -1
  65. package/_next/static/chunks/0zwc9m4qgtwle.js +0 -1
  66. package/_next/static/chunks/144mjqdrx42lq.js +0 -1
  67. package/_next/static/chunks/1ed7ayfg19cjb.js +0 -1
  68. package/_next/static/chunks/1epya-yh2wvj2.js +0 -1
  69. package/_next/static/chunks/1gq4t2dyr7rq3.js +0 -1
  70. package/_next/static/chunks/1ptj3mv8b_tzs.js +0 -1
  71. package/_next/static/chunks/1y35unwvy8p98.js +0 -1
  72. package/_next/static/chunks/1zm03hw2ylxw8.js +0 -1
  73. package/_next/static/chunks/2aq8orcir5h03.js +0 -1
  74. package/_next/static/chunks/2kmptoy43h0mx.js +0 -1
  75. package/_next/static/chunks/2kwn4iymxaom3.js +0 -1
  76. package/_next/static/chunks/2rebcvig176xk.js +0 -564
  77. package/_next/static/chunks/2ryo_bbmt6t74.css +0 -3
  78. package/_next/static/chunks/3--qzv1u6c7_7.js +0 -1
  79. package/_next/static/chunks/37t6vg8fb1-z8.js +0 -1
  80. package/_next/static/chunks/3p9ziqn6r35qf.js +0 -1
  81. package/_next/static/chunks/3q8o52_juxmdp.js +0 -1
  82. package/docs/opencpn.pdf +0 -0
  83. package/docs/signalk.pdf +0 -0
  84. /package/_next/static/{01VWnAYjs9QwBnnMyWbQF → EuchA2ImhjrwCnR5WjCLX}/_buildManifest.js +0 -0
  85. /package/_next/static/{01VWnAYjs9QwBnnMyWbQF → EuchA2ImhjrwCnR5WjCLX}/_clientMiddlewareManifest.js +0 -0
  86. /package/_next/static/{01VWnAYjs9QwBnnMyWbQF → EuchA2ImhjrwCnR5WjCLX}/_ssgManifest.js +0 -0
@@ -1,119 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,84226,e=>{"use strict";var t=e.i(43476),r=e.i(71645),a=e.i(57384);e.i(67561);var n=e.i(46991),i=e.i(85709),o=e.i(83402),l=e.i(90072),s=e.i(16196),u=e.i(83646);let d=({position:e=[0,0,0],rotation:r=[0,0,0],speed:a,color:n,fontSize:i=.5,textPosition:o=[0,.8,0],arrowSize:d=1})=>{let{scene:c}=(0,u.default)(),h=n||c.wind;return(0,t.jsxs)("group",{position:e,rotation:r,children:[(0,t.jsx)(s.Text,{characters:".0123456789",color:h,fontSize:i*d,position:o,font:"fonts/Roboto-Bold.ttf",anchorX:"center",anchorY:"middle",children:a.toFixed(1)}),(0,t.jsxs)("mesh",{children:[(0,t.jsx)("shapeGeometry",{args:[new l.Shape([new l.Vector2(0,0),new l.Vector2(.5*d*Math.cos(5*Math.PI/6),.5*d*Math.sin(5*Math.PI/6)),new l.Vector2(0,-.577*d),new l.Vector2(0,-.577*d),new l.Vector2(-.5*d*Math.cos(5*Math.PI/6),.5*d*Math.sin(5*Math.PI/6)),new l.Vector2(0,0)])]}),(0,t.jsx)("meshStandardMaterial",{color:h,side:l.DoubleSide})]})]})};d.propTypes={position:a.default.oneOfType([a.default.instanceOf(l.Vector3),a.default.arrayOf(a.default.number)]).isRequired,rotation:a.default.arrayOf(a.default.number).isRequired,speed:a.default.number.isRequired,color:a.default.oneOfType([a.default.string,a.default.number]).isRequired,fontSize:a.default.number,textPosition:a.default.arrayOf(a.default.number),arrowSize:a.default.number};let c=({outerRadius:e})=>{let a=o.default.get("preferredWindSpeedPath")||"speedTrue",s=o.default.get("preferredWindDirectionPath")||"directionTrue",c=o.default.get("preferredHeadingPath")||"courseOverGroundTrue",h=(0,r.useMemo)(()=>["environment.wind.angleTrueGround","environment.wind.speedOverGround","environment.wind.directionTrue","environment.wind.speedTrue","environment.wind.angleApparent","environment.wind.speedApparent","environment.wind.angleTrueWater","navigation.headingTrue","navigation.headingMagnetic","navigation.courseOverGroundTrue","navigation.courseOverGroundMagnetic"],[]),f=(0,i.useSignalKPaths)(h),m=(0,r.useMemo)(()=>{if("directionTrue"===s){let e=f[`environment.wind.${s}`]??f["environment.wind.directionTrue"];if(null!=e)return Math.PI/2-(e-(f[`navigation.${c}`]??f["navigation.headingTrue"]??f["navigation.courseOverGroundTrue"]??0));let t=f["environment.wind.angleTrueGround"]??f["environment.wind.angleTrueWater"];if(null!=t)return Math.PI/2-t}else{let e=f[`environment.wind.${s}`]??f["environment.wind.angleTrueGround"]??f["environment.wind.angleTrueWater"];if(null!=e)return Math.PI/2-e;let t=f["environment.wind.directionTrue"];if(null!=t)return Math.PI/2-(t-(f[`navigation.${c}`]??f["navigation.headingTrue"]??f["navigation.courseOverGroundTrue"]??0))}return Math.PI/2},[f,s,c]),g=(0,r.useMemo)(()=>{let e=f[`environment.wind.${a}`]??f["environment.wind.speedOverGround"]??f["environment.wind.speedTrue"];return(0,n.convertSpeedUnit)(e)||0},[f,a]),p=(0,r.useMemo)(()=>Math.PI/2-(f["environment.wind.angleApparent"]||0),[f]),v=(0,r.useMemo)(()=>(0,n.convertSpeedUnit)(f["environment.wind.speedApparent"])||0,[f]),M=(0,r.useMemo)(()=>new l.Vector3((e+.7)*Math.cos(m),0,-(e+.7)*Math.sin(m)),[e,m]),y=(0,r.useMemo)(()=>new l.Vector3((e+.7)*Math.cos(p),0,-(e+.7)*Math.sin(p)),[e,p]),w=(0,u.default)();return(0,t.jsxs)("group",{children:[g>0&&!0!==o.default.get("hideTrueWind")&&(0,t.jsx)(d,{position:M,rotation:[-Math.PI/2,0,-(Math.PI/2-m)],speed:g,color:w.ok,fontSize:1}),v>0&&(0,t.jsx)(d,{position:y,rotation:[-Math.PI/2,0,-(Math.PI/2-p)],speed:v,color:w.accent,fontSize:1})]})};c.propTypes={outerRadius:a.default.number.isRequired},e.s(["default",0,c])},88608,e=>{"use strict";let t=0,r=new Set;e.s(["getForecastHour",0,()=>t,"setForecastHour",0,e=>{t=Math.max(0,e),r.forEach(e=>e(t))},"subscribeForecast",0,e=>(r.add(e),()=>r.delete(e))])},3666,3950,e=>{"use strict";let t="ocearo-offline-v2",r=["ocearo-offline-v1"],a=!1,n=async(e,{kind:n="tile"}={})=>{if(!("u">typeof caches))return fetch(e,{referrerPolicy:"strict-origin-when-cross-origin"});a||(a=!0,r.forEach(e=>caches.delete(e).catch(()=>{})));let i=await caches.open(t);if("tile"===n){let t=await i.match(e);if(t)return t}try{let t=await fetch(e,{mode:"cors",referrerPolicy:"strict-origin-when-cross-origin"});return t.ok&&await i.put(e,t.clone()),t}catch(r){let t=await i.match(e);if(t)return t;throw r}},i=async e=>{let t=await n(e,{kind:"tile"});if(!t.ok)throw Error(`${t.status} ${e}`);return createImageBitmap(await t.blob())},o=(e,t,r,a)=>{let n=2**a,i=(e,t)=>({x:Math.floor((t+180)/360*n),y:Math.floor((1-Math.log(Math.tan(e*Math.PI/180)+1/Math.cos(e*Math.PI/180))/Math.PI)/2*n)}),o=r/111320,l=r/(111320*Math.cos(e*Math.PI/180)),s=i(e+o,t-l),u=i(e-o,t+l),d=[];for(let e=s.x;e<=u.x;e++)for(let t=s.y;t<=u.y;t++)d.push({z:a,x:e,y:t});return d},l=async({lat:e,lon:t,radiusM:r,layers:a,urls:i=[],onProgress:l})=>{let s=[];for(let{template:n,zooms:i}of a)for(let a of i)for(let i of o(e,t,r,a))s.push(n.replace("{z}",i.z).replace("{x}",i.x).replace("{y}",i.y));s.push(...i);let u=0,d=0,c=[...s],h=async()=>{for(;c.length;){let e=c.shift();try{!(await n(e,{kind:e.includes("forecast")?"forecast":"tile"})).ok&&d++}catch{d++}u++,l?.(u,s.length,d)}};return await Promise.all(Array.from({length:4},h)),{done:u,failed:d,total:s.length}},s=async()=>{if(navigator.storage?.estimate){let{usage:e}=await navigator.storage.estimate();return e}return null};e.s(["cachedFetch",0,n,"cachedImage",0,i,"clearOfflineCache",0,()=>"u">typeof caches?caches.delete(t):Promise.resolve(!1),"offlineCacheSize",0,s,"prefetchArea",0,l],3950);let u={key:null,at:0,field:null},d=(e,t,r,a)=>({lat:e+(a/8*2-1)*4e4/6371e3*180/Math.PI,lon:t+(r/8*2-1)*4e4/(6371e3*Math.cos(e*Math.PI/180))*180/Math.PI}),c=(e,t)=>{let r=[],a=[];for(let n=0;n<9;n++)for(let i=0;i<9;i++){let o=d(e,t,i,n);r.push(o.lat.toFixed(4)),a.push(o.lon.toFixed(4))}return`https://api.open-meteo.com/v1/forecast?latitude=${r.join(",")}&longitude=${a.join(",")}&hourly=wind_speed_10m,wind_direction_10m&wind_speed_unit=ms&forecast_hours=48&timezone=GMT`},h=async(e,t)=>{let r=`${e.toFixed(1)},${t.toFixed(1)}`;if(u.field&&u.key===r&&Date.now()-u.at<18e5)return u.field;let a=c(e,t),i=await n(a,{kind:"forecast"});if(!i.ok)throw Error(`Open-Meteo ${i.status}`);let o=await i.json(),l=Array.isArray(o)?o:[o],s=l[0]?.hourly?.time||[],d=s.length,h=[],f=[];for(let e=0;e<d;e++){let t=new Float32Array(81),r=new Float32Array(81);l.forEach((a,n)=>{let i=a.hourly.wind_speed_10m[e]??0,o=(a.hourly.wind_direction_10m[e]??0)*Math.PI/180;t[n]=-i*Math.sin(o),r[n]=-i*Math.cos(o)}),h.push(t),f.push(r)}let m={origin:{lat:e,lon:t},start:Date.parse(`${s[0]}Z`),hours:d,u:h,v:f,source:"open-meteo"};return u={key:r,at:Date.now(),field:m},m},f=[[0,[98,113,183]],[1,[57,97,159]],[3,[74,148,169]],[5,[77,141,123]],[7,[83,165,83]],[9,[53,159,53]],[11,[167,157,81]],[13,[159,127,58]],[15,[161,108,92]],[17,[129,58,78]],[19,[175,80,136]],[21,[117,74,147]],[24,[109,97,163]],[27,[68,105,141]],[29,[92,144,152]],[36,[125,68,165]]];e.s(["HALF_EXTENT_M",0,4e4,"WINDY_SCALE",0,f,"fetchWindField",0,h,"sampleWind",0,(e,t,r,a=0)=>{let n=Math.min(9-1.001,Math.max(0,(t/4e4+1)/2*8)),i=Math.min(9-1.001,Math.max(0,(r/4e4+1)/2*8)),o=Math.floor(n),l=Math.floor(i),s=n-o,u=i-l,d=Math.min(e.hours-1,Math.max(0,Math.floor(a))),c=Math.min(e.hours-1,d+1),h=Math.min(1,Math.max(0,a-d)),f=(e,t)=>{let r=e[t],a=9*l+o;return(r[a]*(1-s)+r[a+1]*s)*(1-u)+(r[a+9]*(1-s)+r[a+9+1]*s)*u};return{u:f(e.u,d)*(1-h)+f(e.u,c)*h,v:f(e.v,d)*(1-h)+f(e.v,c)*h}},"uniformField",0,(e,t,r,a)=>{let n=new Float32Array(81).fill(-r*Math.sin(a)),i=new Float32Array(81).fill(-r*Math.cos(a));return{origin:{lat:e,lon:t},start:Date.now(),hours:1,u:[n],v:[i],source:"boat"}},"windColor",0,e=>{if(e<=f[0][0])return f[0][1];for(let t=1;t<f.length;t++)if(e<=f[t][0]){let[r,a]=f[t-1],[n,i]=f[t],o=(e-r)/(n-r);return a.map((e,t)=>e+(i[t]-e)*o)}return f[f.length-1][1]},"windFieldUrl",0,c],3666)},71415,e=>{"use strict";var t=e.i(43476),r=e.i(71645),a=e.i(90072),n=e.i(60099),i=e.i(43216),o=e.i(83646),l=e.i(83402),s=e.i(85709),u=e.i(78461),d=e.i(3950),c=e.i(48390);e.i(85269);var h=e.i(22831);let f="https://elevation-tiles-prod.s3.amazonaws.com/terrarium/{z}/{x}/{y}.png",m=10,g=.1,p=["navigation.position","design.draft","environment.tide.heightNow","environment.tide.heightHigh","environment.tide.heightLow","environment.depth.belowSurface","environment.depth.belowKeel"],v=(e,t,r)=>{let a=2**r,n=e*Math.PI/180,i=(1-Math.log(Math.tan(n)+1/Math.cos(n))/Math.PI)/2*a;return{x:(t+180)/360*a,y:i}},M=(e,t,r)=>{let a=2**r;return{lat:180*Math.atan(Math.sinh(Math.PI*(1-2*t/a)))/Math.PI,lon:e/a*360-180}},y=new Map,w=async(e,t,r=f,a=m)=>{let n=v(e,t,a),i=Math.floor(n.x)-1,o=Math.floor(n.y)-1,l=`${r}|${a}/${i},${o}`;if(y.has(l))return y.get(l);let s=document.createElement("canvas");s.width=768,s.height=768;let u=s.getContext("2d",{willReadFrequently:!0});if(!(await Promise.all(Array.from({length:9},async(e,t)=>{let n=i+t%3,l=o+Math.floor(t/3),s=r.replace("{z}",a).replace("{x}",n).replace("{y}",l);try{let e=await (0,d.cachedImage)(s);return u.drawImage(e,t%3*256,256*Math.floor(t/3)),!0}catch{return!1}}))).some(Boolean))return null;let c=u.getImageData(0,0,768,768).data,h=new Float32Array(589824);for(let e=0;e<589824;e++)h[e]=c[4*e+3]<255?NaN:256*c[4*e]+c[4*e+1]+c[4*e+2]/256-32768;let g={heights:h,size:768,nw:M(i,o,a),se:M(i+3,o+3,a),z:a};return y.set(l,g),g},b=async(e,t)=>{let r=(0,c.bathymetryTileTemplate)(),[a,n]=await Promise.all([w(e,t),r?w(e,t,r,13).catch(()=>null):null]);if(!a&&!n)throw Error("No bathymetry");return{global:a,shom:n}},x=(e,t,r)=>{let{heights:a,size:n,nw:i,se:o,z:l}=e,s=(r-i.lon)/(o.lon-i.lon)*(n-1),u=v(i.lat,i.lon,l),d=v(o.lat,o.lon,l),c=(v(t,r,l).y-u.y)/(d.y-u.y)*(n-1);if(s<0||c<0||s>n-1||c>n-1)return NaN;let h=Math.min(n-2,Math.floor(s)),f=Math.min(n-2,Math.floor(c)),m=s-h,g=c-f,p=(e,t)=>a[t*n+e];return(p(h,f)*(1-m)+p(h+1,f)*m)*(1-g)+(p(h,f+1)*(1-m)+p(h+1,f+1)*m)*g},F=`
2
- attribute float aDepth;
3
- attribute float aDrying;
4
- attribute vec2 aGround;
5
- varying float vDepth;
6
- varying float vDrying;
7
- varying vec2 vGround;
8
- varying vec3 vWorld;
9
- void main() {
10
- vDepth = aDepth;
11
- vDrying = aDrying;
12
- vGround = aGround;
13
- vec4 w = modelMatrix * vec4(position, 1.0);
14
- vWorld = w.xyz;
15
- gl_Position = projectionMatrix * viewMatrix * w;
16
- }
17
- `,S=`
18
- uniform float uDanger;
19
- uniform vec3 uShallow;
20
- uniform vec3 uMid;
21
- uniform vec3 uDeep;
22
- uniform vec3 uLand;
23
- uniform vec3 uDrying;
24
- uniform vec3 uLine;
25
- uniform vec3 uDangerColor;
26
- uniform vec3 uFade;
27
- uniform float uFadeNear;
28
- uniform float uFadeFar;
29
- varying float vDepth;
30
- varying float vDrying;
31
- varying vec2 vGround;
32
- varying vec3 vWorld;
33
-
34
- float contour(float d, float level, float width) {
35
- float w = fwidth(d);
36
- return 1.0 - smoothstep(0.0, w * width, abs(d - level));
37
- }
38
- float gridLines(vec2 p, float spacing, float width) {
39
- vec2 g = abs(fract(p / spacing - 0.5) - 0.5) * spacing;
40
- vec2 w = fwidth(p) * width;
41
- vec2 l = 1.0 - smoothstep(vec2(0.0), w, g);
42
- return max(l.x, l.y);
43
- }
44
-
45
- void main() {
46
- vec3 c;
47
- if (vDepth <= 0.0) {
48
- c = vDrying > 0.5 ? uDrying : uLand;
49
- } else if (vDepth < 6.0) {
50
- c = mix(uShallow, uMid, vDepth / 6.0);
51
- } else {
52
- // Darker with depth, as light fades under water: the relief reads at a glance
53
- c = mix(uMid, uDeep, clamp((vDepth - 6.0) / 18.0, 0.0, 1.0));
54
- }
55
- // Relief: hill shading from the north-west, as on a shaded survey
56
- vec3 n = normalize(cross(dFdx(vWorld), dFdy(vWorld)));
57
- if (n.y < 0.0) n = -n;
58
- c *= 0.5 + 0.65 * clamp(dot(n, normalize(vec3(-0.6, 0.7, -0.5))), 0.0, 1.0);
59
- // Too shallow for us: orange hatching (not a fill, which reads as land)
60
- if (vDepth > 0.0 && vDepth < uDanger) {
61
- float hatch = step(0.55, fract((vGround.x + vGround.y) / 14.0));
62
- c = mix(c, uDangerColor, 0.25 + 0.45 * hatch);
63
- }
64
- // The survey grid, fading out with distance before it shimmers
65
- float dist = length(vWorld.xz);
66
- float gridFade = 1.0 - smoothstep(900.0, 1700.0, dist);
67
- float minor = gridLines(vGround, 50.0, 1.5) * 0.55;
68
- float major = gridLines(vGround, 250.0, 2.4) * 0.85;
69
- c = mix(c, uLine, max(minor, major) * gridFade * (vDepth > 0.0 ? 1.0 : 0.4));
70
- // Isobaths, the drying line bold
71
- float lines = max(max(contour(vDepth, 2.0, 1.5), contour(vDepth, 5.0, 1.5)), max(contour(vDepth, 10.0, 1.5), contour(vDepth, 20.0, 1.5)));
72
- lines = max(lines, max(contour(vDepth, 30.0, 1.2), contour(vDepth, 50.0, 1.2)) * 0.7);
73
- lines = max(lines, contour(vDepth, 0.0, 2.5));
74
- lines = max(lines, contour(vDepth, uDanger, 2.0) * 0.9);
75
- c = mix(c, uLine * 0.75, clamp(lines, 0.0, 1.0) * 0.85);
76
- c = mix(c, uFade, smoothstep(uFadeNear, uFadeFar, dist));
77
- gl_FragColor = vec4(c, 1.0);
78
- #include <colorspace_fragment>
79
- }
80
- `,D={light:{water:"#8fd3ff",waterOpacity:.18,shallow:"#b5e0f2",mid:"#5fa8d8",deep:"#1c4f86",land:"#e2d6b8",drying:"#c7d3a6",line:"#0f3557",danger:"#e8873a",fade:"#e8eef3",text:"#0f2f4f",halo:"#ffffff"},dark:{water:"#7cc8f2",waterOpacity:.12,shallow:"#3a8fbc",mid:"#1d5f8c",deep:"#0b2238",land:"#4a4434",drying:"#34472e",line:"#8fdcff",danger:"#f0a060",fade:"#16191e",text:"#e6f4ff",halo:"#101216"},night:{water:"#c0503c",waterOpacity:.1,shallow:"#7a2a1e",mid:"#4f1a12",deep:"#24100c",land:"#3a1a10",drying:"#3a2410",line:"#ff8a72",danger:"#ffad80",fade:"#120807",text:"#ffb3a3",halo:"#0f0706"}},P=[96,40],N=`
81
- attribute vec3 aCenter;
82
- attribute vec2 aCell;
83
- uniform vec2 uAtlas;
84
- uniform float uSize;
85
- varying vec2 vUv;
86
- varying float vFade;
87
- void main() {
88
- vec4 mv = modelViewMatrix * vec4(aCenter, 1.0);
89
- float d = -mv.z;
90
- // Constant size on screen (like the HUD text), none right under the camera
91
- float size = d * uSize;
92
- mv.xy += position.xy * vec2(size * 2.4, size);
93
- vUv = (aCell + vec2(position.x + 0.5, 0.5 - position.y)) / uAtlas;
94
- vFade = (1.0 - smoothstep(1100.0, 1700.0, length(aCenter.xz))) * smoothstep(25.0, 60.0, d);
95
- gl_Position = projectionMatrix * mv;
96
- }
97
- `,T=`
98
- uniform sampler2D uMap;
99
- varying vec2 vUv;
100
- varying float vFade;
101
- void main() {
102
- vec4 t = texture2D(uMap, vUv);
103
- if (t.a * vFade < 0.05) discard;
104
- gl_FragColor = vec4(t.rgb, t.a * vFade);
105
- #include <colorspace_fragment>
106
- }
107
- `,I=({items:e,palette:n})=>{let{geometry:i,material:o}=(0,r.useMemo)(()=>{if(!e.length)return{};let[t,r]=P,i=Math.ceil(e.length/16),o=document.createElement("canvas");o.width=16*t,o.height=r*i;let l=o.getContext("2d");l.textAlign="center",l.textBaseline="middle";let s=new a.PlaneGeometry(1,1),u=new a.InstancedBufferGeometry;u.index=s.index,u.setAttribute("position",s.attributes.position);let d=new Float32Array(3*e.length),c=new Float32Array(2*e.length);e.forEach((e,a)=>{let i=a%16*t,o=Math.floor(a/16)*r;l.font=`${e.danger?700:600} 28px Inter, Roboto, Arial, sans-serif`,l.lineWidth=7,l.strokeStyle=n.halo,l.strokeText(e.text,i+t/2,o+r/2+1),l.fillStyle=e.danger?n.danger:n.text,l.fillText(e.text,i+t/2,o+r/2+1),d.set(e.position,3*a),c.set([a%16,Math.floor(a/16)],2*a)}),u.setAttribute("aCenter",new a.InstancedBufferAttribute(d,3)),u.setAttribute("aCell",new a.InstancedBufferAttribute(c,2)),u.instanceCount=e.length;let h=new a.CanvasTexture(o);h.colorSpace=a.SRGBColorSpace,h.flipY=!1,h.anisotropy=4;let f=new a.ShaderMaterial({uniforms:{uMap:{value:h},uAtlas:{value:new a.Vector2(16,i)},uSize:{value:.03}},vertexShader:N,fragmentShader:T,transparent:!0,depthWrite:!1});return s.dispose(),{geometry:u,material:f}},[e,n]);return((0,r.useEffect)(()=>()=>{i?.dispose(),o?.uniforms.uMap.value.dispose(),o?.dispose()},[i,o]),i)?(0,t.jsx)("mesh",{geometry:i,material:o,frustumCulled:!1,renderOrder:3}):null},A=e=>e<10?e.toFixed(1):String(Math.round(e));e.s(["BATHY_ZOOM",0,10,"TERRARIUM",0,f,"default",0,({y:e=-.1})=>{let d,c=(0,s.useSignalKPaths)(p),{t:f}=(0,h.useTranslation)(),{id:M}=(0,o.default)(),y=c["navigation.position"],{heading:w}=(0,u.default)(),[P,N]=(0,r.useState)(null),T=l.default.get("aisLengthScalingFactor")||.7,C=Number.isFinite(c["design.draft"]?.maximum)?c["design.draft"].maximum:Number(l.default.get("boatDraft"))||2,O=c["environment.depth.belowSurface"],j=c["environment.depth.belowKeel"],_=Number.isFinite(O)?O:Number.isFinite(j)?j+C:null,G=D[M]||D.light,E=y?.latitude,z=y?.longitude,R=Number.isFinite(E)?(d=v(E,z,m),`${Math.floor(d.x)},${Math.floor(d.y)}`):null;(0,r.useEffect)(()=>{if(!R)return;let e=!1;return b(E,z).then(t=>{e||N(t)}).catch(()=>{}),()=>{e=!0}},[R]);let k=Number.isFinite(E)?Math.round(5e3*E):null,W=Number.isFinite(z)?Math.round(5e3*z):null,$=(0,r.useMemo)(()=>P&&null!==k?{survey:P.shom?x(P.shom,E,z):NaN,global:P.global?x(P.global,E,z):NaN}:{},[P,k,W]),L=(({tideNow:e,tideHigh:t,tideLow:r,measured:a,surveyHere:n,globalHere:i})=>{let o=(e,t=g)=>Math.round(e/t)*t;if(Number.isFinite(e)){let a=Number.isFinite(t)&&Number.isFinite(r)?e-(t+r)/2:0;return{cd:o(e),msl:o(a),source:"tide"}}if(Number.isFinite(a)&&(Number.isFinite(n)||Number.isFinite(i))){let e=Number.isFinite(n)?a+n:0,t=Number.isFinite(i)?a+i:0;return{cd:o(e,.5),msl:o(t,.5),source:"sounder"}}return{cd:0,msl:0,source:"datum"}})({tideNow:c["environment.tide.heightNow"],tideHigh:c["environment.tide.heightHigh"],tideLow:c["environment.tide.heightLow"],measured:_,surveyHere:$.survey,globalHere:$.global}),B=L.cd,H=L.msl,U=(0,r.useMemo)(()=>P?(e,t)=>{let r=P.shom?x(P.shom,e,t):NaN;if(Number.isFinite(r))return{h:r-B,drying:r<6.5};let a=P.global?x(P.global,e,t):NaN;return Number.isFinite(a)?{h:a-H,drying:a<3}:null}:null,[P,B,H]),V=(0,r.useMemo)(()=>{let e,t;if(!U||!Number.isFinite(E))return null;let r=P.shom?240:160,n=P.shom?9:5,i=new a.PlaneGeometry(6e3*T,6e3*T,r,r),o=i.attributes.position,l=new Float32Array(o.count),s=new Float32Array(o.count),u=new Float32Array(2*o.count),d=111320*Math.cos(E*Math.PI/180),c=(e=Math.round(10*E)/10,t=Math.round(10*z)/10,{east:(z-t)*111320*Math.cos(e*Math.PI/180),north:(E-e)*111320});for(let e=0;e<o.count;e++){let t=o.getX(e)/T,r=o.getY(e)/T,a=U(E+r/111320,z+t/d),i=a?a.h:0;l[e]=-i,s[e]=+!!a?.drying,u[2*e]=c.east+t,u[2*e+1]=c.north+r,o.setZ(e,i<0?i*n*T:(.15+3*Math.min(i,4))*T)}i.setAttribute("aDepth",new a.BufferAttribute(l,1)),i.setAttribute("aDrying",new a.BufferAttribute(s,1)),i.setAttribute("aGround",new a.BufferAttribute(u,2)),i.computeVertexNormals();let h=[],f=250*Math.ceil((c.east-1500)/250),m=250*Math.ceil((c.north-1500)/250);for(let e=f;e<=c.east+1500;e+=250)for(let t=m;t<=c.north+1500;t+=250){let r=e-c.east+125,a=t-c.north+125;if(Math.hypot(r,a)>1500)continue;let i=U(E+a/111320,z+r/d);if(!i||i.h>=-.1)continue;let o=-i.h;h.push({text:A(o),danger:o<C+1,position:[r*T,i.h*n*T+2,-a*T]})}let g=U(E,z);return{geometry:i,items:h,exaggeration:n,bottom:g&&g.h<0?g.h*n*T:null,depthHere:g?-g.h:null}},[U,T,C,E&&Math.round(500*E),z&&Math.round(500*z)]);(0,r.useEffect)(()=>()=>V?.geometry.dispose(),[V]);let K=(0,r.useMemo)(()=>new a.ShaderMaterial({uniforms:{uDanger:{value:3},uShallow:{value:new a.Color},uMid:{value:new a.Color},uDeep:{value:new a.Color},uLand:{value:new a.Color},uDrying:{value:new a.Color},uLine:{value:new a.Color},uDangerColor:{value:new a.Color},uFade:{value:new a.Color},uFadeNear:{value:1500},uFadeFar:{value:2100}},vertexShader:F,fragmentShader:S}),[]);(0,r.useEffect)(()=>{let e=K.uniforms;e.uDanger.value=C+1,e.uShallow.value.set(G.shallow),e.uMid.value.set(G.mid),e.uDeep.value.set(G.deep),e.uLand.value.set(G.land),e.uDrying.value.set(G.drying),e.uLine.value.set(G.line),e.uDangerColor.value.set(G.danger),e.uFade.value.set(G.fade)},[K,C,G]),(0,r.useEffect)(()=>()=>K.dispose(),[K]);let q=(0,r.useMemo)(()=>new a.ShaderMaterial({uniforms:{uColor:{value:new a.Color},uOpacity:{value:.16}},vertexShader:`
108
- varying float vDist;
109
- void main() {
110
- vDist = length(position.xy);
111
- gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
112
- }`,fragmentShader:`
113
- uniform vec3 uColor;
114
- uniform float uOpacity;
115
- varying float vDist;
116
- void main() {
117
- gl_FragColor = vec4(uColor, uOpacity * (1.0 - smoothstep(1500.0, 2100.0, vDist)));
118
- #include <colorspace_fragment>
119
- }`,transparent:!0,depthWrite:!1,side:a.DoubleSide}),[]);if((0,r.useEffect)(()=>{let e=q.uniforms;e.uColor.value.set(G.water),e.uOpacity.value=G.waterOpacity},[q,G]),(0,r.useEffect)(()=>()=>q.dispose(),[q]),!V||!Number.isFinite(E))return null;let X=V.depthHere,Y=Number.isFinite(_)&&Number.isFinite(X)&&"tide"===L.source?_-X:null,Z=(Number.isFinite(_)?-_*V.exaggeration*T:null)??V.bottom,J=null!==Y&&Math.abs(Y)>=.3,Q=Number.isFinite(_)?_:X,ee=-C*T;return(0,t.jsxs)("group",{rotation:[0,w,0],position:[0,e,0],children:[(0,t.jsx)("mesh",{rotation:[-Math.PI/2,0,0],geometry:V.geometry,material:K,renderOrder:-2}),(0,t.jsx)("mesh",{rotation:[-Math.PI/2,0,0],material:q,renderOrder:1,children:(0,t.jsx)("circleGeometry",{args:[3e3*T,96]})}),(0,t.jsx)(I,{items:V.items,palette:G}),null!==Z&&Z<ee&&(0,t.jsxs)("group",{children:[(0,t.jsx)(i.Line,{points:[[0,ee,0],[0,Z,0]],color:G.line,lineWidth:2,dashed:!0,dashSize:1.2,gapSize:.8}),(0,t.jsxs)("mesh",{position:[0,Z,0],rotation:[-Math.PI/2,0,0],children:[(0,t.jsx)("ringGeometry",{args:[1.2,1.8,32]}),(0,t.jsx)("meshBasicMaterial",{color:G.line,transparent:!0,opacity:.8,side:a.DoubleSide})]}),J&&null!==V.bottom&&(0,t.jsxs)("mesh",{position:[0,V.bottom,0],rotation:[-Math.PI/2,0,0],children:[(0,t.jsx)("ringGeometry",{args:[1,1.4,32]}),(0,t.jsx)("meshBasicMaterial",{color:G.danger,transparent:!0,opacity:.8,side:a.DoubleSide})]}),Number.isFinite(Q)&&(0,t.jsx)(n.Html,{position:[0,Z/2,0],zIndexRange:[5,0],style:{pointerEvents:"none"},children:(0,t.jsxs)("div",{className:"ml-3 -translate-y-1/2 whitespace-nowrap px-1.5 py-px rounded-md text-caption font-semibold tabular-nums text-hud-main bg-hud-bg/70 backdrop-blur-sm",children:[A(Q)," m",J&&(0,t.jsxs)("span",{className:"ml-1.5 font-normal text-hud-muted",children:[f("bathymetry.chartDepth",{depth:A(X)})," ","(",Y>0?"+":"−",Math.abs(Y).toFixed(1),")"]}),"sounder"===L.source&&(0,t.jsx)("span",{className:"ml-1.5 font-normal text-hud-muted",children:f("bathymetry.levelFromSounder")})]})})]})]})}])},83524,92554,e=>{"use strict";var t=e.i(71645),r=e.i(62588),a=e.i(85709),n=e.i(61969),i=e.i(90669),o=e.i(539),l=e.i(83402),s=e.i(77291);let u=Math.PI/180,d=3*u,c=60*u,h=5*u,f=90*u,m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,()=>{let{targets:e}=(0,r.useAIS)({passive:!0}),u=(0,n.default)(),g=(0,a.useSignalKPaths)(m),p=(0,t.useMemo)(()=>(0,i.getCollisionThresholds)(),[]),v=(0,s.default)(),M=l.default.get("aisLengthScalingFactor")||.7;return(0,t.useMemo)(()=>{let t=g["navigation.speedOverGround"],r=g["navigation.courseOverGroundTrue"]??u.heading,a=v.giveWayTo||v.primary;if(a&&Number.isFinite(t)&&t>.3&&Number.isFinite(r)){let{target:n,role:l}=a,s={targetName:n.name,rule:l.rule,reason:l.reason},u="stand-on"===l.ownRole&&Number.isFinite(n.tcpaSeconds)&&n.tcpaSeconds<180&&Number.isFinite(n.cpaMeters)&&n.cpaMeters<.3*p.cpaMeters;if("stand-on"===l.ownRole&&!u)return{kind:"standOn",change:0,heading:r,...s};let d=Math.sign(Math.sin(Math.atan2(n.sceneX,-n.sceneZ)-r))||1,c=(({targets:e,sog:t,cog:r,scale:a,thresholds:n,preferSide:o=0})=>{let l=e.filter(e=>null!==e.distanceMeters&&null!==e.sceneX&&Number.isFinite(e.sog)&&Number.isFinite(e.cog??e.cogMagnetic)),s=(e,r=n.cpaMeters)=>l.every(o=>{let l=(0,i.closestApproach)({rx:o.sceneX/a,ry:-o.sceneZ/a,ownSog:t,ownCog:e,targetSog:o.sog,targetCog:o.cog??o.cogMagnetic});return!l||l.tcpa<=0||l.tcpa>n.tcpaSeconds||l.cpa>=r}),u=o<0?[-1,1]:[1,-1],d=(e,t)=>{for(let a=h;a<=f+1e-9;a+=h)if(s(r+e*a,t))return e*a;return null};if(0!==o)return d(u[0])??d(u[0],n.cpaMeters/2)??d(u[1]);for(let e=h;e<=f+1e-9;e+=h){if(s(r+e))return e;if(s(r-e))return-e}return null})({targets:e,sog:t,cog:r,scale:M,thresholds:p,preferSide:"both"===l.ownRole||"power"===v.ownCategory||u?1:d});return null!==c?{kind:"avoid",change:c,heading:(0,o.wrapPi)(r+c),lastMoment:u,...s}:{kind:"avoid",change:null,heading:r,lastMoment:u,noSolution:!0,...s}}let n=u.vmc;if(n&&Number.isFinite(n.current)&&Number.isFinite(u.heading)){let e=(0,o.wrapPi)(n.best.heading-u.heading),t=(n.best.vmc-n.current)*1.943844;if(t>=.15&&Math.abs(e)>=d&&Math.abs(e)<=c)return{kind:"vmg",change:e,heading:n.best.heading,gainKn:t}}return null},[e,u,g,M,p,v])}],83524),e.s(["formatAdvice",0,(e,t)=>{let r=Math.round(180*Math.abs(e.change)/Math.PI);if("standOn"===e.kind)return t("advice.standOn");if("avoid"===e.kind&&e.noSolution)return t("advice.avoidNoSolution");if("avoid"===e.kind)return t("advice.avoid",{deg:r,side:t(e.change>=0?"advice.starboard":"advice.port")});let a=e.change>=0?"+":"−";return t("advice.vmg",{change:`${a}${r}\xb0`,gain:e.gainKn.toFixed(1)})}],92554)},71029,e=>{"use strict";var t=e.i(71645),r=e.i(85709),a=e.i(66799),n=e.i(46991);let i="notifications.mob",o=e=>e*Math.PI/180;e.s(["distanceAndBearing",0,(e,t)=>{if(!Number.isFinite(e?.latitude)||!Number.isFinite(e?.longitude)||!Number.isFinite(t?.latitude)||!Number.isFinite(t?.longitude))return null;let r=o(e.latitude),a=o(t.latitude),i=o(t.longitude-e.longitude),l=Math.sin((a-r)/2)**2+Math.cos(r)*Math.cos(a)*Math.sin(i/2)**2;return{distance:2*n.EARTH_RADIUS_METERS*Math.asin(Math.min(1,Math.sqrt(l))),bearing:(180*Math.atan2(Math.sin(i)*Math.cos(a),Math.cos(r)*Math.sin(a)-Math.sin(r)*Math.cos(a)*Math.cos(i))/Math.PI+360)%360}},"useActiveMobs",0,()=>{let e=(0,r.useSignalKPrefix)(i);return(0,t.useMemo)(()=>Object.entries(e).filter(([e,t])=>(e===i||e.startsWith(`${i}.`))&&t?.state&&"normal"!==t.state).map(([e,t])=>({...t,path:e})).sort((e,t)=>String(e.createdAt??"").localeCompare(String(t.createdAt??""))),[e])},"useMobSupport",0,()=>{let e=(()=>{let[e,r]=(0,t.useState)(null);return(0,t.useEffect)(()=>{let e=!1,t=null,n=async()=>{let i=await a.default.getFeatures();e||(i?r(i):t=setTimeout(n,3e4))};return n(),()=>{e=!0,clearTimeout(t)}},[]),e})();return(0,t.useMemo)(()=>({raise:!!e?.apis.includes("notifications"),navigate:!!e?.apis.includes("course")}),[e])}],71029)},32189,(e,t,r)=>{"use strict";t.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},65156,(e,t,r)=>{"use strict";var a=e.r(32189);function n(){}function i(){}i.resetWarningCache=n,t.exports=function(){function e(e,t,r,n,i,o){if(o!==a){var l=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:i,resetWarningCache:n};return r.PropTypes=r,r}},57384,(e,t,r)=>{e.i(47167),t.exports=e.r(65156)()}]);