@mxtommy/kip 3.9.0-beta.2 → 3.9.0-beta.21

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 (178) hide show
  1. package/.github/copilot-instructions.md +1 -1
  2. package/.github/instructions/angular.instructions.md +46 -0
  3. package/README.md +49 -12
  4. package/package.json +2 -4
  5. package/public/3rdpartylicenses.txt +77 -77
  6. package/public/app-help.component.css.map +7 -0
  7. package/public/app.component.css.map +7 -0
  8. package/public/assets/help-docs/configuration.md +4 -4
  9. package/public/assets/help-docs/dashboards.md +4 -2
  10. package/public/assets/svg/icons.svg +1 -1
  11. package/public/boolean-control-config.component.css.map +7 -0
  12. package/public/boolean-multicontrol-options.component.css.map +7 -0
  13. package/public/chunk-3EWIS24B.js +5237 -0
  14. package/public/chunk-3EWIS24B.js.map +1 -0
  15. package/public/chunk-3VR3EA35.js +1022 -0
  16. package/public/chunk-3VR3EA35.js.map +1 -0
  17. package/public/chunk-63ILPRXC.js +2091 -0
  18. package/public/chunk-63ILPRXC.js.map +1 -0
  19. package/public/chunk-65ZWQBS6.js +3102 -0
  20. package/public/chunk-65ZWQBS6.js.map +1 -0
  21. package/public/chunk-B3LKEWZP.js +4950 -0
  22. package/public/chunk-B3LKEWZP.js.map +1 -0
  23. package/public/chunk-BIBIW64D.js +16773 -0
  24. package/public/chunk-BIBIW64D.js.map +1 -0
  25. package/public/chunk-BM53SC5N.js +77 -0
  26. package/public/chunk-BM53SC5N.js.map +7 -0
  27. package/public/chunk-D7ILNFDM.js +3059 -0
  28. package/public/chunk-D7ILNFDM.js.map +1 -0
  29. package/public/chunk-E24UNLSJ.js +2228 -0
  30. package/public/chunk-E24UNLSJ.js.map +1 -0
  31. package/public/chunk-J42S2ELC.js +5927 -0
  32. package/public/chunk-J42S2ELC.js.map +1 -0
  33. package/public/chunk-KC22A6VH.js +17 -0
  34. package/public/chunk-KC22A6VH.js.map +7 -0
  35. package/public/chunk-MCEJWZB2.js +116 -0
  36. package/public/chunk-MCEJWZB2.js.map +1 -0
  37. package/public/chunk-NBF6SE6O.js +89 -0
  38. package/public/chunk-NBF6SE6O.js.map +7 -0
  39. package/public/chunk-QC7VGVAR.js +343 -0
  40. package/public/chunk-QC7VGVAR.js.map +7 -0
  41. package/public/chunk-SDOP6T56.js +42377 -0
  42. package/public/chunk-SDOP6T56.js.map +1 -0
  43. package/public/chunk-U2DCSTRY.js +159 -0
  44. package/public/chunk-U2DCSTRY.js.map +7 -0
  45. package/public/chunk-UHVNAEXC.js +4752 -0
  46. package/public/chunk-UHVNAEXC.js.map +1 -0
  47. package/public/chunk-UQYTD5AC.js +2723 -0
  48. package/public/chunk-UQYTD5AC.js.map +1 -0
  49. package/public/chunk-XSABJ5NZ.js +272 -0
  50. package/public/chunk-XSABJ5NZ.js.map +7 -0
  51. package/public/chunk-Y6N6O2IP.js +19852 -0
  52. package/public/chunk-Y6N6O2IP.js.map +1 -0
  53. package/public/chunk-YGJLBLOX.js +2708 -0
  54. package/public/chunk-YGJLBLOX.js.map +1 -0
  55. package/public/chunk-YT33DHC3.js +591 -0
  56. package/public/chunk-YT33DHC3.js.map +7 -0
  57. package/public/chunk-YZXYVP72.js +4934 -0
  58. package/public/chunk-YZXYVP72.js.map +1 -0
  59. package/public/chunk-ZEHRDSTB.js +13727 -0
  60. package/public/chunk-ZEHRDSTB.js.map +1 -0
  61. package/public/config.component.css.map +7 -0
  62. package/public/dashboard-scroller.component.css.map +7 -0
  63. package/public/dashboard.component.css.map +7 -0
  64. package/public/dashboards-editor.component.css.map +7 -0
  65. package/public/data-inspector-row.component.css.map +7 -0
  66. package/public/data-inspector.component.css.map +7 -0
  67. package/public/dataset-chart-options.component.css.map +7 -0
  68. package/public/datasets.component.css.map +7 -0
  69. package/public/dialog-confirmation.component.css.map +7 -0
  70. package/public/dialog-dashboard-page-editor.component.css.map +7 -0
  71. package/public/dialog-frame.component.css.map +7 -0
  72. package/public/dialog-name.component.css.map +7 -0
  73. package/public/display-chart-options.component.css.map +7 -0
  74. package/public/display.component.css.map +7 -0
  75. package/public/gauge-steel.component.css.map +7 -0
  76. package/public/home.component.css.map +7 -0
  77. package/public/index.html +19 -17
  78. package/public/main.js +36423 -0
  79. package/public/main.js.map +1 -0
  80. package/public/menu-actions.component.css.map +7 -0
  81. package/public/menu-notifications.component.css.map +7 -0
  82. package/public/minichart.component.css.map +7 -0
  83. package/public/modal-user-credential.component.css.map +7 -0
  84. package/public/modal-widget-config.component.css.map +7 -0
  85. package/public/notification-badge.component.css.map +7 -0
  86. package/public/page-header.component.css.map +7 -0
  87. package/public/path-control-config.component.css.map +7 -0
  88. package/public/paths-options.component.css.map +7 -0
  89. package/public/polyfills.js +4422 -0
  90. package/public/polyfills.js.map +1 -0
  91. package/public/select-autopilot.component.css.map +7 -0
  92. package/public/select-icon.component.css.map +7 -0
  93. package/public/settings.component.css.map +7 -0
  94. package/public/signalk.component.css.map +7 -0
  95. package/public/styles.css +1651 -0
  96. package/public/styles.css.map +7 -0
  97. package/public/svg-autopilot.component.css.map +7 -0
  98. package/public/svg-racesteer.component.css.map +7 -0
  99. package/public/svg-simple-linear-gauge.component.css.map +7 -0
  100. package/public/svg-windsteer.component.css.map +7 -0
  101. package/public/tile-large-icon.component.css.map +7 -0
  102. package/public/units.component.css.map +7 -0
  103. package/public/upgrade-config.component.css.map +7 -0
  104. package/public/widget-autopilot.component.css.map +7 -0
  105. package/public/widget-boolean-switch.component.css.map +7 -0
  106. package/public/widget-datetime.component.css.map +7 -0
  107. package/public/widget-freeboardsk.component.css.map +7 -0
  108. package/public/widget-gauge-ng-compass.component.css.map +7 -0
  109. package/public/widget-gauge-ng-linear.component.css.map +7 -0
  110. package/public/widget-gauge-ng-radial.component.css.map +7 -0
  111. package/public/widget-gauge-steel.component.css.map +7 -0
  112. package/public/widget-horizon.component.css.map +7 -0
  113. package/public/widget-host.component.css.map +7 -0
  114. package/public/widget-iframe.component.css.map +7 -0
  115. package/public/widget-label.component.css.map +7 -0
  116. package/public/widget-list-card.component.css.map +7 -0
  117. package/public/widget-numeric.component.css.map +7 -0
  118. package/public/widget-position.component.css.map +7 -0
  119. package/public/widget-race-timer.component.css.map +7 -0
  120. package/public/widget-racer-line.component.css.map +7 -0
  121. package/public/widget-racer-timer.component.css.map +7 -0
  122. package/public/widget-simple-linear.component.css.map +7 -0
  123. package/public/widget-slider.component.css.map +7 -0
  124. package/public/widget-text.component.css.map +7 -0
  125. package/public/widget-title.component.css.map +7 -0
  126. package/public/widget-tutorial.component.css.map +7 -0
  127. package/public/widgets-list.component.css.map +7 -0
  128. package/public/assets/hammer.min.js +0 -7
  129. package/public/chunk-2YVW3TBK.js +0 -2
  130. package/public/chunk-35L7BBBD.js +0 -15
  131. package/public/chunk-3LEMFOCV.js +0 -3
  132. package/public/chunk-3LJAKLLW.js +0 -1
  133. package/public/chunk-4JJLPUET.js +0 -60
  134. package/public/chunk-CBUY7NMR.js +0 -2
  135. package/public/chunk-CQXWGD3T.js +0 -2
  136. package/public/chunk-EUFDL4TJ.js +0 -6
  137. package/public/chunk-FBFTGVZ6.js +0 -1
  138. package/public/chunk-HCXH72CD.js +0 -5
  139. package/public/chunk-JY3WVS7C.js +0 -2
  140. package/public/chunk-KTDDP73O.js +0 -2
  141. package/public/chunk-NMEZOCU2.js +0 -1
  142. package/public/chunk-NS2FPVWM.js +0 -4
  143. package/public/chunk-OSYHJB4F.js +0 -11
  144. package/public/chunk-PKNLASTF.js +0 -4
  145. package/public/chunk-Q2Y75POI.js +0 -1
  146. package/public/chunk-RRTCHHRC.js +0 -3
  147. package/public/chunk-TA4GACKT.js +0 -4
  148. package/public/chunk-TXPLRBW5.js +0 -2
  149. package/public/chunk-VHFBF47T.js +0 -1
  150. package/public/chunk-VYUMZVH2.js +0 -2
  151. package/public/chunk-XRGAX4LS.js +0 -2
  152. package/public/chunk-YNJRIFUM.js +0 -1
  153. package/public/chunk-ZBCOJLI4.js +0 -6
  154. package/public/main-XM5EHMUE.js +0 -50
  155. package/public/polyfills-KH22MU6U.js +0 -2
  156. package/public/styles-RECKN66R.css +0 -1
  157. /package/public/media/{KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP-ILKS6RVC.woff2 → KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2} +0 -0
  158. /package/public/media/{KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ-MJ3CERJ6.woff2 → KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2} +0 -0
  159. /package/public/media/{KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP-UW3XWY7P.woff2 → KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2} +0 -0
  160. /package/public/media/{KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP-U3JTBV4H.woff2 → KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2} +0 -0
  161. /package/public/media/{KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP-36ULTGLY.woff2 → KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2} +0 -0
  162. /package/public/media/{KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP-5NJLO2HW.woff2 → KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2} +0 -0
  163. /package/public/media/{KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP-2EL65J2O.woff2 → KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2} +0 -0
  164. /package/public/media/{KFOlCnqEu92Fr1MmSU5fABc4AMP6lbBP-XWLWMQVU.woff2 → KFOlCnqEu92Fr1MmSU5fABc4AMP6lbBP.woff2} +0 -0
  165. /package/public/media/{KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ-PWGJWDFE.woff2 → KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2} +0 -0
  166. /package/public/media/{KFOlCnqEu92Fr1MmSU5fBxc4AMP6lbBP-ITB7NUJC.woff2 → KFOlCnqEu92Fr1MmSU5fBxc4AMP6lbBP.woff2} +0 -0
  167. /package/public/media/{KFOlCnqEu92Fr1MmSU5fCBc4AMP6lbBP-32PLHKPQ.woff2 → KFOlCnqEu92Fr1MmSU5fCBc4AMP6lbBP.woff2} +0 -0
  168. /package/public/media/{KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP-QPSNQEDD.woff2 → KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2} +0 -0
  169. /package/public/media/{KFOlCnqEu92Fr1MmSU5fChc4AMP6lbBP-JKBSJZY3.woff2 → KFOlCnqEu92Fr1MmSU5fChc4AMP6lbBP.woff2} +0 -0
  170. /package/public/media/{KFOlCnqEu92Fr1MmSU5fCxc4AMP6lbBP-OG5AHRIX.woff2 → KFOlCnqEu92Fr1MmSU5fCxc4AMP6lbBP.woff2} +0 -0
  171. /package/public/media/{KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz-PPTELUJT.woff2 → KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2} +0 -0
  172. /package/public/media/{KFOmCnqEu92Fr1Mu4mxKKTU1Kg-SNGEW7FX.woff2 → KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2} +0 -0
  173. /package/public/media/{KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz-DRL4U32S.woff2 → KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2} +0 -0
  174. /package/public/media/{KFOmCnqEu92Fr1Mu72xKKTU1Kvnz-PRJ7OQMU.woff2 → KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2} +0 -0
  175. /package/public/media/{KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz-HW6RMPJ3.woff2 → KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2} +0 -0
  176. /package/public/media/{KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz-KZD6JQRT.woff2 → KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2} +0 -0
  177. /package/public/media/{KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz-Z72STTMG.woff2 → KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2} +0 -0
  178. /package/public/media/{flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ-CN2J7AYH.woff2 → flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.woff2} +0 -0
@@ -0,0 +1,17 @@
1
+ import {
2
+ SettingsDatasetsComponent,
3
+ SettingsDatasetsModalComponent
4
+ } from "./chunk-YGJLBLOX.js";
5
+ import "./chunk-63ILPRXC.js";
6
+ import "./chunk-B3LKEWZP.js";
7
+ import "./chunk-3VR3EA35.js";
8
+ import "./chunk-65ZWQBS6.js";
9
+ import "./chunk-UQYTD5AC.js";
10
+ import "./chunk-MCEJWZB2.js";
11
+ import "./chunk-BIBIW64D.js";
12
+ import "./chunk-SDOP6T56.js";
13
+ export {
14
+ SettingsDatasetsComponent,
15
+ SettingsDatasetsModalComponent
16
+ };
17
+ //# sourceMappingURL=chunk-KC22A6VH.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,116 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ Input,
5
+ MatCommonModule,
6
+ NgModule,
7
+ ViewEncapsulation,
8
+ coerceBooleanProperty,
9
+ setClassMetadata,
10
+ ɵɵattribute,
11
+ ɵɵclassProp,
12
+ ɵɵdefineComponent,
13
+ ɵɵdefineInjector,
14
+ ɵɵdefineNgModule
15
+ } from "./chunk-SDOP6T56.js";
16
+
17
+ // node_modules/@angular/material/fesm2022/divider.mjs
18
+ var MatDivider = class _MatDivider {
19
+ /** Whether the divider is vertically aligned. */
20
+ get vertical() {
21
+ return this._vertical;
22
+ }
23
+ set vertical(value) {
24
+ this._vertical = coerceBooleanProperty(value);
25
+ }
26
+ _vertical = false;
27
+ /** Whether the divider is an inset divider. */
28
+ get inset() {
29
+ return this._inset;
30
+ }
31
+ set inset(value) {
32
+ this._inset = coerceBooleanProperty(value);
33
+ }
34
+ _inset = false;
35
+ static \u0275fac = function MatDivider_Factory(__ngFactoryType__) {
36
+ return new (__ngFactoryType__ || _MatDivider)();
37
+ };
38
+ static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({
39
+ type: _MatDivider,
40
+ selectors: [["mat-divider"]],
41
+ hostAttrs: ["role", "separator", 1, "mat-divider"],
42
+ hostVars: 7,
43
+ hostBindings: function MatDivider_HostBindings(rf, ctx) {
44
+ if (rf & 2) {
45
+ \u0275\u0275attribute("aria-orientation", ctx.vertical ? "vertical" : "horizontal");
46
+ \u0275\u0275classProp("mat-divider-vertical", ctx.vertical)("mat-divider-horizontal", !ctx.vertical)("mat-divider-inset", ctx.inset);
47
+ }
48
+ },
49
+ inputs: {
50
+ vertical: "vertical",
51
+ inset: "inset"
52
+ },
53
+ decls: 0,
54
+ vars: 0,
55
+ template: function MatDivider_Template(rf, ctx) {
56
+ },
57
+ 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}\n"],
58
+ encapsulation: 2,
59
+ changeDetection: 0
60
+ });
61
+ };
62
+ (() => {
63
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatDivider, [{
64
+ type: Component,
65
+ args: [{
66
+ selector: "mat-divider",
67
+ host: {
68
+ "role": "separator",
69
+ "[attr.aria-orientation]": 'vertical ? "vertical" : "horizontal"',
70
+ "[class.mat-divider-vertical]": "vertical",
71
+ "[class.mat-divider-horizontal]": "!vertical",
72
+ "[class.mat-divider-inset]": "inset",
73
+ "class": "mat-divider"
74
+ },
75
+ template: "",
76
+ encapsulation: ViewEncapsulation.None,
77
+ changeDetection: ChangeDetectionStrategy.OnPush,
78
+ 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}\n"]
79
+ }]
80
+ }], null, {
81
+ vertical: [{
82
+ type: Input
83
+ }],
84
+ inset: [{
85
+ type: Input
86
+ }]
87
+ });
88
+ })();
89
+ var MatDividerModule = class _MatDividerModule {
90
+ static \u0275fac = function MatDividerModule_Factory(__ngFactoryType__) {
91
+ return new (__ngFactoryType__ || _MatDividerModule)();
92
+ };
93
+ static \u0275mod = /* @__PURE__ */ \u0275\u0275defineNgModule({
94
+ type: _MatDividerModule,
95
+ imports: [MatCommonModule, MatDivider],
96
+ exports: [MatDivider, MatCommonModule]
97
+ });
98
+ static \u0275inj = /* @__PURE__ */ \u0275\u0275defineInjector({
99
+ imports: [MatCommonModule, MatCommonModule]
100
+ });
101
+ };
102
+ (() => {
103
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatDividerModule, [{
104
+ type: NgModule,
105
+ args: [{
106
+ imports: [MatCommonModule, MatDivider],
107
+ exports: [MatDivider, MatCommonModule]
108
+ }]
109
+ }], null, null);
110
+ })();
111
+
112
+ export {
113
+ MatDivider,
114
+ MatDividerModule
115
+ };
116
+ //# sourceMappingURL=chunk-MCEJWZB2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["node_modules/@angular/material/fesm2022/divider.mjs"],"sourcesContent":["import * as i0 from '@angular/core';\nimport { Component, ViewEncapsulation, ChangeDetectionStrategy, Input, NgModule } from '@angular/core';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { M as MatCommonModule } from './common-module-cKSwHniA.mjs';\nimport '@angular/cdk/a11y';\nimport '@angular/cdk/bidi';\nclass MatDivider {\n /** Whether the divider is vertically aligned. */\n get vertical() {\n return this._vertical;\n }\n set vertical(value) {\n this._vertical = coerceBooleanProperty(value);\n }\n _vertical = false;\n /** Whether the divider is an inset divider. */\n get inset() {\n return this._inset;\n }\n set inset(value) {\n this._inset = coerceBooleanProperty(value);\n }\n _inset = false;\n static ɵfac = function MatDivider_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatDivider)();\n };\n static ɵcmp = /* @__PURE__ */i0.ɵɵdefineComponent({\n type: MatDivider,\n selectors: [[\"mat-divider\"]],\n hostAttrs: [\"role\", \"separator\", 1, \"mat-divider\"],\n hostVars: 7,\n hostBindings: function MatDivider_HostBindings(rf, ctx) {\n if (rf & 2) {\n i0.ɵɵattribute(\"aria-orientation\", ctx.vertical ? \"vertical\" : \"horizontal\");\n i0.ɵɵclassProp(\"mat-divider-vertical\", ctx.vertical)(\"mat-divider-horizontal\", !ctx.vertical)(\"mat-divider-inset\", ctx.inset);\n }\n },\n inputs: {\n vertical: \"vertical\",\n inset: \"inset\"\n },\n decls: 0,\n vars: 0,\n template: function MatDivider_Template(rf, ctx) {},\n 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}\\n\"],\n encapsulation: 2,\n changeDetection: 0\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(MatDivider, [{\n type: Component,\n args: [{\n selector: 'mat-divider',\n host: {\n 'role': 'separator',\n '[attr.aria-orientation]': 'vertical ? \"vertical\" : \"horizontal\"',\n '[class.mat-divider-vertical]': 'vertical',\n '[class.mat-divider-horizontal]': '!vertical',\n '[class.mat-divider-inset]': 'inset',\n 'class': 'mat-divider'\n },\n template: '',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n 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}\\n\"]\n }]\n }], null, {\n vertical: [{\n type: Input\n }],\n inset: [{\n type: Input\n }]\n });\n})();\nclass MatDividerModule {\n static ɵfac = function MatDividerModule_Factory(__ngFactoryType__) {\n return new (__ngFactoryType__ || MatDividerModule)();\n };\n static ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: MatDividerModule,\n imports: [MatCommonModule, MatDivider],\n exports: [MatDivider, MatCommonModule]\n });\n static ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({\n imports: [MatCommonModule, MatCommonModule]\n });\n}\n(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(MatDividerModule, [{\n type: NgModule,\n args: [{\n imports: [MatCommonModule, MatDivider],\n exports: [MatDivider, MatCommonModule]\n }]\n }], null, null);\n})();\nexport { MatDivider, MatDividerModule };\n"],"mappings":";;;;;;;;;;;;;;;;;AAMA,IAAM,aAAN,MAAM,YAAW;AAAA;AAAA,EAEf,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,SAAS,OAAO;AAClB,SAAK,YAAY,sBAAsB,KAAK;AAAA,EAC9C;AAAA,EACA,YAAY;AAAA;AAAA,EAEZ,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,MAAM,OAAO;AACf,SAAK,SAAS,sBAAsB,KAAK;AAAA,EAC3C;AAAA,EACA,SAAS;AAAA,EACT,OAAO,YAAO,SAAS,mBAAmB,mBAAmB;AAC3D,WAAO,KAAK,qBAAqB,aAAY;AAAA,EAC/C;AAAA,EACA,OAAO,YAAsB,gBAAG,4BAAkB;AAAA,IAChD,MAAM;AAAA,IACN,WAAW,CAAC,CAAC,aAAa,CAAC;AAAA,IAC3B,WAAW,CAAC,QAAQ,aAAa,GAAG,aAAa;AAAA,IACjD,UAAU;AAAA,IACV,cAAc,SAAS,wBAAwB,IAAI,KAAK;AACtD,UAAI,KAAK,GAAG;AACV,QAAG,sBAAY,oBAAoB,IAAI,WAAW,aAAa,YAAY;AAC3E,QAAG,sBAAY,wBAAwB,IAAI,QAAQ,EAAE,0BAA0B,CAAC,IAAI,QAAQ,EAAE,qBAAqB,IAAI,KAAK;AAAA,MAC9H;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,SAAS,oBAAoB,IAAI,KAAK;AAAA,IAAC;AAAA,IACjD,QAAQ,CAAC,yeAAye;AAAA,IAClf,eAAe;AAAA,IACf,iBAAiB;AAAA,EACnB,CAAC;AACH;AAAA,CACC,MAAM;AACL,GAAC,OAAO,cAAc,eAAe,cAAiB,iBAAkB,YAAY,CAAC;AAAA,IACnF,MAAM;AAAA,IACN,MAAM,CAAC;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,2BAA2B;AAAA,QAC3B,gCAAgC;AAAA,QAChC,kCAAkC;AAAA,QAClC,6BAA6B;AAAA,QAC7B,SAAS;AAAA,MACX;AAAA,MACA,UAAU;AAAA,MACV,eAAe,kBAAkB;AAAA,MACjC,iBAAiB,wBAAwB;AAAA,MACzC,QAAQ,CAAC,yeAAye;AAAA,IACpf,CAAC;AAAA,EACH,CAAC,GAAG,MAAM;AAAA,IACR,UAAU,CAAC;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAAA,EACH,CAAC;AACH,GAAG;AACH,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EACrB,OAAO,YAAO,SAAS,yBAAyB,mBAAmB;AACjE,WAAO,KAAK,qBAAqB,mBAAkB;AAAA,EACrD;AAAA,EACA,OAAO,YAAsB,gBAAG,2BAAiB;AAAA,IAC/C,MAAM;AAAA,IACN,SAAS,CAAC,iBAAiB,UAAU;AAAA,IACrC,SAAS,CAAC,YAAY,eAAe;AAAA,EACvC,CAAC;AAAA,EACD,OAAO,YAAsB,gBAAG,2BAAiB;AAAA,IAC/C,SAAS,CAAC,iBAAiB,eAAe;AAAA,EAC5C,CAAC;AACH;AAAA,CACC,MAAM;AACL,GAAC,OAAO,cAAc,eAAe,cAAiB,iBAAkB,kBAAkB,CAAC;AAAA,IACzF,MAAM;AAAA,IACN,MAAM,CAAC;AAAA,MACL,SAAS,CAAC,iBAAiB,UAAU;AAAA,MACrC,SAAS,CAAC,YAAY,eAAe;AAAA,IACvC,CAAC;AAAA,EACH,CAAC,GAAG,MAAM,IAAI;AAChB,GAAG;","names":[],"x_google_ignoreList":[0]}
@@ -0,0 +1,89 @@
1
+ import {
2
+ ModalUserCredentialComponent
3
+ } from "./chunk-U2DCSTRY.js";
4
+ import {
5
+ AppService
6
+ } from "./chunk-QC7VGVAR.js";
7
+ import "./chunk-MCEJWZB2.js";
8
+ import {
9
+ AppSettingsService,
10
+ AuthenticationService,
11
+ MatDialog
12
+ } from "./chunk-BIBIW64D.js";
13
+ import {
14
+ Component,
15
+ inject,
16
+ setClassMetadata,
17
+ ɵsetClassDebugInfo,
18
+ ɵɵdefineComponent
19
+ } from "./chunk-SDOP6T56.js";
20
+
21
+ // src/app/widgets/widget-login/widget-login.component.ts
22
+ var WidgetLoginComponent = class _WidgetLoginComponent {
23
+ dialog = inject(MatDialog);
24
+ auth = inject(AuthenticationService);
25
+ appService = inject(AppService);
26
+ appSettingsService = inject(AppSettingsService);
27
+ connectionConfig = null;
28
+ ngOnInit() {
29
+ this.connectionConfig = this.appSettingsService.getConnectionConfig();
30
+ this.openUserCredentialModal("Sign in failed: Incorrect user/password. Enter valide credentials or access the Confifuration/Settings menu, validate the server URL or/and disable the user Sign in option");
31
+ }
32
+ openUserCredentialModal(errorMsg) {
33
+ const dialogRef = this.dialog.open(ModalUserCredentialComponent, {
34
+ disableClose: true,
35
+ data: {
36
+ user: this.connectionConfig.loginName,
37
+ password: this.connectionConfig.loginPassword,
38
+ error: errorMsg
39
+ }
40
+ });
41
+ dialogRef.afterClosed().subscribe((data) => {
42
+ if (data === void 0 || !data) {
43
+ return;
44
+ } else {
45
+ this.connectionConfig.loginName = data.user;
46
+ this.connectionConfig.loginPassword = data.password;
47
+ this.appSettingsService.setConnectionConfig(this.connectionConfig);
48
+ this.serverLogin();
49
+ }
50
+ });
51
+ }
52
+ serverLogin(newUrl) {
53
+ this.auth.login({ usr: this.connectionConfig.loginName, pwd: this.connectionConfig.loginPassword, newUrl }).then(() => {
54
+ this.appSettingsService.reloadApp();
55
+ }).catch((error) => {
56
+ if (error.status == 401) {
57
+ this.openUserCredentialModal("Sign in failed: Invalide user/password. Enter valide credentials");
58
+ console.log("[Setting-SignalK Component] Sign in failed: " + error.error.message);
59
+ } else if (error.status == 404) {
60
+ this.appService.sendSnackbarNotification("Sign in failed: Login API not found at URL. See connection detail status in Configuration/Settings", 5e3, false);
61
+ console.log("[Setting-SignalK Component] Sign in failed: " + error.error.message);
62
+ } else if (error.status == 0) {
63
+ this.appService.sendSnackbarNotification("Sign in failed: Cannot reach server at Signal K URL. See connection detail status in Configuration/Settings", 5e3, false);
64
+ console.log("[Setting-SignalK Component] Sign in failed: Cannot reach server at Signal K URL:" + error.message);
65
+ } else {
66
+ this.appService.sendSnackbarNotification("Unknown authentication failure: " + JSON.stringify(error), 5e3, false);
67
+ console.log("[Setting-SignalK Component] Unknown login error response: " + JSON.stringify(error));
68
+ }
69
+ });
70
+ }
71
+ static \u0275fac = function WidgetLoginComponent_Factory(__ngFactoryType__) {
72
+ return new (__ngFactoryType__ || _WidgetLoginComponent)();
73
+ };
74
+ static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({ type: _WidgetLoginComponent, selectors: [["app-widget-login"]], decls: 0, vars: 0, template: function WidgetLoginComponent_Template(rf, ctx) {
75
+ }, encapsulation: 2 });
76
+ };
77
+ (() => {
78
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(WidgetLoginComponent, [{
79
+ type: Component,
80
+ args: [{ selector: "app-widget-login", standalone: true, template: "" }]
81
+ }], null, null);
82
+ })();
83
+ (() => {
84
+ (typeof ngDevMode === "undefined" || ngDevMode) && \u0275setClassDebugInfo(WidgetLoginComponent, { className: "WidgetLoginComponent", filePath: "src/app/widgets/widget-login/widget-login.component.ts", lineNumber: 17 });
85
+ })();
86
+ export {
87
+ WidgetLoginComponent
88
+ };
89
+ //# sourceMappingURL=chunk-NBF6SE6O.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["src/app/widgets/widget-login/widget-login.component.ts"],
4
+ "sourcesContent": ["import { Component, OnInit, inject } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { AuthenticationService } from \"../../core/services/authentication.service\";\nimport { AppSettingsService } from '../../core/services/app-settings.service';\nimport { ModalUserCredentialComponent } from '../../core/components/modal-user-credential/modal-user-credential.component';\nimport { IConnectionConfig } from \"../../core/interfaces/app-settings.interfaces\";\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { AppService } from '../../core/services/app-service';\n\n\n@Component({\n selector: 'app-widget-login',\n templateUrl: './widget-login.component.html',\n styleUrls: ['./widget-login.component.css'],\n standalone: true\n})\nexport class WidgetLoginComponent implements OnInit {\n dialog = inject(MatDialog);\n private auth = inject(AuthenticationService);\n private appService = inject(AppService);\n private appSettingsService = inject(AppSettingsService);\n\n public connectionConfig: IConnectionConfig = null;\n\n ngOnInit(): void {\n this.connectionConfig = this.appSettingsService.getConnectionConfig();\n this.openUserCredentialModal(\"Sign in failed: Incorrect user/password. Enter valide credentials or access the Confifuration/Settings menu, validate the server URL or/and disable the user Sign in option\");\n }\n\n public openUserCredentialModal(errorMsg: string) {\n const dialogRef = this.dialog.open(ModalUserCredentialComponent, {\n disableClose: true,\n data: {\n user: this.connectionConfig.loginName,\n password: this.connectionConfig.loginPassword,\n error: errorMsg\n }\n });\n\n dialogRef.afterClosed().subscribe(data => {\n if (data === undefined || !data) {\n return; //clicked Cancel or navigated await from page using url bar.\n } else {\n this.connectionConfig.loginName = data.user;\n this.connectionConfig.loginPassword = data.password;\n this.appSettingsService.setConnectionConfig(this.connectionConfig);\n this.serverLogin();\n }\n });\n }\n\n private serverLogin(newUrl?: string) {\n this.auth.login({ usr: this.connectionConfig.loginName, pwd: this.connectionConfig.loginPassword, newUrl })\n .then(() => {\n this.appSettingsService.reloadApp();\n })\n .catch((error: HttpErrorResponse) => {\n if (error.status == 401) {\n this.openUserCredentialModal(\"Sign in failed: Invalide user/password. Enter valide credentials\");\n console.log(\"[Setting-SignalK Component] Sign in failed: \" + error.error.message);\n } else if (error.status == 404) {\n this.appService.sendSnackbarNotification(\"Sign in failed: Login API not found at URL. See connection detail status in Configuration/Settings\", 5000, false);\n console.log(\"[Setting-SignalK Component] Sign in failed: \" + error.error.message);\n } else if (error.status == 0) {\n this.appService.sendSnackbarNotification(\"Sign in failed: Cannot reach server at Signal K URL. See connection detail status in Configuration/Settings\", 5000, false);\n console.log(\"[Setting-SignalK Component] Sign in failed: Cannot reach server at Signal K URL:\" + error.message);\n } else {\n this.appService.sendSnackbarNotification(\"Unknown authentication failure: \" + JSON.stringify(error), 5000, false);\n console.log(\"[Setting-SignalK Component] Unknown login error response: \" + JSON.stringify(error));\n }\n });\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;AAgBM,IAAO,uBAAP,MAAO,sBAAoB;EAC/B,SAAS,OAAO,SAAS;EACjB,OAAO,OAAO,qBAAqB;EACnC,aAAa,OAAO,UAAU;EAC9B,qBAAqB,OAAO,kBAAkB;EAE/C,mBAAsC;EAE7C,WAAQ;AACN,SAAK,mBAAmB,KAAK,mBAAmB,oBAAmB;AACnE,SAAK,wBAAwB,6KAA6K;EAC5M;EAEO,wBAAwB,UAAgB;AAC7C,UAAM,YAAY,KAAK,OAAO,KAAK,8BAA8B;MAC/D,cAAc;MACd,MAAM;QACJ,MAAM,KAAK,iBAAiB;QAC5B,UAAU,KAAK,iBAAiB;QAChC,OAAO;;KAEV;AAED,cAAU,YAAW,EAAG,UAAU,UAAO;AACvC,UAAI,SAAS,UAAa,CAAC,MAAM;AAC/B;MACF,OAAO;AACL,aAAK,iBAAiB,YAAY,KAAK;AACvC,aAAK,iBAAiB,gBAAgB,KAAK;AAC3C,aAAK,mBAAmB,oBAAoB,KAAK,gBAAgB;AACjE,aAAK,YAAW;MAClB;IACF,CAAC;EACH;EAEQ,YAAY,QAAe;AACjC,SAAK,KAAK,MAAM,EAAE,KAAK,KAAK,iBAAiB,WAAW,KAAK,KAAK,iBAAiB,eAAe,OAAM,CAAE,EACzG,KAAK,MAAK;AACT,WAAK,mBAAmB,UAAS;IACnC,CAAC,EACA,MAAM,CAAC,UAA4B;AAClC,UAAI,MAAM,UAAU,KAAK;AACvB,aAAK,wBAAwB,kEAAkE;AAC/F,gBAAQ,IAAI,iDAAiD,MAAM,MAAM,OAAO;MAClF,WAAW,MAAM,UAAU,KAAK;AAC9B,aAAK,WAAW,yBAAyB,sGAAsG,KAAM,KAAK;AAC1J,gBAAQ,IAAI,iDAAiD,MAAM,MAAM,OAAO;MAClF,WAAW,MAAM,UAAU,GAAG;AAC5B,aAAK,WAAW,yBAAyB,+GAA+G,KAAM,KAAK;AACnK,gBAAQ,IAAI,qFAAqF,MAAM,OAAO;MAChH,OAAO;AACL,aAAK,WAAW,yBAAyB,qCAAqC,KAAK,UAAU,KAAK,GAAG,KAAM,KAAK;AAChH,gBAAQ,IAAI,+DAA+D,KAAK,UAAU,KAAK,CAAC;MAClG;IACF,CAAC;EACH;;qCAvDW,uBAAoB;EAAA;yEAApB,uBAAoB,WAAA,CAAA,CAAA,kBAAA,CAAA,GAAA,OAAA,GAAA,MAAA,GAAA,UAAA,SAAA,8BAAA,IAAA,KAAA;EAAA,GAAA,eAAA,EAAA,CAAA;;;sEAApB,sBAAoB,CAAA;UANhC;uBACa,oBAAkB,YAGhB,MAAI,UAAA,GAAA,CAAA;;;;6EAEP,sBAAoB,EAAA,WAAA,wBAAA,UAAA,0DAAA,YAAA,GAAA,CAAA;AAAA,GAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,343 @@
1
+ import {
2
+ AppSettingsService,
3
+ DataService
4
+ } from "./chunk-BIBIW64D.js";
5
+ import {
6
+ BehaviorSubject,
7
+ Injectable,
8
+ Subject,
9
+ effect,
10
+ inject,
11
+ setClassMetadata,
12
+ signal,
13
+ toSignal,
14
+ untracked,
15
+ ɵɵdefineInjectable
16
+ } from "./chunk-SDOP6T56.js";
17
+
18
+ // package.json
19
+ var package_default = {
20
+ name: "@mxtommy/kip",
21
+ version: "3.9.0-beta.21",
22
+ description: "An advanced and versatile marine instrumentation package to display Signal K data.",
23
+ license: "MIT",
24
+ author: {
25
+ name: "Thomas St.Pierre, David Godin"
26
+ },
27
+ contributors: [
28
+ {
29
+ name: "David Godin",
30
+ email: "godind@hotmail.com"
31
+ },
32
+ {
33
+ name: "Thomas St.Pierre",
34
+ email: "thomas@samoht.ca"
35
+ }
36
+ ],
37
+ homepage: "https://github.com/mxtommy/Kip",
38
+ bugs: "https://github.com/mxtommy/Kip/issues",
39
+ repository: {
40
+ type: "git",
41
+ url: "git+https://github.com/mxtommy/Kip.git"
42
+ },
43
+ keywords: [
44
+ "signalk-webapp",
45
+ "signalk-category-instruments",
46
+ "signal k",
47
+ "signalk",
48
+ "instruments",
49
+ "dashboard",
50
+ "marine",
51
+ "nmea"
52
+ ],
53
+ signalk: {
54
+ appIcon: "assets/icon-72x72.png",
55
+ displayName: "KIP Instrument MFD"
56
+ },
57
+ scripts: {
58
+ dev: "ng serve --configuration=dev --serve-path=/@mxtommy/kip/",
59
+ "build-dev": "ng build --configuration=dev",
60
+ "build-prod": "ng build --configuration=production",
61
+ test: "ng test",
62
+ lint: "ng lint",
63
+ e2e: "ng e2e"
64
+ },
65
+ devDependencies: {
66
+ "@angular-devkit/build-angular": "^20.1.6",
67
+ "@angular/animations": "20.1.7",
68
+ "@angular/build": "^20.1.6",
69
+ "@angular/cdk": "20.1.6",
70
+ "@angular/cli": "^20.1.6",
71
+ "@angular/common": "20.1.7",
72
+ "@angular/compiler": "20.1.7",
73
+ "@angular/compiler-cli": "20.1.7",
74
+ "@angular/core": "20.1.7",
75
+ "@angular/forms": "20.1.7",
76
+ "@angular/language-service": "20.1.7",
77
+ "@angular/material": "20.1.6",
78
+ "@angular/platform-browser": "20.1.7",
79
+ "@angular/platform-browser-dynamic": "20.1.7",
80
+ "@angular/router": "20.1.7",
81
+ "@godind/ng-canvas-gauges": "^6.2.1",
82
+ "@robloche/chartjs-plugin-streaming": "^3.1.0",
83
+ "@types/canvas-gauges": "^2.1.8",
84
+ "@types/howler": "^2.2.10",
85
+ "@types/jasmine": "~3.6.0",
86
+ "@types/jasminewd2": "^2.0.9",
87
+ "@types/js-quantities": "^1.6.6",
88
+ "@types/lodash-es": "^4.17.9",
89
+ "@types/node": "^24.1.0",
90
+ "@zakj/no-sleep": "^0.13.5",
91
+ "angular-eslint": "20.1.1",
92
+ "chart.js": "^4.4.9",
93
+ "chartjs-adapter-date-fns": "^3.0.0",
94
+ "chartjs-plugin-annotation": "^3.0.1",
95
+ codelyzer: "^6.0.0",
96
+ "compare-versions": "^6.1.1",
97
+ "core-js": "^3.13.1",
98
+ "date-fns": "^2.30.0",
99
+ eslint: "^9.29.0",
100
+ gridstack: "^11.4.0",
101
+ howler: "^2.2.4",
102
+ "jasmine-core": "~4.0.1",
103
+ "jasmine-spec-reporter": "~5.0.0",
104
+ "js-quantities": "^1.8.0",
105
+ karma: "^6.4.4",
106
+ "karma-chrome-launcher": "~3.1.0",
107
+ "karma-cli": "~2.0.0",
108
+ "karma-coverage-istanbul-reporter": "^3.0.3",
109
+ "karma-jasmine": "~4.0.0",
110
+ "karma-jasmine-html-reporter": "^1.6.0",
111
+ "lodash-es": "^4.17.21",
112
+ "ng-packagr": "^20.0.1",
113
+ "ngx-markdown": "^20.0.0",
114
+ "ngx-resize-observer": "^3.1.0",
115
+ protractor: "~7.0.0",
116
+ "pwa-asset-generator": "^8.0.4",
117
+ rxjs: "^7.8.2",
118
+ sass: "^1.49.9",
119
+ screenfull: "^6.0.2",
120
+ steelseries: "^2.0.9",
121
+ "ts-node": "^10.9.2",
122
+ tslib: "^2.6.2",
123
+ typescript: "^5.8.3",
124
+ "zone.js": "^0.15.1"
125
+ }
126
+ };
127
+
128
+ // src/app/core/services/app-service.ts
129
+ var AppService = class _AppService {
130
+ MODE_PATH = "self.environment.mode";
131
+ configurableThemeColors = [
132
+ { label: "Contrast", value: "contrast" },
133
+ { label: "Blue", value: "blue" },
134
+ { label: "Green", value: "green" },
135
+ { label: "Orange", value: "orange" },
136
+ { label: "Yellow", value: "yellow" },
137
+ { label: "Pink", value: "pink" },
138
+ { label: "Purple", value: "purple" },
139
+ { label: "Grey", value: "grey" }
140
+ ];
141
+ snackbarAppNotifications = new Subject();
142
+ // for snackbar message
143
+ cssThemeColorRoles$ = new BehaviorSubject(null);
144
+ _cssThemeColorRoles = null;
145
+ _settings = inject(AppSettingsService);
146
+ _data = inject(DataService);
147
+ isNightMode = signal(false, ...ngDevMode ? [{ debugName: "isNightMode" }] : []);
148
+ _useAutoNightMode = toSignal(this._settings.getAutoNightModeAsO(), { requireSync: true });
149
+ _theme = toSignal(this._settings.getThemeNameAsO(), { requireSync: true });
150
+ _redNightMode = toSignal(this._settings.getRedNightModeAsO(), { requireSync: true });
151
+ _environmentMode = toSignal(this._data.subscribePath(this.MODE_PATH, "default"));
152
+ appVersion = signal(package_default.version, ...ngDevMode ? [{ debugName: "appVersion" }] : []);
153
+ browserVersion = signal("Unknown", ...ngDevMode ? [{ debugName: "browserVersion" }] : []);
154
+ osVersion = signal("Unknown", ...ngDevMode ? [{ debugName: "osVersion" }] : []);
155
+ constructor() {
156
+ effect(() => {
157
+ if (this._theme() === "light-theme") {
158
+ document.body.classList.toggle("light-theme", this._theme() === "light-theme");
159
+ } else {
160
+ document.body.classList.remove("light-theme");
161
+ }
162
+ });
163
+ effect(() => {
164
+ const mode = this._environmentMode().data.value;
165
+ if (this._useAutoNightMode()) {
166
+ this.isNightMode.set(mode === "night");
167
+ this.toggleDayNightMode();
168
+ }
169
+ });
170
+ effect(() => {
171
+ const redNightMode = this._redNightMode();
172
+ untracked(() => {
173
+ if (redNightMode) {
174
+ this.toggleDayNightMode();
175
+ } else {
176
+ this.toggleDayNightMode();
177
+ }
178
+ });
179
+ });
180
+ this.readThemeCssRoleVariables();
181
+ this._cssThemeColorRoles = this.cssThemeColorRoles$.getValue();
182
+ this.browserVersion.set(this.getBrowserVersion());
183
+ this.osVersion.set(this.getOSVersion());
184
+ console.log("*********** KIP Version Information ***********");
185
+ console.log(`** App Version: ${this.appVersion()}`);
186
+ console.log(`** Browser Version: ${this.browserVersion()}`);
187
+ console.log(`** OS Version: ${this.osVersion()}`);
188
+ console.log("***********************************************");
189
+ }
190
+ /**
191
+ * Display Kip Snackbar notification.
192
+ *
193
+ * @param message Text to be displayed.
194
+ * @param duration Display duration in milliseconds before automatic dismissal.
195
+ * Duration value of 0 is indefinite or until use clicks Dismiss button. Defaults
196
+ * to 10000 of no value is provided.
197
+ * @param silent A boolean that defines if the notification should make no sound.
198
+ * Defaults false.
199
+ */
200
+ sendSnackbarNotification(message, duration = 1e4, silent = false, action = "Dismiss") {
201
+ this.snackbarAppNotifications.next({ message, duration, silent, action });
202
+ }
203
+ /**
204
+ * Observable to receive Kip app Snackbar notification. Use in app.component ONLY.
205
+ *
206
+ * @usageNotes To send a Snackbar notification, use sendSnackbarNotification().
207
+ * Notifications are purely client side and have no relationship or
208
+ * interactions with the Signal K server.
209
+ */
210
+ getSnackbarAppNotifications() {
211
+ return this.snackbarAppNotifications.asObservable();
212
+ }
213
+ readThemeCssRoleVariables() {
214
+ const root = document.body;
215
+ const computedStyle = getComputedStyle(root);
216
+ const cssThemeRolesColor = {
217
+ background: computedStyle.getPropertyValue("--mat-sys-background").trim(),
218
+ cardColor: computedStyle.getPropertyValue("--kip-widget-card-background-color").trim(),
219
+ blue: computedStyle.getPropertyValue("--kip-blue-color").trim(),
220
+ blueDim: computedStyle.getPropertyValue("--kip-blue-dim-color").trim(),
221
+ blueDimmer: computedStyle.getPropertyValue("--kip-blue-dimmer-color").trim(),
222
+ green: computedStyle.getPropertyValue("--kip-green-color").trim(),
223
+ greenDim: computedStyle.getPropertyValue("--kip-green-dim-color").trim(),
224
+ greenDimmer: computedStyle.getPropertyValue("--kip-green-dimmer-color").trim(),
225
+ grey: computedStyle.getPropertyValue("--kip-grey-color").trim(),
226
+ greyDim: computedStyle.getPropertyValue("--kip-grey-dim-color").trim(),
227
+ greyDimmer: computedStyle.getPropertyValue("--kip-grey-dimmer-color").trim(),
228
+ orange: computedStyle.getPropertyValue("--kip-orange-color").trim(),
229
+ orangeDim: computedStyle.getPropertyValue("--kip-orange-dim-color").trim(),
230
+ orangeDimmer: computedStyle.getPropertyValue("--kip-orange-dimmer-color").trim(),
231
+ pink: computedStyle.getPropertyValue("--kip-pink-color").trim(),
232
+ pinkDim: computedStyle.getPropertyValue("--kip-pink-dim-color").trim(),
233
+ pinkDimmer: computedStyle.getPropertyValue("--kip-pink-dimmer-color").trim(),
234
+ purple: computedStyle.getPropertyValue("--kip-purple-color").trim(),
235
+ purpleDim: computedStyle.getPropertyValue("--kip-purple-dim-color").trim(),
236
+ purpleDimmer: computedStyle.getPropertyValue("--kip-purple-dimmer-color").trim(),
237
+ contrast: computedStyle.getPropertyValue("--kip-contrast-color").trim(),
238
+ contrastDim: computedStyle.getPropertyValue("--kip-contrast-dim-color").trim(),
239
+ contrastDimmer: computedStyle.getPropertyValue("--kip-contrast-dimmer-color").trim(),
240
+ yellow: computedStyle.getPropertyValue("--kip-yellow-color").trim(),
241
+ yellowDim: computedStyle.getPropertyValue("--kip-yellow-dim-color").trim(),
242
+ yellowDimmer: computedStyle.getPropertyValue("--kip-yellow-dimmer-color").trim(),
243
+ port: computedStyle.getPropertyValue("--kip-port-color").trim(),
244
+ starboard: computedStyle.getPropertyValue("--kip-starboard-color").trim(),
245
+ zoneNominal: computedStyle.getPropertyValue("--kip-zone-nominal-color").trim(),
246
+ zoneAlert: computedStyle.getPropertyValue("--kip-zone-alert-color").trim(),
247
+ zoneWarn: computedStyle.getPropertyValue("--kip-zone-warn-color").trim(),
248
+ zoneAlarm: computedStyle.getPropertyValue("--kip-zone-alarm-color").trim(),
249
+ zoneEmergency: computedStyle.getPropertyValue("--kip-zone-emergency-color").trim()
250
+ };
251
+ this.cssThemeColorRoles$.next(cssThemeRolesColor);
252
+ }
253
+ get cssThemeColors() {
254
+ return this._cssThemeColorRoles;
255
+ }
256
+ setBrightness(brightness, applyNightFilters = false) {
257
+ const appFilterWrapper = document.body;
258
+ appFilterWrapper.style.setProperty("--kip-nightModeBrightness", `${brightness}`);
259
+ const additionalFilters = applyNightFilters ? " sepia(0.5) hue-rotate(-30deg)" : "";
260
+ appFilterWrapper.style.setProperty("--kip-nightModeFilters", additionalFilters);
261
+ }
262
+ toggleDayNightMode() {
263
+ if (this.isNightMode()) {
264
+ if (this._redNightMode()) {
265
+ document.body.classList.toggle("night-theme", true);
266
+ this.setBrightness(1, false);
267
+ } else {
268
+ this.setBrightness(this._settings.getNightModeBrightness(), true);
269
+ document.body.classList.remove("night-theme");
270
+ if (this._theme() === "light-theme") {
271
+ document.body.classList.toggle("light-theme", this._theme() === "light-theme");
272
+ } else {
273
+ document.body.classList.remove("light-theme");
274
+ }
275
+ }
276
+ } else {
277
+ document.body.classList.remove("night-theme");
278
+ if (this._theme() === "light-theme") {
279
+ document.body.classList.toggle("light-theme", this._theme() === "light-theme");
280
+ }
281
+ this.setBrightness(1, false);
282
+ }
283
+ this.readThemeCssRoleVariables();
284
+ this._cssThemeColorRoles = this.cssThemeColorRoles$.getValue();
285
+ }
286
+ /**
287
+ * Helper method to get the browser version.
288
+ */
289
+ getBrowserVersion() {
290
+ const userAgent = navigator.userAgent;
291
+ let browser = "Unknown";
292
+ if (userAgent.includes("Edg")) {
293
+ browser = `Edge ${userAgent.match(/Edg\/(\d+)/)?.[1]}`;
294
+ } else if (userAgent.includes("Chrome") && !userAgent.includes("Edg") && !userAgent.includes("Chromium")) {
295
+ browser = `Chrome ${userAgent.match(/Chrome\/(\d+)/)?.[1]}`;
296
+ } else if (userAgent.includes("Chromium")) {
297
+ browser = `Chromium ${userAgent.match(/Chromium\/(\d+)/)?.[1]}`;
298
+ } else if (userAgent.includes("Firefox")) {
299
+ browser = `Firefox ${userAgent.match(/Firefox\/(\d+)/)?.[1]}`;
300
+ } else if (userAgent.includes("Safari") && !userAgent.includes("Chrome") && !userAgent.includes("Chromium")) {
301
+ browser = `Safari ${userAgent.match(/Version\/(\d+)/)?.[1]}`;
302
+ } else if (userAgent.includes("Opera") || userAgent.includes("OPR")) {
303
+ browser = `Opera ${userAgent.match(/(Opera|OPR)\/(\d+)/)?.[2]}`;
304
+ }
305
+ return browser;
306
+ }
307
+ /**
308
+ * Helper method to get the OS version.
309
+ */
310
+ getOSVersion() {
311
+ const platform = navigator.platform;
312
+ const userAgent = navigator.userAgent;
313
+ if (platform.startsWith("Mac")) {
314
+ return "macOS";
315
+ } else if (platform.startsWith("Win")) {
316
+ return "Windows";
317
+ } else if (/Linux/.test(platform)) {
318
+ if (userAgent.includes("ARM") || userAgent.includes("aarch64") || userAgent.includes("Raspberry") || platform.includes("armv7l") || platform.includes("armv8l")) {
319
+ return "Raspberry Pi";
320
+ }
321
+ return "Linux";
322
+ } else {
323
+ return "Unknown OS";
324
+ }
325
+ }
326
+ static \u0275fac = function AppService_Factory(__ngFactoryType__) {
327
+ return new (__ngFactoryType__ || _AppService)();
328
+ };
329
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({ token: _AppService, factory: _AppService.\u0275fac, providedIn: "root" });
330
+ };
331
+ (() => {
332
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(AppService, [{
333
+ type: Injectable,
334
+ args: [{
335
+ providedIn: "root"
336
+ }]
337
+ }], () => [], null);
338
+ })();
339
+
340
+ export {
341
+ AppService
342
+ };
343
+ //# sourceMappingURL=chunk-QC7VGVAR.js.map