@mxtommy/kip 4.0.7 → 4.0.8

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 (54) hide show
  1. package/CHANGELOG.md +24 -2
  2. package/package.json +7 -7
  3. package/plugin/index.js +64 -13
  4. package/plugin/openApi.json +104 -10
  5. package/public/3rdpartylicenses.txt +40 -26
  6. package/public/assets/help-docs/chartplotter.md +7 -5
  7. package/public/assets/help-docs/img/splitdeviderhandle.png +0 -0
  8. package/public/{chunk-OQULS6SV.js → chunk-25K5UKIG.js} +1 -1
  9. package/public/chunk-2RRFLW2A.js +6 -0
  10. package/public/{chunk-QZJKBIMY.js → chunk-3IHN3F2F.js} +1 -1
  11. package/public/{chunk-35577QTX.js → chunk-5J45GHJL.js} +8 -8
  12. package/public/chunk-7WYM6C2I.js +2 -0
  13. package/public/chunk-A4XOH2JB.js +2 -0
  14. package/public/{chunk-BMDGKBYM.js → chunk-D3HZY3RH.js} +26 -26
  15. package/public/{chunk-HIADZ4BV.js → chunk-EUOABORK.js} +1 -1
  16. package/public/chunk-EZBRSRC3.js +5 -0
  17. package/public/chunk-H2DHJL6G.js +1 -0
  18. package/public/chunk-K3PZVMR4.js +1 -0
  19. package/public/chunk-KOSE6NNC.js +2 -0
  20. package/public/chunk-N6VRQ7HL.js +1 -0
  21. package/public/chunk-NWLJFLDZ.js +1 -0
  22. package/public/chunk-OEN7LNCQ.js +1 -0
  23. package/public/{chunk-52M2PJJL.js → chunk-PBI4FJBK.js} +1 -1
  24. package/public/{chunk-QVCMARCU.js → chunk-Q75Q4FPK.js} +2 -2
  25. package/public/chunk-QX5JJUOQ.js +1 -0
  26. package/public/chunk-R6WZJ2K2.js +52 -0
  27. package/public/chunk-RLA7XOJJ.js +15 -0
  28. package/public/{chunk-RYHOAWDD.js → chunk-UO7XNPX3.js} +1 -1
  29. package/public/chunk-WI4OAWC5.js +3 -0
  30. package/public/chunk-X4QUO4GZ.js +1 -0
  31. package/public/chunk-XMBRLDKM.js +3 -0
  32. package/public/{chunk-SZ2GUIT5.js → chunk-ZE7TMIMY.js} +1 -1
  33. package/public/index.html +1 -1
  34. package/public/main-XLFXH5R4.js +5 -0
  35. package/public/{polyfills-HMJGV7SQ.js → polyfills-C5VXBGWL.js} +1 -1
  36. package/rm-npmjs-beta.sh +50 -0
  37. package/public/chunk-2DBQEP6W.js +0 -6
  38. package/public/chunk-4NJ3ZL5U.js +0 -1
  39. package/public/chunk-AB255PKD.js +0 -2
  40. package/public/chunk-BISZS3TE.js +0 -3
  41. package/public/chunk-D2CYLQZF.js +0 -1
  42. package/public/chunk-DADLXEYG.js +0 -1
  43. package/public/chunk-F5X5MWHG.js +0 -0
  44. package/public/chunk-IJ22WXFB.js +0 -1
  45. package/public/chunk-JCVEDDSQ.js +0 -2
  46. package/public/chunk-KZW5Z46K.js +0 -1
  47. package/public/chunk-NDOR4O4J.js +0 -1
  48. package/public/chunk-OB3QLUH6.js +0 -15
  49. package/public/chunk-PKKBBIJK.js +0 -3
  50. package/public/chunk-QLTN6G6E.js +0 -5
  51. package/public/chunk-ROD2YZ6L.js +0 -52
  52. package/public/chunk-TIWUK3AU.js +0 -1
  53. package/public/chunk-XDPHEQEO.js +0 -2
  54. package/public/main-NJAW6UFC.js +0 -5
package/CHANGELOG.md CHANGED
@@ -1,10 +1,32 @@
1
+ # v4.0.8
2
+ ## Improvements
3
+ * Enhanced the Remote Control experience:
4
+ * Automatically selects the first available remote instance.
5
+ * Supports dashboard tile selection using the Enter and Spacebar keys.
6
+ * Better keyboard support with Enter/Spacebar actions on the:
7
+ * Dashboard selection in the sidebar navigation.
8
+ * Dashboard tiles configuration in the Settings page.
9
+ * Improved chart smoothness by reintroducing chart streaming in:
10
+ * Data Chart widget
11
+ * Numeric widget’s background chart.
12
+ * Added one-click path copy to clipboard in the Data Inspector, facilitating path pasting in widget configuration.
13
+ * Simplified widget development.
14
+ ## Fixes
15
+ * Occasional dashboard jumping when using the Remote Control feature. Fixes #899
16
+ * Issue where switching remote-controlled dashboards while the target was in edit mode could overwrite the dashboard. Fixes #899
17
+ * Updated Windsteer widget “Next Waypoint” indicator path to use the course provider. Fixes #886
18
+ * Fixed Radial, Linear, and Compass widget rendering issues when smaller than 8px.
19
+ * Configurations page layout not fully expanding on large displays. Fixes #874
20
+ * Widgets overlapping others on creation when space was available but smaller than the widget’s minimum size. Fixes #843
21
+ * Fixed form submission required field validation on the Options page Display tab.
22
+ * Added “No configuration is required for this plugin.” to the KIP plugin configuration section to better set expectations.
1
23
  # v 4.0.7
2
24
  ## Improvements
3
25
  * Return to last active dashboard when leaving Options, Settings and Help
4
26
  * Reduce minichart dataset storage churn
5
27
  ## Fixes
6
- * Fixe gauge zones not drawn in initial app load
7
- * More Switch Panel toggle control not responding to touch on Android and RPi Chromium fixes
28
+ * Gauge zones not drawn in initial app load
29
+ * More Switch Panel toggle control not responding to touch on Android Chrome and RPi Chromium
8
30
  * Widget Racesteer icon rendering is missing colors
9
31
  # v 4.0.6
10
32
  ## Fixes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxtommy/kip",
3
- "version": "4.0.7",
3
+ "version": "4.0.8",
4
4
  "description": "An advanced and versatile marine instrumentation package to display Signal K data.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -55,8 +55,8 @@
55
55
  },
56
56
  "schematics": "tools/schematics/collection.json",
57
57
  "devDependencies": {
58
- "@angular-devkit/schematics-cli": "^20.1.6",
59
58
  "@angular-devkit/build-angular": "^20.1.6",
59
+ "@angular-devkit/schematics-cli": "^20.1.6",
60
60
  "@angular/animations": "20.1.7",
61
61
  "@angular/build": "^20.1.6",
62
62
  "@angular/cdk": "20.1.6",
@@ -72,7 +72,6 @@
72
72
  "@angular/platform-browser-dynamic": "20.1.7",
73
73
  "@angular/router": "20.1.7",
74
74
  "@godind/ng-canvas-gauges": "^6.2.1",
75
- "@robloche/chartjs-plugin-streaming": "^3.1.0",
76
75
  "@types/canvas-gauges": "^2.1.8",
77
76
  "@types/howler": "^2.2.10",
78
77
  "@types/jasmine": "~3.6.0",
@@ -82,9 +81,11 @@
82
81
  "@types/node": "^24.1.0",
83
82
  "@zakj/no-sleep": "^0.13.5",
84
83
  "angular-eslint": "20.1.1",
85
- "chart.js": "^4.4.9",
84
+ "chart.js": "^4.5.1",
85
+ "@aziham/chartjs-plugin-streaming": "^3.5.1",
86
86
  "chartjs-adapter-date-fns": "^3.0.0",
87
87
  "chartjs-plugin-annotation": "^3.0.1",
88
+ "clipboard": "^2.0.11",
88
89
  "codelyzer": "^6.0.0",
89
90
  "compare-versions": "^6.1.1",
90
91
  "core-js": "^3.13.1",
@@ -96,18 +97,17 @@
96
97
  "jasmine-spec-reporter": "~5.0.0",
97
98
  "js-quantities": "^1.8.0",
98
99
  "karma": "^6.4.4",
99
- "karma-spec-reporter": "^0.0.36",
100
100
  "karma-chrome-launcher": "~3.1.0",
101
101
  "karma-cli": "~2.0.0",
102
102
  "karma-coverage": "^2.2.0",
103
103
  "karma-jasmine": "~4.0.0",
104
104
  "karma-jasmine-html-reporter": "^1.6.0",
105
+ "karma-spec-reporter": "^0.0.36",
105
106
  "lodash-es": "^4.17.21",
106
107
  "ng-packagr": "^20.0.1",
107
108
  "ngx-markdown": "^20.0.0",
108
- "prismjs": "^1.30.0",
109
- "clipboard": "^2.0.11",
110
109
  "ngx-resize-observer": "^3.1.0",
110
+ "prismjs": "^1.30.0",
111
111
  "protractor": "~7.0.0",
112
112
  "pwa-asset-generator": "^8.1.1",
113
113
  "rxjs": "^7.8.2",
package/plugin/index.js CHANGED
@@ -39,7 +39,17 @@ const start = (server) => {
39
39
  const API_PATHS = {
40
40
  DISPLAYS: `/displays`,
41
41
  INSTANCE: `/displays/:displayId`,
42
- ACTIVE_SCREEN: `/displays/:displayId/activeScreen`
42
+ ACTIVE_SCREEN: `/displays/:displayId/screenIndex`,
43
+ CHANGE_SCREEN: `/displays/:displayId/activeScreen`
44
+ };
45
+ const CONFIG_SCHEMA = {
46
+ properties: {
47
+ notifications: {
48
+ type: 'object',
49
+ title: 'Remote Control',
50
+ description: 'This plugin requires no configuration.'
51
+ }
52
+ }
43
53
  };
44
54
  // Helpers
45
55
  function getDisplaySelfPath(displayId, suffix) {
@@ -80,14 +90,9 @@ const start = (server) => {
80
90
  const msg = 'Stopped.';
81
91
  server.setPluginStatus(msg);
82
92
  },
83
- schema: () => {
84
- return {
85
- type: "object",
86
- properties: {}
87
- };
88
- },
93
+ schema: () => CONFIG_SCHEMA,
89
94
  registerWithRouter(router) {
90
- server.debug(`Registering plugin routes: ${API_PATHS.DISPLAYS}, ${API_PATHS.INSTANCE}, ${API_PATHS.ACTIVE_SCREEN}`);
95
+ server.debug(`Registering plugin routes: ${API_PATHS.DISPLAYS}, ${API_PATHS.INSTANCE}, ${API_PATHS.ACTIVE_SCREEN}, ${API_PATHS.CHANGE_SCREEN}`);
91
96
  // Validate/normalize :displayId where present
92
97
  router.param('displayId', (req, res, next, displayId) => {
93
98
  if (displayId == null)
@@ -179,8 +184,34 @@ const start = (server) => {
179
184
  return sendFail(res, 400, error.message);
180
185
  }
181
186
  });
187
+ router.put(`${API_PATHS.CHANGE_SCREEN}`, async (req, res) => {
188
+ server.debug(`** PUT ${API_PATHS.CHANGE_SCREEN}. Params: ${JSON.stringify(req.params)} Body: ${JSON.stringify(req.body)}`);
189
+ try {
190
+ const dottedPath = pathToDotNotation(req.path);
191
+ server.debug(`Updating SK path ${dottedPath} with body.screenIdx`);
192
+ server.handleMessage(plugin.id, {
193
+ updates: [
194
+ {
195
+ values: [
196
+ {
197
+ path: dottedPath,
198
+ value: req.body.screenIdx !== undefined ? req.body.screenIdx : null
199
+ }
200
+ ]
201
+ }
202
+ ]
203
+ }, server_api_1.SKVersion.v1);
204
+ return res.status(200).json({ state: 'SUCCESS', statusCode: 200 });
205
+ }
206
+ catch (error) {
207
+ const msg = `HandleMessage failed with errors!`;
208
+ server.setPluginError(msg);
209
+ server.error(`Error in HandleMessage: ${error}`);
210
+ return sendFail(res, 400, error.message);
211
+ }
212
+ });
182
213
  router.get(API_PATHS.DISPLAYS, (req, res) => {
183
- server.debug(`** GET ${API_PATHS.DISPLAYS}. Params: ${JSON.stringify(req.params)}`);
214
+ server.debug(`*** GET DISPLAY ${API_PATHS.DISPLAYS}. Params: ${JSON.stringify(req.params)}`);
184
215
  try {
185
216
  const displays = getAvailableDisplays();
186
217
  const items = displays && typeof displays === 'object'
@@ -202,7 +233,7 @@ const start = (server) => {
202
233
  }
203
234
  });
204
235
  router.get(`${API_PATHS.INSTANCE}`, (req, res) => {
205
- server.debug(`** GET ${API_PATHS.INSTANCE}. Params: ${JSON.stringify(req.params)}`);
236
+ server.debug(`*** GET INSTANCE ${API_PATHS.INSTANCE}. Params: ${JSON.stringify(req.params)}`);
206
237
  try {
207
238
  const displayId = req.displayId;
208
239
  if (!displayId) {
@@ -222,17 +253,17 @@ const start = (server) => {
222
253
  }
223
254
  });
224
255
  router.get(`${API_PATHS.ACTIVE_SCREEN}`, (req, res) => {
225
- server.debug(`** GET ${API_PATHS.ACTIVE_SCREEN}. Params: ${JSON.stringify(req.params)}`);
256
+ server.debug(`*** GET ACTIVE_SCREEN ${API_PATHS.ACTIVE_SCREEN}. Params: ${JSON.stringify(req.params)}`);
226
257
  try {
227
258
  const displayId = req.displayId;
228
259
  if (!displayId) {
229
260
  return sendFail(res, 400, 'Missing displayId parameter');
230
261
  }
231
- const node = getDisplaySelfPath(displayId, 'activeScreen');
262
+ const node = getDisplaySelfPath(displayId, 'screenIndex');
232
263
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
233
264
  const idx = node?.value ?? null;
234
265
  if (idx === undefined) {
235
- return sendFail(res, 404, `Active screen for display ${displayId} not found`);
266
+ return sendFail(res, 404, `Active screen for display Id ${displayId} not found in path`);
236
267
  }
237
268
  return sendOk(res, idx);
238
269
  }
@@ -241,6 +272,26 @@ const start = (server) => {
241
272
  return sendFail(res, 400, error.message);
242
273
  }
243
274
  });
275
+ router.get(`${API_PATHS.CHANGE_SCREEN}`, (req, res) => {
276
+ server.debug(`*** GET CHANGE_SCREEN ${API_PATHS.CHANGE_SCREEN}. Params: ${JSON.stringify(req.params)}`);
277
+ try {
278
+ const changeId = req.changeId;
279
+ if (!changeId) {
280
+ return sendFail(res, 400, 'Missing changeId parameter');
281
+ }
282
+ const node = getDisplaySelfPath(changeId, 'activeScreen');
283
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
284
+ const idx = node?.value ?? null;
285
+ if (idx === undefined) {
286
+ return sendFail(res, 404, `Change display screen Id ${changeId} not found in path`);
287
+ }
288
+ return sendOk(res, idx);
289
+ }
290
+ catch (error) {
291
+ server.error(`Error reading activeScreen for ${req.params?.changeId}: ${String(error.message || error)}`);
292
+ return sendFail(res, 400, error.message);
293
+ }
294
+ });
244
295
  // List all registered routes for debugging
245
296
  if (router.stack) {
246
297
  router.stack.forEach((layer) => {
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "openapi": "3.0.0",
3
3
  "info": {
4
- "version": "1.0.0",
4
+ "version": "1.1.0",
5
5
  "title": "KIP Remote Displays API",
6
- "description": "API endpoints to list KIP displays and control the active screen for a given KIP instance via Signal K self.displays tree.\n\nUsage:\n- List displays:\n curl -s http://localhost:3000/plugins/kip/displays\n- Read a display's screens:\n curl -s http://localhost:3000/plugins/kip/displays/{displayId}\n- Set a display entry:\n curl -s -X PUT -H 'Content-Type: application/json' -d '{\"displayName\":\"Mast\"}' http://localhost:3000/plugins/kip/displays/{displayId}\n- Get active screen:\n curl -s http://localhost:3000/plugins/kip/displays/{displayId}/activeScreen\n- Set active screen:\n curl -s -X PUT -H 'Content-Type: application/json' -d '{\"screenIdx\":1}' http://localhost:3000/plugins/kip/displays/{displayId}/activeScreen",
6
+ "description": "API endpoints to list KIP displays and control dashboard for a given KIP instance via the Signal K self.displays tree.\n\nUsage:\n- List displays:\n curl -s http://localhost:3000/plugins/kip/displays\n- Read a display's screens:\n curl -s http://localhost:3000/plugins/kip/displays/{displayId}\n- Set a display entry:\n curl -s -X PUT -H 'Content-Type: application/json' -d '{\"displayName\":\"Mast\"}' http://localhost:3000/plugins/kip/displays/{displayId}\n- Get current screen index:\n curl -s http://localhost:3000/plugins/kip/displays/{displayId}/screenIndex\n- Set current screen index:\n curl -s -X PUT -H 'Content-Type: application/json' -d '{\"screenIdx\":1}' http://localhost:3000/plugins/kip/displays/{displayId}/screenIndex\n- Get requested screen change index:\n curl -s http://localhost:3000/plugins/kip/displays/{displayId}/activeScreen\n- Request a screen change:\n curl -s -X PUT -H 'Content-Type: application/json' -d '{\"screenIdx\":1}' http://localhost:3000/plugins/kip/displays/{displayId}/activeScreen",
7
7
  "termsOfService": "http://signalk.org/terms/",
8
8
  "license": {
9
9
  "name": "Apache 2.0",
@@ -62,6 +62,19 @@
62
62
  "icon"
63
63
  ]
64
64
  },
65
+ "ScreenListOrNull": {
66
+ "oneOf": [
67
+ {
68
+ "type": "array",
69
+ "items": {
70
+ "$ref": "#/components/schemas/ScreenItem"
71
+ }
72
+ },
73
+ {
74
+ "type": "null"
75
+ }
76
+ ]
77
+ },
65
78
  "SuccessResponse": {
66
79
  "type": "object",
67
80
  "properties": {
@@ -206,14 +219,11 @@
206
219
  "summary": "List screens for a display (self.displays.{displayId}.value.screens)",
207
220
  "responses": {
208
221
  "200": {
209
- "description": "Array of screen entries",
222
+ "description": "Array of screen entries (or null)",
210
223
  "content": {
211
224
  "application/json": {
212
225
  "schema": {
213
- "type": "array",
214
- "items": {
215
- "$ref": "#/components/schemas/ScreenItem"
216
- }
226
+ "$ref": "#/components/schemas/ScreenListOrNull"
217
227
  }
218
228
  }
219
229
  }
@@ -279,6 +289,90 @@
279
289
  }
280
290
  }
281
291
  },
292
+ "/plugins/kip/displays/{displayId}/screenIndex": {
293
+ "parameters": [
294
+ {
295
+ "$ref": "#/components/parameters/DisplayIdParam"
296
+ }
297
+ ],
298
+ "get": {
299
+ "tags": [
300
+ "Displays"
301
+ ],
302
+ "summary": "Get current screen index for display (self.displays.{displayId}.screenIndex)",
303
+ "responses": {
304
+ "200": {
305
+ "description": "Current screen index or null",
306
+ "content": {
307
+ "application/json": {
308
+ "schema": {
309
+ "type": "integer",
310
+ "nullable": true
311
+ }
312
+ }
313
+ }
314
+ },
315
+ "404": {
316
+ "description": "Not found",
317
+ "content": {
318
+ "application/json": {
319
+ "schema": {
320
+ "$ref": "#/components/schemas/ErrorResponse"
321
+ }
322
+ }
323
+ }
324
+ },
325
+ "400": {
326
+ "description": "Bad request",
327
+ "content": {
328
+ "application/json": {
329
+ "schema": {
330
+ "$ref": "#/components/schemas/ErrorResponse"
331
+ }
332
+ }
333
+ }
334
+ }
335
+ }
336
+ },
337
+ "put": {
338
+ "tags": [
339
+ "Displays"
340
+ ],
341
+ "summary": "Set current screen index for display (self.displays.{displayId}.screenIndex)",
342
+ "requestBody": {
343
+ "required": false,
344
+ "content": {
345
+ "application/json": {
346
+ "schema": {
347
+ "$ref": "#/components/schemas/ActiveScreenSetRequest"
348
+ }
349
+ }
350
+ }
351
+ },
352
+ "responses": {
353
+ "200": {
354
+ "description": "Updated",
355
+ "content": {
356
+ "application/json": {
357
+ "schema": {
358
+ "$ref": "#/components/schemas/SuccessResponse"
359
+ }
360
+ }
361
+ }
362
+ },
363
+ "400": {
364
+ "description": "Bad request",
365
+ "content": {
366
+ "application/json": {
367
+ "schema": {
368
+ "$ref": "#/components/schemas/ErrorResponse"
369
+ }
370
+ }
371
+ }
372
+ }
373
+ }
374
+ }
375
+ },
282
376
  "/plugins/kip/displays/{displayId}/activeScreen": {
283
377
  "parameters": [
284
378
  {
@@ -289,10 +383,10 @@
289
383
  "tags": [
290
384
  "Displays"
291
385
  ],
292
- "summary": "Get active screen index for display",
386
+ "summary": "Get requested screen change index (self.displays.{displayId}.activeScreen)",
293
387
  "responses": {
294
388
  "200": {
295
- "description": "Active screen index or null",
389
+ "description": "Requested screen index or null",
296
390
  "content": {
297
391
  "application/json": {
298
392
  "schema": {
@@ -328,7 +422,7 @@
328
422
  "tags": [
329
423
  "Displays"
330
424
  ],
331
- "summary": "Set active screen index for display",
425
+ "summary": "Request a screen change (sets self.displays.{displayId}.activeScreen)",
332
426
  "requestBody": {
333
427
  "required": false,
334
428
  "content": {
@@ -179,6 +179,20 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
179
179
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
180
180
  SOFTWARE.
181
181
 
182
+ --------------------------------------------------------------------------------
183
+ Package: @aziham/chartjs-plugin-streaming
184
+ License: "MIT"
185
+
186
+ The MIT License (MIT)
187
+
188
+ Copyright (c) 2017-2021 Akihiko Kusanagi
189
+
190
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
191
+
192
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
193
+
194
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
195
+
182
196
  --------------------------------------------------------------------------------
183
197
  Package: ngx-resize-observer
184
198
  License: "MIT"
@@ -478,6 +492,32 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
478
492
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
479
493
  SOFTWARE.
480
494
 
495
+ --------------------------------------------------------------------------------
496
+ Package: @angular/router
497
+ License: "MIT"
498
+
499
+ The MIT License
500
+
501
+ Copyright (c) 2010-2025 Google LLC. https://angular.dev/license
502
+
503
+ Permission is hereby granted, free of charge, to any person obtaining a copy
504
+ of this software and associated documentation files (the "Software"), to deal
505
+ in the Software without restriction, including without limitation the rights
506
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
507
+ copies of the Software, and to permit persons to whom the Software is
508
+ furnished to do so, subject to the following conditions:
509
+
510
+ The above copyright notice and this permission notice shall be included in
511
+ all copies or substantial portions of the Software.
512
+
513
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
514
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
515
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
516
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
517
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
518
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
519
+ THE SOFTWARE.
520
+
481
521
  --------------------------------------------------------------------------------
482
522
  Package: rxjs
483
523
  License: "Apache-2.0"
@@ -857,32 +897,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
857
897
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
858
898
  THE SOFTWARE.
859
899
 
860
- --------------------------------------------------------------------------------
861
- Package: @angular/router
862
- License: "MIT"
863
-
864
- The MIT License
865
-
866
- Copyright (c) 2010-2025 Google LLC. https://angular.dev/license
867
-
868
- Permission is hereby granted, free of charge, to any person obtaining a copy
869
- of this software and associated documentation files (the "Software"), to deal
870
- in the Software without restriction, including without limitation the rights
871
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
872
- copies of the Software, and to permit persons to whom the Software is
873
- furnished to do so, subject to the following conditions:
874
-
875
- The above copyright notice and this permission notice shall be included in
876
- all copies or substantial portions of the Software.
877
-
878
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
879
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
880
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
881
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
882
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
883
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
884
- THE SOFTWARE.
885
-
886
900
  --------------------------------------------------------------------------------
887
901
  Package: core-js
888
902
  License: "MIT"
@@ -44,6 +44,8 @@ The transition is automatic; no manual toggle is required. The per‑dashboard c
44
44
  2. Drag the split divider and release.
45
45
  3. Press **Save** (check icon) to persist globally, or **Cancel** (X) to revert to the previous ratio.
46
46
 
47
+ <img src="../../assets/help-docs/img/splitdeviderhandle.png" alt="Resize the split" title="Split handle" width="100%">
48
+
47
49
  Notes:
48
50
  - Width changes are only committed on Save (prevents accidental layout shifts).
49
51
  - Cancel always restores the original ratio before the edit session began.
@@ -69,17 +71,17 @@ Change side via Settings → Display → “Freeboard‑SK panel side”. This u
69
71
  ## Chartplotter Mode vs Freeboard‑SK Widget
70
72
  | Aspect | Chartplotter Mode | Freeboard‑SK Widget |
71
73
  |--------|------------------|---------------------|
72
- | Persistence across dashboard switches | Yes (never reloads) | Only on dashboards containing the widget |
73
- | Resize workflow | Drag split + Save/Cancel | Standard widget resize |
74
- | Per‑dashboard fullscreen data toggle | Via collapse flag | N/A |
75
- | Remote dashboard switching continuity | Yes | Yes |
74
+ | Persistence across dashboard switches | Yes (never reloads) | No. (created and destroyed on entering and leaving dashboards containing the widget) |
75
+ | Size and position workflow | Drag split + Save/Cancel | Standard widget positionning and sizing |
76
+ | Per‑dashboard full screen data toggle | Via individal dashboard collapse setting | N/A |
77
+ | Remote dashboard chartplotter switching continuity | Yes | Yes |
76
78
  | Memory footprint | Higher baseline (Freeboard-SK always resident) | Lower when dashboard lack the widget |
77
79
  | Best for | Continuous nav + multi‑dashboard workflow (MFD) | Occasional chart reference |
78
80
 
79
81
  ---
80
82
 
81
83
  ## Remote Control Integration
82
- When another KIP instance changes your active dashboard (Remote Control feature), the chartplotter mode and collapsed dashboard page settings are respected. No special configuration is required.
84
+ When another KIP instance changes your active dashboard (Remote Control feature), the chartplotter mode and collapsed dashboard settings are respected. No special configuration is required.
83
85
 
84
86
  ---
85
87
 
@@ -1,2 +1,2 @@
1
- import{Fd as o,Hb as v,Oa as n,Pa as s,Pd as a,ab as l,da as d}from"./chunk-OB3QLUH6.js";var u=(()=>{class t{get vertical(){return this._vertical}set vertical(i){this._vertical=a(i)}_vertical=!1;get inset(){return this._inset}set inset(i){this._inset=a(i)}_inset=!1;static \u0275fac=function(e){return new(e||t)};static \u0275cmp=n({type:t,selectors:[["mat-divider"]],hostAttrs:["role","separator",1,"mat-divider"],hostVars:7,hostBindings:function(e,r){e&2&&(l("aria-orientation",r.vertical?"vertical":"horizontal"),v("mat-divider-vertical",r.vertical)("mat-divider-horizontal",!r.vertical)("mat-divider-inset",r.inset))},inputs:{vertical:"vertical",inset:"inset"},decls:0,vars:0,template:function(e,r){},styles:[`.mat-divider{display:block;margin:0;border-top-style:solid;border-top-color:var(--mat-divider-color, var(--mat-sys-outline));border-top-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-vertical{border-top:0;border-right-style:solid;border-right-color:var(--mat-divider-color, var(--mat-sys-outline));border-right-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-inset{margin-left:80px}[dir=rtl] .mat-divider.mat-divider-inset{margin-left:auto;margin-right:80px}
1
+ import{$d as o,cc as v,hb as n,ib as s,je as a,oa as d,xb as l}from"./chunk-RLA7XOJJ.js";var u=(()=>{class t{get vertical(){return this._vertical}set vertical(i){this._vertical=a(i)}_vertical=!1;get inset(){return this._inset}set inset(i){this._inset=a(i)}_inset=!1;static \u0275fac=function(e){return new(e||t)};static \u0275cmp=n({type:t,selectors:[["mat-divider"]],hostAttrs:["role","separator",1,"mat-divider"],hostVars:7,hostBindings:function(e,r){e&2&&(l("aria-orientation",r.vertical?"vertical":"horizontal"),v("mat-divider-vertical",r.vertical)("mat-divider-horizontal",!r.vertical)("mat-divider-inset",r.inset))},inputs:{vertical:"vertical",inset:"inset"},decls:0,vars:0,template:function(e,r){},styles:[`.mat-divider{display:block;margin:0;border-top-style:solid;border-top-color:var(--mat-divider-color, var(--mat-sys-outline));border-top-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-vertical{border-top:0;border-right-style:solid;border-right-color:var(--mat-divider-color, var(--mat-sys-outline));border-right-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-inset{margin-left:80px}[dir=rtl] .mat-divider.mat-divider-inset{margin-left:auto;margin-right:80px}
2
2
  `],encapsulation:2,changeDetection:0})}return t})(),f=(()=>{class t{static \u0275fac=function(e){return new(e||t)};static \u0275mod=s({type:t});static \u0275inj=d({imports:[o,o]})}return t})();export{u as a,f as b};