@mxtommy/kip 3.12.0 → 4.0.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 (69) hide show
  1. package/.github/copilot-instructions.md +102 -27
  2. package/.github/instructions/angular.instructions.md +1 -1
  3. package/CHANGELOG.md +17 -0
  4. package/README.md +94 -74
  5. package/docs/widget-schematic.md +102 -0
  6. package/images/ChartplotterMode.png +0 -0
  7. package/package.json +8 -3
  8. package/public/3rdpartylicenses.txt +67 -41
  9. package/public/assets/help-docs/chartplotter.md +122 -0
  10. package/public/assets/help-docs/community.md +1 -11
  11. package/public/assets/help-docs/kiosk.md +15 -15
  12. package/public/assets/help-docs/menu.json +1 -0
  13. package/public/assets/help-docs/welcome.md +3 -0
  14. package/public/assets/svg/icons.svg +4 -6
  15. package/public/{chunk-XLJT6YPP.js → chunk-4HLTLR5F.js} +1 -1
  16. package/public/chunk-52M2PJJL.js +4 -0
  17. package/public/chunk-5FWE6Y4K.js +52 -0
  18. package/public/{chunk-3LKIOGV7.js → chunk-75QTGQOO.js} +1 -1
  19. package/public/{chunk-I454VRMK.js → chunk-AB255PKD.js} +1 -1
  20. package/public/{chunk-RMLGKVWE.js → chunk-ACTDISHE.js} +1 -1
  21. package/public/chunk-AYVYZ27A.js +2 -0
  22. package/public/chunk-B3P2F52Y.js +9 -0
  23. package/public/{chunk-ZEV6YXHP.js → chunk-BMDGKBYM.js} +23 -23
  24. package/public/chunk-CTZYGIOB.js +8 -0
  25. package/public/{chunk-YVLZ2UAQ.js → chunk-CVTWABMM.js} +2 -2
  26. package/public/chunk-CZJ7AC6N.js +1 -0
  27. package/public/{chunk-ZPCYFQPB.js → chunk-HIADZ4BV.js} +1 -1
  28. package/public/{chunk-IQG4DDQX.js → chunk-IJ22WXFB.js} +1 -1
  29. package/public/chunk-IPSRX374.js +1 -0
  30. package/public/chunk-JCW5H5WP.js +1 -0
  31. package/public/{chunk-UTCRLFYC.js → chunk-KHL7FGID.js} +1 -1
  32. package/public/{chunk-YPUCOH35.js → chunk-OB3QLUH6.js} +12 -12
  33. package/public/{chunk-6MRJ4C55.js → chunk-OQULS6SV.js} +1 -1
  34. package/public/chunk-P3OU5V2Y.js +1 -0
  35. package/public/{chunk-EPTIEPMQ.js → chunk-RYHOAWDD.js} +1 -1
  36. package/public/chunk-SVP7ZRWY.js +5 -0
  37. package/public/{chunk-NOLKBYOV.js → chunk-SZ2GUIT5.js} +1 -1
  38. package/public/chunk-TCZ5ZAXQ.js +3 -0
  39. package/public/chunk-V7PWLOQ2.js +6 -0
  40. package/public/index.html +2 -2
  41. package/public/main-3LAUI5JW.js +5 -0
  42. package/public/scripts-7HSGK5LZ.js +14 -0
  43. package/public/styles-MJ4EO4B4.css +1 -0
  44. package/tools/schematics/collection.json +9 -0
  45. package/tools/schematics/create-host2-widget/files/readme/README.md.template +109 -0
  46. package/tools/schematics/create-host2-widget/files/spec/widget-__name@dasherize__.component.spec.ts +38 -0
  47. package/tools/schematics/create-host2-widget/files/widget/widget-__name@dasherize__.component.html +6 -0
  48. package/tools/schematics/create-host2-widget/files/widget/widget-__name@dasherize__.component.scss +5 -0
  49. package/tools/schematics/create-host2-widget/files/widget/widget-__name@dasherize__.component.ts.template +94 -0
  50. package/tools/schematics/create-host2-widget/index.js +138 -0
  51. package/tools/schematics/create-host2-widget/schema.json +89 -0
  52. package/tools/schematics/create-host2-widget/test/create-host2-widget.spec.ts +70 -0
  53. package/tools/schematics/create-host2-widget/utils/formatting.js +119 -0
  54. package/public/chunk-65TR3CWM.js +0 -6
  55. package/public/chunk-7S37JBY2.js +0 -2
  56. package/public/chunk-A5CYPNMD.js +0 -2
  57. package/public/chunk-BSAAN2EI.js +0 -2
  58. package/public/chunk-CDPHRRZR.js +0 -3
  59. package/public/chunk-D4DROTBC.js +0 -8
  60. package/public/chunk-D4MWDRNW.js +0 -5
  61. package/public/chunk-K5OOC3CF.js +0 -4
  62. package/public/chunk-QOXZFV6P.js +0 -47
  63. package/public/chunk-T6TC7KWG.js +0 -1
  64. package/public/chunk-UHKP2PC3.js +0 -1
  65. package/public/chunk-VEJNBHWJ.js +0 -5
  66. package/public/chunk-YCW2UBVQ.js +0 -1
  67. package/public/chunk-Z5MCM3TT.js +0 -11
  68. package/public/main-7TSLA2U5.js +0 -5
  69. 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-dev | npm run build-prod (outputs to public/ and respects baseHref).
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
- ## Widget contract (critical)
17
- - Extend BaseWidgetComponent (src/app/core/utils/base-widget.component.ts) for every widget.
18
- - Implement startWidget() and updateConfig(config: IWidgetSvcConfig).
19
- - defaultConfig defines initial config; call validateConfig() to merge new properties into saved configs safely.
20
- - Subscriptions: observeDataStream('pathKey', next => ...) for values; observeMetaStream() for zones. Cleanup: destroyDataStreams() in ngOnDestroy.
21
- - Multiple streams: Call observeDataStream once per needed config.paths key. BaseWidget aggregates all under one Subscription; destroyDataStreams() unsubscribes all data and meta streams at once.
22
- - Units: Always go through UnitsService (convertToUnit, formatWidgetNumberValue). Don’t hardcode conversions/formatting.
23
- - Define config.paths[pathKey] with: path, pathType ('number' | 'string' | 'Date' | 'boolean'), sampleTime, convertUnitTo, source.
24
-
25
- ### observeDataStream features (applied automatically)
26
- - Auto-creates per-path observables from config.paths via createDataObservable() when first used.
27
- - Applies sampleTime from the path config consistently to reduce churn.
28
- - For pathType 'number': performs UnitsService.convertToUnit(convertUnitTo) and optionally timeout+retry.
29
- - For 'string' | 'Date': applies sampleTime and optional timeout/retry (no unit conversion).
30
- - For 'boolean': applies sampleTime (no timeout/retry).
31
- - Global timeouts: enableTimeout + dataTimeout (seconds) at widgetProperties.config level control timeout behavior.
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: Define a complete defaultConfig (including config.paths) and call validateConfig() before using config. Don’t: Scatter fallback defaults across methods.
66
- - Do: Use observeDataStream(...) and destroyDataStreams() in ngOnDestroy. Don’t: Manually subscribe to DataService in multiple places without centralized cleanup.
67
- - Do: Call observeDataStream once per path key; let BaseWidget aggregate subscriptions. Don’t: Manage multiple Subscription instances yourself—destroyDataStreams() handles all.
68
- - Do: Convert/format with UnitsService and formatWidgetNumberValue(). Don’t: Hardcode unit math (e.g., divide by 0.5144) or toFixed() ignoring widget decimals/min/max.
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/ (DataService, SignalKConnectionService, SignalKDeltaService, AppNetworkInitService, UnitsService, DataSetService, NotificationsService).
72
- - Widget base: src/app/core/utils/base-widget.component.ts (subscriptions, units, zones, formatting).
73
- - Widgets: src/app/widgets/ (e.g., widget-numeric, widget-gauge-ng-*, widget-data-chart, widget-windtrends-chart).
74
- - Config UI: src/app/widget-config/ (shared config components, validators, modals).
75
- - Build: angular.json, package.json scripts.
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, extend `BaseWidgetComponent` as described in `COPILOT.md` AND follow the Angular v20+ patterns in this file
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,20 @@
1
+ # v 4.0.0
2
+ ## New features
3
+ - **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.
4
+ - Data Chart, streamlined: Dataset configuration now lives directly inside the widget. The separate “Dataset Options” page has been retired for a cleaner flow.
5
+ - 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.
6
+ ## Improvements
7
+ - Radial Gauge, your way: Hide the needle, progress bar, and ticks independently for ultra‑custom layouts.
8
+ - Snappier gestures on macOS Chrome with responsiveness refinements.
9
+ - Precision layouts with 2× grid resolution for tighter, more accurate arrangements.
10
+ - Chartplotter Mode control: Optional setting to disable KIP gestures over the Freeboard‑SK chart to prevent accidental swipes while moving the chart. Fixes #845.
11
+ - 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!).
12
+ - Smarter upgrades: Configuration upgrade service now supports v9 → v12 migrations with a new upgrade activity window.
13
+ - Documentation refresh: Syntax‑highlighted help, a comprehensive Chartplotter Mode guide, and clearer text across Remote Control and Notifications.
14
+ ## Fixes
15
+ - Eliminated an occasional “empty dashboard flicker” when dashboards load. Mostly visible on low computing power hardware.
16
+ - Data Trends widget: fixed UI overlap on small screens. Fixes #848.
17
+ - Authentication reliability: Token renewal logic reworked to avoid Node.js 28‑day timer limits.
1
18
  # v 3.12.0
2
19
  # New Features
3
20
  * 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 dashboards, KIP comes **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.
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 perdevice 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
  ![KIP](./images/KIPDemo.png)
22
22
 
23
- Key features include:
24
- - **Flexible Layouts**: Build purposeful dashboards with an easy-to-use and intuitive grid layout system. Drag widgets into place and make adjustments with simple gestures or clicks.
25
- - **Reusable Widget Library**: A wide range of widgets for numerical, textual, and graphical data, as well as advanced controls like switches, sliders, and autopilot operation.
26
- - **Night Mode**: Preserve night vision with a simple tap or automatic switching based on sunrise/sunset.
27
- - **Data State Notifications**: Stay informed with visual and audio alerts for critical data thresholds.
28
- - **Multiple User Profiles**: Tailor configurations for different roles, devices, or use cases.
29
- - **Cross-Device Compatibility**: Access KIP remotely on any device by navigating to `http://<Signal K Server URL>:<port>/@mxtommy/kip`.
30
- - **Remote Control**: Control which dashboard is shown on another KIP instance (e.g., a mast display, hard-to-reach screen, or a non‑touch device).
31
- - **Kiosk Mode**: Run as a single full-screen application; mast, helm, portable display used as a dedicated instrument panel, a chartplotter, etc.
32
-
33
- 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!
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
  ![Form factor support](./images/exterior_user_installs.png)
37
- In addition to the obvious navstation, tablet and phone use cases, users have taken KIP outside using Raspberry Pi and Pi Zero computers, rugged tablets and all kinds of cheap to expensive touch screens.
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 introduction How-to
40
- You just installed KIP and your stuck; read the [Introduction](https://github.com/mxtommy/Kip/blob/master/src/assets/help-docs/welcome.md) help file.
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 and usability.
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
  ![Form factor support](./images/formfactor.png)
52
54
 
53
- ## Features
55
+ ## User Experience
54
56
 
55
- ### Intuitive Controls
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
- ![Sidenav Dashboard Access](./images/ActionSidenav.png)
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
- ### Progressive Web App (PWA) Support
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
- - Seamlessly switch between multiple configuration profles for different roles and devices or use cases.
67
+ - Easily switch between multiple user and device configurations profiles for different roles, formfactors or use cases.
72
68
 
73
- ## User Experience
69
+ Sidenav for quick access to all important features.
70
+ ![Sidenav Dashboard Access](./images/ActionSidenav.png)
71
+
72
+ Chartplotter Mode with dashboards
73
+ ![Chartplotter Mode](./images/ChartplotterMode.png)
74
74
 
75
- ### Flexible and Easy
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
- Add widget lists sorted by category
82
+ Widget lists are sorted by category.
81
83
  ![Layouts Configuration Image](./images/KipWidgetConfig-layout-1024.png)
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
  ![Units Configuration Image](./images/KipConfig-Units-1024.png)
91
93
 
92
- Organize your dashboards and access tools
94
+ Organize your dashboards and access tools.
93
95
  ![Options and Dashboards](./images/Options.png)
94
96
 
95
- ## Reusable Widget Library
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
  ![Sample Gauges Image](./images/KipGaugeSample1-1024x545.png)
125
127
 
126
- Various
128
+ Various other types of widgets
127
129
  ![Electrical Concept Image](./images/KipGaugeSample2-1024x488.png)
128
130
 
129
- Freeboard-SK Integration with Autopilot
131
+ Freeboard-SK Chartplotter integration with Autopilot widget
130
132
  ![Freeboard-SK Image](./images/KipFreeboard-SK-1024.png)
131
133
 
132
- Grafana Integration
134
+ Grafana integration with other widgets
133
135
  ![Embedded Webpage Concept Image](./images/KipGaugeSample3-1024x508.png)
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
  ![Night mode - Brightness](./images/KipBrightness-1024.png)
141
143
 
142
- ## Harness the Power of Data State Notifications
143
- Stay informed with notifications about the state of the data you are interested in.
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 display 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.
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 (many are often bundled with Signal K distributions):
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
- # Connect, Share, and Support
174
- KIP has its own Discord Signal K channel for getting in touch. Join us at https://discord.gg/AMDYT2DQga
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
- **Processing & Extensions**
198
- - **Signal K Plugins** – Domain‑specific enrichment (polars, performance calculations, derived environmental data, routing aids) published directly into the Signal K data model that KIP can then display.
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
- **Why this separation matters**
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
- **Tools**
220
+ ## Getting Started
207
221
 
208
- Linux, Mac, RPi, or Windows dev platform supported
209
- 1. Install the latest Node version (v20+)
210
- 2. Download your favorite coding IDE (we use the free Visual Studio Code)
211
- 3. Create your own GitHub KIP fork.
212
- 4. Configure your IDE's source control to point to your forked KIP instance (with Visual Studio Code, GitHub support is built-in) and get the fork's master branch locally.
213
- 5. Install `npm` and `node`. On macOS, you can use `brew install node` if you have Homebrew.
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
- **Coding**
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 branch folder, if not done automatically by your IDE.
220
- 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.
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
- **Setup**
224
- 1. Fire up your local dev instance with `npm run dev`.
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 dev server and allow remote devices connections, such as with your phone or RPi:
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**: Always extend `BaseWidgetComponent` (see COPILOT.md).
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