@mxtommy/kip 4.2.0 → 4.4.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 (103) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.yml +84 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.yml +35 -0
  4. package/.github/copilot-instructions.md +1 -1
  5. package/.github/instructions/project.instructions.md +7 -1
  6. package/.github/workflows/ci.yml +37 -0
  7. package/CHANGELOG.md +10 -0
  8. package/package.json +42 -41
  9. package/plugin/index.js +2 -2
  10. package/public/3rdpartylicenses.txt +230 -76
  11. package/public/assets/svg/AtoN/cardinal/east_beacon.svg +21 -0
  12. package/public/assets/svg/AtoN/cardinal/east_mark.svg +30 -0
  13. package/public/assets/svg/AtoN/cardinal/north_beacon.svg +20 -0
  14. package/public/assets/svg/AtoN/cardinal/north_mark.svg +30 -0
  15. package/public/assets/svg/AtoN/cardinal/south_beacon.svg +20 -0
  16. package/public/assets/svg/AtoN/cardinal/south_mark.svg +30 -0
  17. package/public/assets/svg/AtoN/cardinal/west_beacon.svg +21 -0
  18. package/public/assets/svg/AtoN/cardinal/west_mark.svg +57 -0
  19. package/public/assets/svg/AtoN/dangerSafe/isolateddanger_beacon.svg +16 -0
  20. package/public/assets/svg/AtoN/dangerSafe/isolateddanger_mark.svg +30 -0
  21. package/public/assets/svg/AtoN/dangerSafe/safewater_beacon_.svg +15 -0
  22. package/public/assets/svg/AtoN/dangerSafe/safewater_mark.svg +43 -0
  23. package/public/assets/svg/AtoN/lateral/port_beacon.svg +6 -0
  24. package/public/assets/svg/AtoN/lateral/port_mark.svg +24 -0
  25. package/public/assets/svg/AtoN/lateral/port_prefered_beacon.svg +15 -0
  26. package/public/assets/svg/AtoN/lateral/port_prefered_mark.svg +44 -0
  27. package/public/assets/svg/AtoN/lateral/starboard_beacon.svg +6 -0
  28. package/public/assets/svg/AtoN/lateral/starboard_mark.svg +24 -0
  29. package/public/assets/svg/AtoN/lateral/starboard_prefered_beacon.svg +15 -0
  30. package/public/assets/svg/AtoN/lateral/starboard_prefered_mark.svg +48 -0
  31. package/public/assets/svg/AtoN/other/aton.svg +78 -0
  32. package/public/assets/svg/AtoN/other/basestation.svg +91 -0
  33. package/public/assets/svg/AtoN/other/unknown.svg +22 -0
  34. package/public/assets/svg/AtoN/special/special_beacon.svg +7 -0
  35. package/public/assets/svg/AtoN/special/special_mark.svg +20 -0
  36. package/public/assets/svg/Chart icons.md +28 -0
  37. package/public/assets/svg/aircraft/ais_sar-aircraft.svg +23 -0
  38. package/public/assets/svg/icons.svg +6 -0
  39. package/public/assets/svg/sar-distress-device/sart-eprib-mob.svg +35 -0
  40. package/public/assets/svg/vessel/buddy.svg +26 -0
  41. package/public/assets/svg/vessel/cargo.svg +20 -0
  42. package/public/assets/svg/vessel/diving-ops.svg +31 -0
  43. package/public/assets/svg/vessel/fishing.svg +20 -0
  44. package/public/assets/svg/vessel/highspeed.svg +24 -0
  45. package/public/assets/svg/vessel/law-enforcement.svg +24 -0
  46. package/public/assets/svg/vessel/military-ops.svg +60 -0
  47. package/public/assets/svg/vessel/other.svg +20 -0
  48. package/public/assets/svg/vessel/passenger.svg +20 -0
  49. package/public/assets/svg/vessel/pilot.svg +82 -0
  50. package/public/assets/svg/vessel/pleasurecraft.svg +20 -0
  51. package/public/assets/svg/vessel/sailing.svg +20 -0
  52. package/public/assets/svg/vessel/sar.svg +25 -0
  53. package/public/assets/svg/vessel/self.svg +67 -0
  54. package/public/assets/svg/vessel/stationary.svg +32 -0
  55. package/public/assets/svg/vessel/tanker.svg +20 -0
  56. package/public/assets/svg/vessel/tug.svg +20 -0
  57. package/public/assets/svg/vessel/unknown.svg +22 -0
  58. package/public/chunk-2KMYPGX4.js +2 -0
  59. package/public/{chunk-K6B4TD2H.js → chunk-4VUI3CY7.js} +2 -2
  60. package/public/{chunk-NL5QCOXT.js → chunk-5DLSQ773.js} +2 -2
  61. package/public/chunk-6OSCSQLJ.js +3 -0
  62. package/public/{chunk-5SCAJ637.js → chunk-7HLFWAA7.js} +1 -1
  63. package/public/chunk-BNIQFWQ6.js +62 -0
  64. package/public/chunk-C4OS6QP6.js +8 -0
  65. package/public/chunk-F7I3HKNJ.js +9 -0
  66. package/public/chunk-FGRB3BHZ.js +1 -0
  67. package/public/{chunk-XWOIVPRO.js → chunk-HJQQWPGC.js} +1 -1
  68. package/public/{chunk-FHQZULYJ.js → chunk-IWK4FHBL.js} +1 -1
  69. package/public/{chunk-2VPC34OU.js → chunk-J4IGUIZA.js} +6 -6
  70. package/public/{chunk-GDL5ORNF.js → chunk-KIR67PZ2.js} +1 -1
  71. package/public/chunk-KKJXPB75.js +8 -0
  72. package/public/chunk-MMIOUKLI.js +1 -0
  73. package/public/{chunk-WON6RAF5.js → chunk-PDYVZHOK.js} +1 -1
  74. package/public/chunk-PESXPDBT.js +2 -0
  75. package/public/chunk-PKATAZA2.js +1 -0
  76. package/public/chunk-PSF2OKKT.js +1 -0
  77. package/public/chunk-TGGJAGV7.js +15 -0
  78. package/public/chunk-TKC7ROZ7.js +4 -0
  79. package/public/{chunk-UUOWRIVR.js → chunk-UVAQADRE.js} +1 -1
  80. package/public/chunk-VH4ZIU4T.js +4 -0
  81. package/public/chunk-XEJJOWK6.js +2 -0
  82. package/public/chunk-YYXDMH5J.js +53 -0
  83. package/public/index.html +2 -2
  84. package/public/main-WAAIS2M6.js +1 -0
  85. package/public/polyfills-L4FJGPOC.js +2 -0
  86. package/public/{styles-7VM4HXM4.css → styles-DYEO23GZ.css} +1 -1
  87. package/public/chunk-36RQFRQN.js +0 -4
  88. package/public/chunk-3KBT35BP.js +0 -3
  89. package/public/chunk-4NAXE7SZ.js +0 -9
  90. package/public/chunk-6X3BMVOP.js +0 -8
  91. package/public/chunk-7SK25B6D.js +0 -1
  92. package/public/chunk-ATH26UZ7.js +0 -1
  93. package/public/chunk-CX4O7M4U.js +0 -63
  94. package/public/chunk-DWMZAC65.js +0 -1
  95. package/public/chunk-FGMEEOZH.js +0 -5
  96. package/public/chunk-MOEZSWFX.js +0 -15
  97. package/public/chunk-PJZLX3XW.js +0 -2
  98. package/public/chunk-PNFBM2CP.js +0 -1
  99. package/public/chunk-PVUOCOI5.js +0 -53
  100. package/public/chunk-SP4UPLYW.js +0 -4
  101. package/public/chunk-Y5TQMH7M.js +0 -2
  102. package/public/main-CRPMOYEB.js +0 -4
  103. package/public/polyfills-GNK4EEYZ.js +0 -2
@@ -0,0 +1,84 @@
1
+ name: Bug Report
2
+ description: Report a bug or issue
3
+ title: "[Bug]: "
4
+ labels: ["bug"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for reporting a bug! Please provide the following information to help us investigate.
10
+
11
+ - type: dropdown
12
+ id: operating-system
13
+ attributes:
14
+ label: Operating System
15
+ description: Which operating system(s) are you using?
16
+ multiple: true
17
+ options:
18
+ - Raspberry Pi OS
19
+ - macOS
20
+ - iOS
21
+ - Windows
22
+ - Linux
23
+ - Android
24
+ - Other
25
+ validations:
26
+ required: true
27
+
28
+ - type: dropdown
29
+ id: browser
30
+ attributes:
31
+ label: Browser
32
+ description: Which browser(s) are you using?
33
+ multiple: true
34
+ options:
35
+ - Chromium
36
+ - Chrome
37
+ - Safari
38
+ - Edge
39
+ - Firefox
40
+ - Brave
41
+ - Opera
42
+ - Other
43
+ validations:
44
+ required: true
45
+
46
+ - type: input
47
+ id: kip-version
48
+ attributes:
49
+ label: KIP Version
50
+ description: What version of Kip are you using (Found in Settings -> Options -> Connectivity)?
51
+ placeholder: e.g., v2.5.1
52
+ validations:
53
+ required: true
54
+
55
+ - type: input
56
+ id: signalk-version
57
+ attributes:
58
+ label: Signal K Server Version
59
+ description: What version of Signal K server are you using?
60
+ placeholder: e.g., v2.5.1
61
+ validations:
62
+ required: false
63
+
64
+ - type: textarea
65
+ id: bug-description
66
+ attributes:
67
+ label: Bug Description
68
+ description: A clear and concise description of what the bug is - What did you expect, what actually happened and any other context about the problem here, including screenshots, logs, or error messages.
69
+ placeholder: What happened?
70
+ validations:
71
+ required: true
72
+
73
+ - type: textarea
74
+ id: steps-to-reproduce
75
+ attributes:
76
+ label: Steps to Reproduce
77
+ description: Steps to reproduce the behavior
78
+ placeholder: |
79
+ 1. Go to '...'
80
+ 2. Click on '....'
81
+ 3. Scroll down to '....'
82
+ 4. See error
83
+ validations:
84
+ required: true
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Community Support (Discord)
4
+ url: https://discord.gg/AMDYT2DQga
5
+ about: Please ask questions and discuss ideas in near real time here
@@ -0,0 +1,35 @@
1
+ name: Feature Request
2
+ description: Suggest a new feature or enhancement
3
+ title: "[Feature]: "
4
+ labels: ["enhancement"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for suggesting a feature! Please provide details below.
10
+
11
+ - type: textarea
12
+ id: feature-request
13
+ attributes:
14
+ label: Feature Request
15
+ description: |
16
+ Please describe the feature you'd like to see:
17
+ - What problem does this solve? What are you trying to accomplish?
18
+ - Provide a clear description of what you'd like to see added or changed.
19
+ placeholder: |
20
+ **Problem/Use Case:**
21
+ Describe what you're trying to accomplish...
22
+
23
+ **Proposed Solution:**
24
+ Describe how you envision this feature working...
25
+ validations:
26
+ required: true
27
+
28
+ - type: textarea
29
+ id: concepts-ideas-research
30
+ attributes:
31
+ label: Concepts, Ideas & Research
32
+ description: Add any other information, screenshots, mockups, links similar apps or existing documentation about the feature request here.
33
+ placeholder: Paste links, mockups, screenshots or related documentation to help us come up with a good and informed design...
34
+ validations:
35
+ required: false
@@ -129,7 +129,7 @@ Template:
129
129
 
130
130
  ## Project specifics & gotchas
131
131
  - Always respect serve path /@mxtommy/kip/ (dev/prod). Assets and routing assume this base.
132
- - CommonJS deps are explicitly allowed (howler, js-quantities). Avoid introducing new CJS without adding to allowedCommonJsDependencies.
132
+ - CommonJS deps are explicitly allowed (js-quantities). Avoid introducing new CJS without adding to allowedCommonJsDependencies.
133
133
  - Use standalone components, signals, @if/@for; follow .github/instructions/angular.instructions.md for style.
134
134
  - Widget config UIs live under src/app/widget-config; path controls use custom validators (no Validators.required). Respect isPathConfigurable and pathRequired.
135
135
 
@@ -113,7 +113,13 @@ All major services in `src/app/core/services/` are summarized below for Copilot
113
113
 
114
114
  - **NotificationsService (`notifications.service.ts`)**
115
115
  - Key methods: Notification state management, audio/visual alerts, muting.
116
- - Dependencies: AppSettingsService, DataService, SignalkRequestsService, Howler.
116
+ - Dependencies: AppSettingsService, DataService, SignalkRequestsService.
117
+
118
+ - **ToastService (`toast.service.ts`)**
119
+ - Purpose: In-app snackbars using Angular Material.
120
+ - Key methods: `show(message, duration = 1500, silent = true, action = 'Dismiss', severity = 'message')`.
121
+ - Dependencies: MatSnackBar, AppSettingsService.
122
+ - Usage: Use for short, user-visible feedback (login errors, PUT failures, success confirmations). Sound is suppressed when `silent=true` or user sound settings disable audio.
117
123
 
118
124
  - **CanvasService (`canvas.service.ts`)**
119
125
  - Purpose: Provides drawing and rendering utilities for widgets and dashboard components.
@@ -0,0 +1,37 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, master, develop ]
6
+ pull_request:
7
+ branches: [ main, master, develop ]
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+
13
+ strategy:
14
+ matrix:
15
+ node-version: [20.x, 22.x]
16
+
17
+ steps:
18
+ - name: Checkout repository
19
+ uses: actions/checkout@v4
20
+
21
+ - name: Setup Node.js ${{ matrix.node-version }}
22
+ uses: actions/setup-node@v4
23
+ with:
24
+ node-version: ${{ matrix.node-version }}
25
+ cache: 'npm'
26
+
27
+ - name: Install dependencies
28
+ run: npm i
29
+
30
+ - name: Lint
31
+ run: npm run lint
32
+
33
+ - name: Run tests
34
+ run: npm run test:headless
35
+
36
+ - name: Build All (Webapp & Plugin)
37
+ run: npm run build:all
package/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ # v4.3.0
2
+ ## New Features
3
+ * New signalk-anchoralarm-plugin (by Scott Bender) embedded widget to surface its features and make anchor setting and monitoring fast and easy.
4
+ ## Improvements
5
+ * Added a Simple Wind mode in Windsteer (a popular request) to mimic classic instruments. Toggle “Enable Advanced Compass Mode” off to lock the dial to +/- 180° and keep indicators stable. Fixes #828
6
+ * New high‑impact snackbar templates with inform/warn/alert layouts, bold colors, and icons that make different app message types instantly recognizable.
7
+ ## Fixes
8
+ * Racesteer (beta): corrected tack/gybe angle, indicator reference, and layline calculations for better precision. Fixes #858
9
+ * Fixed occasional double‑fire on long‑press gestures (reduced extra processing).
10
+ * Prevented duplicate app events from async PUT responses (reduced extra processing).
1
11
  # v4.2.0
2
12
  ## New Features
3
13
  * Multi State Switch widget: Take control of multi‑mode devices (chargers, inverters, and more) with a clear state list that highlights the active mode and lets you switch states with a tap. Fixes #404
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxtommy/kip",
3
- "version": "4.2.0",
3
+ "version": "4.4.0-beta.1",
4
4
  "description": "An advanced and versatile marine instrumentation package to display Signal K data.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -55,47 +55,24 @@
55
55
  },
56
56
  "schematics": "tools/schematics/collection.json",
57
57
  "devDependencies": {
58
- "@angular-devkit/build-angular": "^21.1.0",
58
+ "@angular-devkit/build-angular": "^21.1.4",
59
59
  "@angular-devkit/schematics-cli": "^20.1.6",
60
- "@angular/animations": "21.1.0",
61
- "@angular/build": "^21.1.0",
62
- "@angular/cdk": "21.1.0",
63
- "@angular/cli": "^21.1.0",
64
- "@angular/common": "21.1.0",
65
- "@angular/compiler": "21.1.0",
66
- "@angular/compiler-cli": "21.1.0",
67
- "@angular/core": "21.1.0",
68
- "@angular/forms": "21.1.0",
69
- "@angular/language-service": "21.1.0",
70
- "@angular/material": "21.1.0",
71
- "@angular/platform-browser": "21.1.0",
72
- "@angular/platform-browser-dynamic": "21.1.0",
73
- "@angular/router": "21.1.0",
74
- "@godind/ng-canvas-gauges": "^6.2.1",
60
+ "@angular/build": "^21.1.4",
61
+ "@angular/cli": "^21.1.4",
62
+ "@angular/compiler-cli": "21.1.4",
63
+ "@angular/language-service": "21.1.4",
75
64
  "@types/canvas-gauges": "^2.1.8",
76
- "@types/howler": "^2.2.10",
77
65
  "@types/jasmine": "~3.6.0",
78
66
  "@types/jasminewd2": "^2.0.9",
79
67
  "@types/js-quantities": "^1.6.6",
80
68
  "@types/lodash-es": "^4.17.9",
81
69
  "@types/node": "^24.1.0",
82
- "@zakj/no-sleep": "^0.13.5",
83
- "angular-eslint": "21.1.0",
84
- "chart.js": "^4.5.1",
85
- "@aziham/chartjs-plugin-streaming": "^3.5.1",
86
- "chartjs-adapter-date-fns": "^3.0.0",
87
- "chartjs-plugin-annotation": "^3.0.1",
88
- "clipboard": "^2.0.11",
70
+ "@types/d3": "^7.4.3",
71
+ "angular-eslint": "21.2.0",
89
72
  "codelyzer": "^6.0.0",
90
- "compare-versions": "^6.1.1",
91
- "core-js": "^3.13.1",
92
- "date-fns": "^2.30.0",
93
73
  "eslint": "^9.29.0",
94
- "gridstack": "^12.3.3",
95
- "howler": "^2.2.4",
96
74
  "jasmine-core": "~4.0.1",
97
75
  "jasmine-spec-reporter": "~5.0.0",
98
- "js-quantities": "^1.8.0",
99
76
  "karma": "^6.4.4",
100
77
  "karma-chrome-launcher": "~3.1.0",
101
78
  "karma-cli": "~2.0.0",
@@ -103,22 +80,46 @@
103
80
  "karma-jasmine": "~4.0.0",
104
81
  "karma-jasmine-html-reporter": "^1.6.0",
105
82
  "karma-spec-reporter": "^0.0.36",
106
- "lodash-es": "^4.17.21",
107
83
  "ng-packagr": "^21.0.1",
108
- "ngx-markdown": "^21.0.1",
109
- "prismjs": "^1.30.0",
110
84
  "protractor": "~7.0.0",
111
85
  "pwa-asset-generator": "^8.1.1",
112
- "rxjs": "^7.8.2",
113
86
  "sass": "^1.49.9",
114
- "screenfull": "^6.0.2",
115
- "steelseries": "^2.0.9",
116
87
  "ts-node": "^10.9.2",
117
- "tslib": "^2.6.2",
118
- "typescript": "^5.9.3",
119
- "zone.js": "^0.15.1"
88
+ "typescript": "^5.9.3"
120
89
  },
121
90
  "dependencies": {
122
- "@signalk/server-api": "^2.7.2"
91
+ "@angular/animations": "21.1.4",
92
+ "@angular/cdk": "21.1.4",
93
+ "@angular/common": "21.1.4",
94
+ "@angular/compiler": "21.1.4",
95
+ "@angular/core": "21.1.4",
96
+ "@angular/forms": "21.1.4",
97
+ "@angular/material": "21.1.4",
98
+ "@angular/platform-browser": "21.1.4",
99
+ "@angular/platform-browser-dynamic": "21.1.4",
100
+ "@angular/router": "21.1.4",
101
+ "@aziham/chartjs-plugin-streaming": "^3.5.1",
102
+ "@godind/ng-canvas-gauges": "^6.2.1",
103
+ "@zakj/no-sleep": "^0.13.5",
104
+ "chart.js": "^4.5.1",
105
+ "chartjs-adapter-date-fns": "^3.0.0",
106
+ "chartjs-plugin-annotation": "^3.0.1",
107
+ "clipboard": "^2.0.11",
108
+ "compare-versions": "^6.1.1",
109
+ "core-js": "^3.13.1",
110
+ "d3": "^7.9.0",
111
+ "date-fns": "^2.30.0",
112
+ "gridstack": "^12.3.3",
113
+ "js-quantities": "^1.8.0",
114
+ "lodash-es": "^4.17.23",
115
+ "ngx-markdown": "^21.0.1",
116
+ "prismjs": "^1.30.0",
117
+ "rxjs": "^7.8.2",
118
+ "screenfull": "^6.0.2",
119
+ "steelseries": "^2.0.9",
120
+ "tslib": "^2.6.2",
121
+ "zone.js": "^0.15.1",
122
+ "@signalk/server-api": "^2.7.2",
123
+ "@spanaaj/sk-ais-status-plugin": "^1.0.0"
123
124
  }
124
125
  }
package/plugin/index.js CHANGED
@@ -57,12 +57,12 @@ const start = (server) => {
57
57
  const want = `displays.${displayId}${tail}`;
58
58
  const full = server.getSelfPath(want);
59
59
  server.debug(`getDisplaySelfPath: displayId: ${displayId}, suffix: ${suffix}, want=${want}, fullPath=${JSON.stringify(full)}`);
60
- return full ? full : undefined;
60
+ return typeof full === 'object' && full !== null ? full : undefined;
61
61
  }
62
62
  function getAvailableDisplays() {
63
63
  const fullPath = server.getSelfPath('displays');
64
64
  server.debug(`getAvailableDisplays: fullPath=${JSON.stringify(fullPath)}`);
65
- return fullPath ? fullPath : undefined;
65
+ return typeof fullPath === 'object' && fullPath !== null ? fullPath : undefined;
66
66
  }
67
67
  function pathToDotNotation(path) {
68
68
  const dottedPath = path.replace(/\//g, '.').replace(/^\./, '');