@mxtommy/kip 4.8.4 → 4.9.0-beta.1

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 (68) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/package.json +2 -2
  3. package/plugin/history-series.service.js +637 -0
  4. package/plugin/index.js +1322 -0
  5. package/plugin/kip-series-contract.js +31 -0
  6. package/plugin/openApi.json +855 -0
  7. package/plugin/sqlite-history-storage.service.js +1124 -0
  8. package/public/3rdpartylicenses.txt +78 -78
  9. package/public/assets/help-docs/ais-radar.md +261 -0
  10. package/public/assets/help-docs/dashboards.md +1 -1
  11. package/public/assets/help-docs/kiosk.md +4 -2
  12. package/public/assets/help-docs/menu.json +17 -2
  13. package/public/{chunk-CIGP2YJm.js → chunk-5jtM3b20.js} +1 -1
  14. package/public/{chunk-_zRMMvCu.js → chunk-B1H8b4W3.js} +1 -1
  15. package/public/{chunk-BJ-wyixK.js → chunk-BJObkbow.js} +1 -1
  16. package/public/{chunk-C6b8CVno.js → chunk-BLEfD_P7.js} +1 -1
  17. package/public/{chunk-BLEZOsfR.js → chunk-BO34LrGA.js} +1 -1
  18. package/public/{chunk-BeM64etA.js → chunk-BSNfaGK3.js} +1 -1
  19. package/public/{chunk-07zHjmg-.js → chunk-BbE36LU3.js} +1 -1
  20. package/public/{chunk-JhFkJS7i.js → chunk-BoY2UDvb.js} +1 -1
  21. package/public/{chunk-x7L6DXVK.js → chunk-BrjwTjz7.js} +1 -1
  22. package/public/{chunk-BFpzxIIT.js → chunk-BufDbUf3.js} +1 -1
  23. package/public/{chunk-C_OZJltF.js → chunk-C11zYqw7.js} +1 -1
  24. package/public/{chunk-CLs_NL1y.js → chunk-C8uxDv1M.js} +1 -1
  25. package/public/{chunk-DIl1k00y.js → chunk-CDG3g9Eq.js} +1 -1
  26. package/public/{chunk-q9NoPvcx.js → chunk-CEtt0kr-.js} +1 -1
  27. package/public/{chunk-BpcNrtxJ.js → chunk-CKnQ07BR.js} +1 -1
  28. package/public/{chunk-0z3nIRXw.js → chunk-COM48ir-.js} +1 -1
  29. package/public/{chunk-eQ1pa34Q.js → chunk-CSCVkGWE.js} +1 -1
  30. package/public/{chunk-BuvyF0y5.js → chunk-C_mCGLT_.js} +1 -1
  31. package/public/{chunk-BUguZ7cK.js → chunk-CnVELVOx.js} +1 -1
  32. package/public/{chunk-CLTHuhlN.js → chunk-Csxy6yVz.js} +1 -1
  33. package/public/{chunk-BZx964-p.js → chunk-CvG4thmf.js} +1 -1
  34. package/public/{chunk-CCfhzpE8.js → chunk-CxOyBrqL.js} +1 -1
  35. package/public/{chunk-otzyItXL.js → chunk-CzY2nk08.js} +1 -1
  36. package/public/{chunk-D-_-GUVr.js → chunk-CzquTNBp.js} +1 -1
  37. package/public/{chunk-ibauGmSP.js → chunk-D59G2Xua.js} +1 -1
  38. package/public/chunk-D8CQ-x45.js +1 -0
  39. package/public/{chunk-BTOTKeBo.js → chunk-DA2JBQHi.js} +1 -1
  40. package/public/chunk-DCdZRAXa.js +1 -0
  41. package/public/{chunk-BN7A4g6c.js → chunk-DES7U9G6.js} +1 -1
  42. package/public/{chunk-BIb-xYiS.js → chunk-DHj2hm9r.js} +1 -1
  43. package/public/{chunk-DPnbM-aB.js → chunk-DJVnrrxC.js} +1 -1
  44. package/public/{chunk-CxPx4NZv.js → chunk-DN6HP97P.js} +1 -1
  45. package/public/{chunk-COI6IBXH.js → chunk-DTznNQod.js} +1 -1
  46. package/public/{chunk-szQs8fiq.js → chunk-DZQzZeIV.js} +1 -1
  47. package/public/{chunk-DTN-sa1K.js → chunk-DakdT7bi.js} +1 -1
  48. package/public/{chunk-CHAFm_nM.js → chunk-DizMY7FW.js} +1 -1
  49. package/public/{chunk-OeQDZKFO.js → chunk-DjPkdMGz.js} +1 -1
  50. package/public/{chunk-BfiyH3nV.js → chunk-DlLiKS0n.js} +1 -1
  51. package/public/{chunk-CYYBxjrc.js → chunk-Dt2HCrSr.js} +1 -1
  52. package/public/{chunk-CyVRpGoJ.js → chunk-Duhmjpm9.js} +1 -1
  53. package/public/{chunk-B9nVBlGj.js → chunk-DulH4zwM.js} +1 -1
  54. package/public/{chunk-B09jfNia.js → chunk-DwAXe6Wn.js} +1 -1
  55. package/public/{chunk-CoCQ3DW2.js → chunk-DxD20B-E.js} +1 -1
  56. package/public/{chunk-DmkAKXR1.js → chunk-DzQ_fUpO.js} +1 -1
  57. package/public/{chunk-B0eE4udE.js → chunk-GyA81uXZ.js} +1 -1
  58. package/public/{chunk-Co2wVrD6.js → chunk-GzqVKhHm.js} +1 -1
  59. package/public/{chunk-BjINKQ03.js → chunk-MPbL1AwE.js} +1 -1
  60. package/public/{chunk-CQMVIDcp.js → chunk-Qlya07CF.js} +1 -1
  61. package/public/{chunk-CXvWM_vF.js → chunk-VshNFG3q.js} +1 -1
  62. package/public/{chunk-DUEKoZhd.js → chunk-YBp9CH_2.js} +1 -1
  63. package/public/{chunk-D1HYfaL_.js → chunk-_S08GvV8.js} +1 -1
  64. package/public/{chunk-B0D54iJs.js → chunk-dvm9QV-B.js} +1 -1
  65. package/public/{chunk-D2953Rfp.js → chunk-ipFM9wbJ.js} +1 -1
  66. package/public/index.html +1 -1
  67. package/public/{main-YKDNK5VZ.js → main-IINF7HD6.js} +473 -473
  68. package/public/chunk-Do8wqING.js +0 -1
@@ -352,6 +352,84 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
352
352
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
353
353
  THE SOFTWARE.
354
354
 
355
+ --------------------------------------------------------------------------------
356
+ Package: lodash-es
357
+ License: "MIT"
358
+
359
+ Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
360
+
361
+ Based on Underscore.js, copyright Jeremy Ashkenas,
362
+ DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
363
+
364
+ This software consists of voluntary contributions made by many
365
+ individuals. For exact contribution history, see the revision history
366
+ available at https://github.com/lodash/lodash
367
+
368
+ The following license applies to all parts of this software except as
369
+ documented below:
370
+
371
+ ====
372
+
373
+ Permission is hereby granted, free of charge, to any person obtaining
374
+ a copy of this software and associated documentation files (the
375
+ "Software"), to deal in the Software without restriction, including
376
+ without limitation the rights to use, copy, modify, merge, publish,
377
+ distribute, sublicense, and/or sell copies of the Software, and to
378
+ permit persons to whom the Software is furnished to do so, subject to
379
+ the following conditions:
380
+
381
+ The above copyright notice and this permission notice shall be
382
+ included in all copies or substantial portions of the Software.
383
+
384
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
385
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
386
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
387
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
388
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
389
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
390
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
391
+
392
+ ====
393
+
394
+ Copyright and related rights for sample code are waived via CC0. Sample
395
+ code is defined as all source code displayed within the prose of the
396
+ documentation.
397
+
398
+ CC0: http://creativecommons.org/publicdomain/zero/1.0/
399
+
400
+ ====
401
+
402
+ Files located in the node_modules and vendor directories are externally
403
+ maintained libraries used by this software which have their own
404
+ licenses; we recommend you read them, as their terms may differ from the
405
+ terms above.
406
+
407
+ --------------------------------------------------------------------------------
408
+ Package: compare-versions
409
+ License: "MIT"
410
+
411
+ The MIT License (MIT)
412
+
413
+ Copyright (c) 2015-2021 Ole Michelsen
414
+
415
+ Permission is hereby granted, free of charge, to any person obtaining a copy
416
+ of this software and associated documentation files (the "Software"), to deal
417
+ in the Software without restriction, including without limitation the rights
418
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
419
+ copies of the Software, and to permit persons to whom the Software is
420
+ furnished to do so, subject to the following conditions:
421
+
422
+ The above copyright notice and this permission notice shall be included in all
423
+ copies or substantial portions of the Software.
424
+
425
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
426
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
427
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
428
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
429
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
430
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
431
+ SOFTWARE.
432
+
355
433
  --------------------------------------------------------------------------------
356
434
  Package: marked
357
435
  License: "MIT"
@@ -492,84 +570,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
492
570
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
493
571
  THE SOFTWARE.
494
572
 
495
- --------------------------------------------------------------------------------
496
- Package: lodash-es
497
- License: "MIT"
498
-
499
- Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
500
-
501
- Based on Underscore.js, copyright Jeremy Ashkenas,
502
- DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
503
-
504
- This software consists of voluntary contributions made by many
505
- individuals. For exact contribution history, see the revision history
506
- available at https://github.com/lodash/lodash
507
-
508
- The following license applies to all parts of this software except as
509
- documented below:
510
-
511
- ====
512
-
513
- Permission is hereby granted, free of charge, to any person obtaining
514
- a copy of this software and associated documentation files (the
515
- "Software"), to deal in the Software without restriction, including
516
- without limitation the rights to use, copy, modify, merge, publish,
517
- distribute, sublicense, and/or sell copies of the Software, and to
518
- permit persons to whom the Software is furnished to do so, subject to
519
- the following conditions:
520
-
521
- The above copyright notice and this permission notice shall be
522
- included in all copies or substantial portions of the Software.
523
-
524
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
525
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
526
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
527
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
528
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
529
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
530
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
531
-
532
- ====
533
-
534
- Copyright and related rights for sample code are waived via CC0. Sample
535
- code is defined as all source code displayed within the prose of the
536
- documentation.
537
-
538
- CC0: http://creativecommons.org/publicdomain/zero/1.0/
539
-
540
- ====
541
-
542
- Files located in the node_modules and vendor directories are externally
543
- maintained libraries used by this software which have their own
544
- licenses; we recommend you read them, as their terms may differ from the
545
- terms above.
546
-
547
- --------------------------------------------------------------------------------
548
- Package: compare-versions
549
- License: "MIT"
550
-
551
- The MIT License (MIT)
552
-
553
- Copyright (c) 2015-2021 Ole Michelsen
554
-
555
- Permission is hereby granted, free of charge, to any person obtaining a copy
556
- of this software and associated documentation files (the "Software"), to deal
557
- in the Software without restriction, including without limitation the rights
558
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
559
- copies of the Software, and to permit persons to whom the Software is
560
- furnished to do so, subject to the following conditions:
561
-
562
- The above copyright notice and this permission notice shall be included in all
563
- copies or substantial portions of the Software.
564
-
565
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
566
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
567
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
568
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
569
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
570
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
571
- SOFTWARE.
572
-
573
573
  --------------------------------------------------------------------------------
574
574
  Package: @angular/router
575
575
  License: "MIT"
@@ -0,0 +1,261 @@
1
+ ## AIS Radar Widget
2
+
3
+ > **WARNING - FOR SITUATIONAL AWARENESS ONLY**
4
+ > AIS widget data (including collision risk and target information) can be delayed, incomplete, incorrect, or unavailable.
5
+ > This feature provides **no safety guarantee** and must be used **at your own risk**.
6
+ > It is **not** a replacement for proper seamanship, safe navigation practices, collision regulations, visual/radar watchkeeping, or prudent decision making.
7
+
8
+ The AIS Radar widget shows nearby AIS targets around your own-ship position using range rings, target icons, motion vectors, and target details.
9
+
10
+ This page explains:
11
+ - Widget buttons and what they do
12
+ - Widget options and filters
13
+ - Target icon colors, styles and state behaviors
14
+ - Full target icon catalog
15
+
16
+ ## Data Requirements
17
+
18
+ > AIS data must be available in the Signal K server for the widget to function correctly. This usually means using compatible AIS hardware receiver or connecting to a Virtual AIS service over the internet with a Server Connection of type WebSocket.
19
+
20
+ If the KIP Connection option does not include `Subscribe to remote source message such as AIS and DSC targets.`, the widget warns that AIS data is disabled and asks you to enable remote source subscription in Settings / Options.
21
+
22
+ The Derived Data plugin must be installed, enabled and it's Traffic section options must be configured with attention to provide collision risk information.
23
+
24
+ ## Buttons And Actions
25
+
26
+ ### On-widget buttons
27
+
28
+ | Button | Location | What it does |
29
+ |---|---|---|
30
+ | View mode toggle | Top-right | Switches between Course Up and North Up view orientation. |
31
+ | Range + | Right side | Zooms in by selecting a smaller range ring index. |
32
+ | Range - | Right side | Zooms out by selecting a larger range ring index. |
33
+ | Filter list | Top-left | Opens target filtering menu (category and vessel-type filters). |
34
+ | Collision shortcut | Left side under filter | Toggles Show only collision-risk targets mode when risk data is available. |
35
+
36
+ > Collision-risk shortcut button visibility depends on incoming closest-approach data. If no target provides collisionRiskRating, the collision quick-filter button is not shown.
37
+
38
+ ### Target interaction
39
+
40
+ | Action | Result |
41
+ |---|---|
42
+ | Tap or click one visible target | Opens target detail dialog directly. |
43
+ | Tap or click where multiple targets overlap | Opens a target picker menu so you can select which target to inspect. |
44
+ | Tap or click background | Clears selection and closes target menu. |
45
+
46
+ ### Target detail dialog
47
+
48
+ The dialog includes information based on target type such as: COG, SOG, HDG, ROT, CPA/TCPA, destination, IDs, position, off-position and freshness
49
+
50
+ ## How To Read Radar Targets
51
+
52
+ ---
53
+
54
+ Most AIS users will want to understand this first: each target combines a base icon and extra visual cues.
55
+
56
+ 1. **Icon shape** tells you what kind of target it is.
57
+ 2. **State look** tells you if data is fresh and reliable.
58
+ 3. **Risk glow** tells you if attention is needed now.
59
+ 4. **Motion vector** tells you where the target is going.
60
+
61
+ ### Target states explanation
62
+
63
+ Supported statuses:
64
+ - Confirmed
65
+ - Unconfirmed
66
+ - Lost
67
+ - Remove
68
+
69
+ What that means on screen:
70
+ - **Confirmed**: normal target look.
71
+ - **Unconfirmed**: same icon shape, but looks faded/lower confidence.
72
+ - **Lost**: same icon shape, also shown as faded/lower confidence.
73
+ - **Remove**: target disappears from the radar.
74
+
75
+ Important behavior note:
76
+ - **Lost** uses the same visual styling family as **unconfirmed**.
77
+
78
+ ### State cue rules (opacity)
79
+
80
+ - **Unconfirmed or lost**: icon appears faded (have less opacity than confirmed targets).
81
+ - **Confirmed**: icon appears solid.
82
+
83
+ ### Risk cue rules (glow)
84
+
85
+ Collision risk glow appears only on **moving, confirmed** targets:
86
+ - **Red glow**: higher risk
87
+ - **Yellow glow**: lower risk
88
+ - **No glow**: no current risk emphasis
89
+
90
+ ### Anchored or moored nav state (transparent / no fill color)
91
+
92
+ Anchored/moored targets are shown as **stationary vessel targets**.
93
+
94
+ Important:
95
+ - There is **no special anchor badge/icon** added on top of the vessel symbol.
96
+
97
+ What to look for:
98
+ - The vessel icon is still present (normal vessel type icon).
99
+ - When a vessel is **confirmed** and reports **anchored/moored** state, the icon fill color is rendered **transparent** (the icon only has an outline).
100
+ - It usually has **no motion vector**.
101
+ - It typically has **no collision glow** unless movement/risk data says otherwise.
102
+
103
+ Important limitation:
104
+ - Anchored/moored is a **reported nav state**. Some vessels do not report it consistently, some never do.
105
+ - A vessel can be operationally moored/anchored but still appear as a normal confirmed vessel if that state is not transmitted.
106
+ - Anchored/moored nav state is commonly reported by commercial vessels (cargo, tanker, passenger ship), but it is not typical for other types of vessels.
107
+
108
+
109
+ How to interpret in practice:
110
+ - If nav state is missing, use movement clues: a persistent no/very short vector and stable position usually suggest moored/anchored behavior.
111
+
112
+ ### Own-ship vector rules
113
+
114
+ Own ship shows an orange dashed vector when own COG and SOG are available and own-ship icon display is enabled.
115
+
116
+ ## Widget Options
117
+
118
+ ---
119
+
120
+ After you understand the visual cues above, use these options to tune what you see.
121
+
122
+ The widget is configured in the Options dialog under the Display and Filter tabs.
123
+
124
+ ### Display and range options
125
+
126
+ | Option | Values | Effect |
127
+ |---|---|---|
128
+ | View Mode | North Up, Course Up | Controls map orientation and target rotation behavior. |
129
+ | Fully Visible Rings Range | 1, 3, 6, 12, 24, 48 miles | Sets active range index for ring scale. |
130
+ | Show own ship icon | On or Off | Shows or hides the own-ship center icon. |
131
+
132
+ ### Vector and target visibility options
133
+
134
+ | Option | Values | Effect |
135
+ |---|---|---|
136
+ | Plot target COG vector | On or Off | Draws target motion vectors for moving vessel-like targets. |
137
+ | COG plot length (minutes) | Numeric | Sets projection length for motion vectors (of Plot target COG vector). |
138
+ | Show unconfirmed targets | On or Off | Includes or hides unconfirmed targets. |
139
+ | Show lost targets | On or Off | Includes or hides lost targets. |
140
+
141
+ ### Filter tab options
142
+
143
+ | Filter | Effect |
144
+ |---|---|
145
+ | Anchored/Moored | Hides stationary vessel-like targets (anchored or moored). |
146
+ | All AtoN | Hides all aids-to-navigation targets. |
147
+ | All but SAR | Hides every target except SAR targets. |
148
+ | All Vessels | Hides all vessel-like targets. |
149
+ | Vessel Type list | Hides selected vessel icon categories only. |
150
+
151
+ ### Runtime quick filter note
152
+
153
+ The collision quick-filter button toggles a noCollisionRisk runtime filter in the widget. This option is intentionally runtime-only in the widget UI and is not exposed as a checkbox in the Filter tab.
154
+
155
+ ## Full Target Icon Catalog
156
+
157
+ ---
158
+
159
+ ### Icon Selection Rules
160
+
161
+ Icon selection uses target type and AIS metadata:
162
+ - Vessel and SAR: selected from AIS ship type range mapping
163
+ - AtoN: selected from AtoN type id mapping (cardinal, lateral, special, danger/safe, other)
164
+ - Basestation: dedicated basestation icon
165
+ - Distress beacons: MMSI prefixes map to SART, MOB, EPIRB beacon icons
166
+
167
+ Distress beacon MMSI prefixes:
168
+ - 970 -> SART icon
169
+ - 972 -> MOB icon
170
+ - 974 -> EPIRB icon
171
+
172
+ ### Vessel icons
173
+
174
+
175
+ | Key | Preview | Typical use |
176
+ |---|---|---|
177
+ | vessel/fishing | ![vessel fishing](assets/svg/vessel/fishing.svg) | AIS ship type 30 |
178
+ | vessel/diving | ![vessel diving](assets/svg/vessel/diving-ops.svg) | AIS ship type 34 |
179
+ | vessel/military | ![vessel military](assets/svg/vessel/military-ops.svg) | AIS ship type 35 |
180
+ | vessel/sailing | ![vessel sailing](assets/svg/vessel/sailing.svg) | AIS ship type 36 |
181
+ | vessel/pleasurecraft | ![vessel pleasurecraft](assets/svg/vessel/pleasurecraft.svg) | AIS ship type 37 |
182
+ | vessel/highspeed | ![vessel highspeed](assets/svg/vessel/highspeed.svg) | AIS ship type 20-29, 40-49 |
183
+ | vessel/pilot | ![vessel pilot](assets/svg/vessel/pilot.svg) | AIS ship type 50 |
184
+ | vessel/sar | ![vessel sar](assets/svg/vessel/sar.svg) | SAR (Search And Rescue) target type and AIS ship type 51 |
185
+ | vessel/tug | ![vessel tug](assets/svg/vessel/tug.svg) | AIS ship type 31-33, 52-54, 58-59 |
186
+ | vessel/law | ![vessel law](assets/svg/vessel/law-enforcement.svg) | AIS ship type 55 |
187
+ | vessel/passenger | ![vessel passenger](assets/svg/vessel/passenger.svg) | AIS ship type 60-69 |
188
+ | vessel/cargo | ![vessel cargo](assets/svg/vessel/cargo.svg) | AIS ship type 70-79 |
189
+ | vessel/tanker | ![vessel tanker](assets/svg/vessel/tanker.svg) | AIS ship type 80-89 |
190
+ | vessel/other | ![vessel other](assets/svg/vessel/other.svg) | Generic fallback and multiple reserved ship-type ranges |
191
+ | vessel/unknown | ![vessel unknown](assets/svg/vessel/unknown.svg) | Unknown vessel fallback by type |
192
+ | vessel/spare | ![vessel spare](assets/svg/vessel/other.svg) | Spare category in filter set (shares other.svg) |
193
+
194
+ ### Aid to Navigation (AtoN) icons
195
+
196
+ #### Cardinal
197
+
198
+ | Key | Preview | Description |
199
+ |---|---|---|
200
+ | aton/north-beacon | ![aton north beacon](assets/svg/AtoN/cardinal/north_beacon.svg) | Cardinal north beacon target. |
201
+ | aton/north-mark | ![aton north mark](assets/svg/AtoN/cardinal/north_mark.svg) | Cardinal north mark target. |
202
+ | aton/east-beacon | ![aton east beacon](assets/svg/AtoN/cardinal/east_beacon.svg) | Cardinal east beacon target. |
203
+ | aton/east-mark | ![aton east mark](assets/svg/AtoN/cardinal/east_mark.svg) | Cardinal east mark target. |
204
+ | aton/south-beacon | ![aton south beacon](assets/svg/AtoN/cardinal/south_beacon.svg) | Cardinal south beacon target. |
205
+ | aton/south-mark | ![aton south mark](assets/svg/AtoN/cardinal/south_mark.svg) | Cardinal south mark target. |
206
+ | aton/west-beacon | ![aton west beacon](assets/svg/AtoN/cardinal/west_beacon.svg) | Cardinal west beacon target. |
207
+ | aton/west-mark | ![aton west mark](assets/svg/AtoN/cardinal/west_mark.svg) | Cardinal west mark target. |
208
+
209
+ #### Lateral
210
+
211
+ | Key | Preview | Description |
212
+ |---|---|---|
213
+ | aton/port-beacon | ![aton port beacon](assets/svg/AtoN/lateral/port_beacon.svg) | Port-hand lateral beacon target. |
214
+ | aton/port-mark | ![aton port mark](assets/svg/AtoN/lateral/port_mark.svg) | Port-hand lateral mark target. |
215
+ | aton/starboard-beacon | ![aton starboard beacon](assets/svg/AtoN/lateral/starboard_beacon.svg) | Starboard-hand lateral beacon target. |
216
+ | aton/starboard-mark | ![aton starboard mark](assets/svg/AtoN/lateral/starboard_mark.svg) | Starboard-hand lateral mark target. |
217
+ | aton/port-preferred-beacon | ![aton port preferred beacon](assets/svg/AtoN/lateral/port_prefered_beacon.svg) | Preferred-channel-to-port beacon target. |
218
+ | aton/port-preferred-mark | ![aton port preferred mark](assets/svg/AtoN/lateral/port_prefered_mark.svg) | Preferred-channel-to-port mark target. |
219
+ | aton/starboard-preferred-beacon | ![aton starboard preferred beacon](assets/svg/AtoN/lateral/starboard_prefered_beacon.svg) | Preferred-channel-to-starboard beacon target. |
220
+ | aton/starboard-preferred-mark | ![aton starboard preferred mark](assets/svg/AtoN/lateral/starboard_prefered_mark.svg) | Preferred-channel-to-starboard mark target. |
221
+
222
+ #### Special and danger/safe
223
+
224
+ | Key | Preview | Description |
225
+ |---|---|---|
226
+ | aton/special-beacon | ![aton special beacon](assets/svg/AtoN/special/special_beacon.svg) | Special-purpose beacon target. |
227
+ | aton/special-mark | ![aton special mark](assets/svg/AtoN/special/special_mark.svg) | Special-purpose mark target. |
228
+ | aton/isolateddanger-beacon | ![aton isolated danger beacon](assets/svg/AtoN/dangerSafe/isolateddanger_beacon.svg) | Isolated danger beacon target. |
229
+ | aton/isolateddanger-mark | ![aton isolated danger mark](assets/svg/AtoN/dangerSafe/isolateddanger_mark.svg) | Isolated danger mark target. |
230
+ | aton/safewater-beacon | ![aton safewater beacon](assets/svg/AtoN/dangerSafe/safewater_beacon_.svg) | Safe-water beacon target. |
231
+ | aton/safewater-mark | ![aton safewater mark](assets/svg/AtoN/dangerSafe/safewater_mark.svg) | Safe-water mark target. |
232
+
233
+ #### Other and infrastructure
234
+
235
+ | Key | Preview | Description |
236
+ |---|---|---|
237
+ | aton/other | ![aton other](assets/svg/AtoN/other/aton.svg) | Generic AtoN fallback target. |
238
+ | aton/basestation | ![aton basestation](assets/svg/AtoN/other/basestation.svg) | Shore basestation target symbol. |
239
+ | aton/unknown | ![aton unknown](assets/svg/AtoN/other/unknown.svg) | Unknown AtoN fallback target. |
240
+
241
+ ### Distress beacon icons
242
+
243
+ | Key | Preview | MMSI prefix | Description |
244
+ |---|---|---|---|
245
+ | beacon/sart | ![beacon sart](assets/svg/sar-distress-device/sart-eprib-mob.svg) | 970 | Search and rescue transponder beacon target. |
246
+ | beacon/mob | ![beacon mob](assets/svg/sar-distress-device/sart-eprib-mob.svg) | 972 | Man overboard beacon target. |
247
+ | beacon/epirb | ![beacon epirb](assets/svg/sar-distress-device/sart-eprib-mob.svg) | 974 | Emergency position-indicating beacon target. |
248
+
249
+ ### Own-ship icon
250
+
251
+ The center own-ship icon uses its own dedicated asset and is not part of remote target classification.
252
+
253
+ | Key | Preview |
254
+ |---|---|
255
+ | vessel/self | ![vessel self](assets/svg/vessel/self.svg) |
256
+
257
+ ## See Also
258
+
259
+ - [Managing Dashboards](#/help/dashboards.md)
260
+ - [Data Inspector](#/help/datainspector.md)
261
+ - [Chartplotter Mode](#/help/chartplotter.md)
@@ -87,7 +87,7 @@ KIP widgets turn Signal K data into readable visuals and controls. Available wid
87
87
  - **Freeboard-SK** – Adds the Freeboard-SK chart plotter as a widget with automatic sign-in.
88
88
  - **Autopilot Head** – Typical autopilot controls for compatible Signal K Autopilot devices.
89
89
  - **Realtime Data Chart** – Visualizes data on a real-time chart with actuals, averages, and min/max.
90
- - **AIS Radar**: Display AIS targets with range rings, interactive target details, and quick zoom and filtering controls.
90
+ - **AIS Radar**: Display AIS targets with range rings, interactive target details, and quick zoom and filtering controls. See [AIS Radar Widget](#/help/ais-radar.md).
91
91
  - **Embed Webpage Viewer** – Embeds external web apps (Grafana, Node-RED, etc.) into your dashboard.
92
92
  - **Racesteer** – Race steering display fusing polar performance data with live conditions for optimal tactics.
93
93
  - **Racer - Start Line Insight** – Set and adjust start line ends, see distance, favored end, and line bias; integrates with Freeboard SK.
@@ -96,12 +96,14 @@ exec "$BROWSER" \
96
96
  --enable-features=OverlayScrollbar \
97
97
  --autoplay-policy=no-user-gesture-required \
98
98
  --check-for-update-interval=31536000 \
99
+ --overscroll-history-navigation=0 \
99
100
  --app="$URL"
100
101
  ```
102
+ > PRO TIP : Browsers have native edge swipe gestures (swipes that starts from the very edges of the browser window). It triggers back and forth browser history page navigation. KIP posseses defensive code replacing the history page navigation with a KIP sidebar open/close operation. It's not 100% perfect all the time. The --overscroll-history-navigation=0 launch parameter disables the browser native gestures completly.
101
103
 
102
104
  Optionally, you can also add the following `exec "BROWSER" \` flags:
103
105
 
104
- Force Chromium to keep all threads active and not optimyze resource usage
106
+ Tell Chromium to keep all threads actives.
105
107
  ```bash
106
108
  --disable-background-timer-throttling \
107
109
  --disable-renderer-backgrounding \
@@ -121,7 +123,7 @@ Save, then:
121
123
  sudo chmod +x /home/pi/kiosk.sh
122
124
  ```
123
125
 
124
- Tip: You can override the URL without editing the script using:
126
+ > Tip: You can override the URL without editing the script using:
125
127
  ```
126
128
  URL="http://signalk.local:3000/@mxtommy/kip/#/page/0" /home/pi/kiosk.sh
127
129
  ```
@@ -2,11 +2,26 @@
2
2
  { "title": "The basics", "file": "welcome.md" },
3
3
  { "title": "Login & Configurations", "file": "configuration.md" },
4
4
  { "title": "Dashboards and Layout", "file": "dashboards.md" },
5
- { "title": "Data Inspector", "file": "datainspector.md" },
6
- { "title": "Chartplotter Mode", "file": "chartplotter.md" },
5
+ {
6
+ "title": "Widgets",
7
+ "items": [
8
+ {
9
+ "title": "AIS Radar",
10
+ "file": "ais-radar.md"
11
+ }
12
+ ]
13
+ },
14
+ {
15
+ "title": "Chartplotter Mode",
16
+ "file": "chartplotter.md"
17
+ },
7
18
  { "title": "Zones, Notifications and Highlights", "file": "zones.md" },
8
19
  { "title": "Digital Switching and PUT", "file": "putcontrols.md" },
9
20
  { "title": "Historical Widget Data", "file": "time-series.md" },
21
+ {
22
+ "title": "Data Inspector",
23
+ "file": "datainspector.md"
24
+ },
10
25
  {
11
26
  "title": "Integrations",
12
27
  "items": [
@@ -1,4 +1,4 @@
1
- import {w as w$1,n as G$1,N,i as ir,W as Wp,E as Em,D as Dt,J as JD,y as yt,b as wt,O as Op,o as eu,p as R,r as f,P as Pi,k as Qh,u as ul,T as TT,c as $h,e as EE,t as pT,B as Bh,x as DA,a as G$2,A as re,C as Ff,H as Dr,I as zA,L as Fp,S as ca,U as Kh,V as L,X as xw,Y as Aw,Z as TI,a0 as _,a1 as vA,a2 as Jt,a3 as Xt$1,a4 as Zt$1,a5 as st,_ as _w,M as Mw,a6 as Lr,a7 as Gj,a8 as H,a9 as ru,aa as N$1,ab as te,ac as Mr,ad as Qe,ae as be,af as Tu,ag as bu,ah as nn,ai as Ar,aj as zm,ak as nw,al as Zj,am as LT,an as Hh,s as sg,ao as ue,ap as Ki,aq as Bn,ar as S,as as ke$1,at as Tp,au as be$1,av as _t,aw as Cu,ax as ry,ay as lv,az as Yj,h as Fw,l as ud,g as qw,m as dd,aA as gg,d as ig,aB as gr,aC as L$1,aD as Ce$1,aE as Sr,v as vt,aF as Pr,aG as tD,aH as j,aI as ms,aJ as wm,aK as wr,aL as me,aM as At$1,aN as wt$1}from'./main-YKDNK5VZ.js';function Pe(o){let t=o.cloneNode(true),e=t.querySelectorAll("[id]"),i=o.nodeName.toLowerCase();t.removeAttribute("id");for(let n=0;n<e.length;n++)e[n].removeAttribute("id");return i==="canvas"?Tt(o,t):(i==="input"||i==="select"||i==="textarea")&&It(o,t),Rt("canvas",o,t,Tt),Rt("input, textarea, select",o,t,It),t}function Rt(o,t,e,i){let n=t.querySelectorAll(o);if(n.length){let s=e.querySelectorAll(o);for(let r=0;r<n.length;r++)i(n[r],s[r]);}}var si=0;function It(o,t){t.type!=="file"&&(t.value=o.value),t.type==="radio"&&t.name&&(t.name=`mat-clone-${t.name}-${si++}`);}function Tt(o,t){let e=t.getContext("2d");if(e)try{e.drawImage(o,0,0);}catch(i){}}function Te(o){let t=o.getBoundingClientRect();return {top:t.top,right:t.right,bottom:t.bottom,left:t.left,width:t.width,height:t.height,x:t.x,y:t.y}}function ye(o,t,e){let{top:i,bottom:n,left:s,right:r}=o;return e>=i&&e<=n&&t>=s&&t<=r}function oi(o,t){let e=t.left<o.left,i=t.left+t.width>o.right,n=t.top<o.top,s=t.top+t.height>o.bottom;return e||i||n||s}function G(o,t,e){o.top+=t,o.bottom=o.top+o.height,o.left+=e,o.right=o.left+o.width;}function kt(o,t,e,i){let{top:n,right:s,bottom:r,left:a,width:l,height:d}=o,h=l*t,v=d*t;return i>n-v&&i<r+v&&e>a-h&&e<s+h}var X=class{_document;positions=new Map;constructor(t){this._document=t;}clear(){this.positions.clear();}cache(t){this.clear(),this.positions.set(this._document,{scrollPosition:this.getViewportScrollPosition()}),t.forEach(e=>{this.positions.set(e,{scrollPosition:{top:e.scrollTop,left:e.scrollLeft},clientRect:Te(e)});});}handleScroll(t){let e=me(t),i=this.positions.get(e);if(!i)return null;let n=i.scrollPosition,s,r;if(e===this._document){let d=this.getViewportScrollPosition();s=d.top,r=d.left;}else s=e.scrollTop,r=e.scrollLeft;let a=n.top-s,l=n.left-r;return this.positions.forEach((d,h)=>{d.clientRect&&e!==h&&e.contains(h)&&G(d.clientRect,a,l);}),n.top=s,n.left=r,{top:a,left:l}}getViewportScrollPosition(){return {top:window.scrollY,left:window.scrollX}}};function Wt(o,t){let e=o.rootNodes;if(e.length===1&&e[0].nodeType===t.ELEMENT_NODE)return e[0];let i=t.createElement("div");return e.forEach(n=>i.appendChild(n)),i}function ke(o,t,e){for(let i in t)if(t.hasOwnProperty(i)){let n=t[i];n?o.setProperty(i,n,e?.has(i)?"important":""):o.removeProperty(i);}return o}function A(o,t){let e=t?"":"none";ke(o.style,{"touch-action":t?"":"none","-webkit-user-drag":t?"":"none","-webkit-tap-highlight-color":t?"":"transparent","user-select":e,"-ms-user-select":e,"-webkit-user-select":e,"-moz-user-select":e});}function Ot(o,t,e){ke(o.style,{position:t?"":"fixed",top:t?"":"0",opacity:t?"":"0",left:t?"":"-999em"},e);}function J(o,t){return t&&t!="none"?o+" "+t:o}function Mt(o,t){o.style.width=`${t.width}px`,o.style.height=`${t.height}px`,o.style.transform=$(t.left,t.top);}function $(o,t){return `translate3d(${Math.round(o)}px, ${Math.round(t)}px, 0)`}var V={capture:true},we={passive:false,capture:true},ri=(()=>{class o{static \u0275fac=function(i){return new(i||o)};static \u0275cmp=JD({type:o,selectors:[["ng-component"]],hostAttrs:["cdk-drag-resets-container",""],decls:0,vars:0,template:function(i,n){},styles:[`@layer cdk-resets {
1
+ import {w as w$1,n as G$1,N,i as ir,W as Wp,E as Em,D as Dt,J as JD,y as yt,b as wt,O as Op,o as eu,p as R,r as f,P as Pi,k as Qh,u as ul,T as TT,c as $h,e as EE,t as pT,B as Bh,x as DA,a as G$2,A as re,C as Ff,H as Dr,I as zA,L as Fp,S as ca,U as Kh,V as L,X as xw,Y as Aw,Z as TI,a0 as _,a1 as vA,a2 as Jt,a3 as Xt$1,a4 as Zt$1,a5 as st,_ as _w,M as Mw,a6 as Lr,a7 as Gj,a8 as H,a9 as ru,aa as N$1,ab as te,ac as Mr,ad as Qe,ae as be,af as Tu,ag as bu,ah as nn,ai as Ar,aj as zm,ak as nw,al as Zj,am as LT,an as Hh,s as sg,ao as ue,ap as Ki,aq as Bn,ar as S,as as ke$1,at as Tp,au as be$1,av as _t,aw as Cu,ax as ry,ay as lv,az as Yj,h as Fw,l as ud,g as qw,m as dd,aA as gg,d as ig,aB as gr,aC as L$1,aD as Ce$1,aE as Sr,v as vt,aF as Pr,aG as tD,aH as j,aI as ms,aJ as wm,aK as wr,aL as me,aM as At$1,aN as wt$1}from'./main-IINF7HD6.js';function Pe(o){let t=o.cloneNode(true),e=t.querySelectorAll("[id]"),i=o.nodeName.toLowerCase();t.removeAttribute("id");for(let n=0;n<e.length;n++)e[n].removeAttribute("id");return i==="canvas"?Tt(o,t):(i==="input"||i==="select"||i==="textarea")&&It(o,t),Rt("canvas",o,t,Tt),Rt("input, textarea, select",o,t,It),t}function Rt(o,t,e,i){let n=t.querySelectorAll(o);if(n.length){let s=e.querySelectorAll(o);for(let r=0;r<n.length;r++)i(n[r],s[r]);}}var si=0;function It(o,t){t.type!=="file"&&(t.value=o.value),t.type==="radio"&&t.name&&(t.name=`mat-clone-${t.name}-${si++}`);}function Tt(o,t){let e=t.getContext("2d");if(e)try{e.drawImage(o,0,0);}catch(i){}}function Te(o){let t=o.getBoundingClientRect();return {top:t.top,right:t.right,bottom:t.bottom,left:t.left,width:t.width,height:t.height,x:t.x,y:t.y}}function ye(o,t,e){let{top:i,bottom:n,left:s,right:r}=o;return e>=i&&e<=n&&t>=s&&t<=r}function oi(o,t){let e=t.left<o.left,i=t.left+t.width>o.right,n=t.top<o.top,s=t.top+t.height>o.bottom;return e||i||n||s}function G(o,t,e){o.top+=t,o.bottom=o.top+o.height,o.left+=e,o.right=o.left+o.width;}function kt(o,t,e,i){let{top:n,right:s,bottom:r,left:a,width:l,height:d}=o,h=l*t,v=d*t;return i>n-v&&i<r+v&&e>a-h&&e<s+h}var X=class{_document;positions=new Map;constructor(t){this._document=t;}clear(){this.positions.clear();}cache(t){this.clear(),this.positions.set(this._document,{scrollPosition:this.getViewportScrollPosition()}),t.forEach(e=>{this.positions.set(e,{scrollPosition:{top:e.scrollTop,left:e.scrollLeft},clientRect:Te(e)});});}handleScroll(t){let e=me(t),i=this.positions.get(e);if(!i)return null;let n=i.scrollPosition,s,r;if(e===this._document){let d=this.getViewportScrollPosition();s=d.top,r=d.left;}else s=e.scrollTop,r=e.scrollLeft;let a=n.top-s,l=n.left-r;return this.positions.forEach((d,h)=>{d.clientRect&&e!==h&&e.contains(h)&&G(d.clientRect,a,l);}),n.top=s,n.left=r,{top:a,left:l}}getViewportScrollPosition(){return {top:window.scrollY,left:window.scrollX}}};function Wt(o,t){let e=o.rootNodes;if(e.length===1&&e[0].nodeType===t.ELEMENT_NODE)return e[0];let i=t.createElement("div");return e.forEach(n=>i.appendChild(n)),i}function ke(o,t,e){for(let i in t)if(t.hasOwnProperty(i)){let n=t[i];n?o.setProperty(i,n,e?.has(i)?"important":""):o.removeProperty(i);}return o}function A(o,t){let e=t?"":"none";ke(o.style,{"touch-action":t?"":"none","-webkit-user-drag":t?"":"none","-webkit-tap-highlight-color":t?"":"transparent","user-select":e,"-ms-user-select":e,"-webkit-user-select":e,"-moz-user-select":e});}function Ot(o,t,e){ke(o.style,{position:t?"":"fixed",top:t?"":"0",opacity:t?"":"0",left:t?"":"-999em"},e);}function J(o,t){return t&&t!="none"?o+" "+t:o}function Mt(o,t){o.style.width=`${t.width}px`,o.style.height=`${t.height}px`,o.style.transform=$(t.left,t.top);}function $(o,t){return `translate3d(${Math.round(o)}px, ${Math.round(t)}px, 0)`}var V={capture:true},we={passive:false,capture:true},ri=(()=>{class o{static \u0275fac=function(i){return new(i||o)};static \u0275cmp=JD({type:o,selectors:[["ng-component"]],hostAttrs:["cdk-drag-resets-container",""],decls:0,vars:0,template:function(i,n){},styles:[`@layer cdk-resets {
2
2
  .cdk-drag-preview {
3
3
  background: none;
4
4
  border: none;