ocearo-ui 0.1.21 → 2.0.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 (147) hide show
  1. package/404.html +1 -1
  2. package/README.fr.md +123 -133
  3. package/README.md +120 -134
  4. package/__next.__PAGE__.txt +19 -5
  5. package/__next._full.txt +11 -11
  6. package/__next._tree.txt +2 -2
  7. package/_next/static/chunks/0-c2-u5p6bxzo.js +1 -0
  8. package/_next/static/chunks/01atsfq_4opab.js +1 -0
  9. package/_next/static/chunks/0cx639tthxlz4.js +1 -0
  10. package/_next/static/chunks/0h2qsuyze9ds1.js +1 -0
  11. package/_next/static/chunks/0iqdztntvxh3c.js +119 -0
  12. package/_next/static/chunks/0iztd835j5p1n.js +700 -0
  13. package/_next/static/chunks/{2nxsyowmuwpjy.js → 0jfox92up1jvy.js} +1 -1
  14. package/_next/static/chunks/0jpa5m78l0ib0.js +1 -0
  15. package/_next/static/chunks/0kpstejrka-7k.js +1 -0
  16. package/_next/static/chunks/0n95joti2n2py.js +3 -0
  17. package/_next/static/chunks/0oaqe70syw_b5.js +1 -0
  18. package/_next/static/chunks/0ohleay4roayh.js +353 -0
  19. package/_next/static/chunks/0on1skx9l54-9.js +1 -0
  20. package/_next/static/chunks/0w_skktmh3e48.js +1 -0
  21. package/_next/static/chunks/0y-dctk-kmqss.js +1 -0
  22. package/_next/static/chunks/0yiqocv54ogoq.js +1 -0
  23. package/_next/static/chunks/0zlk2mlkvbtj1.js +1 -0
  24. package/_next/static/chunks/0zwc9m4qgtwle.js +1 -0
  25. package/_next/static/chunks/11awvgcou7v4r.js +1 -0
  26. package/_next/static/chunks/144mjqdrx42lq.js +1 -0
  27. package/_next/static/chunks/1d81m3g9jqkob.js +1 -0
  28. package/_next/static/chunks/1ed7ayfg19cjb.js +1 -0
  29. package/_next/static/chunks/1epya-yh2wvj2.js +1 -0
  30. package/_next/static/chunks/1exvcc71cgr4t.js +446 -0
  31. package/_next/static/chunks/1fzzb4jtgv5gg.js +9 -0
  32. package/_next/static/chunks/1g8fbzv0hu0i2.js +1 -0
  33. package/_next/static/chunks/1gaiqhzy_0d7s.js +1 -0
  34. package/_next/static/chunks/1gq4t2dyr7rq3.js +1 -0
  35. package/_next/static/chunks/1l-jew0-1-3eq.js +30 -0
  36. package/_next/static/chunks/1ptj3mv8b_tzs.js +1 -0
  37. package/_next/static/chunks/1w1xks0hp_tlr.js +346 -0
  38. package/_next/static/chunks/1xekc18cyi4sx.js +1 -0
  39. package/_next/static/chunks/1y35unwvy8p98.js +1 -0
  40. package/_next/static/chunks/2aq8orcir5h03.js +1 -0
  41. package/_next/static/chunks/2fdpvhx4oo81h.js +1 -0
  42. package/_next/static/chunks/2g-xpe7xnropn.js +409 -0
  43. package/_next/static/chunks/2kmptoy43h0mx.js +1 -0
  44. package/_next/static/chunks/2n86yq1wz1yx7.js +1 -0
  45. package/_next/static/chunks/2r_h93rt76vka.js +1 -0
  46. package/_next/static/chunks/2rebcvig176xk.js +564 -0
  47. package/_next/static/chunks/2w71oj1brox5z.js +1 -0
  48. package/_next/static/chunks/2wayx8t5r5fi9.js +1 -0
  49. package/_next/static/chunks/2y3d8zopa8r5r.css +3 -0
  50. package/_next/static/chunks/3--qzv1u6c7_7.js +1 -0
  51. package/_next/static/chunks/31lugryguappr.js +1 -0
  52. package/_next/static/chunks/32j_j396qs7be.js +1 -0
  53. package/_next/static/chunks/32yn_fc-es66m.js +22 -0
  54. package/_next/static/chunks/34_oyzp8_pi_m.js +1 -0
  55. package/_next/static/chunks/34wvn5zw0a69w.js +1 -0
  56. package/_next/static/chunks/37t6vg8fb1-z8.js +1 -0
  57. package/_next/static/chunks/3k5itcabq5oqs.js +9 -0
  58. package/_next/static/chunks/3ktj0iemsr1m-.js +1 -0
  59. package/_next/static/chunks/3nm7o0eq5abhg.js +1 -0
  60. package/_next/static/chunks/3s6nzrbk-8mnv.js +31 -0
  61. package/_next/static/chunks/3td9mnhvcj9cq.js +1 -0
  62. package/_next/static/chunks/3xjnsskh0tayo.js +1 -0
  63. package/_next/static/chunks/3zqx8h9yg5-ch.js +1 -0
  64. package/_next/static/chunks/turbopack-1h111qg8l92rw.js +1 -0
  65. package/_not-found/__next._full.txt +12 -12
  66. package/_not-found/__next._not-found.__PAGE__.txt +19 -2
  67. package/_not-found/__next._tree.txt +2 -2
  68. package/_not-found.html +1 -1
  69. package/_not-found.txt +12 -12
  70. package/boats/boats.json +40 -5
  71. package/index.html +1 -1
  72. package/index.txt +11 -11
  73. package/package.json +14 -14
  74. package/settings/__next._full.txt +14 -14
  75. package/settings/__next._tree.txt +2 -2
  76. package/settings/__next.settings.__PAGE__.txt +22 -5
  77. package/settings.html +1 -1
  78. package/settings.txt +14 -14
  79. package/__next._head.txt +0 -6
  80. package/__next._index.txt +0 -5
  81. package/_next/static/chunks/009rlietvsaq2.js +0 -1
  82. package/_next/static/chunks/070stlm97b9a2.js +0 -1
  83. package/_next/static/chunks/08gn5_gd6amkq.js +0 -1
  84. package/_next/static/chunks/0abo2oxxw3hpi.js +0 -1
  85. package/_next/static/chunks/0jzbiie0nzar2.js +0 -1
  86. package/_next/static/chunks/0l9s4rhr00adq.js +0 -1
  87. package/_next/static/chunks/0ri_um14-5x7u.js +0 -1
  88. package/_next/static/chunks/0utifqhyv2cuc.js +0 -1
  89. package/_next/static/chunks/0uvr7xkt_5uno.js +0 -1
  90. package/_next/static/chunks/0wzr1__so6xme.js +0 -1
  91. package/_next/static/chunks/0zjxnzbxh76mt.js +0 -1
  92. package/_next/static/chunks/11ln9lzzbo35q.js +0 -1
  93. package/_next/static/chunks/1bz0tcmhjmjgh.js +0 -1
  94. package/_next/static/chunks/1d4h-sglyo8ft.js +0 -1
  95. package/_next/static/chunks/1gizigk3w6q7j.js +0 -31
  96. package/_next/static/chunks/1porlo35ga4zu.js +0 -1
  97. package/_next/static/chunks/1ptwltjb3h6jf.js +0 -4
  98. package/_next/static/chunks/1sq_733weprvs.js +0 -1
  99. package/_next/static/chunks/1w1ua0-p5lk1e.js +0 -38
  100. package/_next/static/chunks/1wv5e5qomv-7g.css +0 -3
  101. package/_next/static/chunks/27hn45pv56pv7.js +0 -393
  102. package/_next/static/chunks/28y-j215vt42m.js +0 -1
  103. package/_next/static/chunks/29-ag86gvlc40.js +0 -9
  104. package/_next/static/chunks/2a0yjir_3mk1m.js +0 -1
  105. package/_next/static/chunks/2atijj_pkc4uc.js +0 -2
  106. package/_next/static/chunks/2baz6j1q913qw.js +0 -1
  107. package/_next/static/chunks/2ccpehidlaq88.js +0 -1
  108. package/_next/static/chunks/2lez3uww9j4t0.js +0 -135
  109. package/_next/static/chunks/2lvvt2f1l5sfu.js +0 -1
  110. package/_next/static/chunks/2nd5amcst4lhp.js +0 -1
  111. package/_next/static/chunks/2pwmb4pkqygy_.js +0 -1
  112. package/_next/static/chunks/2rsdqsatgq9ta.js +0 -1
  113. package/_next/static/chunks/2uao1hfsz-oy8.js +0 -1
  114. package/_next/static/chunks/2urimbxg5bqv3.js +0 -1
  115. package/_next/static/chunks/2yghvponatk1x.js +0 -135
  116. package/_next/static/chunks/31i14-jemhnic.js +0 -863
  117. package/_next/static/chunks/32cbrrsp-x35l.js +0 -1
  118. package/_next/static/chunks/36ra6xjie0dsv.js +0 -9
  119. package/_next/static/chunks/3dt63tw_9r0jt.js +0 -38
  120. package/_next/static/chunks/3iuz3f0429awx.js +0 -1
  121. package/_next/static/chunks/3jh1u-s3k0bkk.js +0 -1
  122. package/_next/static/chunks/3jupxlga7r_do.js +0 -1
  123. package/_next/static/chunks/3m57lnggu30tr.js +0 -243
  124. package/_next/static/chunks/3rhgquok36e79.js +0 -1
  125. package/_next/static/chunks/3sgrkzk20mxs6.js +0 -54
  126. package/_next/static/chunks/42dfiu6iby3fq.js +0 -1
  127. package/_next/static/chunks/43ps2cu5ahf8n.js +0 -3
  128. package/_next/static/chunks/turbopack-0pirmko-w-775.js +0 -1
  129. package/_not-found/__next._head.txt +0 -6
  130. package/_not-found/__next._index.txt +0 -5
  131. package/_not-found/__next._not-found.txt +0 -5
  132. package/boats/ais/ais-30.glb +0 -0
  133. package/boats/ais/ais-31.glb +0 -0
  134. package/boats/ais/ais-35.glb +0 -0
  135. package/boats/ais/ais-36.glb +0 -0
  136. package/boats/ais/ais-37.glb +0 -0
  137. package/boats/ais/ais-40.glb +0 -0
  138. package/boats/ais/ais-50.glb +0 -0
  139. package/boats/ais/ais-60.glb +0 -0
  140. package/boats/ais/ais-70.glb +0 -0
  141. package/boats/ais/ais-80.glb +0 -0
  142. package/settings/__next._head.txt +0 -6
  143. package/settings/__next._index.txt +0 -5
  144. package/settings/__next.settings.txt +0 -5
  145. /package/_next/static/{hlKDicTyNGfd7dmHqo5m5 → baa0rBM5TIECz8JV_tLT6}/_buildManifest.js +0 -0
  146. /package/_next/static/{hlKDicTyNGfd7dmHqo5m5 → baa0rBM5TIECz8JV_tLT6}/_clientMiddlewareManifest.js +0 -0
  147. /package/_next/static/{hlKDicTyNGfd7dmHqo5m5 → baa0rBM5TIECz8JV_tLT6}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,91440,e=>{"use strict";var t=e.i(43476),a=e.i(71645),o=e.i(46932),i=e.i(88653);e.i(67561);var s=e.i(46991),n=e.i(85709),l=e.i(66799),d=e.i(83402),r=e.i(48390),c=e.i(49721),u=e.i(68757);e.i(85269);var p=e.i(22831);let g=["compass","wind","gps","route"],m=({label:e,button:o,onChange:i,primaryTextClass:s,secondaryTextClass:n})=>{let[l,d]=(0,a.useState)(!1);return(0,t.jsxs)("div",{className:"flex items-center justify-between py-2",children:[(0,t.jsx)("span",{className:`text-label ${s}`,children:e}),l?(0,t.jsx)("select",{value:o,onChange:e=>{i(e.target.value),d(!1)},onBlur:()=>d(!1),autoFocus:!0,className:"bg-hud-elevated text-hud-main rounded px-2 py-1 text-label border border-hud focus:border-oGreen/50 focus:outline-none transition-all",children:["X","Circle","Square","Triangle","L1","R1","L2","R2","D-Pad Up","D-Pad Down","D-Pad Left","D-Pad Right","Left Stick Up","Left Stick Down","Left Stick Left","Left Stick Right","Right Stick Up","Right Stick Down","Right Stick Left","Right Stick Right","L3","R3","Options","Share","PS"].map(e=>(0,t.jsx)("option",{value:e,children:e},e))}):(0,t.jsx)("button",{onClick:()=>d(!0),className:`px-3 py-1 bg-hud-elevated rounded text-label ${n} hover:bg-hud-bg border border-hud transition-all`,children:o})]})};e.s(["default",0,function(){var e;let h,{t:x}=(0,p.useTranslation)(),b=d.default.get("debugMode"),f=(0,a.useMemo)(()=>["navigation.headingTrue","navigation.headingMagnetic","environment.wind.angleApparent","steering.rudderAngle","steering.autopilot.state","steering.autopilot.mode","steering.autopilot.engaged","steering.autopilot.target","steering.autopilot.target.headingTrue","steering.autopilot.target.windAngleApparent"],[]),v=(0,n.useSignalKPaths)(f),j=v["navigation.headingTrue"]??v["navigation.headingMagnetic"],y=v["environment.wind.angleApparent"],N=v["steering.rudderAngle"],[C,w]=(0,a.useState)("control"),T="text-hud-main",A="text-hud-secondary",$="text-hud-muted",[k,S]=(0,a.useState)(null),[R,P]=(0,a.useState)([]),[G,L]=(0,a.useState)("_default"),[D,M]=(0,a.useState)(!0),[I,F]=(0,a.useState)(null),[B,O]=(0,a.useState)(null),[Y,E]=(0,a.useState)(!1),U=a.default.useRef(v);U.current=v;let H=(0,a.useCallback)(async()=>{try{let e=await l.default.getAutopilotDevices(),t=e.length>0;if(P(e),!t){let e=U.current,t=e["steering.autopilot.state"],a=e["steering.autopilot.mode"],o=e["steering.autopilot.target.headingTrue"]||e["steering.autopilot.target.windAngleApparent"];F(b?null:t?x("autopilot.providerMissingButDetected"):x("autopilot.providerMissing")),S({state:t??(b?"standby":"off-line"),mode:a??(b?"compass":null),target:o??(b?1.57:null),engaged:e["steering.autopilot.engaged"]??!1});return}let a=e.includes(G)||"_default"===G?G:e[0];a!==G&&L(a);let o=await l.default.getAutopilotData(a);S(o),F(null)}catch(e){console.error("AutopilotView: Failed to fetch autopilot data:",e),F(e.message)}finally{M(!1)}},[G,b,x]),W=(0,a.useCallback)(async()=>{try{let e=await (0,r.makeOcearoCoreApiCall)("/api/controller/config");O(e),E(e?.connected||!1)}catch(e){console.warn("AutopilotView: Could not fetch controller config:",e.message),O(null)}},[]);(0,a.useEffect)(()=>{H(),W();let e=setInterval(()=>{H()},5e3);return()=>clearInterval(e)},[H,W]);let[Z,K]=(0,a.useState)(!1),_=(0,a.useCallback)(async(e,t,{lock:a=!0}={})=>{if(!a||!Z){a&&K(!0);try{F(null),await e(),await H()}catch(e){F(x(t,{message:e.message}))}finally{a&&K(!1)}}},[Z,H,x]),z=e=>_(()=>l.default.adjustAutopilotTarget(e,G),"autopilot.failedToAdjustHeading",{lock:!1}),V=e=>_(()=>l.default.autopilotDodge(e,G),"autopilot.failedToDodge"),X=e=>_(()=>l.default.autopilotCourseAction(e,G),"autopilot.failedToSteerCourse"),[q,J]=(0,a.useState)(null);(0,a.useEffect)(()=>{if(!q)return;let e=setTimeout(()=>J(null),4e3);return()=>clearTimeout(e)},[q]);let Q=async e=>{try{await (0,r.makeOcearoCoreApiCall)("/api/controller/config",{method:"PUT",body:JSON.stringify(e)}),O(e)}catch(e){F(x("autopilot.failedToSaveConfig",{message:e.message}))}},ee="_default"===G||R.length<=1,et=e=>ee?v[e]:void 0,ea=et("steering.autopilot.state")??k?.state,eo=et("steering.autopilot.mode")??k?.mode,ei=et("steering.autopilot.target"),es="number"==typeof ei?ei:k?.target,en=et("steering.autopilot.engaged")??k?.engaged??"enabled"===ea,el="off-line"===ea,ed=(e=k?.options,(Array.isArray(h=e?.modes??e?.mode)?h.map(e=>"string"==typeof e?e:e?.value??e?.name).filter(Boolean):null)??g),er=Array.isArray(k?.options?.actions)?k.options.actions:null,ec=e=>er?er.some(t=>t.id===e&&t.available):"tack"===e||"gybe"===e,eu=e=>{switch(e){case"compass":default:return u.faCompass;case"wind":return u.faWind;case"gps":return u.faSatellite;case"route":return u.faRoute;case"dodge":return u.faAnchor}},ep=e=>{if(null==e)return"---°";let t=(0,s.toDegrees)(e);return`${t}\xb0`};return(0,t.jsxs)("div",{className:"flex flex-col h-full bg-rightPaneBg overflow-hidden",children:[(0,t.jsx)("div",{className:"flex border-b border-hud bg-hud-bg",children:[{id:"control",label:x("autopilot.control"),icon:u.faCompass},{id:"controller",label:x("autopilot.controller"),icon:u.faGamepad}].map(e=>(0,t.jsxs)("button",{onClick:()=>w(e.id),className:`flex-1 py-3 px-2 text-caption font-semibold uppercase flex items-center justify-center transition-all duration-500 ${C===e.id?"text-oGreen border-b-2 border-oGreen bg-hud-bg":"text-hud-secondary hover:text-hud-main tesla-hover"}`,children:[(0,t.jsx)(c.FontAwesomeIcon,{icon:e.icon,className:"mr-2"}),e.label]},e.id))}),(0,t.jsx)(i.AnimatePresence,{children:I&&(0,t.jsxs)(o.motion.div,{initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0},className:"bg-oRed/20 text-oRed p-3 rounded-lg mx-4 mt-4 border border-oRed/30",children:[(0,t.jsx)(c.FontAwesomeIcon,{icon:u.faExclamationTriangle,className:"mr-2"}),I]})}),R.length>0&&(0,t.jsx)("div",{className:"px-4 pt-4",children:(0,t.jsx)("select",{value:G,onChange:e=>L(e.target.value),className:"bg-hud-elevated text-hud-main rounded px-3 py-2 w-full border border-hud focus:border-oGreen/50 focus:outline-none transition-all",children:R.map(e=>(0,t.jsx)("option",{value:e,children:e},e))})}),(0,t.jsx)("div",{className:"flex-1 min-h-0 overflow-auto scrollbar-hide",children:(0,t.jsx)(i.AnimatePresence,{mode:"wait",children:D?(0,t.jsx)(o.motion.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"flex items-center justify-center h-32",children:(0,t.jsx)("div",{className:"text-hud-main",children:"Loading..."})},"loading"):(0,t.jsx)(o.motion.div,{initial:{opacity:0,x:10},animate:{opacity:1,x:0},exit:{opacity:0,x:-10},transition:{duration:.4,ease:"easeOut"},className:"p-3",children:"control"===C?(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"tesla-card ",children:[(0,t.jsxs)("div",{className:"grid grid-cols-3 gap-3 text-center",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:`text-value mb-1 ${el?"text-oRed":en?"text-oGreen":ea?"text-oYellow":"text-hud-muted"}`,children:(0,t.jsx)(c.FontAwesomeIcon,{icon:el?u.faTimesCircle:en?u.faCheckCircle:ea?u.faPause:u.faExclamationTriangle})}),(0,t.jsx)("div",{className:`text-caption ${A} font-bold`,children:x("autopilot.state")}),(0,t.jsx)("div",{className:`text-label ${T} font-semibold capitalize`,children:ea||x("autopilot.unknown")})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-value mb-1 text-oBlue",children:(0,t.jsx)(c.FontAwesomeIcon,{icon:eu(eo)})}),(0,t.jsx)("div",{className:`text-caption ${A} font-bold`,children:x("autopilot.mode")}),(0,t.jsx)("div",{className:`text-label ${T} font-semibold capitalize`,children:eo||x("autopilot.none")})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-value mb-1 text-oYellow",children:(0,t.jsx)(c.FontAwesomeIcon,{icon:u.faLocationArrow})}),(0,t.jsx)("div",{className:`text-caption ${A} font-bold`,children:x("autopilot.target")}),(0,t.jsx)("div",{className:`text-label ${T} font-semibold`,children:ep(es)})]})]}),(0,t.jsxs)("div",{className:"mt-3 pt-3 border-t border-hud text-center",children:[(0,t.jsx)("div",{className:`text-caption ${A} font-bold uppercase`,children:"wind"===eo?x("autopilot.apparentWindAngle"):x("autopilot.currentHeading")}),(0,t.jsx)("div",{className:`text-hero font-medium ${T}`,children:ep("wind"===eo?y:j)}),"number"==typeof N&&(0,t.jsxs)("div",{className:`text-caption mt-1 ${$} font-bold uppercase`,children:[x("autopilot.rudder")," ",Math.abs((0,s.toDegrees)(N)),"° ",N<0?x("autopilot.port"):N>0?x("autopilot.stbd"):""]})]})]}),(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,t.jsxs)("button",{onClick:()=>_(()=>l.default.engageAutopilot(G),"autopilot.failedToEngage"),disabled:Z||en||el,className:`py-3 rounded font-semibold text-label uppercase transition-all ${Z||en||el?"bg-hud-bg text-hud-dim cursor-not-allowed border border-hud":"bg-oGreen hover:bg-oGreen/80 text-hud-main shadow-lg shadow-oGreen/20"}`,children:[(0,t.jsx)(c.FontAwesomeIcon,{icon:u.faPlay,className:"mr-2"}),x("autopilot.engage")]}),(0,t.jsxs)("button",{onClick:()=>_(()=>l.default.disengageAutopilot(G),"autopilot.failedToDisengage"),disabled:Z||!en,className:`py-3 rounded font-semibold text-label uppercase transition-all ${Z||!en?"bg-hud-bg text-hud-dim cursor-not-allowed border border-hud":"bg-oRed hover:bg-oRed/80 text-hud-main shadow-lg shadow-oRed/20"}`,children:[(0,t.jsx)(c.FontAwesomeIcon,{icon:u.faStop,className:"mr-2"}),x("autopilot.disengage")]})]}),(0,t.jsxs)("div",{className:"tesla-card ",children:[(0,t.jsx)("div",{className:`text-caption font-semibold uppercase ${A} mb-3`,children:x("autopilot.modeSelection")}),(0,t.jsx)("div",{className:"grid grid-cols-4 gap-3",children:ed.map(e=>(0,t.jsxs)("button",{onClick:()=>_(()=>l.default.setAutopilotMode(e,G),"autopilot.failedToSetMode"),disabled:Z||el,className:`py-2 rounded font-bold transition-all flex flex-col items-center border disabled:opacity-50 ${eo===e?"bg-oBlue text-hud-main border-oBlue shadow-lg shadow-oBlue/20":"bg-hud-bg text-hud-secondary border-hud hover:bg-hud-elevated"}`,children:[(0,t.jsx)(c.FontAwesomeIcon,{icon:eu(e),className:"text-lg mb-1"}),(0,t.jsx)("span",{className:"text-caption uppercase",children:e})]},e))})]}),(0,t.jsxs)("div",{className:"tesla-card ",children:[(0,t.jsx)("div",{className:`text-caption font-semibold uppercase ${A} mb-3`,children:x("autopilot.targetAdjustment")}),(0,t.jsxs)("div",{className:"grid grid-cols-4 gap-3",children:[(0,t.jsx)("button",{onClick:()=>z(-10),className:"py-3 bg-oRed/40 hover:bg-oRed/60 text-hud-main rounded border border-oRed/50 font-semibold text-label",children:"-10°"}),(0,t.jsx)("button",{onClick:()=>z(-1),className:"py-3 bg-oRed/20 hover:bg-oRed/40 text-hud-main rounded border border-oRed/30 font-semibold text-label",children:"-1°"}),(0,t.jsx)("button",{onClick:()=>z(1),className:"py-3 bg-oGreen/20 hover:bg-oGreen/40 text-hud-main rounded border border-oGreen/30 font-semibold text-label",children:"+1°"}),(0,t.jsx)("button",{onClick:()=>z(10),className:"py-3 bg-oGreen/40 hover:bg-oGreen/60 text-hud-main rounded border border-oGreen/50 font-semibold text-label",children:"+10°"})]}),(0,t.jsxs)("button",{onClick:()=>{let e;return null!=j&&(e=(0,s.toDegrees)(j),_(()=>l.default.setAutopilotTarget(e*Math.PI/180,G),"autopilot.failedToSetHeading"))},disabled:null==j,className:"w-full mt-3 py-2.5 bg-hud-bg hover:bg-hud-elevated text-hud-main rounded border border-hud font-bold text-caption uppercase",children:[(0,t.jsx)(c.FontAwesomeIcon,{icon:u.faCompass,className:"mr-2"}),x("autopilot.syncTargetToHeading")]})]}),(0,t.jsxs)("div",{className:"tesla-card ",children:[(0,t.jsx)("div",{className:`text-caption font-semibold uppercase ${A} mb-3`,children:x("autopilot.maneuvers")}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-4",children:["tack","gybe"].map(e=>(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:`text-caption font-semibold uppercase ${$} mb-2 text-center`,children:x(`autopilot.${e}`)}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-3",children:["port","starboard"].map(a=>{let o=q===`${e}:${a}`;return(0,t.jsx)("button",{onClick:()=>{let t;q!==(t=`${e}:${a}`)?J(t):(J(null),_(()=>l.default.autopilotManeuver(e,a,G),"tack"===e?"autopilot.failedToTack":"autopilot.failedToGybe"))},disabled:Z||!en||!ec(e),className:`py-2 rounded border font-bold text-caption transition-all disabled:opacity-40 ${o?"bg-oYellow text-hud-bg border-oYellow animate-soft-pulse":"bg-hud-bg hover:bg-hud-elevated text-hud-main border-hud"}`,children:o?x("autopilot.confirm"):x("port"===a?"autopilot.port":"autopilot.stbd")},a)})})]},e))})]}),(ec("dodge")||ec("courseCurrentPoint")||ec("courseNextPoint"))&&(0,t.jsx)("div",{className:"tesla-card ",children:(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[ec("dodge")&&("dodge"===eo?(0,t.jsx)("button",{onClick:()=>V({exit:!0}),disabled:Z,className:"py-2 rounded border border-oYellow bg-oYellow/20 text-hud-main font-bold text-caption uppercase disabled:opacity-40",children:x("autopilot.exitDodge")}):(0,t.jsx)("button",{onClick:()=>V(),disabled:Z||!en,className:"py-2 rounded border border-hud bg-hud-bg hover:bg-hud-elevated text-hud-main font-bold text-caption uppercase disabled:opacity-40",children:x("autopilot.dodge")})),ec("courseCurrentPoint")&&(0,t.jsx)("button",{onClick:()=>X("courseCurrentPoint"),disabled:Z,className:"py-2 rounded border border-hud bg-hud-bg hover:bg-hud-elevated text-hud-main font-bold text-caption uppercase disabled:opacity-40",children:x("autopilot.steerToWaypoint")}),ec("courseNextPoint")&&(0,t.jsx)("button",{onClick:()=>X("courseNextPoint"),disabled:Z,className:"py-2 rounded border border-hud bg-hud-bg hover:bg-hud-elevated text-hud-main font-bold text-caption uppercase disabled:opacity-40",children:x("autopilot.nextWaypoint")})]})})]}):(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"tesla-card ",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,t.jsxs)("div",{className:"flex items-center space-x-3",children:[(0,t.jsx)(c.FontAwesomeIcon,{icon:u.faGamepad,className:`text-xl ${Y?"text-oGreen":"text-hud-muted"}`}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:`text-label font-bold ${T}`,children:x("autopilot.controller")}),(0,t.jsx)("div",{className:`text-caption ${Y?"text-oGreen":"text-hud-muted"} font-bold`,children:Y?x("autopilot.connected"):x("autopilot.notConnected")})]})]}),(0,t.jsx)("button",{onClick:W,className:"p-2 text-hud-secondary hover:text-hud-main",children:(0,t.jsx)(c.FontAwesomeIcon,{icon:u.faSync,className:"text-sm"})})]}),!Y&&(0,t.jsxs)("div",{className:`text-caption ${$} bg-hud-elevated border border-hud rounded p-2.5 font-bold`,children:[(0,t.jsx)(c.FontAwesomeIcon,{icon:u.faExclamationTriangle,className:"text-oYellow mr-2"}),x("autopilot.connectController")]})]}),(0,t.jsxs)("div",{className:"tesla-card ",children:[(0,t.jsx)("div",{className:`text-caption font-semibold uppercase ${A} mb-3`,children:x("autopilot.buttonMappings")}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)(m,{label:x("autopilot.engageAutopilot"),button:B?.mappings?.engage||"X",onChange:e=>Q({...B,mappings:{...B?.mappings,engage:e}}),primaryTextClass:T,secondaryTextClass:A}),(0,t.jsx)(m,{label:x("autopilot.disengageAutopilot"),button:B?.mappings?.disengage||"Circle",onChange:e=>Q({...B,mappings:{...B?.mappings,disengage:e}}),primaryTextClass:T,secondaryTextClass:A}),(0,t.jsx)("div",{className:"border-t border-hud pt-2 mt-2",children:(0,t.jsx)("div",{className:`text-caption font-semibold uppercase ${$} mb-2`,children:x("autopilot.headingControl")})}),(0,t.jsx)(m,{label:x("autopilot.headingMinus1"),button:B?.mappings?.headingMinus1||"D-Pad Left",onChange:e=>Q({...B,mappings:{...B?.mappings,headingMinus1:e}}),primaryTextClass:T,secondaryTextClass:A}),(0,t.jsx)(m,{label:x("autopilot.headingPlus1"),button:B?.mappings?.headingPlus1||"D-Pad Right",onChange:e=>Q({...B,mappings:{...B?.mappings,headingPlus1:e}}),primaryTextClass:T,secondaryTextClass:A}),(0,t.jsx)(m,{label:x("autopilot.headingMinus10"),button:B?.mappings?.headingMinus10||"L1",onChange:e=>Q({...B,mappings:{...B?.mappings,headingMinus10:e}}),primaryTextClass:T,secondaryTextClass:A}),(0,t.jsx)(m,{label:x("autopilot.headingPlus10"),button:B?.mappings?.headingPlus10||"R1",onChange:e=>Q({...B,mappings:{...B?.mappings,headingPlus10:e}}),primaryTextClass:T,secondaryTextClass:A}),(0,t.jsx)("div",{className:"border-t border-hud pt-2 mt-2",children:(0,t.jsx)("div",{className:`text-caption font-semibold uppercase ${$} mb-2`,children:x("autopilot.rudderControl")})}),(0,t.jsx)(m,{label:x("autopilot.rudderLeft"),button:B?.mappings?.rudderLeft||"Left Stick Left",onChange:e=>Q({...B,mappings:{...B?.mappings,rudderLeft:e}}),primaryTextClass:T,secondaryTextClass:A}),(0,t.jsx)(m,{label:x("autopilot.rudderRight"),button:B?.mappings?.rudderRight||"Left Stick Right",onChange:e=>Q({...B,mappings:{...B?.mappings,rudderRight:e}}),primaryTextClass:T,secondaryTextClass:A})]})]}),(0,t.jsxs)("div",{className:"tesla-card ",children:[(0,t.jsx)("div",{className:`text-caption font-semibold uppercase ${A} mb-3`,children:x("autopilot.sensitivity")}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex justify-between mb-1",children:[(0,t.jsx)("span",{className:`text-caption font-bold ${T}`,children:x("autopilot.rudderSensitivity")}),(0,t.jsxs)("span",{className:`text-caption font-bold ${A}`,children:[B?.sensitivity?.rudder||50,"%"]})]}),(0,t.jsx)("input",{type:"range",min:"10",max:"100",value:B?.sensitivity?.rudder||50,onChange:e=>Q({...B,sensitivity:{...B?.sensitivity,rudder:parseInt(e.target.value)}}),className:"w-full h-1.5 bg-hud-elevated rounded-full appearance-none cursor-pointer accent-oGreen"})]}),(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex justify-between mb-1",children:[(0,t.jsx)("span",{className:`text-caption font-bold ${T}`,children:x("autopilot.deadZone")}),(0,t.jsxs)("span",{className:`text-caption font-bold ${A}`,children:[B?.sensitivity?.deadZone||10,"%"]})]}),(0,t.jsx)("input",{type:"range",min:"0",max:"30",value:B?.sensitivity?.deadZone||10,onChange:e=>Q({...B,sensitivity:{...B?.sensitivity,deadZone:parseInt(e.target.value)}}),className:"w-full h-1.5 bg-hud-elevated rounded-full appearance-none cursor-pointer accent-oGreen"})]})]})]})]})},C)})})]})}])},33946,function(e){e.n(e.i(91440))}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,28298,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useRouterBFCache",{enumerable:!0,get:function(){return l}});let n=e.r(71645);function l(e,t,r){let[l,u]=(0,n.useState)(()=>({tree:e,cacheNode:t,stateKey:r,next:null}));if(l.tree===e)return l;let a={tree:e,cacheNode:t,stateKey:r,next:null},o=1,d=l,s=a;for(;null!==d&&o<1;){if(d.stateKey===r){s.next=d.next;break}{o++;let e={tree:d.tree,cacheNode:d.cacheNode,stateKey:d.stateKey,next:null};s.next=e,s=e}d=d.next}return u(a),a}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},47257,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientPageRoot",{enumerable:!0,get:function(){return s}});let n=e.r(43476),l=e.r(8372),u=e.r(71645),a=e.r(33906),o=e.r(61994),d=e.r(42903);function s({Component:e,serverProvidedParams:t}){let r,i;if(null!==t)r=t.searchParams,i=t.params;else{let e=(0,u.use)(l.LayoutRouterContext);i=null!==e?e.parentParams:{},r=(0,a.urlSearchParamsToParsedUrlQuery)((0,u.use)(o.SearchParamsContext))}let c=(0,d.createClientSearchParams)(r),f=(0,d.createClientParams)(i);return(0,n.jsx)(e,{params:f,searchParams:c})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92825,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientSegmentRoot",{enumerable:!0,get:function(){return o}});let n=e.r(43476),l=e.r(8372),u=e.r(71645),a=e.r(42903);function o({Component:e,slots:t,serverProvidedParams:r}){let d;if(null!==r)d=r.params;else{let e=(0,u.use)(l.LayoutRouterContext);d=null!==e?e.parentParams:{}}let s=(0,a.createClientParams)(d);return(0,n.jsx)(e,{...t,params:s})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},68017,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HTTPAccessFallbackBoundary",{enumerable:!0,get:function(){return i}});let n=e.r(90809),l=e.r(43476),u=n._(e.r(71645)),a=e.r(90373),o=e.r(54394),d=e.r(8372);class s extends u.default.Component{constructor(e){super(e),this.state={triggeredStatus:void 0,previousPathname:e.pathname}}componentDidCatch(){}static getDerivedStateFromError(e){if((0,o.isHTTPAccessFallbackError)(e))return{triggeredStatus:(0,o.getAccessFallbackHTTPStatus)(e)};throw e}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.triggeredStatus?{triggeredStatus:void 0,previousPathname:e.pathname}:{triggeredStatus:t.triggeredStatus,previousPathname:e.pathname}}render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.props,{triggeredStatus:u}=this.state,a={[o.HTTPAccessErrorStatus.NOT_FOUND]:e,[o.HTTPAccessErrorStatus.FORBIDDEN]:t,[o.HTTPAccessErrorStatus.UNAUTHORIZED]:r};if(u){let d=u===o.HTTPAccessErrorStatus.NOT_FOUND&&e,s=u===o.HTTPAccessErrorStatus.FORBIDDEN&&t,i=u===o.HTTPAccessErrorStatus.UNAUTHORIZED&&r;return d||s||i?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("meta",{name:"robots",content:"noindex"}),!1,a[u]]}):n}return n}}function i({notFound:e,forbidden:t,unauthorized:r,children:n}){let o=(0,a.useUntrackedPathname)(),c=(0,u.useContext)(d.MissingSlotContext);return e||t||r?(0,l.jsx)(s,{pathname:o,notFound:e,forbidden:t,unauthorized:r,missingSlots:c,children:n}):(0,l.jsx)(l.Fragment,{children:n})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},22976,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationBoundaryContext:function(){return u},PlaceValidationBoundaryBelowThisLevel:function(){return a},RenderValidationBoundaryAtThisLevel:function(){return o},SlotMarker:function(){return d}};for(var l in n)Object.defineProperty(r,l,{enumerable:!0,get:n[l]});let u=null,a=null,o=null,d=null;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},77694,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationBoundaryContext:function(){return u.InstantValidationBoundaryContext},PlaceValidationBoundaryBelowThisLevel:function(){return u.PlaceValidationBoundaryBelowThisLevel},RenderValidationBoundaryAtThisLevel:function(){return u.RenderValidationBoundaryAtThisLevel},SlotMarker:function(){return u.SlotMarker}};for(var l in n)Object.defineProperty(r,l,{enumerable:!0,get:n[l]});let u=e.r(22976);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},39756,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0});var n={LoadingBoundaryProvider:function(){return C},default:function(){return T}};for(var l in n)Object.defineProperty(r,l,{enumerable:!0,get:n[l]});let u=e.r(55682),a=e.r(90809),o=e.r(43476),d=a._(e.r(71645)),s=u._(e.r(74080)),i=e.r(8372),c=e.r(1244),f=e.r(72383),p=e.r(91915),y=e.r(58442),m=e.r(68017);e.r(77694);let b=e.r(70725),_=e.r(28298);e.r(74180);let h=e.r(61994),P=e.r(33906),v=e.r(95871);s.default.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function g(e,t,r){let n=e.getClientRects();if(0===n.length)return 0;let l=1/0;for(let e=0;e<n.length;e++){let t=n[e];t.top<l&&(l=t.top)}return l>=r()&&l<=t?1:2}d.default.Component;let j=function(e){let t=d.default.useRef(null);return(0,d.useLayoutEffect)(()=>{let{focusAndScrollRef:r,cacheNode:n}=e,l=r.forceScroll?r.scrollRef:n.scrollRef;if(null===l||!l.current)return;let u=null,a=r.hashFragment;if(a){var o;if(null===(u="top"===(o=a)?document.body:document.getElementById(o)??document.getElementsByName(o)[0]??null)){l.current=!1,r.onlyHashChange=!1,r.hashFragment=null;return}}else u=t.current;if(null===u)return;let d=!1;(0,p.disableSmoothScrollDuringRouteTransition)(()=>{let e=document.documentElement,t=null,r=null,n=null,o=()=>{var r,l;let u,a;return null===n&&(r=e,l=t,n=!Number.isFinite(a=Number.parseFloat(u=getComputedStyle(r).scrollPaddingTop))||a<0?0:u.endsWith("px")?a:u.endsWith("%")?a/100*l:0),n};(a||(t=e.clientHeight,0!==(r=g(u,t,o))))&&((d=!0,l.current=!1,a)?u.scrollIntoView():1!==r&&(e.scrollTop=0,2===g(u,t,o)&&u.scrollIntoView()))},{dontForceLayout:!0,onlyHashChange:r.onlyHashChange}),d&&(r.onlyHashChange=!1,r.hashFragment=null)},void 0),(0,o.jsx)(d.Fragment,{ref:t,children:e.children})};function O({children:e,cacheNode:t}){let r=(0,d.useContext)(i.GlobalLayoutRouterContext);if(!r)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});return(0,o.jsx)(j,{focusAndScrollRef:r.focusAndScrollRef,cacheNode:t,children:e})}function x({tree:e,segmentPath:t,debugNameContext:r,cacheNode:n,params:l,url:u,isActive:a}){let s,f=(0,d.useContext)(i.GlobalLayoutRouterContext);if((0,d.useContext)(h.NavigationPromisesContext),!f)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});let p=null!==n?n:(0,d.use)(c.unresolvedThenable),y=null!==p.prefetchRsc?p.prefetchRsc:p.rsc,m=(0,d.useDeferredValue)(p.rsc,y);if((0,v.isDeferredRsc)(m)){let e=(0,d.use)(m);null===e&&(0,d.use)(c.unresolvedThenable),s=e}else null===m&&(0,d.use)(c.unresolvedThenable),s=m;let b=s;return(0,o.jsx)(i.LayoutRouterContext.Provider,{value:{parentTree:e,parentCacheNode:p,parentSegmentPath:t,parentParams:l,parentLoadingData:null,debugNameContext:r,url:u,isActive:a},children:b})}function C({loading:e,children:t}){let r=(0,d.use)(i.LayoutRouterContext);return null===r?t:(0,o.jsx)(i.LayoutRouterContext.Provider,{value:{parentTree:r.parentTree,parentCacheNode:r.parentCacheNode,parentSegmentPath:r.parentSegmentPath,parentParams:r.parentParams,parentLoadingData:e,debugNameContext:r.debugNameContext,url:r.url,isActive:r.isActive},children:t})}function R({name:e,loading:t,children:r}){if(null!==t){let n=t[0],l=t[1],u=t[2];return(0,o.jsx)(d.Suspense,{name:e,fallback:(0,o.jsxs)(o.Fragment,{children:[l,u,n]}),children:r})}return(0,o.jsx)(o.Fragment,{children:r})}function T({parallelRouterKey:e,error:t,errorStyles:r,errorScripts:n,templateStyles:l,templateScripts:u,template:a,notFound:s,forbidden:p,unauthorized:h,segmentViewBoundaries:v}){let g=(0,d.useContext)(i.LayoutRouterContext);if(!g)throw Object.defineProperty(Error("invariant expected layout router to be mounted"),"__NEXT_ERROR_CODE",{value:"E56",enumerable:!1,configurable:!0});let{parentTree:j,parentCacheNode:C,parentSegmentPath:S,parentParams:M,parentLoadingData:E,url:N,isActive:F,debugNameContext:A}=g,B=j[0],D=null===S?[e]:S.concat([B,e]),L=j[1][e],H=C.slots;(void 0===L||null===H)&&(0,d.use)(c.unresolvedThenable);let w=L[0],k=H[e]??null,U=(0,b.createRouterCacheKey)(w,!0),V=(0,_.useRouterBFCache)(L,k,U),I=[];do{let e=V.tree,d=V.cacheNode,c=V.stateKey,b=e[0],_=M;if(Array.isArray(b)){let e=b[0],t=b[1],r=b[2],n=(0,P.getParamValueFromCacheKey)(t,r);null!==n&&(_={...M,[e]:n})}let v=function(e){if("/"===e)return"/";if("string"==typeof e)if("(__SLOT__)"===e)return;else return e+"/";return e[1]+"/"}(b),g=v??A,j=void 0===v?void 0:A,C=(0,o.jsxs)(O,{cacheNode:d,children:[(0,o.jsx)(f.ErrorBoundary,{errorComponent:t,errorStyles:r,errorScripts:n,children:(0,o.jsx)(R,{name:j,loading:E,children:(0,o.jsx)(m.HTTPAccessFallbackBoundary,{notFound:s,forbidden:p,unauthorized:h,children:(0,o.jsxs)(y.RedirectBoundary,{children:[(0,o.jsx)(x,{url:N,tree:e,params:_,cacheNode:d,segmentPath:D,debugNameContext:g,isActive:F&&c===U}),null]})})})}),null]}),T=(0,o.jsxs)(i.TemplateContext.Provider,{value:C,children:[l,u,a]},c);I.push(T),V=V.next}while(null!==V)return I}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},37457,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return o}});let n=e.r(90809),l=e.r(43476),u=n._(e.r(71645)),a=e.r(8372);function o(){let e=(0,u.useContext)(a.TemplateContext);return(0,l.jsx)(l.Fragment,{children:e})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},6831,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return l}});let n=new WeakMap;function l(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},97689,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(6831).createRenderParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},93504,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return l}});let n=new WeakMap;function l(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},66996,(e,t,r)=>{"use strict";e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(93504).createRenderSearchParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},42903,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createClientParams:function(){return u.createRenderParamsFromClient},createClientSearchParams:function(){return a.createRenderSearchParamsFromClient}};for(var l in n)Object.defineProperty(r,l,{enumerable:!0,get:n[l]});let u=e.r(97689),a=e.r(66996);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},27201,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"IconMark",{enumerable:!0,get:function(){return l}});let n=e.r(43476),l=()=>"u">typeof window?null:(0,n.jsx)("meta",{name:"«nxt-icon»"})},91915,(e,t,r)=>{"use strict";function n(e,t={}){if(t.onlyHashChange)return void e();let r=document.documentElement;if("smooth"!==r.dataset.scrollBehavior)return void e();let l=r.style.scrollBehavior;r.style.scrollBehavior="auto",t.dontForceLayout||r.getClientRects(),e(),r.style.scrollBehavior=l}e.i(47167),Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"disableSmoothScrollDuringRouteTransition",{enumerable:!0,get:function(){return n}})}]);
@@ -0,0 +1,119 @@
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)()}]);