signalk-mareas-ihm 2.3.2 → 2.3.4
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.
- package/CHANGELOG.md +120 -0
- package/README.md +1 -1
- package/dist/CHANGELOG.md +120 -0
- package/dist/README.md +1 -1
- package/dist/build-info.json +4 -4
- package/dist/index.js +24 -8
- package/dist/mobile.html +459 -119
- package/package.json +1 -1
- package/public/index.html +9 -2
- package/public/mobile.html +459 -119
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,125 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.3.4] - 2026-06-26
|
|
4
|
+
|
|
5
|
+
### English
|
|
6
|
+
|
|
7
|
+
**Shelter modal — readability, layout and weather chart fixes (Rev548-Rev562)**
|
|
8
|
+
|
|
9
|
+
- **Infobox shelter — typography rebuild** validated by GPT-5 + Gemini Pro from first principles: removed the generic `span,div{font-size:22px}` rule that was breaking inheritance from id-containers; duplicate `#shelter-summary-text` declarations consolidated; base 22 px declared on `.shelter-popup-box` and overridden +8 nominal on each id (status-label 24→32, status-body 22→30, summary 26→34, auto-prompt 20→28, auto-status 22→30). Compensates the inherited `zoom: var(--ui-scale)` so the change is actually visible on mobile.
|
|
10
|
+
- **Veleta / IMU / Sensor badges** in the infobox bumped 11→22 px (Veleta/Sensor) and IMU inline tag matched. Mar en calma now reads instead of being invisible under zoom.
|
|
11
|
+
- **Wave history chart** taller: SVG 94→140 px (+49%), yaxis scale labels 13→20 px, header "Historial de olas en fondeo · 5 min por barra · Fondeado a las…" 16→24 px (+50%), ⓘ button 17→22 px.
|
|
12
|
+
- **Pressure sparkline inside the infobox** taller (75→120 px, +60%) and arrives instantly on modal open instead of 5-60 s late — `_wxRefreshChip` now repaints the shelter popup the moment it fills `_wxLastPast24hPressureHpa` from null.
|
|
13
|
+
- **Rose of sectors** scales properly on mobile — switched from `vmin` (which was being multiplied again by the inherited zoom) to fixed pixel values: 440 px desktop / 520 px mobile aligned with the height of the A/Grade column. No longer captures the entire tap area for swipe scroll.
|
|
14
|
+
- **Sheltered sectors text** is now plural-aware: `Detectado 1 sector abrigado` vs `Detectados N sectores abrigados`. Applied in both the auto-detect path and the popup render path.
|
|
15
|
+
- **Shelter scroll no longer covers header** — `.m-modal-hdr` z-index bumped from 10 to 2050 so `.shelter-hour.selected` (z-index 100) can no longer paint on top of it during scroll.
|
|
16
|
+
- **Wave history rose-wrap layout** — grid gap doubled (14×16 → 24×32 px) for better separation between rose and adjacent boxes; removed unused `overflow-x: auto` that was creating phantom scroll; full-width centered.
|
|
17
|
+
- **Summary text** ("Abrigado: ninguna de las próximas 12 h queda expuesta") now fits in a single line on wide screens (max-width:760 removed, full width with stretch).
|
|
18
|
+
|
|
19
|
+
**Hourly strip — height, spacing and centering**
|
|
20
|
+
|
|
21
|
+
- Cell height bumped 88→124 px (124→168 in portrait) so the third line ("0.7 m" wave) no longer clips out.
|
|
22
|
+
- Cell width bumped progressively to 158 px (from original 110) — text breathes and the ola label fits without overlap.
|
|
23
|
+
- Cell contents grouped (was `space-between` with huge gaps, now `center` + 10 px gap).
|
|
24
|
+
- Wave label inside cell bumped 18→26 px (24 in portrait).
|
|
25
|
+
- Cells container now `flex:0 0 auto` + `justify-content:center` + parent row `safe-center` — when content fits, the whole AHORA+cells block centers; when overflow, it falls back to flex-start without cutting the first item.
|
|
26
|
+
- AHORA button height aligned with cells in every breakpoint (was 64 px in landscape while cells were 88-90).
|
|
27
|
+
- Strip auto-scrolls to AHORA on render (scrollLeft=0 after appendChild).
|
|
28
|
+
- Selected cell scale reduced 1.18→1.10 and origin moved from `bottom` to `center` so the cell no longer collides with the header above and content fits without crop.
|
|
29
|
+
- Strip separated 14 px from header (was `top:-19px` margin negative that overlapped selected cell).
|
|
30
|
+
|
|
31
|
+
**Bottom-bar widgets**
|
|
32
|
+
|
|
33
|
+
- Widget viento — fixed phase lag: the wind cell was only updating on the slow tick (`_mPollSlow` ≈ 6-10 s on Pi) so it lagged behind the wind arrow on the map. Extracted to `_updateBBWindCell()` and called from `_refreshBoatWind` so both are in sync (~3-5 s).
|
|
34
|
+
- Pressure cell — reverted Rev551 width change (it was hitting the wrong SVG; the cell padre was already constrained to 50 px and the fix made no visual difference).
|
|
35
|
+
- Sonda — sub-label `(X m)` always visible (was hidden in Rev556 except on alarm; reverted on Carlos feedback). Word "final" removed from the label.
|
|
36
|
+
- Marea — sub-label simplified to `PM a las 14:23` / `BM a las 02:15` (was `PM 2.3m 14:23`). Wave height already lives in the dedicated Dif. Bajamar widget.
|
|
37
|
+
- **New widget**: `T. fondeo` — elapsed time since anchor drop (`23m` / `5h 12m` / `2d 7h`). Complements the existing `H. fondeo` (absolute drop time). Tick every 60 s.
|
|
38
|
+
- **New widget**: `+` — always pinned to the right edge of the bar (uses `order:9999` + explicit DOM re-append after reorder), no `data-bb-cell` so the order CRUD doesn't touch it. Click opens the bottom-bar widgets configuration directly. Custom separator handling: previous cell keeps its divider when the `+` is present, and the `+` itself never draws one.
|
|
39
|
+
- Bottom-bar layout — `justify-content` changed from `flex-start` to `safe center` so widgets center when they fit and fall back to flex-start when overflow; gap right reduced 12→4 px to remove the perceived gap at the right edge.
|
|
40
|
+
|
|
41
|
+
**AIS panel**
|
|
42
|
+
|
|
43
|
+
- AIS list distances and AIS radius slider now use a new `unitFmt.distanceLand()` helper: metric → `m`/`km`, imperial → `ft`/`mi`. Never `NM` even when the user system is `metric_nautical` (a vessel 800 m away was being shown as `0.43 NM` which is unreadable in context).
|
|
44
|
+
- AIS toggle row (`AIS · Tracks · Alarma`) in portrait: when it wraps to its own line it now justifies to the LEFT (was sticking to the right because of `margin-left:auto` inherited from desktop layout).
|
|
45
|
+
|
|
46
|
+
**Map**
|
|
47
|
+
|
|
48
|
+
- Self-track on the chart now renders even when GPS is extremely stable (RTK or stationary). Distance threshold lowered 0.5 → 0.2 m and added a 60 s keep-alive so a new point is always recorded at least once per minute, guaranteeing the visor always has ≥2 points (the minimum for `updateTrackGradient` to draw the polyline). Track polylines moved to a custom Leaflet pane with `zIndex: 650` so they always paint above tile layers regardless of base-layer z-order; weight bumped 3→5, opacity .8→.95 for visibility against dark raster charts.
|
|
49
|
+
|
|
50
|
+
**Modal Instrucciones (iframe)**
|
|
51
|
+
|
|
52
|
+
- Hidden the orphaned `m-tv-header` (Back · Mareas · Curvas) when the iframe is opened from the visor as `?embed=1` or `?showInstructions=1`. The parent now injects its own orange header, so the inner one was duplicating it.
|
|
53
|
+
|
|
54
|
+
**Other**
|
|
55
|
+
|
|
56
|
+
- Reverted accidental icon swap on the Abrigo button — both sidebar button and modal header now use 🏔️ (mountain) as Carlos requested, no longer ⚓ (which conflicts visually with the anchor drop button).
|
|
57
|
+
- Favorites modal title renamed from "Listado de últimos fondeos y favoritos" to simply "Últimos fondeos" (the modal already shows the favorites and recent sections internally; the title was redundant). The 📍 icon in the hamburger menu entry is unchanged.
|
|
58
|
+
|
|
59
|
+
### Español
|
|
60
|
+
|
|
61
|
+
**Modal Abrigo — legibilidad, layout y arreglo de gráfica meteo (Rev548-Rev562)**
|
|
62
|
+
|
|
63
|
+
- **Infobox del Abrigo — tipografía reconstruida** validado por GPT-5 + Gemini Pro desde primeros principios: eliminada la regla genérica `span,div{font-size:22px}` que rompía la herencia desde id-contenedores; consolidadas las declaraciones duplicadas de `#shelter-summary-text`; base 22 px declarada en `.shelter-popup-box` y override +8 nominal sobre cada id (status-label 24→32, status-body 22→30, summary 26→34, auto-prompt 20→28, auto-status 22→30). Compensa el `zoom: var(--ui-scale)` heredado para que el cambio sea realmente visible en móvil.
|
|
64
|
+
- **Badges Veleta / IMU / Sensor** del infobox subidos 11→22 px (Veleta/Sensor) y la etiqueta inline IMU al mismo nivel. "Mar en calma" ahora se lee en lugar de quedar invisible bajo el zoom.
|
|
65
|
+
- **Histórico de olas** más alto: SVG 94→140 px (+49%), escalas Y 13→20 px, cabecera "Historial de olas en fondeo · 5 min por barra · Fondeado a las…" 16→24 px (+50%), botón ⓘ 17→22 px.
|
|
66
|
+
- **Sparkline de presión en el infobox** más alto (75→120 px, +60%) y aparece al instante al abrir el modal en vez de tardar 5-60 s — `_wxRefreshChip` ahora repinta el popup en el momento en que `_wxLastPast24hPressureHpa` se llena desde null.
|
|
67
|
+
- **Rosa de sectores** escala correctamente en móvil — cambiado de `vmin` (que se multiplicaba de nuevo por el zoom heredado) a valores px fijos: 440 px desktop / 520 px móvil alineada con la altura de la columna A/Grado. Ya no acapara toda el área táctil impidiendo el scroll.
|
|
68
|
+
- **Texto de sectores abrigados** plural-aware: `Detectado 1 sector abrigado` vs `Detectados N sectores abrigados`. Aplicado en el path auto-detect y en el popup render.
|
|
69
|
+
- **Scroll del Abrigo ya no tapa el header** — z-index de `.m-modal-hdr` subido de 10 a 2050 para que `.shelter-hour.selected` (z-index 100) no pueda pintar encima.
|
|
70
|
+
- **Layout del rose-wrap** — gap del grid doblado (14×16 → 24×32 px) para mejor separación rosa-infobox; eliminado el `overflow-x: auto` que generaba scroll fantasma; full-width centrado.
|
|
71
|
+
- **Caja resumen** ("Abrigado: ninguna de las próximas 12 h queda expuesta") cabe ahora en una sola línea en pantallas anchas (quitado `max-width:760`, ancho completo con stretch).
|
|
72
|
+
|
|
73
|
+
**Strip horario — altura, espaciado y centrado**
|
|
74
|
+
|
|
75
|
+
- Altura de celda subida 88→124 px (124→168 en vertical) para que la tercera línea ("0.7 m" ola) no se recorte.
|
|
76
|
+
- Ancho de celda subido progresivamente a 158 px (desde los 110 originales) — el texto respira y la etiqueta de ola cabe sin solaparse.
|
|
77
|
+
- Contenido de la celda agrupado (era `space-between` con huecos enormes, ahora `center` + gap 10 px).
|
|
78
|
+
- Etiqueta de ola dentro de celda subida 18→26 px (24 en vertical).
|
|
79
|
+
- Container de celdas ahora `flex:0 0 auto` + `justify-content:center` + row padre `safe-center` — cuando el contenido cabe, el bloque AHORA+celdas se centra entero; cuando hay overflow, cae a flex-start sin cortar el primer item.
|
|
80
|
+
- Botón AHORA con altura sincronizada con las celdas en todos los breakpoints (estaba a 64 px en landscape mientras las celdas tenían 88-90).
|
|
81
|
+
- Strip auto-scroll a AHORA en render (scrollLeft=0 tras appendChild).
|
|
82
|
+
- Celda seleccionada con scale reducido 1.18→1.10 y origin cambiado de `bottom` a `center` para que no choque con el header de arriba y el contenido quepa sin recortar.
|
|
83
|
+
- Strip separado 14 px del header (era `top:-19px` margen negativo que solapaba la celda seleccionada).
|
|
84
|
+
|
|
85
|
+
**Widgets de la bottom-bar**
|
|
86
|
+
|
|
87
|
+
- Widget viento — fix del lag de fase: la celda viento sólo se actualizaba en el tick lento (`_mPollSlow` ≈ 6-10 s en Pi) así que iba retrasada respecto a la flecha del visor. Extraído a `_updateBBWindCell()` y llamado desde `_refreshBoatWind` para que ambos vayan en sincronía (~3-5 s).
|
|
88
|
+
- Celda presión — revertido el cambio de Rev551 (tocaba el SVG erróneo; la cell padre estaba limitada a 50 px y el cambio no daba diferencia visual).
|
|
89
|
+
- Sonda — sub-label `(X m)` siempre visible (Rev556 lo ocultaba salvo en alarma; revertido por feedback Carlos). Quitada la palabra "final" del label.
|
|
90
|
+
- Marea — sub-label simplificado a `PM a las 14:23` / `BM a las 02:15` (era `PM 2.3m 14:23`). La altura ya vive en el widget propio Dif. Bajamar.
|
|
91
|
+
- **Nuevo widget**: `T. fondeo` — tiempo transcurrido desde el drop (`23m` / `5h 12m` / `2d 7h`). Complementa el existente `H. fondeo` (hora absoluta). Tick cada 60 s.
|
|
92
|
+
- **Nuevo widget**: `+` — siempre fijo en el borde derecho de la barra (usa `order:9999` + re-append explícito al DOM tras reordenar), sin `data-bb-cell` para que el CRUD de orden no lo toque. Click abre directamente la configuración de widgets. Manejo de separador a medida: la celda anterior mantiene su divisor cuando existe el `+`, y el `+` nunca dibuja uno.
|
|
93
|
+
- Layout de la bottom-bar — `justify-content` cambiado de `flex-start` a `safe center` así los widgets se centran cuando caben y caen a flex-start si hay overflow; gap derecho reducido 12→4 px para eliminar el hueco visible al borde derecho.
|
|
94
|
+
|
|
95
|
+
**Panel AIS**
|
|
96
|
+
|
|
97
|
+
- Distancias del listado AIS y slider de radio AIS usan ahora el nuevo helper `unitFmt.distanceLand()`: métrico → `m`/`km`, imperial → `ft`/`mi`. Nunca `NM` aunque el sistema del usuario sea `metric_nautical` (un barco a 800 m se mostraba como `0.43 NM`, ilegible en contexto).
|
|
98
|
+
- Fila de toggles AIS (`AIS · Tracks · Alarma`) en vertical: cuando hace wrap a su propia línea se justifica a la IZQUIERDA (antes se pegaba a la derecha por `margin-left:auto` heredado del layout desktop).
|
|
99
|
+
|
|
100
|
+
**Mapa**
|
|
101
|
+
|
|
102
|
+
- Track propio del barco se pinta incluso cuando el GPS está extremadamente estable (RTK o quieto). Threshold bajado 0.5 → 0.2 m + keep-alive de 60 s para garantizar al menos un punto por minuto (mínimo de 2 que necesita `updateTrackGradient` para dibujar la polyline). Polylines del track movidas a un pane custom de Leaflet con `zIndex: 650` para que siempre pinten por encima de los tiles independientemente del z-order de las capas base; weight subido 3→5, opacidad .8→.95 para visibilidad sobre cartas raster oscuras.
|
|
103
|
+
|
|
104
|
+
**Modal Instrucciones (iframe)**
|
|
105
|
+
|
|
106
|
+
- Ocultado el `m-tv-header` huérfano (Atrás · Mareas · Curvas) cuando el iframe se abre desde el visor como `?embed=1` o `?showInstructions=1`. El padre ya inyecta su propio header naranja, así que el interior estaba duplicando.
|
|
107
|
+
|
|
108
|
+
**Otros**
|
|
109
|
+
|
|
110
|
+
- Revertido el intercambio accidental de icono en el botón Abrigo — tanto el botón del sidebar como el header del modal usan ahora 🏔️ (montaña) como pidió Carlos, ya no ⚓ (que entra en conflicto visual con el botón de fondear ancla).
|
|
111
|
+
- Modal de favoritos renombrado: "Listado de últimos fondeos y favoritos" → simplemente "Últimos fondeos" (el modal ya muestra dentro las secciones de favoritos y recientes; el título era redundante). El icono 📍 del menú hamburger se mantiene intacto.
|
|
112
|
+
|
|
113
|
+
## [2.3.3] - 2026-06-25
|
|
114
|
+
|
|
115
|
+
### English
|
|
116
|
+
|
|
117
|
+
- **README title cleanup** — removed the redundant `signalk-mareas-ihm —` prefix from the README heading. The page on npmjs.com now shows only the commercial name `AnchorWatch Pro: Smart Anchoring, AIS & Tides`. NPM keeps the package name (`signalk-mareas-ihm`) in its own metadata column, so duplicating it in the title was visual noise.
|
|
118
|
+
|
|
119
|
+
### Español
|
|
120
|
+
|
|
121
|
+
- **Limpieza del título del README** — quitado el prefijo redundante `signalk-mareas-ihm —` del encabezado del README. La página en npmjs.com ahora muestra solo el nombre comercial `AnchorWatch Pro: Smart Anchoring, AIS & Tides`. El nombre del paquete (`signalk-mareas-ihm`) ya lo enseña NPM en su propia columna de metadatos; duplicarlo en el título era ruido visual.
|
|
122
|
+
|
|
3
123
|
## [2.3.2] - 2026-06-24
|
|
4
124
|
|
|
5
125
|
### English
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# AnchorWatch Pro: Smart Anchoring, AIS & Tides
|
|
2
2
|
|
|
3
3
|
**A complete anchor watch and marine safety webapp for Signal K.**
|
|
4
4
|
Intelligent anchor monitoring, voice alarms, AIS anti-collision with cross-session cache, shelter forecast, on-board wave measurement and IHM Spain tides — running on your OpenPlotter / Raspberry Pi.
|
package/dist/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,125 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.3.4] - 2026-06-26
|
|
4
|
+
|
|
5
|
+
### English
|
|
6
|
+
|
|
7
|
+
**Shelter modal — readability, layout and weather chart fixes (Rev548-Rev562)**
|
|
8
|
+
|
|
9
|
+
- **Infobox shelter — typography rebuild** validated by GPT-5 + Gemini Pro from first principles: removed the generic `span,div{font-size:22px}` rule that was breaking inheritance from id-containers; duplicate `#shelter-summary-text` declarations consolidated; base 22 px declared on `.shelter-popup-box` and overridden +8 nominal on each id (status-label 24→32, status-body 22→30, summary 26→34, auto-prompt 20→28, auto-status 22→30). Compensates the inherited `zoom: var(--ui-scale)` so the change is actually visible on mobile.
|
|
10
|
+
- **Veleta / IMU / Sensor badges** in the infobox bumped 11→22 px (Veleta/Sensor) and IMU inline tag matched. Mar en calma now reads instead of being invisible under zoom.
|
|
11
|
+
- **Wave history chart** taller: SVG 94→140 px (+49%), yaxis scale labels 13→20 px, header "Historial de olas en fondeo · 5 min por barra · Fondeado a las…" 16→24 px (+50%), ⓘ button 17→22 px.
|
|
12
|
+
- **Pressure sparkline inside the infobox** taller (75→120 px, +60%) and arrives instantly on modal open instead of 5-60 s late — `_wxRefreshChip` now repaints the shelter popup the moment it fills `_wxLastPast24hPressureHpa` from null.
|
|
13
|
+
- **Rose of sectors** scales properly on mobile — switched from `vmin` (which was being multiplied again by the inherited zoom) to fixed pixel values: 440 px desktop / 520 px mobile aligned with the height of the A/Grade column. No longer captures the entire tap area for swipe scroll.
|
|
14
|
+
- **Sheltered sectors text** is now plural-aware: `Detectado 1 sector abrigado` vs `Detectados N sectores abrigados`. Applied in both the auto-detect path and the popup render path.
|
|
15
|
+
- **Shelter scroll no longer covers header** — `.m-modal-hdr` z-index bumped from 10 to 2050 so `.shelter-hour.selected` (z-index 100) can no longer paint on top of it during scroll.
|
|
16
|
+
- **Wave history rose-wrap layout** — grid gap doubled (14×16 → 24×32 px) for better separation between rose and adjacent boxes; removed unused `overflow-x: auto` that was creating phantom scroll; full-width centered.
|
|
17
|
+
- **Summary text** ("Abrigado: ninguna de las próximas 12 h queda expuesta") now fits in a single line on wide screens (max-width:760 removed, full width with stretch).
|
|
18
|
+
|
|
19
|
+
**Hourly strip — height, spacing and centering**
|
|
20
|
+
|
|
21
|
+
- Cell height bumped 88→124 px (124→168 in portrait) so the third line ("0.7 m" wave) no longer clips out.
|
|
22
|
+
- Cell width bumped progressively to 158 px (from original 110) — text breathes and the ola label fits without overlap.
|
|
23
|
+
- Cell contents grouped (was `space-between` with huge gaps, now `center` + 10 px gap).
|
|
24
|
+
- Wave label inside cell bumped 18→26 px (24 in portrait).
|
|
25
|
+
- Cells container now `flex:0 0 auto` + `justify-content:center` + parent row `safe-center` — when content fits, the whole AHORA+cells block centers; when overflow, it falls back to flex-start without cutting the first item.
|
|
26
|
+
- AHORA button height aligned with cells in every breakpoint (was 64 px in landscape while cells were 88-90).
|
|
27
|
+
- Strip auto-scrolls to AHORA on render (scrollLeft=0 after appendChild).
|
|
28
|
+
- Selected cell scale reduced 1.18→1.10 and origin moved from `bottom` to `center` so the cell no longer collides with the header above and content fits without crop.
|
|
29
|
+
- Strip separated 14 px from header (was `top:-19px` margin negative that overlapped selected cell).
|
|
30
|
+
|
|
31
|
+
**Bottom-bar widgets**
|
|
32
|
+
|
|
33
|
+
- Widget viento — fixed phase lag: the wind cell was only updating on the slow tick (`_mPollSlow` ≈ 6-10 s on Pi) so it lagged behind the wind arrow on the map. Extracted to `_updateBBWindCell()` and called from `_refreshBoatWind` so both are in sync (~3-5 s).
|
|
34
|
+
- Pressure cell — reverted Rev551 width change (it was hitting the wrong SVG; the cell padre was already constrained to 50 px and the fix made no visual difference).
|
|
35
|
+
- Sonda — sub-label `(X m)` always visible (was hidden in Rev556 except on alarm; reverted on Carlos feedback). Word "final" removed from the label.
|
|
36
|
+
- Marea — sub-label simplified to `PM a las 14:23` / `BM a las 02:15` (was `PM 2.3m 14:23`). Wave height already lives in the dedicated Dif. Bajamar widget.
|
|
37
|
+
- **New widget**: `T. fondeo` — elapsed time since anchor drop (`23m` / `5h 12m` / `2d 7h`). Complements the existing `H. fondeo` (absolute drop time). Tick every 60 s.
|
|
38
|
+
- **New widget**: `+` — always pinned to the right edge of the bar (uses `order:9999` + explicit DOM re-append after reorder), no `data-bb-cell` so the order CRUD doesn't touch it. Click opens the bottom-bar widgets configuration directly. Custom separator handling: previous cell keeps its divider when the `+` is present, and the `+` itself never draws one.
|
|
39
|
+
- Bottom-bar layout — `justify-content` changed from `flex-start` to `safe center` so widgets center when they fit and fall back to flex-start when overflow; gap right reduced 12→4 px to remove the perceived gap at the right edge.
|
|
40
|
+
|
|
41
|
+
**AIS panel**
|
|
42
|
+
|
|
43
|
+
- AIS list distances and AIS radius slider now use a new `unitFmt.distanceLand()` helper: metric → `m`/`km`, imperial → `ft`/`mi`. Never `NM` even when the user system is `metric_nautical` (a vessel 800 m away was being shown as `0.43 NM` which is unreadable in context).
|
|
44
|
+
- AIS toggle row (`AIS · Tracks · Alarma`) in portrait: when it wraps to its own line it now justifies to the LEFT (was sticking to the right because of `margin-left:auto` inherited from desktop layout).
|
|
45
|
+
|
|
46
|
+
**Map**
|
|
47
|
+
|
|
48
|
+
- Self-track on the chart now renders even when GPS is extremely stable (RTK or stationary). Distance threshold lowered 0.5 → 0.2 m and added a 60 s keep-alive so a new point is always recorded at least once per minute, guaranteeing the visor always has ≥2 points (the minimum for `updateTrackGradient` to draw the polyline). Track polylines moved to a custom Leaflet pane with `zIndex: 650` so they always paint above tile layers regardless of base-layer z-order; weight bumped 3→5, opacity .8→.95 for visibility against dark raster charts.
|
|
49
|
+
|
|
50
|
+
**Modal Instrucciones (iframe)**
|
|
51
|
+
|
|
52
|
+
- Hidden the orphaned `m-tv-header` (Back · Mareas · Curvas) when the iframe is opened from the visor as `?embed=1` or `?showInstructions=1`. The parent now injects its own orange header, so the inner one was duplicating it.
|
|
53
|
+
|
|
54
|
+
**Other**
|
|
55
|
+
|
|
56
|
+
- Reverted accidental icon swap on the Abrigo button — both sidebar button and modal header now use 🏔️ (mountain) as Carlos requested, no longer ⚓ (which conflicts visually with the anchor drop button).
|
|
57
|
+
- Favorites modal title renamed from "Listado de últimos fondeos y favoritos" to simply "Últimos fondeos" (the modal already shows the favorites and recent sections internally; the title was redundant). The 📍 icon in the hamburger menu entry is unchanged.
|
|
58
|
+
|
|
59
|
+
### Español
|
|
60
|
+
|
|
61
|
+
**Modal Abrigo — legibilidad, layout y arreglo de gráfica meteo (Rev548-Rev562)**
|
|
62
|
+
|
|
63
|
+
- **Infobox del Abrigo — tipografía reconstruida** validado por GPT-5 + Gemini Pro desde primeros principios: eliminada la regla genérica `span,div{font-size:22px}` que rompía la herencia desde id-contenedores; consolidadas las declaraciones duplicadas de `#shelter-summary-text`; base 22 px declarada en `.shelter-popup-box` y override +8 nominal sobre cada id (status-label 24→32, status-body 22→30, summary 26→34, auto-prompt 20→28, auto-status 22→30). Compensa el `zoom: var(--ui-scale)` heredado para que el cambio sea realmente visible en móvil.
|
|
64
|
+
- **Badges Veleta / IMU / Sensor** del infobox subidos 11→22 px (Veleta/Sensor) y la etiqueta inline IMU al mismo nivel. "Mar en calma" ahora se lee en lugar de quedar invisible bajo el zoom.
|
|
65
|
+
- **Histórico de olas** más alto: SVG 94→140 px (+49%), escalas Y 13→20 px, cabecera "Historial de olas en fondeo · 5 min por barra · Fondeado a las…" 16→24 px (+50%), botón ⓘ 17→22 px.
|
|
66
|
+
- **Sparkline de presión en el infobox** más alto (75→120 px, +60%) y aparece al instante al abrir el modal en vez de tardar 5-60 s — `_wxRefreshChip` ahora repinta el popup en el momento en que `_wxLastPast24hPressureHpa` se llena desde null.
|
|
67
|
+
- **Rosa de sectores** escala correctamente en móvil — cambiado de `vmin` (que se multiplicaba de nuevo por el zoom heredado) a valores px fijos: 440 px desktop / 520 px móvil alineada con la altura de la columna A/Grado. Ya no acapara toda el área táctil impidiendo el scroll.
|
|
68
|
+
- **Texto de sectores abrigados** plural-aware: `Detectado 1 sector abrigado` vs `Detectados N sectores abrigados`. Aplicado en el path auto-detect y en el popup render.
|
|
69
|
+
- **Scroll del Abrigo ya no tapa el header** — z-index de `.m-modal-hdr` subido de 10 a 2050 para que `.shelter-hour.selected` (z-index 100) no pueda pintar encima.
|
|
70
|
+
- **Layout del rose-wrap** — gap del grid doblado (14×16 → 24×32 px) para mejor separación rosa-infobox; eliminado el `overflow-x: auto` que generaba scroll fantasma; full-width centrado.
|
|
71
|
+
- **Caja resumen** ("Abrigado: ninguna de las próximas 12 h queda expuesta") cabe ahora en una sola línea en pantallas anchas (quitado `max-width:760`, ancho completo con stretch).
|
|
72
|
+
|
|
73
|
+
**Strip horario — altura, espaciado y centrado**
|
|
74
|
+
|
|
75
|
+
- Altura de celda subida 88→124 px (124→168 en vertical) para que la tercera línea ("0.7 m" ola) no se recorte.
|
|
76
|
+
- Ancho de celda subido progresivamente a 158 px (desde los 110 originales) — el texto respira y la etiqueta de ola cabe sin solaparse.
|
|
77
|
+
- Contenido de la celda agrupado (era `space-between` con huecos enormes, ahora `center` + gap 10 px).
|
|
78
|
+
- Etiqueta de ola dentro de celda subida 18→26 px (24 en vertical).
|
|
79
|
+
- Container de celdas ahora `flex:0 0 auto` + `justify-content:center` + row padre `safe-center` — cuando el contenido cabe, el bloque AHORA+celdas se centra entero; cuando hay overflow, cae a flex-start sin cortar el primer item.
|
|
80
|
+
- Botón AHORA con altura sincronizada con las celdas en todos los breakpoints (estaba a 64 px en landscape mientras las celdas tenían 88-90).
|
|
81
|
+
- Strip auto-scroll a AHORA en render (scrollLeft=0 tras appendChild).
|
|
82
|
+
- Celda seleccionada con scale reducido 1.18→1.10 y origin cambiado de `bottom` a `center` para que no choque con el header de arriba y el contenido quepa sin recortar.
|
|
83
|
+
- Strip separado 14 px del header (era `top:-19px` margen negativo que solapaba la celda seleccionada).
|
|
84
|
+
|
|
85
|
+
**Widgets de la bottom-bar**
|
|
86
|
+
|
|
87
|
+
- Widget viento — fix del lag de fase: la celda viento sólo se actualizaba en el tick lento (`_mPollSlow` ≈ 6-10 s en Pi) así que iba retrasada respecto a la flecha del visor. Extraído a `_updateBBWindCell()` y llamado desde `_refreshBoatWind` para que ambos vayan en sincronía (~3-5 s).
|
|
88
|
+
- Celda presión — revertido el cambio de Rev551 (tocaba el SVG erróneo; la cell padre estaba limitada a 50 px y el cambio no daba diferencia visual).
|
|
89
|
+
- Sonda — sub-label `(X m)` siempre visible (Rev556 lo ocultaba salvo en alarma; revertido por feedback Carlos). Quitada la palabra "final" del label.
|
|
90
|
+
- Marea — sub-label simplificado a `PM a las 14:23` / `BM a las 02:15` (era `PM 2.3m 14:23`). La altura ya vive en el widget propio Dif. Bajamar.
|
|
91
|
+
- **Nuevo widget**: `T. fondeo` — tiempo transcurrido desde el drop (`23m` / `5h 12m` / `2d 7h`). Complementa el existente `H. fondeo` (hora absoluta). Tick cada 60 s.
|
|
92
|
+
- **Nuevo widget**: `+` — siempre fijo en el borde derecho de la barra (usa `order:9999` + re-append explícito al DOM tras reordenar), sin `data-bb-cell` para que el CRUD de orden no lo toque. Click abre directamente la configuración de widgets. Manejo de separador a medida: la celda anterior mantiene su divisor cuando existe el `+`, y el `+` nunca dibuja uno.
|
|
93
|
+
- Layout de la bottom-bar — `justify-content` cambiado de `flex-start` a `safe center` así los widgets se centran cuando caben y caen a flex-start si hay overflow; gap derecho reducido 12→4 px para eliminar el hueco visible al borde derecho.
|
|
94
|
+
|
|
95
|
+
**Panel AIS**
|
|
96
|
+
|
|
97
|
+
- Distancias del listado AIS y slider de radio AIS usan ahora el nuevo helper `unitFmt.distanceLand()`: métrico → `m`/`km`, imperial → `ft`/`mi`. Nunca `NM` aunque el sistema del usuario sea `metric_nautical` (un barco a 800 m se mostraba como `0.43 NM`, ilegible en contexto).
|
|
98
|
+
- Fila de toggles AIS (`AIS · Tracks · Alarma`) en vertical: cuando hace wrap a su propia línea se justifica a la IZQUIERDA (antes se pegaba a la derecha por `margin-left:auto` heredado del layout desktop).
|
|
99
|
+
|
|
100
|
+
**Mapa**
|
|
101
|
+
|
|
102
|
+
- Track propio del barco se pinta incluso cuando el GPS está extremadamente estable (RTK o quieto). Threshold bajado 0.5 → 0.2 m + keep-alive de 60 s para garantizar al menos un punto por minuto (mínimo de 2 que necesita `updateTrackGradient` para dibujar la polyline). Polylines del track movidas a un pane custom de Leaflet con `zIndex: 650` para que siempre pinten por encima de los tiles independientemente del z-order de las capas base; weight subido 3→5, opacidad .8→.95 para visibilidad sobre cartas raster oscuras.
|
|
103
|
+
|
|
104
|
+
**Modal Instrucciones (iframe)**
|
|
105
|
+
|
|
106
|
+
- Ocultado el `m-tv-header` huérfano (Atrás · Mareas · Curvas) cuando el iframe se abre desde el visor como `?embed=1` o `?showInstructions=1`. El padre ya inyecta su propio header naranja, así que el interior estaba duplicando.
|
|
107
|
+
|
|
108
|
+
**Otros**
|
|
109
|
+
|
|
110
|
+
- Revertido el intercambio accidental de icono en el botón Abrigo — tanto el botón del sidebar como el header del modal usan ahora 🏔️ (montaña) como pidió Carlos, ya no ⚓ (que entra en conflicto visual con el botón de fondear ancla).
|
|
111
|
+
- Modal de favoritos renombrado: "Listado de últimos fondeos y favoritos" → simplemente "Últimos fondeos" (el modal ya muestra dentro las secciones de favoritos y recientes; el título era redundante). El icono 📍 del menú hamburger se mantiene intacto.
|
|
112
|
+
|
|
113
|
+
## [2.3.3] - 2026-06-25
|
|
114
|
+
|
|
115
|
+
### English
|
|
116
|
+
|
|
117
|
+
- **README title cleanup** — removed the redundant `signalk-mareas-ihm —` prefix from the README heading. The page on npmjs.com now shows only the commercial name `AnchorWatch Pro: Smart Anchoring, AIS & Tides`. NPM keeps the package name (`signalk-mareas-ihm`) in its own metadata column, so duplicating it in the title was visual noise.
|
|
118
|
+
|
|
119
|
+
### Español
|
|
120
|
+
|
|
121
|
+
- **Limpieza del título del README** — quitado el prefijo redundante `signalk-mareas-ihm —` del encabezado del README. La página en npmjs.com ahora muestra solo el nombre comercial `AnchorWatch Pro: Smart Anchoring, AIS & Tides`. El nombre del paquete (`signalk-mareas-ihm`) ya lo enseña NPM en su propia columna de metadatos; duplicarlo en el título era ruido visual.
|
|
122
|
+
|
|
3
123
|
## [2.3.2] - 2026-06-24
|
|
4
124
|
|
|
5
125
|
### English
|
package/dist/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# AnchorWatch Pro: Smart Anchoring, AIS & Tides
|
|
2
2
|
|
|
3
3
|
**A complete anchor watch and marine safety webapp for Signal K.**
|
|
4
4
|
Intelligent anchor monitoring, voice alarms, AIS anti-collision with cross-session cache, shelter forecast, on-board wave measurement and IHM Spain tides — running on your OpenPlotter / Raspberry Pi.
|
package/dist/build-info.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2.3.
|
|
3
|
-
"timestamp": "
|
|
4
|
-
"gitHash": "
|
|
2
|
+
"version": "2.3.4",
|
|
3
|
+
"timestamp": "20260626-0833",
|
|
4
|
+
"gitHash": "9cd8e49",
|
|
5
5
|
"gitDirty": false,
|
|
6
|
-
"builtAt": "2026-06-
|
|
6
|
+
"builtAt": "2026-06-26T06:33:49.131Z"
|
|
7
7
|
}
|
package/dist/index.js
CHANGED
|
@@ -49,7 +49,7 @@ function isPositionValue(v) {
|
|
|
49
49
|
// timestamp + git hash so we can verify exactly which build is running on the Pi
|
|
50
50
|
// without ambiguity. ("¿Qué versión tengo deployada?" → /api/paths or landing.)
|
|
51
51
|
const PLUGIN_VERSION = esmRequire("../package.json").version;
|
|
52
|
-
const PLUGIN_REVISION = "
|
|
52
|
+
const PLUGIN_REVISION = "Rev562";
|
|
53
53
|
// Rev478 (C-17): schemaVersion=2. Introduce bloque `grounding` (FSM Physics/
|
|
54
54
|
// Config/Notification de Rev477) y `gpsAgeMs` (C-12). Frontend cacheado con
|
|
55
55
|
// expected=1 debe forzar reload. SERVER_INSTANCE_ID detecta restart vivo del
|
|
@@ -300,13 +300,14 @@ const MAX_SIDE_BUTTONS_PER_SIDE = 5;
|
|
|
300
300
|
/* Rev491 (feedback Vicente): añadidas dif_lw y prof_min a la whitelist del
|
|
301
301
|
backend. Sin esto, sanitizeBBOrder() las filtraba al guardar, haciendo que
|
|
302
302
|
no se pudieran reactivar tras desactivarlas en config. */
|
|
303
|
-
|
|
303
|
+
/* Rev556 (feedback Carlos #9c): añadido t_fondeo (tiempo transcurrido desde
|
|
304
|
+
el drop) como nueva celda persistible. */
|
|
305
|
+
const BB_CELL_KEYS = ["sog", "heading", "wind", "sonda", "dif_lw", "prof_min", "tide", "pres", "abrigo", "calidad", "cad_rec", "dist_ancla", "h_fondeo", "t_fondeo", "sunrise", "wx_6h", "wave"];
|
|
304
306
|
/* Rev535 (B-25, feedback Carlos 2026-06-24): nuevo default snapshot del orden
|
|
305
307
|
que Carlos tiene activo en Tunatunes. Sustituye al antiguo default que
|
|
306
308
|
añadía heading y pres (no relevantes en su uso) y omitía sunrise (sí útil).
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
const DEFAULT_BB_ORDER = ["sog", "wind", "sonda", "tide", "sunrise", "cad_rec", "dist_ancla", "h_fondeo", "calidad", "abrigo"];
|
|
309
|
+
Rev556: añadido t_fondeo tras h_fondeo. */
|
|
310
|
+
const DEFAULT_BB_ORDER = ["sog", "wind", "sonda", "tide", "sunrise", "cad_rec", "dist_ancla", "h_fondeo", "t_fondeo", "calidad", "abrigo"];
|
|
310
311
|
function sanitizeBBOrder(arr) {
|
|
311
312
|
if (!Array.isArray(arr))
|
|
312
313
|
return DEFAULT_BB_ORDER.slice();
|
|
@@ -2799,9 +2800,19 @@ export default function (app) {
|
|
|
2799
2800
|
// activa: 24h × 100 = 2400 puntos cómodos dentro del cap.
|
|
2800
2801
|
const TRACK_MAX_POINTS = 12000;
|
|
2801
2802
|
const TRACK_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
2802
|
-
|
|
2803
|
+
// Rev553 (feedback Carlos: trkPts=1 constante en visor): bajado threshold de
|
|
2804
|
+
// 0.5→0.2 m a baja velocidad. Con GPS muy estable y barco fondeado, el drift
|
|
2805
|
+
// típico cae por debajo de 0.5 m y nunca se añade un 2º punto al track (queda
|
|
2806
|
+
// el 1 inicial para siempre). 0.2 m está por encima del ruido sub-métrico de
|
|
2807
|
+
// un GPS doméstico (RMS ~0.5-1.5 m) — el ruido normal supera 0.2 sin problema.
|
|
2808
|
+
const TRACK_DIST_LOW_M = 0.2; // metres, at low speed
|
|
2803
2809
|
const TRACK_DIST_HIGH_M = 2.0; // metres, at cruise
|
|
2804
2810
|
const TRACK_SPEED_THRESHOLD_MS = 1.029; // ~2 kt in m/s
|
|
2811
|
+
// Rev553: keep-alive — forzar añadir punto cada 60 s independientemente del
|
|
2812
|
+
// threshold, para garantizar que el visor SIEMPRE vea track vivo. Si el GPS
|
|
2813
|
+
// está extremadamente fijo (e.g. RTK) y el drift es <0.2 m, sin keep-alive el
|
|
2814
|
+
// track se quedaría en 1 sólo punto histórico.
|
|
2815
|
+
const TRACK_KEEPALIVE_MS = 60 * 1000; // 60 seconds
|
|
2805
2816
|
let _trackPersistCounter = 0;
|
|
2806
2817
|
// anchorWatchIntervalId declared above (forward declaration for stop())
|
|
2807
2818
|
// Load anchor watch from cache
|
|
@@ -3175,8 +3186,13 @@ export default function (app) {
|
|
|
3175
3186
|
const last = trackPoints[trackPoints.length - 1];
|
|
3176
3187
|
if (last) {
|
|
3177
3188
|
const d = haversineM(last.lat, last.lng, bowLat, bowLng);
|
|
3178
|
-
|
|
3179
|
-
|
|
3189
|
+
const ageMs = Date.now() - last.t;
|
|
3190
|
+
// Rev553 (feedback Carlos: trkPts=1 constante): keep-alive — si pasa
|
|
3191
|
+
// > TRACK_KEEPALIVE_MS desde el último punto, añadir uno aunque la
|
|
3192
|
+
// distancia sea < threshold. Garantiza que el visor siempre tenga ≥2
|
|
3193
|
+
// puntos (requisito para que `updateTrackGradient` pinte la polyline).
|
|
3194
|
+
if (d < distThreshold && ageMs < TRACK_KEEPALIVE_MS)
|
|
3195
|
+
return;
|
|
3180
3196
|
}
|
|
3181
3197
|
trackPoints.push({ lat: bowLat, lng: bowLng, t: Date.now() });
|
|
3182
3198
|
// Rev319: nuevo track point → broadcast inmediato (no esperar al timer 3s).
|