@mxtommy/kip 3.6.0 → 3.7.0

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 (32) hide show
  1. package/.github/copilot-instructions.md +80 -0
  2. package/CHANGELOG.md +21 -0
  3. package/package.json +1 -1
  4. package/public/assets/help-docs/datainspector.md +4 -3
  5. package/public/assets/help-docs/embedwidget.md +5 -5
  6. package/public/assets/help-docs/putcontrols.md +5 -5
  7. package/public/assets/help-docs/welcome.md +18 -18
  8. package/public/assets/help-docs/zones.md +4 -2
  9. package/public/assets/svg/icons.svg +31 -0
  10. package/public/{chunk-JZEMHV7X.js → chunk-26NZEHY5.js} +1 -1
  11. package/public/chunk-2BAYNCPQ.js +2 -0
  12. package/public/chunk-3DQV466V.js +11 -0
  13. package/public/chunk-5LQ6SLDH.js +1 -0
  14. package/public/{chunk-DDLXDXAN.js → chunk-74XVS6H6.js} +3 -3
  15. package/public/{chunk-LQXT5QU5.js → chunk-AH7D3GG5.js} +1 -1
  16. package/public/{chunk-APR77K7T.js → chunk-BGFEFM5V.js} +1 -1
  17. package/public/{chunk-QUKRYVOD.js → chunk-BOUFMQO7.js} +4 -4
  18. package/public/{chunk-VFN5BCAV.js → chunk-G55JMUID.js} +1 -1
  19. package/public/{chunk-EWQMXDVS.js → chunk-JO2PGH4G.js} +1 -1
  20. package/public/{chunk-SH2SNQAZ.js → chunk-NZ5HE75L.js} +2 -2
  21. package/public/{chunk-6GBGV2WH.js → chunk-SQZ5Y2UZ.js} +1 -1
  22. package/public/{chunk-6LMDGW4F.js → chunk-T5MW4GJK.js} +1 -1
  23. package/public/chunk-W2ETB57D.js +1 -0
  24. package/public/{chunk-7QVU5UVU.js → chunk-WYMWTXIV.js} +1 -1
  25. package/public/{chunk-5DPJ24CX.js → chunk-YZBZ2AEV.js} +1 -1
  26. package/public/index.html +1 -1
  27. package/public/main-MXFIK2ND.js +237 -0
  28. package/public/chunk-7X5WCXML.js +0 -1
  29. package/public/chunk-CIFNDNHY.js +0 -1
  30. package/public/chunk-EVB7P3BA.js +0 -2
  31. package/public/chunk-OINWO55B.js +0 -10
  32. package/public/main-H5C4CMYU.js +0 -237
@@ -0,0 +1,80 @@
1
+ # KIP – Copilot Instructions (for AI coding agents)
2
+
3
+ Use this quick-start map to be productive in this repo. Prefer these concrete patterns over generic Angular tips. For depth, see COPILOT.md (root) and .github/instructions/angular.instructions.md.
4
+
5
+ ## Big picture
6
+ - Angular v20+ PWA served under base path /@mxtommy/kip/ (angular.json baseHref, package.json scripts).
7
+ - Data flow: SignalKConnectionService → SignalKDeltaService → DataService → Widgets.
8
+ - UI: Dashboard(s) with draggable/resizable widgets (gridstack). Themes: light/dark/night via SCSS roles + CSS variables.
9
+ - Storage: Config lives in Signal K when logged in, else local (StorageService). App init via APP_INITIALIZER (AppNetworkInitService).
10
+
11
+ ## Daily workflows
12
+ - Dev: npm run dev, then open http://localhost:4200/@mxtommy/kip/ (needs a running Signal K server).
13
+ - Build: npm run build-dev | npm run build-prod (outputs to public/ and respects baseHref).
14
+ - Quality: npm run lint, npm test (Karma). E2E (Protractor) is legacy/optional.
15
+
16
+ ## Widget contract (critical)
17
+ - Extend BaseWidgetComponent (src/app/core/utils/base-widget.component.ts) for every widget.
18
+ - Implement startWidget() and updateConfig(config: IWidgetSvcConfig).
19
+ - defaultConfig defines initial config; call validateConfig() to merge new properties into saved configs safely.
20
+ - Subscriptions: observeDataStream('pathKey', next => ...) for values; observeMetaStream() for zones. Cleanup: destroyDataStreams() in ngOnDestroy.
21
+ - Multiple streams: Call observeDataStream once per needed config.paths key. BaseWidget aggregates all under one Subscription; destroyDataStreams() unsubscribes all data and meta streams at once.
22
+ - Units: Always go through UnitsService (convertToUnit, formatWidgetNumberValue). Don’t hardcode conversions/formatting.
23
+ - Define config.paths[pathKey] with: path, pathType ('number' | 'string' | 'Date' | 'boolean'), sampleTime, convertUnitTo, source.
24
+
25
+ ### observeDataStream features (applied automatically)
26
+ - Auto-creates per-path observables from config.paths via createDataObservable() when first used.
27
+ - Applies sampleTime from the path config consistently to reduce churn.
28
+ - For pathType 'number': performs UnitsService.convertToUnit(convertUnitTo) and optionally timeout+retry.
29
+ - For 'string' | 'Date': applies sampleTime and optional timeout/retry (no unit conversion).
30
+ - For 'boolean': applies sampleTime (no timeout/retry).
31
+ - Global timeouts: enableTimeout + dataTimeout (seconds) at widgetProperties.config level control timeout behavior.
32
+
33
+ ## Widget path options (important)
34
+ - pathType: Controls pipeline behavior (see features above). Must be accurate: 'number' | 'string' | 'Date' | 'boolean'.
35
+ - path: Signal K path string (e.g., navigation.speedThroughWater). Empty allowed only when pathRequired=false.
36
+ - sampleTime: Sampling period for the observer (ms). Keep modest (e.g., 250–1000) to reduce churn.
37
+ - convertUnitTo: Target display unit understood by UnitsService (e.g., 'knots', 'celsius', 'deg'). If omitted, treat value as base/metadata unit.
38
+ - source: Optional Signal K source filter; omit to accept any uniquely available source.
39
+ - isPathConfigurable: When false, hides the path from the widget-config UI (for fixed/internal paths). Validation is skipped for this key.
40
+ - pathRequired: Defaults to true. When false, empty path is valid; your widget must handle “no path” gracefully (don’t subscribe; show placeholder).
41
+ - Timeouts: At widgetProperties.config level, enableTimeout + dataTimeout are respected by observeDataStream—don’t add custom timeouts downstream.
42
+
43
+ ## Data, metadata, zones
44
+ - Use DataService for values and metadata. observeDataStream wraps DataService.subscribePath.
45
+ - zones$ emits Signal K zones metadata when observeMetaStream is used; map states to theme roles.
46
+
47
+ ## Theming
48
+ - TS: live theme via this.theme().<role> (from AppService.cssThemeColorRoles$).
49
+ - SCSS: use variables from src/themes/_m3*.scss; avoid hardcoded hex.
50
+
51
+ ## Datasets & charts
52
+ - Historical/trend data: DataSetService (src/app/core/services/data-set.service.ts). Create/update/remove in widget lifecycle.
53
+ - Example: src/app/widgets/widget-windtrends-chart uses Chart.js + date-fns and DataSetService for batch-then-live streams.
54
+
55
+ ## Signal K PUT/requests
56
+ - Read via DataService; write via SignalKRequestsService. UI filters PUT-enabled paths (see src/assets/help-docs/putcontrols.md).
57
+
58
+ ## Project specifics & gotchas
59
+ - Always respect serve path /@mxtommy/kip/ (dev/prod). Assets and routing assume this base.
60
+ - CommonJS deps are explicitly allowed (howler, hammerjs, js-quantities). Avoid introducing new CJS without adding to allowedCommonJsDependencies.
61
+ - Use standalone components, signals, @if/@for; follow .github/instructions/angular.instructions.md for style.
62
+ - Widget config UIs live under src/app/widget-config; path controls use custom validators (no Validators.required). Respect isPathConfigurable and pathRequired.
63
+
64
+ ## Widgets: do this, not that
65
+ - Do: Define a complete defaultConfig (including config.paths) and call validateConfig() before using config. Don’t: Scatter fallback defaults across methods.
66
+ - Do: Use observeDataStream(...) and destroyDataStreams() in ngOnDestroy. Don’t: Manually subscribe to DataService in multiple places without centralized cleanup.
67
+ - Do: Call observeDataStream once per path key; let BaseWidget aggregate subscriptions. Don’t: Manage multiple Subscription instances yourself—destroyDataStreams() handles all.
68
+ - Do: Convert/format with UnitsService and formatWidgetNumberValue(). Don’t: Hardcode unit math (e.g., divide by 0.5144) or toFixed() ignoring widget decimals/min/max.
69
+
70
+ ## Key files/dirs
71
+ - Core services: src/app/core/services/ (DataService, SignalKConnectionService, SignalKDeltaService, AppNetworkInitService, UnitsService, DataSetService, NotificationsService).
72
+ - Widget base: src/app/core/utils/base-widget.component.ts (subscriptions, units, zones, formatting).
73
+ - Widgets: src/app/widgets/ (e.g., widget-numeric, widget-gauge-ng-*, widget-data-chart, widget-windtrends-chart).
74
+ - Config UI: src/app/widget-config/ (shared config components, validators, modals).
75
+ - Build: angular.json, package.json scripts.
76
+
77
+ ## Debugging
78
+ - Use Data Inspector (src/app/core/components/data-inspector) to verify live paths/metadata.
79
+ - Dev with source maps: npm run dev. Watch console from DataService/DataSetService for timeouts/lifecycle logs.
80
+ - Embeds (widget-iframe): prefer same-origin or relative URLs to avoid CORS and input-injection limits (see embedwidget.md).
package/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ # V 3.7.0
2
+ ## New features
3
+ * Real‑time True Wind Trends widget with dual top axes for direction (°) and speed (kts). Shows live values plus SMA over the period average for faster tactical wind shift / pressure awareness.
4
+ ## Improvements
5
+ * Data Chart layout: Cleaner vertical option, optional min/max line, flexible top/right axes, larger fonts for readability.
6
+ * Dataset Service circular angle stats: Correct mean/SMA/min/max for wrap‑around angles (no 0→360 jump spikes) for smoother, accurate trends.
7
+ * Widget categories: New Core & Racing groupings (retired "Basic") reduce hunting time and clarify purpose.
8
+ * Configuration upgrade guidance: More prominent tips ease migration and new input control adaptation after upgrades.
9
+ * Help access: "Get help" button on empty dashboards boosts documentation visibility and user support.
10
+ * Tutorial widget: Clearer instructions improve first‑time user experience.
11
+ * Help documentation updates.
12
+ ## Fixes
13
+ * Enforce WSS under HTTPS to avoid mixed‑content issues. _Contribution by @tkurki_
14
+ * Server reconnect counter should not resets when switching tabs; removed redundant snackbar action button.
15
+ ## New Contributor
16
+ * @tkurki made their first contribution
17
+ # V 3.6.1
18
+ ## Fixes
19
+ * Dashboard swipe gesture over Freeboard-SK and Embed widgets not changing dashboard. Fixes #744
20
+ * Path Options form with hardcoded paths falsy reported as invalid
21
+ * Display of Windsteer widget's True Wind Angle indicator is not optional
1
22
  # V 3.6.0
2
23
  ## Improvements
3
24
  * Numeric widget now features mini background charts for instant visual trend insights
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxtommy/kip",
3
- "version": "3.6.0",
3
+ "version": "3.7.0",
4
4
  "description": "An advanced and versatile marine instrumentation package to display Signal K data.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -6,10 +6,11 @@ The Data Inspector is a good way to validate raw data and available paths withou
6
6
 
7
7
  ## How to use the Data Inspector
8
8
  1. **Filter Paths**:
9
- - Use the filter input box to narrow down the list of paths. For example:
9
+ - Use the filter input box to narrow down the list of paths using any part of the path, source or value. For example:
10
10
  - Type `self.` to view paths related to your vessel.
11
11
  - Type `environment` to view environmental data like wind or temperature.
12
12
  - Type `speed` to view any speed related data like wind speed, max speed, polar speed, etc.
13
+ - Type `derived` to view all path from source derived-data .
13
14
 
14
15
  2. **Sort and Navigate**:
15
16
  - Click on column headers to sort the data by Path, PUT Support, or Source.
@@ -23,7 +24,7 @@ The Data Inspector is a good way to validate raw data and available paths withou
23
24
 
24
25
  2. **PUT Support**:
25
26
  - You can see if a path supports PUT operations, indicated by a green checkmark in the **PUT Support** column.
26
- - For more details on PUT support and how to use it, refer to the Updating Signal K Data Guide.
27
+ - For more details on PUT support and how to use it, refer to the **Updating Signal K Data** help documentation.
27
28
 
28
29
  3. **Multiple Data Sources**:
29
30
  - The Data Inspector displays how many sources are providing data for each path.
@@ -43,7 +44,7 @@ The Data Inspector is a good way to validate raw data and available paths withou
43
44
  - Check if a path supports PUT operations before configuring widgets like the Switch Panel or Slider.
44
45
 
45
46
  - **Troubleshoot Data Issues**:
46
- - The Data Inspector is a good troubleshooting tool, but it should be matched with the Signal K Data Browser when trying to understand raw data and what is going on. The combination of these tools provides a more complete picture of the data and its behavior.
47
+ - The Data Inspector is a good troubleshooting tool, but it should be matched with the Signal K Data Browser when trying to understand raw data and what is going on. The combination of these tools provides a more complete picture of the data, it's processing and its behavior.
47
48
 
48
49
  ## Summary
49
50
 
@@ -1,6 +1,6 @@
1
1
  # Using the Embed Page Viewer Widget
2
2
 
3
- The Embed Page Viewer widget allows you to display external web pages or web applications directly within your dashboard. By default, the Embed Page Viewer widget does not allow input (touch, mouse and keyboard interactions) with the content in the Embed. Their is an option to enable input in the widget options.
3
+ The Embed Page Viewer widget allows you to display external web pages or web applications directly within your dashboard. By default, the Embed Page Viewer widget does not allow input (touch, mouse and keyboard interactions) with the content in the Embed. To enable interactions, check the setting the widget's options.
4
4
 
5
5
  While this embedding feature is powerful, it comes with certain limitations due to browser security policies, specifically related to Cross-Origin Resource Sharing (CORS). This guide explains these limitations in simple terms and how they might affect your use of the widget.
6
6
 
@@ -8,11 +8,11 @@ While this embedding feature is powerful, it comes with certain limitations due
8
8
 
9
9
  CORS (Cross-Origin Resource Sharing) is a security feature built into web browsers. It prevents one website from accessing resources (like web pages or data) from another website unless the other website explicitly allows it. This is done to protect users from malicious websites trying to steal data or perform unauthorized actions.
10
10
 
11
- When you use the Embed Page Viewer widget, it tries to load the content of the URL you provide into an iframe. However, if the website you are trying to embed does not allow its content to be displayed in an iframe on another website (like your Signal K dashboard), the browser will block it. This is not something the widget or Signal K can control—it is a restriction set by the website you are trying to embed.
11
+ When you use the Embed Page Viewer widget, it tries to load the content of the URL you provide into an iframe. However, if the website you are trying to embed does not allow its content to be displayed in an iframe on another website (like embeding their app in your KIP dashboard), the browser will block it. This is not something the widget or Signal K can control—it is a restriction set by the website you are trying to embed.
12
12
 
13
13
  ## Understanding CORS and Hostname/Port Behavior
14
14
 
15
- It is important to clarify that CORS (Cross-Origin Resource Sharing) restrictions are not enforced when the hostname and port of the embedded content match the hostname and port of the KIP dashboard. This is because CORS only applies to requests made across different origins. An origin is defined as a combination of the protocol (e.g., `http` or `https`), hostname (e.g., `localhost` or `example.com`), and port (e.g., `80`, `443`, or a custom port).
15
+ It is important to clarify that CORS (Cross-Origin Resource Sharing) restrictions are not enforced when the hostname and port of the embedded content match the hostname and port of the KIP dashboard. This is because CORS only applies to requests made across different origins. An origin is defined as a combination of the protocol (e.g., `http` or `https`), hostname (e.g., `localhost` or `example.com`), and optional port (e.g., `80`, `443`, or a custom port). If all those are the same as the ones used by KIP, irrespective of the paths that can be present after the port, it is a same-origin path and CORS restrictions do not apply.
16
16
 
17
17
  ### When CORS Does Not Apply
18
18
 
@@ -44,7 +44,7 @@ If the URL you are embedding in the Embed Page Viewer widget uses the same hostn
44
44
 
45
45
  - Embedding webapp and websites is far from perfect. Their are tradeoffs and limitations. If you find yourself unhappy with the result, keep your smile and give back to the community by build a dedicated KIP widget. We will help and many have done so.
46
46
  - By default you cannot interact with the Embed content. Activate the **Enable Input** widget option if you need to interact with the content.
47
- - If you are hosting custom web pages or applications on the same server as your KIP dashboard, ideally you've created a Signal K webapp and shared it with the community, ensure they use the same hostname and port and use a relative URL path in the Embed configuration. For example, if your KIP dashboard is running on `http://localhost:3000/@mxtommy/kip/` and your custom content is under the same origin, such as `http://localhost:3000/signalk-anchoralarm-plugin/` simply enter a relative URL in the widget options, like `/signalk-anchoralarm-plugin/`. KIP will automatically add the proper protocol, hostname, port and load the content. This will prevent issues when content loads when KIP is launch from the server, not not when you load it on your phone or tablet.
47
+ - If you are hosting custom web pages or applications on the same server as your KIP dashboard, ideally you've created a Signal K webapp and shared it with the community, ensure they use the same hostname and port. Use a relative URL path in the Embed configuration. For example, if your KIP dashboard is running on `http://localhost:3000/@mxtommy/kip/` and your custom content is under the same origin, such as `http://localhost:3000/signalk-anchoralarm-plugin/` simply enter a relative URL in the widget options, like `/signalk-anchoralarm-plugin/`. KIP will automatically add the proper protocol, hostname, port and load the content. This will prevent issues loading the embedded content when launching KIP from different devices such as: the server, on your phone, tablet, laptop, etc.
48
48
 
49
49
  ### Summary
50
50
 
@@ -57,7 +57,7 @@ CORS restrictions only apply when the protocol, hostname, or port of the embedde
57
57
 
58
58
  2. **Common Examples of Blocked Content**:
59
59
  - Many popular websites (e.g., banking sites, social media platforms, or secure portals) block iframe embedding for security reasons.
60
- - Some websites may allow embedding only for specific trusted domains, which most probably do not include your Signal K installation.
60
+ - Some websites may allow embedding only for specific trusted domains, which most probably, do not include your Signal K installation.
61
61
 
62
62
  3. **Consequences of Blocked Content in KIP**:
63
63
  - When you enable the "Allow Input" Embed widget option, KIP needs to inject swipe gestures within the embedded application to trigger dashboard navigation, sidebar menu control, or use KIP's keyboard hotkeys while the focus is inside the iframe. To achieve this, KIP dynamically injects scripts into the iframe application. If CORS restrictions apply, this will be prohibited by the browser. This means that gestures and hotkeys will not work over the Embed widget. If you have a full-screen Embed widget, you could get stuck with no way to change dashboards or open menus.
@@ -3,18 +3,18 @@
3
3
  Signal K allows users to update data paths and trigger device reactions. This can include turning a light on or off, dimming it, activating a bilge pump, or other similar actions. This guide explains how to use the Switch Panel or Slider widgets to achieve this, how to verify if a path supports data reception (known as PUT-enabled in Signal K terms), and what is required to enable PUT functionality.
4
4
 
5
5
  ## What is Required to Trigger Device Reactions
6
- By default, sending data to a Signal K path only updates the value and broadcasts it to the network. No actions are taken unless a plugin or handler is configured to respond to the updated value. For example:
7
- - Sending a PUT command to `self.steering.autopilot.state` will update the state value, but the autopilot will not engage unless a plugin or handler is set up to process the command and communicate with the hardware.
6
+ For Signal K to accept any data from a client application, the application must be authenticated with a valid security token. Read the **Login & Configurations** help section for details on how to setup login in KIP. By default, sending data to a Signal K path only updates the value and broadcasts it to the network. No actions are taken unless a plugin or handler is configured to respond to the updated value. For example:
7
+ - Sending a PUT 'engage' command to `self.steering.autopilot.state` will update the state value, but the autopilot will not engage unless a plugin or handler is set up to process the command and communicate with the hardware.
8
8
 
9
9
  To enable actions, you have several options:
10
10
  1. **Install a Plugin**:
11
- - The simplest option is to look in Signal K's app store. There are many plugins already available in the Signal K ecosystem. Search for the plugin you need, install it, and configure it.
11
+ - The simplest option is to look in Signal K's Appstore. There are many plugins already available in the Signal K ecosystem. Search for the plugin you need, install it, and configure it.
12
12
 
13
13
  2. **Use Node-RED's Signal K PUT Handler**:
14
- - Node-RED is a visual and easy-to-learn automation platform installed with Signal K. The Signal K team has created Signal K-specific Node-RED nodes, allowing you to easily automate your vessel. You can find Node-RED in the Webapps section of the Signal K server.
14
+ - Node-RED is a visual and easy-to-learn automation platform installed with Signal K. The Signal K team has created Signal K-specific Node-RED nodes, allowing you to easily automate your vessel. You can find Node-RED in the Webapps section of the Signal K Admin site.
15
15
 
16
16
  3. **Build Your Own Plugin**:
17
- - If no existing plugin meets your needs, you can create a custom Signal K plugin to handle PUT commands for your specific requirements.
17
+ - If no existing plugin meets your needs, you can create a custom Signal K plugin to handle PUT commands for your specific requirements. See: [Getting Started with Plugin Development](https://github.com/SignalK/signalk-server/blob/master/docs/develop/plugins/README.md)
18
18
 
19
19
  ## Checking for PUT Support
20
20
  To verify if a path supports PUT:
@@ -1,7 +1,21 @@
1
- # General Layout
1
+ ## Touch, Mouse, and Keyboard Navigation
2
+ KIP supports multiple input modes for seamless navigation across devices.
3
+
4
+ | Actions | Touch | Mouse | Keyboard Shortcuts |
5
+ |----------------------------|--------------|------------------------------|----------------------------------------------------|
6
+ | Open Actions menu | Swipe left | Click, drag left, and release| <kbd>Shift</kbd> + <kbd>Ctrl</kbd> + <kbd>←</kbd> (Left Arrow) |
7
+ | Open Notification menu | Swipe right | Click, drag right, and release| <kbd>Shift</kbd> + <kbd>Ctrl</kbd> + <kbd>→</kbd> (Right Arrow) |
8
+ | Cycle through dashboards | Swipe up/down | Click, drag up/down, and release| <kbd>Shift</kbd> + <kbd>Ctrl</kbd> + <kbd>↑</kbd>/<kbd>↓</kbd> (Up/Down Arrow) |
9
+ | Toggle Fullscreen | N/A | N/A | <kbd>Shift</kbd> + <kbd>Ctrl</kbd> + <kbd>F</kbd> |
10
+ | Toggle Night mode | N/A | N/A | <kbd>Shift</kbd> + <kbd>Ctrl</kbd> + <kbd>N</kbd> |
11
+ | Toggle dashboard edit mode | N/A | N/A | <kbd>Shift</kbd> + <kbd>Ctrl</kbd> + <kbd>E</kbd> |
12
+
13
+ _Note that the words Touch and Tap are synonymous with mouse click._
14
+ <br/>
15
+
16
+ ## General Layout
2
17
  <img src="../../assets/help-docs/img/general-layout.png" alt="Sidebar Menus" title="Sidebar Menus" width="100%">
3
18
 
4
- UI Elements
5
19
  1. Actions menu
6
20
  2. Fullscreen toggle button
7
21
  3. Night Mode toggle button
@@ -13,20 +27,6 @@ UI Elements
13
27
  9. Resolve notification
14
28
  10. Mute audio toggle button
15
29
 
16
- ## Touch, Mouse, and Keyboard Navigation
17
- KIP supports multiple input modes for seamless navigation across devices.
18
-
19
- | Actions | Gestures | Mouse | Keyboard Shortcuts |
20
- |------------------------------|----------------|------------------------|------------------------------|
21
- | Open Actions menu | Swipe left | Click and Drag Left | Shift + Ctrl + Right Arrow |
22
- | Open Notification menu | Swipe right | Click and Drag Right | Shift + Ctrl + Left Arrow |
23
- | Cycle through dashboards | Swipe Up/Down | Click and Drag Up/Down | Shift + Ctrl + Up/Down Arrow |
24
- | Toggle Fullscreen | N/A | N/A | Shift + Ctrl + F |
25
- | Toggle Night mode | N/A | N/A | Shift + Ctrl + N |
26
- | Toggle Dashboard edit mode | N/A | N/A | Shift + Ctrl + E |
27
-
28
- <br/>
29
-
30
30
  ## Loading KIP on Phones, Tablets, Raspberry Pi, and Computers
31
31
  Simply navigate to `http://<Signal K Server URL>:<port>/@mxtommy/kip/` to load KIP and enjoy its features remotely on any device.
32
32
 
@@ -51,5 +51,5 @@ You can toggle fullscreen mode on and off, and disable the screen saver and comp
51
51
  ## Night Mode
52
52
  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.
53
53
 
54
- ## Multiple User Profiles
55
- 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.
54
+ ## Multiple User Profiles and Configuration Sharing
55
+ 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.
@@ -51,10 +51,12 @@ You can **Silence** or **Resolve** notifications.
51
51
  ## Displaying Zones and Notifications
52
52
 
53
53
  - **Notifications Menu:**
54
- The Notifications Menu lists all active notifications, including details such as path, severity, and message. You can silence or resolve notifications directly from this menu. By default, the menu is hidden; when a notification arrives, a prominent button appears in the lower-right corner. Tap or click this button to open the menu, or swipe right to access it at any time.
54
+ The Notifications Menu lists all active notifications, including details such as path, severity, and message. You can silence or resolve notifications directly from this menu. At the bottom of the Notifications menu, you will find a Mute button. This button mutes the notification volume. It does not Silence the notifications. It is meant as a quick noise cancelling button to spare your ears until you resolve the issue(s) but has no effect on the notifications.
55
+
56
+ By default, the Notifications menu is hidden; when a notification arrives, a prominent button appears in the lower-right corner to alert you of changes in notifications. Tap or click this button to open the menu, or swipe right to access it at any time.
55
57
 
56
58
  - **Individual Widgets:**
57
- Widgets such as **Numeric**, **Linear**, **Radial**, and **Steel Style** visually highlight relevant data ranges according to their configured zones and integrate notification states into their display. You can configure each widget to ignore zones if desired.
59
+ Widgets such as **Numeric**, **Simple Linear**, **Linear**, **Radial**, and **Steel Style** visually highlight relevant data ranges according to their configured zones and integrate notification states into their display. You can configure each widget to ignore zones if desired.
58
60
 
59
61
  ---
60
62
 
@@ -168,6 +168,37 @@
168
168
  <svg id="datachartWidget" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 15 15">
169
169
  <path fill="none" stroke="currentColor" d="M.5 0v14.5h14V0M.5 4.5h2v1h2v3h2v3h1v3v-2h2v-2h2v-3h1v-2h2" />
170
170
  </svg>
171
+ <svg id="windtrendsWidget" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 15 15">
172
+ <g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round">
173
+ <!-- Axes: left and bottom baseline -->
174
+ <path d="M.5.5v14"/>
175
+ <path d="M.5 14.5h14"/>
176
+ <!-- Subtle gridlines -->
177
+ <path d="M1.5 9.5h13" stroke-opacity=".25" stroke-width=".5"/>
178
+ <path d="M1.5 4.5h13" stroke-opacity=".25" stroke-width=".5"/>
179
+ <!-- Axis ticks -->
180
+ <path d="M.5 9.5h1" stroke-width=".7"/>
181
+ <path d="M.5 4.5h1" stroke-width=".7"/>
182
+ <path d="M4 14.5v-.9" stroke-width=".7"/>
183
+ <path d="M8 14.5v-.9" stroke-width=".7"/>
184
+ <path d="M12 14.5v-.9" stroke-width=".7"/>
185
+ <!-- Dual chart-like vertical traces: primary jagged, secondary smooth -->
186
+ <path d="M5 13 L6.2 11 L3.8 9 L6.4 7 L3.6 5 L5 3" stroke-width="1.2"/>
187
+ <path d="M10 13 C 7.8 11, 8.4 8.5, 10.6 6.8 S 12.8 4.2, 10 3" stroke-opacity=".5" stroke-width="1.2"/>
188
+ <!-- Small data points to enhance chart feel -->
189
+ <g fill="currentColor" stroke="none">
190
+ <circle cx="5" cy="13" r=".45"/>
191
+ <circle cx="6.2" cy="11" r=".45"/>
192
+ <circle cx="3.8" cy="9" r=".45"/>
193
+ <circle cx="6.4" cy="7" r=".45"/>
194
+ <circle cx="3.6" cy="5" r=".45"/>
195
+ <circle cx="5" cy="3" r=".45"/>
196
+ <circle cx="10" cy="13" r=".45" fill-opacity=".5"/>
197
+ <circle cx="10.6" cy="6.8" r=".45" fill-opacity=".5"/>
198
+ <circle cx="10" cy="3" r=".45" fill-opacity=".5"/>
199
+ </g>
200
+ </g>
201
+ </svg>
171
202
  <svg id="windsteeringWidget" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 30 30">
172
203
  <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"/>
173
204
  </svg>
@@ -1,4 +1,4 @@
1
- import{S as Ut,e as Ht}from"./chunk-QUKRYVOD.js";import{$b as j,$d as Ot,Aa as c,Ab as L,Ac as At,Ae as Gt,Cb as tt,Da as Y,Db as Lt,Fb as u,Gb as Q,Hb as z,I as kt,Ie as $t,Ja as X,K as H,L as Tt,Le as qt,Mc as A,Me as mt,Na as Rt,Oa as N,Od as Vt,P as Ct,Qa as R,Ra as Pt,Rb as k,Sb as et,Tb as at,Te as Kt,Ud as st,Ue as Zt,Vb as it,Wb as nt,Xb as rt,Yb as T,Zb as h,Zc as Ft,_b as y,_d as Nt,de as Qt,ea as xt,ed as q,f as P,fa as V,g as w,ga as wt,gc as E,ha as M,ic as C,id as _,j as gt,jd as K,je as zt,kc as g,ke as jt,lb as f,lc as W,m as F,mc as G,me as Wt,nb as O,nc as S,oa as It,oc as p,pa as Dt,pb as J,pc as m,qc as b,qe as lt,r as vt,ra as D,re as dt,sb as Mt,t as yt,ta as o,uc as ot,ue as Z,vc as Et,wb as B,wc as v,xb as Bt,yb as I,yc as $,za as d,zc as St,ze as ct}from"./chunk-W2S6R4AZ.js";var ut=["*"];function oe(n,l){n&1&&G(0)}var se=["tabListContainer"],le=["tabList"],de=["tabListInner"],ce=["nextPaginator"],me=["previousPaginator"],be=["content"];function he(n,l){}var pe=["tabBodyWrapper"],_e=["tabHeader"];function ue(n,l){}function fe(n,l){if(n&1&&tt(0,ue,0,0,"ng-template",12),n&2){let t=g().$implicit;T("cdkPortalOutlet",t.templateLabel)}}function ge(n,l){if(n&1&&St(0),n&2){let t=g().$implicit;At(t.textLabel)}}function ve(n,l){if(n&1){let t=E();h(0,"div",7,2),C("click",function(){let a=d(t),i=a.$implicit,r=a.$index,s=g(),x=ot(1);return c(s._handleClick(i,x,r))})("cdkFocusChange",function(a){let i=d(t).$index,r=g();return c(r._tabFocusChanged(a,i))}),j(2,"span",8)(3,"div",9),h(4,"span",10)(5,"span",11),et(6,fe,1,1,null,12)(7,ge,1,1),y()()()}if(n&2){let t=l.$implicit,e=l.$index,a=ot(1),i=g();$(t.labelClass),v("mdc-tab--active",i.selectedIndex===e),T("id",i._getTabLabelId(t,e))("disabled",t.disabled)("fitInkBarToContent",i.fitInkBarToContent),k("tabIndex",i._getTabIndex(e))("aria-posinset",e+1)("aria-setsize",i._tabs.length)("aria-controls",i._getTabContentId(e))("aria-selected",i.selectedIndex===e)("aria-label",t.ariaLabel||null)("aria-labelledby",!t.ariaLabel&&t.ariaLabelledby?t.ariaLabelledby:null),f(3),T("matRippleTrigger",a)("matRippleDisabled",t.disabled||i.disableRipple),f(3),at(t.templateLabel?6:7)}}function ye(n,l){n&1&&G(0)}function ke(n,l){if(n&1){let t=E();h(0,"mat-tab-body",13),C("_onCentered",function(){d(t);let a=g();return c(a._removeTabBodyWrapperHeight())})("_onCentering",function(a){d(t);let i=g();return c(i._setTabBodyWrapperHeight(a))})("_beforeCentering",function(a){d(t);let i=g();return c(i._bodyCentered(a))}),y()}if(n&2){let t=l.$implicit,e=l.$index,a=g();$(t.bodyClass),T("id",a._getTabContentId(e))("content",t.content)("position",t.position)("animationDuration",a.animationDuration)("preserveContent",a.preserveContent),k("tabindex",a.contentTabIndex!=null&&a.selectedIndex===e?a.contentTabIndex:null)("aria-labelledby",a._getTabLabelId(t,e))("aria-hidden",a.selectedIndex!==e)}}var Te=new D("MatTabContent"),Ce=(()=>{class n{template=o(O);constructor(){}static \u0275fac=function(e){return new(e||n)};static \u0275dir=I({type:n,selectors:[["","matTabContent",""]],features:[A([{provide:Te,useExisting:n}])]})}return n})(),xe=new D("MatTabLabel"),te=new D("MAT_TAB"),we=(()=>{class n extends qt{_closestTab=o(te,{optional:!0});static \u0275fac=(()=>{let t;return function(a){return(t||(t=N(n)))(a||n)}})();static \u0275dir=I({type:n,selectors:[["","mat-tab-label",""],["","matTabLabel",""]],features:[A([{provide:xe,useExisting:n}]),L]})}return n})(),ee=new D("MAT_TAB_GROUP"),Ie=(()=>{class n{_viewContainerRef=o(Mt);_closestTabGroup=o(ee,{optional:!0});disabled=!1;get templateLabel(){return this._templateLabel}set templateLabel(t){this._setTemplateLabelInput(t)}_templateLabel;_explicitContent=void 0;_implicitContent;textLabel="";ariaLabel;ariaLabelledby;labelClass;bodyClass;id=null;_contentPortal=null;get content(){return this._contentPortal}_stateChanges=new F;position=null;origin=null;isActive=!1;constructor(){o(Ot).load(Gt)}ngOnChanges(t){(t.hasOwnProperty("textLabel")||t.hasOwnProperty("disabled"))&&this._stateChanges.next()}ngOnDestroy(){this._stateChanges.complete()}ngOnInit(){this._contentPortal=new $t(this._explicitContent||this._implicitContent,this._viewContainerRef)}_setTemplateLabelInput(t){t&&t._closestTab===this&&(this._templateLabel=t)}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=B({type:n,selectors:[["mat-tab"]],contentQueries:function(e,a,i){if(e&1&&(S(i,we,5),S(i,Ce,7,O)),e&2){let r;m(r=b())&&(a.templateLabel=r.first),m(r=b())&&(a._explicitContent=r.first)}},viewQuery:function(e,a){if(e&1&&p(O,7),e&2){let i;m(i=b())&&(a._implicitContent=i.first)}},hostAttrs:["hidden",""],hostVars:1,hostBindings:function(e,a){e&2&&k("id",null)},inputs:{disabled:[2,"disabled","disabled",_],textLabel:[0,"label","textLabel"],ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],labelClass:"labelClass",bodyClass:"bodyClass",id:"id"},exportAs:["matTab"],features:[A([{provide:te,useExisting:n}]),Rt],ngContentSelectors:ut,decls:1,vars:0,template:function(e,a){e&1&&(W(),Lt(0,oe,1,0,"ng-template"))},encapsulation:2})}return n})(),bt="mdc-tab-indicator--active",Yt="mdc-tab-indicator--no-transition",ht=class{_items;_currentItem;constructor(l){this._items=l}hide(){this._items.forEach(l=>l.deactivateInkBar()),this._currentItem=void 0}alignToElement(l){let t=this._items.find(a=>a.elementRef.nativeElement===l),e=this._currentItem;if(t!==e&&(e?.deactivateInkBar(),t)){let a=e?.elementRef.nativeElement.getBoundingClientRect?.();t.activateInkBar(a),this._currentItem=t}}},De=(()=>{class n{_elementRef=o(R);_inkBarElement;_inkBarContentElement;_fitToContent=!1;get fitInkBarToContent(){return this._fitToContent}set fitInkBarToContent(t){this._fitToContent!==t&&(this._fitToContent=t,this._inkBarElement&&this._appendInkBarElement())}activateInkBar(t){let e=this._elementRef.nativeElement;if(!t||!e.getBoundingClientRect||!this._inkBarContentElement){e.classList.add(bt);return}let a=e.getBoundingClientRect(),i=t.width/a.width,r=t.left-a.left;e.classList.add(Yt),this._inkBarContentElement.style.setProperty("transform",`translateX(${r}px) scaleX(${i})`),e.getBoundingClientRect(),e.classList.remove(Yt),e.classList.add(bt),this._inkBarContentElement.style.setProperty("transform","")}deactivateInkBar(){this._elementRef.nativeElement.classList.remove(bt)}ngOnInit(){this._createInkBarElement()}ngOnDestroy(){this._inkBarElement?.remove(),this._inkBarElement=this._inkBarContentElement=null}_createInkBarElement(){let t=this._elementRef.nativeElement.ownerDocument||document,e=this._inkBarElement=t.createElement("span"),a=this._inkBarContentElement=t.createElement("span");e.className="mdc-tab-indicator",a.className="mdc-tab-indicator__content mdc-tab-indicator__content--underline",e.appendChild(this._inkBarContentElement),this._appendInkBarElement()}_appendInkBarElement(){this._inkBarElement;let t=this._fitToContent?this._elementRef.nativeElement.querySelector(".mdc-tab__content"):this._elementRef.nativeElement;t.appendChild(this._inkBarElement)}static \u0275fac=function(e){return new(e||n)};static \u0275dir=I({type:n,inputs:{fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",_]}})}return n})();var ae=(()=>{class n extends De{elementRef=o(R);disabled=!1;focus(){this.elementRef.nativeElement.focus()}getOffsetLeft(){return this.elementRef.nativeElement.offsetLeft}getOffsetWidth(){return this.elementRef.nativeElement.offsetWidth}static \u0275fac=(()=>{let t;return function(a){return(t||(t=N(n)))(a||n)}})();static \u0275dir=I({type:n,selectors:[["","matTabLabelWrapper",""]],hostVars:3,hostBindings:function(e,a){e&2&&(k("aria-disabled",!!a.disabled),v("mat-mdc-tab-disabled",a.disabled))},inputs:{disabled:[2,"disabled","disabled",_]},features:[L]})}return n})(),Xt={passive:!0},Re=650,Pe=100,Me=(()=>{class n{_elementRef=o(R);_changeDetectorRef=o(q);_viewportRuler=o(Zt);_dir=o(lt,{optional:!0});_ngZone=o(Q);_platform=o(st);_sharedResizeObserver=o(Ut);_injector=o(Y);_renderer=o(J);_animationsDisabled=Z();_eventCleanups;_scrollDistance=0;_selectedIndexChanged=!1;_destroyed=new F;_showPaginationControls=!1;_disableScrollAfter=!0;_disableScrollBefore=!0;_tabLabelCount;_scrollDistanceChanged;_keyManager;_currentTextContent;_stopScrolling=new F;disablePagination=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(t){let e=isNaN(t)?0:t;this._selectedIndex!=e&&(this._selectedIndexChanged=!0,this._selectedIndex=e,this._keyManager&&this._keyManager.updateActiveItem(e))}_selectedIndex=0;selectFocusedIndex=new u;indexFocused=new u;constructor(){this._eventCleanups=this._ngZone.runOutsideAngular(()=>[this._renderer.listen(this._elementRef.nativeElement,"mouseleave",()=>this._stopInterval())])}ngAfterViewInit(){this._eventCleanups.push(this._renderer.listen(this._previousPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("before"),Xt),this._renderer.listen(this._nextPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("after"),Xt))}ngAfterContentInit(){let t=this._dir?this._dir.change:yt("ltr"),e=this._sharedResizeObserver.observe(this._elementRef.nativeElement).pipe(Ct(32),M(this._destroyed)),a=this._viewportRuler.change(150).pipe(M(this._destroyed)),i=()=>{this.updatePagination(),this._alignInkBarToSelectedTab()};this._keyManager=new Wt(this._items).withHorizontalOrientation(this._getLayoutDirection()).withHomeAndEnd().withWrap().skipPredicate(()=>!1),this._keyManager.updateActiveItem(Math.max(this._selectedIndex,0)),z(i,{injector:this._injector}),H(t,a,e,this._items.changes,this._itemsResized()).pipe(M(this._destroyed)).subscribe(()=>{this._ngZone.run(()=>{Promise.resolve().then(()=>{this._scrollDistance=Math.max(0,Math.min(this._getMaxScrollDistance(),this._scrollDistance)),i()})}),this._keyManager?.withHorizontalOrientation(this._getLayoutDirection())}),this._keyManager.change.subscribe(r=>{this.indexFocused.emit(r),this._setTabFocus(r)})}_itemsResized(){return typeof ResizeObserver!="function"?vt:this._items.changes.pipe(V(this._items),wt(t=>new gt(e=>this._ngZone.runOutsideAngular(()=>{let a=new ResizeObserver(i=>e.next(i));return t.forEach(i=>a.observe(i.elementRef.nativeElement)),()=>{a.disconnect()}}))),xt(1),Tt(t=>t.some(e=>e.contentRect.width>0&&e.contentRect.height>0)))}ngAfterContentChecked(){this._tabLabelCount!=this._items.length&&(this.updatePagination(),this._tabLabelCount=this._items.length,this._changeDetectorRef.markForCheck()),this._selectedIndexChanged&&(this._scrollToLabel(this._selectedIndex),this._checkScrollingControls(),this._alignInkBarToSelectedTab(),this._selectedIndexChanged=!1,this._changeDetectorRef.markForCheck()),this._scrollDistanceChanged&&(this._updateTabScrollPosition(),this._scrollDistanceChanged=!1,this._changeDetectorRef.markForCheck())}ngOnDestroy(){this._eventCleanups.forEach(t=>t()),this._keyManager?.destroy(),this._destroyed.next(),this._destroyed.complete(),this._stopScrolling.complete()}_handleKeydown(t){if(!jt(t))switch(t.keyCode){case 13:case 32:if(this.focusIndex!==this.selectedIndex){let e=this._items.get(this.focusIndex);e&&!e.disabled&&(this.selectFocusedIndex.emit(this.focusIndex),this._itemSelected(t))}break;default:this._keyManager?.onKeydown(t)}}_onContentChanges(){let t=this._elementRef.nativeElement.textContent;t!==this._currentTextContent&&(this._currentTextContent=t||"",this._ngZone.run(()=>{this.updatePagination(),this._alignInkBarToSelectedTab(),this._changeDetectorRef.markForCheck()}))}updatePagination(){this._checkPaginationEnabled(),this._checkScrollingControls(),this._updateTabScrollPosition()}get focusIndex(){return this._keyManager?this._keyManager.activeItemIndex:0}set focusIndex(t){!this._isValidIndex(t)||this.focusIndex===t||!this._keyManager||this._keyManager.setActiveItem(t)}_isValidIndex(t){return this._items?!!this._items.toArray()[t]:!0}_setTabFocus(t){if(this._showPaginationControls&&this._scrollToLabel(t),this._items&&this._items.length){this._items.toArray()[t].focus();let e=this._tabListContainer.nativeElement;this._getLayoutDirection()=="ltr"?e.scrollLeft=0:e.scrollLeft=e.scrollWidth-e.offsetWidth}}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_updateTabScrollPosition(){if(this.disablePagination)return;let t=this.scrollDistance,e=this._getLayoutDirection()==="ltr"?-t:t;this._tabList.nativeElement.style.transform=`translateX(${Math.round(e)}px)`,(this._platform.TRIDENT||this._platform.EDGE)&&(this._tabListContainer.nativeElement.scrollLeft=0)}get scrollDistance(){return this._scrollDistance}set scrollDistance(t){this._scrollTo(t)}_scrollHeader(t){let e=this._tabListContainer.nativeElement.offsetWidth,a=(t=="before"?-1:1)*e/3;return this._scrollTo(this._scrollDistance+a)}_handlePaginatorClick(t){this._stopInterval(),this._scrollHeader(t)}_scrollToLabel(t){if(this.disablePagination)return;let e=this._items?this._items.toArray()[t]:null;if(!e)return;let a=this._tabListContainer.nativeElement.offsetWidth,{offsetLeft:i,offsetWidth:r}=e.elementRef.nativeElement,s,x;this._getLayoutDirection()=="ltr"?(s=i,x=s+r):(x=this._tabListInner.nativeElement.offsetWidth-i,s=x-r);let U=this.scrollDistance,ft=this.scrollDistance+a;s<U?this.scrollDistance-=U-s:x>ft&&(this.scrollDistance+=Math.min(x-ft,s-U))}_checkPaginationEnabled(){if(this.disablePagination)this._showPaginationControls=!1;else{let t=this._tabListInner.nativeElement.scrollWidth,e=this._elementRef.nativeElement.offsetWidth,a=t-e>=5;a||(this.scrollDistance=0),a!==this._showPaginationControls&&(this._showPaginationControls=a,this._changeDetectorRef.markForCheck())}}_checkScrollingControls(){this.disablePagination?this._disableScrollAfter=this._disableScrollBefore=!0:(this._disableScrollBefore=this.scrollDistance==0,this._disableScrollAfter=this.scrollDistance==this._getMaxScrollDistance(),this._changeDetectorRef.markForCheck())}_getMaxScrollDistance(){let t=this._tabListInner.nativeElement.scrollWidth,e=this._tabListContainer.nativeElement.offsetWidth;return t-e||0}_alignInkBarToSelectedTab(){let t=this._items&&this._items.length?this._items.toArray()[this.selectedIndex]:null,e=t?t.elementRef.nativeElement:null;e?this._inkBar.alignToElement(e):this._inkBar.hide()}_stopInterval(){this._stopScrolling.next()}_handlePaginatorPress(t,e){e&&e.button!=null&&e.button!==0||(this._stopInterval(),kt(Re,Pe).pipe(M(H(this._stopScrolling,this._destroyed))).subscribe(()=>{let{maxScrollDistance:a,distance:i}=this._scrollHeader(t);(i===0||i>=a)&&this._stopInterval()}))}_scrollTo(t){if(this.disablePagination)return{maxScrollDistance:0,distance:0};let e=this._getMaxScrollDistance();return this._scrollDistance=Math.max(0,Math.min(e,t)),this._scrollDistanceChanged=!0,this._checkScrollingControls(),{maxScrollDistance:e,distance:this._scrollDistance}}static \u0275fac=function(e){return new(e||n)};static \u0275dir=I({type:n,inputs:{disablePagination:[2,"disablePagination","disablePagination",_],selectedIndex:[2,"selectedIndex","selectedIndex",K]},outputs:{selectFocusedIndex:"selectFocusedIndex",indexFocused:"indexFocused"}})}return n})(),Be=(()=>{class n extends Me{_items;_tabListContainer;_tabList;_tabListInner;_nextPaginator;_previousPaginator;_inkBar;ariaLabel;ariaLabelledby;disableRipple=!1;ngAfterContentInit(){this._inkBar=new ht(this._items),super.ngAfterContentInit()}_itemSelected(t){t.preventDefault()}static \u0275fac=(()=>{let t;return function(a){return(t||(t=N(n)))(a||n)}})();static \u0275cmp=B({type:n,selectors:[["mat-tab-header"]],contentQueries:function(e,a,i){if(e&1&&S(i,ae,4),e&2){let r;m(r=b())&&(a._items=r)}},viewQuery:function(e,a){if(e&1&&(p(se,7),p(le,7),p(de,7),p(ce,5),p(me,5)),e&2){let i;m(i=b())&&(a._tabListContainer=i.first),m(i=b())&&(a._tabList=i.first),m(i=b())&&(a._tabListInner=i.first),m(i=b())&&(a._nextPaginator=i.first),m(i=b())&&(a._previousPaginator=i.first)}},hostAttrs:[1,"mat-mdc-tab-header"],hostVars:4,hostBindings:function(e,a){e&2&&v("mat-mdc-tab-header-pagination-controls-enabled",a._showPaginationControls)("mat-mdc-tab-header-rtl",a._getLayoutDirection()=="rtl")},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],disableRipple:[2,"disableRipple","disableRipple",_]},features:[L],ngContentSelectors:ut,decls:13,vars:10,consts:[["previousPaginator",""],["tabListContainer",""],["tabList",""],["tabListInner",""],["nextPaginator",""],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-before",3,"click","mousedown","touchend","matRippleDisabled"],[1,"mat-mdc-tab-header-pagination-chevron"],[1,"mat-mdc-tab-label-container",3,"keydown"],["role","tablist",1,"mat-mdc-tab-list",3,"cdkObserveContent"],[1,"mat-mdc-tab-labels"],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-after",3,"mousedown","click","touchend","matRippleDisabled"]],template:function(e,a){if(e&1){let i=E();W(),h(0,"div",5,0),C("click",function(){return d(i),c(a._handlePaginatorClick("before"))})("mousedown",function(s){return d(i),c(a._handlePaginatorPress("before",s))})("touchend",function(){return d(i),c(a._stopInterval())}),j(2,"div",6),y(),h(3,"div",7,1),C("keydown",function(s){return d(i),c(a._handleKeydown(s))}),h(5,"div",8,2),C("cdkObserveContent",function(){return d(i),c(a._onContentChanges())}),h(7,"div",9,3),G(9),y()()(),h(10,"div",10,4),C("mousedown",function(s){return d(i),c(a._handlePaginatorPress("after",s))})("click",function(){return d(i),c(a._handlePaginatorClick("after"))})("touchend",function(){return d(i),c(a._stopInterval())}),j(12,"div",6),y()}e&2&&(v("mat-mdc-tab-header-pagination-disabled",a._disableScrollBefore),T("matRippleDisabled",a._disableScrollBefore||a.disableRipple),f(3),v("_mat-animation-noopable",a._animationsDisabled),f(2),k("aria-label",a.ariaLabel||null)("aria-labelledby",a.ariaLabelledby||null),f(5),v("mat-mdc-tab-header-pagination-disabled",a._disableScrollAfter),T("matRippleDisabled",a._disableScrollAfter||a.disableRipple))},dependencies:[ct,Qt],styles:[`.mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mdc-tab-indicator .mdc-tab-indicator__content{transition-duration:var(--mat-tab-animation-duration, 250ms)}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;outline:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-pagination-icon-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1;border-bottom-style:solid;border-bottom-width:var(--mat-tab-divider-height, 1px);border-bottom-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-group-inverted-header .mat-mdc-tab-label-container{border-bottom:none;border-top-style:solid;border-top-width:var(--mat-tab-divider-height, 1px);border-top-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.cdk-drop-list .mat-mdc-tab-labels,.mat-mdc-tab-labels.cdk-drop-list{min-height:var(--mat-tab-container-height, 48px)}.mat-mdc-tab::before{margin:5px}@media(forced-colors: active){.mat-mdc-tab[aria-disabled=true]{color:GrayText}}
1
+ import{S as Ut,e as Ht}from"./chunk-BOUFMQO7.js";import{$b as j,$d as Ot,Aa as c,Ab as L,Ac as At,Ae as Gt,Cb as tt,Da as Y,Db as Lt,Fb as u,Gb as Q,Hb as z,I as kt,Ie as $t,Ja as X,K as H,L as Tt,Le as qt,Mc as A,Me as mt,Na as Rt,Oa as N,Od as Vt,P as Ct,Qa as R,Ra as Pt,Rb as k,Sb as et,Tb as at,Te as Kt,Ud as st,Ue as Zt,Vb as it,Wb as nt,Xb as rt,Yb as T,Zb as h,Zc as Ft,_b as y,_d as Nt,de as Qt,ea as xt,ed as q,f as P,fa as V,g as w,ga as wt,gc as E,ha as M,ic as C,id as _,j as gt,jd as K,je as zt,kc as g,ke as jt,lb as f,lc as W,m as F,mc as G,me as Wt,nb as O,nc as S,oa as It,oc as p,pa as Dt,pb as J,pc as m,qc as b,qe as lt,r as vt,ra as D,re as dt,sb as Mt,t as yt,ta as o,uc as ot,ue as Z,vc as Et,wb as B,wc as v,xb as Bt,yb as I,yc as $,za as d,zc as St,ze as ct}from"./chunk-W2S6R4AZ.js";var ut=["*"];function oe(n,l){n&1&&G(0)}var se=["tabListContainer"],le=["tabList"],de=["tabListInner"],ce=["nextPaginator"],me=["previousPaginator"],be=["content"];function he(n,l){}var pe=["tabBodyWrapper"],_e=["tabHeader"];function ue(n,l){}function fe(n,l){if(n&1&&tt(0,ue,0,0,"ng-template",12),n&2){let t=g().$implicit;T("cdkPortalOutlet",t.templateLabel)}}function ge(n,l){if(n&1&&St(0),n&2){let t=g().$implicit;At(t.textLabel)}}function ve(n,l){if(n&1){let t=E();h(0,"div",7,2),C("click",function(){let a=d(t),i=a.$implicit,r=a.$index,s=g(),x=ot(1);return c(s._handleClick(i,x,r))})("cdkFocusChange",function(a){let i=d(t).$index,r=g();return c(r._tabFocusChanged(a,i))}),j(2,"span",8)(3,"div",9),h(4,"span",10)(5,"span",11),et(6,fe,1,1,null,12)(7,ge,1,1),y()()()}if(n&2){let t=l.$implicit,e=l.$index,a=ot(1),i=g();$(t.labelClass),v("mdc-tab--active",i.selectedIndex===e),T("id",i._getTabLabelId(t,e))("disabled",t.disabled)("fitInkBarToContent",i.fitInkBarToContent),k("tabIndex",i._getTabIndex(e))("aria-posinset",e+1)("aria-setsize",i._tabs.length)("aria-controls",i._getTabContentId(e))("aria-selected",i.selectedIndex===e)("aria-label",t.ariaLabel||null)("aria-labelledby",!t.ariaLabel&&t.ariaLabelledby?t.ariaLabelledby:null),f(3),T("matRippleTrigger",a)("matRippleDisabled",t.disabled||i.disableRipple),f(3),at(t.templateLabel?6:7)}}function ye(n,l){n&1&&G(0)}function ke(n,l){if(n&1){let t=E();h(0,"mat-tab-body",13),C("_onCentered",function(){d(t);let a=g();return c(a._removeTabBodyWrapperHeight())})("_onCentering",function(a){d(t);let i=g();return c(i._setTabBodyWrapperHeight(a))})("_beforeCentering",function(a){d(t);let i=g();return c(i._bodyCentered(a))}),y()}if(n&2){let t=l.$implicit,e=l.$index,a=g();$(t.bodyClass),T("id",a._getTabContentId(e))("content",t.content)("position",t.position)("animationDuration",a.animationDuration)("preserveContent",a.preserveContent),k("tabindex",a.contentTabIndex!=null&&a.selectedIndex===e?a.contentTabIndex:null)("aria-labelledby",a._getTabLabelId(t,e))("aria-hidden",a.selectedIndex!==e)}}var Te=new D("MatTabContent"),Ce=(()=>{class n{template=o(O);constructor(){}static \u0275fac=function(e){return new(e||n)};static \u0275dir=I({type:n,selectors:[["","matTabContent",""]],features:[A([{provide:Te,useExisting:n}])]})}return n})(),xe=new D("MatTabLabel"),te=new D("MAT_TAB"),we=(()=>{class n extends qt{_closestTab=o(te,{optional:!0});static \u0275fac=(()=>{let t;return function(a){return(t||(t=N(n)))(a||n)}})();static \u0275dir=I({type:n,selectors:[["","mat-tab-label",""],["","matTabLabel",""]],features:[A([{provide:xe,useExisting:n}]),L]})}return n})(),ee=new D("MAT_TAB_GROUP"),Ie=(()=>{class n{_viewContainerRef=o(Mt);_closestTabGroup=o(ee,{optional:!0});disabled=!1;get templateLabel(){return this._templateLabel}set templateLabel(t){this._setTemplateLabelInput(t)}_templateLabel;_explicitContent=void 0;_implicitContent;textLabel="";ariaLabel;ariaLabelledby;labelClass;bodyClass;id=null;_contentPortal=null;get content(){return this._contentPortal}_stateChanges=new F;position=null;origin=null;isActive=!1;constructor(){o(Ot).load(Gt)}ngOnChanges(t){(t.hasOwnProperty("textLabel")||t.hasOwnProperty("disabled"))&&this._stateChanges.next()}ngOnDestroy(){this._stateChanges.complete()}ngOnInit(){this._contentPortal=new $t(this._explicitContent||this._implicitContent,this._viewContainerRef)}_setTemplateLabelInput(t){t&&t._closestTab===this&&(this._templateLabel=t)}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=B({type:n,selectors:[["mat-tab"]],contentQueries:function(e,a,i){if(e&1&&(S(i,we,5),S(i,Ce,7,O)),e&2){let r;m(r=b())&&(a.templateLabel=r.first),m(r=b())&&(a._explicitContent=r.first)}},viewQuery:function(e,a){if(e&1&&p(O,7),e&2){let i;m(i=b())&&(a._implicitContent=i.first)}},hostAttrs:["hidden",""],hostVars:1,hostBindings:function(e,a){e&2&&k("id",null)},inputs:{disabled:[2,"disabled","disabled",_],textLabel:[0,"label","textLabel"],ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],labelClass:"labelClass",bodyClass:"bodyClass",id:"id"},exportAs:["matTab"],features:[A([{provide:te,useExisting:n}]),Rt],ngContentSelectors:ut,decls:1,vars:0,template:function(e,a){e&1&&(W(),Lt(0,oe,1,0,"ng-template"))},encapsulation:2})}return n})(),bt="mdc-tab-indicator--active",Yt="mdc-tab-indicator--no-transition",ht=class{_items;_currentItem;constructor(l){this._items=l}hide(){this._items.forEach(l=>l.deactivateInkBar()),this._currentItem=void 0}alignToElement(l){let t=this._items.find(a=>a.elementRef.nativeElement===l),e=this._currentItem;if(t!==e&&(e?.deactivateInkBar(),t)){let a=e?.elementRef.nativeElement.getBoundingClientRect?.();t.activateInkBar(a),this._currentItem=t}}},De=(()=>{class n{_elementRef=o(R);_inkBarElement;_inkBarContentElement;_fitToContent=!1;get fitInkBarToContent(){return this._fitToContent}set fitInkBarToContent(t){this._fitToContent!==t&&(this._fitToContent=t,this._inkBarElement&&this._appendInkBarElement())}activateInkBar(t){let e=this._elementRef.nativeElement;if(!t||!e.getBoundingClientRect||!this._inkBarContentElement){e.classList.add(bt);return}let a=e.getBoundingClientRect(),i=t.width/a.width,r=t.left-a.left;e.classList.add(Yt),this._inkBarContentElement.style.setProperty("transform",`translateX(${r}px) scaleX(${i})`),e.getBoundingClientRect(),e.classList.remove(Yt),e.classList.add(bt),this._inkBarContentElement.style.setProperty("transform","")}deactivateInkBar(){this._elementRef.nativeElement.classList.remove(bt)}ngOnInit(){this._createInkBarElement()}ngOnDestroy(){this._inkBarElement?.remove(),this._inkBarElement=this._inkBarContentElement=null}_createInkBarElement(){let t=this._elementRef.nativeElement.ownerDocument||document,e=this._inkBarElement=t.createElement("span"),a=this._inkBarContentElement=t.createElement("span");e.className="mdc-tab-indicator",a.className="mdc-tab-indicator__content mdc-tab-indicator__content--underline",e.appendChild(this._inkBarContentElement),this._appendInkBarElement()}_appendInkBarElement(){this._inkBarElement;let t=this._fitToContent?this._elementRef.nativeElement.querySelector(".mdc-tab__content"):this._elementRef.nativeElement;t.appendChild(this._inkBarElement)}static \u0275fac=function(e){return new(e||n)};static \u0275dir=I({type:n,inputs:{fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",_]}})}return n})();var ae=(()=>{class n extends De{elementRef=o(R);disabled=!1;focus(){this.elementRef.nativeElement.focus()}getOffsetLeft(){return this.elementRef.nativeElement.offsetLeft}getOffsetWidth(){return this.elementRef.nativeElement.offsetWidth}static \u0275fac=(()=>{let t;return function(a){return(t||(t=N(n)))(a||n)}})();static \u0275dir=I({type:n,selectors:[["","matTabLabelWrapper",""]],hostVars:3,hostBindings:function(e,a){e&2&&(k("aria-disabled",!!a.disabled),v("mat-mdc-tab-disabled",a.disabled))},inputs:{disabled:[2,"disabled","disabled",_]},features:[L]})}return n})(),Xt={passive:!0},Re=650,Pe=100,Me=(()=>{class n{_elementRef=o(R);_changeDetectorRef=o(q);_viewportRuler=o(Zt);_dir=o(lt,{optional:!0});_ngZone=o(Q);_platform=o(st);_sharedResizeObserver=o(Ut);_injector=o(Y);_renderer=o(J);_animationsDisabled=Z();_eventCleanups;_scrollDistance=0;_selectedIndexChanged=!1;_destroyed=new F;_showPaginationControls=!1;_disableScrollAfter=!0;_disableScrollBefore=!0;_tabLabelCount;_scrollDistanceChanged;_keyManager;_currentTextContent;_stopScrolling=new F;disablePagination=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(t){let e=isNaN(t)?0:t;this._selectedIndex!=e&&(this._selectedIndexChanged=!0,this._selectedIndex=e,this._keyManager&&this._keyManager.updateActiveItem(e))}_selectedIndex=0;selectFocusedIndex=new u;indexFocused=new u;constructor(){this._eventCleanups=this._ngZone.runOutsideAngular(()=>[this._renderer.listen(this._elementRef.nativeElement,"mouseleave",()=>this._stopInterval())])}ngAfterViewInit(){this._eventCleanups.push(this._renderer.listen(this._previousPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("before"),Xt),this._renderer.listen(this._nextPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("after"),Xt))}ngAfterContentInit(){let t=this._dir?this._dir.change:yt("ltr"),e=this._sharedResizeObserver.observe(this._elementRef.nativeElement).pipe(Ct(32),M(this._destroyed)),a=this._viewportRuler.change(150).pipe(M(this._destroyed)),i=()=>{this.updatePagination(),this._alignInkBarToSelectedTab()};this._keyManager=new Wt(this._items).withHorizontalOrientation(this._getLayoutDirection()).withHomeAndEnd().withWrap().skipPredicate(()=>!1),this._keyManager.updateActiveItem(Math.max(this._selectedIndex,0)),z(i,{injector:this._injector}),H(t,a,e,this._items.changes,this._itemsResized()).pipe(M(this._destroyed)).subscribe(()=>{this._ngZone.run(()=>{Promise.resolve().then(()=>{this._scrollDistance=Math.max(0,Math.min(this._getMaxScrollDistance(),this._scrollDistance)),i()})}),this._keyManager?.withHorizontalOrientation(this._getLayoutDirection())}),this._keyManager.change.subscribe(r=>{this.indexFocused.emit(r),this._setTabFocus(r)})}_itemsResized(){return typeof ResizeObserver!="function"?vt:this._items.changes.pipe(V(this._items),wt(t=>new gt(e=>this._ngZone.runOutsideAngular(()=>{let a=new ResizeObserver(i=>e.next(i));return t.forEach(i=>a.observe(i.elementRef.nativeElement)),()=>{a.disconnect()}}))),xt(1),Tt(t=>t.some(e=>e.contentRect.width>0&&e.contentRect.height>0)))}ngAfterContentChecked(){this._tabLabelCount!=this._items.length&&(this.updatePagination(),this._tabLabelCount=this._items.length,this._changeDetectorRef.markForCheck()),this._selectedIndexChanged&&(this._scrollToLabel(this._selectedIndex),this._checkScrollingControls(),this._alignInkBarToSelectedTab(),this._selectedIndexChanged=!1,this._changeDetectorRef.markForCheck()),this._scrollDistanceChanged&&(this._updateTabScrollPosition(),this._scrollDistanceChanged=!1,this._changeDetectorRef.markForCheck())}ngOnDestroy(){this._eventCleanups.forEach(t=>t()),this._keyManager?.destroy(),this._destroyed.next(),this._destroyed.complete(),this._stopScrolling.complete()}_handleKeydown(t){if(!jt(t))switch(t.keyCode){case 13:case 32:if(this.focusIndex!==this.selectedIndex){let e=this._items.get(this.focusIndex);e&&!e.disabled&&(this.selectFocusedIndex.emit(this.focusIndex),this._itemSelected(t))}break;default:this._keyManager?.onKeydown(t)}}_onContentChanges(){let t=this._elementRef.nativeElement.textContent;t!==this._currentTextContent&&(this._currentTextContent=t||"",this._ngZone.run(()=>{this.updatePagination(),this._alignInkBarToSelectedTab(),this._changeDetectorRef.markForCheck()}))}updatePagination(){this._checkPaginationEnabled(),this._checkScrollingControls(),this._updateTabScrollPosition()}get focusIndex(){return this._keyManager?this._keyManager.activeItemIndex:0}set focusIndex(t){!this._isValidIndex(t)||this.focusIndex===t||!this._keyManager||this._keyManager.setActiveItem(t)}_isValidIndex(t){return this._items?!!this._items.toArray()[t]:!0}_setTabFocus(t){if(this._showPaginationControls&&this._scrollToLabel(t),this._items&&this._items.length){this._items.toArray()[t].focus();let e=this._tabListContainer.nativeElement;this._getLayoutDirection()=="ltr"?e.scrollLeft=0:e.scrollLeft=e.scrollWidth-e.offsetWidth}}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_updateTabScrollPosition(){if(this.disablePagination)return;let t=this.scrollDistance,e=this._getLayoutDirection()==="ltr"?-t:t;this._tabList.nativeElement.style.transform=`translateX(${Math.round(e)}px)`,(this._platform.TRIDENT||this._platform.EDGE)&&(this._tabListContainer.nativeElement.scrollLeft=0)}get scrollDistance(){return this._scrollDistance}set scrollDistance(t){this._scrollTo(t)}_scrollHeader(t){let e=this._tabListContainer.nativeElement.offsetWidth,a=(t=="before"?-1:1)*e/3;return this._scrollTo(this._scrollDistance+a)}_handlePaginatorClick(t){this._stopInterval(),this._scrollHeader(t)}_scrollToLabel(t){if(this.disablePagination)return;let e=this._items?this._items.toArray()[t]:null;if(!e)return;let a=this._tabListContainer.nativeElement.offsetWidth,{offsetLeft:i,offsetWidth:r}=e.elementRef.nativeElement,s,x;this._getLayoutDirection()=="ltr"?(s=i,x=s+r):(x=this._tabListInner.nativeElement.offsetWidth-i,s=x-r);let U=this.scrollDistance,ft=this.scrollDistance+a;s<U?this.scrollDistance-=U-s:x>ft&&(this.scrollDistance+=Math.min(x-ft,s-U))}_checkPaginationEnabled(){if(this.disablePagination)this._showPaginationControls=!1;else{let t=this._tabListInner.nativeElement.scrollWidth,e=this._elementRef.nativeElement.offsetWidth,a=t-e>=5;a||(this.scrollDistance=0),a!==this._showPaginationControls&&(this._showPaginationControls=a,this._changeDetectorRef.markForCheck())}}_checkScrollingControls(){this.disablePagination?this._disableScrollAfter=this._disableScrollBefore=!0:(this._disableScrollBefore=this.scrollDistance==0,this._disableScrollAfter=this.scrollDistance==this._getMaxScrollDistance(),this._changeDetectorRef.markForCheck())}_getMaxScrollDistance(){let t=this._tabListInner.nativeElement.scrollWidth,e=this._tabListContainer.nativeElement.offsetWidth;return t-e||0}_alignInkBarToSelectedTab(){let t=this._items&&this._items.length?this._items.toArray()[this.selectedIndex]:null,e=t?t.elementRef.nativeElement:null;e?this._inkBar.alignToElement(e):this._inkBar.hide()}_stopInterval(){this._stopScrolling.next()}_handlePaginatorPress(t,e){e&&e.button!=null&&e.button!==0||(this._stopInterval(),kt(Re,Pe).pipe(M(H(this._stopScrolling,this._destroyed))).subscribe(()=>{let{maxScrollDistance:a,distance:i}=this._scrollHeader(t);(i===0||i>=a)&&this._stopInterval()}))}_scrollTo(t){if(this.disablePagination)return{maxScrollDistance:0,distance:0};let e=this._getMaxScrollDistance();return this._scrollDistance=Math.max(0,Math.min(e,t)),this._scrollDistanceChanged=!0,this._checkScrollingControls(),{maxScrollDistance:e,distance:this._scrollDistance}}static \u0275fac=function(e){return new(e||n)};static \u0275dir=I({type:n,inputs:{disablePagination:[2,"disablePagination","disablePagination",_],selectedIndex:[2,"selectedIndex","selectedIndex",K]},outputs:{selectFocusedIndex:"selectFocusedIndex",indexFocused:"indexFocused"}})}return n})(),Be=(()=>{class n extends Me{_items;_tabListContainer;_tabList;_tabListInner;_nextPaginator;_previousPaginator;_inkBar;ariaLabel;ariaLabelledby;disableRipple=!1;ngAfterContentInit(){this._inkBar=new ht(this._items),super.ngAfterContentInit()}_itemSelected(t){t.preventDefault()}static \u0275fac=(()=>{let t;return function(a){return(t||(t=N(n)))(a||n)}})();static \u0275cmp=B({type:n,selectors:[["mat-tab-header"]],contentQueries:function(e,a,i){if(e&1&&S(i,ae,4),e&2){let r;m(r=b())&&(a._items=r)}},viewQuery:function(e,a){if(e&1&&(p(se,7),p(le,7),p(de,7),p(ce,5),p(me,5)),e&2){let i;m(i=b())&&(a._tabListContainer=i.first),m(i=b())&&(a._tabList=i.first),m(i=b())&&(a._tabListInner=i.first),m(i=b())&&(a._nextPaginator=i.first),m(i=b())&&(a._previousPaginator=i.first)}},hostAttrs:[1,"mat-mdc-tab-header"],hostVars:4,hostBindings:function(e,a){e&2&&v("mat-mdc-tab-header-pagination-controls-enabled",a._showPaginationControls)("mat-mdc-tab-header-rtl",a._getLayoutDirection()=="rtl")},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],disableRipple:[2,"disableRipple","disableRipple",_]},features:[L],ngContentSelectors:ut,decls:13,vars:10,consts:[["previousPaginator",""],["tabListContainer",""],["tabList",""],["tabListInner",""],["nextPaginator",""],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-before",3,"click","mousedown","touchend","matRippleDisabled"],[1,"mat-mdc-tab-header-pagination-chevron"],[1,"mat-mdc-tab-label-container",3,"keydown"],["role","tablist",1,"mat-mdc-tab-list",3,"cdkObserveContent"],[1,"mat-mdc-tab-labels"],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-after",3,"mousedown","click","touchend","matRippleDisabled"]],template:function(e,a){if(e&1){let i=E();W(),h(0,"div",5,0),C("click",function(){return d(i),c(a._handlePaginatorClick("before"))})("mousedown",function(s){return d(i),c(a._handlePaginatorPress("before",s))})("touchend",function(){return d(i),c(a._stopInterval())}),j(2,"div",6),y(),h(3,"div",7,1),C("keydown",function(s){return d(i),c(a._handleKeydown(s))}),h(5,"div",8,2),C("cdkObserveContent",function(){return d(i),c(a._onContentChanges())}),h(7,"div",9,3),G(9),y()()(),h(10,"div",10,4),C("mousedown",function(s){return d(i),c(a._handlePaginatorPress("after",s))})("click",function(){return d(i),c(a._handlePaginatorClick("after"))})("touchend",function(){return d(i),c(a._stopInterval())}),j(12,"div",6),y()}e&2&&(v("mat-mdc-tab-header-pagination-disabled",a._disableScrollBefore),T("matRippleDisabled",a._disableScrollBefore||a.disableRipple),f(3),v("_mat-animation-noopable",a._animationsDisabled),f(2),k("aria-label",a.ariaLabel||null)("aria-labelledby",a.ariaLabelledby||null),f(5),v("mat-mdc-tab-header-pagination-disabled",a._disableScrollAfter),T("matRippleDisabled",a._disableScrollAfter||a.disableRipple))},dependencies:[ct,Qt],styles:[`.mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mdc-tab-indicator .mdc-tab-indicator__content{transition-duration:var(--mat-tab-animation-duration, 250ms)}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;outline:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-pagination-icon-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1;border-bottom-style:solid;border-bottom-width:var(--mat-tab-divider-height, 1px);border-bottom-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-group-inverted-header .mat-mdc-tab-label-container{border-bottom:none;border-top-style:solid;border-top-width:var(--mat-tab-divider-height, 1px);border-top-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.cdk-drop-list .mat-mdc-tab-labels,.mat-mdc-tab-labels.cdk-drop-list{min-height:var(--mat-tab-container-height, 48px)}.mat-mdc-tab::before{margin:5px}@media(forced-colors: active){.mat-mdc-tab[aria-disabled=true]{color:GrayText}}
2
2
  `],encapsulation:2})}return n})(),Le=new D("MAT_TABS_CONFIG"),Jt=(()=>{class n extends mt{_host=o(pt);_centeringSub=w.EMPTY;_leavingSub=w.EMPTY;constructor(){super()}ngOnInit(){super.ngOnInit(),this._centeringSub=this._host._beforeCentering.pipe(V(this._host._isCenterPosition())).subscribe(t=>{this._host._content&&t&&!this.hasAttached()&&this.attach(this._host._content)}),this._leavingSub=this._host._afterLeavingCenter.subscribe(()=>{this._host.preserveContent||this.detach()})}ngOnDestroy(){super.ngOnDestroy(),this._centeringSub.unsubscribe(),this._leavingSub.unsubscribe()}static \u0275fac=function(e){return new(e||n)};static \u0275dir=I({type:n,selectors:[["","matTabBodyHost",""]],features:[L]})}return n})(),pt=(()=>{class n{_elementRef=o(R);_dir=o(lt,{optional:!0});_ngZone=o(Q);_injector=o(Y);_renderer=o(J);_diAnimationsDisabled=Z();_eventCleanups;_initialized;_fallbackTimer;_positionIndex;_dirChangeSubscription=w.EMPTY;_position;_previousPosition;_onCentering=new u;_beforeCentering=new u;_afterLeavingCenter=new u;_onCentered=new u(!0);_portalHost;_contentElement;_content;animationDuration="500ms";preserveContent=!1;set position(t){this._positionIndex=t,this._computePositionAnimationState()}constructor(){if(this._dir){let t=o(q);this._dirChangeSubscription=this._dir.change.subscribe(e=>{this._computePositionAnimationState(e),t.markForCheck()})}}ngOnInit(){this._bindTransitionEvents(),this._position==="center"&&(this._setActiveClass(!0),z(()=>this._onCentering.emit(this._elementRef.nativeElement.clientHeight),{injector:this._injector})),this._initialized=!0}ngOnDestroy(){clearTimeout(this._fallbackTimer),this._eventCleanups?.forEach(t=>t()),this._dirChangeSubscription.unsubscribe()}_bindTransitionEvents(){this._ngZone.runOutsideAngular(()=>{let t=this._elementRef.nativeElement,e=a=>{a.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.remove("mat-tab-body-animating"),a.type==="transitionend"&&this._transitionDone())};this._eventCleanups=[this._renderer.listen(t,"transitionstart",a=>{a.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.add("mat-tab-body-animating"),this._transitionStarted())}),this._renderer.listen(t,"transitionend",e),this._renderer.listen(t,"transitioncancel",e)]})}_transitionStarted(){clearTimeout(this._fallbackTimer);let t=this._position==="center";this._beforeCentering.emit(t),t&&this._onCentering.emit(this._elementRef.nativeElement.clientHeight)}_transitionDone(){this._position==="center"?this._onCentered.emit():this._previousPosition==="center"&&this._afterLeavingCenter.emit()}_setActiveClass(t){this._elementRef.nativeElement.classList.toggle("mat-mdc-tab-body-active",t)}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_isCenterPosition(){return this._positionIndex===0}_computePositionAnimationState(t=this._getLayoutDirection()){this._previousPosition=this._position,this._positionIndex<0?this._position=t=="ltr"?"left":"right":this._positionIndex>0?this._position=t=="ltr"?"right":"left":this._position="center",this._animationsDisabled()?this._simulateTransitionEvents():this._initialized&&(this._position==="center"||this._previousPosition==="center")&&(clearTimeout(this._fallbackTimer),this._fallbackTimer=this._ngZone.runOutsideAngular(()=>setTimeout(()=>this._simulateTransitionEvents(),100)))}_simulateTransitionEvents(){this._transitionStarted(),z(()=>this._transitionDone(),{injector:this._injector})}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration==="0ms"||this.animationDuration==="0s"}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=B({type:n,selectors:[["mat-tab-body"]],viewQuery:function(e,a){if(e&1&&(p(Jt,5),p(be,5)),e&2){let i;m(i=b())&&(a._portalHost=i.first),m(i=b())&&(a._contentElement=i.first)}},hostAttrs:[1,"mat-mdc-tab-body"],hostVars:1,hostBindings:function(e,a){e&2&&k("inert",a._position==="center"?null:"")},inputs:{_content:[0,"content","_content"],animationDuration:"animationDuration",preserveContent:"preserveContent",position:"position"},outputs:{_onCentering:"_onCentering",_beforeCentering:"_beforeCentering",_onCentered:"_onCentered"},decls:3,vars:6,consts:[["content",""],["cdkScrollable","",1,"mat-mdc-tab-body-content"],["matTabBodyHost",""]],template:function(e,a){e&1&&(h(0,"div",1,0),tt(2,he,0,0,"ng-template",2),y()),e&2&&v("mat-tab-body-content-left",a._position==="left")("mat-tab-body-content-right",a._position==="right")("mat-tab-body-content-can-animate",a._position==="center"||a._previousPosition==="center")},dependencies:[Jt,Kt],styles:[`.mat-mdc-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-mdc-tab-body.mat-mdc-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-mdc-tab-group.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body.mat-mdc-tab-body-active{overflow-y:hidden}.mat-mdc-tab-body-content{height:100%;overflow:auto;transform:none;visibility:hidden}.mat-tab-body-animating>.mat-mdc-tab-body-content,.mat-mdc-tab-body-active>.mat-mdc-tab-body-content{visibility:visible}.mat-tab-body-animating>.mat-mdc-tab-body-content{min-height:1px}.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body-content{overflow:hidden}.mat-tab-body-content-can-animate{transition:transform var(--mat-tab-animation-duration) 1ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable .mat-tab-body-content-can-animate{transition:none}.mat-tab-body-content-left{transform:translate3d(-100%, 0, 0)}.mat-tab-body-content-right{transform:translate3d(100%, 0, 0)}
3
3
  `],encapsulation:2})}return n})(),ba=(()=>{class n{_elementRef=o(R);_changeDetectorRef=o(q);_ngZone=o(Q);_tabsSubscription=w.EMPTY;_tabLabelSubscription=w.EMPTY;_tabBodySubscription=w.EMPTY;_diAnimationsDisabled=Z();_allTabs;_tabBodies;_tabBodyWrapper;_tabHeader;_tabs=new Pt;_indexToSelect=0;_lastFocusedTabIndex=null;_tabBodyWrapperHeight=0;color;get fitInkBarToContent(){return this._fitInkBarToContent}set fitInkBarToContent(t){this._fitInkBarToContent=t,this._changeDetectorRef.markForCheck()}_fitInkBarToContent=!1;stretchTabs=!0;alignTabs=null;dynamicHeight=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(t){this._indexToSelect=isNaN(t)?null:t}_selectedIndex=null;headerPosition="above";get animationDuration(){return this._animationDuration}set animationDuration(t){let e=t+"";this._animationDuration=/^\d+$/.test(e)?t+"ms":e}_animationDuration;get contentTabIndex(){return this._contentTabIndex}set contentTabIndex(t){this._contentTabIndex=isNaN(t)?null:t}_contentTabIndex;disablePagination=!1;disableRipple=!1;preserveContent=!1;get backgroundColor(){return this._backgroundColor}set backgroundColor(t){let e=this._elementRef.nativeElement.classList;e.remove("mat-tabs-with-background",`mat-background-${this.backgroundColor}`),t&&e.add("mat-tabs-with-background",`mat-background-${t}`),this._backgroundColor=t}_backgroundColor;ariaLabel;ariaLabelledby;selectedIndexChange=new u;focusChange=new u;animationDone=new u;selectedTabChange=new u(!0);_groupId;_isServer=!o(st).isBrowser;constructor(){let t=o(Le,{optional:!0});this._groupId=o(zt).getId("mat-tab-group-"),this.animationDuration=t&&t.animationDuration?t.animationDuration:"500ms",this.disablePagination=t&&t.disablePagination!=null?t.disablePagination:!1,this.dynamicHeight=t&&t.dynamicHeight!=null?t.dynamicHeight:!1,t?.contentTabIndex!=null&&(this.contentTabIndex=t.contentTabIndex),this.preserveContent=!!t?.preserveContent,this.fitInkBarToContent=t&&t.fitInkBarToContent!=null?t.fitInkBarToContent:!1,this.stretchTabs=t&&t.stretchTabs!=null?t.stretchTabs:!0,this.alignTabs=t&&t.alignTabs!=null?t.alignTabs:null}ngAfterContentChecked(){let t=this._indexToSelect=this._clampTabIndex(this._indexToSelect);if(this._selectedIndex!=t){let e=this._selectedIndex==null;if(!e){this.selectedTabChange.emit(this._createChangeEvent(t));let a=this._tabBodyWrapper.nativeElement;a.style.minHeight=a.clientHeight+"px"}Promise.resolve().then(()=>{this._tabs.forEach((a,i)=>a.isActive=i===t),e||(this.selectedIndexChange.emit(t),this._tabBodyWrapper.nativeElement.style.minHeight="")})}this._tabs.forEach((e,a)=>{e.position=a-t,this._selectedIndex!=null&&e.position==0&&!e.origin&&(e.origin=t-this._selectedIndex)}),this._selectedIndex!==t&&(this._selectedIndex=t,this._lastFocusedTabIndex=null,this._changeDetectorRef.markForCheck())}ngAfterContentInit(){this._subscribeToAllTabChanges(),this._subscribeToTabLabels(),this._tabsSubscription=this._tabs.changes.subscribe(()=>{let t=this._clampTabIndex(this._indexToSelect);if(t===this._selectedIndex){let e=this._tabs.toArray(),a;for(let i=0;i<e.length;i++)if(e[i].isActive){this._indexToSelect=this._selectedIndex=i,this._lastFocusedTabIndex=null,a=e[i];break}!a&&e[t]&&Promise.resolve().then(()=>{e[t].isActive=!0,this.selectedTabChange.emit(this._createChangeEvent(t))})}this._changeDetectorRef.markForCheck()})}ngAfterViewInit(){this._tabBodySubscription=this._tabBodies.changes.subscribe(()=>this._bodyCentered(!0))}_subscribeToAllTabChanges(){this._allTabs.changes.pipe(V(this._allTabs)).subscribe(t=>{this._tabs.reset(t.filter(e=>e._closestTabGroup===this||!e._closestTabGroup)),this._tabs.notifyOnChanges()})}ngOnDestroy(){this._tabs.destroy(),this._tabsSubscription.unsubscribe(),this._tabLabelSubscription.unsubscribe(),this._tabBodySubscription.unsubscribe()}realignInkBar(){this._tabHeader&&this._tabHeader._alignInkBarToSelectedTab()}updatePagination(){this._tabHeader&&this._tabHeader.updatePagination()}focusTab(t){let e=this._tabHeader;e&&(e.focusIndex=t)}_focusChanged(t){this._lastFocusedTabIndex=t,this.focusChange.emit(this._createChangeEvent(t))}_createChangeEvent(t){let e=new _t;return e.index=t,this._tabs&&this._tabs.length&&(e.tab=this._tabs.toArray()[t]),e}_subscribeToTabLabels(){this._tabLabelSubscription&&this._tabLabelSubscription.unsubscribe(),this._tabLabelSubscription=H(...this._tabs.map(t=>t._stateChanges)).subscribe(()=>this._changeDetectorRef.markForCheck())}_clampTabIndex(t){return Math.min(this._tabs.length-1,Math.max(t||0,0))}_getTabLabelId(t,e){return t.id||`${this._groupId}-label-${e}`}_getTabContentId(t){return`${this._groupId}-content-${t}`}_setTabBodyWrapperHeight(t){if(!this.dynamicHeight||!this._tabBodyWrapperHeight){this._tabBodyWrapperHeight=t;return}let e=this._tabBodyWrapper.nativeElement;e.style.height=this._tabBodyWrapperHeight+"px",this._tabBodyWrapper.nativeElement.offsetHeight&&(e.style.height=t+"px")}_removeTabBodyWrapperHeight(){let t=this._tabBodyWrapper.nativeElement;this._tabBodyWrapperHeight=t.clientHeight,t.style.height="",this._ngZone.run(()=>this.animationDone.emit())}_handleClick(t,e,a){e.focusIndex=a,t.disabled||(this.selectedIndex=a)}_getTabIndex(t){let e=this._lastFocusedTabIndex??this.selectedIndex;return t===e?0:-1}_tabFocusChanged(t,e){t&&t!=="mouse"&&t!=="touch"&&(this._tabHeader.focusIndex=e)}_bodyCentered(t){t&&this._tabBodies?.forEach((e,a)=>e._setActiveClass(a===this._selectedIndex))}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration==="0"||this.animationDuration==="0ms"}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=B({type:n,selectors:[["mat-tab-group"]],contentQueries:function(e,a,i){if(e&1&&S(i,Ie,5),e&2){let r;m(r=b())&&(a._allTabs=r)}},viewQuery:function(e,a){if(e&1&&(p(pe,5),p(_e,5),p(pt,5)),e&2){let i;m(i=b())&&(a._tabBodyWrapper=i.first),m(i=b())&&(a._tabHeader=i.first),m(i=b())&&(a._tabBodies=i)}},hostAttrs:[1,"mat-mdc-tab-group"],hostVars:11,hostBindings:function(e,a){e&2&&(k("mat-align-tabs",a.alignTabs),$("mat-"+(a.color||"primary")),Et("--mat-tab-animation-duration",a.animationDuration),v("mat-mdc-tab-group-dynamic-height",a.dynamicHeight)("mat-mdc-tab-group-inverted-header",a.headerPosition==="below")("mat-mdc-tab-group-stretch-tabs",a.stretchTabs))},inputs:{color:"color",fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",_],stretchTabs:[2,"mat-stretch-tabs","stretchTabs",_],alignTabs:[0,"mat-align-tabs","alignTabs"],dynamicHeight:[2,"dynamicHeight","dynamicHeight",_],selectedIndex:[2,"selectedIndex","selectedIndex",K],headerPosition:"headerPosition",animationDuration:"animationDuration",contentTabIndex:[2,"contentTabIndex","contentTabIndex",K],disablePagination:[2,"disablePagination","disablePagination",_],disableRipple:[2,"disableRipple","disableRipple",_],preserveContent:[2,"preserveContent","preserveContent",_],backgroundColor:"backgroundColor",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"]},outputs:{selectedIndexChange:"selectedIndexChange",focusChange:"focusChange",animationDone:"animationDone",selectedTabChange:"selectedTabChange"},exportAs:["matTabGroup"],features:[A([{provide:ee,useExisting:n}])],ngContentSelectors:ut,decls:9,vars:8,consts:[["tabHeader",""],["tabBodyWrapper",""],["tabNode",""],[3,"indexFocused","selectFocusedIndex","selectedIndex","disableRipple","disablePagination","aria-label","aria-labelledby"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"id","mdc-tab--active","class","disabled","fitInkBarToContent"],[1,"mat-mdc-tab-body-wrapper"],["role","tabpanel",3,"id","class","content","position","animationDuration","preserveContent"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"click","cdkFocusChange","id","disabled","fitInkBarToContent"],[1,"mdc-tab__ripple"],["mat-ripple","",1,"mat-mdc-tab-ripple",3,"matRippleTrigger","matRippleDisabled"],[1,"mdc-tab__content"],[1,"mdc-tab__text-label"],[3,"cdkPortalOutlet"],["role","tabpanel",3,"_onCentered","_onCentering","_beforeCentering","id","content","position","animationDuration","preserveContent"]],template:function(e,a){if(e&1){let i=E();W(),h(0,"mat-tab-header",3,0),C("indexFocused",function(s){return d(i),c(a._focusChanged(s))})("selectFocusedIndex",function(s){return d(i),c(a.selectedIndex=s)}),nt(2,ve,8,17,"div",4,it),y(),et(4,ye,1,0),h(5,"div",5,1),nt(7,ke,1,10,"mat-tab-body",6,it),y()}e&2&&(T("selectedIndex",a.selectedIndex||0)("disableRipple",a.disableRipple)("disablePagination",a.disablePagination)("aria-label",a.ariaLabel)("aria-labelledby",a.ariaLabelledby),f(2),rt(a._tabs),f(2),at(a._isServer?4:-1),f(),v("_mat-animation-noopable",a._animationsDisabled()),f(2),rt(a._tabs))},dependencies:[Be,ae,Nt,ct,mt,pt],styles:[`.mdc-tab{min-width:90px;padding:0 24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;z-index:1;touch-action:manipulation}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab--active .mdc-tab__text-label{transition-delay:100ms}._mat-animation-noopable .mdc-tab__text-label{transition:none}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transition:var(--mat-tab-animation-duration, 250ms) transform cubic-bezier(0.4, 0, 0.2, 1);transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}._mat-animation-noopable .mdc-tab-indicator__content,.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mat-mdc-tab-ripple.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;height:var(--mat-tab-container-height, 48px);font-family:var(--mat-tab-label-text-font, var(--mat-sys-title-small-font));font-size:var(--mat-tab-label-text-size, var(--mat-sys-title-small-size));letter-spacing:var(--mat-tab-label-text-tracking, var(--mat-sys-title-small-tracking));line-height:var(--mat-tab-label-text-line-height, var(--mat-sys-title-small-line-height));font-weight:var(--mat-tab-label-text-weight, var(--mat-sys-title-small-weight))}.mat-mdc-tab.mdc-tab{flex-grow:0}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-tab-active-indicator-height, 2px);border-radius:var(--mat-tab-active-indicator-shape, 0)}.mat-mdc-tab:hover .mdc-tab__text-label{color:var(--mat-tab-inactive-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab:focus .mdc-tab__text-label{color:var(--mat-tab-inactive-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-active-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-active-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-active-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-hover-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-active-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-focus-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-disabled-ripple-color, var(--mat-sys-on-surface-variant))}.mat-mdc-tab .mdc-tab__ripple::before{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-inactive-label-text-color, var(--mat-sys-on-surface));display:inline-flex;align-items:center}.mat-mdc-tab .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-group.mat-mdc-tab-group-stretch-tabs>.mat-mdc-tab-header .mat-mdc-tab{flex-grow:1}.mat-mdc-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-background-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-focus-indicator::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-focus-indicator::before{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mdc-tab__ripple::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header{flex-direction:column-reverse}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header .mdc-tab-indicator__content--underline{align-self:flex-start}.mat-mdc-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important}
4
4
  `],encapsulation:2})}return n})(),_t=class{index;tab};var ha=(()=>{class n{static \u0275fac=function(e){return new(e||n)};static \u0275mod=Bt({type:n});static \u0275inj=Dt({imports:[dt,dt]})}return n})();var va=(()=>{class n{_TRACKED_PLUGINS=[{id:"derived-data",versionRequirement:null},{id:"signalk-autostate",versionRequirement:null},{id:"signalk-polar-performance-plugin",versionRequirement:null},{id:"autopilot",versionRequirement:null}];_connectionSvc=o(Ht);_API_URL=X(null);_connection=Vt(this._connectionSvc.getServiceEndpointStatusAsO());_pluginInformation=Ft({loader:e=>P(this,[e],function*({abortSignal:t}){let a=this._API_URL();if(!a)return console.error("API URL not set yet."),[];try{let i=yield fetch(a,{signal:t});return i.ok?yield i.json():(console.error("[SkPlugin Service] Error fetching plugin information:",i.statusText),[])}catch(i){return console.error("[SkPlugin Service] Error fetching plugin information:",i),[]}})});constructor(){this._API_URL.set(`${this._connectionSvc.signalKURL.url}/signalk/v2/features?enabled=enabled`)}getPluginInformation(){return P(this,null,function*(){for(this._pluginInformation.reload();this._pluginInformation.isLoading();)yield new Promise(t=>setTimeout(t,100));return this._pluginInformation.value()?.plugins||[]})}isInstalled(t){return P(this,null,function*(){let e=yield this.getPluginInformation();return!e||e.length===0?!1:e.some(a=>a.id===t)})}isEnabled(t){return P(this,null,function*(){let e=yield this.getPluginInformation();return!e||e.length===0?!1:e.some(a=>a.id===t&&a.enabled)})}static \u0275fac=function(e){return new(e||n)};static \u0275prov=It({token:n,factory:n.\u0275fac,providedIn:"root"})}return n})();export{va as a,we as b,Ie as c,ba as d,ha as e};
@@ -0,0 +1,2 @@
1
+ import{i as ve,p as ge}from"./chunk-SQZ5Y2UZ.js";import{a as de,i as ne,k as ce,p as se,q as pe}from"./chunk-BOUFMQO7.js";import{$b as w,$d as ue,Aa as x,Ae as be,Ce as _e,Da as H,E as U,Fb as M,Gb as Y,Hb as X,J as L,Mc as re,Qa as R,Rb as T,Yb as k,Zb as p,Zd as le,_b as v,_c as oe,ea as $,ed as O,gc as ee,ic as y,id as b,jd as G,je as z,ka as B,lb as f,lc as te,mc as ie,na as V,nc as ae,oa as N,oc as A,p as F,pa as Q,pb as K,pc as D,qc as S,ra as C,re as j,s as q,ta as c,ue as me,wb as Z,wc as E,xb as J,yb as W,za as P,ze as he}from"./chunk-W2S6R4AZ.js";var Se=["input"],Ie=["formField"],Ce=["*"],I=class{source;value;constructor(ye,e){this.source=ye,this.value=e}},Pe={provide:pe,useExisting:V(()=>Me),multi:!0},fe=new C("MatRadioGroup"),xe=new C("mat-radio-default-options",{providedIn:"root",factory:Re});function Re(){return{color:"accent",disabledInteractive:!1}}var Me=(()=>{class d{_changeDetector=c(O);_value=null;_name=c(z).getId("mat-radio-group-");_selected=null;_isInitialized=!1;_labelPosition="after";_disabled=!1;_required=!1;_buttonChanges;_controlValueAccessorChangeFn=()=>{};onTouched=()=>{};change=new M;_radios;color;get name(){return this._name}set name(e){this._name=e,this._updateRadioButtonNames()}get labelPosition(){return this._labelPosition}set labelPosition(e){this._labelPosition=e==="before"?"before":"after",this._markRadiosForCheck()}get value(){return this._value}set value(e){this._value!==e&&(this._value=e,this._updateSelectedRadioFromValue(),this._checkSelectedRadioButton())}_checkSelectedRadioButton(){this._selected&&!this._selected.checked&&(this._selected.checked=!0)}get selected(){return this._selected}set selected(e){this._selected=e,this.value=e?e.value:null,this._checkSelectedRadioButton()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this._markRadiosForCheck()}get required(){return this._required}set required(e){this._required=e,this._markRadiosForCheck()}get disabledInteractive(){return this._disabledInteractive}set disabledInteractive(e){this._disabledInteractive=e,this._markRadiosForCheck()}_disabledInteractive=!1;constructor(){}ngAfterContentInit(){this._isInitialized=!0,this._buttonChanges=this._radios.changes.subscribe(()=>{this.selected&&!this._radios.find(e=>e===this.selected)&&(this._selected=null)})}ngOnDestroy(){this._buttonChanges?.unsubscribe()}_touch(){this.onTouched&&this.onTouched()}_updateRadioButtonNames(){this._radios&&this._radios.forEach(e=>{e.name=this.name,e._markForCheck()})}_updateSelectedRadioFromValue(){let e=this._selected!==null&&this._selected.value===this._value;this._radios&&!e&&(this._selected=null,this._radios.forEach(i=>{i.checked=this.value===i.value,i.checked&&(this._selected=i)}))}_emitChangeEvent(){this._isInitialized&&this.change.emit(new I(this._selected,this._value))}_markRadiosForCheck(){this._radios&&this._radios.forEach(e=>e._markForCheck())}writeValue(e){this.value=e,this._changeDetector.markForCheck()}registerOnChange(e){this._controlValueAccessorChangeFn=e}registerOnTouched(e){this.onTouched=e}setDisabledState(e){this.disabled=e,this._changeDetector.markForCheck()}static \u0275fac=function(i){return new(i||d)};static \u0275dir=W({type:d,selectors:[["mat-radio-group"]],contentQueries:function(i,t,a){if(i&1&&ae(a,ke,5),i&2){let o;D(o=S())&&(t._radios=o)}},hostAttrs:["role","radiogroup",1,"mat-mdc-radio-group"],inputs:{color:"color",name:"name",labelPosition:"labelPosition",value:"value",selected:"selected",disabled:[2,"disabled","disabled",b],required:[2,"required","required",b],disabledInteractive:[2,"disabledInteractive","disabledInteractive",b]},outputs:{change:"change"},exportAs:["matRadioGroup"],features:[re([Pe,{provide:fe,useExisting:d}])]})}return d})(),ke=(()=>{class d{_elementRef=c(R);_changeDetector=c(O);_focusMonitor=c(le);_radioDispatcher=c(ve);_defaultOptions=c(xe,{optional:!0});_ngZone=c(Y);_renderer=c(K);_uniqueId=c(z).getId("mat-radio-");_cleanupClick;id=this._uniqueId;name;ariaLabel;ariaLabelledby;ariaDescribedby;disableRipple=!1;tabIndex=0;get checked(){return this._checked}set checked(e){this._checked!==e&&(this._checked=e,e&&this.radioGroup&&this.radioGroup.value!==this.value?this.radioGroup.selected=this:!e&&this.radioGroup&&this.radioGroup.value===this.value&&(this.radioGroup.selected=null),e&&this._radioDispatcher.notify(this.id,this.name),this._changeDetector.markForCheck())}get value(){return this._value}set value(e){this._value!==e&&(this._value=e,this.radioGroup!==null&&(this.checked||(this.checked=this.radioGroup.value===e),this.checked&&(this.radioGroup.selected=this)))}get labelPosition(){return this._labelPosition||this.radioGroup&&this.radioGroup.labelPosition||"after"}set labelPosition(e){this._labelPosition=e}_labelPosition;get disabled(){return this._disabled||this.radioGroup!==null&&this.radioGroup.disabled}set disabled(e){this._setDisabled(e)}get required(){return this._required||this.radioGroup&&this.radioGroup.required}set required(e){e!==this._required&&this._changeDetector.markForCheck(),this._required=e}get color(){return this._color||this.radioGroup&&this.radioGroup.color||this._defaultOptions&&this._defaultOptions.color||"accent"}set color(e){this._color=e}_color;get disabledInteractive(){return this._disabledInteractive||this.radioGroup!==null&&this.radioGroup.disabledInteractive}set disabledInteractive(e){this._disabledInteractive=e}_disabledInteractive;change=new M;radioGroup;get inputId(){return`${this.id||this._uniqueId}-input`}_checked=!1;_disabled;_required;_value=null;_removeUniqueSelectionListener=()=>{};_previousTabIndex;_inputElement;_rippleTrigger;_noopAnimations=me();_injector=c(H);constructor(){c(ue).load(be);let e=c(fe,{optional:!0}),i=c(new oe("tabindex"),{optional:!0});this.radioGroup=e,this._disabledInteractive=this._defaultOptions?.disabledInteractive??!1,i&&(this.tabIndex=G(i,0))}focus(e,i){i?this._focusMonitor.focusVia(this._inputElement,i,e):this._inputElement.nativeElement.focus(e)}_markForCheck(){this._changeDetector.markForCheck()}ngOnInit(){this.radioGroup&&(this.checked=this.radioGroup.value===this._value,this.checked&&(this.radioGroup.selected=this),this.name=this.radioGroup.name),this._removeUniqueSelectionListener=this._radioDispatcher.listen((e,i)=>{e!==this.id&&i===this.name&&(this.checked=!1)})}ngDoCheck(){this._updateTabIndex()}ngAfterViewInit(){this._updateTabIndex(),this._focusMonitor.monitor(this._elementRef,!0).subscribe(e=>{!e&&this.radioGroup&&this.radioGroup._touch()}),this._ngZone.runOutsideAngular(()=>{this._cleanupClick=this._renderer.listen(this._inputElement.nativeElement,"click",this._onInputClick)})}ngOnDestroy(){this._cleanupClick?.(),this._focusMonitor.stopMonitoring(this._elementRef),this._removeUniqueSelectionListener()}_emitChangeEvent(){this.change.emit(new I(this,this._value))}_isRippleDisabled(){return this.disableRipple||this.disabled}_onInputInteraction(e){if(e.stopPropagation(),!this.checked&&!this.disabled){let i=this.radioGroup&&this.value!==this.radioGroup.value;this.checked=!0,this._emitChangeEvent(),this.radioGroup&&(this.radioGroup._controlValueAccessorChangeFn(this.value),i&&this.radioGroup._emitChangeEvent())}}_onTouchTargetClick(e){this._onInputInteraction(e),(!this.disabled||this.disabledInteractive)&&this._inputElement?.nativeElement.focus()}_setDisabled(e){this._disabled!==e&&(this._disabled=e,this._changeDetector.markForCheck())}_onInputClick=e=>{this.disabled&&this.disabledInteractive&&e.preventDefault()};_updateTabIndex(){let e=this.radioGroup,i;if(!e||!e.selected||this.disabled?i=this.tabIndex:i=e.selected===this?this.tabIndex:-1,i!==this._previousTabIndex){let t=this._inputElement?.nativeElement;t&&(t.setAttribute("tabindex",i+""),this._previousTabIndex=i,X(()=>{queueMicrotask(()=>{e&&e.selected&&e.selected!==this&&document.activeElement===t&&(e.selected?._inputElement.nativeElement.focus(),document.activeElement===t&&this._inputElement.nativeElement.blur())})},{injector:this._injector}))}}static \u0275fac=function(i){return new(i||d)};static \u0275cmp=Z({type:d,selectors:[["mat-radio-button"]],viewQuery:function(i,t){if(i&1&&(A(Se,5),A(Ie,7,R)),i&2){let a;D(a=S())&&(t._inputElement=a.first),D(a=S())&&(t._rippleTrigger=a.first)}},hostAttrs:[1,"mat-mdc-radio-button"],hostVars:19,hostBindings:function(i,t){i&1&&y("focus",function(){return t._inputElement.nativeElement.focus()}),i&2&&(T("id",t.id)("tabindex",null)("aria-label",null)("aria-labelledby",null)("aria-describedby",null),E("mat-primary",t.color==="primary")("mat-accent",t.color==="accent")("mat-warn",t.color==="warn")("mat-mdc-radio-checked",t.checked)("mat-mdc-radio-disabled",t.disabled)("mat-mdc-radio-disabled-interactive",t.disabledInteractive)("_mat-animation-noopable",t._noopAnimations))},inputs:{id:"id",name:"name",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],disableRipple:[2,"disableRipple","disableRipple",b],tabIndex:[2,"tabIndex","tabIndex",e=>e==null?0:G(e)],checked:[2,"checked","checked",b],value:"value",labelPosition:"labelPosition",disabled:[2,"disabled","disabled",b],required:[2,"required","required",b],color:"color",disabledInteractive:[2,"disabledInteractive","disabledInteractive",b]},outputs:{change:"change"},exportAs:["matRadioButton"],ngContentSelectors:Ce,decls:13,vars:17,consts:[["formField",""],["input",""],["mat-internal-form-field","",3,"labelPosition"],[1,"mdc-radio"],[1,"mat-mdc-radio-touch-target",3,"click"],["type","radio","aria-invalid","false",1,"mdc-radio__native-control",3,"change","id","checked","disabled","required"],[1,"mdc-radio__background"],[1,"mdc-radio__outer-circle"],[1,"mdc-radio__inner-circle"],["mat-ripple","",1,"mat-radio-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mat-ripple-element","mat-radio-persistent-ripple"],[1,"mdc-label",3,"for"]],template:function(i,t){if(i&1){let a=ee();te(),p(0,"div",2,0)(2,"div",3)(3,"div",4),y("click",function(n){return P(a),x(t._onTouchTargetClick(n))}),v(),p(4,"input",5,1),y("change",function(n){return P(a),x(t._onInputInteraction(n))}),v(),p(6,"div",6),w(7,"div",7)(8,"div",8),v(),p(9,"div",9),w(10,"div",10),v()(),p(11,"label",11),ie(12),v()()}i&2&&(k("labelPosition",t.labelPosition),f(2),E("mdc-radio--disabled",t.disabled),f(2),k("id",t.inputId)("checked",t.checked)("disabled",t.disabled&&!t.disabledInteractive)("required",t.required),T("name",t.name)("value",t.value)("aria-label",t.ariaLabel)("aria-labelledby",t.ariaLabelledby)("aria-describedby",t.ariaDescribedby)("aria-disabled",t.disabled&&t.disabledInteractive?"true":null),f(5),k("matRippleTrigger",t._rippleTrigger.nativeElement)("matRippleDisabled",t._isRippleDisabled())("matRippleCentered",!0),f(2),k("for",t.inputId))},dependencies:[he,ge],styles:[`.mat-mdc-radio-button{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-radio-button .mdc-radio{display:inline-block;position:relative;flex:0 0 auto;box-sizing:content-box;width:20px;height:20px;cursor:pointer;will-change:opacity,transform,border-color,color;padding:calc((var(--mat-radio-state-layer-size, 40px) - 20px)/2)}.mat-mdc-radio-button .mdc-radio:hover>.mdc-radio__native-control:not([disabled]):not(:focus)~.mdc-radio__background::before{opacity:.04;transform:scale(1)}.mat-mdc-radio-button .mdc-radio:hover>.mdc-radio__native-control:not([disabled])~.mdc-radio__background>.mdc-radio__outer-circle{border-color:var(--mat-radio-unselected-hover-icon-color, var(--mat-sys-on-surface))}.mat-mdc-radio-button .mdc-radio:hover>.mdc-radio__native-control:enabled:checked+.mdc-radio__background>.mdc-radio__outer-circle{border-color:var(--mat-radio-selected-hover-icon-color, var(--mat-sys-primary))}.mat-mdc-radio-button .mdc-radio:hover>.mdc-radio__native-control:enabled:checked+.mdc-radio__background>.mdc-radio__inner-circle{background-color:var(--mat-radio-selected-hover-icon-color, var(--mat-sys-primary, currentColor))}.mat-mdc-radio-button .mdc-radio:active>.mdc-radio__native-control:enabled:not(:checked)+.mdc-radio__background>.mdc-radio__outer-circle{border-color:var(--mat-radio-unselected-pressed-icon-color, var(--mat-sys-on-surface))}.mat-mdc-radio-button .mdc-radio:active>.mdc-radio__native-control:enabled:checked+.mdc-radio__background>.mdc-radio__outer-circle{border-color:var(--mat-radio-selected-pressed-icon-color, var(--mat-sys-primary))}.mat-mdc-radio-button .mdc-radio:active>.mdc-radio__native-control:enabled:checked+.mdc-radio__background>.mdc-radio__inner-circle{background-color:var(--mat-radio-selected-pressed-icon-color, var(--mat-sys-primary, currentColor))}.mat-mdc-radio-button .mdc-radio__background{display:inline-block;position:relative;box-sizing:border-box;width:20px;height:20px}.mat-mdc-radio-button .mdc-radio__background::before{position:absolute;transform:scale(0, 0);border-radius:50%;opacity:0;pointer-events:none;content:"";transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1);width:var(--mat-radio-state-layer-size, 40px);height:var(--mat-radio-state-layer-size, 40px);top:calc(-1*(var(--mat-radio-state-layer-size, 40px) - 20px)/2);left:calc(-1*(var(--mat-radio-state-layer-size, 40px) - 20px)/2)}.mat-mdc-radio-button .mdc-radio__outer-circle{position:absolute;top:0;left:0;box-sizing:border-box;width:100%;height:100%;border-width:2px;border-style:solid;border-radius:50%;transition:border-color 90ms cubic-bezier(0.4, 0, 0.6, 1)}.mat-mdc-radio-button .mdc-radio__inner-circle{position:absolute;top:0;left:0;box-sizing:border-box;width:100%;height:100%;transform:scale(0);border-radius:50%;transition:transform 90ms cubic-bezier(0.4, 0, 0.6, 1),background-color 90ms cubic-bezier(0.4, 0, 0.6, 1)}@media(forced-colors: active){.mat-mdc-radio-button .mdc-radio__inner-circle{background-color:CanvasText !important}}.mat-mdc-radio-button .mdc-radio__native-control{position:absolute;margin:0;padding:0;opacity:0;top:0;right:0;left:0;cursor:inherit;z-index:1;width:var(--mat-radio-state-layer-size, 40px);height:var(--mat-radio-state-layer-size, 40px)}.mat-mdc-radio-button .mdc-radio__native-control:checked+.mdc-radio__background,.mat-mdc-radio-button .mdc-radio__native-control:disabled+.mdc-radio__background{transition:opacity 90ms cubic-bezier(0, 0, 0.2, 1),transform 90ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-radio-button .mdc-radio__native-control:checked+.mdc-radio__background>.mdc-radio__outer-circle,.mat-mdc-radio-button .mdc-radio__native-control:disabled+.mdc-radio__background>.mdc-radio__outer-circle{transition:border-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-radio-button .mdc-radio__native-control:checked+.mdc-radio__background>.mdc-radio__inner-circle,.mat-mdc-radio-button .mdc-radio__native-control:disabled+.mdc-radio__background>.mdc-radio__inner-circle{transition:transform 90ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-radio-button .mdc-radio__native-control:focus+.mdc-radio__background::before{transform:scale(1);opacity:.12;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 1),transform 90ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-radio-button .mdc-radio__native-control:disabled:not(:checked)+.mdc-radio__background>.mdc-radio__outer-circle{border-color:var(--mat-radio-disabled-unselected-icon-color, var(--mat-sys-on-surface));opacity:var(--mat-radio-disabled-unselected-icon-opacity, 0.38)}.mat-mdc-radio-button .mdc-radio__native-control:disabled+.mdc-radio__background{cursor:default}.mat-mdc-radio-button .mdc-radio__native-control:disabled+.mdc-radio__background>.mdc-radio__outer-circle{border-color:var(--mat-radio-disabled-selected-icon-color, var(--mat-sys-on-surface));opacity:var(--mat-radio-disabled-selected-icon-opacity, 0.38)}.mat-mdc-radio-button .mdc-radio__native-control:disabled+.mdc-radio__background>.mdc-radio__inner-circle{background-color:var(--mat-radio-disabled-selected-icon-color, var(--mat-sys-on-surface, currentColor));opacity:var(--mat-radio-disabled-selected-icon-opacity, 0.38)}.mat-mdc-radio-button .mdc-radio__native-control:enabled:not(:checked)+.mdc-radio__background>.mdc-radio__outer-circle{border-color:var(--mat-radio-unselected-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-radio-button .mdc-radio__native-control:enabled:checked+.mdc-radio__background>.mdc-radio__outer-circle{border-color:var(--mat-radio-selected-icon-color, var(--mat-sys-primary))}.mat-mdc-radio-button .mdc-radio__native-control:enabled:checked+.mdc-radio__background>.mdc-radio__inner-circle{background-color:var(--mat-radio-selected-icon-color, var(--mat-sys-primary, currentColor))}.mat-mdc-radio-button .mdc-radio__native-control:enabled:focus:checked+.mdc-radio__background>.mdc-radio__outer-circle{border-color:var(--mat-radio-selected-focus-icon-color, var(--mat-sys-primary))}.mat-mdc-radio-button .mdc-radio__native-control:enabled:focus:checked+.mdc-radio__background>.mdc-radio__inner-circle{background-color:var(--mat-radio-selected-focus-icon-color, var(--mat-sys-primary, currentColor))}.mat-mdc-radio-button .mdc-radio__native-control:checked+.mdc-radio__background>.mdc-radio__inner-circle{transform:scale(0.5);transition:transform 90ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled{pointer-events:auto}.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mdc-radio__native-control:not(:checked)+.mdc-radio__background>.mdc-radio__outer-circle{border-color:var(--mat-radio-disabled-unselected-icon-color, var(--mat-sys-on-surface));opacity:var(--mat-radio-disabled-unselected-icon-opacity, 0.38)}.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled:hover .mdc-radio__native-control:checked+.mdc-radio__background>.mdc-radio__outer-circle,.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mdc-radio__native-control:checked:focus+.mdc-radio__background>.mdc-radio__outer-circle,.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mdc-radio__native-control+.mdc-radio__background>.mdc-radio__outer-circle{border-color:var(--mat-radio-disabled-selected-icon-color, var(--mat-sys-on-surface));opacity:var(--mat-radio-disabled-selected-icon-opacity, 0.38)}.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled:hover .mdc-radio__native-control:checked+.mdc-radio__background>.mdc-radio__inner-circle,.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mdc-radio__native-control:checked:focus+.mdc-radio__background>.mdc-radio__inner-circle,.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mdc-radio__native-control+.mdc-radio__background>.mdc-radio__inner-circle{background-color:var(--mat-radio-disabled-selected-icon-color, var(--mat-sys-on-surface, currentColor));opacity:var(--mat-radio-disabled-selected-icon-opacity, 0.38)}.mat-mdc-radio-button._mat-animation-noopable .mdc-radio__background::before,.mat-mdc-radio-button._mat-animation-noopable .mdc-radio__outer-circle,.mat-mdc-radio-button._mat-animation-noopable .mdc-radio__inner-circle{transition:none !important}.mat-mdc-radio-button .mdc-radio__background::before{background-color:var(--mat-radio-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-radio-button.mat-mdc-radio-checked .mat-ripple-element,.mat-mdc-radio-button.mat-mdc-radio-checked .mdc-radio__background::before{background-color:var(--mat-radio-checked-ripple-color, var(--mat-sys-primary))}.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mat-ripple-element,.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mdc-radio__background::before{background-color:var(--mat-radio-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-radio-button .mat-internal-form-field{color:var(--mat-radio-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-radio-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-radio-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-radio-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-radio-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-radio-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-radio-button .mdc-radio--disabled+label{color:var(--mat-radio-disabled-label-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-radio-button .mat-radio-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:50%}.mat-mdc-radio-button .mat-radio-ripple>.mat-ripple-element{opacity:.14}.mat-mdc-radio-button .mat-radio-ripple::before{border-radius:50%}.mat-mdc-radio-button .mdc-radio>.mdc-radio__native-control:focus:enabled:not(:checked)~.mdc-radio__background>.mdc-radio__outer-circle{border-color:var(--mat-radio-unselected-focus-icon-color, var(--mat-sys-on-surface))}.mat-mdc-radio-button.cdk-focused .mat-focus-indicator::before{content:""}.mat-mdc-radio-disabled{cursor:default;pointer-events:none}.mat-mdc-radio-disabled.mat-mdc-radio-disabled-interactive{pointer-events:auto}.mat-mdc-radio-touch-target{position:absolute;top:50%;left:50%;height:48px;width:48px;transform:translate(-50%, -50%);display:var(--mat-radio-touch-target-display, block)}[dir=rtl] .mat-mdc-radio-touch-target{left:auto;right:50%;transform:translate(50%, -50%)}
2
+ `],encapsulation:2,changeDetection:0})}return d})(),Je=(()=>{class d{static \u0275fac=function(i){return new(i||d)};static \u0275mod=J({type:d});static \u0275inj=Q({imports:[j,_e,ke,j]})}return d})();var ot=(()=>{class d{appSettings=c(ne);data=c(se);_svcDatasetConfigs=[];_svcDataSource=[];_svcSubjectObserverRegistry=[];signedAnglePaths=new Set(["self.navigation.attitude.roll","self.navigation.attitude.pitch","self.navigation.attitude.yaw","self.environment.wind.angleApparent","self.environment.wind.angleTrueGround","self.environment.wind.angleTrueWater","self.steering.rudderAngle"]);constructor(){let e=this.appSettings;this._svcDatasetConfigs=e.getDataSets(),this.startAll()}setupServiceSubjectRegistry(e,i){let t=this._svcSubjectObserverRegistry.findIndex(a=>a.datasetUuid==e);t>=0&&(this._svcSubjectObserverRegistry[t].rxjsSubject.complete(),this._svcSubjectObserverRegistry.splice(t,1)),this._svcSubjectObserverRegistry.push({datasetUuid:e,rxjsSubject:new F(i)})}createDataSourceConfiguration(e){let t={uuid:e.uuid,pathObserverSubscription:null,sampleTime:null,maxDataPoints:null,smoothingPeriod:null,historicalData:[]};switch(e.timeScaleFormat){case"Last 30 Minutes":t.maxDataPoints=120,t.sampleTime=15e3,t.smoothingPeriod=50;break;case"Last 5 Minutes":t.maxDataPoints=60,t.sampleTime=5e3,t.smoothingPeriod=25;break;case"Last Minute":t.maxDataPoints=60,t.sampleTime=1e3,t.smoothingPeriod=25;break;case"hour":t.maxDataPoints=e.period*120,t.sampleTime=3e4,t.smoothingPeriod=Math.floor(t.maxDataPoints*.25);break;case"minute":t.maxDataPoints=e.period*60,t.sampleTime=1e3,t.smoothingPeriod=Math.floor(t.maxDataPoints*.25);break;default:t.maxDataPoints=e.period*5,t.sampleTime=200,t.smoothingPeriod=Math.floor(t.maxDataPoints*.25);break}return(!t.maxDataPoints||t.maxDataPoints<1)&&(t.maxDataPoints=1),t}startAll(){console.log("[Dataset Service] Auto Starting "+this._svcDatasetConfigs.length.toString()+" Datasets");for(let e of this._svcDatasetConfigs)this.start(e.uuid)}start(e){let i=this._svcDatasetConfigs.find(r=>r.uuid==e);if(!i){console.warn(`[Dataset Service] Dataset UUID:${e} not found`);return}let t=this.createDataSourceConfiguration(i);this.setupServiceSubjectRegistry(t.uuid,t.maxDataPoints);let a=this._svcDataSource[this._svcDataSource.push(t)-1];console.log(`[Dataset Service] Starting recording process: ${i.path}, Scale: ${i.timeScaleFormat}, Period: ${i.period}, Datapoints: ${t.maxDataPoints}`);function o(r){return s=>L(r).pipe(B(s,(l,m)=>m))}let n=this.resolveAngleDomain(i.path,i.baseUnit);a.pathObserverSubscription=this.data.subscribePath(i.path,i.pathSource).pipe(o(t.sampleTime)).subscribe(r=>{if(r.data.value===null)return;a.maxDataPoints>0&&a.historicalData.length>=a.maxDataPoints&&a.historicalData.shift(),a.historicalData.push(r.data.value);let s=this.updateDataset(a,i.baseUnit,n);this._svcSubjectObserverRegistry.find(l=>l.datasetUuid===a.uuid).rxjsSubject.next(s)})}stop(e){let i=this._svcDataSource.findIndex(t=>t.uuid==e);console.log(`[Dataset Service] Stopping Dataset ${e} data capture`),this._svcDataSource[i].pathObserverSubscription.unsubscribe(),this._svcDataSource.splice(i,1)}list(){return ce(this._svcDatasetConfigs)}getDatasetConfig(e){return this._svcDatasetConfigs.find(i=>i.uuid===e)}getDataSourceInfo(e){return this._svcDataSource.find(i=>i.uuid===e)}create(e,i,t,a,o,n=!0,r=!0,s){if(!e||!i||!t||!a||!o)return null;let l=s||de.create(),m={uuid:l,path:e,pathSource:i,baseUnit:this.data.getPathUnitType(e),timeScaleFormat:t,period:a,label:o,editable:r};return console.log(`[Dataset Service] Creating ${n?"":"non-"}persistent ${r?"":"hidden "}dataset: ${m.uuid}, Path: ${m.path}, Source: ${m.pathSource} Scale: ${m.timeScaleFormat}, Period: ${m.period}`),this._svcDatasetConfigs.push(m),this.start(l),n===!0&&this.appSettings.saveDataSets(this._svcDatasetConfigs),l}edit(e){let i=this._svcDatasetConfigs.find(t=>t.uuid===e.uuid);return i?JSON.stringify(i)===JSON.stringify(e)?(console.log(`[Dataset Service] No changes detected for Dataset ${e.uuid}.`),!1):(this.stop(e.uuid),console.log(`[Dataset Service] Updating Dataset: ${e.uuid}`),e.baseUnit=this.data.getPathUnitType(e.path),this._svcDatasetConfigs.splice(this._svcDatasetConfigs.findIndex(t=>t.uuid===e.uuid),1,e),this.start(e.uuid),this.appSettings.saveDataSets(this._svcDatasetConfigs),!0):!1}remove(e,i=!0){return!e||e===""||this._svcDatasetConfigs.findIndex(t=>t.uuid===e)===-1?!1:(this.stop(e),console.log(`[Dataset Service] Removing ${i?"":"non-"}persistent Dataset: ${e}`),this._svcDatasetConfigs.splice(this._svcDatasetConfigs.findIndex(t=>t.uuid===e),1),this._svcSubjectObserverRegistry.find(t=>t.datasetUuid===e).rxjsSubject.complete(),this._svcSubjectObserverRegistry.splice(this._svcSubjectObserverRegistry.findIndex(t=>t.datasetUuid===e),1),i===!0&&this.appSettings.saveDataSets(this._svcDatasetConfigs),!0)}getDatasetObservable(e){let i=this._svcSubjectObserverRegistry.find(t=>t.datasetUuid==e);return i?i.rxjsSubject.asObservable():null}getDatasetBatchThenLiveObservable(e){let i=this._svcSubjectObserverRegistry.find(r=>r.datasetUuid==e);if(!i)return null;let t=i.rxjsSubject,a=t._buffer?t._buffer.slice():[],o=q([a]),n=t.pipe($(a.length));return U(o,n)}updateDataset(e,i,t="scalar"){let a=null,o=null,n=null,r=null;if(i==="rad"){a=this.circularMeanRad(e.historicalData);let u=e.historicalData.slice(-e.smoothingPeriod);o=this.circularMeanRad(u);let{min:h,max:_}=this.circularMinMaxRad(e.historicalData);t==="direction"?(a=this.normalizeToDirection(a),o=this.normalizeToDirection(o),n=this.normalizeToDirection(h),r=this.normalizeToDirection(_)):t==="signed"?(a=this.normalizeToSigned(a),o=this.normalizeToSigned(o),n=this.normalizeToSigned(h),r=this.normalizeToSigned(_)):(n=h,r=_)}else a=l(e.historicalData),o=m(e.historicalData,e.smoothingPeriod),n=Math.min(...e.historicalData),r=Math.max(...e.historicalData);return{timestamp:Date.now(),data:{value:i==="rad"?t==="signed"?this.normalizeToSigned(e.historicalData[e.historicalData.length-1]):this.normalizeToDirection(e.historicalData[e.historicalData.length-1]):e.historicalData[e.historicalData.length-1],sma:o,ema:null,doubleEma:null,lastAverage:a,lastMinimum:n,lastMaximum:r}};function l(u){return u.length===0?null:u.reduce((_,g)=>_+g,0)/u.length}function m(u,h){u.length<h&&(h=u.length);let _=0;for(let g=u.length-h;g<u.length;g++)_+=u[g];return _/h}}circularMeanRad(e){if(e.length===0)return 0;let i=e.reduce((a,o)=>a+Math.sin(o),0),t=e.reduce((a,o)=>a+Math.cos(o),0);return Math.atan2(i/e.length,t/e.length)}circularMinMaxRad(e){if(e.length===0)return{min:0,max:0};let i=e.map(r=>(r*180/Math.PI+360)%360).sort((r,s)=>r-s),t=0,a=0;for(let r=0;r<i.length;r++){let s=(r+1)%i.length,l=(i[s]-i[r]+360)%360;l>t&&(t=l,a=s)}let o=i[a]*Math.PI/180,n=i[(a-1+i.length)%i.length]*Math.PI/180;return{min:o,max:n}}resolveAngleDomain(e,i){if(i!=="rad")return"scalar";let t=this.normalizePathKey(e);for(let a of this.signedAnglePaths)if(t===this.normalizePathKey(a))return"signed";return"direction"}normalizePathKey(e){return e.replace(/^vessels\.self\./,"").replace(/^self\./,"")}mod(e,i){return(e%i+i)%i}normalizeToDirection(e){let i=2*Math.PI;return this.mod(e,i)}normalizeToSigned(e){let i=2*Math.PI;return this.mod(e+Math.PI,i)-Math.PI}static \u0275fac=function(i){return new(i||d)};static \u0275prov=N({token:d,factory:d.\u0275fac,providedIn:"root"})}return d})();export{Me as a,ke as b,Je as c,ot as d};