@mxtommy/kip 3.12.0 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/.github/copilot-instructions.md +102 -27
  2. package/.github/instructions/angular.instructions.md +1 -1
  3. package/CHANGELOG.md +26 -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-52M2PJJL.js +4 -0
  16. package/public/{chunk-I454VRMK.js → chunk-AB255PKD.js} +1 -1
  17. package/public/chunk-B4SMHL7P.js +1 -0
  18. package/public/chunk-BEFXDBJY.js +3 -0
  19. package/public/{chunk-ZEV6YXHP.js → chunk-BMDGKBYM.js} +23 -23
  20. package/public/chunk-CA2BN4YV.js +9 -0
  21. package/public/chunk-D2CYLQZF.js +1 -0
  22. package/public/chunk-DKOFT6NI.js +52 -0
  23. package/public/{chunk-3LKIOGV7.js → chunk-E7MNINLP.js} +1 -1
  24. package/public/chunk-F75BVJPY.js +2 -0
  25. package/public/chunk-H3EFQCTE.js +5 -0
  26. package/public/{chunk-ZPCYFQPB.js → chunk-HIADZ4BV.js} +1 -1
  27. package/public/{chunk-IQG4DDQX.js → chunk-IJ22WXFB.js} +1 -1
  28. package/public/chunk-KI5CZR7P.js +1 -0
  29. package/public/{chunk-UTCRLFYC.js → chunk-NBMGYSW2.js} +1 -1
  30. package/public/chunk-OA5PBKO5.js +6 -0
  31. package/public/{chunk-YPUCOH35.js → chunk-OB3QLUH6.js} +12 -12
  32. package/public/{chunk-6MRJ4C55.js → chunk-OQULS6SV.js} +1 -1
  33. package/public/chunk-PPT35KWJ.js +8 -0
  34. package/public/{chunk-EPTIEPMQ.js → chunk-RYHOAWDD.js} +1 -1
  35. package/public/{chunk-NOLKBYOV.js → chunk-SZ2GUIT5.js} +1 -1
  36. package/public/chunk-TIWUK3AU.js +1 -0
  37. package/public/{chunk-RMLGKVWE.js → chunk-UIO7WC72.js} +1 -1
  38. package/public/{chunk-YVLZ2UAQ.js → chunk-V2FKRRBL.js} +2 -2
  39. package/public/chunk-WYPJEP5R.js +1 -0
  40. package/public/index.html +2 -2
  41. package/public/main-7RENLC7I.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-XLJT6YPP.js +0 -1
  67. package/public/chunk-YCW2UBVQ.js +0 -1
  68. package/public/chunk-Z5MCM3TT.js +0 -11
  69. package/public/main-7TSLA2U5.js +0 -5
  70. package/public/styles-PDNHT2L2.css +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxtommy/kip",
3
- "version": "3.12.0",
3
+ "version": "4.0.2",
4
4
  "description": "An advanced and versatile marine instrumentation package to display Signal K data.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -48,9 +48,12 @@
48
48
  "build:dev": "ng build --configuration=dev",
49
49
  "build:prod": "ng build --configuration=production",
50
50
  "build:all": "npm run build:plugin && npm run build:prod",
51
- "e2e": "ng e2e"
51
+ "e2e": "ng e2e",
52
+ "generate:widget": "npx schematics ./tools/schematics/collection.json:create-host2-widget --dry-run=false"
52
53
  },
54
+ "schematics": "tools/schematics/collection.json",
53
55
  "devDependencies": {
56
+ "@angular-devkit/schematics-cli": "^20.1.6",
54
57
  "@angular-devkit/build-angular": "^20.1.6",
55
58
  "@angular/animations": "20.1.7",
56
59
  "@angular/build": "^20.1.6",
@@ -85,7 +88,7 @@
85
88
  "core-js": "^3.13.1",
86
89
  "date-fns": "^2.30.0",
87
90
  "eslint": "^9.29.0",
88
- "gridstack": "^11.4.0",
91
+ "gridstack": "^12.3.3",
89
92
  "howler": "^2.2.4",
90
93
  "jasmine-core": "~4.0.1",
91
94
  "jasmine-spec-reporter": "~5.0.0",
@@ -99,6 +102,8 @@
99
102
  "lodash-es": "^4.17.21",
100
103
  "ng-packagr": "^20.0.1",
101
104
  "ngx-markdown": "^20.0.0",
105
+ "prismjs": "^1.30.0",
106
+ "clipboard": "^2.0.11",
102
107
  "ngx-resize-observer": "^3.1.0",
103
108
  "protractor": "~7.0.0",
104
109
  "pwa-asset-generator": "^8.1.1",
@@ -102,12 +102,12 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
102
102
  THE SOFTWARE.
103
103
 
104
104
  --------------------------------------------------------------------------------
105
- Package: @godind/canvas-gauges
105
+ Package: gridstack
106
106
  License: "MIT"
107
107
 
108
- The MIT License (MIT)
108
+ MIT License
109
109
 
110
- Copyright (c) 2016 Mykhailo Stadnyk <mikhus@gmail.com>
110
+ Copyright (c) 2019-2025 Alain Dumesny. v0.4.0 and older (c) 2014-2018 Pavel Reznikov, Dylan Weiss
111
111
 
112
112
  Permission is hereby granted, free of charge, to any person obtaining a copy
113
113
  of this software and associated documentation files (the "Software"), to deal
@@ -116,8 +116,8 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
116
116
  copies of the Software, and to permit persons to whom the Software is
117
117
  furnished to do so, subject to the following conditions:
118
118
 
119
- The above copyright notice and this permission notice shall be included in
120
- all copies or substantial portions of the Software.
119
+ The above copyright notice and this permission notice shall be included in all
120
+ copies or substantial portions of the Software.
121
121
 
122
122
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
123
123
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
@@ -128,12 +128,12 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
128
128
  SOFTWARE.
129
129
 
130
130
  --------------------------------------------------------------------------------
131
- Package: gridstack
131
+ Package: @angular/cdk
132
132
  License: "MIT"
133
133
 
134
- MIT License
134
+ The MIT License
135
135
 
136
- Copyright (c) 2019-2023 Alain Dumesny. v0.4.0 and older (c) 2014-2018 Pavel Reznikov, Dylan Weiss
136
+ Copyright (c) 2025 Google LLC.
137
137
 
138
138
  Permission is hereby granted, free of charge, to any person obtaining a copy
139
139
  of this software and associated documentation files (the "Software"), to deal
@@ -142,22 +142,24 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
142
142
  copies of the Software, and to permit persons to whom the Software is
143
143
  furnished to do so, subject to the following conditions:
144
144
 
145
- The above copyright notice and this permission notice shall be included in all
146
- copies or substantial portions of the Software.
145
+ The above copyright notice and this permission notice shall be included in
146
+ all copies or substantial portions of the Software.
147
147
 
148
148
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
149
149
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
150
150
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
151
151
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
152
152
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
153
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
154
- SOFTWARE.
153
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
154
+ THE SOFTWARE.
155
155
 
156
156
  --------------------------------------------------------------------------------
157
- Package: ngx-resize-observer
157
+ Package: @godind/canvas-gauges
158
158
  License: "MIT"
159
159
 
160
- Copyright (c) 2017 Tyler Akins
160
+ The MIT License (MIT)
161
+
162
+ Copyright (c) 2016 Mykhailo Stadnyk <mikhus@gmail.com>
161
163
 
162
164
  Permission is hereby granted, free of charge, to any person obtaining a copy
163
165
  of this software and associated documentation files (the "Software"), to deal
@@ -166,8 +168,8 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
166
168
  copies of the Software, and to permit persons to whom the Software is
167
169
  furnished to do so, subject to the following conditions:
168
170
 
169
- The above copyright notice and this permission notice shall be included in all
170
- copies or substantial portions of the Software.
171
+ The above copyright notice and this permission notice shall be included in
172
+ all copies or substantial portions of the Software.
171
173
 
172
174
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
173
175
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
@@ -178,26 +180,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
178
180
  SOFTWARE.
179
181
 
180
182
  --------------------------------------------------------------------------------
181
- Package: chartjs-plugin-annotation
182
- License: "MIT"
183
-
184
- The MIT License (MIT)
185
-
186
- Copyright (c) 2016-2021 chartjs-plugin-annotation Contributors
187
-
188
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
189
-
190
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
191
-
192
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
193
-
194
- --------------------------------------------------------------------------------
195
- Package: @godind/ng-canvas-gauges
183
+ Package: ngx-resize-observer
196
184
  License: "MIT"
197
185
 
198
- MIT License
199
-
200
- Copyright (c) 2017 Vlad Martynenko <vladimir.martynenko.work@gmail.com>
186
+ Copyright (c) 2017 Tyler Akins
201
187
 
202
188
  Permission is hereby granted, free of charge, to any person obtaining a copy
203
189
  of this software and associated documentation files (the "Software"), to deal
@@ -218,12 +204,12 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
218
204
  SOFTWARE.
219
205
 
220
206
  --------------------------------------------------------------------------------
221
- Package: @angular/cdk
207
+ Package: @godind/ng-canvas-gauges
222
208
  License: "MIT"
223
209
 
224
- The MIT License
210
+ MIT License
225
211
 
226
- Copyright (c) 2025 Google LLC.
212
+ Copyright (c) 2017 Vlad Martynenko <vladimir.martynenko.work@gmail.com>
227
213
 
228
214
  Permission is hereby granted, free of charge, to any person obtaining a copy
229
215
  of this software and associated documentation files (the "Software"), to deal
@@ -232,16 +218,30 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
232
218
  copies of the Software, and to permit persons to whom the Software is
233
219
  furnished to do so, subject to the following conditions:
234
220
 
235
- The above copyright notice and this permission notice shall be included in
236
- all copies or substantial portions of the Software.
221
+ The above copyright notice and this permission notice shall be included in all
222
+ copies or substantial portions of the Software.
237
223
 
238
224
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
239
225
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
240
226
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
241
227
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
242
228
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
243
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
244
- THE SOFTWARE.
229
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
230
+ SOFTWARE.
231
+
232
+ --------------------------------------------------------------------------------
233
+ Package: chartjs-plugin-annotation
234
+ License: "MIT"
235
+
236
+ The MIT License (MIT)
237
+
238
+ Copyright (c) 2016-2021 chartjs-plugin-annotation Contributors
239
+
240
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
241
+
242
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
243
+
244
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
245
245
 
246
246
  --------------------------------------------------------------------------------
247
247
  Package: screenfull
@@ -934,3 +934,29 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
934
934
  THE SOFTWARE.
935
935
 
936
936
  --------------------------------------------------------------------------------
937
+ Package: prismjs
938
+ License: "MIT"
939
+
940
+ MIT LICENSE
941
+
942
+ Copyright (c) 2012 Lea Verou
943
+
944
+ Permission is hereby granted, free of charge, to any person obtaining a copy
945
+ of this software and associated documentation files (the "Software"), to deal
946
+ in the Software without restriction, including without limitation the rights
947
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
948
+ copies of the Software, and to permit persons to whom the Software is
949
+ furnished to do so, subject to the following conditions:
950
+
951
+ The above copyright notice and this permission notice shall be included in
952
+ all copies or substantial portions of the Software.
953
+
954
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
955
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
956
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
957
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
958
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
959
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
960
+ THE SOFTWARE.
961
+
962
+ --------------------------------------------------------------------------------
@@ -0,0 +1,122 @@
1
+ ## Chartplotter Mode
2
+ Chartplotter Mode provides a persistent dual‑panel navigation layout: a continuously live Freeboard‑SK chart on one side and an actively switchable KIP dashboard on the other. Switching dashboards never unloads or blinks the chart, giving you an MFD‑style experience powered entirely by Signal K.
3
+
4
+ ---
5
+
6
+ ## When to Use It
7
+ Use Chartplotter Mode when you want uninterrupted situational awareness (chart + vessel motion + routing context) while cycling between specialized dashboards (navigation, engines, energy, racing, night watch, etc.). If you only need a chart on a few dashboards or have very constrained hardware, the standalone Freeboard‑SK widget may be sufficient.
8
+
9
+ ---
10
+
11
+ ## Key Capabilities
12
+ - Persistent Freeboard‑SK chart (no reload on dashboard change)
13
+ - Landscape side‑by‑side split; automatic vertical stacking in portrait / narrow screens
14
+ - Drag resize with commit‑on‑save (Cancel reverts instantly)
15
+ - Per‑dashboard forced collapse (treat some dashboards as full‑screen data pages)
16
+ - Remote dashboard switching compatible (chart forced collapse preserved remotely)
17
+ - Optional panel side selection (left or right)
18
+
19
+ ---
20
+
21
+ ## Enabling & Basic Setup
22
+ 1. Open Actions → Settings → Display.
23
+ 2. Expand **Chartplotter Mode** and toggle “Enable Freeboard‑SK dual‑panel Chartplotter Mode.”.
24
+ 3. Choose the chart panel side (Left or Right).
25
+ 4. Optionally, enable the per‑dashboard “Auto-collapse Freeboard-SK panel when displaying this dashboard” flag if you want that dashboard to hide the chart and use the full width.
26
+ 5. Enter dashboard edit mode if you wish to resize the split (see Resizing section), then Save to persist or Cancel to discard.
27
+
28
+ Tip: Remove any existing Freeboard‑SK widget instances to avoid redundant chart rendering once mode is enabled.
29
+
30
+ ---
31
+
32
+ ## Orientation & Layout Behavior
33
+ | Environment | Layout |
34
+ |-------------|--------|
35
+ | Desktop and Phone / Wide Landscape | Horizontal split (chart + dashboard side‑by‑side) |
36
+ | Phone Portrait / Narrow | Automatic vertical stacking (top/bottom) |
37
+
38
+ The transition is automatic; no manual toggle is required. The per‑dashboard collapse still applies regardless of orientation.
39
+
40
+ ---
41
+
42
+ ## Resizing the Split
43
+ 1. Enter dashboard edit mode on any dashboard (Actions → Unlock / Edit button).
44
+ 2. Drag the split divider and release.
45
+ 3. Press **Save** (check icon) to persist globally, or **Cancel** (X) to revert to the previous ratio.
46
+
47
+ Notes:
48
+ - Width changes are only committed on Save (prevents accidental layout shifts).
49
+ - Cancel always restores the original ratio before the edit session began.
50
+ - The persisted ratio applies across dashboards (unless a dashboard is collapsed).
51
+
52
+ ---
53
+
54
+ ## Per‑Dashboard Collapse
55
+ Each dashboard can force the chart panel closed to maximize data area. This is ideal for engine diagnostics, racing performance pages, or night watch minimalism. When you switch to a collapsed dashboard, the chart panel is hidden; switching back to a normal dashboard restores it instantly with its prior state and zoom.
56
+
57
+ Characteristics:
58
+ - Collapse is a per‑dashboard flag (not a remembered manual toggle).
59
+ - No chart reload occurs when re‑expanding—state (position, zoom, layers) persists.
60
+ - Remote control switches respect the same collapse logic.
61
+
62
+ ---
63
+
64
+ ## Selecting Chart Panel Side
65
+ Change side via Settings → Display → “Freeboard‑SK panel side”. This updates the split instantly. If a dashboard is collapsed, the side preference is applied the next time a non‑collapsed dashboard is shown.
66
+
67
+ ---
68
+
69
+ ## Chartplotter Mode vs Freeboard‑SK Widget
70
+ | Aspect | Chartplotter Mode | Freeboard‑SK Widget |
71
+ |--------|------------------|---------------------|
72
+ | Persistence across dashboard switches | Yes (never reloads) | Only on dashboards containing the widget |
73
+ | Resize workflow | Drag split + Save/Cancel | Standard widget resize |
74
+ | Per‑dashboard full‑screen data toggle | Via collapse flag | N/A |
75
+ | Remote dashboard switching continuity | Yes | Yes |
76
+ | Memory footprint | Higher baseline (Freeboard-SK always resident) | Lower when dashboard lack the widget |
77
+ | Best for | Continuous nav + multi‑dashboard workflow (MFD) | Occasional chart reference |
78
+
79
+ ---
80
+
81
+ ## Remote Control Integration
82
+ When another KIP instance changes your active dashboard (Remote Control feature), the chartplotter mode and collapsed dashboard page settings are respected. No special configuration is required.
83
+
84
+ ---
85
+
86
+ ## Performance & Resource Notes
87
+ - The persistent chart consumes GPU/CPU continuously; on very low‑power hardware consider disabling Chartplotter Mode for purely data dashboards.
88
+ - Use per‑dashboard collapse for pages where chart context adds no value (reduces overdraw / repaint area temporarily).
89
+ - Avoid unnecessary high‑frequency (sub‑500 ms) widget sampling if chart responsiveness matters.
90
+ - Keep embedded iframes (Embed widget) minimal when running persistent chart + heavy datasets.
91
+
92
+ ---
93
+
94
+ ## Troubleshooting
95
+ | Issue | Possible Cause | Fix |
96
+ |-------|----------------|-----|
97
+ | Chart disappears on one dashboard | Dashboard has collapse flag enabled | Edit dashboard settings and disable collapse if unintended |
98
+ | Split ratio didn’t save | Edit session canceled or not saved | Re‑enter edit mode, resize, press Save (check icon) |
99
+ | Chart briefly flashes when switching | Very first load after enabling mode | After initial load it remains persistent; subsequent switches should be flicker‑free |
100
+ | Freeboard‑SK widget shows duplicate chart | Legacy widget still on a dashboard | Remove the Freeboard‑SK widget when using Chartplotter Mode |
101
+ | Performance feels sluggish | High widget sampling or heavy embeds | Increase sample times, remove unused widgets, collapse non‑nav dashboards, investigate hardware resource consumption |
102
+
103
+ ---
104
+
105
+ ## FAQs
106
+ **Does the chart keep its zoom and layers when collapsed dashboards are shown?** Yes. The panel is hidden, not destroyed.
107
+
108
+ **Can I temporarily hide the chart without changing dashboard flags?** Use a dashboard that has the collapse flag enabled, or create a dedicated “Data Fullscreen” dashboard.
109
+
110
+ **Does resizing affect mobile portrait stacking?** The stored ratio applies when returning to landscape; stacked orientation distributes available height automatically.
111
+
112
+ **Can I still add the Freeboard‑SK widget?** You can, but it’s redundant and may waste resources. Prefer one approach.
113
+
114
+ **Will remote control commands interrupt a resize session?** If remote switching occurs mid‑edit, the Drag resize session ends when you Save or Cancel; uncommitted changes do not apply until you explicitly save.
115
+
116
+ ---
117
+
118
+ ## Related Help
119
+ - Dashboards and Layout
120
+ - Remote Control
121
+ - Digital Switching and PUT
122
+ - Managing Configurations
@@ -55,21 +55,11 @@ Open a PR or post in Discord #showcase with:
55
55
 
56
56
  ---
57
57
 
58
- ---
59
-
60
- ## More Community Resources
61
-
62
- - [Signal K Home page](https://signalk.org/) — The open marine data standard powering KIP
63
- - [Signal K Discord](https://discord.com/invite/uuZrwz4dCS) — Live chat server: questions, support, contribute and collaborate
64
- - [Signal K GutHub Project](https://github.com/SignalK) — Feature requests, bug reports, and feedback
65
- - [SensESP](https://signalk.org/SensESP/) — A Signal K sensor development toolkit for the ESP32 platform
66
- - [OpenMarine Community](https://openmarine.net/) — OpenPlotter, MacArthur HAT and open source marine tech
67
-
68
58
  ## More Community Resources
69
59
 
70
60
  - [Signal K Home page](https://signalk.org/) — The open marine data standard powering KIP
71
61
  - [Signal K Discord](https://discord.com/invite/uuZrwz4dCS) — Live chat server: questions, support, contribute and collaborate
72
- - [Signal K GutHub Project](https://github.com/SignalK) — Feature requests, bug reports, and feedback
62
+ - [Signal K GitHub Project](https://github.com/SignalK) — Feature requests, bug reports, and feedback
73
63
  - [SensESP](https://signalk.org/SensESP/) — A Signal K sensor development toolkit for the ESP32 platform
74
64
  - [OpenMarine Community](https://openmarine.net/) — OpenPlotter, MacArthur HAT and open source marine tech
75
65
 
@@ -23,16 +23,16 @@ Kiosk mode runs a single application full-screen and suppresses most desktop UI.
23
23
 
24
24
  - Raspberry Pi OS with Desktop, user: `pi` (or adjust paths).
25
25
  - Chromium installed:
26
- ```
26
+ ```bash
27
27
  sudo apt update
28
28
  sudo apt install -y chromium-browser || sudo apt install -y chromium
29
29
  ```
30
30
  - Optional (hide mouse cursor):
31
- ```
31
+ ```bash
32
32
  sudo apt install -y unclutter
33
33
  ```
34
34
  - Enable Desktop autologin:
35
- ```
35
+ ```bash
36
36
  sudo raspi-config
37
37
  ```
38
38
  System Options → Boot / Auto Login → Desktop Autologin
@@ -43,13 +43,13 @@ Kiosk mode runs a single application full-screen and suppresses most desktop UI.
43
43
 
44
44
  ## 2) Create the kiosk launcher script
45
45
 
46
- ```
46
+ ```bash
47
47
  sudo nano /home/pi/kiosk.sh
48
48
  ```
49
49
 
50
50
  Paste:
51
51
 
52
- ```
52
+ ```bash
53
53
  #!/usr/bin/env bash
54
54
  set -euo pipefail
55
55
 
@@ -102,14 +102,14 @@ exec "$BROWSER" \
102
102
  Optionally, you can also add the following `exec "BROWSER" \` flags:
103
103
 
104
104
  Force Chromium to keep all threads active and not optimyze resource usage
105
- ```
105
+ ```bash
106
106
  --disable-background-timer-throttling \
107
107
  --disable-renderer-backgrounding \
108
108
  --disable-backgrounding-occluded-windows
109
109
  ```
110
110
 
111
111
  Reduce memory consumption (Pi Zero)
112
- ```
112
+ ```bash
113
113
  --disable-gpu \
114
114
  --single-process \
115
115
  --js-flags="--max-old-space-size=512"
@@ -117,7 +117,7 @@ Reduce memory consumption (Pi Zero)
117
117
 
118
118
  Save, then:
119
119
 
120
- ```
120
+ ```bash
121
121
  sudo chmod +x /home/pi/kiosk.sh
122
122
  ```
123
123
 
@@ -130,14 +130,14 @@ URL="http://signalk.local:3000/@mxtommy/kip/#/page/0" /home/pi/kiosk.sh
130
130
 
131
131
  Create an autostart entry:
132
132
 
133
- ```
133
+ ```bash
134
134
  mkdir -p ~/.config/autostart
135
135
  nano ~/.config/autostart/kiosk.desktop
136
136
  ```
137
137
 
138
138
  Paste:
139
139
 
140
- ```
140
+ ```ini
141
141
  [Desktop Entry]
142
142
  Type=Application
143
143
  Name=KIP Kiosk
@@ -152,14 +152,14 @@ This launches after the desktop session starts.
152
152
 
153
153
  Recommended if you want Chromium to restart on crash.
154
154
 
155
- ```
155
+ ```bash
156
156
  mkdir -p ~/.config/systemd/user
157
157
  nano ~/.config/systemd/user/kiosk.service
158
158
  ```
159
159
 
160
160
  Paste:
161
161
 
162
- ```
162
+ ```ini
163
163
  [Unit]
164
164
  Description=KIP Chromium Kiosk
165
165
  After=graphical-session.target network-online.target
@@ -178,13 +178,13 @@ WantedBy=graphical-session.target
178
178
 
179
179
  Enable:
180
180
 
181
- ```
181
+ ```bash
182
182
  systemctl --user daemon-reload
183
183
  systemctl --user enable --now kiosk.service
184
184
  ```
185
185
 
186
186
  Logs (for debugging):
187
- ```
187
+ ```bash
188
188
  journalctl --user -u kiosk.service -f
189
189
  ```
190
190
 
@@ -192,7 +192,7 @@ Note: This runs after user login to the desktop. Ensure Desktop Autologin is ena
192
192
 
193
193
  ## 4) Reboot and verify
194
194
 
195
- ```
195
+ ```bash
196
196
  sudo reboot
197
197
  ```
198
198
 
@@ -2,6 +2,7 @@
2
2
  { "title": "The basics", "file": "welcome.md" },
3
3
  { "title": "Login & Configurations", "file": "configuration.md" },
4
4
  { "title": "Dashboards and Layout", "file": "dashboards.md" },
5
+ { "title": "Chartplotter Mode", "file": "chartplotter.md" },
5
6
  { "title": "Zones, Notifications and Highlights", "file": "zones.md" },
6
7
  { "title": "Data Inspector", "file": "datainspector.md" },
7
8
  { "title": "Digital Switching and PUT", "file": "putcontrols.md" },
@@ -56,6 +56,9 @@ You can toggle fullscreen mode on and off, and disable the screen saver and comp
56
56
  ## Night Mode
57
57
  Save your night vision by automatically switching KIP to day or night mode based on sunrise and sunset hours (the Signal K Derived Data plugin is required for automatic switching). This feature can be enabled in the **Settings > Display** page. You can also manually set the mode by clicking the small Moon/Sun button in the upper right corner of the Actions menu. Note that if automatic switching is enabled, brightness will reset to the Signal K mode value.
58
58
 
59
+ ## Chartplotter Mode
60
+ 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.
61
+
59
62
  ## Multiple User Profiles and Configuration Sharing
60
63
  KIP supports multiple user profiles, allowing different roles on board—such as captain, skipper, tactician, navigator, or engineer—to tailor the interface to their needs. Profiles can also be used to tie specific configuration arrangements to use cases or device form factors. See the Login & Configurations help sections for mode details.
61
64
 
@@ -284,14 +284,12 @@
284
284
  <svg id="windsteeringWidget" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 30 30">
285
285
  <path fill="currentColor" d="m 0.68588127,15.026096 c 0,-2.66182 0.64833033,-5.1279185 1.93227893,-7.3852457 1.2839483,-2.2573281 3.0255419,-4.044923 5.2247808,-5.3627848 2.199238,-1.317862 4.589163,-1.970269 7.169773,-1.970269 1.932278,0 3.788282,0.3914441 5.5553,1.1612843 1.767019,0.7698402 3.27979,1.8267393 4.563738,3.1315531 1.283949,1.3048138 2.300939,2.8705901 3.050967,4.6973299 0.75003,1.8267392 1.1314,3.7187192 1.1314,5.7281322 0,1.983317 -0.38137,3.888345 -1.1314,5.702036 -0.750028,1.813692 -1.77973,3.379468 -3.050967,4.684282 -1.271236,1.304816 -2.796719,2.348664 -4.563738,3.118506 -1.767018,0.76984 -3.610309,1.161284 -5.5553,1.161284 -1.944992,0 -3.81371,-0.391443 -5.5807281,-1.161284 C 7.6649675,27.761078 6.1394841,26.704179 4.8555357,25.399366 3.5715871,24.094552 2.5673107,22.528776 1.804569,20.728132 1.0418273,18.92749 0.68588127,17.022461 0.68588127,15.026096 m 3.15266543,0 c 0,3.092409 1.0932631,5.780326 3.2925016,8.063749 2.1992383,2.257329 4.8179857,3.379469 7.8816657,3.379469 2.008552,0 3.877269,-0.508878 5.580726,-1.539682 1.703456,-1.030801 3.076391,-2.413903 4.080668,-4.175404 1.004277,-1.761498 1.51277,-3.666525 1.51277,-5.728131 0,-2.061606 -0.508493,-3.979683 -1.51277,-5.7411813 C 23.669831,7.5234163 22.309609,6.1272661 20.59344,5.0964632 18.87727,4.0656603 17.021266,3.556783 15.012714,3.556783 c -2.008554,0 -3.877271,0.5088773 -5.5807281,1.5396802 C 7.7285292,6.1272661 6.3555943,7.5234163 5.3386053,9.2849157 4.3216165,11.046414 3.8385467,12.96449 3.8385467,15.026096 m 6.2163453,7.633161 4.767135,-17.106109 q 0.01906,-0.1957221 0.190687,-0.1957221 c 0.171617,0 0.177973,0.06524 0.190684,0.1957221 l 4.754423,17.106109 c 0.05085,0.14353 0.03814,0.247915 -0.02542,0.326203 -0.06356,0.07829 -0.165261,0.07829 -0.305097,0 l -4.41119,-1.696258 c -0.127123,-0.05219 -0.254246,-0.05219 -0.368659,0 l -4.449326,1.696258 q -0.190686,0.117439 -0.26696,0 c -0.07627,-0.117428 -0.101693,-0.195721 -0.07627,-0.326203"/>
286
286
  </svg>
287
- <svg id="racesteeringWidget" height="200px" width="200px" viewBox="0 0 320 320">
288
- <g id="XMLID_494_">
287
+ <svg id="racesteeringWidget" xmlns="http://www.w3.org/2000/svg" height="200px" width="200px" viewBox="0 0 320 320">
289
288
  <path fill="currentColor" fill-opacity="0.4" d="M290,160c0-10.177-1.172-20.079-3.383-29.583l27.947-22.704l-32-55.426 l-33.673,12.864c-14.386-13.487-31.839-23.738-51.202-29.596L192,0h-64l-5.689,35.556c-19.363,5.857-36.816,16.108-51.202,29.596 L37.436,52.287l-32,55.426l27.947,22.704C31.172,139.921,30,149.823,30,160s1.172,20.079,3.383,29.582L5.436,212.287l32,55.426 l33.672-12.865c14.387,13.488,31.84,23.739,51.203,29.596L128,320h64l5.689-35.557c19.363-5.856,36.816-16.107,51.203-29.596 l33.672,12.865l32-55.426l-27.947-22.705C288.828,180.079,290,170.177,290,160z"></path>
290
289
  <path fill="currentColor" fill-opacity="0.4" d="M160,0h-32l-5.689,35.556c-19.363,5.857-36.816,16.108-51.202,29.596L37.436,52.287 l-32,55.426l27.947,22.704C31.172,139.921,30,149.823,30,160s1.172,20.079,3.383,29.582L5.436,212.287l32,55.426l33.672-12.865 c14.387,13.488,31.84,23.739,51.203,29.596L128,320h32V0z"></path>
291
- <circle fill="currentColor" fill-opacity="0.7" cx="160" cy="160" r="95"></circle>
292
- <polygon fill="var(--mat-sys-primary)" fill-opacity="1" points="160,180 110,210 160,90 210,210 "></polygon>
293
- <polygon fill="var(--mat-sys-primary)" fill-opacity="1" points="160,180 110,210 160,90 "></polygon>
294
- </g>
290
+ <circle fill="currentColor" fill-opacity="1" cx="160" cy="160" r="95"></circle>
291
+ <polygon fill="var(--mat-sys-background)" fill-opacity="1" points="160,180 110,210 160,90 210,210 "></polygon>
292
+ <polygon fill="var(--mat-sys-background)" fill-opacity="1" points="160,180 110,210 160,90 "></polygon>
295
293
  </svg>
296
294
  <svg id="positionWidget" xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24">
297
295
  <path fill="currentColor" d="M440-42v-80q-125-14-214.5-103.5T122-440H42v-80h80q14-125 103.5-214.5T440-838v-80h80v80q125 14 214.5 103.5T838-520h80v80h-80q-14 125-103.5 214.5T520-122v80h-80Zm40-158q116 0 198-82t82-198q0-116-82-198t-198-82q-116 0-198 82t-82 198q0 116 82 198t198 82Zm0-120q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47Zm0-80q33 0 56.5-23.5T560-480q0-33-23.5-56.5T480-560q-33 0-56.5 23.5T400-480q0 33 23.5 56.5T480-400Zm0-80Z"/>
@@ -0,0 +1,4 @@
1
+ import{Ab as _,Ac as ye,B as de,Bb as f,Dd as Me,E as ce,F as C,Fa as m,Fb as we,Fd as R,Gb as w,Hb as p,Ia as fe,J as le,Jb as ve,K as me,L as U,Md as Se,Nd as Ee,Oa as h,Pa as O,Pd as y,Sa as S,Ua as ge,V as q,Wa as z,X as c,Xa as V,Xb as x,Ya as X,ab as u,bb as E,bc as be,cb as T,da as P,de as Te,ea as M,ee as D,fd as G,fe as Fe,ga as n,ge as ne,hb as W,hd as ie,ib as o,j as g,ja as $,jb as d,ka as K,kb as ee,kd as Ce,la as Y,ma as pe,na as J,nc as Q,oa as he,qb as j,qc as N,ra as ue,rb as te,sd as ke,tb as re,td as xe,va as I,vb as v,w as L,wa as k,wb as b,xa as _e,xb as l,xd as De,yb as F,zb as B}from"./chunk-OB3QLUH6.js";var Z=["*"],Ie=["content"],Oe=[[["mat-drawer"]],[["mat-drawer-content"]],"*"],ze=["mat-drawer","mat-drawer-content","*"];function Ve(i,A){if(i&1){let e=te();o(0,"div",1),re("click",function(){$(e);let r=v();return K(r._onBackdropClicked())}),d()}if(i&2){let e=v();p("mat-drawer-shown",e._isShowingBackdrop())}}function We(i,A){i&1&&(o(0,"mat-drawer-content"),l(1,2),d())}var je=[[["mat-sidenav"]],[["mat-sidenav-content"]],"*"],Qe=["mat-sidenav","mat-sidenav-content","*"];function Ne(i,A){if(i&1){let e=te();o(0,"div",1),re("click",function(){$(e);let r=v();return K(r._onBackdropClicked())}),d()}if(i&2){let e=v();p("mat-drawer-shown",e._isShowingBackdrop())}}function Ge(i,A){i&1&&(o(0,"mat-sidenav-content"),l(1,2),d())}var He=`.mat-drawer-container{position:relative;z-index:1;color:var(--mat-sidenav-content-text-color, var(--mat-sys-on-background));background-color:var(--mat-sidenav-content-background-color, var(--mat-sys-background));box-sizing:border-box;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible;background-color:var(--mat-sidenav-scrim-color, color-mix(in srgb, var(--mat-sys-neutral-variant20) 40%, transparent))}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}@media(forced-colors: active){.mat-drawer-backdrop{opacity:.5}}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-content.mat-drawer-content-hidden{opacity:0}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;color:var(--mat-sidenav-container-text-color, var(--mat-sys-on-surface-variant));box-shadow:var(--mat-sidenav-container-elevation-shadow, none);background-color:var(--mat-sidenav-container-background-color, var(--mat-sys-surface));border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));width:var(--mat-sidenav-container-width, 360px);display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}@media(forced-colors: active){.mat-drawer,[dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}}@media(forced-colors: active){[dir=rtl] .mat-drawer,.mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0);border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .mat-drawer{border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-left-radius:0;border-bottom-left-radius:0;left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-transition .mat-drawer{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating){visibility:hidden;box-shadow:none}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container{display:none}.mat-drawer.mat-drawer-opened.mat-drawer-opened{transform:none}.mat-drawer-side{box-shadow:none;border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid}.mat-drawer-side.mat-drawer-end{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid;border-left:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto}.mat-sidenav-fixed{position:fixed}
2
+ `;var Ze=new M("MAT_DRAWER_DEFAULT_AUTOSIZE",{providedIn:"root",factory:Le}),se=new M("MAT_DRAWER_CONTAINER");function Le(){return!1}var H=(()=>{class i extends D{_platform=n(G);_changeDetectorRef=n(Q);_container=n(oe);constructor(){let e=n(k),t=n(Te),r=n(V);super(e,t,r)}ngAfterContentInit(){this._container._contentMarginChanges.subscribe(()=>{this._changeDetectorRef.markForCheck()})}_shouldBeHidden(){if(this._platform.isBrowser)return!1;let{start:e,end:t}=this._container;return e!=null&&e.mode!=="over"&&e.opened||t!=null&&t.mode!=="over"&&t.opened}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=h({type:i,selectors:[["mat-drawer-content"]],hostAttrs:[1,"mat-drawer-content"],hostVars:6,hostBindings:function(t,r){t&2&&(w("margin-left",r._container._contentMargins.left,"px")("margin-right",r._container._contentMargins.right,"px"),p("mat-drawer-content-hidden",r._shouldBeHidden()))},features:[x([{provide:D,useExisting:i}]),S],ngContentSelectors:Z,decls:1,vars:0,template:function(t,r){t&1&&(b(),l(0))},encapsulation:2,changeDetection:0})}return i})(),ae=(()=>{class i{_elementRef=n(k);_focusTrapFactory=n(xe);_focusMonitor=n(Ce);_platform=n(G);_ngZone=n(V);_renderer=n(fe);_interactivityChecker=n(ke);_doc=n(he);_container=n(se,{optional:!0});_focusTrap=null;_elementFocusedBeforeDrawerWasOpened=null;_eventCleanups;_isAttached;_anchor;get position(){return this._position}set position(e){e=e==="end"?"end":"start",e!==this._position&&(this._isAttached&&this._updatePositionInParent(e),this._position=e,this.onPositionChanged.emit())}_position="start";get mode(){return this._mode}set mode(e){this._mode=e,this._updateFocusTrapState(),this._modeChanged.next()}_mode="over";get disableClose(){return this._disableClose}set disableClose(e){this._disableClose=y(e)}_disableClose=!1;get autoFocus(){let e=this._autoFocus;return e??(this.mode==="side"?"dialog":"first-tabbable")}set autoFocus(e){(e==="true"||e==="false"||e==null)&&(e=y(e)),this._autoFocus=e}_autoFocus;get opened(){return this._opened()}set opened(e){this.toggle(y(e))}_opened=ue(!1);_openedVia;_animationStarted=new g;_animationEnd=new g;openedChange=new z(!0);_openedStream=this.openedChange.pipe(C(e=>e),L(()=>{}));openedStart=this._animationStarted.pipe(C(()=>this.opened),U(void 0));_closedStream=this.openedChange.pipe(C(e=>!e),L(()=>{}));closedStart=this._animationStarted.pipe(C(()=>!this.opened),U(void 0));_destroyed=new g;onPositionChanged=new z;_content;_modeChanged=new g;_injector=n(J);_changeDetectorRef=n(Q);constructor(){this.openedChange.pipe(c(this._destroyed)).subscribe(e=>{e?(this._elementFocusedBeforeDrawerWasOpened=this._doc.activeElement,this._takeFocus()):this._isFocusWithinDrawer()&&this._restoreFocus(this._openedVia||"program")}),this._ngZone.runOutsideAngular(()=>{let e=this._elementRef.nativeElement;de(e,"keydown").pipe(C(t=>t.keyCode===27&&!this.disableClose&&!De(t)),c(this._destroyed)).subscribe(t=>this._ngZone.run(()=>{this.close(),t.stopPropagation(),t.preventDefault()})),this._eventCleanups=[this._renderer.listen(e,"transitionrun",this._handleTransitionEvent),this._renderer.listen(e,"transitionend",this._handleTransitionEvent),this._renderer.listen(e,"transitioncancel",this._handleTransitionEvent)]}),this._animationEnd.subscribe(()=>{this.openedChange.emit(this.opened)})}_forceFocus(e,t){this._interactivityChecker.isFocusable(e)||(e.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let r=()=>{a(),s(),e.removeAttribute("tabindex")},a=this._renderer.listen(e,"blur",r),s=this._renderer.listen(e,"mousedown",r)})),e.focus(t)}_focusByCssSelector(e,t){let r=this._elementRef.nativeElement.querySelector(e);r&&this._forceFocus(r,t)}_takeFocus(){if(!this._focusTrap)return;let e=this._elementRef.nativeElement;switch(this.autoFocus){case!1:case"dialog":return;case!0:case"first-tabbable":X(()=>{!this._focusTrap.focusInitialElement()&&typeof e.focus=="function"&&e.focus()},{injector:this._injector});break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]');break;default:this._focusByCssSelector(this.autoFocus);break}}_restoreFocus(e){this.autoFocus!=="dialog"&&(this._elementFocusedBeforeDrawerWasOpened?this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened,e):this._elementRef.nativeElement.blur(),this._elementFocusedBeforeDrawerWasOpened=null)}_isFocusWithinDrawer(){let e=this._doc.activeElement;return!!e&&this._elementRef.nativeElement.contains(e)}ngAfterViewInit(){this._isAttached=!0,this._position==="end"&&this._updatePositionInParent("end"),this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._updateFocusTrapState())}ngOnDestroy(){this._eventCleanups.forEach(e=>e()),this._focusTrap?.destroy(),this._anchor?.remove(),this._anchor=null,this._animationStarted.complete(),this._animationEnd.complete(),this._modeChanged.complete(),this._destroyed.next(),this._destroyed.complete()}open(e){return this.toggle(!0,e)}close(){return this.toggle(!1)}_closeViaBackdropClick(){return this._setOpen(!1,!0,"mouse")}toggle(e=!this.opened,t){e&&t&&(this._openedVia=t);let r=this._setOpen(e,!e&&this._isFocusWithinDrawer(),this._openedVia||"program");return e||(this._openedVia=null),r}_setOpen(e,t,r){return e===this.opened?Promise.resolve(e?"open":"close"):(this._opened.set(e),this._container?._transitionsEnabled?this._setIsAnimating(!0):setTimeout(()=>{this._animationStarted.next(),this._animationEnd.next()}),this._elementRef.nativeElement.classList.toggle("mat-drawer-opened",e),!e&&t&&this._restoreFocus(r),this._changeDetectorRef.markForCheck(),this._updateFocusTrapState(),new Promise(a=>{this.openedChange.pipe(me(1)).subscribe(s=>a(s?"open":"close"))}))}_setIsAnimating(e){this._elementRef.nativeElement.classList.toggle("mat-drawer-animating",e)}_getWidth(){return this._elementRef.nativeElement.offsetWidth||0}_updateFocusTrapState(){this._focusTrap&&(this._focusTrap.enabled=!!this._container?.hasBackdrop&&this.opened)}_updatePositionInParent(e){if(!this._platform.isBrowser)return;let t=this._elementRef.nativeElement,r=t.parentNode;e==="end"?(this._anchor||(this._anchor=this._doc.createComment("mat-drawer-anchor"),r.insertBefore(this._anchor,t)),r.appendChild(t)):this._anchor&&this._anchor.parentNode.insertBefore(t,this._anchor)}_handleTransitionEvent=e=>{let t=this._elementRef.nativeElement;e.target===t&&this._ngZone.run(()=>{e.type==="transitionrun"?this._animationStarted.next(e):(e.type==="transitionend"&&this._setIsAnimating(!1),this._animationEnd.next(e))})};static \u0275fac=function(t){return new(t||i)};static \u0275cmp=h({type:i,selectors:[["mat-drawer"]],viewQuery:function(t,r){if(t&1&&B(Ie,5),t&2){let a;_(a=f())&&(r._content=a.first)}},hostAttrs:[1,"mat-drawer"],hostVars:12,hostBindings:function(t,r){t&2&&(u("align",null)("tabIndex",r.mode!=="side"?"-1":null),w("visibility",!r._container&&!r.opened?"hidden":null),p("mat-drawer-end",r.position==="end")("mat-drawer-over",r.mode==="over")("mat-drawer-push",r.mode==="push")("mat-drawer-side",r.mode==="side"))},inputs:{position:"position",mode:"mode",disableClose:"disableClose",autoFocus:"autoFocus",opened:"opened"},outputs:{openedChange:"openedChange",_openedStream:"opened",openedStart:"openedStart",_closedStream:"closed",closedStart:"closedStart",onPositionChanged:"positionChanged"},exportAs:["matDrawer"],ngContentSelectors:Z,decls:3,vars:0,consts:[["content",""],["cdkScrollable","",1,"mat-drawer-inner-container"]],template:function(t,r){t&1&&(b(),o(0,"div",1,0),l(2),d())},dependencies:[D],encapsulation:2,changeDetection:0})}return i})(),oe=(()=>{class i{_dir=n(Me,{optional:!0});_element=n(k);_ngZone=n(V);_changeDetectorRef=n(Q);_animationDisabled=Ee();_transitionsEnabled=!1;_allDrawers;_drawers=new _e;_content;_userContent;get start(){return this._start}get end(){return this._end}get autosize(){return this._autosize}set autosize(e){this._autosize=y(e)}_autosize=n(Ze);get hasBackdrop(){return this._drawerHasBackdrop(this._start)||this._drawerHasBackdrop(this._end)}set hasBackdrop(e){this._backdropOverride=e==null?null:y(e)}_backdropOverride;backdropClick=new z;_start;_end;_left;_right;_destroyed=new g;_doCheckSubject=new g;_contentMargins={left:null,right:null};_contentMarginChanges=new g;get scrollable(){return this._userContent||this._content}_injector=n(J);constructor(){let e=n(G),t=n(Fe);this._dir?.change.pipe(c(this._destroyed)).subscribe(()=>{this._validateDrawers(),this.updateContentMargins()}),t.change().pipe(c(this._destroyed)).subscribe(()=>this.updateContentMargins()),!this._animationDisabled&&e.isBrowser&&this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._element.nativeElement.classList.add("mat-drawer-transition"),this._transitionsEnabled=!0},200)})}ngAfterContentInit(){this._allDrawers.changes.pipe(q(this._allDrawers),c(this._destroyed)).subscribe(e=>{this._drawers.reset(e.filter(t=>!t._container||t._container===this)),this._drawers.notifyOnChanges()}),this._drawers.changes.pipe(q(null)).subscribe(()=>{this._validateDrawers(),this._drawers.forEach(e=>{this._watchDrawerToggle(e),this._watchDrawerPosition(e),this._watchDrawerMode(e)}),(!this._drawers.length||this._isDrawerOpen(this._start)||this._isDrawerOpen(this._end))&&this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),this._ngZone.runOutsideAngular(()=>{this._doCheckSubject.pipe(le(10),c(this._destroyed)).subscribe(()=>this.updateContentMargins())})}ngOnDestroy(){this._contentMarginChanges.complete(),this._doCheckSubject.complete(),this._drawers.destroy(),this._destroyed.next(),this._destroyed.complete()}open(){this._drawers.forEach(e=>e.open())}close(){this._drawers.forEach(e=>e.close())}updateContentMargins(){let e=0,t=0;if(this._left&&this._left.opened){if(this._left.mode=="side")e+=this._left._getWidth();else if(this._left.mode=="push"){let r=this._left._getWidth();e+=r,t-=r}}if(this._right&&this._right.opened){if(this._right.mode=="side")t+=this._right._getWidth();else if(this._right.mode=="push"){let r=this._right._getWidth();t+=r,e-=r}}e=e||null,t=t||null,(e!==this._contentMargins.left||t!==this._contentMargins.right)&&(this._contentMargins={left:e,right:t},this._ngZone.run(()=>this._contentMarginChanges.next(this._contentMargins)))}ngDoCheck(){this._autosize&&this._isPushed()&&this._ngZone.runOutsideAngular(()=>this._doCheckSubject.next())}_watchDrawerToggle(e){e._animationStarted.pipe(c(this._drawers.changes)).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),e.mode!=="side"&&e.openedChange.pipe(c(this._drawers.changes)).subscribe(()=>this._setContainerClass(e.opened))}_watchDrawerPosition(e){e.onPositionChanged.pipe(c(this._drawers.changes)).subscribe(()=>{X({read:()=>this._validateDrawers()},{injector:this._injector})})}_watchDrawerMode(e){e._modeChanged.pipe(c(ce(this._drawers.changes,this._destroyed))).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()})}_setContainerClass(e){let t=this._element.nativeElement.classList,r="mat-drawer-container-has-open";e?t.add(r):t.remove(r)}_validateDrawers(){this._start=this._end=null,this._drawers.forEach(e=>{e.position=="end"?(this._end!=null,this._end=e):(this._start!=null,this._start=e)}),this._right=this._left=null,this._dir&&this._dir.value==="rtl"?(this._left=this._end,this._right=this._start):(this._left=this._start,this._right=this._end)}_isPushed(){return this._isDrawerOpen(this._start)&&this._start.mode!="over"||this._isDrawerOpen(this._end)&&this._end.mode!="over"}_onBackdropClicked(){this.backdropClick.emit(),this._closeModalDrawersViaBackdrop()}_closeModalDrawersViaBackdrop(){[this._start,this._end].filter(e=>e&&!e.disableClose&&this._drawerHasBackdrop(e)).forEach(e=>e._closeViaBackdropClick())}_isShowingBackdrop(){return this._isDrawerOpen(this._start)&&this._drawerHasBackdrop(this._start)||this._isDrawerOpen(this._end)&&this._drawerHasBackdrop(this._end)}_isDrawerOpen(e){return e!=null&&e.opened}_drawerHasBackdrop(e){return this._backdropOverride==null?!!e&&e.mode!=="side":this._backdropOverride}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=h({type:i,selectors:[["mat-drawer-container"]],contentQueries:function(t,r,a){if(t&1&&(F(a,H,5),F(a,ae,5)),t&2){let s;_(s=f())&&(r._content=s.first),_(s=f())&&(r._allDrawers=s)}},viewQuery:function(t,r){if(t&1&&B(H,5),t&2){let a;_(a=f())&&(r._userContent=a.first)}},hostAttrs:[1,"mat-drawer-container"],hostVars:2,hostBindings:function(t,r){t&2&&p("mat-drawer-container-explicit-backdrop",r._backdropOverride)},inputs:{autosize:"autosize",hasBackdrop:"hasBackdrop"},outputs:{backdropClick:"backdropClick"},exportAs:["matDrawerContainer"],features:[x([{provide:se,useExisting:i}])],ngContentSelectors:ze,decls:4,vars:2,consts:[[1,"mat-drawer-backdrop",3,"mat-drawer-shown"],[1,"mat-drawer-backdrop",3,"click"]],template:function(t,r){t&1&&(b(Oe),E(0,Ve,1,2,"div",0),l(1),l(2,1),E(3,We,2,0,"mat-drawer-content")),t&2&&(T(r.hasBackdrop?0:-1),m(3),T(r._content?-1:3))},dependencies:[H],styles:[`.mat-drawer-container{position:relative;z-index:1;color:var(--mat-sidenav-content-text-color, var(--mat-sys-on-background));background-color:var(--mat-sidenav-content-background-color, var(--mat-sys-background));box-sizing:border-box;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible;background-color:var(--mat-sidenav-scrim-color, color-mix(in srgb, var(--mat-sys-neutral-variant20) 40%, transparent))}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}@media(forced-colors: active){.mat-drawer-backdrop{opacity:.5}}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-content.mat-drawer-content-hidden{opacity:0}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;color:var(--mat-sidenav-container-text-color, var(--mat-sys-on-surface-variant));box-shadow:var(--mat-sidenav-container-elevation-shadow, none);background-color:var(--mat-sidenav-container-background-color, var(--mat-sys-surface));border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));width:var(--mat-sidenav-container-width, 360px);display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}@media(forced-colors: active){.mat-drawer,[dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}}@media(forced-colors: active){[dir=rtl] .mat-drawer,.mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0);border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .mat-drawer{border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-left-radius:0;border-bottom-left-radius:0;left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-transition .mat-drawer{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating){visibility:hidden;box-shadow:none}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container{display:none}.mat-drawer.mat-drawer-opened.mat-drawer-opened{transform:none}.mat-drawer-side{box-shadow:none;border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid}.mat-drawer-side.mat-drawer-end{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid;border-left:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto}.mat-sidenav-fixed{position:fixed}
3
+ `],encapsulation:2,changeDetection:0})}return i})(),Be=(()=>{class i extends H{static \u0275fac=(()=>{let e;return function(r){return(e||(e=I(i)))(r||i)}})();static \u0275cmp=h({type:i,selectors:[["mat-sidenav-content"]],hostAttrs:[1,"mat-drawer-content","mat-sidenav-content"],features:[x([{provide:D,useExisting:i}]),S],ngContentSelectors:Z,decls:1,vars:0,template:function(t,r){t&1&&(b(),l(0))},encapsulation:2,changeDetection:0})}return i})(),Ue=(()=>{class i extends ae{get fixedInViewport(){return this._fixedInViewport}set fixedInViewport(e){this._fixedInViewport=y(e)}_fixedInViewport=!1;get fixedTopGap(){return this._fixedTopGap}set fixedTopGap(e){this._fixedTopGap=ie(e)}_fixedTopGap=0;get fixedBottomGap(){return this._fixedBottomGap}set fixedBottomGap(e){this._fixedBottomGap=ie(e)}_fixedBottomGap=0;static \u0275fac=(()=>{let e;return function(r){return(e||(e=I(i)))(r||i)}})();static \u0275cmp=h({type:i,selectors:[["mat-sidenav"]],hostAttrs:[1,"mat-drawer","mat-sidenav"],hostVars:16,hostBindings:function(t,r){t&2&&(u("tabIndex",r.mode!=="side"?"-1":null)("align",null),w("top",r.fixedInViewport?r.fixedTopGap:null,"px")("bottom",r.fixedInViewport?r.fixedBottomGap:null,"px"),p("mat-drawer-end",r.position==="end")("mat-drawer-over",r.mode==="over")("mat-drawer-push",r.mode==="push")("mat-drawer-side",r.mode==="side")("mat-sidenav-fixed",r.fixedInViewport))},inputs:{fixedInViewport:"fixedInViewport",fixedTopGap:"fixedTopGap",fixedBottomGap:"fixedBottomGap"},exportAs:["matSidenav"],features:[x([{provide:ae,useExisting:i}]),S],ngContentSelectors:Z,decls:3,vars:0,consts:[["content",""],["cdkScrollable","",1,"mat-drawer-inner-container"]],template:function(t,r){t&1&&(b(),o(0,"div",1,0),l(2),d())},dependencies:[D],encapsulation:2,changeDetection:0})}return i})(),vt=(()=>{class i extends oe{_allDrawers=void 0;_content=void 0;static \u0275fac=(()=>{let e;return function(r){return(e||(e=I(i)))(r||i)}})();static \u0275cmp=h({type:i,selectors:[["mat-sidenav-container"]],contentQueries:function(t,r,a){if(t&1&&(F(a,Be,5),F(a,Ue,5)),t&2){let s;_(s=f())&&(r._content=s.first),_(s=f())&&(r._allDrawers=s)}},hostAttrs:[1,"mat-drawer-container","mat-sidenav-container"],hostVars:2,hostBindings:function(t,r){t&2&&p("mat-drawer-container-explicit-backdrop",r._backdropOverride)},exportAs:["matSidenavContainer"],features:[x([{provide:se,useExisting:i},{provide:oe,useExisting:i}]),S],ngContentSelectors:Qe,decls:4,vars:2,consts:[[1,"mat-drawer-backdrop",3,"mat-drawer-shown"],[1,"mat-drawer-backdrop",3,"click"]],template:function(t,r){t&1&&(b(je),E(0,Ne,1,2,"div",0),l(1),l(2,1),E(3,Ge,2,0,"mat-sidenav-content")),t&2&&(T(r.hasBackdrop?0:-1),m(3),T(r._content?-1:3))},dependencies:[Be],styles:[He],encapsulation:2,changeDetection:0})}return i})(),bt=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=O({type:i});static \u0275inj=P({imports:[R,ne,ne,R]})}return i})();var qe=["determinateSpinner"];function $e(i,A){if(i&1&&(Y(),o(0,"svg",11),ee(1,"circle",12),d()),i&2){let e=v();u("viewBox",e._viewBox()),m(),w("stroke-dasharray",e._strokeCircumference(),"px")("stroke-dashoffset",e._strokeCircumference()/2,"px")("stroke-width",e._circleStrokeWidth(),"%"),u("r",e._circleRadius())}}var Ke=new M("mat-progress-spinner-default-options",{providedIn:"root",factory:Ye});function Ye(){return{diameter:Re}}var Re=100,Je=10,Rt=(()=>{class i{_elementRef=n(k);_noopAnimations;get color(){return this._color||this._defaultColor}set color(e){this._color=e}_color;_defaultColor="primary";_determinateCircle;constructor(){let e=n(Ke),t=Se(),r=this._elementRef.nativeElement;this._noopAnimations=t==="di-disabled"&&!!e&&!e._forceAnimations,this.mode=r.nodeName.toLowerCase()==="mat-spinner"?"indeterminate":"determinate",!this._noopAnimations&&t==="reduced-motion"&&r.classList.add("mat-progress-spinner-reduced-motion"),e&&(e.color&&(this.color=this._defaultColor=e.color),e.diameter&&(this.diameter=e.diameter),e.strokeWidth&&(this.strokeWidth=e.strokeWidth))}mode;get value(){return this.mode==="determinate"?this._value:0}set value(e){this._value=Math.max(0,Math.min(100,e||0))}_value=0;get diameter(){return this._diameter}set diameter(e){this._diameter=e||0}_diameter=Re;get strokeWidth(){return this._strokeWidth??this.diameter/10}set strokeWidth(e){this._strokeWidth=e||0}_strokeWidth;_circleRadius(){return(this.diameter-Je)/2}_viewBox(){let e=this._circleRadius()*2+this.strokeWidth;return`0 0 ${e} ${e}`}_strokeCircumference(){return 2*Math.PI*this._circleRadius()}_strokeDashOffset(){return this.mode==="determinate"?this._strokeCircumference()*(100-this._value)/100:null}_circleStrokeWidth(){return this.strokeWidth/this.diameter*100}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=h({type:i,selectors:[["mat-progress-spinner"],["mat-spinner"]],viewQuery:function(t,r){if(t&1&&B(qe,5),t&2){let a;_(a=f())&&(r._determinateCircle=a.first)}},hostAttrs:["role","progressbar","tabindex","-1",1,"mat-mdc-progress-spinner","mdc-circular-progress"],hostVars:18,hostBindings:function(t,r){t&2&&(u("aria-valuemin",0)("aria-valuemax",100)("aria-valuenow",r.mode==="determinate"?r.value:null)("mode",r.mode),ve("mat-"+r.color),w("width",r.diameter,"px")("height",r.diameter,"px")("--mat-progress-spinner-size",r.diameter+"px")("--mat-progress-spinner-active-indicator-width",r.diameter+"px"),p("_mat-animation-noopable",r._noopAnimations)("mdc-circular-progress--indeterminate",r.mode==="indeterminate"))},inputs:{color:"color",mode:"mode",value:[2,"value","value",N],diameter:[2,"diameter","diameter",N],strokeWidth:[2,"strokeWidth","strokeWidth",N]},exportAs:["matProgressSpinner"],decls:14,vars:11,consts:[["circle",""],["determinateSpinner",""],["aria-hidden","true",1,"mdc-circular-progress__determinate-container"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__determinate-circle-graphic"],["cx","50%","cy","50%",1,"mdc-circular-progress__determinate-circle"],["aria-hidden","true",1,"mdc-circular-progress__indeterminate-container"],[1,"mdc-circular-progress__spinner-layer"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-left"],[3,"ngTemplateOutlet"],[1,"mdc-circular-progress__gap-patch"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-right"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__indeterminate-circle-graphic"],["cx","50%","cy","50%"]],template:function(t,r){if(t&1&&(ge(0,$e,2,8,"ng-template",null,0,be),o(2,"div",2,1),Y(),o(4,"svg",3),ee(5,"circle",4),d()(),pe(),o(6,"div",5)(7,"div",6)(8,"div",7),j(9,8),d(),o(10,"div",9),j(11,8),d(),o(12,"div",10),j(13,8),d()()()),t&2){let a=we(1);m(4),u("viewBox",r._viewBox()),m(),w("stroke-dasharray",r._strokeCircumference(),"px")("stroke-dashoffset",r._strokeDashOffset(),"px")("stroke-width",r._circleStrokeWidth(),"%"),u("r",r._circleRadius()),m(4),W("ngTemplateOutlet",a),m(2),W("ngTemplateOutlet",a),m(2),W("ngTemplateOutlet",a)}},dependencies:[ye],styles:[`.mat-mdc-progress-spinner{--mat-progress-spinner-animation-multiplier: 1;display:block;overflow:hidden;line-height:0;position:relative;direction:ltr;transition:opacity 250ms cubic-bezier(0.4, 0, 0.6, 1)}.mat-mdc-progress-spinner circle{stroke-width:var(--mat-progress-spinner-active-indicator-width, 4px)}.mat-mdc-progress-spinner._mat-animation-noopable,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__determinate-circle{transition:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__spinner-layer,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container{animation:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container circle{stroke-dasharray:0 !important}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle{stroke:currentColor;stroke:CanvasText}}.mat-progress-spinner-reduced-motion{--mat-progress-spinner-animation-multiplier: 1.25}.mdc-circular-progress__determinate-container,.mdc-circular-progress__indeterminate-circle-graphic,.mdc-circular-progress__indeterminate-container,.mdc-circular-progress__spinner-layer{position:absolute;width:100%;height:100%}.mdc-circular-progress__determinate-container{transform:rotate(-90deg)}.mdc-circular-progress--indeterminate .mdc-circular-progress__determinate-container{opacity:0}.mdc-circular-progress__indeterminate-container{font-size:0;letter-spacing:0;white-space:nowrap;opacity:0}.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container{opacity:1;animation:mdc-circular-progress-container-rotate calc(1568.2352941176ms*var(--mat-progress-spinner-animation-multiplier)) linear infinite}.mdc-circular-progress__determinate-circle-graphic,.mdc-circular-progress__indeterminate-circle-graphic{fill:rgba(0,0,0,0)}.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:var(--mat-progress-spinner-active-indicator-color, var(--mat-sys-primary))}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:CanvasText}}.mdc-circular-progress__determinate-circle{transition:stroke-dashoffset 500ms cubic-bezier(0, 0, 0.2, 1)}.mdc-circular-progress__gap-patch{position:absolute;top:0;left:47.5%;box-sizing:border-box;width:5%;height:100%;overflow:hidden}.mdc-circular-progress__gap-patch .mdc-circular-progress__indeterminate-circle-graphic{left:-900%;width:2000%;transform:rotate(180deg)}.mdc-circular-progress__circle-clipper .mdc-circular-progress__indeterminate-circle-graphic{width:200%}.mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{left:-100%}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-left .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-left-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-right-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress__circle-clipper{display:inline-flex;position:relative;width:50%;height:100%;overflow:hidden}.mdc-circular-progress--indeterminate .mdc-circular-progress__spinner-layer{animation:mdc-circular-progress-spinner-layer-rotate calc(5332ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}@keyframes mdc-circular-progress-container-rotate{to{transform:rotate(360deg)}}@keyframes mdc-circular-progress-spinner-layer-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}100%{transform:rotate(1080deg)}}@keyframes mdc-circular-progress-left-spin{from{transform:rotate(265deg)}50%{transform:rotate(130deg)}to{transform:rotate(265deg)}}@keyframes mdc-circular-progress-right-spin{from{transform:rotate(-265deg)}50%{transform:rotate(-130deg)}to{transform:rotate(-265deg)}}
4
+ `],encapsulation:2,changeDetection:0})}return i})();var At=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=O({type:i});static \u0275inj=P({imports:[R]})}return i})();export{Be as a,Ue as b,vt as c,bt as d,Rt as e,At as f};