@sailingrotevista/rotevista-dash 3.0.6 → 4.0.2

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 (5) hide show
  1. package/app.js +449 -340
  2. package/index.js +71 -59
  3. package/package.json +1 -1
  4. package/settings.json +15 -9
  5. package/style.css +86 -57
package/index.js CHANGED
@@ -1,8 +1,16 @@
1
+ /**
2
+ * ==========================================================================
3
+ * Rotevista Dash Configuration Plugin
4
+ * ==========================================================================
5
+ * Definisce l'interfaccia di configurazione in Signal K Admin.
6
+ * Le descrizioni sono ottimizzate per riflettere l'utilizzo tattico e strategico.
7
+ */
8
+
1
9
  module.exports = function (app) {
2
10
  const plugin = {};
3
11
  plugin.id = 'rotevista-dash';
4
12
  plugin.name = 'Rotevista Dash Configuration';
5
- plugin.description = 'Configure boat-specific parameters for the Dashboard';
13
+ plugin.description = 'Configure boat-specific tactical and safety parameters for the Dashboard';
6
14
 
7
15
  plugin.start = function (options) { };
8
16
  plugin.stop = function () { };
@@ -11,128 +19,132 @@ module.exports = function (app) {
11
19
  type: 'object',
12
20
  title: 'Rotevista Dashboard Settings',
13
21
  properties: {
22
+ // --- SEZIONE ALLARMI PROFONDITÀ ---
14
23
  alarms: {
15
24
  type: 'object',
16
- title: 'Depth Alarms (meters)',
17
- description: "Configure safety thresholds for depth monitoring.",
25
+ title: 'Depth Safety Alarms',
26
+ description: "Configure safety thresholds for depth monitoring based on your boat's draft.",
18
27
  properties: {
19
28
  depthDanger: {
20
29
  type: 'number',
21
- title: 'Danger Threshold (Red + Sound)',
22
- description: "Critical depth level. When depth is below this value, the display turns red and an audible alarm is triggered.",
30
+ title: 'Emergency Depth (Red + Sound)',
31
+ description: "Critical depth level. Below this limit, the display turns RED and the audible 'Bing-Bing' alarm starts.",
23
32
  default: 2.5
24
33
  },
25
34
  depthWarning: {
26
35
  type: 'number',
27
- title: 'Warning Threshold (Yellow)',
28
- description: "Shallow water margin. When depth is below this value, the display turns yellow as a safety warning.",
36
+ title: 'Safety Margin (Yellow)',
37
+ description: "Shallow water warning. The depth value turns YELLOW below this threshold to alert you to pay attention.",
29
38
  default: 5.0
30
39
  }
31
40
  }
32
41
  },
42
+ // --- SEZIONE GRAFICI E REEF ---
33
43
  graphs: {
34
44
  type: 'object',
35
- title: 'Graph & Reef Alerts',
36
- description: "General settings for graph sampling and tactical wind alerts.",
45
+ title: 'Performance History & Reef Alerts',
46
+ description: "Settings for chart timelines and tactical wind alerts.",
37
47
  properties: {
38
48
  reef1: {
39
49
  type: 'number',
40
- title: '1st Reef Threshold (Orange)',
41
- description: "TWS knots at which the wind graph turns orange, indicating it's time to prepare for the first reef.",
50
+ title: '1st Reef Alert (Orange)',
51
+ description: "Wind speed (TWS) at which the graph turns orange, suggesting it's time to prepare for the first sail reduction.",
42
52
  default: 15.0
43
53
  },
44
54
  reef2: {
45
55
  type: 'number',
46
- title: '2nd Reef Threshold (Red)',
47
- description: "TWS knots at which the wind graph turns red, indicating urgent reefing is required.",
56
+ title: '2nd Reef Alert (Red)',
57
+ description: "Wind speed (TWS) at which the graph turns red, indicating urgent need for sail reduction.",
48
58
  default: 20.0
49
59
  },
50
60
  historyMinutes: {
51
61
  type: 'number',
52
- title: 'Graph History Duration (minutes)',
53
- description: "Total timeframe shown in the sparklines. Vertical grid lines will automatically mark each elapsed minute.",
54
- default: 5
62
+ title: 'Strategic Timeline (Minutes)',
63
+ description: "Total duration shown in the charts. Vertical grid lines mark 1-minute intervals for short durations and 5-minute intervals for long ones.",
64
+ default: 5,
65
+ // Menu a tendina per evitare inserimenti errati
66
+ enum: [5, 10, 15, 30, 60]
55
67
  }
56
68
  }
57
69
  },
70
+ // --- SEZIONE MEDIE E STABILITÀ ---
58
71
  averaging: {
59
72
  type: 'object',
60
- title: 'Averaging & Stability',
61
- description: "Fine-tune data smoothing and maneuver detection.",
73
+ title: 'Tactical Brain & Stability',
74
+ description: "Fine-tune how the dashboard reacts to boat movements and maneuvers.",
62
75
  properties: {
63
76
  longWindow: {
64
77
  type: 'number',
65
- title: 'Long Average Window (ms)',
66
- description: "Time buffer for 'MEAN' values. Larger windows produce smoother numbers but increase the 'Unstable' (orange) alerts during maneuvers or in gusty conditions, as data coherence decreases over time.",
78
+ title: 'Decision Stability Window (ms)',
79
+ description: "The time range used to calculate MEAN values. A longer window (e.g. 30s) provides a solid base for strategy, while a shorter one reacts faster to ogni oscillation.",
67
80
  default: 30000
68
81
  },
69
- smoothWindow: {
82
+ smoothWindow: {
70
83
  type: 'number',
71
- title: 'Pointer Smoothing Window (ms)',
72
- description: "Buffer for gauge needles and pointers. Removes sensor jitter while maintaining real-time responsiveness.",
84
+ title: 'Needle Fluidity (ms)',
85
+ description: "Controls how smoothly pointers move. It filters out sensor 'shaking' without delaying the real-time feel.",
73
86
  default: 2000
74
87
  },
75
- minSpeed: {
88
+ minSpeed: {
76
89
  type: 'number',
77
- title: 'Min Speed for Stability (knots)',
78
- description: "SOG threshold below which stability alerts (blinking orange) are suppressed to avoid GPS noise while docked.",
90
+ title: 'Harbor Silence (knots)',
91
+ description: "Minimum speed required to enable orange blinking alerts. This prevents the display from flashing due to GPS noise while docked or at anchor.",
79
92
  default: 0.5
80
93
  },
81
94
  stabilityThreshold: {
82
95
  type: 'number',
83
- title: 'Stability Sensitivity (R value: 0.7 - 0.98)',
84
- description: "Determines when the number blinks orange. 0.95 = very sensitive (blinks with small movements), 0.85 = standard (balanced for sea), 0.75 = sturdy (blinks only in very rough conditions).",
85
- default: 0.93
96
+ title: 'Steering Precision (Sensitivity)',
97
+ description: "Controls how strictly the system judges your course coherence. 0.95 requires pro precision; 0.85 is more realistic for cruising in waves.",
98
+ default: 0.85
99
+ },
100
+ stabilityBreakout: {
101
+ type: 'number',
102
+ title: 'Maneuver Detection Limit (degrees)',
103
+ description: "If the boat or wind shifts more than these degrees, the display blinks orange to warn you that the current average is no longer reliable.",
104
+ default: 15
86
105
  }
87
106
  }
88
107
  },
108
+ // --- SEZIONE CALIBRAZIONE SCALE ---
89
109
  scales: {
90
110
  type: 'object',
91
- title: 'Graph Scale Configurations',
92
- description: "Customize how scales adapt to your boat's performance in both Standard and Hercules modes.",
111
+ title: 'Chart Scale Calibration',
112
+ description: "Customize how charts adapt to your boat's performance in both Standard and Hercules Zoom modes.",
93
113
  properties: {
94
114
  stw: {
95
- type: 'object', title: 'STW (Speed Through Water)',
115
+ type: 'object',
116
+ title: 'STW (Speed Through Water)',
96
117
  properties: {
97
- stdMax: {
98
- type: 'number', title: 'Standard Mode Max',
99
- description: "The initial top limit of the graph (base 0) during normal navigation.",
100
- default: 12
101
- },
102
- step: {
103
- type: 'number', title: 'Rounding Step',
104
- description: "The fixed increment used when speed exceeds the Max (e.g., scale jumps from 0-12 to 0-14, 0-16).",
105
- default: 2
106
- },
107
- hercSpan: {
108
- type: 'number', title: 'Hercules Zoom Span',
109
- description: "The minimum knots window centered on current speed. Smaller values increase 'zoom' on small variations.",
110
- default: 4
111
- }
118
+ stdMax: { type: 'number', title: 'Standard Max', description: "Default top limit of the graph.", default: 12 },
119
+ step: { type: 'number', title: 'Scale Jump', description: "Amount the scale increases when you exceed the limit.", default: 2 },
120
+ hercSpan: { type: 'number', title: 'Hercules Zoom Span', description: "Width of the zoom window around your current speed.", default: 4 }
112
121
  }
113
122
  },
114
123
  sog: {
115
- type: 'object', title: 'SOG (Speed Over Ground)',
124
+ type: 'object',
125
+ title: 'SOG (Speed Over Ground)',
116
126
  properties: {
117
- stdMax: { type: 'number', title: 'Standard Mode Max', description: "Initial top limit for the base-0 scale.", default: 12 },
118
- step: { type: 'number', title: 'Rounding Step', description: "Scale jump interval to keep labels tidy.", default: 2 },
119
- hercSpan: { type: 'number', title: 'Hercules Zoom Span', description: "Minimum window amplitude during active zoom.", default: 4 }
127
+ stdMax: { type: 'number', title: 'Standard Max', default: 12 },
128
+ step: { type: 'number', title: 'Scale Jump', default: 2 },
129
+ hercSpan: { type: 'number', title: 'Hercules Zoom Span', default: 4 }
120
130
  }
121
131
  },
122
132
  tws: {
123
- type: 'object', title: 'TWS (True Wind Speed)',
133
+ type: 'object',
134
+ title: 'TWS (True Wind Speed)',
124
135
  properties: {
125
- stdMax: { type: 'number', title: 'Standard Mode Max', description: "Maximum wind speed shown in standard view (base 0).", default: 25 },
126
- step: { type: 'number', title: 'Rounding Step', description: "Incremental jump for wind scales (usually 5 or 10 knots).", default: 5 },
127
- hercSpan: { type: 'number', title: 'Hercules Zoom Span', description: "Minimum knots window for high-detail gust monitoring.", default: 10 }
136
+ stdMax: { type: 'number', title: 'Standard Max', default: 25 },
137
+ step: { type: 'number', title: 'Scale Jump', default: 5 },
138
+ hercSpan: { type: 'number', title: 'Hercules Zoom Span', default: 10 }
128
139
  }
129
140
  },
130
141
  depth: {
131
- type: 'object', title: 'Depth',
142
+ type: 'object',
143
+ title: 'Depth',
132
144
  properties: {
133
- stdMax: { type: 'number', title: 'Standard Mode Max', description: "Default maximum depth for the graph scale.", default: 20 },
134
- step: { type: 'number', title: 'Rounding Step', description: "Gradual increment steps for deep water navigation.", default: 10 },
135
- hercSpan: { type: 'number', title: 'Hercules Zoom Span', description: "Minimum meters window to highlight bottom profile changes.", default: 10 }
145
+ stdMax: { type: 'number', title: 'Standard Max', default: 20 },
146
+ step: { type: 'number', title: 'Scale Jump', default: 10 },
147
+ hercSpan: { type: 'number', title: 'Hercules Zoom Span', default: 10 }
136
148
  }
137
149
  }
138
150
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sailingrotevista/rotevista-dash",
3
- "version": "3.0.6",
3
+ "version": "4.0.2",
4
4
  "description": "Public Wind Dashboard with navigation and course aids",
5
5
  "main": "index.js",
6
6
  "publishConfig": {
package/settings.json CHANGED
@@ -3,16 +3,22 @@
3
3
  "depthDanger": 2.5,
4
4
  "depthWarning": 5.0
5
5
  },
6
- "reef_thresholds": {
7
- "orange": 15.0,
8
- "red": 20.0
6
+ "graphs": {
7
+ "reef1": 15.0,
8
+ "reef2": 20.0,
9
+ "historyMinutes": 5
9
10
  },
10
- "averages": {
11
- "long_window": 3000,
12
- "smooth_window": 2000
11
+ "averaging": {
12
+ "longWindow": 30000,
13
+ "smoothWindow": 2000,
14
+ "minSpeed": 0.5,
15
+ "stabilityThreshold": 0.85,
16
+ "stabilityBreakout": 15
13
17
  },
14
- "hercules_ranges": {
15
- "speed": 4.0,
16
- "wind": 10.0
18
+ "scales": {
19
+ "stw": { "stdMax": 12, "step": 2, "hercSpan": 4 },
20
+ "sog": { "stdMax": 12, "step": 2, "hercSpan": 4 },
21
+ "tws": { "stdMax": 25, "step": 5, "hercSpan": 10 },
22
+ "depth": { "stdMax": 20, "step": 10, "hercSpan": 10 }
17
23
  }
18
24
  }
package/style.css CHANGED
@@ -140,6 +140,11 @@ body {
140
140
  .focus-active .data-box:not(.is-focused),
141
141
  .focus-active .box-gauge { display: none !important; }
142
142
 
143
+ .focus-active .is-focused .sparkline path,
144
+ .focus-active .is-focused .sparkline line {
145
+ stroke-width: 1.5px !important; /* Un briciolo più spessa per la stabilità visiva su schermi grandi */
146
+ }
147
+
143
148
  .focus-active.focus-side-left {
144
149
  grid-template-columns: 3fr 2fr !important;
145
150
  grid-template-areas: "focused gauge" !important;
@@ -265,6 +270,10 @@ body {
265
270
  .sparkline line {
266
271
  stroke-width: 1px !important;
267
272
  transition: all 0.3s ease;
273
+ /* --- FIX LINEE SPEZZATE --- */
274
+ stroke-linecap: round; /* Arrotonda le estremità dei segmenti */
275
+ stroke-linejoin: round; /* Arrotonda le giunture tra i segmenti */
276
+ shape-rendering: geometricPrecision; /* Forza il browser a calcolare la linea con precisione sub-pixel */
268
277
  }
269
278
 
270
279
  .scale-labels {
@@ -425,136 +434,156 @@ rect[fill="#222"] { fill: #eee !important; }
425
434
  #wind-gauge { width: 100%; height: 100%; max-height: 100%; object-fit: contain; }
426
435
 
427
436
  /* ==========================================================================
428
- 10. NIGHT MODE (TACTICAL RED - VERSIONE DEFINITIVA E REVISIONATA)
437
+ 10. NIGHT MODE (TACTICAL RED - ARCHITETTURA INTEGRALE)
438
+ ==========================================================================
439
+ Questa sezione sovrascrive interamente lo schema Day Mode.
440
+ Obiettivo: Massima leggibilità, zero abbagliamento, preservazione visione notturna.
429
441
  ========================================================================== */
442
+
430
443
  body.night-mode {
431
444
  background-color: #000 !important;
432
445
  color: #ff3333 !important;
433
446
  }
434
447
 
435
- /* --- STRUTTURA E GRIGLIA --- */
448
+ /* --- 10.1 STRUTTURA DEI CONTENITORI --- */
436
449
  .night-mode .data-box {
437
- background: rgba(15, 0, 0, 0.6) !important;
438
- border-color: #440000 !important; /* Confini box visibili in rosso cupo */
450
+ background: rgba(20, 0, 0, 0.4) !important;
451
+ border-color: #440000 !important; /* Confini rossi cupi per orientamento spaziale */
452
+ box-shadow: inset 0 0 15px rgba(255, 0, 0, 0.05) !important;
439
453
  }
440
454
 
441
- /* Etichette e Testi secondari */
455
+ /* --- 10.2 TIPOGRAFIA E TESTI --- */
456
+ /* Etichette primarie (Titoli dei box) */
442
457
  .night-mode .label,
443
458
  .night-mode .unit,
444
- .night-mode .dual-label,
445
459
  .night-mode .dual-label {
446
- color: #800000 !important;
460
+ color: #800000 !important; /* Rosso sangue scuro per non distrarre */
447
461
  }
448
462
 
449
- /* Valori Numerici */
450
- .night-mode .value,
463
+ /* Valori digitali primari (Heading, Cog, Awa, Twa) */
451
464
  .night-mode .value-large {
452
465
  color: #ff3333 !important;
453
- text-shadow: 0 0 8px rgba(255, 0, 0, 0.4);
466
+ text-shadow: 0 0 8px rgba(255, 0, 0, 0.4) !important;
454
467
  }
455
468
 
456
- /* Stato Online/Offline */
469
+ /* Valori dinamici (SOG, TWS, STW):
470
+ Non usiamo !important per permettere al JavaScript di iniettare i colori dei Reef/Corrente */
471
+ .night-mode .value {
472
+ color: #ff3333;
473
+ text-shadow: 0 0 8px rgba(255, 0, 0, 0.3);
474
+ }
475
+
476
+ /* Widget di Stato */
457
477
  .night-mode #status {
458
478
  background: rgba(255, 0, 0, 0.1) !important;
459
479
  color: #ff3333 !important;
460
480
  }
461
481
 
462
- /* --- GRAFICI (RIGOROSAMENTE 1PX, SENZA RIEMPIMENTO) --- */
463
- .night-mode .graph-wrapper { background: rgba(0, 0, 0, 0.6) !important; border: 1px solid #330000; }
464
- .night-mode .sparkline path:first-of-type { display: none !important; } /* Rimuove l'alone bianco/grigio */
482
+ /* --- 10.3 GRAFICI (STILE CHIRURGICO 1PX) --- */
483
+ .night-mode .graph-wrapper {
484
+ background: rgba(0, 0, 0, 0.6) !important;
485
+ border: 1px solid #330000;
486
+ }
487
+
488
+ /* Rimuove l'area di riempimento per evitare luce diffusa sul display */
489
+ .night-mode .sparkline path:first-of-type {
490
+ display: none !important;
491
+ }
492
+
493
+ /* Linea dati: rossa, sottile e nitida */
465
494
  .night-mode .sparkline path {
466
495
  fill: none !important;
467
496
  stroke: #ff3333 !important;
468
497
  stroke-width: 1px !important;
469
498
  filter: drop-shadow(0 0 2px rgba(255, 0, 0, 0.4));
470
499
  }
471
- .night-mode .sparkline line { stroke: rgba(150, 0, 0, 0.15) !important; } /* Griglia soffusa */
472
- .night-mode #tws-graph line:not([stroke*="rgba"]) {
473
- stroke: #ff3333 !important;
474
- stroke-width: 1px !important;
500
+
501
+ /* Griglia temporale (minuti e livelli): quasi impercettibile */
502
+ .night-mode .sparkline line {
503
+ stroke: rgba(150, 0, 0, 0.15) !important;
475
504
  }
476
505
 
506
+ /* LOGICA REEF TWS: Mantiene i colori degli allarmi sul grafico */
507
+ .night-mode .tws-reef-line { stroke-width: 1px !important; opacity: 0.9 !important; }
508
+ .night-mode .tws-reef-line[stroke="#000000"],
509
+ .night-mode .tws-reef-line[stroke="#000"] { stroke: #440000 !important; } /* Vento basso */
510
+ .night-mode .tws-reef-line[stroke="#e67e22"] { stroke: #b35500 !important; } /* 1° Reef */
511
+ .night-mode .tws-reef-line[stroke="#e74c3c"] {
512
+ stroke: #ff0000 !important;
513
+ filter: drop-shadow(0 0 2px #ff0000);
514
+ } /* 2° Reef */
515
+
477
516
  /* Scale graduate dei grafici */
478
517
  .night-mode .scale-labels { color: #800000 !important; }
479
518
  .night-mode .is-focused .scale-labels { color: #ff3333 !important; }
480
519
 
481
- /* --- WIND GAUGE NIGHT (OSCURAMENTO TOTALE E FIX BIANCO) --- */
482
- /* Forza tutti i cerchi della bussola al nero per eliminare il disco bianco */
520
+ /* --- 10.4 WIND GAUGE (STRUMENTO CENTRALE) --- */
521
+ /* Oscuramento cerchi concentrici per eliminare bagliori bianchi */
483
522
  .night-mode #wind-gauge circle {
484
523
  fill: #000 !important;
485
524
  stroke: #220000 !important;
486
525
  }
487
526
 
488
- /* Cerchio intermedio e hotspot centrale */
527
+ /* Cerchio interno e hotspot centrale (nero profondo) */
489
528
  .night-mode #wind-gauge circle:nth-of-type(2),
490
529
  .night-mode #fullscreen-hotspot {
491
530
  fill: #050000 !important;
492
531
  stroke: #330000 !important;
493
532
  }
494
533
 
495
- /* Correzione Glow centrale (da bianco a rosso neon) */
496
- .night-mode #center-glow feDropShadow {
497
- flood-color: #ff0000 !important;
498
- flood-opacity: 0.6 !important;
534
+ /* Effetto Glow e Logo Barca */
535
+ .night-mode #center-glow feDropShadow { flood-color: #ff0000 !important; flood-opacity: 0.6 !important; }
536
+ /* ICONA BARCA NIGHT: Definizione migliorata con bordo rosso */
537
+ .night-mode #boat-icon {
538
+ fill: #220000 !important; /* Rosso scurissimo per il corpo della barca */
539
+ stroke: #ff0000 !important; /* Bordo rosso vivo per definire la sagoma */
540
+ stroke-width: 0.8px !important; /* Spessore sottile ma netto */
541
+ opacity: 1 !important; /* Piena opacità per far risaltare il bordo */
499
542
  }
500
-
501
- /* AWS Interno: Etichetta e Valore */
543
+ /* Valori interni (AWS) */
502
544
  .night-mode #aws-display-group text { fill: #800000 !important; }
503
545
  .night-mode #aws-val-svg { fill: #ff3333 !important; }
504
546
 
505
- /* FIX LOGO BARCA: Ombra scura e coerente */
506
- .night-mode #boat-icon {
507
- fill: #150000 !important;
508
- opacity: 0.8 !important;
509
- }
510
-
511
- /* FIX COG/TRACK: Triangolo rosso senza bordo bianco */
512
- .night-mode #track-pointer path {
513
- fill: #ff3333 !important;
514
- stroke: none !important;
515
- }
516
-
517
- /* Tacche e Numeri Gradi Bussola */
547
+ /* Tacche e Numeri Gradi della Bussola */
518
548
  .night-mode #ticks line { stroke: #550000 !important; }
519
549
  .night-mode #tick-labels { fill: #800000 !important; }
520
550
 
521
- /* Settori Vento: Scuriti e differenziati per mure */
551
+ /* SETTORI VENTO: Conversione sicura per la notte */
522
552
  .night-mode #wind-gauge path[stroke="#ff0000"] { stroke: #800000 !important; opacity: 0.8; }
523
553
  .night-mode #wind-gauge path[stroke="#00ff00"] {
524
554
  stroke: #440000 !important;
525
555
  stroke-dasharray: 5, 4 !important;
526
556
  opacity: 0.7;
527
- }
557
+ } /* Verde Starboard -> Rosso tratteggiato */
528
558
  .night-mode #wind-gauge path[stroke="#ff8800"] { stroke: #330000 !important; opacity: 0.6; }
529
559
 
530
- /* Lancette AWA/TWA */
560
+ /* Lancette AWA/TWA e COG */
531
561
  .night-mode #awa-pointer path { fill: #ff0000 !important; stroke: #000 !important; }
532
562
  .night-mode #twa-pointer path { fill: #800000 !important; stroke: #000 !important; }
563
+ .night-mode #track-pointer path { fill: #ff3333 !important; stroke: none !important; }
533
564
 
534
- /* --- LEEWAY NIGHT (FIX SCRITTA E GRADIENTE) --- */
535
- .night-mode #leeway-val {
536
- fill: #ff3333 !important;
537
- color: #ff3333 !important;
538
- }
565
+ /* --- 10.5 WIDGETS ACCESSORI --- */
566
+ /* Barra Leeway */
567
+ .night-mode #leeway-val { fill: #ff3333 !important; color: #ff3333 !important; }
539
568
  .night-mode rect[fill="url(#leeway-grad)"] { fill: url(#leeway-night-grad) !important; }
540
569
  .night-mode rect[fill="#eee"],
541
- .night-mode rect[fill="#222"] {
542
- fill: #0a0000 !important;
543
- stroke: #330000 !important;
544
- }
545
-
546
- /* Scala graduata Leeway (tacche e numeri) */
570
+ .night-mode rect[fill="#222"] { fill: #0a0000 !important; stroke: #330000 !important; }
547
571
  .night-mode g[stroke="#555"] line { stroke: #440000 !important; }
548
572
  .night-mode g[fill="#555"] text { fill: #800000 !important; }
549
573
 
550
- /* --- MINI BUSSOLA TWD NIGHT --- */
574
+ /* Mini Bussola TWD */
551
575
  .night-mode .mini-compass { border-color: #330000 !important; background: #000 !important; }
552
- .night-mode .mini-compass circle { stroke: #330000 !important; }
553
576
  .night-mode .mini-compass text { fill: #800000 !important; }
554
- .night-mode .mini-compass text:last-of-type { fill: #800000 !important; opacity: 1; } /* La "S" */
577
+ .night-mode .mini-compass text:last-of-type { fill: #800000 !important; opacity: 1; }
555
578
  .night-mode #twd-boat-wrap path { fill: #ff3333 !important; opacity: 0.4 !important; }
556
579
  .night-mode #twd-arrow #twd-wind-chevron { stroke: #ff3333 !important; }
557
580
 
581
+ /* --- 10.6 LOGICA RED-SHIFT TREND --- */
582
+ /* Converte i colori generati dal JS per i pallini di trend */
583
+ .night-mode circle[fill="#bbb"], .night-mode circle[fill="#bbbbbb"] { fill: #440000 !important; } /* Neutro */
584
+ .night-mode circle[fill="#27ae60"] { fill: #ff0000 !important; } /* Lift */
585
+ .night-mode circle[fill="#c0392b"] { fill: #800000 !important; } /* Header */
586
+
558
587
  /* ==========================================================================
559
588
  11. TREND E ANIMAZIONI
560
589
  ========================================================================== */