ocearo-ui 0.1.18 → 0.1.21

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 (152) hide show
  1. package/404.html +1 -1
  2. package/README.fr.md +11 -13
  3. package/README.md +11 -13
  4. package/__next.__PAGE__.txt +4 -4
  5. package/__next._full.txt +12 -12
  6. package/__next._head.txt +4 -4
  7. package/__next._index.txt +4 -4
  8. package/__next._tree.txt +2 -2
  9. package/_next/static/chunks/009rlietvsaq2.js +1 -0
  10. package/_next/static/chunks/070stlm97b9a2.js +1 -0
  11. package/_next/static/chunks/08gn5_gd6amkq.js +1 -0
  12. package/_next/static/chunks/{1a24eba0d892e1dc.js → 0jzbiie0nzar2.js} +1 -1
  13. package/_next/static/chunks/0ri_um14-5x7u.js +1 -0
  14. package/_next/static/chunks/0utifqhyv2cuc.js +1 -0
  15. package/_next/static/chunks/0uvr7xkt_5uno.js +1 -0
  16. package/_next/static/chunks/0wzr1__so6xme.js +1 -0
  17. package/_next/static/chunks/0zjxnzbxh76mt.js +1 -0
  18. package/_next/static/chunks/11ln9lzzbo35q.js +1 -0
  19. package/_next/static/chunks/1bz0tcmhjmjgh.js +1 -0
  20. package/_next/static/chunks/1gizigk3w6q7j.js +31 -0
  21. package/_next/static/chunks/1porlo35ga4zu.js +1 -0
  22. package/_next/static/chunks/1ptwltjb3h6jf.js +4 -0
  23. package/_next/static/chunks/{c2ca71308a46ad5c.js → 1sq_733weprvs.js} +1 -1
  24. package/_next/static/chunks/1w1ua0-p5lk1e.js +38 -0
  25. package/_next/static/chunks/1wv5e5qomv-7g.css +3 -0
  26. package/_next/static/chunks/27hn45pv56pv7.js +393 -0
  27. package/_next/static/chunks/28y-j215vt42m.js +1 -0
  28. package/_next/static/chunks/29-ag86gvlc40.js +9 -0
  29. package/_next/static/chunks/2a0yjir_3mk1m.js +1 -0
  30. package/_next/static/chunks/2atijj_pkc4uc.js +2 -0
  31. package/_next/static/chunks/2baz6j1q913qw.js +1 -0
  32. package/_next/static/chunks/2ccpehidlaq88.js +1 -0
  33. package/_next/static/chunks/2lez3uww9j4t0.js +135 -0
  34. package/_next/static/chunks/2lvvt2f1l5sfu.js +1 -0
  35. package/_next/static/chunks/2nd5amcst4lhp.js +1 -0
  36. package/_next/static/chunks/2nxsyowmuwpjy.js +1 -0
  37. package/_next/static/chunks/2pwmb4pkqygy_.js +1 -0
  38. package/_next/static/chunks/2uao1hfsz-oy8.js +1 -0
  39. package/_next/static/chunks/2yghvponatk1x.js +135 -0
  40. package/_next/static/chunks/31i14-jemhnic.js +863 -0
  41. package/_next/static/chunks/{ef44382534be9f84.js → 32cbrrsp-x35l.js} +1 -1
  42. package/_next/static/chunks/36ra6xjie0dsv.js +9 -0
  43. package/_next/static/chunks/3dt63tw_9r0jt.js +38 -0
  44. package/_next/static/chunks/3jh1u-s3k0bkk.js +1 -0
  45. package/_next/static/chunks/3jupxlga7r_do.js +1 -0
  46. package/_next/static/chunks/{607b77f84fd065f0.js → 3m57lnggu30tr.js} +2 -2
  47. package/_next/static/chunks/3rhgquok36e79.js +1 -0
  48. package/_next/static/chunks/3sgrkzk20mxs6.js +54 -0
  49. package/_next/static/chunks/{149eaabf92bb073c.js → 42dfiu6iby3fq.js} +1 -1
  50. package/_next/static/chunks/43ps2cu5ahf8n.js +3 -0
  51. package/_next/static/chunks/turbopack-0pirmko-w-775.js +1 -0
  52. package/_next/static/hlKDicTyNGfd7dmHqo5m5/_clientMiddlewareManifest.js +1 -0
  53. package/_not-found/__next._full.txt +13 -11
  54. package/_not-found/__next._head.txt +4 -4
  55. package/_not-found/__next._index.txt +4 -4
  56. package/_not-found/__next._not-found.__PAGE__.txt +2 -2
  57. package/_not-found/__next._not-found.txt +4 -3
  58. package/_not-found/__next._tree.txt +2 -2
  59. package/_not-found.html +1 -1
  60. package/_not-found.txt +13 -11
  61. package/ais-preview/index.html +263 -0
  62. package/ais-preview/meshy/README.md +23 -0
  63. package/ais-preview/vessels.js +316 -0
  64. package/ais-preview/web/ATTRIBUTION.md +25 -0
  65. package/ais-preview/web/ais-30.glb +0 -0
  66. package/ais-preview/web/ais-31.glb +0 -0
  67. package/ais-preview/web/ais-35.glb +0 -0
  68. package/ais-preview/web/ais-36.glb +0 -0
  69. package/ais-preview/web/ais-37.glb +0 -0
  70. package/ais-preview/web/ais-40.glb +0 -0
  71. package/ais-preview/web/ais-50.glb +0 -0
  72. package/ais-preview/web/ais-60.glb +0 -0
  73. package/ais-preview/web/ais-70.glb +0 -0
  74. package/ais-preview/web/ais-80.glb +0 -0
  75. package/boats/ais/ais-30.glb +0 -0
  76. package/boats/ais/ais-31.glb +0 -0
  77. package/boats/ais/ais-35.glb +0 -0
  78. package/boats/ais/ais-36.glb +0 -0
  79. package/boats/ais/ais-37.glb +0 -0
  80. package/boats/ais/ais-40.glb +0 -0
  81. package/boats/ais/ais-50.glb +0 -0
  82. package/boats/ais/ais-60.glb +0 -0
  83. package/boats/ais/ais-70.glb +0 -0
  84. package/boats/ais/ais-80.glb +0 -0
  85. package/index.html +1 -1
  86. package/index.txt +12 -12
  87. package/package.json +18 -19
  88. package/settings/__next._full.txt +15 -13
  89. package/settings/__next._head.txt +4 -4
  90. package/settings/__next._index.txt +4 -4
  91. package/settings/__next._tree.txt +2 -2
  92. package/settings/__next.settings.__PAGE__.txt +4 -4
  93. package/settings/__next.settings.txt +4 -3
  94. package/settings.html +1 -1
  95. package/settings.txt +15 -13
  96. package/_next/static/chunks/045c83caa4d15373.js +0 -1
  97. package/_next/static/chunks/04cc0e5e9b2549b5.js +0 -2
  98. package/_next/static/chunks/05498d2aba8ad072.js +0 -1
  99. package/_next/static/chunks/056bb58d7d0223f4.js +0 -1
  100. package/_next/static/chunks/06e0cd4a5af05adb.js +0 -1
  101. package/_next/static/chunks/0df9a48159a5de95.js +0 -135
  102. package/_next/static/chunks/19d7af5c164315cb.js +0 -1
  103. package/_next/static/chunks/2296899bc46a0855.js +0 -1
  104. package/_next/static/chunks/2474c03b842c10ab.js +0 -38
  105. package/_next/static/chunks/290728133a3e7513.js +0 -9
  106. package/_next/static/chunks/33a3c72f455c2711.js +0 -1
  107. package/_next/static/chunks/3abe6b32c7676e49.js +0 -1
  108. package/_next/static/chunks/3b9428693f2cc0d6.js +0 -1
  109. package/_next/static/chunks/4573d1a032e56240.js +0 -1
  110. package/_next/static/chunks/46da3d80b0234973.js +0 -1
  111. package/_next/static/chunks/4974092397cafa41.js +0 -1
  112. package/_next/static/chunks/4a440e0aa6a0e7f7.js +0 -135
  113. package/_next/static/chunks/55be29098903fc19.js +0 -1
  114. package/_next/static/chunks/611f819ef2b8cd4e.js +0 -38
  115. package/_next/static/chunks/727710e55f003daf.js +0 -36
  116. package/_next/static/chunks/72c822cfe5b6f4f2.js +0 -4
  117. package/_next/static/chunks/72d89c358c0d5483.js +0 -1
  118. package/_next/static/chunks/7c60d9d425c20d52.js +0 -1
  119. package/_next/static/chunks/7d74814a0cc0f1a8.js +0 -1
  120. package/_next/static/chunks/8610c545018747f6.css +0 -3
  121. package/_next/static/chunks/8bf2a6eefe03fbc9.js +0 -1
  122. package/_next/static/chunks/a2dfb6fc5208ab9b.js +0 -1
  123. package/_next/static/chunks/a5243176ef1c1147.js +0 -3
  124. package/_next/static/chunks/a59b67714973a59e.js +0 -1
  125. package/_next/static/chunks/a6dad97d9634a72d.js.map +0 -1
  126. package/_next/static/chunks/b08b2ebeb951051c.js +0 -1
  127. package/_next/static/chunks/b9d9a7e1cf2f6019.js +0 -1
  128. package/_next/static/chunks/b9fde64db49c8fdf.js +0 -1
  129. package/_next/static/chunks/ba6e6b346e330c1c.js +0 -1
  130. package/_next/static/chunks/c4793aebac6a4506.js +0 -54
  131. package/_next/static/chunks/c5ca29b672fb8724.js +0 -1
  132. package/_next/static/chunks/ca5d1b461892da4b.js +0 -1
  133. package/_next/static/chunks/dc7a868e9a2740f1.js +0 -9
  134. package/_next/static/chunks/e63b192414a38d4f.js +0 -783
  135. package/_next/static/chunks/eae6a84b628658b8.js +0 -362
  136. package/_next/static/chunks/ed1a1adcf94d3203.js +0 -1
  137. package/_next/static/chunks/f0df051aa5b9aee8.js +0 -1
  138. package/_next/static/chunks/fe9ff98ffedd5a18.js +0 -1
  139. package/_next/static/chunks/ff5e78db2e2b69dd.js +0 -1
  140. package/_next/static/chunks/turbopack-eb3e32db84948efc.js +0 -4
  141. package/_next/static/fEaz-HJDfJbXQ22pI4nGl/_clientMiddlewareManifest.json +0 -1
  142. /package/_next/static/chunks/{c8017b80fde2edc8.js → 0abo2oxxw3hpi.js} +0 -0
  143. /package/_next/static/chunks/{a6dad97d9634a72d.js → 0cz1d0mv5g_q7.js} +0 -0
  144. /package/_next/static/chunks/{4701c1fd00af0aba.js → 0l9s4rhr00adq.js} +0 -0
  145. /package/_next/static/chunks/{ff1a16fafef87110.js → 1d4h-sglyo8ft.js} +0 -0
  146. /package/_next/static/chunks/{026b02dd01b65e37.js → 2rsdqsatgq9ta.js} +0 -0
  147. /package/_next/static/chunks/{9395de7f841f8cc6.js → 2urimbxg5bqv3.js} +0 -0
  148. /package/_next/static/chunks/{fba1dfce801bc8b9.js → 3iuz3f0429awx.js} +0 -0
  149. /package/_next/static/{fEaz-HJDfJbXQ22pI4nGl → hlKDicTyNGfd7dmHqo5m5}/_buildManifest.js +0 -0
  150. /package/_next/static/{fEaz-HJDfJbXQ22pI4nGl → hlKDicTyNGfd7dmHqo5m5}/_ssgManifest.js +0 -0
  151. /package/_next/static/media/{GeistMonoVF-s.2cee7d16.woff → GeistMonoVF-s.1lv5tp2fpjxdz.woff} +0 -0
  152. /package/_next/static/media/{GeistVF-s.4c3c0b96.woff → GeistVF-s.0e569l9b0bre8.woff} +0 -0
package/_not-found.txt CHANGED
@@ -1,14 +1,16 @@
1
1
  1:"$Sreact.fragment"
2
- 2:I[39756,["/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js"],"default"]
3
- 3:I[37457,["/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js"],"default"]
4
- 4:I[97367,["/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js"],"OutletBoundary"]
2
+ 2:I[39756,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"default"]
3
+ 3:I[37457,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"default"]
4
+ 4:I[97367,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"OutletBoundary"]
5
5
  5:"$Sreact.suspense"
6
- 7:I[97367,["/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js"],"ViewportBoundary"]
7
- 9:I[97367,["/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js"],"MetadataBoundary"]
8
- b:I[68027,["/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js"],"default"]
9
- :HL["/ocearo-ui/_next/static/chunks/8610c545018747f6.css","style"]
10
- 0:{"P":null,"b":"fEaz-HJDfJbXQ22pI4nGl","c":["","_not-found"],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/ocearo-ui/_next/static/chunks/8610c545018747f6.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":[["$","head",null,{}],["$","body",null,{"className":"geistsans_fce11f57-module__b_bU6G__variable geistmono_ed61a5f9-module__6fgesq__variable antialiased","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L7",null,{"children":"$L8"}],["$","div",null,{"hidden":true,"children":["$","$L9",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$La"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$b","$undefined"],"S":true}
11
- 8:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}],["$","meta","2",{"name":"theme-color","media":"(prefers-color-scheme: light)","content":"#4bbcd8"}],["$","meta","3",{"name":"theme-color","media":"(prefers-color-scheme: dark)","content":"#0a2e3d"}]]
12
- c:I[27201,["/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js"],"IconMark"]
6
+ 8:I[97367,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"ViewportBoundary"]
7
+ a:I[97367,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"MetadataBoundary"]
8
+ c:I[68027,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"default",1]
9
+ :HL["/ocearo-ui/_next/static/chunks/1wv5e5qomv-7g.css","style"]
10
+ 0:{"P":null,"c":["","_not-found"],"q":"","i":false,"f":[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/ocearo-ui/_next/static/chunks/1wv5e5qomv-7g.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":[["$","head",null,{"children":["$","meta",null,{"name":"description","content":"Sailing made smarter with Ocearo: touchscreen-first sailing dashboard with navigation, weather, and instrumentation."}]}],["$","body",null,{"className":"geistsans_fce11f57-module__b_bU6G__variable geistmono_ed61a5f9-module__6fgesq__variable antialiased","children":["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:notFound:0:1:props:style","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:notFound:0:1:props:children:props:children:1:props:style","children":404}],["$","div",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:style","children":["$","h2",null,{"style":"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style","children":"This page could not be found."}]}]]}]}]],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"]},null,false,null],["$","$1","h",{"children":[["$","meta",null,{"name":"robots","content":"noindex"}],["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[["$","link","0",{"rel":"stylesheet","href":"/ocearo-ui/_next/static/chunks/1wv5e5qomv-7g.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"hlKDicTyNGfd7dmHqo5m5"}
11
+ d:[]
12
+ 7:"$Wd"
13
+ 9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"}],["$","meta","2",{"name":"theme-color","content":"#4bbcd8","media":"(prefers-color-scheme: light)"}],["$","meta","3",{"name":"theme-color","content":"#0a2e3d","media":"(prefers-color-scheme: dark)"}]]
14
+ e:I[27201,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"IconMark"]
13
15
  6:null
14
- a:[["$","title","0",{"children":"Ocearo"}],["$","meta","1",{"name":"description","content":"Sailing made smarter"}],["$","link","2",{"rel":"manifest","href":"./manifest.json","crossOrigin":"$undefined"}],["$","meta","3",{"name":"format-detection","content":"telephone=no"}],["$","meta","4",{"name":"mobile-web-app-capable","content":"yes"}],["$","meta","5",{"name":"apple-mobile-web-app-title","content":"Ocearo"}],["$","meta","6",{"name":"apple-mobile-web-app-status-bar-style","content":"black-translucent"}],["$","link","7",{"rel":"shortcut icon","href":"./favicon.ico"}],["$","link","8",{"rel":"icon","href":"./favicon.ico","type":"image/x-icon"}],["$","link","9",{"rel":"icon","href":"./favicon.svg","type":"image/svg+xml","sizes":"any"}],["$","link","10",{"rel":"icon","href":"./favicon-96x96.png","type":"image/png","sizes":"96x96"}],["$","link","11",{"rel":"apple-touch-icon","href":"./apple-touch-icon.png"}],["$","$Lc","12",{}]]
16
+ b:[["$","title","0",{"children":"Ocearo"}],["$","meta","1",{"name":"description","content":"Sailing made smarter"}],["$","link","2",{"rel":"manifest","href":"./manifest.json","crossOrigin":"$undefined"}],["$","meta","3",{"name":"format-detection","content":"telephone=no"}],["$","meta","4",{"name":"mobile-web-app-capable","content":"yes"}],["$","meta","5",{"name":"apple-mobile-web-app-title","content":"Ocearo"}],["$","meta","6",{"name":"apple-mobile-web-app-status-bar-style","content":"black-translucent"}],["$","link","7",{"rel":"shortcut icon","href":"./favicon.ico"}],["$","link","8",{"rel":"icon","href":"./favicon.ico","type":"image/x-icon"}],["$","link","9",{"rel":"icon","href":"./favicon.svg","type":"image/svg+xml","sizes":"any"}],["$","link","10",{"rel":"icon","href":"./favicon-96x96.png","type":"image/png","sizes":"96x96"}],["$","link","11",{"rel":"apple-touch-icon","href":"./apple-touch-icon.png"}],["$","$Le","12",{}]]
@@ -0,0 +1,263 @@
1
+ <!doctype html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Ocearo — Validation modèles AIS low-poly</title>
7
+ <style>
8
+ :root { --bg:#0e0e0e; --panel:rgba(255,255,255,.03); --border:rgba(255,255,255,.08);
9
+ --text:#fff; --muted:rgba(255,255,255,.45); --blue:#09bfff; }
10
+ * { box-sizing:border-box; }
11
+ html,body { margin:0; background:var(--bg); color:var(--text);
12
+ font-family:Arial, Helvetica, sans-serif; }
13
+ /* The single WebGL canvas sits behind the table; each cell is rendered into via scissor */
14
+ #gl { position:fixed; inset:0; width:100vw; height:100vh; z-index:0; pointer-events:none; }
15
+ .wrap { position:relative; z-index:1; max-width:1200px; margin:0 auto; padding:24px 16px 80px; }
16
+ h1 { font-size:18px; font-weight:900; letter-spacing:.18em; text-transform:uppercase; margin:0 0 4px; }
17
+ .sub { color:var(--muted); font-size:12px; font-weight:900; letter-spacing:.12em;
18
+ text-transform:uppercase; margin-bottom:18px; }
19
+ .note { background:var(--panel); border:1px solid var(--border); border-radius:10px;
20
+ padding:12px 16px; font-size:12px; line-height:1.7; color:var(--muted); margin-bottom:22px; }
21
+ .note b { color:var(--text); }
22
+ .note code { color:var(--blue); background:rgba(9,191,255,.08); padding:1px 6px; border-radius:4px; }
23
+ table { width:100%; border-collapse:separate; border-spacing:8px; }
24
+ thead th { font-size:11px; font-weight:900; letter-spacing:.2em; text-transform:uppercase;
25
+ color:var(--muted); padding:6px 4px 10px; text-align:center; }
26
+ thead th:first-child { text-align:left; }
27
+ td.type { width:150px; vertical-align:middle; }
28
+ td.type .lab { font-size:13px; font-weight:900; text-transform:uppercase; letter-spacing:.06em; }
29
+ td.type .code { font-size:11px; font-weight:900; color:var(--blue); margin-top:4px; }
30
+ td.cell { width:auto; height:230px; padding:0; }
31
+ .vp { position:relative; height:230px; border:1px solid var(--border); border-radius:10px;
32
+ overflow:hidden; background:var(--panel); }
33
+ .vp .badge { position:absolute; left:8px; bottom:8px; z-index:2; font-size:10px; font-weight:900;
34
+ letter-spacing:.12em; text-transform:uppercase; padding:3px 8px; border-radius:5px;
35
+ border:1px solid var(--border); background:rgba(0,0,0,.35); color:var(--muted); }
36
+ .vp .badge.ok { color:#0fcd4f; border-color:rgba(15,205,79,.3); }
37
+ .vp .badge.proc { color:var(--blue); border-color:rgba(9,191,255,.3); }
38
+ .vp .badge.miss { color:#ffbe00; border-color:rgba(255,190,0,.3); }
39
+ .vp .badge.err { color:#cc4444; border-color:rgba(204,68,68,.3); }
40
+ .legend { margin-top:20px; color:var(--muted); font-size:11px; letter-spacing:.08em; }
41
+ </style>
42
+ </head>
43
+ <body>
44
+ <canvas id="gl"></canvas>
45
+ <div class="wrap">
46
+ <h1>Validation des modèles AIS low-poly</h1>
47
+ <div class="sub">11 types de navire · 3 sources · tourne-disque automatique</div>
48
+
49
+ <div class="note">
50
+ <b>But :</b> comparer, par type AIS, le modèle <b>actuellement</b> affiché dans l'app,
51
+ celui <b>généré par Meshy</b>, et la version <b>procédurale</b> générée en code.<br>
52
+ <b>Meshy :</b> dépose les <code>.glb</code> générés dans <code>public/ais-preview/meshy/</code>
53
+ nommés <code>ais-20.glb</code>, <code>ais-30.glb</code>, … (voir le <code>README</code> du dossier).
54
+ Tant qu'absents, la colonne affiche « à générer ».<br>
55
+ <b>Pour servir la page :</b> depuis la racine du projet <code>npx serve public</code> puis ouvrir
56
+ <code>/ais-preview/</code> (ou après <code>npm run build</code>, via <code>out/</code>).
57
+ </div>
58
+
59
+ <table id="grid">
60
+ <thead>
61
+ <tr>
62
+ <th>Type AIS</th>
63
+ <th>Actuellement</th>
64
+ <th>Flotte blanche (web)</th>
65
+ <th>Généré par Meshy</th>
66
+ <th>Procédural (moi)</th>
67
+ </tr>
68
+ </thead>
69
+ <tbody id="rows"></tbody>
70
+ </table>
71
+
72
+ <div class="legend">Astuce : chaque vignette tourne automatiquement pour inspecter la silhouette sous tous les angles.</div>
73
+ </div>
74
+
75
+ <script type="importmap">
76
+ {
77
+ "imports": {
78
+ "three": "https://unpkg.com/three@0.185.0/build/three.module.js",
79
+ "three/addons/": "https://unpkg.com/three@0.185.0/examples/jsm/"
80
+ }
81
+ }
82
+ </script>
83
+
84
+ <script type="module">
85
+ import * as THREE from 'three';
86
+ import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
87
+ import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';
88
+ import { AIS_TYPES, createVessel } from './vessels.js';
89
+
90
+ // ── Renderer (single context, scissored per cell) ────────────────────────────
91
+ const canvas = document.getElementById('gl');
92
+ const renderer = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: true });
93
+ renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
94
+ renderer.setSize(window.innerWidth, window.innerHeight, false);
95
+ renderer.outputColorSpace = THREE.SRGBColorSpace;
96
+
97
+ // ── GLTF loader with local DRACO decoders (../draco served from public/) ──────
98
+ const draco = new DRACOLoader().setDecoderPath('../draco/');
99
+ const gltfLoader = new GLTFLoader().setDRACOLoader(draco);
100
+
101
+ const glbCache = new Map(); // url -> Promise<Object3D>
102
+ function loadGLB(url) {
103
+ if (!glbCache.has(url)) {
104
+ glbCache.set(url, new Promise((resolve, reject) => {
105
+ gltfLoader.load(url, (g) => resolve(g.scene), undefined, reject);
106
+ }));
107
+ }
108
+ return glbCache.get(url).then((scene) => scene.clone(true));
109
+ }
110
+
111
+ // ── A "view" = one table cell with its own scene + camera ────────────────────
112
+ const views = [];
113
+ const FIT = 6; // normalize each model so its largest dimension == FIT
114
+ const CAM_DIST = 9.2;
115
+
116
+ function makeScene() {
117
+ const scene = new THREE.Scene();
118
+ const hemi = new THREE.HemisphereLight(0xffffff, 0x223044, 1.05);
119
+ scene.add(hemi);
120
+ const dir = new THREE.DirectionalLight(0xffffff, 1.5);
121
+ dir.position.set(5, 8, 6);
122
+ scene.add(dir);
123
+ const dir2 = new THREE.DirectionalLight(0x88bbff, 0.5);
124
+ dir2.position.set(-6, 3, -4);
125
+ scene.add(dir2);
126
+ return scene;
127
+ }
128
+
129
+ function normalize(obj) {
130
+ const bbox = new THREE.Box3().setFromObject(obj);
131
+ const size = new THREE.Vector3(); bbox.getSize(size);
132
+ const center = new THREE.Vector3(); bbox.getCenter(center);
133
+ const maxDim = Math.max(size.x, size.y, size.z) || 1;
134
+ obj.position.set(-center.x, -center.y, -center.z);
135
+ const wrap = new THREE.Group();
136
+ wrap.add(obj);
137
+ wrap.scale.setScalar(FIT / maxDim);
138
+ return wrap;
139
+ }
140
+
141
+ function setBadge(view, text, cls) {
142
+ view.badge.textContent = text;
143
+ view.badge.className = 'badge ' + cls;
144
+ }
145
+
146
+ function attach(view, object3d) {
147
+ const wrap = normalize(object3d);
148
+ view.obj = wrap;
149
+ view.scene.add(wrap);
150
+ }
151
+
152
+ // Force a uniform white material on every mesh so downloaded models (whatever
153
+ // their original texture/colour) match the white low-poly style of the app "ship".
154
+ const WHITE_MAT = new THREE.MeshStandardMaterial({ color: 0xeef2f5, roughness: 0.75, metalness: 0.1 });
155
+ function whiteize(object3d) {
156
+ object3d.traverse((o) => { if (o.isMesh) o.material = WHITE_MAT; });
157
+ return object3d;
158
+ }
159
+
160
+ function makeCell(td) {
161
+ const vp = document.createElement('div');
162
+ vp.className = 'vp';
163
+ const badge = document.createElement('div');
164
+ badge.className = 'badge';
165
+ badge.textContent = '…';
166
+ vp.appendChild(badge);
167
+ td.appendChild(vp);
168
+
169
+ const scene = makeScene();
170
+ const camera = new THREE.PerspectiveCamera(40, 1, 0.1, 100);
171
+ camera.position.set(CAM_DIST * 0.58, CAM_DIST * 0.46, CAM_DIST * 0.75);
172
+ camera.lookAt(0, 0, 0);
173
+
174
+ const view = { el: vp, badge, scene, camera, obj: null };
175
+ views.push(view);
176
+ return view;
177
+ }
178
+
179
+ // License of each downloaded web model (Poly Pizza). Codes without an entry have no file.
180
+ const WEB_LICENSE = { 30:'perso', 31:'CC-BY', 35:'CC-BY', 36:'perso', 37:'CC-BY', 40:'CC-BY', 50:'CC-BY', 60:'CC-BY', 70:'CC-BY', 80:'CC-BY' };
181
+
182
+ // ── Build the table ──────────────────────────────────────────────────────────
183
+ const rowsEl = document.getElementById('rows');
184
+
185
+ for (const t of AIS_TYPES) {
186
+ const tr = document.createElement('tr');
187
+
188
+ const typeTd = document.createElement('td');
189
+ typeTd.className = 'type';
190
+ typeTd.innerHTML = `<div class="lab">${t.labelFr}</div><div class="code">AIS ${t.range}</div>`;
191
+ tr.appendChild(typeTd);
192
+
193
+ // 1) Current model used by the app today
194
+ const curTd = document.createElement('td'); curTd.className = 'cell';
195
+ const curView = makeCell(curTd);
196
+ tr.appendChild(curTd);
197
+ loadGLB(`../boats/${t.current}/assets/scene-transformed.glb`)
198
+ .then((obj) => { attach(curView, obj); setBadge(curView, t.current, 'ok'); })
199
+ .catch(() => setBadge(curView, 'indisponible', 'err'));
200
+
201
+ // 1b) Free downloaded model (Poly Pizza, CC0/CC-BY)
202
+ const webTd = document.createElement('td'); webTd.className = 'cell';
203
+ const webView = makeCell(webTd);
204
+ tr.appendChild(webTd);
205
+ loadGLB(`./web/ais-${t.code}.glb`)
206
+ .then((obj) => { attach(webView, whiteize(obj)); setBadge(webView, WEB_LICENSE[t.code] || 'web', 'ok'); })
207
+ .catch(() => setBadge(webView, 'indisponible', 'err'));
208
+
209
+ // 2) Meshy-generated model (may not exist yet)
210
+ const meshyTd = document.createElement('td'); meshyTd.className = 'cell';
211
+ const meshyView = makeCell(meshyTd);
212
+ tr.appendChild(meshyTd);
213
+ loadGLB(`./meshy/ais-${t.code}.glb`)
214
+ .then((obj) => { attach(meshyView, obj); setBadge(meshyView, 'meshy', 'ok'); })
215
+ .catch(() => setBadge(meshyView, 'à générer', 'miss'));
216
+
217
+ // 3) Procedural model (built in code)
218
+ const procTd = document.createElement('td'); procTd.className = 'cell';
219
+ const procView = makeCell(procTd);
220
+ tr.appendChild(procTd);
221
+ try { attach(procView, createVessel(t.key)); setBadge(procView, 'procédural', 'proc'); }
222
+ catch (e) { setBadge(procView, 'erreur', 'err'); console.error(e); }
223
+
224
+ rowsEl.appendChild(tr);
225
+ }
226
+
227
+ // ── Render loop (scissor each visible cell) ──────────────────────────────────
228
+ let angle = 0;
229
+ let last = performance.now();
230
+
231
+ function resize() {
232
+ renderer.setSize(window.innerWidth, window.innerHeight, false);
233
+ }
234
+ window.addEventListener('resize', resize);
235
+
236
+ function render(now) {
237
+ requestAnimationFrame(render);
238
+ const dt = Math.min((now - last) / 1000, 0.1); last = now;
239
+ angle += dt * 0.6;
240
+
241
+ const H = renderer.domElement.clientHeight;
242
+ renderer.setScissorTest(false);
243
+ renderer.clear();
244
+ renderer.setScissorTest(true);
245
+
246
+ for (const v of views) {
247
+ const r = v.el.getBoundingClientRect();
248
+ if (r.bottom < 0 || r.top > window.innerHeight || r.width === 0) continue;
249
+ const w = r.width, h = r.height;
250
+ const left = r.left;
251
+ const bottom = window.innerHeight - r.bottom;
252
+ renderer.setViewport(left, bottom, w, h);
253
+ renderer.setScissor(left, bottom, w, h);
254
+ v.camera.aspect = w / h;
255
+ v.camera.updateProjectionMatrix();
256
+ if (v.obj) v.obj.rotation.y = angle;
257
+ renderer.render(v.scene, v.camera);
258
+ }
259
+ }
260
+ requestAnimationFrame(render);
261
+ </script>
262
+ </body>
263
+ </html>
@@ -0,0 +1,23 @@
1
+ # Modèles AIS générés par Meshy
2
+
3
+ Déposez ici les `.glb` générés par Meshy, nommés par code AIS :
4
+
5
+ ```
6
+ ais-20.glb WIG (effet de sol)
7
+ ais-30.glb Pêche
8
+ ais-31.glb Remorqueur
9
+ ais-35.glb Militaire
10
+ ais-36.glb Voilier
11
+ ais-37.glb Plaisance
12
+ ais-40.glb Navire rapide (HSC)
13
+ ais-50.glb Pilote / spécial
14
+ ais-60.glb Passagers
15
+ ais-70.glb Cargo
16
+ ais-80.glb Pétrolier (tanker)
17
+ ```
18
+
19
+ Le script `models/ais/generate.sh` peut écrire directement ici via la variable
20
+ `OUTDIR` (par défaut il pointe sur ce dossier).
21
+
22
+ La page `../index.html` les charge automatiquement ; un type sans fichier
23
+ affiche « à générer ».