@mxtommy/kip 3.12.0 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/copilot-instructions.md +102 -27
- package/.github/instructions/angular.instructions.md +1 -1
- package/CHANGELOG.md +26 -0
- package/README.md +94 -74
- package/docs/widget-schematic.md +102 -0
- package/images/ChartplotterMode.png +0 -0
- package/package.json +8 -3
- package/public/3rdpartylicenses.txt +67 -41
- package/public/assets/help-docs/chartplotter.md +122 -0
- package/public/assets/help-docs/community.md +1 -11
- package/public/assets/help-docs/kiosk.md +15 -15
- package/public/assets/help-docs/menu.json +1 -0
- package/public/assets/help-docs/welcome.md +3 -0
- package/public/assets/svg/icons.svg +4 -6
- package/public/chunk-52M2PJJL.js +4 -0
- package/public/{chunk-I454VRMK.js → chunk-AB255PKD.js} +1 -1
- package/public/chunk-B4SMHL7P.js +1 -0
- package/public/chunk-BEFXDBJY.js +3 -0
- package/public/{chunk-ZEV6YXHP.js → chunk-BMDGKBYM.js} +23 -23
- package/public/chunk-CA2BN4YV.js +9 -0
- package/public/chunk-D2CYLQZF.js +1 -0
- package/public/chunk-DKOFT6NI.js +52 -0
- package/public/{chunk-3LKIOGV7.js → chunk-E7MNINLP.js} +1 -1
- package/public/chunk-F75BVJPY.js +2 -0
- package/public/chunk-H3EFQCTE.js +5 -0
- package/public/{chunk-ZPCYFQPB.js → chunk-HIADZ4BV.js} +1 -1
- package/public/{chunk-IQG4DDQX.js → chunk-IJ22WXFB.js} +1 -1
- package/public/chunk-KI5CZR7P.js +1 -0
- package/public/{chunk-UTCRLFYC.js → chunk-NBMGYSW2.js} +1 -1
- package/public/chunk-OA5PBKO5.js +6 -0
- package/public/{chunk-YPUCOH35.js → chunk-OB3QLUH6.js} +12 -12
- package/public/{chunk-6MRJ4C55.js → chunk-OQULS6SV.js} +1 -1
- package/public/chunk-PPT35KWJ.js +8 -0
- package/public/{chunk-EPTIEPMQ.js → chunk-RYHOAWDD.js} +1 -1
- package/public/{chunk-NOLKBYOV.js → chunk-SZ2GUIT5.js} +1 -1
- package/public/chunk-TIWUK3AU.js +1 -0
- package/public/{chunk-RMLGKVWE.js → chunk-UIO7WC72.js} +1 -1
- package/public/{chunk-YVLZ2UAQ.js → chunk-V2FKRRBL.js} +2 -2
- package/public/chunk-WYPJEP5R.js +1 -0
- package/public/index.html +2 -2
- package/public/main-7RENLC7I.js +5 -0
- package/public/scripts-7HSGK5LZ.js +14 -0
- package/public/styles-MJ4EO4B4.css +1 -0
- package/tools/schematics/collection.json +9 -0
- package/tools/schematics/create-host2-widget/files/readme/README.md.template +109 -0
- package/tools/schematics/create-host2-widget/files/spec/widget-__name@dasherize__.component.spec.ts +38 -0
- package/tools/schematics/create-host2-widget/files/widget/widget-__name@dasherize__.component.html +6 -0
- package/tools/schematics/create-host2-widget/files/widget/widget-__name@dasherize__.component.scss +5 -0
- package/tools/schematics/create-host2-widget/files/widget/widget-__name@dasherize__.component.ts.template +94 -0
- package/tools/schematics/create-host2-widget/index.js +138 -0
- package/tools/schematics/create-host2-widget/schema.json +89 -0
- package/tools/schematics/create-host2-widget/test/create-host2-widget.spec.ts +70 -0
- package/tools/schematics/create-host2-widget/utils/formatting.js +119 -0
- package/public/chunk-65TR3CWM.js +0 -6
- package/public/chunk-7S37JBY2.js +0 -2
- package/public/chunk-A5CYPNMD.js +0 -2
- package/public/chunk-BSAAN2EI.js +0 -2
- package/public/chunk-CDPHRRZR.js +0 -3
- package/public/chunk-D4DROTBC.js +0 -8
- package/public/chunk-D4MWDRNW.js +0 -5
- package/public/chunk-K5OOC3CF.js +0 -4
- package/public/chunk-QOXZFV6P.js +0 -47
- package/public/chunk-T6TC7KWG.js +0 -1
- package/public/chunk-UHKP2PC3.js +0 -1
- package/public/chunk-VEJNBHWJ.js +0 -5
- package/public/chunk-XLJT6YPP.js +0 -1
- package/public/chunk-YCW2UBVQ.js +0 -1
- package/public/chunk-Z5MCM3TT.js +0 -11
- package/public/main-7TSLA2U5.js +0 -5
- package/public/styles-PDNHT2L2.css +0 -1
|
@@ -10,25 +10,97 @@ Use this quick-start map to be productive in this repo. Prefer these concrete pa
|
|
|
10
10
|
|
|
11
11
|
## Daily workflows
|
|
12
12
|
- Dev: npm run dev, then open http://localhost:4200/@mxtommy/kip/ (needs a running Signal K server).
|
|
13
|
-
- Build: npm run build
|
|
13
|
+
- Build KIP app: npm run build:dev | npm run build:prod (outputs KIP to public/ and respects baseHref).
|
|
14
|
+
- Build KIP app and KIP plugin: npm run build:all (outputs KIP to public/ and respects baseHref. Outputs plugin to kip-plugin).
|
|
14
15
|
- Quality: npm run lint, npm test (Karma). E2E (Protractor) is legacy/optional.
|
|
15
16
|
|
|
16
|
-
##
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
17
|
+
## Host2 widget contract (critical)
|
|
18
|
+
All widgets now follow the Host2 architecture (legacy BaseWidgetComponent removed).
|
|
19
|
+
|
|
20
|
+
1. Standalone component with required functional inputs:
|
|
21
|
+
```ts
|
|
22
|
+
id = input.required<string>();
|
|
23
|
+
type = input.required<string>();
|
|
24
|
+
theme = input.required<ITheme | null>();
|
|
25
|
+
```
|
|
26
|
+
2. Provide a static `DEFAULT_CONFIG: IWidgetSvcConfig` fully describing initial config (paths + options).
|
|
27
|
+
3. Inject directives for runtime + streams (and optionally metadata):
|
|
28
|
+
```ts
|
|
29
|
+
private runtime = inject(WidgetRuntimeDirective);
|
|
30
|
+
private streams = inject(WidgetStreamsDirective);
|
|
31
|
+
// optional
|
|
32
|
+
// private meta = inject(WidgetMetadataDirective);
|
|
33
|
+
```
|
|
34
|
+
4. Register data observers in a single effect:
|
|
35
|
+
```ts
|
|
36
|
+
effect(() => {
|
|
37
|
+
const cfg = this.runtime.options();
|
|
38
|
+
if (!cfg) return;
|
|
39
|
+
untracked(() => {
|
|
40
|
+
if (cfg.paths?.numericPath?.path) {
|
|
41
|
+
this.streams.observe('numericPath', pkt => this.value.set(pkt?.data?.value ?? null));
|
|
42
|
+
}
|
|
43
|
+
// repeat for other path keys
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
5. Always guard for missing config or optional paths (check `cfg?.paths?.key?.path`).
|
|
48
|
+
6. Avoid mutating the merged config object; store transient UI state in signals.
|
|
49
|
+
7. Use UnitsService and existing formatting helpers; do not hardcode conversions. Using streams directive handles path unit conversion settings automatically for number types.
|
|
50
|
+
8. Timeout settings honored automatically (`enableTimeout`, `dataTimeout`)—`WidgetStreamsDirective`.
|
|
51
|
+
9. Provide meaningful path keys (e.g. `numericPath`, `headingTrue`, `windSpeed`) and keep them stable.
|
|
52
|
+
10. Destroy logic is usually implicit (streams directive centralizes subscriptions); only tear down custom resources manually if you allocate them (e.g., canvases, animation frames).
|
|
53
|
+
|
|
54
|
+
### Path definition recap
|
|
55
|
+
Each entry in `DEFAULT_CONFIG.paths`:
|
|
56
|
+
```ts
|
|
57
|
+
someKey: {
|
|
58
|
+
description: 'User label',
|
|
59
|
+
path: 'navigation.speedThroughWater',
|
|
60
|
+
pathType: 'number' | 'string' | 'Date' | 'boolean',
|
|
61
|
+
convertUnitTo: 'knots', // For numeric path only. Sets automatic conversion to this unit
|
|
62
|
+
sampleTime: 1000, // ms, typical 500+
|
|
63
|
+
source: null, // optional source selection. null = default source
|
|
64
|
+
isPathConfigurable: true, // false to hide path in path options UI
|
|
65
|
+
pathRequired: true, // set false for optional
|
|
66
|
+
showPathSkUnitsFilter: false, // Show numeric UI filter support
|
|
67
|
+
pathSkUnitsFilter: null // Set and apply a path unit filter (e.g. 'knots' for speed)
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Data stream behavior (via WidgetStreamsDirective)
|
|
72
|
+
- Respects per-path `sampleTime`.
|
|
73
|
+
- Converts units for number paths using UnitsService.
|
|
74
|
+
- Optional timeout logic based on widget config flags.
|
|
75
|
+
- Centralized unsubscribe when host destroys the widget.
|
|
76
|
+
|
|
77
|
+
### Embedded widgets (composite pattern)
|
|
78
|
+
Use this patterns when a parent widget (e.g. Autopilot) displays other widgets:
|
|
79
|
+
|
|
80
|
+
#### `<widget-embedded>`
|
|
81
|
+
Supply a complete `widgetProperties` object (no persistence writes):
|
|
82
|
+
```ts
|
|
83
|
+
xteWidgetProps = {
|
|
84
|
+
uuid: this.id() + '-xte',
|
|
85
|
+
type: 'widget-numeric',
|
|
86
|
+
config: {
|
|
87
|
+
type: 'widget-numeric',
|
|
88
|
+
title: 'XTE',
|
|
89
|
+
paths: { numericPath: { description: 'Cross Track Error', path: 'navigation.course.crossTrackError', pathType: 'number', convertUnitTo: 'nm', sampleTime: 1000, isPathConfigurable: false } },
|
|
90
|
+
numDecimal: 2
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
```
|
|
94
|
+
Template:
|
|
95
|
+
```html
|
|
96
|
+
<widget-embedded [widgetProperties]="xteWidgetProps"></widget-embedded>
|
|
97
|
+
```
|
|
98
|
+
`widget-embedded` internally wires runtime + streams + metadata and instantiates the child.
|
|
99
|
+
|
|
100
|
+
### Safety patterns
|
|
101
|
+
- Null guard every `runtime.options()` access in effects & template (`runtime.options()?.paths?.key`).
|
|
102
|
+
- Avoid repeated `runtime.options()` chains in template: expose a computed `cfg = computed(() => this.runtime.options())`.
|
|
103
|
+
- For performance, do all `streams.observe` calls in one untracked block.
|
|
32
104
|
|
|
33
105
|
## Widget path options (important)
|
|
34
106
|
- pathType: Controls pipeline behavior (see features above). Must be accurate: 'number' | 'string' | 'Date' | 'boolean'.
|
|
@@ -61,18 +133,21 @@ Use this quick-start map to be productive in this repo. Prefer these concrete pa
|
|
|
61
133
|
- Use standalone components, signals, @if/@for; follow .github/instructions/angular.instructions.md for style.
|
|
62
134
|
- Widget config UIs live under src/app/widget-config; path controls use custom validators (no Validators.required). Respect isPathConfigurable and pathRequired.
|
|
63
135
|
|
|
64
|
-
## Widgets: do this, not that
|
|
65
|
-
- Do:
|
|
66
|
-
- Do:
|
|
67
|
-
- Do:
|
|
68
|
-
- Do:
|
|
136
|
+
## Widgets: do this, not that (Host2)
|
|
137
|
+
- Do: Provide a complete `DEFAULT_CONFIG` with all paths & options. Don’t: Scatter defaults across lifecycle hooks.
|
|
138
|
+
- Do: Centralize `streams.observe` calls in a single effect. Don’t: Register observers in multiple hooks.
|
|
139
|
+
- Do: Keep transient state in signals. Don’t: Mutate merged config objects.
|
|
140
|
+
- Do: Use UnitsService / formatting helpers. Don’t: Hardcode conversion factors.
|
|
141
|
+
- Do: Guard `options()` & path existence. Don’t: Assume presence.
|
|
142
|
+
- Do: Use widget-embedded or inline directives for composites. Don’t: Reintroduce legacy host wrappers.
|
|
69
143
|
|
|
70
144
|
## Key files/dirs
|
|
71
|
-
- Core services: src/app/core/services
|
|
72
|
-
-
|
|
73
|
-
- Widgets: src/app/widgets
|
|
74
|
-
-
|
|
75
|
-
-
|
|
145
|
+
- Core services: `src/app/core/services/` (DataService, SignalKConnectionService, SignalKDeltaService, AppNetworkInitService, UnitsService, DataSetService, NotificationsService)
|
|
146
|
+
- Directives: `src/app/core/directives/` (widget-runtime, widget-streams, widget-metadata)
|
|
147
|
+
- Widgets: `src/app/widgets/` (e.g., widget-numeric, widget-gauge-ng-*, widget-data-chart, widget-windtrends-chart, widget-autopilot)
|
|
148
|
+
- Embedded host: `src/app/core/components/widget-embedded/`
|
|
149
|
+
- Config UI: `src/app/widget-config/`
|
|
150
|
+
- Build: `angular.json`, `package.json` scripts
|
|
76
151
|
|
|
77
152
|
## Debugging
|
|
78
153
|
- Use Data Inspector (src/app/core/components/data-inspector) to verify live paths/metadata.
|
|
@@ -127,7 +127,7 @@ Here is a link to the most recent Angular style guide https://angular.dev/style-
|
|
|
127
127
|
3. **Project Setup**: Refer to `README.md` for build commands, dependencies, and environment setup
|
|
128
128
|
|
|
129
129
|
### **Integration Notes:**
|
|
130
|
-
- When developing KIP widgets,
|
|
130
|
+
- When developing KIP widgets, follow the Host2 widget architecture (signals + `WidgetRuntimeDirective` / `WidgetStreamsDirective` (+ optional `WidgetMetadataDirective`)) and, for new widgets, prefer generating the scaffold via the `create-host2-widget` schematic (see `COPILOT.md` sections 9 & 13)
|
|
131
131
|
- Use signals, standalone components, and modern control flow from this file within the KIP architecture from `COPILOT.md`
|
|
132
132
|
- For theming and colors, always use the KIP theme system described in `COPILOT.md`, not generic CSS approaches
|
|
133
133
|
- All services should follow both the Angular DI patterns here AND the KIP service architecture in `COPILOT.md`
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
# v 4.0.2
|
|
2
|
+
## Improvements
|
|
3
|
+
* Align page header styles with Freeboard‑SK for better visual integration.
|
|
4
|
+
* Remote Control page: minor UX and UI refinements.
|
|
5
|
+
## Fixes
|
|
6
|
+
* Correct widget sizing after configuration upgrades when width/height were missing in legacy layouts.
|
|
7
|
+
# v 4.0.1
|
|
8
|
+
## Fixes
|
|
9
|
+
* Prevent an upgrade edge case that created a stray Freeboard panel and pushed widgets off‑screen.
|
|
10
|
+
# v 4.0.0
|
|
11
|
+
## New features
|
|
12
|
+
- **Next‑gen widget framework**: A simplified component architecture that makes widgets faster to develop, leaner to run, and more consistent to configure — now with an automated widget generator and **AI‑assisted guidance** to get you from idea to working widget in minutes. Want to contribute your first widget? Run `npm run generate:widget` and follow the prompts.
|
|
13
|
+
- Data Chart, streamlined: Dataset configuration now lives directly inside the widget. The separate “Dataset Options” page has been retired for a cleaner flow.
|
|
14
|
+
- Racesteer (beta): Performance‑plugin powered windsteer with real‑time optimal steering cues and on‑the‑fly performance ratios against your polar based on live conditions. Requires a valid polar chart.
|
|
15
|
+
## Improvements
|
|
16
|
+
- Radial Gauge, your way: Hide the needle, progress bar, and ticks independently for ultra‑custom layouts.
|
|
17
|
+
- Snappier gestures on macOS Chrome with responsiveness refinements.
|
|
18
|
+
- Precision layouts with 2× grid resolution for tighter, more accurate arrangements.
|
|
19
|
+
- Chartplotter Mode control: Optional setting to disable KIP gestures over the Freeboard‑SK chart to prevent accidental swipes while moving the chart. Fixes #845.
|
|
20
|
+
- Dashboard editor ergonomics: Cancel/Ok button order now follows platform conventions (Sorry folks. You'll need to rewire your brains. Doctors say it's healthy!).
|
|
21
|
+
- Smarter upgrades: Configuration upgrade service now supports v2.12 → v4 config migrations with a new upgrade activity window.
|
|
22
|
+
- Documentation refresh: Syntax‑highlighted help, a comprehensive Chartplotter Mode guide, and clearer text across Remote Control and Notifications.
|
|
23
|
+
## Fixes
|
|
24
|
+
- Eliminated an occasional “empty dashboard flicker” when dashboards load. Mostly visible on low computing power hardware.
|
|
25
|
+
- Data Trends widget: fixed UI overlap on small screens. Fixes #848.
|
|
26
|
+
- Authentication reliability: Token renewal logic reworked to avoid 24‑day timer limits.
|
|
1
27
|
# v 3.12.0
|
|
2
28
|
# New Features
|
|
3
29
|
* Chartplotter Mode: A dual‑panel, performance‑tuned split experience that lets you run KIP dashboards and Freeboard‑SK together in one adaptive shell. Keep the chart live while moving between dashboards. Seamless side‑by‑side in landscape, smart vertical stacking in portrait and as always, designed for mobile and touch. Use the per‑dashboard forced collapse option for data‑focused layouts while Freeboard remains active in the background. Drag resize split distribution with commit‑on‑save editing. This feature brings you:
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
**KIP is the most popular Signal K MFD and marine instrument panel: plug-and-play, touch-optimized, pre-installed, and ready-to-use across all devices.**
|
|
7
7
|
|
|
8
|
-
Unlike many
|
|
8
|
+
Unlike many instrument panels, KIP offers full MFD functionality and is **automatically included with Signal K distributions**, so there’s nothing extra to install or configure. Simply start your [Signal K](https://signalk.org) server, open KIP in a browser, and it’s ready to go. A single instance works everywhere — no per‑device deployment is needed.
|
|
9
9
|
|
|
10
10
|
KIP is designed for sailors and boaters who want:
|
|
11
11
|
|
|
@@ -20,29 +20,31 @@ With KIP, you get the **familiar feel of professional Multi-Function Displays**
|
|
|
20
20
|
|
|
21
21
|

|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
-
|
|
23
|
+
## Table of Content
|
|
24
|
+
- [Installations Showcase](#installations-showcase)
|
|
25
|
+
- [Design Goal](#design-goal)
|
|
26
|
+
- [User Experience](#user-experience)
|
|
27
|
+
- [Dashboards and Configuration](#dashboards-and-configuration) & [Widget Library](#widget-library)
|
|
28
|
+
- [Night Modes](#night-modes)
|
|
29
|
+
- [Chartplotter Mode](#chartplotter-mode)
|
|
30
|
+
- [Remote Control](#remote-control-other-kip-displays)
|
|
31
|
+
- [Kiosk Mode](#dedicated-fullscreen-instrument-display-kiosk-mode)
|
|
32
|
+
- [Progressive Web App (PWA)](#progressive-web-app-pwa)
|
|
33
|
+
- [Multiple User Configurations](#multiple-user-configurations)
|
|
34
|
+
- [How To Contribute](#how-to-contribute) & [Creating Your Own Widgets](#kip-widgets)
|
|
35
|
+
- [Connect, Share, and Support](#connect-share-and-support) & [Features, Ideas, Bugs](#features-ideas-bugs)
|
|
34
36
|
|
|
35
37
|
## Installations Showcase
|
|
36
38
|

|
|
37
|
-
In addition to the obvious navstation,
|
|
39
|
+
In addition to the obvious navstation, wall mounted instrument panel and autopilot remote control usecases using PCs, tablets and phones, users have taken KIP into the elements using Raspberry Pi, Pi Zero, rugged tablets and all kinds of low cost AliExpress screens and industry leading, high quality, sunlight readable marine touch screens. KIP's native remote control feature opens up all kinds of possibilities.
|
|
38
40
|
|
|
39
|
-
## Read the Help
|
|
40
|
-
You just installed KIP and
|
|
41
|
+
## Read the Help Introduction How-To
|
|
42
|
+
You just installed KIP and you're stuck; read the [Introduction](https://github.com/mxtommy/Kip/blob/master/src/assets/help-docs/welcome.md) help file.
|
|
41
43
|
|
|
42
44
|
# Design Goal
|
|
43
45
|
The goal is to replicate and enhance the functionality of modern marine instrumentation displays while providing unmatched customization and flexibility. The design principles include:
|
|
44
46
|
|
|
45
|
-
- **Full-Screen Utilization**: Ensure the display uses the entire screen without requiring scrolling, maximizing visibility
|
|
47
|
+
- **Full-Screen Utilization**: Ensure the display uses the entire screen without requiring scrolling, maximizing visibility, usability reducing onscreen control clutter.
|
|
46
48
|
- **Optimized for Readability**: Present data in a large, clear, and easily interpretable format to ensure quick comprehension. Utilize high-contrast color schemes to enhance visibility, especially in bright daylight conditions.
|
|
47
49
|
- **Touchscreen Excellence**: Deliver an intuitive and seamless experience for touchscreen users, with support for gestures like swiping and tapping.
|
|
48
50
|
- **Cross-Device Compatibility**: Guarantee a consistent and responsive experience across phones, tablets, computers, and other devices.
|
|
@@ -50,34 +52,34 @@ The goal is to replicate and enhance the functionality of modern marine instrume
|
|
|
50
52
|
|
|
51
53
|

|
|
52
54
|
|
|
53
|
-
##
|
|
55
|
+
## User Experience
|
|
54
56
|
|
|
55
|
-
###
|
|
57
|
+
### Interractions
|
|
56
58
|
- Swipe up and down to navigate through your dashboards effortlessly.
|
|
57
59
|
- Swipe left and right to access notifications and other system features quickly.
|
|
58
|
-
- Use keyboard shortcuts for essential features, ensuring fast and efficient navigation across devices.
|
|
59
|
-
|
|
60
|
-

|
|
61
|
-
Sidenav for quick access to all important features.
|
|
60
|
+
- Use keyboard shortcuts for essential features, ensuring fast and efficient navigation across devices types.
|
|
62
61
|
|
|
63
|
-
###
|
|
64
|
-
Run KIP in full-screen mode without browser controls, just like a native mobile app. This feature is supported on most mobile operating systems. Follow your browser's instructions to install KIP as a PWA for quick and easy access. It's usually just a few clicks, such as "Add to Home Screen".
|
|
65
|
-
|
|
66
|
-
### Flexible Dashboard Layouts
|
|
62
|
+
### Customyze
|
|
67
63
|
- Effortlessly create and customize dashboards using an intuitive grid layout system.
|
|
68
64
|
- Add, resize, and align widgets to design tailored displays for your specific needs.
|
|
69
65
|
- Duplicate widgets or entire dashboards, including their configurations, with a single click.
|
|
70
66
|
- Simply drag dashboards to reorganize them. Double-click any dashboard to open the icon gallery and give each page a unique visual identity.
|
|
71
|
-
-
|
|
67
|
+
- Easily switch between multiple user and device configurations profiles for different roles, formfactors or use cases.
|
|
72
68
|
|
|
73
|
-
|
|
69
|
+
Sidenav for quick access to all important features.
|
|
70
|
+

|
|
71
|
+
|
|
72
|
+
Chartplotter Mode with dashboards
|
|
73
|
+

|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
## Dashboards and Configuration
|
|
76
|
+
|
|
77
|
+
### Customizable and Easy
|
|
76
78
|
Meant to build purposeful dashboards with however many widgets you want, wherever you want them.
|
|
77
79
|
|
|
78
80
|
Add, resize, and position the widgets of your choosing. Need more? Add as many additional dashboards as you wish to keep your display purposeful. Simply swipe up and down to quickly cycle through dashboards or effortlessly jump between dashboards with a single tap in the action sidenav, always knowing exactly where you are thanks to clear highlighting of your current dashboard.
|
|
79
81
|
|
|
80
|
-
|
|
82
|
+
Widget lists are sorted by category.
|
|
81
83
|

|
|
82
84
|
|
|
83
85
|
Intuitive widget configuration.
|
|
@@ -89,10 +91,10 @@ See what Signal K has to offer that you can leverage with widgets. Select it and
|
|
|
89
91
|
Many units are supported. Choose your preferred app defaults, then tweak them widget-by-widget as necessary. KIP will automatically convert the units for you.
|
|
90
92
|

|
|
91
93
|
|
|
92
|
-
Organize your dashboards and access tools
|
|
94
|
+
Organize your dashboards and access tools.
|
|
93
95
|

|
|
94
96
|
|
|
95
|
-
##
|
|
97
|
+
## Widget Library
|
|
96
98
|
All KIP widgets are visual presentation controls that are very versatile, with multiple advanced configuration options available to suit your needs:
|
|
97
99
|
- **Numeric display**: Create gauges to display any numerical data sent by your system: SOG, depth, wind speed, VMG, refrigerator temperature, weather data, etc.
|
|
98
100
|
- **Text display**: Create gauges to display any textual data sent by your system: MPPT state, vessel details, next waypoint, Fusion radio song information, noon and sun phases, any system component configuration detail or status available, etc.
|
|
@@ -120,16 +122,16 @@ All KIP widgets are visual presentation controls that are very versatile, with m
|
|
|
120
122
|
Get the latest version of KIP to see what's new!
|
|
121
123
|
|
|
122
124
|
### Widget Samples
|
|
123
|
-
Gauges
|
|
125
|
+
Gauges sample
|
|
124
126
|

|
|
125
127
|
|
|
126
|
-
Various
|
|
128
|
+
Various other types of widgets
|
|
127
129
|

|
|
128
130
|
|
|
129
|
-
Freeboard-SK
|
|
131
|
+
Freeboard-SK Chartplotter integration with Autopilot widget
|
|
130
132
|

|
|
131
133
|
|
|
132
|
-
Grafana
|
|
134
|
+
Grafana integration with other widgets
|
|
133
135
|

|
|
134
136
|
|
|
135
137
|
## Night Modes
|
|
@@ -139,12 +141,8 @@ Keep your night vision with automatic or manual day and night switching to a col
|
|
|
139
141
|
|
|
140
142
|

|
|
141
143
|
|
|
142
|
-
##
|
|
143
|
-
|
|
144
|
-
For example, Signal K will notify KIP when a water depth or temperature sensor reaches certain levels. In addition to KIP's centralized notification menu, individual widgets offer tailored visual representations appropriate to their design objectives, providing an optimal user experience.
|
|
145
|
-
|
|
146
|
-
## Multiple User Profiles
|
|
147
|
-
If you have different roles on board: captain, skipper, tactician, navigator, engineer—or simply different people with different needs, each can tailor KIP as they wish. The use of profiles also allows you to tie specific configuration arrangements to use cases or device form factors.
|
|
144
|
+
## Chartplotter Mode
|
|
145
|
+
Keep a live Freeboard‑SK chart visible while switching dashboards for an MFD‑style workflow. The chart persists (no reload or flicker), you can choose its side, collapse it per‑dashboard for full data pages, and drag resize the split. Layout auto‑stacks in portrait / narrow screens. See the dedicated Chartplotter Mode help page for setup, performance tips, and troubleshooting.
|
|
148
146
|
|
|
149
147
|
## Remote Control Other KIP Displays
|
|
150
148
|
Control which dashboard is shown on another KIP instance (e.g., a mast display, hard-to-reach screen, or a non‑touch device) from any KIP, including your phone.
|
|
@@ -155,13 +153,19 @@ Use cases
|
|
|
155
153
|
- Non‑touch/no input: select dashboards when no keyboard/mouse is connected or touch is not supported/disabled.
|
|
156
154
|
|
|
157
155
|
## Dedicated Fullscreen instrument display (Kiosk Mode)
|
|
158
|
-
Runs KIP on Raspberry Pi as a single full-screen application, suppresses desktop UI and stays on screen like a dedicated instrument
|
|
156
|
+
Runs KIP on Raspberry Pi as a single full-screen application, suppresses the desktop UI and stays on screen like a dedicated chartplotter or marine instrument panel at a fraction of the cost. Read the [Kiosk Mode](https://github.com/mxtommy/Kip/blob/master/src/assets/help-docs/kiosk.md) help file.
|
|
157
|
+
|
|
158
|
+
## Progressive Web App PWA
|
|
159
|
+
Run KIP without browser controls, just like a native computer, tablet or phone app. This feature is supported on most mobile operating systems and desktop browser. It freezes up screen real estate and offers a native Android and iOS app experience with single icon launch. Follow your browser's instructions to install Progressiver Web Apps. It's usually just a few clicks, such as "Add to Home Screen".
|
|
160
|
+
|
|
161
|
+
## Multiple User Configurations
|
|
162
|
+
If you have different roles on board: captain, skipper, tactician, navigator, engineer—or simply different people with different needs, each can tailor KIP as they wish. The use of profiles also allows you to tie specific configuration arrangements to use cases or device form factors.
|
|
159
163
|
|
|
160
164
|
## Complementary Components
|
|
161
|
-
Typical complementary components you may install (
|
|
165
|
+
Typical complementary components you may install (most are often bundled with Signal K distributions):
|
|
162
166
|
|
|
163
167
|
**Navigation & Charting**
|
|
164
|
-
- **Freeboard‑SK** – Multi‑station, web chart plotter dedicated to Signal K: routes, waypoints, charts, alarms, weather layers, and instrument overlays.
|
|
168
|
+
- **Freeboard‑SK** (pre-installed) – Multi‑station, web chart plotter dedicated to Signal K: routes, waypoints, charts, alarms, weather layers, and instrument overlays.
|
|
165
169
|
|
|
166
170
|
**Visual Flow / Automation**
|
|
167
171
|
- **Node‑RED** – Low‑code, flow‑based wiring of devices, APIs, online services, and custom logic (alert escalation, device control automation, data enrichment, protocol bridging).
|
|
@@ -170,12 +174,9 @@ Typical complementary components you may install (many are often bundled with Si
|
|
|
170
174
|
- **InfluxDB / other TSDB** – High‑resolution historical storage of sensor & performance metrics beyond what lightweight widget charts should retain.
|
|
171
175
|
- **Grafana** – Rich exploratory / comparative dashboards, ad‑hoc queries, alert rules on stored metrics, correlation across heterogeneous data sources.
|
|
172
176
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
# Features, Ideas, Bugs
|
|
177
|
-
See KIP's GitHub project for the latest feature requests:
|
|
178
|
-
https://github.com/mxtommy/Kip/issues
|
|
177
|
+
## Harness the Power of Data State Notifications
|
|
178
|
+
Stay informed with notifications about the state of the data you are interested in.
|
|
179
|
+
For example, Signal K will notify KIP when a water depth or temperature sensor reaches certain levels. In addition to KIP's centralized notification menu, individual widgets offer tailored visual representations appropriate to their design objectives, providing an optimal user experience.
|
|
179
180
|
|
|
180
181
|
# How To Contribute
|
|
181
182
|
KIP is under the MIT license and is built with Node and Angular using various open-source assets. All free!
|
|
@@ -194,42 +195,55 @@ What KIP deliberately IS NOT trying to become:
|
|
|
194
195
|
|
|
195
196
|
Those domains already have excellent, specialized open‑source tools. Instead of re‑implementing them, KIP plays nicely alongside them within a Signal K based onboard stack.
|
|
196
197
|
|
|
197
|
-
|
|
198
|
-
|
|
198
|
+
### Processing, Extensions and Widgets
|
|
199
|
+
|
|
200
|
+
#### Signal K Plugins
|
|
201
|
+
Domain‑specific enrichment (polars, performance calculations, derived environmental data, routing aids) published directly into the Signal K data model that KIP can then display.
|
|
202
|
+
|
|
203
|
+
#### KIP Widgets
|
|
204
|
+
Visual data representation component that use Signal K path data and API V2 features. Scaffolding a new widgets only takes a few moments and is backed by KIP AI agent instructions providing willed creative minds a personal assistant programmer.
|
|
205
|
+
|
|
206
|
+
Run one simple command (example):
|
|
207
|
+
```
|
|
208
|
+
npm run generate:widget
|
|
209
|
+
```
|
|
210
|
+
or ask your AI to create a widget using the KIP project AI instructions.
|
|
211
|
+
|
|
212
|
+
For deeper details you can still look at `COPILOT.md`, but you don’t need to in order to get started.
|
|
199
213
|
|
|
200
|
-
|
|
214
|
+
### Why this separation matters
|
|
201
215
|
|
|
202
216
|
Keeping KIP focused preserves responsiveness (lower CPU / memory), reduces UI clutter, and accelerates core sailing user experience development. Heavy analytics, complex workflow logic, and broad third‑party embedding stay where they are strongest—outside—but still feed KIP through the common Signal K data fabric.
|
|
203
217
|
|
|
204
218
|
In short: use KIP to see & act on live sailing information; use the complementary tools to store it long‑term, analyze it deeply, automate decisions, or build advanced integrations.
|
|
205
219
|
|
|
206
|
-
|
|
220
|
+
## Getting Started
|
|
207
221
|
|
|
208
|
-
Linux, Mac, RPi, or Windows dev platform supported
|
|
209
|
-
1.
|
|
210
|
-
2.
|
|
211
|
-
3.
|
|
212
|
-
4.
|
|
213
|
-
5. Install
|
|
214
|
-
6. Install the Angular CLI using `npm install -g @angular/cli`
|
|
222
|
+
**Linux, Mac, RPi, or Windows dev platform supported**
|
|
223
|
+
1. Download your favorite coding IDE (we use the free Visual Studio Code)
|
|
224
|
+
2. Create your own GitHub KIP fork.
|
|
225
|
+
3. Configure your IDE's source control to point it to your forked KIP instance (Visual Studio Code, GitHub support is built-in) and get the fork's master branch locally.
|
|
226
|
+
4. Install `npm` and `node`. On macOS, you can use `brew install node` if you have Homebrew. See https://nodejs.org/en/download for more options.
|
|
227
|
+
5. Install the Angular CLI using `npm install -g @angular/cli`
|
|
215
228
|
|
|
216
|
-
**
|
|
229
|
+
**Project Setup**
|
|
217
230
|
1. From your fork's master branch, create a working branch with a name such as: `new-widget-abc` or `fix-issue-abc`, etc.
|
|
218
231
|
2. Check out this new branch.
|
|
219
|
-
3. In a command shell (or in the Visual Studio Code Terminal window), go to the root of your local project
|
|
220
|
-
4. Install project dependencies using the NPM package and dependency manager: run `npm install`. NPM will read the
|
|
232
|
+
3. In a command shell (or in the Visual Studio Code Terminal window), go to the root of your local project folder, if not done automatically by your IDE.
|
|
233
|
+
4. Install project dependencies using the NPM package and dependency manager: run `npm install`. NPM will read the KIP project dependencies, download, and install everything automatically for you.
|
|
221
234
|
5. Build the app locally using Angular CLI: from that same project root folder, run `npm run build:all`. The CLI tool will build KIP.
|
|
222
235
|
|
|
223
|
-
**
|
|
224
|
-
1. Fire up your local
|
|
225
|
-
2. Hit Run/Start Debugging in Visual Studio Code or point your favorite browser to `http://localhost:4200/@mxtommy/kip`. Alternatively, to start the
|
|
236
|
+
**Code and Test**
|
|
237
|
+
1. Fire up your local KIP development instance with `npm run dev`.
|
|
238
|
+
2. Hit Run/Start Debugging in Visual Studio Code or manually point your favorite browser to `http://localhost:4200/@mxtommy/kip`. Alternatively, to start the development server and allow remote devices connections, such as with your phone or RPi (blocked for security reasons by default):
|
|
226
239
|
`ng serve --configuration=dev --serve-path=/@mxtommy/kip/ --host=<your computer's IP> --port=4200`
|
|
227
240
|
3. Voila!
|
|
228
241
|
|
|
229
242
|
*As you work on source code and save files, the app will automatically reload in the browser with your latest changes.*
|
|
230
|
-
*You also need a running Signal K server for KIP to connect to and receive data.*
|
|
243
|
+
*You will also need a running Signal K server for KIP to connect to and receive data. You could also use https://demo.signalk.org but without authentication enabled, your actions, features and test coverage will be limited.*
|
|
231
244
|
|
|
232
245
|
**Apple PWA Icon Generation**
|
|
246
|
+
|
|
233
247
|
Use the following tool and command line:
|
|
234
248
|
`npx pwa-asset-generator ./src/assets/favicon.svg ./src/assets/ -i ./src/index.html -m ./src manifest.json -b "linear-gradient(to bottom, rgba(255,255,255,0.15) 0%, rgba(0,0,0,0.15) 100%), radial-gradient(at top center, rgba(255,255,255,0.40) 0%, rgba(0,0,0,0.40) 120%) #989898" -p 5%`
|
|
235
249
|
|
|
@@ -237,7 +251,7 @@ Use the following tool and command line:
|
|
|
237
251
|
|
|
238
252
|
Once done with your work, from your fork's working branch, make a GitHub pull request to have your code reviewed, merged, and included in the next release. It's always optimal to sync with us prior to engaging in extensive new development work.
|
|
239
253
|
|
|
240
|
-
## Development Instructions & Guidelines
|
|
254
|
+
## Development Instructions & Guidelines Documentation
|
|
241
255
|
|
|
242
256
|
For comprehensive development guidance, please refer to these instruction files:
|
|
243
257
|
|
|
@@ -245,16 +259,22 @@ For comprehensive development guidance, please refer to these instruction files:
|
|
|
245
259
|
- **[COPILOT.md](./COPILOT.md)**: Complete KIP project guidelines including architecture, services, widget development patterns, theming, and Signal K integration.
|
|
246
260
|
- **[Angular Instructions](./.github/instructions/angular.instructions.md)**: Modern Angular v20+ coding standards, component patterns, and framework best practices.
|
|
247
261
|
|
|
248
|
-
### **Performance & SVG Animation**
|
|
249
|
-
For guidance on high-performance widget animations (e.g., wind dial rotations, laylines, wind sectors) using requestAnimationFrame outside Angular's change detection, see the new section 12 "SVG Animation Utilities" in [COPILOT.md](./COPILOT.md#12-svg-animation-utilities-requestanimationframe-helpers).
|
|
250
|
-
|
|
251
262
|
### **Development Workflow:**
|
|
252
263
|
1. **Start Here**: Read `COPILOT.md` for KIP-specific architecture and patterns.
|
|
253
264
|
2. **Angular Standards**: Follow `.github/instructions/angular.instructions.md` for modern Angular development.
|
|
254
265
|
3. **Setup & Build**: Use this README for project setup and build commands.
|
|
255
266
|
|
|
256
267
|
### **Key Priorities:**
|
|
257
|
-
- **Widget Development**:
|
|
268
|
+
- **Widget Development**: Use the Host2 widget pattern (signals + directives) and scaffold new widgets with the `create-host2-widget` schematic (see `COPILOT.md`).
|
|
258
269
|
- **Angular Patterns**: Use signals, standalone components, and modern control flow.
|
|
259
270
|
- **Theming**: Follow KIP's theme system for consistent UI.
|
|
260
271
|
- **Code Quality**: Run `npm run lint` before commits.
|
|
272
|
+
|
|
273
|
+
KIP is open-source under the MIT license, built by the community and 100% free. [Join the community](https://discord.gg/AMDYT2DQga) on Discord or contribute to the project on GitHub!
|
|
274
|
+
|
|
275
|
+
# Connect, Share, and Support
|
|
276
|
+
KIP has its own Discord Signal K channel for getting in touch. Join us at https://discord.gg/AMDYT2DQga
|
|
277
|
+
|
|
278
|
+
# Features, Ideas, Bugs
|
|
279
|
+
See KIP's GitHub project for the latest feature requests:
|
|
280
|
+
https://github.com/mxtommy/Kip/issues
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
## Host2 Widget Schematic
|
|
2
|
+
|
|
3
|
+
Use the custom schematic to scaffold a new Host2 architecture widget.
|
|
4
|
+
|
|
5
|
+
### Command
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
npx schematics ./tools/schematics/collection.json:create-host2-widget \
|
|
9
|
+
--name speed-over-ground \
|
|
10
|
+
--title "Speed Over Ground" \
|
|
11
|
+
--description "Displays SOG from navigation.speedOverGround" \
|
|
12
|
+
--icon navigation-speed \
|
|
13
|
+
--path-key numericPath \
|
|
14
|
+
--path-description "Speed Over Ground" \
|
|
15
|
+
--convert-unit-to knots \
|
|
16
|
+
--sample-time 1000 \
|
|
17
|
+
--register-widget Core
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Only the required flags are `--name`, `--title`, `--description`, and `--icon` when running non-interactively. By default `--dry-run=false` is applied via the npm script.
|
|
21
|
+
|
|
22
|
+
### Prompting Behavior
|
|
23
|
+
|
|
24
|
+
The schematic now uses Angular schema `x-prompt` for both required and optional fields.
|
|
25
|
+
|
|
26
|
+
Modes:
|
|
27
|
+
1. Non-interactive (default when values supplied or CLI run without `--interactive`): Only missing required fields will prompt; others use defaults.
|
|
28
|
+
2. Interactive (`--interactive` or `--interactive=true`): Prompts sequentially for every field (required + optional) unless you provided it on the command line.
|
|
29
|
+
|
|
30
|
+
Flag naming: CLI flags must be kebab-case. Each dashed flag maps to camelCase schema properties (e.g. `--register-widget` → `registerWidget`, `--sample-time` → `sampleTime`). Using camelCase directly (e.g. `--registerWidget`) will fail with an "Unknown argument" error.
|
|
31
|
+
|
|
32
|
+
Examples:
|
|
33
|
+
```
|
|
34
|
+
# Minimal required (will prompt for any missing among required)
|
|
35
|
+
npm run generate:widget -- --name depth --title Depth --description "Shows depth" --icon depth-icon --register-widget Core
|
|
36
|
+
|
|
37
|
+
# Full guided session (asks optional too)
|
|
38
|
+
npm run generate:widget -- --interactive --name aws --title "Apparent Wind" --description "Displays apparent wind" --icon wind --register-widget Core
|
|
39
|
+
|
|
40
|
+
# Skip service registration
|
|
41
|
+
npm run generate:widget -- --name scratch --title Scratch --description "Sandbox" --icon placeholder --register-widget no
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Important Options (subset)
|
|
45
|
+
|
|
46
|
+
| Option | Default | Notes |
|
|
47
|
+
| ------ | ------- | ----- |
|
|
48
|
+
| name | (none) | Kebab-case base name without `widget-` prefix |
|
|
49
|
+
| title | (none) | Display name inserted into widget definition |
|
|
50
|
+
| description | (none) | One-line description for registry |
|
|
51
|
+
| icon | (none) | Icon key placeholder (replace later) |
|
|
52
|
+
| category | Core | One of Core, Gauge, Component, Racing |
|
|
53
|
+
| pathKey (flag: --path-key) | signalKPath | Internal key used for data stream observation |
|
|
54
|
+
| pathDescription (flag: --path-description) | My Path | Shown in config UIs (future) |
|
|
55
|
+
| pathType (flag: --path-type) | number | number|string|boolean|Date |
|
|
56
|
+
| convertUnitTo (flag: --convert-unit-to) | unitless | Target display unit (UnitsService) |
|
|
57
|
+
| sampleTime (flag: --sample-time) | 1000 | ms between sampled updates |
|
|
58
|
+
| registerWidget (flag: --register-widget) | (none) | Category (Core/Gauge/Component/Racing) or 'no' to skip service update |
|
|
59
|
+
| addSpec | true | Generates a basic host test wrapper spec |
|
|
60
|
+
| readme | true | Emits README.md with scaffold notes |
|
|
61
|
+
| interactive | false | Use `--interactive` to have the CLI ask for any values you did not supply |
|
|
62
|
+
|
|
63
|
+
### What Gets Generated
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
src/app/widgets/widget-<name>/<name>.component.ts
|
|
67
|
+
src/app/widgets/widget-<name>/<name>.component.html
|
|
68
|
+
src/app/widgets/widget-<name>/<name>.component.scss
|
|
69
|
+
src/app/widgets/widget-<name>/<name>.component.spec.ts (if --addSpec)
|
|
70
|
+
src/app/widgets/widget-<name>/README.md (if --readme)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
If `registerWidget` is not set to `no`, the schematic also updates `WidgetService`:
|
|
74
|
+
1. Adds an import for the new component.
|
|
75
|
+
2. Adds the component class to `_componentTypeMap`.
|
|
76
|
+
3. Inserts a widget definition object into `_widgetDefinition` (automatically ordered within its category).
|
|
77
|
+
|
|
78
|
+
### After Generation Checklist
|
|
79
|
+
|
|
80
|
+
- Replace placeholder `icon` in the widget definition with a real SVG symbol id.
|
|
81
|
+
- Adjust `DEFAULT_CONFIG.paths` if you need multiple paths (add entries & observers in one `untracked` block).
|
|
82
|
+
- Implement formatting / unit display logic using existing helper services if needed.
|
|
83
|
+
- Flesh out the spec with domain assertions (current spec only verifies instantiation).
|
|
84
|
+
|
|
85
|
+
### Removing a Generated Widget
|
|
86
|
+
|
|
87
|
+
Manual cleanup steps:
|
|
88
|
+
1. Delete the folder `src/app/widgets/widget-<name>`.
|
|
89
|
+
2. Remove the import, map entry, and definition block for the widget from `WidgetService`.
|
|
90
|
+
|
|
91
|
+
### Troubleshooting
|
|
92
|
+
|
|
93
|
+
| Symptom | Cause | Fix |
|
|
94
|
+
| ------- | ----- | --- |
|
|
95
|
+
| Duplicate README like `README<name>.md` | Older schematic version left name in filename | Delete the redundant file & upgrade schematic (already fixed) |
|
|
96
|
+
| Widget already exists error | Folder collision | Choose a different `--name` or delete the existing widget |
|
|
97
|
+
| No WidgetService update | Service path changed | Adjust `WIDGET_SERVICE` constant in schematic factory |
|
|
98
|
+
|
|
99
|
+
### Development Notes
|
|
100
|
+
|
|
101
|
+
- Template sources end with `.template`; a post-processing rule strips the suffix for final emission.
|
|
102
|
+
- Config UI generation was intentionally removed; future re-introduction would require new templates.
|
|
Binary file
|