@sailingrotevista/rotevista-dash 2.0.18 → 2.0.19

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 (3) hide show
  1. package/index.html +12 -0
  2. package/package.json +1 -1
  3. package/style.css +68 -65
package/index.html CHANGED
@@ -123,10 +123,22 @@
123
123
  <g id="ticks"></g>
124
124
 
125
125
  <g id="tick-labels" fill="#bbb" text-anchor="middle" dominant-baseline="hanging" font-family="Arial" font-weight="bold">
126
+ <!-- Etichette Principali -->
126
127
  <text font-size="16" transform="translate(200, 65)">0</text>
127
128
  <text font-size="16" transform="translate(335, 200) rotate(90)">90</text>
128
129
  <text font-size="16" transform="translate(65, 200) rotate(-90)">90</text>
129
130
  <text font-size="16" transform="translate(200, 335) rotate(180)">180</text>
131
+
132
+ <!-- Etichette Intermedie (30-150 Gradi) -->
133
+ <text font-size="11" transform="translate(267.5, 83) rotate(30)">30</text>
134
+ <text font-size="11" transform="translate(317, 132.5) rotate(60)">60</text>
135
+ <text font-size="11" transform="translate(317, 267.5) rotate(120)">120</text>
136
+ <text font-size="11" transform="translate(267.5, 317) rotate(150)">150</text>
137
+
138
+ <text font-size="11" transform="translate(132.5, 83) rotate(-30)">30</text>
139
+ <text font-size="11" transform="translate(83, 132.5) rotate(-60)">60</text>
140
+ <text font-size="11" transform="translate(83, 267.5) rotate(-120)">120</text>
141
+ <text font-size="11" transform="translate(132.5, 317) rotate(-150)">150</text>
130
142
  </g>
131
143
 
132
144
  <g id="track-pointer" transform="rotate(0, 200, 200)">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sailingrotevista/rotevista-dash",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Public Wind Dashboard with navigation and course aids",
5
5
  "main": "index.js",
6
6
  "publishConfig": {
package/style.css CHANGED
@@ -10,7 +10,6 @@ body {
10
10
  height: 100vh;
11
11
  width: 100vw;
12
12
  overflow: hidden;
13
- /* BLOCCO TOTALE GESTI DI SISTEMA: Fondamentale per il Long Press su mobile */
14
13
  -webkit-touch-callout: none;
15
14
  -webkit-user-select: none;
16
15
  user-select: none;
@@ -23,11 +22,8 @@ body {
23
22
  height: 100%;
24
23
  padding: 5px;
25
24
  box-sizing: border-box;
26
- gap: 8px; /* Spazio costante tra tutti i blocchi della dashboard */
27
-
28
- /* LAYOUT LIQUIDO:
29
- I lati hanno un minimo vitale (180px) per proteggere i testi.
30
- Il centro (auto) si adatta millimetricamente al diametro dell'SVG. */
25
+ gap: 8px;
26
+ /* Rapporto Standard: Lati 1fr, Centro 1.5fr (Bilanciato) */
31
27
  grid-template-columns: minmax(180px, 1fr) minmax(auto, 1.5fr) minmax(180px, 1fr);
32
28
  grid-template-rows: 100%;
33
29
  transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
@@ -35,7 +31,7 @@ body {
35
31
  }
36
32
 
37
33
  /* ==========================================================================
38
- 2. PANNELLI E DATA-BOX (DISTRIBUZIONE FR)
34
+ 2. PANNELLI E DATA-BOX
39
35
  ========================================================================== */
40
36
  .side-panel {
41
37
  display: flex;
@@ -48,10 +44,9 @@ body {
48
44
  }
49
45
 
50
46
  .left-panel { grid-column: 1; }
51
-
52
47
  .center-panel {
53
48
  grid-column: 2;
54
- position: relative; /* Indispensabile per posizionare #status al suo interno */
49
+ position: relative;
55
50
  display: flex;
56
51
  flex-direction: column;
57
52
  align-items: center;
@@ -59,7 +54,6 @@ body {
59
54
  height: 100%;
60
55
  overflow: hidden;
61
56
  }
62
-
63
57
  .right-panel {
64
58
  grid-column: 3;
65
59
  align-items: flex-end;
@@ -69,68 +63,83 @@ body {
69
63
  .data-box {
70
64
  position: relative;
71
65
  border-bottom: 1px solid #222;
72
- padding: 2px 4px; /* Padding ottimizzato per il recupero spazio verticale */
66
+ padding: 2px 4px;
73
67
  display: flex;
74
68
  flex-direction: column;
75
69
  width: 100%;
76
70
  box-sizing: border-box;
77
- container-type: size; /* Per unità cqh */
78
- flex: 1 1 0px; /* Divide lo spazio equamente in 5 parti */
71
+ container-type: size;
72
+ flex: 1 1 0px;
79
73
  min-height: 0;
80
74
  overflow: hidden;
75
+ transition: background-color 0.2s ease;
81
76
  }
82
77
 
83
- /* Allineamento Speculare: SX a sinistra, DX a destra del box */
84
78
  .left-panel .data-box { align-items: flex-start; text-align: left; }
85
79
  .right-panel .data-box { align-items: flex-end; text-align: right; }
86
80
 
87
81
  /* ==========================================================================
88
- 3. TACTICAL FOCUS MODE (AUTO-EXPANDING SPLIT / DUAL SCREEN)
82
+ 3. TACTICAL FOCUS MODE (DUAL SCREEN 60/40)
89
83
  ========================================================================== */
90
84
 
91
- /* Nasconde le colonne non focalizzate */
85
+ /* Nasconde i pannelli non attivi */
92
86
  .focus-active .side-panel:not(.has-focus) { display: none !important; }
93
87
 
94
- /* In Focus Mode Left: [Pannello Sinistro Largo | Centro Stretto] */
88
+ /* Split 60/40: Grafico a Sinistra */
95
89
  .focus-active.focus-side-left {
96
- grid-template-columns: 2fr auto !important;
90
+ grid-template-columns: 3fr 2fr !important;
97
91
  }
98
92
  .focus-active.focus-side-left .side-panel.has-focus { grid-column: 1 !important; }
99
- .focus-active.focus-side-left .center-panel { grid-column: 2 !important; justify-content: flex-start; }
93
+ .focus-active.focus-side-left .center-panel {
94
+ grid-column: 2 !important;
95
+ justify-content: center !important;
96
+ align-items: center !important;
97
+ }
100
98
 
101
- /* In Focus Mode Right: [Centro Stretto | Pannello Destro Largo] */
99
+ /* Split 60/40: Grafico a Destra */
102
100
  .focus-active.focus-side-right {
103
- grid-template-columns: auto 2fr !important;
101
+ grid-template-columns: 2fr 3fr !important;
102
+ }
103
+ .focus-active.focus-side-right .center-panel {
104
+ grid-column: 1 !important;
105
+ justify-content: center !important;
106
+ align-items: center !important;
104
107
  }
105
- .focus-active.focus-side-right .center-panel { grid-column: 1 !important; justify-content: flex-start; }
106
108
  .focus-active.focus-side-right .side-panel.has-focus { grid-column: 2 !important; }
107
109
 
108
- /* Styling del box in Focus Mode */
110
+ /* Espansione Box Focalizzato */
109
111
  .focus-active .has-focus .data-box:not(.is-focused) { display: none !important; }
110
112
  .focus-active .has-focus .data-box.is-focused {
111
113
  height: 100vh !important;
112
114
  border: none;
113
115
  background: rgba(255, 255, 255, 0.05);
114
- padding: 20px;
116
+ padding: 2vw 3vw !important;
117
+ display: flex;
118
+ flex-direction: column;
115
119
  }
116
120
 
117
- /* Tipografia massiccia in Focus Mode */
118
- .focus-active .is-focused .value { font-size: clamp(4rem, 25cqh, 4rem) !important; margin-top: 15px; }
119
- .focus-active .is-focused .scale-labels { font-size: 32px !important; min-width: 40px !important; line-height: 1.2; }
121
+ /* Tipografia Massiccia Focus Mode */
122
+ .focus-active .is-focused .value { font-size: clamp(4rem, 25cqh, 10rem) !important; margin-top: 15px; }
123
+ .focus-active .is-focused .scale-labels { font-size: clamp(14px, 1.8vw, 22px) !important; min-width: 50px !important; }
120
124
  .focus-active .is-focused .label-row .label { font-size: 2rem !important; }
121
125
  .focus-active .is-focused .label-row .unit { font-size: 2rem !important; }
122
126
 
123
- .focus-active .is-focused .sparkline path { stroke-width: 1px !important; }
127
+ .focus-active .is-focused .sparkline path { stroke-width: 2.5px !important; }
128
+
129
+ /* Protezione Wind Gauge nel 40% di spazio */
130
+ .focus-active .center-panel svg#wind-gauge {
131
+ max-width: 95% !important;
132
+ max-height: 85vh !important;
133
+ }
124
134
 
125
135
  /* ==========================================================================
126
- 4. TIPOGRAFIA DINAMICA (ELASTICA CQH)
136
+ 4. TIPOGRAFIA DINAMICA E ELASTICA
127
137
  ========================================================================== */
128
138
  .label-row { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 2px; width: 100%; }
129
139
 
130
140
  .label { color: #666; font-size: 0.65rem; font-weight: bold; text-transform: uppercase; }
131
141
  .unit { color: #888; font-size: 0.6rem; font-weight: bold; }
132
142
 
133
- /* Numero standard (22% altezza box) */
134
143
  .value {
135
144
  color: #fff;
136
145
  font-size: clamp(1.2rem, 22cqh, 3rem);
@@ -143,14 +152,13 @@ body {
143
152
  .value-large, .dual-value-container, .value-with-compass { margin-top: auto; margin-bottom: auto; }
144
153
  .value-large { font-size: clamp(1.5rem, 35cqh, 4.5rem); line-height: 0.85; }
145
154
 
146
- /* TACK Layout (Mure opposte) */
147
155
  .dual-value-container { display: flex; justify-content: space-between; width: 100%; }
148
156
  .dual-value-col { display: flex; flex-direction: column; width: 48%; }
149
157
  .dual-label { color: #666; font-size: 0.55rem; font-weight: bold; text-transform: uppercase; margin-bottom: 2px; }
150
158
  .value.dual-val { font-size: clamp(1rem, 22cqh, 2rem); padding-bottom: 0; line-height: 0.9; }
151
159
 
152
160
  /* ==========================================================================
153
- 5. BUSSOLA TWD DINAMICA (WIDGET)
161
+ 5. WIDGETS (BUSSOLA TWD)
154
162
  ========================================================================== */
155
163
  .value-with-compass { display: flex; justify-content: space-between; align-items: center; width: 100%; gap: 5px; }
156
164
 
@@ -167,7 +175,7 @@ body {
167
175
  }
168
176
 
169
177
  /* ==========================================================================
170
- 6. GRAFICI E SCALE (OTTIMIZZAZIONE ORIZZONTALE)
178
+ 6. GRAFICI E SCALE
171
179
  ========================================================================== */
172
180
  .graph-wrapper {
173
181
  position: relative; width: 100%; flex-grow: 1; min-height: 0; margin-top: 4px;
@@ -175,7 +183,6 @@ body {
175
183
  border-radius: 4px; gap: 0px !important;
176
184
  }
177
185
 
178
- /* Allargamento verso il centro */
179
186
  .left-panel .graph-wrapper { margin-right: -6px; }
180
187
  .right-panel .graph-wrapper { margin-left: -6px; }
181
188
 
@@ -188,20 +195,18 @@ body {
188
195
  height: 100%; line-height: 1; padding: 0; border: none !important;
189
196
  }
190
197
 
191
- /* Simmetria scale */
192
198
  .left-panel .scale-labels { order: 2; text-align: left; padding-left: 4px; }
193
199
  .left-panel .sparkline { order: 1; }
194
200
  .right-panel .scale-labels { order: 1; text-align: right; padding-right: 4px; }
195
201
  .right-panel .sparkline { order: 2; }
196
202
 
197
- /* Colori grafici */
198
203
  #stw-graph { stroke: #2ecc71; fill: rgba(46, 204, 113, 0.12); }
199
204
  #sog-graph { stroke: #f39c12; fill: rgba(243, 156, 18, 0.12); }
200
205
  #depth-graph { stroke: #3498db; fill: rgba(52, 152, 219, 0.12); }
201
206
  #tws-graph { stroke: #ffffff; fill: rgba(255, 255, 255, 0.08); }
202
207
 
203
208
  /* ==========================================================================
204
- 7. HERCULES MODE (ZOOM E VISUALS)
209
+ 7. HERCULES MODE
205
210
  ========================================================================== */
206
211
  .line-hercules { filter: drop-shadow(0 0 5px #ff0000); stroke-width: 1.8px !important; }
207
212
  .box-hercules { background: rgba(255, 0, 0, 0.08) !important; }
@@ -215,20 +220,14 @@ body {
215
220
  .right-panel .box-hercules .label:only-child::after { content: " HERCULES"; }
216
221
 
217
222
  /* ==========================================================================
218
- 8. STATI, STATUS E ANIMAZIONI
223
+ 8. STATUS E ANIMAZIONI
219
224
  ========================================================================== */
220
225
  #status {
221
- position: absolute;
222
- top: 10px;
223
- right: 10px;
224
- font-size: 0.6rem;
225
- font-weight: 900;
226
- text-transform: uppercase;
227
- z-index: 1000;
228
- letter-spacing: 1px;
229
- background: rgba(0,0,0,0.4);
230
- padding: 2px 6px;
231
- border-radius: 4px;
226
+ position: absolute; top: 10px; right: 10px;
227
+ font-size: 0.6rem; font-weight: 900;
228
+ text-transform: uppercase; z-index: 1000;
229
+ letter-spacing: 1px; background: rgba(0,0,0,0.4);
230
+ padding: 2px 6px; border-radius: 4px;
232
231
  }
233
232
  .online { color: #2ecc71; opacity: 0.5; }
234
233
  .offline { color: #e74c3c; font-weight: bold; }
@@ -245,11 +244,11 @@ body {
245
244
  #wind-gauge { width: 100%; height: 100%; max-height: 100%; object-fit: contain; }
246
245
 
247
246
  /* ==========================================================================
248
- 9. RESPONSIVE (PORTRAIT MODE)
247
+ 9. RESPONSIVE (PORTRAIT)
249
248
  ========================================================================== */
250
249
  @media (max-aspect-ratio: 0.9 / 1) {
251
250
  .main-container { grid-template-columns: 1fr 1fr !important; grid-template-rows: 45vh calc(55vh - 8px) !important; }
252
- .center-panel { grid-row: 1 !important; grid-column: 1 / span 2 !important; padding: 5px 0; }
251
+ .center-panel { grid-row: 1 !important; grid-column: 1 / span 2 !important; }
253
252
  .left-panel { grid-row: 2 !important; grid-column: 1 !important; }
254
253
  .right-panel { grid-row: 2 !important; grid-column: 2 !important; }
255
254
  .main-container.focus-active { display: flex !important; flex-direction: column !important; }
@@ -259,7 +258,7 @@ body {
259
258
  }
260
259
 
261
260
  /* ==========================================================================
262
- 10. NIGHT MODE (RED ON BLACK - TACTICAL)
261
+ 10. NIGHT MODE (TACTICAL RED)
263
262
  ========================================================================== */
264
263
  body.night-mode { background-color: #000 !important; color: #ff0000 !important; }
265
264
  .night-mode .side-panel { background: rgba(20, 0, 0, 0.4); border: 1px solid #330000; }
@@ -274,19 +273,30 @@ body.night-mode { background-color: #000 !important; color: #ff0000 !important;
274
273
  .night-mode #tws-graph line:not([stroke*="rgba"]) { stroke: #ff3333 !important; stroke-width: 1.8px !important; }
275
274
  .night-mode .scale-labels { color: #660000 !important; }
276
275
 
277
- .night-mode .box-hercules { background: rgba(60, 0, 0, 0.2) !important; }
278
- .night-mode .line-hercules { filter: drop-shadow(0 0 6px #ff0000) !important; }
279
-
280
276
  .night-mode #wind-gauge circle { stroke: #330000; }
281
277
  .night-mode #ticks line { stroke: #4d0000 !important; }
282
278
  .night-mode #tick-labels { fill: #800000 !important; }
283
279
  .night-mode #boat-icon { fill: #330000 !important; opacity: 0.6; }
284
280
  .night-mode #aws-val-svg { fill: #ff3333 !important; }
281
+ .night-mode #aws-display-group text { fill: #ff3333 !important; }
282
+ .night-mode #center-glow feDropShadow { flood-color: #ff0000 !important; flood-opacity: 0.6 !important; }
283
+
284
+ /* Settori Vento Night */
285
+ .night-mode #wind-gauge path[stroke="#ff0000"] { stroke: #660000 !important; opacity: 0.8; }
286
+ .night-mode #wind-gauge path[stroke="#00ff00"] { stroke: #660000 !important; stroke-dasharray: 4, 3; opacity: 0.8; }
287
+ .night-mode #wind-gauge path[stroke="#ff8800"] { stroke: #330000 !important; stroke-width: 8; }
288
+
289
+ /* Lancette Night */
285
290
  .night-mode #awa-pointer path { fill: #ff0000; stroke: #000; }
286
291
  .night-mode #twa-pointer path { fill: #800000; stroke: #000; }
287
292
  .night-mode #track-pointer path { fill: #ff0000; stroke: #fff; stroke-width: 0.5; }
288
- .night-mode #aws-display-group text { fill: #ff3333 !important; }
289
- .night-mode #center-glow feDropShadow { flood-color: #ff0000 !important; flood-opacity: 0.6 !important; }
293
+
294
+ /* Leeway Night */
295
+ .night-mode rect[fill="url(#leeway-grad)"] { fill: url(#leeway-night-grad) !important; }
296
+ .night-mode #leeway-val { fill: #ff3333 !important; }
297
+ .night-mode g[stroke="#555"] line { stroke: #4d0000 !important; }
298
+ .night-mode g[fill="#555"] text { fill: #660000 !important; }
299
+ .night-mode rect[fill="#222"] { fill: #0a0000 !important; stroke: #200000; }
290
300
 
291
301
  /* Bussola TWD Night */
292
302
  .night-mode .mini-compass { border-color: #330000; background: #000; }
@@ -304,11 +314,4 @@ body.night-mode { background-color: #000 !important; color: #ff0000 !important;
304
314
  transition: opacity 0.3s ease;
305
315
  }
306
316
 
307
- .is-trending { animation: blink-trend 1s infinite !important; }
308
-
309
- /* Allarme Strambata: Rosso fisso con bagliore neon */
310
- .is-gybing {
311
- opacity: 1 !important;
312
- animation: none !important;
313
- filter: drop-shadow(0 0 8px #ff0000) !important;
314
- }
317
+ .is-trending { a