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
@@ -0,0 +1,316 @@
1
+ // Procedural low-poly AIS vessel models (three.js).
2
+ // One builder per AIS ship-type category. Built at ~real scale (length ~8-12 units,
3
+ // bow toward +Z, up +Y, beam along X). The preview page normalizes scale/centering.
4
+ //
5
+ // This module is intentionally framework-agnostic (plain three.js) so it can later
6
+ // be reused inside the app to replace the per-vessel GLTF models.
7
+
8
+ import * as THREE from 'three';
9
+
10
+ // ── The 11 AIS categories we model ───────────────────────────────────────────
11
+ // `current` = the model the app renders today for this type (via determineBoatType),
12
+ // `meshy` = expected filename under ./meshy/<id>.glb
13
+ export const AIS_TYPES = [
14
+ { key: 'wig', code: 20, range: '20–29', labelFr: 'WIG (effet de sol)', current: 'ship' },
15
+ { key: 'fishing', code: 30, range: '30', labelFr: 'Pêche', current: 'optimist' },
16
+ { key: 'tug', code: 31, range: '31–32', labelFr: 'Remorqueur', current: 'ship' },
17
+ { key: 'military', code: 35, range: '35', labelFr: 'Militaire', current: 'ship' },
18
+ { key: 'sailing', code: 36, range: '36', labelFr: 'Voilier', current: 'sailboat' },
19
+ { key: 'pleasure', code: 37, range: '37', labelFr: 'Plaisance', current: 'ship' },
20
+ { key: 'hsc', code: 40, range: '40–49', labelFr: 'Navire rapide (HSC)', current: 'ship' },
21
+ { key: 'pilot', code: 50, range: '50–59', labelFr: 'Pilote / spécial', current: 'ship' },
22
+ { key: 'passenger', code: 60, range: '60–69', labelFr: 'Passagers', current: 'ship' },
23
+ { key: 'cargo', code: 70, range: '70–79', labelFr: 'Cargo', current: 'ship' },
24
+ { key: 'tanker', code: 80, range: '80–89', labelFr: 'Pétrolier (tanker)', current: 'ship' },
25
+ ];
26
+
27
+ // ── Materials (low-poly: flat shading) ───────────────────────────────────────
28
+ const M = {
29
+ hull: () => new THREE.MeshStandardMaterial({ color: 0xeef2f5, flatShading: true, roughness: 0.85, metalness: 0.05 }),
30
+ hullRed:() => new THREE.MeshStandardMaterial({ color: 0x8a1f1f, flatShading: true, roughness: 0.85 }),
31
+ hullDk: () => new THREE.MeshStandardMaterial({ color: 0x2b3138, flatShading: true, roughness: 0.9 }),
32
+ hullGrey:()=> new THREE.MeshStandardMaterial({ color: 0x8d99a4, flatShading: true, roughness: 0.8 }),
33
+ deck: () => new THREE.MeshStandardMaterial({ color: 0x9fb0bd, flatShading: true, roughness: 0.95 }),
34
+ cabin: () => new THREE.MeshStandardMaterial({ color: 0xe2e9ee, flatShading: true, roughness: 0.7 }),
35
+ glass: () => new THREE.MeshStandardMaterial({ color: 0x0a2a33, emissive: 0x09bfff, emissiveIntensity: 0.4, flatShading: true, roughness: 0.4 }),
36
+ dark: () => new THREE.MeshStandardMaterial({ color: 0x394049, flatShading: true, roughness: 0.85 }),
37
+ red: () => new THREE.MeshStandardMaterial({ color: 0xcc1414, flatShading: true, roughness: 0.7 }),
38
+ orange: () => new THREE.MeshStandardMaterial({ color: 0xff7a18, flatShading: true, roughness: 0.7 }),
39
+ sail: () => new THREE.MeshStandardMaterial({ color: 0xf4f6f8, flatShading: true, roughness: 1, side: THREE.DoubleSide }),
40
+ steel: () => new THREE.MeshStandardMaterial({ color: 0xb9c2cb, flatShading: true, roughness: 0.6, metalness: 0.3 }),
41
+ };
42
+
43
+ // ── Primitive helpers ────────────────────────────────────────────────────────
44
+ function box(w, h, d, mat, x = 0, y = 0, z = 0) {
45
+ const m = new THREE.Mesh(new THREE.BoxGeometry(w, h, d), mat);
46
+ m.position.set(x, y, z);
47
+ return m;
48
+ }
49
+ function cyl(rt, rb, h, seg, mat, x = 0, y = 0, z = 0) {
50
+ const m = new THREE.Mesh(new THREE.CylinderGeometry(rt, rb, h, seg), mat);
51
+ m.position.set(x, y, z);
52
+ return m;
53
+ }
54
+ function sphere(r, mat, x = 0, y = 0, z = 0) {
55
+ const m = new THREE.Mesh(new THREE.SphereGeometry(r, 8, 6), mat);
56
+ m.position.set(x, y, z);
57
+ return m;
58
+ }
59
+
60
+ // Low-poly hull: rectangular body + faceted (4-sided) cone bow. Returns a group
61
+ // whose deck top sits at y = depth/2.
62
+ function hull(len, beam, depth, mat) {
63
+ const g = new THREE.Group();
64
+ const bodyLen = len * 0.70;
65
+ g.add(box(beam, depth, bodyLen, mat, 0, 0, -len * 0.05));
66
+
67
+ const bow = new THREE.Mesh(new THREE.ConeGeometry(beam * 0.54, len * 0.34, 4), mat);
68
+ bow.rotation.set(Math.PI / 2, 0, Math.PI / 4); // apex toward +Z, flat bottom
69
+ bow.scale.y = depth / (beam * 1.08); // flatten vertically to hull depth
70
+ bow.position.set(0, 0, len * 0.5 - len * 0.17);
71
+ g.add(bow);
72
+
73
+ // Slight keel/bottom wedge for a less boxy underside
74
+ const keel = box(beam * 0.5, depth * 0.5, bodyLen * 0.9, mat, 0, -depth * 0.55, -len * 0.05);
75
+ g.add(keel);
76
+ return g;
77
+ }
78
+
79
+ // ── Per-type builders ────────────────────────────────────────────────────────
80
+ function buildCargo() {
81
+ const g = new THREE.Group();
82
+ const L = 11, B = 3, D = 1.5;
83
+ g.add(hull(L, B, D, M.hull()));
84
+ const deck = D / 2;
85
+ // aft bridge block near stern
86
+ g.add(box(B * 0.8, 1.3, 1.6, M.cabin(), 0, deck + 0.65, -L * 0.36));
87
+ g.add(box(B * 0.55, 0.5, 1.0, M.glass(), 0, deck + 1.0, -L * 0.36));
88
+ // funnel
89
+ g.add(cyl(0.22, 0.26, 0.9, 8, M.dark(), 0, deck + 1.6, -L * 0.40));
90
+ // cargo hatches
91
+ for (let i = 0; i < 3; i++) {
92
+ g.add(box(B * 0.7, 0.35, 1.5, M.dark(), 0, deck + 0.18, L * 0.18 - i * 1.9));
93
+ }
94
+ // two masts/cranes
95
+ g.add(cyl(0.07, 0.07, 1.6, 6, M.steel(), B * 0.2, deck + 0.8, L * 0.05));
96
+ g.add(box(1.2, 0.08, 0.08, M.steel(), B * 0.2 + 0.4, deck + 1.4, L * 0.05));
97
+ return g;
98
+ }
99
+
100
+ function buildTanker() {
101
+ const g = new THREE.Group();
102
+ const L = 12, B = 3.2, D = 1.5;
103
+ g.add(hull(L, B, D, M.hull()));
104
+ const deck = D / 2;
105
+ // stern superstructure
106
+ g.add(box(B * 0.85, 1.5, 1.4, M.cabin(), 0, deck + 0.75, -L * 0.38));
107
+ g.add(box(B * 0.6, 0.45, 0.9, M.glass(), 0, deck + 1.15, -L * 0.38));
108
+ g.add(cyl(0.22, 0.26, 0.9, 8, M.red(), 0, deck + 1.7, -L * 0.42));
109
+ // cylindrical deck tanks / domes
110
+ for (let i = 0; i < 4; i++) {
111
+ g.add(cyl(0.5, 0.5, 0.55, 10, M.steel(), 0, deck + 0.28, L * 0.22 - i * 1.5));
112
+ }
113
+ // central pipeline
114
+ g.add(cyl(0.09, 0.09, L * 0.62, 6, M.dark(), 0, deck + 0.55, L * 0.02).rotateX(Math.PI / 2));
115
+ return g;
116
+ }
117
+
118
+ function buildPassenger() {
119
+ const g = new THREE.Group();
120
+ const L = 11, B = 3, D = 1.4;
121
+ g.add(hull(L, B, D, M.hull()));
122
+ const deck = D / 2;
123
+ // stacked decks (decreasing)
124
+ g.add(box(B * 0.92, 0.7, L * 0.72, M.cabin(), 0, deck + 0.35, 0));
125
+ g.add(box(B * 0.78, 0.6, L * 0.6, M.cabin(), 0, deck + 0.95, -0.2));
126
+ g.add(box(B * 0.6, 0.5, L * 0.45, M.cabin(), 0, deck + 1.45, -0.3));
127
+ // bridge
128
+ g.add(box(B * 0.5, 0.35, 0.7, M.glass(), 0, deck + 1.85, L * 0.12));
129
+ // window rows (glow)
130
+ for (let d = 0; d < 2; d++) {
131
+ g.add(box(B * 0.93, 0.12, L * 0.7, M.glass(), 0, deck + 0.4 + d * 0.6, 0));
132
+ }
133
+ // funnel + lifeboats
134
+ g.add(cyl(0.25, 0.3, 0.8, 10, M.red(), 0, deck + 2.1, -L * 0.18));
135
+ for (const s of [-1, 1]) {
136
+ g.add(box(0.6, 0.22, 0.3, M.orange(), s * B * 0.5, deck + 0.55, L * 0.1));
137
+ g.add(box(0.6, 0.22, 0.3, M.orange(), s * B * 0.5, deck + 0.55, -L * 0.1));
138
+ }
139
+ return g;
140
+ }
141
+
142
+ function buildFishing() {
143
+ const g = new THREE.Group();
144
+ const L = 8, B = 2.5, D = 1.4;
145
+ g.add(hull(L, B, D, M.hull()));
146
+ const deck = D / 2;
147
+ // forward cabin
148
+ g.add(box(B * 0.75, 1.0, 1.6, M.cabin(), 0, deck + 0.5, L * 0.22));
149
+ g.add(box(B * 0.6, 0.4, 0.5, M.glass(), 0, deck + 0.85, L * 0.30));
150
+ // mast + boom (net crane)
151
+ g.add(cyl(0.06, 0.06, 2.2, 6, M.steel(), 0, deck + 1.1, L * 0.1));
152
+ g.add(box(0.06, 0.06, 2.4, M.steel(), 0, deck + 1.9, -L * 0.05).rotateX(0.5));
153
+ // net reel (horizontal cylinder) aft
154
+ g.add(cyl(0.35, 0.35, B * 0.7, 10, M.dark(), 0, deck + 0.35, -L * 0.32).rotateZ(Math.PI / 2));
155
+ return g;
156
+ }
157
+
158
+ function buildSailing() {
159
+ const g = new THREE.Group();
160
+ const L = 9, B = 2.1, D = 1.3;
161
+ g.add(hull(L, B, D, M.hull()));
162
+ const deck = D / 2;
163
+ // low cabin
164
+ g.add(box(B * 0.6, 0.45, 2.2, M.cabin(), 0, deck + 0.22, L * 0.02));
165
+ g.add(box(B * 0.5, 0.18, 1.2, M.glass(), 0, deck + 0.4, L * 0.05));
166
+ // mast
167
+ const mastH = 7;
168
+ g.add(cyl(0.07, 0.09, mastH, 6, M.steel(), 0, deck + mastH / 2, L * 0.05));
169
+ // boom
170
+ g.add(box(0.06, 0.06, 3.4, M.steel(), 0, deck + 0.8, -L * 0.1));
171
+ // triangular mainsail (between mast and boom)
172
+ const sailShape = new THREE.Shape();
173
+ sailShape.moveTo(0, 0); sailShape.lineTo(0, mastH * 0.82); sailShape.lineTo(-3.2, 0); sailShape.closePath();
174
+ const sail = new THREE.Mesh(new THREE.ShapeGeometry(sailShape), M.sail());
175
+ sail.position.set(0, deck + 0.2, L * 0.05);
176
+ sail.rotation.y = Math.PI / 2;
177
+ g.add(sail);
178
+ // jib (small foresail)
179
+ const jib = new THREE.Shape();
180
+ jib.moveTo(0, 0); jib.lineTo(0, mastH * 0.6); jib.lineTo(2.4, 0); jib.closePath();
181
+ const jibM = new THREE.Mesh(new THREE.ShapeGeometry(jib), M.sail());
182
+ jibM.position.set(0, deck + 0.2, L * 0.05);
183
+ jibM.rotation.y = Math.PI / 2;
184
+ g.add(jibM);
185
+ // keel
186
+ g.add(box(0.18, 1.4, 1.6, M.dark(), 0, -1.0, -L * 0.02));
187
+ return g;
188
+ }
189
+
190
+ function buildPleasure() {
191
+ const g = new THREE.Group();
192
+ const L = 9, B = 2.6, D = 1.3;
193
+ g.add(hull(L, B, D, M.hull()));
194
+ const deck = D / 2;
195
+ // streamlined raised cabin
196
+ g.add(box(B * 0.8, 0.6, 3.2, M.cabin(), 0, deck + 0.3, L * 0.05));
197
+ g.add(box(B * 0.7, 0.4, 2.4, M.glass(), 0, deck + 0.55, L * 0.1));
198
+ // flybridge
199
+ g.add(box(B * 0.5, 0.35, 1.2, M.cabin(), 0, deck + 0.9, L * 0.0));
200
+ g.add(cyl(0.04, 0.04, 0.9, 6, M.steel(), 0, deck + 1.5, L * 0.0)); // antenna
201
+ // swim platform aft
202
+ g.add(box(B * 0.85, 0.12, 0.8, M.deck(), 0, deck - 0.1, -L * 0.46));
203
+ return g;
204
+ }
205
+
206
+ function buildHSC() {
207
+ const g = new THREE.Group();
208
+ const L = 10, B = 3.2, D = 1.0;
209
+ // catamaran-style twin hulls
210
+ for (const s of [-1, 1]) {
211
+ const h = hull(L, B * 0.34, D, M.hull());
212
+ h.position.x = s * B * 0.3;
213
+ g.add(h);
214
+ }
215
+ const deck = D / 2;
216
+ // connecting deck
217
+ g.add(box(B * 0.95, 0.25, L * 0.7, M.deck(), 0, deck, 0));
218
+ // sleek superstructure
219
+ g.add(box(B * 0.8, 0.6, L * 0.55, M.cabin(), 0, deck + 0.45, -L * 0.02));
220
+ g.add(box(B * 0.7, 0.35, L * 0.4, M.glass(), 0, deck + 0.6, L * 0.05));
221
+ // raked mast
222
+ g.add(box(0.08, 0.08, 1.6, M.steel(), 0, deck + 1.1, -L * 0.05).rotateX(-0.4));
223
+ return g;
224
+ }
225
+
226
+ function buildTug() {
227
+ const g = new THREE.Group();
228
+ const L = 7, B = 3, D = 1.6;
229
+ g.add(hull(L, B, D, M.hullDk()));
230
+ const deck = D / 2;
231
+ // tall wheelhouse forward-center
232
+ g.add(box(B * 0.7, 1.4, 1.8, M.red(), 0, deck + 0.7, L * 0.12));
233
+ g.add(box(B * 0.55, 0.5, 0.9, M.glass(), 0, deck + 1.2, L * 0.18));
234
+ // funnel
235
+ g.add(cyl(0.22, 0.26, 0.7, 8, M.dark(), 0, deck + 1.7, -L * 0.05));
236
+ // fenders along the bow
237
+ for (let i = 0; i < 4; i++) {
238
+ g.add(sphere(0.22, M.dark(), 0, deck - 0.1, L * 0.45 - i * 0.5));
239
+ }
240
+ // towing winch aft
241
+ g.add(cyl(0.3, 0.3, B * 0.5, 8, M.steel(), 0, deck + 0.25, -L * 0.32).rotateZ(Math.PI / 2));
242
+ return g;
243
+ }
244
+
245
+ function buildMilitary() {
246
+ const g = new THREE.Group();
247
+ const L = 11, B = 2.6, D = 1.4;
248
+ g.add(hull(L, B, D, M.hullGrey()));
249
+ const deck = D / 2;
250
+ // angular stealth superstructure (tapered stack)
251
+ g.add(box(B * 0.7, 0.7, 3.0, M.hullGrey(), 0, deck + 0.35, L * 0.0));
252
+ const tower = box(B * 0.45, 1.0, 1.2, M.hullGrey(), 0, deck + 1.0, L * 0.05);
253
+ tower.rotation.x = 0.06;
254
+ g.add(tower);
255
+ // pyramidal mast
256
+ g.add(cyl(0.02, 0.18, 1.4, 4, M.dark(), 0, deck + 1.9, L * 0.05));
257
+ // forward gun
258
+ g.add(box(0.5, 0.35, 0.6, M.hullGrey(), 0, deck + 0.25, L * 0.34));
259
+ g.add(cyl(0.05, 0.05, 1.2, 6, M.dark(), 0, deck + 0.35, L * 0.42).rotateX(Math.PI / 2));
260
+ return g;
261
+ }
262
+
263
+ function buildPilot() {
264
+ const g = new THREE.Group();
265
+ const L = 8, B = 2.6, D = 1.4;
266
+ g.add(hull(L, B, D, M.hull()));
267
+ const deck = D / 2;
268
+ // bright pilot hull band
269
+ g.add(box(B + 0.02, 0.3, L * 0.7, M.orange(), 0, deck - 0.05, -L * 0.05));
270
+ // central cabin with windows all round
271
+ g.add(box(B * 0.7, 1.0, 2.4, M.cabin(), 0, deck + 0.5, 0));
272
+ g.add(box(B * 0.72, 0.4, 1.8, M.glass(), 0, deck + 0.7, 0));
273
+ // radar dome on roof + mast
274
+ g.add(sphere(0.3, M.cabin(), 0, deck + 1.25, -0.2));
275
+ g.add(cyl(0.05, 0.05, 1.0, 6, M.steel(), 0, deck + 1.4, 0.4));
276
+ return g;
277
+ }
278
+
279
+ function buildWig() {
280
+ const g = new THREE.Group();
281
+ const L = 10, B = 1.6;
282
+ // aircraft-like fuselage (capsule)
283
+ const fus = cyl(0.6, 0.6, L * 0.7, 10, M.hull());
284
+ fus.rotation.x = Math.PI / 2;
285
+ g.add(fus);
286
+ // nose cone
287
+ const nose = new THREE.Mesh(new THREE.ConeGeometry(0.6, L * 0.22, 10), M.hull());
288
+ nose.rotation.x = Math.PI / 2;
289
+ nose.position.z = L * 0.45;
290
+ g.add(nose);
291
+ // cockpit glass
292
+ g.add(box(0.7, 0.4, 1.6, M.glass(), 0, 0.45, L * 0.22));
293
+ // short wings
294
+ for (const s of [-1, 1]) {
295
+ g.add(box(L * 0.42, 0.12, 1.6, M.steel(), s * (L * 0.28), -0.1, -L * 0.05));
296
+ g.add(cyl(0.18, 0.18, 0.5, 8, M.dark(), s * (L * 0.34), 0.0, -L * 0.05)); // engine pod
297
+ }
298
+ // tail fin + stabilizers
299
+ g.add(box(0.1, 1.4, 1.2, M.steel(), 0, 0.7, -L * 0.4));
300
+ g.add(box(2.4, 0.1, 0.8, M.steel(), 0, 0.9, -L * 0.44));
301
+ return g;
302
+ }
303
+
304
+ const BUILDERS = {
305
+ wig: buildWig, fishing: buildFishing, tug: buildTug, military: buildMilitary,
306
+ sailing: buildSailing, pleasure: buildPleasure, hsc: buildHSC, pilot: buildPilot,
307
+ passenger: buildPassenger, cargo: buildCargo, tanker: buildTanker,
308
+ };
309
+
310
+ export function createVessel(key) {
311
+ const build = BUILDERS[key];
312
+ if (!build) return new THREE.Group();
313
+ const g = build();
314
+ g.traverse((o) => { if (o.isMesh) { o.castShadow = false; o.receiveShadow = false; } });
315
+ return g;
316
+ }
@@ -0,0 +1,25 @@
1
+ # Attribution — flotte blanche AIS (public/ais-preview/web/)
2
+
3
+ Tous les modèles sont rendus avec un matériau blanc uniforme (style du `ship` de l'app).
4
+ Les `.glb` issus de modèles texturés ont été convertis **géométrie seule** (textures retirées).
5
+
6
+ - **CC0** : domaine public, aucune attribution requise.
7
+ - **CC-BY** : redistribuable **avec** attribution (conserver les crédits ci-dessous).
8
+ - **perso** : modèle déjà présent dans `models/` (fourni par toi, source d'origine inconnue — à vérifier avant redistribution publique).
9
+
10
+ | Type AIS | Fichier | Modèle / source | Auteur | Licence |
11
+ |---|---|---|---|---|
12
+ | ais-30 (pêche) | ais-30.glb | `models/ship` (perso) | — (à vérifier) | perso |
13
+ | ais-31 (remorqueur) | ais-31.glb | Poly Pizza « TugBoat » | Some Random Person | CC-BY |
14
+ | ais-35 (militaire) | ais-35.glb | Poly Pizza (m/aYAmfkUYZjg) | — (à vérifier) | CC-BY |
15
+ | ais-36 (voilier) | ais-36.glb | `models/sailboat` (perso) | — (à vérifier) | perso |
16
+ | ais-37 (plaisance) | ais-37.glb | Poly Pizza « Yacht » | Alex Safayan | CC-BY |
17
+ | ais-40 (HSC) | ais-40.glb | Poly Pizza « Military Boat » (réutilisé en vedette) | Zsky | CC-BY |
18
+ | ais-50 (pilote) | ais-50.glb | Poly Pizza « Boat » (m/84-DYhLzxNq) | Poly by Google | CC-BY |
19
+ | ais-60 (passagers) | ais-60.glb | Poly Pizza « Cruise ship » | Poly by Google | CC-BY |
20
+ | ais-70 (cargo) | ais-70.glb | Poly Pizza « Container Ship » | Alex Safayan | CC-BY |
21
+ | ais-80 (tanker) | ais-80.glb | `models/cargo` « Low Poly Cargo Ship » (Sketchfab) | Javier_Fernandez | CC-BY |
22
+
23
+ ## Crédits CC-BY-4.0 à conserver
24
+ - « Low Poly Cargo Ship » par Javier_Fernandez — https://sketchfab.com/3d-models/low-poly-cargo-ship-4c22cbaf01c1427f8ab60b3a07b1b32c
25
+ - « TugBoat », « Military Boat », « Yacht », « Cruise ship », « Container Ship » — via https://poly.pizza (voir la page de chaque modèle pour le crédit complet).
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/index.html CHANGED
@@ -1 +1 @@
1
- <!DOCTYPE html><!--fEaz_HJDfJbXQ22pI4nGl--><html lang="en"><head><meta charSet="utf-8"/><link rel="preconnect" href="/" crossorigin=""/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/><link rel="stylesheet" href="/ocearo-ui/_next/static/chunks/8610c545018747f6.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/ocearo-ui/_next/static/chunks/ed1a1adcf94d3203.js"/><script src="/ocearo-ui/_next/static/chunks/72c822cfe5b6f4f2.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/04cc0e5e9b2549b5.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/045c83caa4d15373.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/turbopack-eb3e32db84948efc.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/b9fde64db49c8fdf.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/8bf2a6eefe03fbc9.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/f0df051aa5b9aee8.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/727710e55f003daf.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/a59b67714973a59e.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/7c60d9d425c20d52.js" async=""></script><meta name="next-size-adjust" content=""/><meta name="theme-color" media="(prefers-color-scheme: light)" content="#4bbcd8"/><meta name="theme-color" media="(prefers-color-scheme: dark)" content="#0a2e3d"/><title>Ocearo</title><meta name="description" content="Sailing made smarter"/><link rel="manifest" href="./manifest.json"/><meta name="format-detection" content="telephone=no"/><meta name="mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-title" content="Ocearo"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><link rel="shortcut icon" href="./favicon.ico"/><link rel="icon" href="./favicon.ico" type="image/x-icon"/><link rel="icon" href="./favicon.svg" type="image/svg+xml" sizes="any"/><link rel="icon" href="./favicon-96x96.png" type="image/png" sizes="96x96"/><link rel="apple-touch-icon" href="./apple-touch-icon.png"/><script src="/ocearo-ui/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geistsans_fce11f57-module__b_bU6G__variable geistmono_ed61a5f9-module__6fgesq__variable antialiased"><div hidden=""><!--$--><!--/$--></div><div class="h-[100dvh] bg-hud-bg flex items-center justify-center"><div class="animate-pulse text-hud-main">Loading...</div></div><!--$--><!--/$--><script src="/ocearo-ui/_next/static/chunks/ed1a1adcf94d3203.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js\",\"/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js\"],\"default\"]\n3:I[37457,[\"/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js\",\"/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js\"],\"default\"]\n4:I[47257,[\"/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js\",\"/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js\"],\"ClientPageRoot\"]\n5:I[81694,[\"/ocearo-ui/_next/static/chunks/b9fde64db49c8fdf.js\",\"/ocearo-ui/_next/static/chunks/8bf2a6eefe03fbc9.js\",\"/ocearo-ui/_next/static/chunks/f0df051aa5b9aee8.js\",\"/ocearo-ui/_next/static/chunks/727710e55f003daf.js\",\"/ocearo-ui/_next/static/chunks/a59b67714973a59e.js\",\"/ocearo-ui/_next/static/chunks/7c60d9d425c20d52.js\"],\"default\"]\n8:I[97367,[\"/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js\",\"/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js\"],\"OutletBoundary\"]\n9:\"$Sreact.suspense\"\nb:I[97367,[\"/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js\",\"/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js\"],\"ViewportBoundary\"]\nd:I[97367,[\"/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js\",\"/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js\"],\"MetadataBoundary\"]\nf:I[68027,[\"/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js\",\"/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js\"],\"default\"]\n:HL[\"/ocearo-ui/_next/static/chunks/8610c545018747f6.css\",\"style\"]\n:HC[\"/\",\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"fEaz-HJDfJbXQ22pI4nGl\",\"c\":[\"\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"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\"}]],[\"$\",\"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\":[[\"$\",\"$L4\",null,{\"Component\":\"$5\",\"serverProvidedParams\":{\"searchParams\":{},\"params\":{},\"promises\":[\"$@6\",\"$@7\"]}}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/ocearo-ui/_next/static/chunks/b9fde64db49c8fdf.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/ocearo-ui/_next/static/chunks/8bf2a6eefe03fbc9.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/ocearo-ui/_next/static/chunks/f0df051aa5b9aee8.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/ocearo-ui/_next/static/chunks/727710e55f003daf.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-4\",{\"src\":\"/ocearo-ui/_next/static/chunks/a59b67714973a59e.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-5\",{\"src\":\"/ocearo-ui/_next/static/chunks/7c60d9d425c20d52.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@a\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"6:{}\n7:\"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params\"\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"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\"}]]\n"])</script><script>self.__next_f.push([1,"10:I[27201,[\"/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js\",\"/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js\"],\"IconMark\"]\na:null\ne:[[\"$\",\"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\"}],[\"$\",\"$L10\",\"12\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><link rel="preconnect" href="/" crossorigin=""/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/><link rel="stylesheet" href="/ocearo-ui/_next/static/chunks/1wv5e5qomv-7g.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/ocearo-ui/_next/static/chunks/1gizigk3w6q7j.js"/><script src="/ocearo-ui/_next/static/chunks/2lvvt2f1l5sfu.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/3jh1u-s3k0bkk.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/2atijj_pkc4uc.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/1ptwltjb3h6jf.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/turbopack-0pirmko-w-775.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/2baz6j1q913qw.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/009rlietvsaq2.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/08gn5_gd6amkq.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/0wzr1__so6xme.js" async=""></script><script src="/ocearo-ui/_next/static/chunks/1bz0tcmhjmjgh.js" async=""></script><meta name="next-size-adjust" content=""/><meta name="description" content="Sailing made smarter with Ocearo: touchscreen-first sailing dashboard with navigation, weather, and instrumentation."/><meta name="theme-color" content="#4bbcd8" media="(prefers-color-scheme: light)"/><meta name="theme-color" content="#0a2e3d" media="(prefers-color-scheme: dark)"/><title>Ocearo</title><meta name="description" content="Sailing made smarter"/><link rel="manifest" href="./manifest.json"/><meta name="format-detection" content="telephone=no"/><meta name="mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-title" content="Ocearo"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><link rel="shortcut icon" href="./favicon.ico"/><link rel="icon" href="./favicon.ico" type="image/x-icon"/><link rel="icon" href="./favicon.svg" type="image/svg+xml" sizes="any"/><link rel="icon" href="./favicon-96x96.png" type="image/png" sizes="96x96"/><link rel="apple-touch-icon" href="./apple-touch-icon.png"/><script src="/ocearo-ui/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body class="geistsans_fce11f57-module__b_bU6G__variable geistmono_ed61a5f9-module__6fgesq__variable antialiased"><div hidden=""><!--$--><!--/$--></div><div class="h-[100dvh] bg-hud-bg flex items-center justify-center"><div class="animate-pulse text-hud-main">Loading...</div></div><!--$--><!--/$--><script src="/ocearo-ui/_next/static/chunks/1gizigk3w6q7j.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js\",\"/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js\"],\"default\"]\n3:I[37457,[\"/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js\",\"/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js\"],\"default\"]\n4:I[47257,[\"/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js\",\"/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js\"],\"ClientPageRoot\"]\n5:I[81694,[\"/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js\",\"/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js\",\"/ocearo-ui/_next/static/chunks/2baz6j1q913qw.js\",\"/ocearo-ui/_next/static/chunks/009rlietvsaq2.js\",\"/ocearo-ui/_next/static/chunks/08gn5_gd6amkq.js\",\"/ocearo-ui/_next/static/chunks/0wzr1__so6xme.js\",\"/ocearo-ui/_next/static/chunks/1bz0tcmhjmjgh.js\"],\"default\"]\n8:I[97367,[\"/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js\",\"/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js\"],\"OutletBoundary\"]\n9:\"$Sreact.suspense\"\nb:I[97367,[\"/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js\",\"/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js\"],\"ViewportBoundary\"]\nd:I[97367,[\"/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js\",\"/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js\"],\"MetadataBoundary\"]\nf:I[68027,[\"/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js\",\"/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js\"],\"default\",1]\n:HL[\"/ocearo-ui/_next/static/chunks/1wv5e5qomv-7g.css\",\"style\"]\n:HC[\"/\",\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"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\":[[\"$\",\"$L4\",null,{\"Component\":\"$5\",\"serverProvidedParams\":{\"searchParams\":{},\"params\":{},\"promises\":[\"$@6\",\"$@7\"]}}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/ocearo-ui/_next/static/chunks/2baz6j1q913qw.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/ocearo-ui/_next/static/chunks/009rlietvsaq2.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/ocearo-ui/_next/static/chunks/08gn5_gd6amkq.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/ocearo-ui/_next/static/chunks/0wzr1__so6xme.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-4\",{\"src\":\"/ocearo-ui/_next/static/chunks/1bz0tcmhjmjgh.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@a\"}]}]]}],{},null,false,null]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[[\"$\",\"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\"}\n"])</script><script>self.__next_f.push([1,"6:{}\n7:\"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params\"\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"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)\"}]]\n"])</script><script>self.__next_f.push([1,"10:I[27201,[\"/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js\",\"/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js\"],\"IconMark\"]\na:null\ne:[[\"$\",\"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\"}],[\"$\",\"$L10\",\"12\",{}]]\n"])</script></body></html>
package/index.txt CHANGED
@@ -1,19 +1,19 @@
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[47257,["/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js"],"ClientPageRoot"]
5
- 5:I[81694,["/ocearo-ui/_next/static/chunks/b9fde64db49c8fdf.js","/ocearo-ui/_next/static/chunks/8bf2a6eefe03fbc9.js","/ocearo-ui/_next/static/chunks/f0df051aa5b9aee8.js","/ocearo-ui/_next/static/chunks/727710e55f003daf.js","/ocearo-ui/_next/static/chunks/a59b67714973a59e.js","/ocearo-ui/_next/static/chunks/7c60d9d425c20d52.js"],"default"]
6
- 8: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[47257,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"ClientPageRoot"]
5
+ 5:I[81694,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js","/ocearo-ui/_next/static/chunks/2baz6j1q913qw.js","/ocearo-ui/_next/static/chunks/009rlietvsaq2.js","/ocearo-ui/_next/static/chunks/08gn5_gd6amkq.js","/ocearo-ui/_next/static/chunks/0wzr1__so6xme.js","/ocearo-ui/_next/static/chunks/1bz0tcmhjmjgh.js"],"default"]
6
+ 8:I[97367,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"OutletBoundary"]
7
7
  9:"$Sreact.suspense"
8
- b:I[97367,["/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js"],"ViewportBoundary"]
9
- d:I[97367,["/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js"],"MetadataBoundary"]
10
- f:I[68027,["/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js"],"default"]
11
- :HL["/ocearo-ui/_next/static/chunks/8610c545018747f6.css","style"]
8
+ b:I[97367,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"ViewportBoundary"]
9
+ d:I[97367,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"MetadataBoundary"]
10
+ f:I[68027,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"default",1]
11
+ :HL["/ocearo-ui/_next/static/chunks/1wv5e5qomv-7g.css","style"]
12
12
  :HC["/",""]
13
- 0:{"P":null,"b":"fEaz-HJDfJbXQ22pI4nGl","c":["",""],"q":"","i":false,"f":[[["",{"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"}]],["$","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":[["$","$L4",null,{"Component":"$5","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@6","$@7"]}}],[["$","script","script-0",{"src":"/ocearo-ui/_next/static/chunks/b9fde64db49c8fdf.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/ocearo-ui/_next/static/chunks/8bf2a6eefe03fbc9.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/ocearo-ui/_next/static/chunks/f0df051aa5b9aee8.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/ocearo-ui/_next/static/chunks/727710e55f003daf.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/ocearo-ui/_next/static/chunks/a59b67714973a59e.js","async":true,"nonce":"$undefined"}],["$","script","script-5",{"src":"/ocearo-ui/_next/static/chunks/7c60d9d425c20d52.js","async":true,"nonce":"$undefined"}]],["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$Lc"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$Le"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$f",[]],"S":true}
13
+ 0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"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":[["$","$L4",null,{"Component":"$5","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@6","$@7"]}}],[["$","script","script-0",{"src":"/ocearo-ui/_next/static/chunks/2baz6j1q913qw.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/ocearo-ui/_next/static/chunks/009rlietvsaq2.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/ocearo-ui/_next/static/chunks/08gn5_gd6amkq.js","async":true,"nonce":"$undefined"}],["$","script","script-3",{"src":"/ocearo-ui/_next/static/chunks/0wzr1__so6xme.js","async":true,"nonce":"$undefined"}],["$","script","script-4",{"src":"/ocearo-ui/_next/static/chunks/1bz0tcmhjmjgh.js","async":true,"nonce":"$undefined"}]],["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,null]},null,false,null],["$","$1","h",{"children":[null,["$","$Lb",null,{"children":"$Lc"}],["$","div",null,{"hidden":true,"children":["$","$Ld",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$Le"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$f",[["$","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"}
14
14
  6:{}
15
15
  7:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params"
16
- c:[["$","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"}]]
17
- 10:I[27201,["/ocearo-ui/_next/static/chunks/ff1a16fafef87110.js","/ocearo-ui/_next/static/chunks/a2dfb6fc5208ab9b.js"],"IconMark"]
16
+ c:[["$","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)"}]]
17
+ 10:I[27201,["/ocearo-ui/_next/static/chunks/1d4h-sglyo8ft.js","/ocearo-ui/_next/static/chunks/3jupxlga7r_do.js"],"IconMark"]
18
18
  a:null
19
19
  e:[["$","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"}],["$","$L10","12",{}]]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ocearo-ui",
3
- "version": "0.1.18",
3
+ "version": "0.1.21",
4
4
  "private": false,
5
5
  "description": "Ocean Robot UI: 3D visualization dashboard for signalk",
6
6
  "license": "Apache-2.0",
@@ -17,35 +17,34 @@
17
17
  "dev": "next dev",
18
18
  "build": "next build",
19
19
  "start": "next start",
20
- "lint": "next lint",
20
+ "lint": "eslint .",
21
21
  "link": "ln -s $PWD/out $HOME/.signalk/node_modules/ocearo-ui"
22
22
  },
23
23
  "dependencies": {
24
- "@fortawesome/free-solid-svg-icons": "^7.1.0",
25
- "@fortawesome/react-fontawesome": "^3.1.1",
24
+ "@fortawesome/free-solid-svg-icons": "^7.3.0",
25
+ "@fortawesome/react-fontawesome": "^3.3.1",
26
26
  "@react-three/drei": "^10.7.7",
27
- "@react-three/fiber": "^9.4.2",
27
+ "@react-three/fiber": "^9.6.1",
28
28
  "@signalk/client": "^2.4.0",
29
- "@tailwindcss/postcss": "^4.1.18",
29
+ "@tailwindcss/postcss": "^4.3.1",
30
30
  "@use-gesture/react": "^10.3.1",
31
- "framer-motion": "^12.23.26",
32
- "i18next": "^25.8.4",
31
+ "framer-motion": "^12.42.0",
32
+ "i18next": "^26.3.3",
33
33
  "i18next-browser-languagedetector": "^8.2.0",
34
- "next": "^16.1.6",
35
- "postcss": "^8.5.6",
36
- "react": "^19",
37
- "react-dom": "^19",
38
- "react-i18next": "^16.5.4",
39
- "recharts": "^3.6.0",
40
- "three": "^0.182.0"
34
+ "next": "^16.2.9",
35
+ "postcss": "^8.5.16",
36
+ "react": "^19.2.7",
37
+ "react-dom": "^19.2.7",
38
+ "react-i18next": "^17.0.8",
39
+ "recharts": "^3.9.0",
40
+ "three": "^0.185.0"
41
41
  },
42
42
  "devDependencies": {
43
- "eslint": "^9.0.0",
44
- "eslint-config-next": "16.1.6",
45
- "tailwindcss": "^4.1.18"
43
+ "eslint": "^9.39.4",
44
+ "eslint-config-next": "^16.2.9",
45
+ "tailwindcss": "^4.3.1"
46
46
  },
47
47
  "overrides": {
48
- "ajv": "^8.18.0",
49
48
  "minimatch": "^10.2.1",
50
49
  "glob": "^11.0.0",
51
50
  "rimraf": "^6.0.0",