ocearo-ui 0.1.22 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/404.html +1 -1
  2. package/README.fr.md +141 -157
  3. package/README.md +137 -157
  4. package/__next.__PAGE__.txt +19 -5
  5. package/__next._full.txt +12 -12
  6. package/__next._tree.txt +2 -2
  7. package/_next/static/chunks/0-c2-u5p6bxzo.js +1 -0
  8. package/_next/static/chunks/0h2qsuyze9ds1.js +1 -0
  9. package/_next/static/chunks/0iqdztntvxh3c.js +119 -0
  10. package/_next/static/chunks/0iztd835j5p1n.js +700 -0
  11. package/_next/static/chunks/{2nxsyowmuwpjy.js → 0jfox92up1jvy.js} +1 -1
  12. package/_next/static/chunks/0jpa5m78l0ib0.js +1 -0
  13. package/_next/static/chunks/0kpstejrka-7k.js +1 -0
  14. package/_next/static/chunks/0m7wbuocx-b4_.js +9 -0
  15. package/_next/static/chunks/0n95joti2n2py.js +3 -0
  16. package/_next/static/chunks/0ohleay4roayh.js +353 -0
  17. package/_next/static/chunks/0on1skx9l54-9.js +1 -0
  18. package/_next/static/chunks/0voiofm58khqd.js +1 -0
  19. package/_next/static/chunks/0w_skktmh3e48.js +1 -0
  20. package/_next/static/chunks/0y-dctk-kmqss.js +1 -0
  21. package/_next/static/chunks/0zwc9m4qgtwle.js +1 -0
  22. package/_next/static/chunks/11awvgcou7v4r.js +1 -0
  23. package/_next/static/chunks/144mjqdrx42lq.js +1 -0
  24. package/_next/static/chunks/15imr2-f_8n-x.js +1 -0
  25. package/_next/static/chunks/18_i6mf6hb_c7.js +1 -0
  26. package/_next/static/chunks/1d81m3g9jqkob.js +1 -0
  27. package/_next/static/chunks/1ed7ayfg19cjb.js +1 -0
  28. package/_next/static/chunks/1epya-yh2wvj2.js +1 -0
  29. package/_next/static/chunks/1exvcc71cgr4t.js +446 -0
  30. package/_next/static/chunks/1g8fbzv0hu0i2.js +1 -0
  31. package/_next/static/chunks/1gq4t2dyr7rq3.js +1 -0
  32. package/_next/static/chunks/1gt2hhqk1821k.js +9 -0
  33. package/_next/static/chunks/1l-jew0-1-3eq.js +30 -0
  34. package/_next/static/chunks/1pa1cfmfts0i9.js +1 -0
  35. package/_next/static/chunks/1ptj3mv8b_tzs.js +1 -0
  36. package/_next/static/chunks/1w1xks0hp_tlr.js +346 -0
  37. package/_next/static/chunks/1xekc18cyi4sx.js +1 -0
  38. package/_next/static/chunks/1y35unwvy8p98.js +1 -0
  39. package/_next/static/chunks/1zm03hw2ylxw8.js +1 -0
  40. package/_next/static/chunks/2aq8orcir5h03.js +1 -0
  41. package/_next/static/chunks/2dvwb-mfasp68.js +1 -0
  42. package/_next/static/chunks/2fdpvhx4oo81h.js +1 -0
  43. package/_next/static/chunks/2g-xpe7xnropn.js +409 -0
  44. package/_next/static/chunks/2kmptoy43h0mx.js +1 -0
  45. package/_next/static/chunks/2kwn4iymxaom3.js +1 -0
  46. package/_next/static/chunks/2n86yq1wz1yx7.js +1 -0
  47. package/_next/static/chunks/2rebcvig176xk.js +564 -0
  48. package/_next/static/chunks/2ryo_bbmt6t74.css +3 -0
  49. package/_next/static/chunks/2s6w3x5jnc2tg.js +1 -0
  50. package/_next/static/chunks/2w44atvyp9o_w.js +1 -0
  51. package/_next/static/chunks/2w71oj1brox5z.js +1 -0
  52. package/_next/static/chunks/2wayx8t5r5fi9.js +1 -0
  53. package/_next/static/chunks/3--qzv1u6c7_7.js +1 -0
  54. package/_next/static/chunks/32yn_fc-es66m.js +22 -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/3nm7o0eq5abhg.js +1 -0
  58. package/_next/static/chunks/3p9ziqn6r35qf.js +1 -0
  59. package/_next/static/chunks/3q8o52_juxmdp.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/3wwn1rti8oc_r.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 +13 -13
  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 +13 -13
  70. package/apple-touch-icon.png +0 -0
  71. package/boats/boats.json +40 -5
  72. package/favicon-96x96.png +0 -0
  73. package/favicon.ico +0 -0
  74. package/favicon.svg +1 -3
  75. package/icons/favicon-16x16.png +0 -0
  76. package/icons/favicon-32x32.png +0 -0
  77. package/icons/favicon-48x48.png +0 -0
  78. package/icons/icon-192x192.png +0 -0
  79. package/icons/icon-512x512.png +0 -0
  80. package/icons/ocearo.webp +0 -0
  81. package/index.html +1 -1
  82. package/index.txt +12 -12
  83. package/manifest.json +2 -3
  84. package/package.json +15 -14
  85. package/settings/__next._full.txt +15 -15
  86. package/settings/__next._tree.txt +2 -2
  87. package/settings/__next.settings.__PAGE__.txt +22 -5
  88. package/settings.html +1 -1
  89. package/settings.txt +15 -15
  90. package/__next._head.txt +0 -6
  91. package/__next._index.txt +0 -5
  92. package/_next/static/chunks/0-z15txb4-uhu.js +0 -409
  93. package/_next/static/chunks/009rlietvsaq2.js +0 -1
  94. package/_next/static/chunks/070stlm97b9a2.js +0 -1
  95. package/_next/static/chunks/0abo2oxxw3hpi.js +0 -1
  96. package/_next/static/chunks/0jzbiie0nzar2.js +0 -1
  97. package/_next/static/chunks/0kinaai2rvd43.js +0 -9
  98. package/_next/static/chunks/0l9s4rhr00adq.js +0 -1
  99. package/_next/static/chunks/0qj7yy4f6sk8y.js +0 -455
  100. package/_next/static/chunks/0ri_um14-5x7u.js +0 -1
  101. package/_next/static/chunks/0uvr7xkt_5uno.js +0 -1
  102. package/_next/static/chunks/0yf1ifg_o1bq6.js +0 -1
  103. package/_next/static/chunks/0zbzk2ob0li1n.js +0 -1
  104. package/_next/static/chunks/0zjxnzbxh76mt.js +0 -1
  105. package/_next/static/chunks/17ma1x64d-211.js +0 -1
  106. package/_next/static/chunks/19xb2y6sgfnza.js +0 -1
  107. package/_next/static/chunks/1bz0tcmhjmjgh.js +0 -1
  108. package/_next/static/chunks/1d4h-sglyo8ft.js +0 -1
  109. package/_next/static/chunks/1gizigk3w6q7j.js +0 -31
  110. package/_next/static/chunks/1ptwltjb3h6jf.js +0 -4
  111. package/_next/static/chunks/1q572rz5m8mb-.js +0 -1
  112. package/_next/static/chunks/1rkf8qtk5-48h.js +0 -1
  113. package/_next/static/chunks/1sq_733weprvs.js +0 -1
  114. package/_next/static/chunks/26e1o1as-77nq.js +0 -172
  115. package/_next/static/chunks/27hn45pv56pv7.js +0 -393
  116. package/_next/static/chunks/28y-j215vt42m.js +0 -1
  117. package/_next/static/chunks/2a0yjir_3mk1m.js +0 -1
  118. package/_next/static/chunks/2atijj_pkc4uc.js +0 -2
  119. package/_next/static/chunks/2ccpehidlaq88.js +0 -1
  120. package/_next/static/chunks/2fy4q1c5l3tpj.js +0 -1
  121. package/_next/static/chunks/2lvvt2f1l5sfu.js +0 -1
  122. package/_next/static/chunks/2lw7kypuhij1_.css +0 -3
  123. package/_next/static/chunks/2nd5amcst4lhp.js +0 -1
  124. package/_next/static/chunks/2pwmb4pkqygy_.js +0 -1
  125. package/_next/static/chunks/2q_83f24jeg0e.js +0 -1
  126. package/_next/static/chunks/2rsdqsatgq9ta.js +0 -1
  127. package/_next/static/chunks/2udirievybq_j.js +0 -1
  128. package/_next/static/chunks/2urimbxg5bqv3.js +0 -1
  129. package/_next/static/chunks/32cbrrsp-x35l.js +0 -1
  130. package/_next/static/chunks/36ra6xjie0dsv.js +0 -9
  131. package/_next/static/chunks/3iuz3f0429awx.js +0 -1
  132. package/_next/static/chunks/3jh1u-s3k0bkk.js +0 -1
  133. package/_next/static/chunks/3jupxlga7r_do.js +0 -1
  134. package/_next/static/chunks/3m57lnggu30tr.js +0 -243
  135. package/_next/static/chunks/3myql5zu0rstt.js +0 -425
  136. package/_next/static/chunks/3rhgquok36e79.js +0 -1
  137. package/_next/static/chunks/42dfiu6iby3fq.js +0 -1
  138. package/_next/static/chunks/43ps2cu5ahf8n.js +0 -3
  139. package/_next/static/chunks/turbopack-0pirmko-w-775.js +0 -1
  140. package/_not-found/__next._head.txt +0 -6
  141. package/_not-found/__next._index.txt +0 -5
  142. package/_not-found/__next._not-found.txt +0 -5
  143. package/boats/ais/ais-30.glb +0 -0
  144. package/boats/ais/ais-31.glb +0 -0
  145. package/boats/ais/ais-35.glb +0 -0
  146. package/boats/ais/ais-36.glb +0 -0
  147. package/boats/ais/ais-37.glb +0 -0
  148. package/boats/ais/ais-40.glb +0 -0
  149. package/boats/ais/ais-50.glb +0 -0
  150. package/boats/ais/ais-60.glb +0 -0
  151. package/boats/ais/ais-70.glb +0 -0
  152. package/boats/ais/ais-80.glb +0 -0
  153. package/settings/__next._head.txt +0 -6
  154. package/settings/__next._index.txt +0 -5
  155. package/settings/__next.settings.txt +0 -5
  156. /package/_next/static/{sct9rcMTcCyBLHTxQQ75- → 01VWnAYjs9QwBnnMyWbQF}/_buildManifest.js +0 -0
  157. /package/_next/static/{sct9rcMTcCyBLHTxQQ75- → 01VWnAYjs9QwBnnMyWbQF}/_clientMiddlewareManifest.js +0 -0
  158. /package/_next/static/{sct9rcMTcCyBLHTxQQ75- → 01VWnAYjs9QwBnnMyWbQF}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,77291,e=>{"use strict";var r=e.i(71645),t=e.i(62588),n=e.i(85709),i=e.i(61969),a=e.i(539);let o=Math.PI/180,s={power:1,sail:2,fishing:3,restricted:4},u=e=>{let r=String(e.navState||"").toLowerCase();if(/not under command|restricted|constrained/.test(r))return"restricted";if(/fishing/.test(r))return"fishing";if(/sailing/.test(r))return"sail";if(/motoring|engine/.test(r))return"power";let t=Number(e.shipType);return 36===t?"sail":30===t?"fishing":33===t?"restricted":"power"},l=(e,r,t)=>(0,a.wrapPi)(Math.atan2(r.x-e.x,r.y-e.y)-t),g=(e,r,t)=>{let n={x:0,y:0},i=l(n,r,e.course),u=l(r,n,r.course),g=Math.sign(u)||1,d=e=>Math.abs(e)>112.5*o;if(d(i)&&r.speed>e.speed)return{ownRole:"stand-on",rule:"13",reason:"overtakenByTarget",targetTurn:0};if(d(u)&&e.speed>r.speed)return{ownRole:"give-way",rule:"13",reason:"overtaking",targetTurn:0};let c=s[e.category]??1,p=s[r.category]??1;if(c!==p)return c<p?{ownRole:"give-way",rule:"18",reason:`giveWayTo_${r.category}`,targetTurn:0}:{ownRole:"stand-on",rule:"18",reason:`standOnFrom_${r.category}`,targetTurn:g};if("sail"===e.category&&Number.isFinite(t)){let n=(0,a.wrapPi)(t-e.course)>=0?"starboard":"port";return n!==((0,a.wrapPi)(t-r.course)>=0?"starboard":"port")?"port"===n?{ownRole:"give-way",rule:"12a-i",reason:"portTack",targetTurn:0}:{ownRole:"stand-on",rule:"12a-i",reason:"targetPortTack",targetTurn:g}:r.x*Math.sin(t)+r.y*Math.cos(t)>0?{ownRole:"stand-on",rule:"12a-ii",reason:"targetWindward",targetTurn:g}:{ownRole:"give-way",rule:"12a-ii",reason:"ownWindward",targetTurn:0}}return Math.abs((0,a.wrapPi)(r.course-e.course-Math.PI))<10*o&&Math.abs(i)<6*o?{ownRole:"both",rule:"14",reason:"headOn",targetTurn:1}:i>0?{ownRole:"give-way",rule:"15",reason:"crossingStarboard",targetTurn:0}:{ownRole:"stand-on",rule:"15",reason:"crossingPort",targetTurn:g}};var d=e.i(83402),c=e.i(67561);let p=[],m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,({always:e=!1}={})=>{let a,o,{targets:s}=(0,t.useAIS)({passive:!0}),{states:l}=(0,c.useOcearoContext)(),v=e||l.ais?s:p,{twd:h,heading:b}=(0,i.default)(),f=(0,n.useSignalKPaths)(m),w=(a=(0,n.useSignalKPrefix)("propulsion."),o=d.default.get("ownVesselCategory"),(0,r.useMemo)(()=>"sail"===o||"power"===o?o:Object.entries(a).some(([e,r])=>e.endsWith(".revolutions")&&Number(r)>.5||e.endsWith(".state")&&"started"===r)?"power":"sail",[a,o])),T=d.default.get("aisLengthScalingFactor")||.7;return(0,r.useMemo)(()=>{let e=f["navigation.courseOverGroundTrue"]??b,r=f["navigation.speedOverGround"]??0,t=[];if(Number.isFinite(e))for(let n of v){if("danger"!==n.risk)continue;let i=n.cog??n.cogMagnetic??n.heading;if(!Number.isFinite(i)||null===n.sceneX)continue;let a=g({course:e,speed:r,category:w},{x:n.sceneX/T,y:-n.sceneZ/T,course:i,speed:n.sog??0,category:u(n)},h);t.push({target:{...n},role:a})}t.sort((e,r)=>(e.target.tcpaSeconds??1/0)-(r.target.tcpaSeconds??1/0));let n={};for(let e of v)"close"===e.risk?n[e.mmsi]="close":"danger"===e.risk&&(n[e.mmsi]="giveWay");for(let e of t)n[e.target.mmsi]="stand-on"===e.role.ownRole?"yields":"giveWay";let i=t.filter(e=>"stand-on"!==e.role.ownRole);return{ownCategory:w,encounters:t,statuses:n,giveWay:i.length>0,giveWayTo:i[0]||null,primary:t[0]||null}},[v,h,b,f,w,T])}],77291)},61969,e=>{"use strict";var r=e.i(71645),t=e.i(85709),n=e.i(539);let i=180/Math.PI,a=["navigation.speedThroughWater","navigation.speedOverGround","navigation.headingTrue","navigation.courseOverGroundTrue","environment.wind.speedTrue","environment.wind.angleTrueWater","environment.wind.directionTrue","performance.polarSpeed","performance.polarSpeedRatio","navigation.courseGreatCircle.nextPoint.bearingTrue"];e.s(["default",0,()=>{let e=(0,t.useSignalKPaths)(a);return(0,r.useMemo)(()=>{let r=e["navigation.speedThroughWater"]??e["navigation.speedOverGround"]??null,t=e["navigation.headingTrue"]??e["navigation.courseOverGroundTrue"]??null,a=e["environment.wind.speedTrue"]??null,o=e["environment.wind.angleTrueWater"]??null,s=e["environment.wind.directionTrue"]??null;null===s&&Number.isFinite(o)&&Number.isFinite(t)&&(s=(0,n.wrapPi)(t+o));let u=e["performance.polarSpeed"]??(Number.isFinite(a)&&Number.isFinite(o)?(0,n.polarSpeedSi)(a,o):null),l=e["performance.polarSpeedRatio"]??null;null===l&&Number.isFinite(r)&&Number.isFinite(u)&&u>.2&&(l=r/u);let g=Number.isFinite(r)&&Number.isFinite(u)?(r-u)*1.943844:null,d=null,c=null,p=!Number.isFinite(o)||Math.abs(o)<Math.PI/2;if(Number.isFinite(a)){let e=p?(0,n.optimalUpwind)(1.943844*a):(0,n.optimalDownwind)(1.943844*a);e&&(d=e.twa/i,Number.isFinite(s)&&Number.isFinite(o)&&(c=(0,n.wrapPi)(s-Math.sign(o||1)*d)))}let m=e["navigation.courseGreatCircle.nextPoint.bearingTrue"],v=null;if(Number.isFinite(m)&&Number.isFinite(s)&&Number.isFinite(a)){let e=(0,n.bestVmcHeading)({twd:s,tws:a,bearing:m}),r=Number.isFinite(t)?(0,n.vmcForHeading)({twd:s,tws:a,bearing:m,heading:t}):null;v=e?{bearing:m,best:e,current:r}:null}return{ratio:l,polarSpeed:u,boatSpeed:r,deltaKn:g,heading:t,twd:s,tws:a,twa:o,targetTwa:d,targetHeading:c,upwind:p,vmc:v}},[e])}])},83646,e=>{"use strict";var r=e.i(67561);e.s(["default",0,()=>(0,r.useOcearoContext)().tokens])},74452,(e,r,t)=>{r.exports={vpp:{angles:[52,60,75,90,110,120,135,150],speeds:[6,8,10,12,14,16,20],52:[4.98,5.86,6.31,6.45,6.51,6.52,6.41],60:[5.25,6.11,6.56,6.73,6.79,6.82,6.79],75:[5.45,6.33,6.77,7.01,7.13,7.2,7.24],90:[5.66,6.55,7,7.25,7.38,7.53,7.7],110:[5.49,6.49,7.04,7.4,7.69,7.97,8.38],120:[5.32,6.36,6.97,7.39,7.77,8.1,8.6],135:[4.81,5.92,6.68,7.15,7.55,7.95,8.85],150:[4.09,5.17,6.04,6.61,6.99,7.31,7.93],beat_angle:[43.6,42,41.2,41.2,41.7,42.1,44.2],beat_vmg:[3.26,3.91,4.24,4.34,4.36,4.34,4.16],run_angle:[144.8,147.8,148.5,149.6,171.8,175.4,177.2],run_vmg:[3.54,4.48,5.23,5.73,6.17,6.67,7.36]}}},539,e=>{"use strict";var r=e.i(74452);let t=180/Math.PI,n=r.default.vpp,i=(e,r,t)=>e+(r-e)*t,a=(e,r)=>{if(r<=e[0])return[0,0];let t=e.length-1;if(r>=e[t])return[t-1,1];let n=0;for(;r>e[n+1];)n++;return[n,(r-e[n])/(e[n+1]-e[n])]},o=n.speeds.map((e,r)=>(e=>{let r=n.beat_angle[e],i=n.run_angle[e],a=n.beat_vmg[e]/Math.cos(r/t),o=n.run_vmg[e]/Math.abs(Math.cos(i/t)),s=[[0,0],[.7*r,.55*a],[r,a]];for(let t of n.angles)t>r&&t<i&&s.push([t,n[String(t)][e]]);return s.push([i,o]),i<180&&s.push([180,n.run_vmg[e]]),s})(r)),s=(e,r)=>{let[t,n]=a(e.map(e=>e[0]),r);return i(e[t][1],e[t+1][1],n)},u=(e,r)=>{if(!Number.isFinite(e)||!Number.isFinite(r)||e<=0)return null;let t=Math.min(180,Math.abs((r+540)%360-180)),u=n.speeds;if(e<u[0])return s(o[0],t)*(e/u[0]);let[l,g]=a(u,e);return i(s(o[l],t),s(o[l+1],t),g)},l=(e,r)=>{let[t,o]=a(n.speeds,r);return i(e[t],e[t+1],o)},g=(e,r)=>{let n=u(1.943844*e,r*t);return null===n?null:n/1.943844},d=e=>{let r=(e+Math.PI)%(2*Math.PI);return r<0&&(r+=2*Math.PI),r-Math.PI};e.s(["bestVmcHeading",0,({twd:e,tws:r,bearing:n})=>{if(![e,r,n].every(Number.isFinite)||r<=0)return null;let i=null;for(let a=-100;a<=100;a++){let o=n+a/t,s=g(r,d(e-o));if(null===s)continue;let u=s*Math.cos(o-n);(!i||u>i.vmc)&&(i={heading:d(o),speed:s,vmc:u})}return i},"optimalDownwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let r=l(n.run_angle,e),i=u(e,r);return{twa:r,speed:i,vmg:-i*Math.cos(r/t)}},"optimalUpwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let r=l(n.beat_angle,e),i=u(e,r);return{twa:r,speed:i,vmg:i*Math.cos(r/t)}},"polarSpeed",0,u,"polarSpeedSi",0,g,"vmcForHeading",0,({twd:e,tws:r,bearing:t,heading:n})=>{if(![e,r,t,n].every(Number.isFinite))return null;let i=g(r,d(e-n));return null===i?null:i*Math.cos(n-t)},"wrapPi",0,d])}]);
@@ -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),l=e.i(85709),n=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:l})=>{let[n,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}),n?(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 ${l} 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,l.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 n.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 n.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=>_(()=>n.default.adjustAutopilotTarget(e,G),"autopilot.failedToAdjustHeading",{lock:!1}),V=e=>_(()=>n.default.autopilotDodge(e,G),"autopilot.failedToDodge"),X=e=>_(()=>n.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,el=et("steering.autopilot.engaged")??k?.engaged??"enabled"===ea,en="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 overflow-x-auto scrollbar-hide",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-3 whitespace-nowrap 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 ${en?"text-oRed":el?"text-oGreen":ea?"text-oYellow":"text-hud-muted"}`,children:(0,t.jsx)(c.FontAwesomeIcon,{icon:en?u.faTimesCircle:el?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:()=>_(()=>n.default.engageAutopilot(G),"autopilot.failedToEngage"),disabled:Z||el||en,className:`py-3 rounded font-semibold text-label uppercase transition-all ${Z||el||en?"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:()=>_(()=>n.default.disengageAutopilot(G),"autopilot.failedToDisengage"),disabled:Z||!el,className:`py-3 rounded font-semibold text-label uppercase transition-all ${Z||!el?"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:()=>_(()=>n.default.setAutopilotMode(e,G),"autopilot.failedToSetMode"),disabled:Z||en,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),_(()=>n.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),_(()=>n.default.autopilotManeuver(e,a,G),"tack"===e?"autopilot.failedToTack":"autopilot.failedToGybe"))},disabled:Z||!el||!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||!el,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,17617,e=>{"use strict";var a=e.i(43476),t=e.i(71645);e.i(85269);var n=e.i(22831),i=e.i(83402),s=e.i(67561),l=e.i(85709),r=e.i(46991);let d=e=>e*Math.PI/180,o=({label:e,description:t,checked:n,onChange:i})=>(0,a.jsx)("div",{className:"p-4 rounded-xl bg-hud-bg tesla-hover border border-hud",children:(0,a.jsxs)("label",{className:"flex items-center justify-between cursor-pointer",children:[(0,a.jsxs)("div",{className:"space-y-1",children:[(0,a.jsx)("span",{className:"text-label font-bold uppercase tracking-widest text-hud-secondary",children:e}),t&&(0,a.jsx)("p",{className:"text-caption text-hud-muted font-medium uppercase tracking-wider",children:t})]}),(0,a.jsx)("input",{type:"checkbox",className:"sr-only peer",checked:n,onChange:e=>i(e.target.checked)}),(0,a.jsx)("div",{className:"relative w-11 h-6 bg-hud-bg-elevated peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-hud-main after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-hud-main after:border-hud-main after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-oYellow"})]})}),c=({label:e,value:t,accent:n="text-hud-main"})=>(0,a.jsxs)("div",{className:"flex flex-col bg-hud-bg p-2 rounded-lg border border-hud",children:[(0,a.jsx)("span",{className:"text-caption font-semibold uppercase tracking-widest text-hud-muted leading-none mb-1",children:e}),(0,a.jsx)("span",{className:`text-caption font-mono font-bold ${n}`,children:t})]});e.s(["default",0,()=>{let{t:e}=(0,n.useTranslation)(),{updateSignalKData:x}=(0,s.useOcearoContext)(),[g,u]=(0,t.useState)(()=>i.default.get("debugWindOverride")||!1),[p,m]=(0,t.useState)(()=>i.default.get("debugWindSpeed")??10),[b,h]=(0,t.useState)(()=>i.default.get("debugWindDirection")??0),[v,f]=(0,t.useState)(()=>i.default.get("debugShowAxes")||!1),j=(0,t.useCallback)((e,a)=>{let t=e*r.KNOTS_TO_MPS,n=a*Math.PI/180;x({"environment.wind.speedTrue":t,"environment.wind.speedApparent":t,"environment.wind.angleTrueWater":n,"environment.wind.angleApparent":n,"environment.wind.directionTrue":n})},[x]);(0,t.useEffect)(()=>{if(!g)return;j(p,b);let e=setInterval(()=>{j(p,b)},1e3);return()=>clearInterval(e)},[g,p,b,j]);let w=(0,t.useMemo)(()=>["environment.wind.angleTrueWater","environment.wind.speedTrue","environment.wind.angleApparent","environment.wind.speedApparent","performance.beatAngle","performance.gybeAngle","performance.beatAngleVelocityMadeGood","performance.gybeAngleVelocityMadeGood","performance.targetAngle","performance.polarSpeed","performance.polarSpeedRatio","performance.velocityMadeGood","navigation.speedThroughWater","performance.polarVelocityMadeGood","performance.polarVelocityMadeGoodRatio","navigation.headingTrue","navigation.courseOverGroundTrue","navigation.courseGreatCircle.nextPoint.bearingTrue","performance.laylineAngle","navigation.racing.layline","navigation.racing.layline.distance","navigation.racing.layline.time","navigation.racing.oppositeLayline","navigation.racing.oppositeLayline.distance","navigation.racing.oppositeLayline.time","navigation.racing.startLineStb","navigation.racing.startLinePort","navigation.racing.distanceStartline","navigation.racing.timeToStart","navigation.racing.timePortDown","navigation.racing.timePortUp","navigation.racing.timeStbdDown","navigation.racing.timeStbdUp"],[]),y=(0,l.useSignalKPaths)(w),N=(e,a)=>y[e]??a,S=N("environment.wind.angleTrueWater",d(25)),T=N("environment.wind.speedTrue",20),k=N("environment.wind.angleApparent",d(23)),A=N("environment.wind.speedApparent",25),M=N("performance.beatAngle",d(45)),P=N("performance.gybeAngle",d(135)),$=N("performance.beatAngleVelocityMadeGood",6),W=N("performance.gybeAngleVelocityMadeGood",5),F=N("performance.targetAngle",M),G=N("performance.polarSpeed",8),D=N("performance.polarSpeedRatio",.95),O=N("performance.velocityMadeGood",5),I=N("navigation.speedThroughWater",7),V=N("performance.polarVelocityMadeGood",6),C=N("performance.polarVelocityMadeGoodRatio",.9),Y=N("navigation.headingTrue",d(0)),R=N("navigation.courseOverGroundTrue",d(20)),L=N("navigation.courseGreatCircle.nextPoint.bearingTrue",d(30)),U=N("performance.laylineAngle",d(10)),B=N("navigation.racing.layline.distance",100),K=N("navigation.racing.layline.time",180),_=N("navigation.racing.oppositeLayline.distance",80),E=N("navigation.racing.oppositeLayline.time",180),H=N("navigation.racing.distanceStartline",50),q=N("navigation.racing.timeToStart",120),z=N("navigation.racing.timePortDown",60),J=N("navigation.racing.timePortUp",70),Q=N("navigation.racing.timeStbdDown",65),X=N("navigation.racing.timeStbdUp",75);return(0,a.jsxs)("div",{className:"p-8 text-hud-main w-full overflow-y-auto h-full",children:[(0,a.jsxs)("header",{className:"mb-8",children:[(0,a.jsx)("h1",{className:"text-value font-semibold uppercase tracking-tight mb-1",children:e("menu.debug")}),(0,a.jsx)("p",{className:"text-hud-secondary text-label font-medium uppercase tracking-widest",children:e("debug.systemDebug")})]}),(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:"3D"}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsx)(o,{label:e("settings.debugShowAxes"),description:e("settings.debugShowAxesDesc"),checked:v,onChange:e=>{f(e),i.default.set("debugShowAxes",e)}})]}),(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:e("settings.debugWindOverride")}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsx)(o,{label:e("settings.debugWindOverride"),description:e("settings.debugWindOverrideDesc"),checked:g,onChange:e=>{u(e),i.default.set("debugWindOverride",e)}}),g&&(0,a.jsxs)("div",{className:"space-y-4 p-4 rounded-xl bg-oYellow/5 border border-oYellow/20",children:[(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsx)("span",{className:"text-caption font-semibold uppercase tracking-widest text-hud-secondary",children:e("settings.debugWindSpeed")}),(0,a.jsxs)("span",{className:"text-value font-semibold text-oYellow bg-oYellow/10 px-3 py-1 rounded-lg",children:[p," kn"]})]}),(0,a.jsx)("input",{type:"range",className:"w-full h-1.5 bg-hud-bg-elevated rounded-lg appearance-none cursor-pointer accent-oYellow",min:"0",max:"60",step:"0.5",value:p,onChange:e=>{var a;m(a=parseFloat(e.target.value)),i.default.set("debugWindSpeed",a)}})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsx)("span",{className:"text-caption font-semibold uppercase tracking-widest text-hud-secondary",children:e("settings.debugWindDirection")}),(0,a.jsxs)("span",{className:"text-value font-semibold text-oYellow bg-oYellow/10 px-3 py-1 rounded-lg",children:[b,"°"]})]}),(0,a.jsx)("input",{type:"range",className:"w-full h-1.5 bg-hud-bg-elevated rounded-lg appearance-none cursor-pointer accent-oYellow",min:"0",max:"359",step:"1",value:b,onChange:e=>{var a;h(a=parseInt(e.target.value,10)),i.default.set("debugWindDirection",a)}})]})]})]}),(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:e("debug.windDynamics")}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsx)(c,{label:"TWA",value:`${(180/Math.PI*S).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"TWS",value:`${T.toFixed(1)} kn`}),(0,a.jsx)(c,{label:"AWA",value:`${(180/Math.PI*k).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"AWS",value:`${A.toFixed(1)} kn`})]})]}),(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:e("debug.performanceMetrics")}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsx)(c,{label:"Beat ∠",value:`${(180/Math.PI*M).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"Gybe ∠",value:`${(180/Math.PI*P).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"VMG Beat",value:`${$.toFixed(1)} kn`}),(0,a.jsx)(c,{label:"VMG Gybe",value:`${W.toFixed(1)} kn`}),(0,a.jsx)(c,{label:"Target TWA",value:`${(180/Math.PI*F).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"Opt ∠",value:`${(180/Math.PI*(F-S)).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"Polar Spd",value:`${G.toFixed(1)} kn`}),(0,a.jsx)(c,{label:"Pol Ratio",value:D.toFixed(2)}),(0,a.jsx)(c,{label:"VMG",value:`${O.toFixed(1)} kn`,accent:"text-oBlue"}),(0,a.jsx)(c,{label:"STW",value:`${I.toFixed(1)} kn`}),(0,a.jsx)(c,{label:"Pol VMG",value:`${V.toFixed(1)} kn`}),(0,a.jsx)(c,{label:"Pol VMG %",value:`${(100*C).toFixed(1)}%`})]})]}),(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:e("debug.navigation")}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsx)(c,{label:"Heading",value:`${(180/Math.PI*Y).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"COG",value:`${(180/Math.PI*R).toFixed(1)}\xb0`}),(0,a.jsx)(c,{label:"WPT Brg",value:`${(180/Math.PI*L).toFixed(1)}\xb0`,accent:"text-oYellow"}),(0,a.jsx)(c,{label:"Layline ∠",value:`${(180/Math.PI*U).toFixed(1)}\xb0`,accent:"text-oGreen"})]})]}),(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:e("debug.laylineAnalysis")}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsx)(c,{label:"Dist",value:`${B.toFixed(0)}m`}),(0,a.jsx)(c,{label:"Time",value:`${K}s`}),(0,a.jsx)(c,{label:"Opp Dist",value:`${_.toFixed(0)}m`}),(0,a.jsx)(c,{label:"Opp Time",value:`${E}s`})]})]}),(0,a.jsxs)("section",{className:"tesla-card space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsx)("h2",{className:"text-label font-semibold uppercase tracking-widest text-hud-main/90",children:e("debug.regattaStart")}),(0,a.jsx)("div",{className:"h-[1px] flex-grow bg-hud-border mx-4"})]}),(0,a.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,a.jsx)(c,{label:"Start Dist",value:`${H.toFixed(1)}m`,accent:"text-oRed"}),(0,a.jsx)(c,{label:"TT Start",value:`${q}s`,accent:"text-oRed"}),(0,a.jsx)(c,{label:"Port DW",value:`${z}s`}),(0,a.jsx)(c,{label:"Port UW",value:`${J}s`}),(0,a.jsx)(c,{label:"Stbd DW",value:`${Q}s`}),(0,a.jsx)(c,{label:"Stbd UW",value:`${X}s`})]})]})]})]})}])},58652,function(e){e.n(e.i(17617))}]);
@@ -0,0 +1,409 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,78461,e=>{"use strict";var t=e.i(71645),i=e.i(85709),n=e.i(67561);let r=["navigation.headingTrue","navigation.headingMagnetic","navigation.courseOverGroundTrue","navigation.courseOverGroundMagnetic","navigation.position"],a=null;e.s(["default",0,()=>{let{convertLatLonToXY:e}=(0,n.useOcearoContext)(),s=(0,i.useSignalKPaths)(r),o=s["navigation.headingTrue"]??s["navigation.headingMagnetic"]??s["navigation.courseOverGroundTrue"]??s["navigation.courseOverGroundMagnetic"],l=Number.isFinite(o),d=s["navigation.position"],u=Number.isFinite(d?.latitude)&&Number.isFinite(d?.longitude);return{heading:l?o:0,offset:(0,t.useMemo)(()=>{if(!u)return{x:0,y:0};let t={lat:d.latitude,lon:d.longitude};return e(t,(a||(a=t),a))},[d,u,e]),hasFix:u,hasHeading:l}}])},23549,e=>{"use strict";var t=e.i(43476),i=e.i(71645);e.i(85269);var n=e.i(22831),r=e.i(78461),a=e.i(37369),s=e.i(539),o=e.i(76247);let l=180/Math.PI;e.s(["default",0,()=>{let{t:e}=(0,n.useTranslation)(),d=(0,a.useBerth)(),u=(()=>{let{heading:e,offset:t}=(0,r.default)(),n=(0,a.useBerth)();return(0,i.useMemo)(()=>{if(!n.pose)return null;let{x:i,y:r,heading:a}=n.pose,l="stern"===n.type,d=l?1:-1,u={x:i+d*Math.sin(a)*o.BOAT.length*.5,y:r+d*Math.cos(a)*o.BOAT.length*.5},c=u.x-t.x,f=u.y-t.y,p=Math.hypot(c,f),h=(0,s.wrapPi)(Math.atan2(c,f)-e),m=-(c*Math.cos(a)-f*Math.sin(a));return{distance:p,bearing:h,headingError:(0,s.wrapPi)(a-e),lateral:m,astern:l}},[n,e,t])})(),{heading:c,offset:f}=(0,r.default)(),p=e=>`px-3 py-1.5 rounded-full text-caption font-semibold uppercase tracking-wider border transition-colors ${e?"bg-oBlue text-white border-oBlue":"border-hud text-hud-secondary hover:text-hud-main"}`,h=null;if(u){let t=Math.round(u.headingError*l),i=u.lateral,n=t=>e(t>=0?"parking.starboard":"parking.port");h=Math.abs(u.bearing)>.6*Math.PI?e("parking.behind"):Math.abs(i)>.4?e("parking.moveAcross",{metres:Math.abs(i).toFixed(1),side:n(-i)}):Math.abs(t)>4?e("parking.turn",{deg:Math.abs(t),side:n(t)}):e(u.astern?"parking.alignedAstern":"parking.aligned")}return(0,t.jsxs)("div",{className:"hud-halo flex flex-col items-center gap-2 select-none",children:[u&&(0,t.jsxs)("div",{className:"text-center leading-tight",children:[(0,t.jsx)("div",{className:"text-value font-semibold text-hud-main",children:h}),(0,t.jsxs)("div",{className:"text-caption text-hud-secondary",children:[e("parking.entry",{metres:u.distance.toFixed(0)}),u.astern?` \xb7 ${e("parking.astern")}`:"","virtual"===d.source?` \xb7 ${e("parking.virtual")}`:""]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap justify-center gap-2",children:[a.BERTH_TYPES.map(i=>(0,t.jsx)("button",{type:"button",className:p(d.type===i),onClick:()=>"virtual"===d.source?(0,a.placeVirtualBerth)(f,c,i):(0,a.setBerth)({type:i}),children:e(`parking.type_${i}`)},i)),"side"===d.type&&(0,t.jsx)("button",{type:"button",className:p(!1),onClick:()=>(0,a.setBerth)({side:"port"===d.side?"starboard":"port"}),children:e("port"===d.side?"parking.portSide":"parking.starboardSide")}),(0,t.jsx)("button",{type:"button",className:p(!1),onClick:()=>(0,a.placeVirtualBerth)(f,c),children:e("parking.placeAhead")})]})]})}],23549)},36540,function(e){e.n(e.i(23549))},76247,37369,e=>{"use strict";var t=e.i(43476),i=e.i(71645),n=e.i(43216),r=e.i(83646),a=e.i(78461);let s={type:"bow",side:"starboard",pose:null,source:"virtual"},o=new Set,l=()=>s,d=e=>{s={...s,...e},o.forEach(e=>e())},u=e=>(o.add(e),()=>o.delete(e)),c=()=>(0,i.useSyncExternalStore)(u,l,l),f=(e,t,i=s.type,n=22)=>{d({type:i,pose:{x:e.x+Math.sin(t)*n,y:e.y+Math.cos(t)*n,heading:"stern"===i?t+Math.PI:t},source:"virtual"})};e.s(["BERTH_TYPES",0,["bow","stern","side","buoy"],"getBerth",0,l,"placeVirtualBerth",0,f,"setBerth",0,d,"useBerth",0,c],37369);let p={length:10.8,beam:3.9},h=p.length/2,m=p.beam/2,v=({size:e,position:i,color:n,opacity:r=1})=>(0,t.jsxs)("mesh",{position:i,children:[(0,t.jsx)("boxGeometry",{args:e}),(0,t.jsx)("meshLambertMaterial",{color:n,transparent:r<1,opacity:r})]}),g=({position:e,rotation:i=0,color:n,length:r=4})=>(0,t.jsxs)("group",{position:e,rotation:[0,i,0],children:[(0,t.jsxs)("mesh",{rotation:[-Math.PI/2,0,0],position:[0,.07,r/2-.6],children:[(0,t.jsx)("planeGeometry",{args:[.7,r-1.2]}),(0,t.jsx)("meshBasicMaterial",{color:n,transparent:!0,opacity:.85,depthWrite:!1})]}),(0,t.jsxs)("mesh",{rotation:[-Math.PI/2,0,0],position:[0,.07,-.6],children:[(0,t.jsx)("circleGeometry",{args:[1.2,3,Math.PI/2]}),(0,t.jsx)("meshBasicMaterial",{color:n,transparent:!0,opacity:.85,depthWrite:!1})]})]}),y=({type:e,side:r,colors:a})=>{let s,o=(0,i.useMemo)(()=>(()=>{let e=-h+3.5,t=[[-m,h],[m,h],[m,e]];for(let i=1;i<=8;i++){let n=i/8;t.push([m*(1-n)**1.6,e-(e+h)*Math.sin(n*Math.PI/2)])}for(let i=7;i>=0;i--){let n=i/8;t.push([-m*(1-n)**1.6,e-(e+h)*Math.sin(n*Math.PI/2)])}return t.push([-m,h]),t.map(([e,t])=>[e,.06,t])})(),[]),l="port"===r?-1:1;return(0,t.jsxs)("group",{children:[(0,t.jsx)(n.Line,{points:o,color:a.target,lineWidth:2.5,dashed:!0,dashSize:.8,gapSize:.5}),(0,t.jsxs)("mesh",{rotation:[-Math.PI/2,0,0],position:[0,.04,.3],children:[(0,t.jsx)("planeGeometry",{args:[.9*p.beam,p.length-1.6]}),(0,t.jsx)("meshBasicMaterial",{color:a.target,transparent:!0,opacity:.12,depthWrite:!1})]}),("bow"===e||"stern"===e)&&(s="bow"===e?-1:1,(0,t.jsxs)("group",{children:[(0,t.jsx)(v,{size:[32,.35,2.2],position:[0,.17,s*(h+.45+1.1)],color:a.pontoon}),(0,t.jsx)(v,{size:[.8,.3,9],position:[m+.45+.4,.15,s*(h-4.5+.45)],color:a.pontoon}),(0,t.jsx)(v,{size:[.95*p.beam,1,.95*p.length],position:[-(p.beam+.9),.5,0],color:a.neighbour,opacity:.45}),(0,t.jsx)(g,{position:[0,0,-s*(h+7)],rotation:"bow"===e?0:Math.PI,color:a.target})]})),"side"===e&&(0,t.jsxs)("group",{children:[(0,t.jsx)(v,{size:[2.4,.35,26],position:[l*(m+.45+1.2),.17,0],color:a.pontoon}),(0,t.jsx)(g,{position:[-(2.5*l),0,h+6],rotation:.25*l,color:a.target})]}),"buoy"===e&&(0,t.jsxs)("group",{children:[(0,t.jsxs)("mesh",{position:[0,.5,-(h+2.5)],children:[(0,t.jsx)("sphereGeometry",{args:[.6,20,14]}),(0,t.jsx)("meshLambertMaterial",{color:a.buoy})]}),(0,t.jsx)(n.Line,{points:[[0,.3,-(h+2.5)],[0,.3,-h]],color:a.pontoon,lineWidth:2}),(0,t.jsx)(g,{position:[0,0,h+6],color:a.target})]})]})};e.s(["BOAT",0,p,"default",0,({scale:e=.5})=>{let{scene:n,accent:s}=(0,r.default)(),{heading:o,offset:d,hasFix:u,hasHeading:p}=(0,a.default)(),h=c();(0,i.useEffect)(()=>{u&&p&&!l().pose&&f(d,o)},[d,o,u,p]);let m=(0,i.useMemo)(()=>({target:s,pontoon:n.rigging,neighbour:n.vessel,buoy:n.target}),[n,s]);if(!h.pose)return null;let{x:v,y:g,heading:x}=h.pose;return(0,t.jsx)("group",{rotation:[0,o,0],children:(0,t.jsx)("group",{position:[(v-d.x)*e,0,-(g-d.y)*e],rotation:[0,-x,0],scale:[e,e,e],children:(0,t.jsx)(y,{type:h.type,side:h.side,colors:m})})})}],76247)},83646,e=>{"use strict";var t=e.i(67561);e.s(["default",0,()=>(0,t.useOcearoContext)().tokens])},31067,e=>{"use strict";function t(){return(t=Object.assign.bind()).apply(null,arguments)}e.s(["default",()=>t])},43216,e=>{"use strict";let t,i;var n=e.i(31067),r=e.i(71645),a=e.i(90072),s=e.i(90874),o=a,l=e.i(32533),d=a,u=e.i(8560),c=e.i(31497);class f extends d.ShaderMaterial{constructor(e){super({type:"LineMaterial",uniforms:d.UniformsUtils.clone(d.UniformsUtils.merge([u.UniformsLib.common,u.UniformsLib.fog,{worldUnits:{value:1},linewidth:{value:1},resolution:{value:new d.Vector2(1,1)},dashOffset:{value:0},dashScale:{value:1},dashSize:{value:1},gapSize:{value:1}}])),vertexShader:`
2
+ #include <common>
3
+ #include <fog_pars_vertex>
4
+ #include <logdepthbuf_pars_vertex>
5
+ #include <clipping_planes_pars_vertex>
6
+
7
+ uniform float linewidth;
8
+ uniform vec2 resolution;
9
+
10
+ attribute vec3 instanceStart;
11
+ attribute vec3 instanceEnd;
12
+
13
+ #ifdef USE_COLOR
14
+ #ifdef USE_LINE_COLOR_ALPHA
15
+ varying vec4 vLineColor;
16
+ attribute vec4 instanceColorStart;
17
+ attribute vec4 instanceColorEnd;
18
+ #else
19
+ varying vec3 vLineColor;
20
+ attribute vec3 instanceColorStart;
21
+ attribute vec3 instanceColorEnd;
22
+ #endif
23
+ #endif
24
+
25
+ #ifdef WORLD_UNITS
26
+
27
+ varying vec4 worldPos;
28
+ varying vec3 worldStart;
29
+ varying vec3 worldEnd;
30
+
31
+ #ifdef USE_DASH
32
+
33
+ varying vec2 vUv;
34
+
35
+ #endif
36
+
37
+ #else
38
+
39
+ varying vec2 vUv;
40
+
41
+ #endif
42
+
43
+ #ifdef USE_DASH
44
+
45
+ uniform float dashScale;
46
+ attribute float instanceDistanceStart;
47
+ attribute float instanceDistanceEnd;
48
+ varying float vLineDistance;
49
+
50
+ #endif
51
+
52
+ void trimSegment( const in vec4 start, inout vec4 end ) {
53
+
54
+ // trim end segment so it terminates between the camera plane and the near plane
55
+
56
+ // conservative estimate of the near plane
57
+ float a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column
58
+ float b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column
59
+ float nearEstimate = - 0.5 * b / a;
60
+
61
+ float alpha = ( nearEstimate - start.z ) / ( end.z - start.z );
62
+
63
+ end.xyz = mix( start.xyz, end.xyz, alpha );
64
+
65
+ }
66
+
67
+ void main() {
68
+
69
+ #ifdef USE_COLOR
70
+
71
+ vLineColor = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;
72
+
73
+ #endif
74
+
75
+ #ifdef USE_DASH
76
+
77
+ vLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;
78
+ vUv = uv;
79
+
80
+ #endif
81
+
82
+ float aspect = resolution.x / resolution.y;
83
+
84
+ // camera space
85
+ vec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );
86
+ vec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );
87
+
88
+ #ifdef WORLD_UNITS
89
+
90
+ worldStart = start.xyz;
91
+ worldEnd = end.xyz;
92
+
93
+ #else
94
+
95
+ vUv = uv;
96
+
97
+ #endif
98
+
99
+ // special case for perspective projection, and segments that terminate either in, or behind, the camera plane
100
+ // clearly the gpu firmware has a way of addressing this issue when projecting into ndc space
101
+ // but we need to perform ndc-space calculations in the shader, so we must address this issue directly
102
+ // perhaps there is a more elegant solution -- WestLangley
103
+
104
+ bool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column
105
+
106
+ if ( perspective ) {
107
+
108
+ if ( start.z < 0.0 && end.z >= 0.0 ) {
109
+
110
+ trimSegment( start, end );
111
+
112
+ } else if ( end.z < 0.0 && start.z >= 0.0 ) {
113
+
114
+ trimSegment( end, start );
115
+
116
+ }
117
+
118
+ }
119
+
120
+ // clip space
121
+ vec4 clipStart = projectionMatrix * start;
122
+ vec4 clipEnd = projectionMatrix * end;
123
+
124
+ // ndc space
125
+ vec3 ndcStart = clipStart.xyz / clipStart.w;
126
+ vec3 ndcEnd = clipEnd.xyz / clipEnd.w;
127
+
128
+ // direction
129
+ vec2 dir = ndcEnd.xy - ndcStart.xy;
130
+
131
+ // account for clip-space aspect ratio
132
+ dir.x *= aspect;
133
+ dir = normalize( dir );
134
+
135
+ #ifdef WORLD_UNITS
136
+
137
+ // get the offset direction as perpendicular to the view vector
138
+ vec3 worldDir = normalize( end.xyz - start.xyz );
139
+ vec3 offset;
140
+ if ( position.y < 0.5 ) {
141
+
142
+ offset = normalize( cross( start.xyz, worldDir ) );
143
+
144
+ } else {
145
+
146
+ offset = normalize( cross( end.xyz, worldDir ) );
147
+
148
+ }
149
+
150
+ // sign flip
151
+ if ( position.x < 0.0 ) offset *= - 1.0;
152
+
153
+ float forwardOffset = dot( worldDir, vec3( 0.0, 0.0, 1.0 ) );
154
+
155
+ // don't extend the line if we're rendering dashes because we
156
+ // won't be rendering the endcaps
157
+ #ifndef USE_DASH
158
+
159
+ // extend the line bounds to encompass endcaps
160
+ start.xyz += - worldDir * linewidth * 0.5;
161
+ end.xyz += worldDir * linewidth * 0.5;
162
+
163
+ // shift the position of the quad so it hugs the forward edge of the line
164
+ offset.xy -= dir * forwardOffset;
165
+ offset.z += 0.5;
166
+
167
+ #endif
168
+
169
+ // endcaps
170
+ if ( position.y > 1.0 || position.y < 0.0 ) {
171
+
172
+ offset.xy += dir * 2.0 * forwardOffset;
173
+
174
+ }
175
+
176
+ // adjust for linewidth
177
+ offset *= linewidth * 0.5;
178
+
179
+ // set the world position
180
+ worldPos = ( position.y < 0.5 ) ? start : end;
181
+ worldPos.xyz += offset;
182
+
183
+ // project the worldpos
184
+ vec4 clip = projectionMatrix * worldPos;
185
+
186
+ // shift the depth of the projected points so the line
187
+ // segments overlap neatly
188
+ vec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;
189
+ clip.z = clipPose.z * clip.w;
190
+
191
+ #else
192
+
193
+ vec2 offset = vec2( dir.y, - dir.x );
194
+ // undo aspect ratio adjustment
195
+ dir.x /= aspect;
196
+ offset.x /= aspect;
197
+
198
+ // sign flip
199
+ if ( position.x < 0.0 ) offset *= - 1.0;
200
+
201
+ // endcaps
202
+ if ( position.y < 0.0 ) {
203
+
204
+ offset += - dir;
205
+
206
+ } else if ( position.y > 1.0 ) {
207
+
208
+ offset += dir;
209
+
210
+ }
211
+
212
+ // adjust for linewidth
213
+ offset *= linewidth;
214
+
215
+ // adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...
216
+ offset /= resolution.y;
217
+
218
+ // select end
219
+ vec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;
220
+
221
+ // back to clip space
222
+ offset *= clip.w;
223
+
224
+ clip.xy += offset;
225
+
226
+ #endif
227
+
228
+ gl_Position = clip;
229
+
230
+ vec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation
231
+
232
+ #include <logdepthbuf_vertex>
233
+ #include <clipping_planes_vertex>
234
+ #include <fog_vertex>
235
+
236
+ }
237
+ `,fragmentShader:`
238
+ uniform vec3 diffuse;
239
+ uniform float opacity;
240
+ uniform float linewidth;
241
+
242
+ #ifdef USE_DASH
243
+
244
+ uniform float dashOffset;
245
+ uniform float dashSize;
246
+ uniform float gapSize;
247
+
248
+ #endif
249
+
250
+ varying float vLineDistance;
251
+
252
+ #ifdef WORLD_UNITS
253
+
254
+ varying vec4 worldPos;
255
+ varying vec3 worldStart;
256
+ varying vec3 worldEnd;
257
+
258
+ #ifdef USE_DASH
259
+
260
+ varying vec2 vUv;
261
+
262
+ #endif
263
+
264
+ #else
265
+
266
+ varying vec2 vUv;
267
+
268
+ #endif
269
+
270
+ #include <common>
271
+ #include <fog_pars_fragment>
272
+ #include <logdepthbuf_pars_fragment>
273
+ #include <clipping_planes_pars_fragment>
274
+
275
+ #ifdef USE_COLOR
276
+ #ifdef USE_LINE_COLOR_ALPHA
277
+ varying vec4 vLineColor;
278
+ #else
279
+ varying vec3 vLineColor;
280
+ #endif
281
+ #endif
282
+
283
+ vec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {
284
+
285
+ float mua;
286
+ float mub;
287
+
288
+ vec3 p13 = p1 - p3;
289
+ vec3 p43 = p4 - p3;
290
+
291
+ vec3 p21 = p2 - p1;
292
+
293
+ float d1343 = dot( p13, p43 );
294
+ float d4321 = dot( p43, p21 );
295
+ float d1321 = dot( p13, p21 );
296
+ float d4343 = dot( p43, p43 );
297
+ float d2121 = dot( p21, p21 );
298
+
299
+ float denom = d2121 * d4343 - d4321 * d4321;
300
+
301
+ float numer = d1343 * d4321 - d1321 * d4343;
302
+
303
+ mua = numer / denom;
304
+ mua = clamp( mua, 0.0, 1.0 );
305
+ mub = ( d1343 + d4321 * ( mua ) ) / d4343;
306
+ mub = clamp( mub, 0.0, 1.0 );
307
+
308
+ return vec2( mua, mub );
309
+
310
+ }
311
+
312
+ void main() {
313
+
314
+ #include <clipping_planes_fragment>
315
+
316
+ #ifdef USE_DASH
317
+
318
+ if ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps
319
+
320
+ if ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX
321
+
322
+ #endif
323
+
324
+ float alpha = opacity;
325
+
326
+ #ifdef WORLD_UNITS
327
+
328
+ // Find the closest points on the view ray and the line segment
329
+ vec3 rayEnd = normalize( worldPos.xyz ) * 1e5;
330
+ vec3 lineDir = worldEnd - worldStart;
331
+ vec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );
332
+
333
+ vec3 p1 = worldStart + lineDir * params.x;
334
+ vec3 p2 = rayEnd * params.y;
335
+ vec3 delta = p1 - p2;
336
+ float len = length( delta );
337
+ float norm = len / linewidth;
338
+
339
+ #ifndef USE_DASH
340
+
341
+ #ifdef USE_ALPHA_TO_COVERAGE
342
+
343
+ float dnorm = fwidth( norm );
344
+ alpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );
345
+
346
+ #else
347
+
348
+ if ( norm > 0.5 ) {
349
+
350
+ discard;
351
+
352
+ }
353
+
354
+ #endif
355
+
356
+ #endif
357
+
358
+ #else
359
+
360
+ #ifdef USE_ALPHA_TO_COVERAGE
361
+
362
+ // artifacts appear on some hardware if a derivative is taken within a conditional
363
+ float a = vUv.x;
364
+ float b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;
365
+ float len2 = a * a + b * b;
366
+ float dlen = fwidth( len2 );
367
+
368
+ if ( abs( vUv.y ) > 1.0 ) {
369
+
370
+ alpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );
371
+
372
+ }
373
+
374
+ #else
375
+
376
+ if ( abs( vUv.y ) > 1.0 ) {
377
+
378
+ float a = vUv.x;
379
+ float b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;
380
+ float len2 = a * a + b * b;
381
+
382
+ if ( len2 > 1.0 ) discard;
383
+
384
+ }
385
+
386
+ #endif
387
+
388
+ #endif
389
+
390
+ vec4 diffuseColor = vec4( diffuse, alpha );
391
+ #ifdef USE_COLOR
392
+ #ifdef USE_LINE_COLOR_ALPHA
393
+ diffuseColor *= vLineColor;
394
+ #else
395
+ diffuseColor.rgb *= vLineColor;
396
+ #endif
397
+ #endif
398
+
399
+ #include <logdepthbuf_fragment>
400
+
401
+ gl_FragColor = diffuseColor;
402
+
403
+ #include <tonemapping_fragment>
404
+ #include <${c.version>=154?"colorspace_fragment":"encodings_fragment"}>
405
+ #include <fog_fragment>
406
+ #include <premultiplied_alpha_fragment>
407
+
408
+ }
409
+ `,clipping:!0}),this.isLineMaterial=!0,this.onBeforeCompile=function(){this.transparent?this.defines.USE_LINE_COLOR_ALPHA="1":delete this.defines.USE_LINE_COLOR_ALPHA},Object.defineProperties(this,{color:{enumerable:!0,get:function(){return this.uniforms.diffuse.value},set:function(e){this.uniforms.diffuse.value=e}},worldUnits:{enumerable:!0,get:function(){return"WORLD_UNITS"in this.defines},set:function(e){!0===e?this.defines.WORLD_UNITS="":delete this.defines.WORLD_UNITS}},linewidth:{enumerable:!0,get:function(){return this.uniforms.linewidth.value},set:function(e){this.uniforms.linewidth.value=e}},dashed:{enumerable:!0,get:function(){return"USE_DASH"in this.defines},set(e){!!e!="USE_DASH"in this.defines&&(this.needsUpdate=!0),!0===e?this.defines.USE_DASH="":delete this.defines.USE_DASH}},dashScale:{enumerable:!0,get:function(){return this.uniforms.dashScale.value},set:function(e){this.uniforms.dashScale.value=e}},dashSize:{enumerable:!0,get:function(){return this.uniforms.dashSize.value},set:function(e){this.uniforms.dashSize.value=e}},dashOffset:{enumerable:!0,get:function(){return this.uniforms.dashOffset.value},set:function(e){this.uniforms.dashOffset.value=e}},gapSize:{enumerable:!0,get:function(){return this.uniforms.gapSize.value},set:function(e){this.uniforms.gapSize.value=e}},opacity:{enumerable:!0,get:function(){return this.uniforms.opacity.value},set:function(e){this.uniforms.opacity.value=e}},resolution:{enumerable:!0,get:function(){return this.uniforms.resolution.value},set:function(e){this.uniforms.resolution.value.copy(e)}},alphaToCoverage:{enumerable:!0,get:function(){return"USE_ALPHA_TO_COVERAGE"in this.defines},set:function(e){!!e!="USE_ALPHA_TO_COVERAGE"in this.defines&&(this.needsUpdate=!0),!0===e?(this.defines.USE_ALPHA_TO_COVERAGE="",this.extensions.derivatives=!0):(delete this.defines.USE_ALPHA_TO_COVERAGE,this.extensions.derivatives=!1)}}}),this.setValues(e)}}let p=c.version>=125?"uv1":"uv2",h=new o.Vector4,m=new o.Vector3,v=new o.Vector3,g=new o.Vector4,y=new o.Vector4,x=new o.Vector4,b=new o.Vector3,S=new o.Matrix4,w=new o.Line3,M=new o.Vector3,_=new o.Box3,E=new o.Sphere,A=new o.Vector4;function L(e,t,n){return A.set(0,0,-t,1).applyMatrix4(e.projectionMatrix),A.multiplyScalar(1/A.w),A.x=i/n.width,A.y=i/n.height,A.applyMatrix4(e.projectionMatrixInverse),A.multiplyScalar(1/A.w),Math.abs(Math.max(A.x,A.y))}class B extends o.Mesh{constructor(e=new l.LineSegmentsGeometry,t=new f({color:0xffffff*Math.random()})){super(e,t),this.isLineSegments2=!0,this.type="LineSegments2"}computeLineDistances(){let e=this.geometry,t=e.attributes.instanceStart,i=e.attributes.instanceEnd,n=new Float32Array(2*t.count);for(let e=0,r=0,a=t.count;e<a;e++,r+=2)m.fromBufferAttribute(t,e),v.fromBufferAttribute(i,e),n[r]=0===r?0:n[r-1],n[r+1]=n[r]+m.distanceTo(v);let r=new o.InstancedInterleavedBuffer(n,2,1);return e.setAttribute("instanceDistanceStart",new o.InterleavedBufferAttribute(r,1,0)),e.setAttribute("instanceDistanceEnd",new o.InterleavedBufferAttribute(r,1,1)),this}raycast(e,n){let r,a,s=this.material.worldUnits,l=e.camera;null!==l||s||console.error('LineSegments2: "Raycaster.camera" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.');let d=void 0!==e.params.Line2&&e.params.Line2.threshold||0;t=e.ray;let u=this.matrixWorld,c=this.geometry,f=this.material;if(i=f.linewidth+d,null===c.boundingSphere&&c.computeBoundingSphere(),E.copy(c.boundingSphere).applyMatrix4(u),s)r=.5*i;else{let e=Math.max(l.near,E.distanceToPoint(t.origin));r=L(l,e,f.resolution)}if(E.radius+=r,!1!==t.intersectsSphere(E)){if(null===c.boundingBox&&c.computeBoundingBox(),_.copy(c.boundingBox).applyMatrix4(u),s)a=.5*i;else{let e=Math.max(l.near,_.distanceToPoint(t.origin));a=L(l,e,f.resolution)}_.expandByScalar(a),!1!==t.intersectsBox(_)&&(s?function(e,n){let r=e.matrixWorld,a=e.geometry,s=a.attributes.instanceStart,l=a.attributes.instanceEnd,d=Math.min(a.instanceCount,s.count);for(let a=0;a<d;a++){w.start.fromBufferAttribute(s,a),w.end.fromBufferAttribute(l,a),w.applyMatrix4(r);let d=new o.Vector3,u=new o.Vector3;t.distanceSqToSegment(w.start,w.end,u,d),u.distanceTo(d)<.5*i&&n.push({point:u,pointOnLine:d,distance:t.origin.distanceTo(u),object:e,face:null,faceIndex:a,uv:null,[p]:null})}}(this,n):function(e,n,r){let a=n.projectionMatrix,s=e.material.resolution,l=e.matrixWorld,d=e.geometry,u=d.attributes.instanceStart,c=d.attributes.instanceEnd,f=Math.min(d.instanceCount,u.count),h=-n.near;t.at(1,x),x.w=1,x.applyMatrix4(n.matrixWorldInverse),x.applyMatrix4(a),x.multiplyScalar(1/x.w),x.x*=s.x/2,x.y*=s.y/2,x.z=0,b.copy(x),S.multiplyMatrices(n.matrixWorldInverse,l);for(let n=0;n<f;n++){if(g.fromBufferAttribute(u,n),y.fromBufferAttribute(c,n),g.w=1,y.w=1,g.applyMatrix4(S),y.applyMatrix4(S),g.z>h&&y.z>h)continue;if(g.z>h){let e=g.z-y.z,t=(g.z-h)/e;g.lerp(y,t)}else if(y.z>h){let e=y.z-g.z,t=(y.z-h)/e;y.lerp(g,t)}g.applyMatrix4(a),y.applyMatrix4(a),g.multiplyScalar(1/g.w),y.multiplyScalar(1/y.w),g.x*=s.x/2,g.y*=s.y/2,y.x*=s.x/2,y.y*=s.y/2,w.start.copy(g),w.start.z=0,w.end.copy(y),w.end.z=0;let d=w.closestPointToPointParameter(b,!0);w.at(d,M);let f=o.MathUtils.lerp(g.z,y.z,d),m=f>=-1&&f<=1,v=b.distanceTo(M)<.5*i;if(m&&v){w.start.fromBufferAttribute(u,n),w.end.fromBufferAttribute(c,n),w.start.applyMatrix4(l),w.end.applyMatrix4(l);let i=new o.Vector3,a=new o.Vector3;t.distanceSqToSegment(w.start,w.end,a,i),r.push({point:a,pointOnLine:i,distance:t.origin.distanceTo(a),object:e,face:null,faceIndex:n,uv:null,[p]:null})}}}(this,l,n))}}onBeforeRender(e){let t=this.material.uniforms;t&&t.resolution&&(e.getViewport(h),this.material.uniforms.resolution.value.set(h.z,h.w))}}var U=l;class z extends U.LineSegmentsGeometry{constructor(){super(),this.isLineGeometry=!0,this.type="LineGeometry"}setPositions(e){let t=e.length-3,i=new Float32Array(2*t);for(let n=0;n<t;n+=3)i[2*n]=e[n],i[2*n+1]=e[n+1],i[2*n+2]=e[n+2],i[2*n+3]=e[n+3],i[2*n+4]=e[n+4],i[2*n+5]=e[n+5];return super.setPositions(i),this}setColors(e,t=3){let i=e.length-t,n=new Float32Array(2*i);if(3===t)for(let r=0;r<i;r+=t)n[2*r]=e[r],n[2*r+1]=e[r+1],n[2*r+2]=e[r+2],n[2*r+3]=e[r+3],n[2*r+4]=e[r+4],n[2*r+5]=e[r+5];else for(let r=0;r<i;r+=t)n[2*r]=e[r],n[2*r+1]=e[r+1],n[2*r+2]=e[r+2],n[2*r+3]=e[r+3],n[2*r+4]=e[r+4],n[2*r+5]=e[r+5],n[2*r+6]=e[r+6],n[2*r+7]=e[r+7];return super.setColors(n,t),this}fromLine(e){let t=e.geometry;return this.setPositions(t.attributes.position.array),this}}class j extends B{constructor(e=new z,t=new f({color:0xffffff*Math.random()})){super(e,t),this.isLine2=!0,this.type="Line2"}}let O=r.forwardRef(function({points:e,color:t=0xffffff,vertexColors:i,linewidth:o,lineWidth:d,segments:u,dashed:c,...p},h){var m,v;let g=(0,s.useThree)(e=>e.size),y=r.useMemo(()=>u?new B:new j,[u]),[x]=r.useState(()=>new f),b=(null==i||null==(m=i[0])?void 0:m.length)===4?4:3,S=r.useMemo(()=>{let n=u?new l.LineSegmentsGeometry:new z,r=e.map(e=>{let t=Array.isArray(e);return e instanceof a.Vector3||e instanceof a.Vector4?[e.x,e.y,e.z]:e instanceof a.Vector2?[e.x,e.y,0]:t&&3===e.length?[e[0],e[1],e[2]]:t&&2===e.length?[e[0],e[1],0]:e});if(n.setPositions(r.flat()),i){t=0xffffff;let e=i.map(e=>e instanceof a.Color?e.toArray():e);n.setColors(e.flat(),b)}return n},[e,u,i,b]);return r.useLayoutEffect(()=>{y.computeLineDistances()},[e,y]),r.useLayoutEffect(()=>{c?x.defines.USE_DASH="":delete x.defines.USE_DASH,x.needsUpdate=!0},[c,x]),r.useEffect(()=>()=>{S.dispose(),x.dispose()},[S]),r.createElement("primitive",(0,n.default)({object:y,ref:h},p),r.createElement("primitive",{object:S,attach:"geometry"}),r.createElement("primitive",(0,n.default)({object:x,attach:"material",color:t,vertexColors:!!i,resolution:[g.width,g.height],linewidth:null!=(v=null!=o?o:d)?v:1,dashed:c,transparent:4===b},p)))});e.s(["Line",0,O],43216)},31497,e=>{"use strict";let t=parseInt(e.i(90072).REVISION.replace(/\D+/g,""));e.s(["version",0,t])},32533,e=>{"use strict";var t=e.i(90072);let i=new t.Box3,n=new t.Vector3;class r extends t.InstancedBufferGeometry{constructor(){super(),this.isLineSegmentsGeometry=!0,this.type="LineSegmentsGeometry",this.setIndex([0,2,1,2,3,1,2,4,3,4,5,3,4,6,5,6,7,5]),this.setAttribute("position",new t.Float32BufferAttribute([-1,2,0,1,2,0,-1,1,0,1,1,0,-1,0,0,1,0,0,-1,-1,0,1,-1,0],3)),this.setAttribute("uv",new t.Float32BufferAttribute([-1,2,1,2,-1,1,1,1,-1,-1,1,-1,-1,-2,1,-2],2))}applyMatrix4(e){let t=this.attributes.instanceStart,i=this.attributes.instanceEnd;return void 0!==t&&(t.applyMatrix4(e),i.applyMatrix4(e),t.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}setPositions(e){let i;e instanceof Float32Array?i=e:Array.isArray(e)&&(i=new Float32Array(e));let n=new t.InstancedInterleavedBuffer(i,6,1);return this.setAttribute("instanceStart",new t.InterleavedBufferAttribute(n,3,0)),this.setAttribute("instanceEnd",new t.InterleavedBufferAttribute(n,3,3)),this.computeBoundingBox(),this.computeBoundingSphere(),this}setColors(e,i=3){let n;e instanceof Float32Array?n=e:Array.isArray(e)&&(n=new Float32Array(e));let r=new t.InstancedInterleavedBuffer(n,2*i,1);return this.setAttribute("instanceColorStart",new t.InterleavedBufferAttribute(r,i,0)),this.setAttribute("instanceColorEnd",new t.InterleavedBufferAttribute(r,i,i)),this}fromWireframeGeometry(e){return this.setPositions(e.attributes.position.array),this}fromEdgesGeometry(e){return this.setPositions(e.attributes.position.array),this}fromMesh(e){return this.fromWireframeGeometry(new t.WireframeGeometry(e.geometry)),this}fromLineSegments(e){let t=e.geometry;return this.setPositions(t.attributes.position.array),this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new t.Box3);let e=this.attributes.instanceStart,n=this.attributes.instanceEnd;void 0!==e&&void 0!==n&&(this.boundingBox.setFromBufferAttribute(e),i.setFromBufferAttribute(n),this.boundingBox.union(i))}computeBoundingSphere(){null===this.boundingSphere&&(this.boundingSphere=new t.Sphere),null===this.boundingBox&&this.computeBoundingBox();let e=this.attributes.instanceStart,i=this.attributes.instanceEnd;if(void 0!==e&&void 0!==i){let t=this.boundingSphere.center;this.boundingBox.getCenter(t);let r=0;for(let a=0,s=e.count;a<s;a++)n.fromBufferAttribute(e,a),r=Math.max(r,t.distanceToSquared(n)),n.fromBufferAttribute(i,a),r=Math.max(r,t.distanceToSquared(n));this.boundingSphere.radius=Math.sqrt(r),isNaN(this.boundingSphere.radius)&&console.error("THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.",this)}}toJSON(){}applyMatrix(e){return console.warn("THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4()."),this.applyMatrix4(e)}}e.s(["LineSegmentsGeometry",0,r])},74452,(e,t,i)=>{t.exports={vpp:{angles:[52,60,75,90,110,120,135,150],speeds:[6,8,10,12,14,16,20],52:[4.98,5.86,6.31,6.45,6.51,6.52,6.41],60:[5.25,6.11,6.56,6.73,6.79,6.82,6.79],75:[5.45,6.33,6.77,7.01,7.13,7.2,7.24],90:[5.66,6.55,7,7.25,7.38,7.53,7.7],110:[5.49,6.49,7.04,7.4,7.69,7.97,8.38],120:[5.32,6.36,6.97,7.39,7.77,8.1,8.6],135:[4.81,5.92,6.68,7.15,7.55,7.95,8.85],150:[4.09,5.17,6.04,6.61,6.99,7.31,7.93],beat_angle:[43.6,42,41.2,41.2,41.7,42.1,44.2],beat_vmg:[3.26,3.91,4.24,4.34,4.36,4.34,4.16],run_angle:[144.8,147.8,148.5,149.6,171.8,175.4,177.2],run_vmg:[3.54,4.48,5.23,5.73,6.17,6.67,7.36]}}},539,e=>{"use strict";var t=e.i(74452);let i=180/Math.PI,n=t.default.vpp,r=(e,t,i)=>e+(t-e)*i,a=(e,t)=>{if(t<=e[0])return[0,0];let i=e.length-1;if(t>=e[i])return[i-1,1];let n=0;for(;t>e[n+1];)n++;return[n,(t-e[n])/(e[n+1]-e[n])]},s=n.speeds.map((e,t)=>(e=>{let t=n.beat_angle[e],r=n.run_angle[e],a=n.beat_vmg[e]/Math.cos(t/i),s=n.run_vmg[e]/Math.abs(Math.cos(r/i)),o=[[0,0],[.7*t,.55*a],[t,a]];for(let i of n.angles)i>t&&i<r&&o.push([i,n[String(i)][e]]);return o.push([r,s]),r<180&&o.push([180,n.run_vmg[e]]),o})(t)),o=(e,t)=>{let[i,n]=a(e.map(e=>e[0]),t);return r(e[i][1],e[i+1][1],n)},l=(e,t)=>{if(!Number.isFinite(e)||!Number.isFinite(t)||e<=0)return null;let i=Math.min(180,Math.abs((t+540)%360-180)),l=n.speeds;if(e<l[0])return o(s[0],i)*(e/l[0]);let[d,u]=a(l,e);return r(o(s[d],i),o(s[d+1],i),u)},d=(e,t)=>{let[i,s]=a(n.speeds,t);return r(e[i],e[i+1],s)},u=(e,t)=>{let n=l(1.943844*e,t*i);return null===n?null:n/1.943844},c=e=>{let t=(e+Math.PI)%(2*Math.PI);return t<0&&(t+=2*Math.PI),t-Math.PI};e.s(["bestVmcHeading",0,({twd:e,tws:t,bearing:n})=>{if(![e,t,n].every(Number.isFinite)||t<=0)return null;let r=null;for(let a=-100;a<=100;a++){let s=n+a/i,o=u(t,c(e-s));if(null===o)continue;let l=o*Math.cos(s-n);(!r||l>r.vmc)&&(r={heading:c(s),speed:o,vmc:l})}return r},"optimalDownwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let t=d(n.run_angle,e),r=l(e,t);return{twa:t,speed:r,vmg:-r*Math.cos(t/i)}},"optimalUpwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let t=d(n.beat_angle,e),r=l(e,t);return{twa:t,speed:r,vmg:r*Math.cos(t/i)}},"polarSpeed",0,l,"polarSpeedSi",0,u,"vmcForHeading",0,({twd:e,tws:t,bearing:i,heading:n})=>{if(![e,t,i,n].every(Number.isFinite))return null;let r=u(t,c(e-n));return null===r?null:r*Math.cos(n-i)},"wrapPi",0,c])}]);
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,26822,e=>{"use strict";var t=e.i(43476),r=e.i(71645);e.i(85269);var n=e.i(22831),i=e.i(83524),a=e.i(85709),o=e.i(66799),s=e.i(92554);let l=["compass","gps","heading","auto"],u=["steering.autopilot.engaged","steering.autopilot.state","steering.autopilot.mode"];e.s(["default",0,()=>{let{t:e}=(0,n.useTranslation)(),d=(0,i.default)(),g=(0,a.useSignalKPaths)(u),[c,p]=(0,r.useState)(!1),[m,v]=(0,r.useState)(null),h=(0,r.useRef)(null);if((0,r.useEffect)(()=>()=>clearTimeout(h.current),[]),!d)return null;let f=g["steering.autopilot.engaged"]??"enabled"===g["steering.autopilot.state"],b=g["steering.autopilot.mode"],w=!0===f&&(!b||l.includes(b))&&null!==d.change,M=Math.round((d.change??0)*180/Math.PI),T=async()=>{if(!c){p(!0),h.current=setTimeout(()=>p(!1),4e3);return}clearTimeout(h.current),p(!1);try{await o.default.adjustAutopilotTarget(M),v({ok:!0,text:e("advice.applied")})}catch(e){v({ok:!1,text:e?.message||String(e)})}setTimeout(()=>v(null),4e3)},N="avoid"===d.kind,y="standOn"===d.kind;return(0,t.jsxs)("div",{className:`tesla-card !p-3 flex items-center gap-3 max-w-[30rem] ${N?"border-oRed/60":""}`,children:[(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("div",{className:`text-label font-semibold ${N?"text-oRed":y?"text-oGreen":"text-oYellow"}`,children:(0,s.formatAdvice)(d,e)}),(0,t.jsx)("div",{className:"text-caption text-hud-muted truncate",children:m?m.text:d.reason?`${e(`colregs.${d.reason}`,{name:d.targetName||"AIS"})} \xb7 ${e("colregs.rule",{rule:d.lastMoment?"17b":d.rule})}`:N?e("advice.avoidHint",{name:d.targetName||"AIS"}):e("advice.vmgHint")})]}),w&&!y&&(0,t.jsx)("button",{type:"button",onClick:T,className:`shrink-0 px-3 py-2 rounded-lg text-caption font-semibold uppercase tracking-wider border transition-colors ${c?"bg-oYellow text-black border-oYellow":"border-hud text-hud-main tesla-hover"}`,children:c?e("advice.confirm"):e("advice.apply")})]})}])},56101,function(e){e.n(e.i(26822))},77291,e=>{"use strict";var t=e.i(71645),r=e.i(62588),n=e.i(85709),i=e.i(61969),a=e.i(539);let o=Math.PI/180,s={power:1,sail:2,fishing:3,restricted:4},l=e=>{let t=String(e.navState||"").toLowerCase();if(/not under command|restricted|constrained/.test(t))return"restricted";if(/fishing/.test(t))return"fishing";if(/sailing/.test(t))return"sail";if(/motoring|engine/.test(t))return"power";let r=Number(e.shipType);return 36===r?"sail":30===r?"fishing":33===r?"restricted":"power"},u=(e,t,r)=>(0,a.wrapPi)(Math.atan2(t.x-e.x,t.y-e.y)-r),d=(e,t,r)=>{let n={x:0,y:0},i=u(n,t,e.course),l=u(t,n,t.course),d=Math.sign(l)||1,g=e=>Math.abs(e)>112.5*o;if(g(i)&&t.speed>e.speed)return{ownRole:"stand-on",rule:"13",reason:"overtakenByTarget",targetTurn:0};if(g(l)&&e.speed>t.speed)return{ownRole:"give-way",rule:"13",reason:"overtaking",targetTurn:0};let c=s[e.category]??1,p=s[t.category]??1;if(c!==p)return c<p?{ownRole:"give-way",rule:"18",reason:`giveWayTo_${t.category}`,targetTurn:0}:{ownRole:"stand-on",rule:"18",reason:`standOnFrom_${t.category}`,targetTurn:d};if("sail"===e.category&&Number.isFinite(r)){let n=(0,a.wrapPi)(r-e.course)>=0?"starboard":"port";return n!==((0,a.wrapPi)(r-t.course)>=0?"starboard":"port")?"port"===n?{ownRole:"give-way",rule:"12a-i",reason:"portTack",targetTurn:0}:{ownRole:"stand-on",rule:"12a-i",reason:"targetPortTack",targetTurn:d}:t.x*Math.sin(r)+t.y*Math.cos(r)>0?{ownRole:"stand-on",rule:"12a-ii",reason:"targetWindward",targetTurn:d}:{ownRole:"give-way",rule:"12a-ii",reason:"ownWindward",targetTurn:0}}return Math.abs((0,a.wrapPi)(t.course-e.course-Math.PI))<10*o&&Math.abs(i)<6*o?{ownRole:"both",rule:"14",reason:"headOn",targetTurn:1}:i>0?{ownRole:"give-way",rule:"15",reason:"crossingStarboard",targetTurn:0}:{ownRole:"stand-on",rule:"15",reason:"crossingPort",targetTurn:d}};var g=e.i(83402),c=e.i(67561);let p=[],m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,({always:e=!1}={})=>{let a,o,{targets:s}=(0,r.useAIS)({passive:!0}),{states:u}=(0,c.useOcearoContext)(),v=e||u.ais?s:p,{twd:h,heading:f}=(0,i.default)(),b=(0,n.useSignalKPaths)(m),w=(a=(0,n.useSignalKPrefix)("propulsion."),o=g.default.get("ownVesselCategory"),(0,t.useMemo)(()=>"sail"===o||"power"===o?o:Object.entries(a).some(([e,t])=>e.endsWith(".revolutions")&&Number(t)>.5||e.endsWith(".state")&&"started"===t)?"power":"sail",[a,o])),M=g.default.get("aisLengthScalingFactor")||.7;return(0,t.useMemo)(()=>{let e=b["navigation.courseOverGroundTrue"]??f,t=b["navigation.speedOverGround"]??0,r=[];if(Number.isFinite(e))for(let n of v){if("danger"!==n.risk)continue;let i=n.cog??n.cogMagnetic??n.heading;if(!Number.isFinite(i)||null===n.sceneX)continue;let a=d({course:e,speed:t,category:w},{x:n.sceneX/M,y:-n.sceneZ/M,course:i,speed:n.sog??0,category:l(n)},h);r.push({target:{...n},role:a})}r.sort((e,t)=>(e.target.tcpaSeconds??1/0)-(t.target.tcpaSeconds??1/0));let n={};for(let e of v)"close"===e.risk?n[e.mmsi]="close":"danger"===e.risk&&(n[e.mmsi]="giveWay");for(let e of r)n[e.target.mmsi]="stand-on"===e.role.ownRole?"yields":"giveWay";let i=r.filter(e=>"stand-on"!==e.role.ownRole);return{ownCategory:w,encounters:r,statuses:n,giveWay:i.length>0,giveWayTo:i[0]||null,primary:r[0]||null}},[v,h,f,b,w,M])}],77291)},83524,92554,e=>{"use strict";var t=e.i(71645),r=e.i(62588),n=e.i(85709),i=e.i(61969),a=e.i(90669),o=e.i(539),s=e.i(83402),l=e.i(77291);let u=Math.PI/180,d=3*u,g=60*u,c=5*u,p=90*u,m=["navigation.speedOverGround","navigation.courseOverGroundTrue"];e.s(["default",0,()=>{let{targets:e}=(0,r.useAIS)({passive:!0}),u=(0,i.default)(),v=(0,n.useSignalKPaths)(m),h=(0,t.useMemo)(()=>(0,a.getCollisionThresholds)(),[]),f=(0,l.default)(),b=s.default.get("aisLengthScalingFactor")||.7;return(0,t.useMemo)(()=>{let t=v["navigation.speedOverGround"],r=v["navigation.courseOverGroundTrue"]??u.heading,n=f.giveWayTo||f.primary;if(n&&Number.isFinite(t)&&t>.3&&Number.isFinite(r)){let{target:i,role:s}=n,l={targetName:i.name,rule:s.rule,reason:s.reason},u="stand-on"===s.ownRole&&Number.isFinite(i.tcpaSeconds)&&i.tcpaSeconds<180&&Number.isFinite(i.cpaMeters)&&i.cpaMeters<.3*h.cpaMeters;if("stand-on"===s.ownRole&&!u)return{kind:"standOn",change:0,heading:r,...l};let d=Math.sign(Math.sin(Math.atan2(i.sceneX,-i.sceneZ)-r))||1,g=(({targets:e,sog:t,cog:r,scale:n,thresholds:i,preferSide:o=0})=>{let s=e.filter(e=>null!==e.distanceMeters&&null!==e.sceneX&&Number.isFinite(e.sog)&&Number.isFinite(e.cog??e.cogMagnetic)),l=(e,r=i.cpaMeters)=>s.every(o=>{let s=(0,a.closestApproach)({rx:o.sceneX/n,ry:-o.sceneZ/n,ownSog:t,ownCog:e,targetSog:o.sog,targetCog:o.cog??o.cogMagnetic});return!s||s.tcpa<=0||s.tcpa>i.tcpaSeconds||s.cpa>=r}),u=o<0?[-1,1]:[1,-1],d=(e,t)=>{for(let n=c;n<=p+1e-9;n+=c)if(l(r+e*n,t))return e*n;return null};if(0!==o)return d(u[0])??d(u[0],i.cpaMeters/2)??d(u[1]);for(let e=c;e<=p+1e-9;e+=c){if(l(r+e))return e;if(l(r-e))return-e}return null})({targets:e,sog:t,cog:r,scale:b,thresholds:h,preferSide:"both"===s.ownRole||"power"===f.ownCategory||u?1:d});return null!==g?{kind:"avoid",change:g,heading:(0,o.wrapPi)(r+g),lastMoment:u,...l}:{kind:"avoid",change:null,heading:r,lastMoment:u,noSolution:!0,...l}}let i=u.vmc;if(i&&Number.isFinite(i.current)&&Number.isFinite(u.heading)){let e=(0,o.wrapPi)(i.best.heading-u.heading),t=(i.best.vmc-i.current)*1.943844;if(t>=.15&&Math.abs(e)>=d&&Math.abs(e)<=g)return{kind:"vmg",change:e,heading:i.best.heading,gainKn:t}}return null},[e,u,v,b,h,f])}],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 n=e.change>=0?"+":"−";return t("advice.vmg",{change:`${n}${r}\xb0`,gain:e.gainKn.toFixed(1)})}],92554)},61969,e=>{"use strict";var t=e.i(71645),r=e.i(85709),n=e.i(539);let i=180/Math.PI,a=["navigation.speedThroughWater","navigation.speedOverGround","navigation.headingTrue","navigation.courseOverGroundTrue","environment.wind.speedTrue","environment.wind.angleTrueWater","environment.wind.directionTrue","performance.polarSpeed","performance.polarSpeedRatio","navigation.courseGreatCircle.nextPoint.bearingTrue"];e.s(["default",0,()=>{let e=(0,r.useSignalKPaths)(a);return(0,t.useMemo)(()=>{let t=e["navigation.speedThroughWater"]??e["navigation.speedOverGround"]??null,r=e["navigation.headingTrue"]??e["navigation.courseOverGroundTrue"]??null,a=e["environment.wind.speedTrue"]??null,o=e["environment.wind.angleTrueWater"]??null,s=e["environment.wind.directionTrue"]??null;null===s&&Number.isFinite(o)&&Number.isFinite(r)&&(s=(0,n.wrapPi)(r+o));let l=e["performance.polarSpeed"]??(Number.isFinite(a)&&Number.isFinite(o)?(0,n.polarSpeedSi)(a,o):null),u=e["performance.polarSpeedRatio"]??null;null===u&&Number.isFinite(t)&&Number.isFinite(l)&&l>.2&&(u=t/l);let d=Number.isFinite(t)&&Number.isFinite(l)?(t-l)*1.943844:null,g=null,c=null,p=!Number.isFinite(o)||Math.abs(o)<Math.PI/2;if(Number.isFinite(a)){let e=p?(0,n.optimalUpwind)(1.943844*a):(0,n.optimalDownwind)(1.943844*a);e&&(g=e.twa/i,Number.isFinite(s)&&Number.isFinite(o)&&(c=(0,n.wrapPi)(s-Math.sign(o||1)*g)))}let m=e["navigation.courseGreatCircle.nextPoint.bearingTrue"],v=null;if(Number.isFinite(m)&&Number.isFinite(s)&&Number.isFinite(a)){let e=(0,n.bestVmcHeading)({twd:s,tws:a,bearing:m}),t=Number.isFinite(r)?(0,n.vmcForHeading)({twd:s,tws:a,bearing:m,heading:r}):null;v=e?{bearing:m,best:e,current:t}:null}return{ratio:u,polarSpeed:l,boatSpeed:t,deltaKn:d,heading:r,twd:s,tws:a,twa:o,targetTwa:g,targetHeading:c,upwind:p,vmc:v}},[e])}])},74452,(e,t,r)=>{t.exports={vpp:{angles:[52,60,75,90,110,120,135,150],speeds:[6,8,10,12,14,16,20],52:[4.98,5.86,6.31,6.45,6.51,6.52,6.41],60:[5.25,6.11,6.56,6.73,6.79,6.82,6.79],75:[5.45,6.33,6.77,7.01,7.13,7.2,7.24],90:[5.66,6.55,7,7.25,7.38,7.53,7.7],110:[5.49,6.49,7.04,7.4,7.69,7.97,8.38],120:[5.32,6.36,6.97,7.39,7.77,8.1,8.6],135:[4.81,5.92,6.68,7.15,7.55,7.95,8.85],150:[4.09,5.17,6.04,6.61,6.99,7.31,7.93],beat_angle:[43.6,42,41.2,41.2,41.7,42.1,44.2],beat_vmg:[3.26,3.91,4.24,4.34,4.36,4.34,4.16],run_angle:[144.8,147.8,148.5,149.6,171.8,175.4,177.2],run_vmg:[3.54,4.48,5.23,5.73,6.17,6.67,7.36]}}},539,e=>{"use strict";var t=e.i(74452);let r=180/Math.PI,n=t.default.vpp,i=(e,t,r)=>e+(t-e)*r,a=(e,t)=>{if(t<=e[0])return[0,0];let r=e.length-1;if(t>=e[r])return[r-1,1];let n=0;for(;t>e[n+1];)n++;return[n,(t-e[n])/(e[n+1]-e[n])]},o=n.speeds.map((e,t)=>(e=>{let t=n.beat_angle[e],i=n.run_angle[e],a=n.beat_vmg[e]/Math.cos(t/r),o=n.run_vmg[e]/Math.abs(Math.cos(i/r)),s=[[0,0],[.7*t,.55*a],[t,a]];for(let r of n.angles)r>t&&r<i&&s.push([r,n[String(r)][e]]);return s.push([i,o]),i<180&&s.push([180,n.run_vmg[e]]),s})(t)),s=(e,t)=>{let[r,n]=a(e.map(e=>e[0]),t);return i(e[r][1],e[r+1][1],n)},l=(e,t)=>{if(!Number.isFinite(e)||!Number.isFinite(t)||e<=0)return null;let r=Math.min(180,Math.abs((t+540)%360-180)),l=n.speeds;if(e<l[0])return s(o[0],r)*(e/l[0]);let[u,d]=a(l,e);return i(s(o[u],r),s(o[u+1],r),d)},u=(e,t)=>{let[r,o]=a(n.speeds,t);return i(e[r],e[r+1],o)},d=(e,t)=>{let n=l(1.943844*e,t*r);return null===n?null:n/1.943844},g=e=>{let t=(e+Math.PI)%(2*Math.PI);return t<0&&(t+=2*Math.PI),t-Math.PI};e.s(["bestVmcHeading",0,({twd:e,tws:t,bearing:n})=>{if(![e,t,n].every(Number.isFinite)||t<=0)return null;let i=null;for(let a=-100;a<=100;a++){let o=n+a/r,s=d(t,g(e-o));if(null===s)continue;let l=s*Math.cos(o-n);(!i||l>i.vmc)&&(i={heading:g(o),speed:s,vmc:l})}return i},"optimalDownwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let t=u(n.run_angle,e),i=l(e,t);return{twa:t,speed:i,vmg:-i*Math.cos(t/r)}},"optimalUpwind",0,e=>{if(!Number.isFinite(e)||e<=0)return null;let t=u(n.beat_angle,e),i=l(e,t);return{twa:t,speed:i,vmg:i*Math.cos(t/r)}},"polarSpeed",0,l,"polarSpeedSi",0,d,"vmcForHeading",0,({twd:e,tws:t,bearing:r,heading:n})=>{if(![e,t,r,n].every(Number.isFinite))return null;let i=d(t,g(e-n));return null===i?null:i*Math.cos(n-r)},"wrapPi",0,g])}]);