@mxtommy/kip 3.10.0-beta.9 → 3.10.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 (53) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +11 -0
  3. package/images/KipGaugeSample3-1024x508.png +0 -0
  4. package/package.json +2 -1
  5. package/plugin/index.js +238 -31
  6. package/plugin/openApi.json +367 -0
  7. package/public/3rdpartylicenses.txt +52 -52
  8. package/public/assets/help-docs/kiosk.md +192 -0
  9. package/public/assets/help-docs/menu.json +1 -0
  10. package/public/assets/help-docs/welcome.md +27 -2
  11. package/public/assets/svg/icons.svg +5 -1
  12. package/public/chunk-2XB2ZNXV.js +1 -0
  13. package/public/{chunk-J3WNXGAQ.js → chunk-4N6AW5Y5.js} +1 -1
  14. package/public/chunk-5NKFZDV5.js +5 -0
  15. package/public/chunk-AREYGJLO.js +3 -0
  16. package/public/chunk-B6IRZFL5.js +3 -0
  17. package/public/chunk-CCEKSCJH.js +8 -0
  18. package/public/chunk-DSBAZLLN.js +5 -0
  19. package/public/chunk-DSWRNQDG.js +15 -0
  20. package/public/{chunk-LRX3XYXK.js → chunk-EOXCM3IV.js} +1 -1
  21. package/public/chunk-G5U7W6LL.js +1 -0
  22. package/public/{chunk-7OMETTVK.js → chunk-JHI7SSDT.js} +1 -1
  23. package/public/{chunk-GJ33QBJ6.js → chunk-KABAIECE.js} +1 -1
  24. package/public/chunk-LYPFRDZT.js +1 -0
  25. package/public/chunk-O2GGGUBC.js +2 -0
  26. package/public/chunk-QZO4362R.js +4 -0
  27. package/public/chunk-RJDZKEUA.js +1 -0
  28. package/public/{chunk-TDHAZ7DS.js → chunk-SVI34QP4.js} +1 -1
  29. package/public/chunk-TSNRNW3D.js +2 -0
  30. package/public/{chunk-WSW3WZXR.js → chunk-TTNX7JB6.js} +10 -10
  31. package/public/chunk-WUFURHSA.js +5 -0
  32. package/public/chunk-X45MUE6N.js +2 -0
  33. package/public/chunk-YPVFGYWU.js +1 -0
  34. package/public/chunk-ZGO25KK6.js +2 -0
  35. package/public/chunk-ZOYXBB55.js +2 -0
  36. package/public/index.html +1 -1
  37. package/public/{main-TITA4PAE.js → main-JN6ENHFX.js} +12 -14
  38. package/COPILOT.md +0 -362
  39. package/eslint.config.js +0 -45
  40. package/kip-plugin/src/index.ts +0 -53
  41. package/kip-plugin/tsconfig.plugin.json +0 -13
  42. package/public/chunk-2B3JF66M.js +0 -2
  43. package/public/chunk-3QS25L5K.js +0 -1
  44. package/public/chunk-BZF6OYAF.js +0 -7
  45. package/public/chunk-FW2LAMAA.js +0 -16
  46. package/public/chunk-FWG5JGYN.js +0 -1
  47. package/public/chunk-HKUJILH7.js +0 -6
  48. package/public/chunk-JFDPDIG2.js +0 -2
  49. package/public/chunk-MXKB5Z6M.js +0 -5
  50. package/public/chunk-NL52VRFS.js +0 -1
  51. package/public/chunk-PTADMSJZ.js +0 -1
  52. package/public/chunk-S7BCYLTC.js +0 -11
  53. package/public/chunk-T5GXSVMN.js +0 -1
package/COPILOT.md DELETED
@@ -1,362 +0,0 @@
1
- # COPILOT.md
2
-
3
- ## 1. Project Overview
4
- KIP Instrument MFD is an advanced and versatile marine instrumentation package designed to display Signal K data in a modern, customizable dashboard, on boats. It provides real-time visualization of navigation, wind, engine, and other marine data streams offered by Signal K, supporting a wide range of widgets and configuration options. The project aims to deliver a user-friendly, extensible, and visually appealing interface for both professional and recreational marine users.
5
-
6
- - **Key technologies:** Angular (v20+), Angular Material, Signal K, TypeScript, SCSS.
7
-
8
- ---
9
-
10
- ## 2. Architecture & Structure
11
- - **Main folders:**
12
- - `src/app/`: Main application code.
13
- - `src/app/widgets/`: Widget components (e.g., wind, autopilot).
14
- - `src/app/widget-config/`: Widget configuration components and logic.
15
- - `src/app/core/`: Core services, interfaces, and utilities.
16
- - **Component structure:**
17
- - Each widget has its own component, template, and theme SCSS in `src/app/widgets/`.
18
- - All widget configuration logic and UI is centralized and handled independently by components in `src/app/widget-config/`.
19
- - Creating a new widget does not require changes to `src/app/widget-config/` unless your widget introduces new configuration properties or needs a custom config UI.
20
- - The main configuration form logic is in `src/app/widget-config/modal-widget-config/`. For unique widget config needs, you may add a new config component (e.g., `modal-widget-<name>-config`).
21
- - Widget logic/UI and widget configuration are separate concepts that work together.
22
-
23
- ---
24
-
25
- ## 4. Conventions & Patterns
26
- - **Naming:**
27
- - Use descriptive, camelCase names for variables and controls.
28
- - Widget config properties match the widget’s function (e.g., `trueWindAngle`, `drift`).
29
- - **Forms:**
30
- - Use Angular Reactive Forms for all configuration UIs.
31
- - Group related controls in form groups.
32
- - **Theming:**
33
- - Use SCSS mixins for light/dark themes.
34
- - Theme mixins must be included in global or component styles.
35
-
36
- ---
37
-
38
- ## 5. Development Workflow
39
- - **Linting:**
40
- - Run `npm run lint` before every commit (enforced with Husky pre-commit hook).
41
- - **Testing:**
42
- - _To be defined._
43
- - **Build & Serve:**
44
- - `npm run dev` for development server.
45
- - `npm run build-dev` for development build.
46
- - `npm run build-prod` for production build.
47
-
48
- ---
49
-
50
- ## 6. Documentation & Comments
51
- - **Document all custom validators and business rules.**
52
- - **Update this file and the README with any major changes or new patterns.**
53
-
54
- ---
55
-
56
-
57
- ## 8. Core Service Summaries
58
- All major services in `src/app/core/services/` are summarized below for Copilot and developer context. Each entry includes purpose, key methods/responsibilities, dependencies, and usage notes.
59
-
60
- - **AppNetworkInitService (`app-initNetwork.service.ts`)**
61
- - Purpose: Loads network services (Signal K connection, authentication, Storage Service) and retrieves configurations from the Signal K server and loaded it before app startup using Angular's `APP_INITIALIZER`.
62
- - Key methods: `initNetworkServices()`, config loading, login management.
63
- - Dependencies: SignalKConnectionService, AuthenticationService, StorageService, DataService, SignalKDeltaService.
64
- - Usage: Ensures network, authentication, Storage Service and configuration are ready before app bootstraps.
65
-
66
- - **AuthenticationService (`authentication.service.ts`)**
67
- - Purpose: Handles user/device authentication with the Signal K server.
68
- - Key methods: `login()`, `logout()`, token management, exposes `isLoggedIn$` observable.
69
- - Dependencies: SignalKConnectionService, HttpClient.
70
-
71
- - Purpose: Centralizes all app dialogs using Angular Material.
72
- - Dependencies: MatDialog, Dialog components.
73
- - Usage: Used throughout the app to open modals and dialogs for user interaction.
74
-
75
- - **SignalKConnectionService (`signalk-connection.service.ts`)**
76
- - Purpose: Manages the WebSocket connection to the Signal K server, including reconnect logic and status tracking.
77
- - Key methods: `connect()`, `disconnect()`, status observables.
78
- - Dependencies: WebSocket, AuthenticationService.
79
-
80
- - **SignalKDeltaService (`signalk-delta.service.ts`)**
81
- - Purpose: Handles real-time delta updates from Signal K, distributing data to widgets and services.
82
- - Key methods: Delta subscription, data distribution.
83
- - Dependencies: SignalKConnectionService, DataService.
84
-
85
- - **DataService (`data.service.ts`)**
86
- - Purpose: Central data provider for Signal K and other sources; handles subscriptions, value updates, and metadata management.
87
- - Key methods: `subscribeToPath()`, `getValue()`, `getMetadata()`, data and metadata update distribution.
88
- - Dependencies: SignalKDeltaService, StorageService.
89
-
90
- - **AppService (`app-service.ts`)**
91
- - Purpose: Centralizes app-wide utilities, notifications, and theme management.
92
- - Key methods: Notification helpers, theme switching, app-level utilities.
93
- - Dependencies: Angular core, theme and notification services.
94
-
95
- - **UIEventService (`uiEvent.service.ts`)**
96
- - Purpose: Manages UI events such as drag, fullscreen, wake lock, and hotkeys.
97
- - Key methods: Event emitters, hotkey handlers.
98
- - Dependencies: Angular core, browser APIs.
99
-
100
- - **AppSettingsService (`app-settings.service.ts`)**
101
- - Purpose: Manages persistent app settings, user preferences, and configuration storage.
102
- - Key methods: `getSetting()`, `setSetting()`, config file management.
103
- - Dependencies: StorageService.
104
-
105
- - **StorageService (`storage.service.ts`)**
106
- - Purpose: Provides persistent storage for app data, settings, and user preferences.
107
- - Key methods: `getItem()`, `setItem()`, config file management.
108
- - Dependencies: LocalStorage, IndexedDB, or similar.
109
-
110
- - **NotificationsService (`notifications.service.ts`)**
111
- - Key methods: Notification state management, audio/visual alerts, muting.
112
- - Dependencies: AppSettingsService, DataService, SignalkRequestsService, Howler.
113
-
114
- - **CanvasService (`canvas.service.ts`)**
115
- - Purpose: Provides drawing and rendering utilities for widgets and dashboard components.
116
- - Key methods: Canvas context helpers, drawing utilities.
117
- - Dependencies: None (core Angular).
118
-
119
- - **DashboardService (`dashboard.service.ts`)**
120
- - Purpose: Handles dashboard layout, widget arrangement, and dashboard state.
121
- - Key methods: Layout management, widget arrangement, dashboard state.
122
- - Dependencies: StorageService, WidgetService.
123
-
124
- - **DataSetService (`data-set.service.ts`)**
125
- - Purpose: Manages data sets, including loading, saving, and updating widget data sources.
126
- - Key methods: Data set CRUD, data source updates.
127
- - Dependencies: DataService, StorageService.
128
-
129
- - **SignalKPluginsService (`signalk-plugins.service.ts`)**
130
- - Purpose: Manages Signal K plugin discovery, configuration, and state.
131
- - Key methods: Plugin list management, config updates.
132
- - Dependencies: SignalKConnectionService, DataService.
133
- - Usage: Used to manage plugins and their configuration.
134
-
135
- - **SignalKRequestsService (`signalk-requests.service.ts`)**
136
- - Purpose: Handles requests to the Signal K server, such as PUT/POST operations and custom actions.
137
- - Key methods: `sendRequest()`, custom action handlers.
138
- - Dependencies: SignalKConnectionService, DataService.
139
-
140
- - **TimersService (`timers.service.ts`)**
141
- - Purpose: Centralized timer utility for app and widgets, supporting intervals, timeouts, and scheduling.
142
- - Key methods: Timer creation, interval management.
143
- - Dependencies: Angular core.
144
-
145
- - **UnitsService (`units.service.ts`)**
146
- - Purpose: Handles unit conversion and formatting for all displayed data.
147
- - Key methods: `convert()`, `format()`, unit preference management.
148
- - Dependencies: AppSettingsService.
149
-
150
- - **WidgetService (`widget.service.ts`)**
151
- - Purpose: Manages widget registration, configuration, and lifecycle.
152
- - Key methods: Widget registration, config helpers, lifecycle management.
153
- - Dependencies: DashboardService, DataService.
154
-
155
- ---
156
-
157
- ## 9. Widget Structure, BaseWidgetComponent, and Signal K Zones
158
- - All widgets must extend `BaseWidgetComponent` to inherit core data, config, and lifecycle logic.
159
- - Handles:
160
- - Data subscriptions via `DataService` (values and metadata).
161
- - Unit conversion via `UnitsService`.
162
- - Theme and app-wide utilities via `AppService`.
163
- - Config validation and merging with defaults.
164
- - Utility for formatting numbers with min/max and decimals.
165
- - Abstract methods: `startWidget()` and `updateConfig(config)` must be implemented by each widget.
166
- - Provides:
167
- - `observeDataStream()` for subscribing to live data.
168
- - `unsubscribeDataStream()` and `unsubscribeMetaStream()` for cleanup (call in `ngOnDestroy`).
169
- - `formatWidgetNumberValue()` for consistent value formatting.
170
- - `validateConfig()` to merge user config with defaults and prevent breaking changes.
171
- - `zones$` observable for zone metadata (e.g., to highlight elements in widgets based on data state ie. zone state).
172
-
173
- - Zones are a Signal K metadata concept that define value ranges for states like nominal, warning, alarm, and emergency.
174
- - The `observeMetaStream()` method in `BaseWidgetComponent` subscribes to zones metadata for a widget's data path, making it available via the `zones$` observable.
175
-
176
- - **Widget Path Configuration:**
177
- - `isPathConfigurable` and `pathRequired` in `IWidgetPath` control UI and validation.
178
- - If `pathRequired` is `true` or undefined, path is required and must be valid.
179
- - If `pathRequired` is `false`, path is optional (can be empty or valid).
180
- - Non-configurable paths are excluded from config UI and validation.
181
- - **Custom Validators:**
182
- - Path controls use a custom validator to enforce the above rules.
183
- - No `Validators.required` is used for path controls; only the custom validator.
184
- - **UI Feedback:**
185
- - The UI uses Angular’s `@if` syntax to show “(optional)” and hints when appropriate.
186
- - Error messages are shown for required and invalid paths.
187
- **Signal K Metadata, Units & Value Conversion:**
188
- - Signal K defines a schema with base SI units for all standard paths (e.g., meters, Celsius, Pascals). Plugins can add custom paths, but these are not in the schema and must provide their own metadata (especially units) or the path will be treated as unitless.
189
- - Each data path may provide metadata such as units, display names, min/max, etc. This metadata is essential for context-aware UI, validation, and display hints.
190
- - KIP uses the base SI units from metadata to map each path to a conversion group in the UnitsService. This enables conversion from the base SI unit to any supported display unit (e.g., meters to feet, Celsius to Fahrenheit) according to user preferences.
191
- - The "Format" setting in KIP determines what display format or unit to apply to a value. If no metadata units are present, the value is treated as unitless and any format (or none) can be applied.
192
- - The DataService provides access to both values and metadata for each path, supporting both value display and context-aware logic.
193
-
194
- - **Widget Structure:**
195
- - Each widget is an Angular component in `src/app/widgets/`, extending `BaseWidgetComponent`.
196
- - Widget configuration is defined in `widgetProperties` (implements `IWidget`), with all config stored in `widgetProperties.config`.
197
- - Widget config includes paths, display options, min/max, decimals, and more.
198
- - All widget configuration logic/UI is handled in `src/app/widget-config/`.
199
-
200
- - **Widget Creation Best Practices:**
201
- - Always extend `BaseWidgetComponent` for new widgets.
202
- - Implement `startWidget()` to initialize widget-specific logic.
203
- - Implement `updateConfig(config)` to handle config changes.
204
- - Use `observeDataStream()` to subscribe to data, and `observeMetaStream()` for zones/metadata.
205
- - Use `UnitsService` for all value conversions and formatting.
206
- - Store all widget state/config in `widgetProperties.config`.
207
- - Clean up all subscriptions in `ngOnDestroy` using provided methods.
208
- ---
209
-
210
- ## 10. KIP Colors, Theming, and Widget Best Practices
211
-
212
- - **KIP Color & Theming Concepts:**
213
- - KIP uses a centralized theme system with color roles defined in SCSS and exposed to TypeScript via CSS variables and the `AppService`.
214
- - Theme colors (e.g., `contrast`, `blue`, `zoneAlarm`, `background`, etc.) are defined in SCSS files (`styles.scss`, theme partials) and mapped to CSS variables (e.g., `--kip-blue-color`).
215
- - The `AppService` provides a `cssThemeColorRoles$` observable and a `theme()` signal for accessing current theme colors in TypeScript.
216
- - Theme switching (light, dark, night) is handled by toggling classes on `<body>` and updating CSS variables.
217
- - All widgets should use theme colors for UI consistency and accessibility.
218
-
219
- - **Best Practices for Using Colors & Theming in Widgets:**
220
- - **TypeScript:**
221
- - Access theme colors via `this.theme().<colorRole>` (e.g., `this.theme().zoneAlarm`, `this.theme().contrast`).
222
- - Never hardcode color hex values in widget TypeScript; always use theme roles.
223
- - For dynamic coloring (e.g., based on state/zones), use the correct theme role for each state (see `zoneAlarm`, `zoneWarn`, etc.).
224
- - Use the color mapping pattern as in `getColors()` for supporting multiple color roles and dim/dimmer variants.
225
- - When updating widget visuals (e.g., gauge, highlights), always update with theme colors to support live theme switching.
226
- - **SCSS:**
227
- - Use CSS variables (e.g., `var(--kip-blue-color)`) for all color assignments in widget/component styles.
228
- - Do not use static hex codes; always reference a theme variable.
229
- - For custom widget styles, define new CSS variables in the theme partials if needed, and use them in your SCSS.
230
- - Use the `.light-theme`, `.night-theme`, and default (dark) selectors to override variables for each theme as needed.
231
- - Use SCSS mixins for reusable style patterns and to support theme switching.
232
- - **General:**
233
- - Always test widgets in all themes (light, dark, night) to ensure colors are accessible and visually correct.
234
- - Use theme roles for all UI elements, including backgrounds, borders, text, and highlights.
235
- - For state-based coloring (e.g., alarms, warnings), use the corresponding zone color from the theme.
236
- - Avoid inline styles for colors; prefer class-based or variable-based styling.
237
- ---
238
-
239
- ## 11. Additional Instructions & Cross-References
240
-
241
- ### **Related Instruction Files:**
242
- - **README.md**: Project overview, setup instructions, and development guidelines
243
- - **`.github/instructions/angular.instructions.md`**: Detailed Angular v20+ coding standards, component patterns, and framework-specific best practices
244
-
245
- ### **Instruction Hierarchy:**
246
- 1. **Primary**: This `COPILOT.md` file (KIP-specific project guidelines and architecture)
247
- 2. **Secondary**: `.github/instructions/angular.instructions.md` (Angular framework standards and modern patterns)
248
- 3. **Tertiary**: `README.md` (General project information and setup)
249
-
250
- ### **Usage Notes:**
251
- - All Angular development should follow both this COPILOT.md file AND the angular.instructions.md guidelines
252
- - When conflicts arise, KIP-specific guidelines in this file take precedence over general Angular patterns
253
- - For widget development, prioritize the BaseWidgetComponent patterns described in this file
254
- - For general Angular coding (components, services, forms, component), follow the modern Angular v20+ patterns in angular.instructions.md
255
-
256
- ---
257
-
258
- ## 12. SVG Animation Utilities (requestAnimationFrame Helpers)
259
-
260
- High-performance SVG animations in KIP (e.g., wind steering dial laylines, sector bands, rotating indicators) use a small set of utilities found in `src/app/widgets/utils/svg-animate.util.ts` to ensure:
261
-
262
- - No unnecessary Angular change detection on every animation frame
263
- - Consistent easing and shortest‑path angle interpolation
264
- - Centralized cancellation logic (preventing overlapping animations per element/concern)
265
- - Readable, minimal widget component code
266
-
267
- ### 12.1 Design Principles
268
- 1. Run frame loops outside Angular's `NgZone` to avoid triggering change detection ~60 times/sec.
269
- 2. Only re-enter the zone once per animation (on completion callback) if UI state needs Angular binding updates.
270
- 3. Gate “tiny” animations (angle deltas below a threshold) to avoid visual jitter and wasted work.
271
- 4. Always animate the shortest angular path (wrap via ±180 logic) for rotational continuity.
272
- 5. Provide generic primitives (angle + sector interpolation) so components don’t duplicate interpolation math.
273
-
274
- ### 12.2 Provided Functions
275
- | Function | Purpose | Key Inputs | Notes |
276
- |----------|---------|-----------|-------|
277
- | `animateRotation(el, fromDeg, toDeg, durationMs, onDone?, ngZone?)` | Smoothly rotates an SVG element (`transform: rotate(...)`) | Element, start+end angles, duration | Tracks per-element frame id internally (WeakMap) so a new call cancels the prior rotation for that element. |
278
- | `animateRudderWidth(rectEl, fromWidth, toWidth, durationMs, onDone?, ngZone?)` | Interpolates a `<rect>` width | SVGRectElement, numeric widths | Same outside-zone strategy; width set via `setAttribute`. |
279
- | `animateAngleTransition(fromDeg, toDeg, durationMs, applyFn, onDone?, ngZone?)` | Generic angle interpolation (no DOM assumptions) | Angles, duration, callback(angle) | Use for derived geometry (e.g., computing a path string). |
280
- | `animateSectorTransition(from: SectorAngles, to: SectorAngles, durationMs, applyFn, onDone?, ngZone?)` | Interpolates a structured group of three related angles (`min, mid, max`) | Objects with `{min, mid, max}` | Uses same angle normalization per field + easing. |
281
-
282
- `SectorAngles` interface:
283
- ```
284
- interface SectorAngles { min: number; mid: number; max: number; }
285
- ```
286
-
287
- ### 12.3 NgZone Strategy
288
- All helpers accept an optional `NgZone`. When provided they:
289
- 1. Call `ngZone.runOutsideAngular()` wrapping the frame loop.
290
- 2. Use `requestAnimationFrame` until elapsed >= duration.
291
- 3. Apply easing (cubic in/out) and normalized shortest-path interpolation.
292
- 4. On final frame, invoke `onDone` inside Angular (`ngZone.run(...)`) so any bound template values update once.
293
-
294
- If `ngZone` is omitted they still function (pure browser environment) — suitable for non-Angular contexts or tests.
295
-
296
- ### 12.4 Cancellation Rules
297
- - `animateRotation` & `animateRudderWidth` internally keep a WeakMap<Element, frameId>; a new call replaces the old.
298
- - Callers of `animateAngleTransition` / `animateSectorTransition` receive the raw `frameId` and MUST store & cancel it if a new animation is started for the same conceptual target (e.g., a layline or sector band) before completion.
299
- - Always cancel outstanding frame ids in `ngOnDestroy` to avoid orphan rAF callbacks if the component is torn down mid-animation.
300
-
301
- ### 12.5 Angle Handling Details
302
- - Input angles are normalized to [0, 360).
303
- - Delta uses wrapped signed difference: `((to - from + 540) % 360) - 180` for shortest path.
304
- - Interpolated angle = `from + easedT * delta`; final angle normalized again.
305
- - A small epsilon (e.g., ~0.25°) can be used by callers to skip tiny animations; component sets `EPS_ANGLE` constant.
306
-
307
- ### 12.6 Easing
308
- Currently a fixed cubic ease-in-out: `t < 0.5 ? 4t^3 : 1 - pow(-2t + 2, 3)/2`. Chosen for smooth acceleration/deceleration without overshoot. If future needs arise, expose an optional easing parameter (keep backward compatibility by defaulting to cubic in/out).
309
-
310
- ### 12.7 Usage Patterns
311
-
312
- Rotate an indicator:
313
- ```
314
- this.animationFrameIds.set(
315
- el,
316
- animateRotation(el, currentAngle, targetAngle, 300, () => { /* one-time post animation logic */ }, this.ngZone)
317
- );
318
- ```
319
-
320
- Animate a layline path angle:
321
- ```
322
- if (this.portLaylineAnimId) cancelAnimationFrame(this.portLaylineAnimId);
323
- this.portLaylineAnimId = animateAngleTransition(
324
- prevAngle,
325
- nextAngle,
326
- 300,
327
- angle => this.updateLaylinePath(angle, /* isPort= */ true),
328
- () => { this.portLaylineAnimId = null; },
329
- this.ngZone
330
- );
331
- ```
332
-
333
- Animate a wind sector (three angles):
334
- ```
335
- if (this.portSectorAnimId) cancelAnimationFrame(this.portSectorAnimId);
336
- this.portSectorAnimId = animateSectorTransition(
337
- previousSector,
338
- newSector,
339
- 300,
340
- sector => this.updateSectorPath(sector, true),
341
- () => { this.portSectorAnimId = null; },
342
- this.ngZone
343
- );
344
- ```
345
-
346
- ### 12.8 When NOT to Animate
347
- - First render / initialization where the user has no prior visual expectation — just set final state.
348
- - Discontinuous jumps (e.g., compass wrap after data gap) that would produce a long spin — snap instead.
349
- - Extremely small (< epsilon) changes — update instantly.
350
-
351
- ### 12.9 Testing Tips
352
- - For deterministic unit tests, inject a mock `performance.now()` / substitute a manual time advance, or abstract the timestamp acquisition behind a seam if greater test coverage is required.
353
- - Validate shortest-path logic with cases like `from=350 → to=10` (should rotate +20°, not -340°).
354
- - Confirm cancellation by firing a second animation mid-way; the first should not apply further frames.
355
-
356
- ### 12.10 Future Extensions (Backlog Ideas)
357
- - Optional custom easing function parameter.
358
- - Support for group animations (batch multiple angle transitions under one rAF loop for micro-optimizations).
359
- - Auto-prefetch “snap if > threshold degrees” heuristic inside helpers (today caller decides).
360
-
361
- ---
362
-
package/eslint.config.js DELETED
@@ -1,45 +0,0 @@
1
- // @ts-check
2
- const eslint = require("@eslint/js");
3
- const tseslint = require("typescript-eslint");
4
- const angular = require("angular-eslint");
5
-
6
- module.exports = tseslint.config(
7
- {
8
- files: ["**/*.ts"],
9
- extends: [
10
- eslint.configs.recommended,
11
- ...tseslint.configs.recommended,
12
- ...tseslint.configs.stylistic,
13
- ...angular.configs.tsRecommended,
14
- ],
15
- processor: angular.processInlineTemplates,
16
- rules: {
17
- "@typescript-eslint/no-empty-function": ["off"],
18
- "@angular-eslint/directive-selector": [
19
- "off",
20
- {
21
- type: "attribute",
22
- prefix: "app",
23
- style: "camelCase",
24
- },
25
- ],
26
- "@angular-eslint/component-selector": [
27
- "off",
28
- {
29
- type: "element",
30
- prefix: "app",
31
- style: "kebab-case",
32
- },
33
- ],
34
- '@typescript-eslint/no-explicit-any': 'error', // Forbid usage of 'any'
35
- },
36
- },
37
- {
38
- files: ["**/*.html"],
39
- extends: [
40
- ...angular.configs.templateRecommended,
41
- ...angular.configs.templateAccessibility,
42
- ],
43
- rules: {},
44
- }
45
- );
@@ -1,53 +0,0 @@
1
- import { Delta, Path, Plugin, ServerAPI, Value } from '@signalk/server-api'
2
-
3
- export default (app: ServerAPI): Plugin => {
4
- const displaysPath = 'displays.*';
5
- const context = 'vessels.self';
6
-
7
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
8
- function displayPutHandler(context: string, path: string, value: Value, callback?: unknown): { state: 'COMPLETED'; statusCode: number; message?: string } {
9
- app.debug(`PUT handler called for context ${context}, path ${path}, value ${value}`);
10
- try {
11
- const delta: Delta = {
12
- updates: [
13
- {
14
- values: [
15
- {
16
- path: path as Path,
17
- value: value
18
- }
19
- ]
20
- }
21
- ]
22
- };
23
- app.debug(`Sending message: `, JSON.stringify(delta));
24
- app.handleMessage(plugin.id, delta);
25
- return { state: "COMPLETED" as const, statusCode: 200 };
26
-
27
- } catch (error) {
28
- app.error(`Error in PUT handler: ${error}`);
29
- return { state: "COMPLETED" as const, statusCode: 400, message: (error as Error).message };
30
- }
31
- }
32
-
33
- const plugin: Plugin = {
34
- id: 'kip',
35
- name: 'KIP',
36
- description: 'KIP server plugin',
37
- start: (settings) => {
38
- app.debug(`Starting plugin with settings: ${JSON.stringify(settings)}`);
39
- app.registerPutHandler(context, displaysPath, displayPutHandler);
40
- },
41
- stop: () => {
42
- app.debug(`Stopping plugin`);
43
- },
44
- schema: () => {
45
- return {
46
- type: "object",
47
- properties: {}
48
- };
49
- }
50
- };
51
-
52
- return plugin;
53
- }
@@ -1,13 +0,0 @@
1
- /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
2
- {
3
- "extends": "../tsconfig.json",
4
- "compilerOptions": {
5
- "outDir": "../plugin",
6
- "types": [],
7
- "resolveJsonModule": true,
8
- "sourceMap": false,
9
- "module": "commonjs",
10
- "moduleResolution": "node"
11
- },
12
- "include": ["./src/*.*"]
13
- }
@@ -1,2 +0,0 @@
1
- import{a as Xe,b as et,e as mt,f as ut,g as ft,h as vt,i as Dt,j as bt,l as wt,m as Pt,o as St,p as yt,q as xt}from"./chunk-S7BCYLTC.js";import"./chunk-TDHAZ7DS.js";import"./chunk-BZF6OYAF.js";import{d as Qe}from"./chunk-PTADMSJZ.js";import{a as at}from"./chunk-FWG5JGYN.js";import{b as gt}from"./chunk-GJ33QBJ6.js";import"./chunk-HKUJILH7.js";import{$b as ce,$d as ve,A as Ne,Aa as ze,Ab as qe,Ad as ue,Ae as _t,Ba as ne,Bb as I,Cb as p,Cd as x,Db as g,Eb as U,Fa as re,Fd as st,Hd as nt,Id as rt,J as Ae,Ja as Ve,Jc as ge,K as G,Lb as W,Lc as O,Ma as oe,Mc as Ye,Nb as u,Pb as y,Pd as ot,R as Fe,Va as ae,Wa as w,Wd as fe,Ya as le,Yd as M,Zd as L,_b as Ke,ab as Ge,bc as Z,cc as f,dc as he,ea as ie,eb as R,fa as He,fe as lt,g as T,ga as A,gb as de,ha as Be,he as dt,ie as ct,j as te,ke as ht,m as _,ma as se,mb as P,md as me,me as q,nb as $,o as Me,ob as $e,pa as k,pc as pe,q as Le,ra as c,rd as Je,td as tt,ub as Ue,ud as it,vb as We,vd as j,wa as E,wb as Ze,xa as C,xd as F,ye as pt,zb as je,zc as _e}from"./chunk-FW2LAMAA.js";function we(r){let t=r.cloneNode(!0),e=t.querySelectorAll("[id]"),i=r.nodeName.toLowerCase();t.removeAttribute("id");for(let s=0;s<e.length;s++)e[s].removeAttribute("id");return i==="canvas"?Rt(r,t):(i==="input"||i==="select"||i==="textarea")&&Ct(r,t),Et("canvas",r,t,Rt),Et("input, textarea, select",r,t,Ct),t}function Et(r,t,e,i){let s=t.querySelectorAll(r);if(s.length){let n=e.querySelectorAll(r);for(let o=0;o<s.length;o++)i(s[o],n[o])}}var ni=0;function Ct(r,t){t.type!=="file"&&(t.value=r.value),t.type==="radio"&&t.name&&(t.name=`mat-clone-${t.name}-${ni++}`)}function Rt(r,t){let e=t.getContext("2d");if(e)try{e.drawImage(r,0,0)}catch{}}function Re(r){let t=r.getBoundingClientRect();return{top:t.top,right:t.right,bottom:t.bottom,left:t.left,width:t.width,height:t.height,x:t.x,y:t.y}}function Pe(r,t,e){let{top:i,bottom:s,left:n,right:o}=r;return e>=i&&e<=s&&t>=n&&t<=o}function ri(r,t){let e=t.left<r.left,i=t.left+t.width>r.right,s=t.top<r.top,n=t.top+t.height>r.bottom;return e||i||s||n}function z(r,t,e){r.top+=t,r.bottom=r.top+r.height,r.left+=e,r.right=r.left+r.width}function It(r,t,e,i){let{top:s,right:n,bottom:o,left:a,width:l,height:d}=r,h=l*t,v=d*t;return i>s-v&&i<o+v&&e>a-h&&e<n+h}var K=class{_document;positions=new Map;constructor(t){this._document=t}clear(){this.positions.clear()}cache(t){this.clear(),this.positions.set(this._document,{scrollPosition:this.getViewportScrollPosition()}),t.forEach(e=>{this.positions.set(e,{scrollPosition:{top:e.scrollTop,left:e.scrollLeft},clientRect:Re(e)})})}handleScroll(t){let e=F(t),i=this.positions.get(e);if(!i)return null;let s=i.scrollPosition,n,o;if(e===this._document){let d=this.getViewportScrollPosition();n=d.top,o=d.left}else n=e.scrollTop,o=e.scrollLeft;let a=s.top-n,l=s.left-o;return this.positions.forEach((d,h)=>{d.clientRect&&e!==h&&e.contains(h)&&z(d.clientRect,a,l)}),s.top=n,s.left=o,{top:a,left:l}}getViewportScrollPosition(){return{top:window.scrollY,left:window.scrollX}}};function Gt(r,t){let e=r.rootNodes;if(e.length===1&&e[0].nodeType===t.ELEMENT_NODE)return e[0];let i=t.createElement("div");return e.forEach(s=>i.appendChild(s)),i}function Ie(r,t,e){for(let i in t)if(t.hasOwnProperty(i)){let s=t[i];s?r.setProperty(i,s,e?.has(i)?"important":""):r.removeProperty(i)}return r}function N(r,t){let e=t?"":"none";Ie(r.style,{"touch-action":t?"":"none","-webkit-user-drag":t?"":"none","-webkit-tap-highlight-color":t?"":"transparent","user-select":e,"-ms-user-select":e,"-webkit-user-select":e,"-moz-user-select":e})}function Tt(r,t,e){Ie(r.style,{position:t?"":"fixed",top:t?"":"0",opacity:t?"":"0",left:t?"":"-999em"},e)}function Y(r,t){return t&&t!="none"?r+" "+t:r}function kt(r,t){r.style.width=`${t.width}px`,r.style.height=`${t.height}px`,r.style.transform=V(t.left,t.top)}function V(r,t){return`translate3d(${Math.round(r)}px, ${Math.round(t)}px, 0)`}function Ot(r){let t=r.toLowerCase().indexOf("ms")>-1?1:1e3;return parseFloat(r)*t}function oi(r){let t=getComputedStyle(r),e=De(t,"transition-property"),i=e.find(a=>a==="transform"||a==="all");if(!i)return 0;let s=e.indexOf(i),n=De(t,"transition-duration"),o=De(t,"transition-delay");return Ot(n[s])+Ot(o[s])}function De(r,t){return r.getPropertyValue(t).split(",").map(i=>i.trim())}var ai=new Set(["position"]),Se=class{_document;_rootElement;_direction;_initialDomRect;_previewTemplate;_previewClass;_pickupPositionOnPage;_initialTransform;_zIndex;_renderer;_previewEmbeddedView;_preview;get element(){return this._preview}constructor(t,e,i,s,n,o,a,l,d,h){this._document=t,this._rootElement=e,this._direction=i,this._initialDomRect=s,this._previewTemplate=n,this._previewClass=o,this._pickupPositionOnPage=a,this._initialTransform=l,this._zIndex=d,this._renderer=h}attach(t){this._preview=this._createPreview(),t.appendChild(this._preview),Mt(this._preview)&&this._preview.showPopover()}destroy(){this._preview.remove(),this._previewEmbeddedView?.destroy(),this._preview=this._previewEmbeddedView=null}setTransform(t){this._preview.style.transform=t}getBoundingClientRect(){return this._preview.getBoundingClientRect()}addClass(t){this._preview.classList.add(t)}getTransitionDuration(){return oi(this._preview)}addEventListener(t,e){return this._renderer.listen(this._preview,t,e)}_createPreview(){let t=this._previewTemplate,e=this._previewClass,i=t?t.template:null,s;if(i&&t){let n=t.matchSize?this._initialDomRect:null,o=t.viewContainer.createEmbeddedView(i,t.context);o.detectChanges(),s=Gt(o,this._document),this._previewEmbeddedView=o,t.matchSize?kt(s,n):s.style.transform=V(this._pickupPositionOnPage.x,this._pickupPositionOnPage.y)}else s=we(this._rootElement),kt(s,this._initialDomRect),this._initialTransform&&(s.style.transform=this._initialTransform);return Ie(s.style,{"pointer-events":"none",margin:Mt(s)?"0 auto 0 0":"0",position:"fixed",top:"0",left:"0","z-index":this._zIndex+""},ai),N(s,!1),s.classList.add("cdk-drag-preview"),s.setAttribute("popover","manual"),s.setAttribute("dir",this._direction),e&&(Array.isArray(e)?e.forEach(n=>s.classList.add(n)):s.classList.add(e)),s}};function Mt(r){return"showPopover"in r}var li={passive:!0},Lt={passive:!1},di={passive:!1,capture:!0},ci=800,Nt="cdk-drag-placeholder",At=new Set(["position"]),ye=class{_config;_document;_ngZone;_viewportRuler;_dragDropRegistry;_renderer;_rootElementCleanups;_cleanupShadowRootSelectStart;_preview;_previewContainer;_placeholderRef;_placeholder;_pickupPositionInElement;_pickupPositionOnPage;_marker;_anchor=null;_passiveTransform={x:0,y:0};_activeTransform={x:0,y:0};_initialTransform;_hasStartedDragging=re(!1);_hasMoved;_initialContainer;_initialIndex;_parentPositions;_moveEvents=new _;_pointerDirectionDelta;_pointerPositionAtLastDirectionChange;_lastKnownPointerPosition;_rootElement;_ownerSVGElement;_rootElementTapHighlight;_pointerMoveSubscription=T.EMPTY;_pointerUpSubscription=T.EMPTY;_scrollSubscription=T.EMPTY;_resizeSubscription=T.EMPTY;_lastTouchEventTime;_dragStartTime;_boundaryElement=null;_nativeInteractionsEnabled=!0;_initialDomRect;_previewRect;_boundaryRect;_previewTemplate;_placeholderTemplate;_handles=[];_disabledHandles=new Set;_dropContainer;_direction="ltr";_parentDragRef;_cachedShadowRoot;lockAxis;dragStartDelay=0;previewClass;scale=1;get disabled(){return this._disabled||!!(this._dropContainer&&this._dropContainer.disabled)}set disabled(t){t!==this._disabled&&(this._disabled=t,this._toggleNativeDragInteractions(),this._handles.forEach(e=>N(e,t)))}_disabled=!1;beforeStarted=new _;started=new _;released=new _;ended=new _;entered=new _;exited=new _;dropped=new _;moved=this._moveEvents;data;constrainPosition;constructor(t,e,i,s,n,o,a){this._config=e,this._document=i,this._ngZone=s,this._viewportRuler=n,this._dragDropRegistry=o,this._renderer=a,this.withRootElement(t).withParent(e.parentDragRef||null),this._parentPositions=new K(i),o.registerDragItem(this)}getPlaceholderElement(){return this._placeholder}getRootElement(){return this._rootElement}getVisibleElement(){return this.isDragging()?this.getPlaceholderElement():this.getRootElement()}withHandles(t){this._handles=t.map(i=>x(i)),this._handles.forEach(i=>N(i,this.disabled)),this._toggleNativeDragInteractions();let e=new Set;return this._disabledHandles.forEach(i=>{this._handles.indexOf(i)>-1&&e.add(i)}),this._disabledHandles=e,this}withPreviewTemplate(t){return this._previewTemplate=t,this}withPlaceholderTemplate(t){return this._placeholderTemplate=t,this}withRootElement(t){let e=x(t);if(e!==this._rootElement){this._removeRootElementListeners();let i=this._renderer;this._rootElementCleanups=this._ngZone.runOutsideAngular(()=>[i.listen(e,"mousedown",this._pointerDown,Lt),i.listen(e,"touchstart",this._pointerDown,li),i.listen(e,"dragstart",this._nativeDragStart,Lt)]),this._initialTransform=void 0,this._rootElement=e}return typeof SVGElement<"u"&&this._rootElement instanceof SVGElement&&(this._ownerSVGElement=this._rootElement.ownerSVGElement),this}withBoundaryElement(t){return this._boundaryElement=t?x(t):null,this._resizeSubscription.unsubscribe(),t&&(this._resizeSubscription=this._viewportRuler.change(10).subscribe(()=>this._containInsideBoundaryOnResize())),this}withParent(t){return this._parentDragRef=t,this}dispose(){this._removeRootElementListeners(),this.isDragging()&&this._rootElement?.remove(),this._marker?.remove(),this._destroyPreview(),this._destroyPlaceholder(),this._dragDropRegistry.removeDragItem(this),this._removeListeners(),this.beforeStarted.complete(),this.started.complete(),this.released.complete(),this.ended.complete(),this.entered.complete(),this.exited.complete(),this.dropped.complete(),this._moveEvents.complete(),this._handles=[],this._disabledHandles.clear(),this._dropContainer=void 0,this._resizeSubscription.unsubscribe(),this._parentPositions.clear(),this._boundaryElement=this._rootElement=this._ownerSVGElement=this._placeholderTemplate=this._previewTemplate=this._marker=this._parentDragRef=null}isDragging(){return this._hasStartedDragging()&&this._dragDropRegistry.isDragging(this)}reset(){this._rootElement.style.transform=this._initialTransform||"",this._activeTransform={x:0,y:0},this._passiveTransform={x:0,y:0}}resetToBoundary(){if(this._boundaryElement&&this._rootElement&&ri(this._boundaryElement.getBoundingClientRect(),this._rootElement.getBoundingClientRect())){let t=this._boundaryElement.getBoundingClientRect(),e=this._rootElement.getBoundingClientRect(),i=0,s=0;e.left<t.left?i=t.left-e.left:e.right>t.right&&(i=t.right-e.right),e.top<t.top?s=t.top-e.top:e.bottom>t.bottom&&(s=t.bottom-e.bottom);let n=this._activeTransform.x,o=this._activeTransform.y,a=n+i,l=o+s;this._rootElement.style.transform=V(a,l),this._activeTransform={x:a,y:l},this._passiveTransform={x:a,y:l}}}disableHandle(t){!this._disabledHandles.has(t)&&this._handles.indexOf(t)>-1&&(this._disabledHandles.add(t),N(t,!0))}enableHandle(t){this._disabledHandles.has(t)&&(this._disabledHandles.delete(t),N(t,this.disabled))}withDirection(t){return this._direction=t,this}_withDropContainer(t){this._dropContainer=t}getFreeDragPosition(){let t=this.isDragging()?this._activeTransform:this._passiveTransform;return{x:t.x,y:t.y}}setFreeDragPosition(t){return this._activeTransform={x:0,y:0},this._passiveTransform.x=t.x,this._passiveTransform.y=t.y,this._dropContainer||this._applyRootElementTransform(t.x,t.y),this}withPreviewContainer(t){return this._previewContainer=t,this}_sortFromLastPointerPosition(){let t=this._lastKnownPointerPosition;t&&this._dropContainer&&this._updateActiveDropContainer(this._getConstrainedPointerPosition(t),t)}_removeListeners(){this._pointerMoveSubscription.unsubscribe(),this._pointerUpSubscription.unsubscribe(),this._scrollSubscription.unsubscribe(),this._cleanupShadowRootSelectStart?.(),this._cleanupShadowRootSelectStart=void 0}_destroyPreview(){this._preview?.destroy(),this._preview=null}_destroyPlaceholder(){this._anchor?.remove(),this._placeholder?.remove(),this._placeholderRef?.destroy(),this._placeholder=this._anchor=this._placeholderRef=null}_pointerDown=t=>{if(this.beforeStarted.next(),this._handles.length){let e=this._getTargetHandle(t);e&&!this._disabledHandles.has(e)&&!this.disabled&&this._initializeDragSequence(e,t)}else this.disabled||this._initializeDragSequence(this._rootElement,t)};_pointerMove=t=>{let e=this._getPointerPositionOnPage(t);if(!this._hasStartedDragging()){let s=Math.abs(e.x-this._pickupPositionOnPage.x),n=Math.abs(e.y-this._pickupPositionOnPage.y);if(s+n>=this._config.dragStartThreshold){let a=Date.now()>=this._dragStartTime+this._getDragStartDelay(t),l=this._dropContainer;if(!a){this._endDragSequence(t);return}(!l||!l.isDragging()&&!l.isReceiving())&&(t.cancelable&&t.preventDefault(),this._hasStartedDragging.set(!0),this._ngZone.run(()=>this._startDragSequence(t)))}return}t.cancelable&&t.preventDefault();let i=this._getConstrainedPointerPosition(e);if(this._hasMoved=!0,this._lastKnownPointerPosition=e,this._updatePointerDirectionDelta(i),this._dropContainer)this._updateActiveDropContainer(i,e);else{let s=this.constrainPosition?this._initialDomRect:this._pickupPositionOnPage,n=this._activeTransform;n.x=i.x-s.x+this._passiveTransform.x,n.y=i.y-s.y+this._passiveTransform.y,this._applyRootElementTransform(n.x,n.y)}this._moveEvents.observers.length&&this._ngZone.run(()=>{this._moveEvents.next({source:this,pointerPosition:i,event:t,distance:this._getDragDistance(i),delta:this._pointerDirectionDelta})})};_pointerUp=t=>{this._endDragSequence(t)};_endDragSequence(t){if(this._dragDropRegistry.isDragging(this)&&(this._removeListeners(),this._dragDropRegistry.stopDragging(this),this._toggleNativeDragInteractions(),this._handles&&(this._rootElement.style.webkitTapHighlightColor=this._rootElementTapHighlight),!!this._hasStartedDragging()))if(this.released.next({source:this,event:t}),this._dropContainer)this._dropContainer._stopScrolling(),this._animatePreviewToPlaceholder().then(()=>{this._cleanupDragArtifacts(t),this._cleanupCachedDimensions(),this._dragDropRegistry.stopDragging(this)});else{this._passiveTransform.x=this._activeTransform.x;let e=this._getPointerPositionOnPage(t);this._passiveTransform.y=this._activeTransform.y,this._ngZone.run(()=>{this.ended.next({source:this,distance:this._getDragDistance(e),dropPoint:e,event:t})}),this._cleanupCachedDimensions(),this._dragDropRegistry.stopDragging(this)}}_startDragSequence(t){H(t)&&(this._lastTouchEventTime=Date.now()),this._toggleNativeDragInteractions();let e=this._getShadowRoot(),i=this._dropContainer;if(e&&this._ngZone.runOutsideAngular(()=>{this._cleanupShadowRootSelectStart=this._renderer.listen(e,"selectstart",hi,di)}),i){let s=this._rootElement,n=s.parentNode,o=this._placeholder=this._createPlaceholderElement(),a=this._marker=this._marker||this._document.createComment("");n.insertBefore(a,s),this._initialTransform=s.style.transform||"",this._preview=new Se(this._document,this._rootElement,this._direction,this._initialDomRect,this._previewTemplate||null,this.previewClass||null,this._pickupPositionOnPage,this._initialTransform,this._config.zIndex||1e3,this._renderer),this._preview.attach(this._getPreviewInsertionPoint(n,e)),Tt(s,!1,At),this._document.body.appendChild(n.replaceChild(o,s)),this.started.next({source:this,event:t}),i.start(),this._initialContainer=i,this._initialIndex=i.getItemIndex(this)}else this.started.next({source:this,event:t}),this._initialContainer=this._initialIndex=void 0;this._parentPositions.cache(i?i.getScrollableParents():[])}_initializeDragSequence(t,e){this._parentDragRef&&e.stopPropagation();let i=this.isDragging(),s=H(e),n=!s&&e.button!==0,o=this._rootElement,a=F(e),l=!s&&this._lastTouchEventTime&&this._lastTouchEventTime+ci>Date.now(),d=s?it(e):tt(e);if(a&&a.draggable&&e.type==="mousedown"&&e.preventDefault(),i||n||l||d)return;if(this._handles.length){let S=o.style;this._rootElementTapHighlight=S.webkitTapHighlightColor||"",S.webkitTapHighlightColor="transparent"}this._hasMoved=!1,this._hasStartedDragging.set(this._hasMoved),this._removeListeners(),this._initialDomRect=this._rootElement.getBoundingClientRect(),this._pointerMoveSubscription=this._dragDropRegistry.pointerMove.subscribe(this._pointerMove),this._pointerUpSubscription=this._dragDropRegistry.pointerUp.subscribe(this._pointerUp),this._scrollSubscription=this._dragDropRegistry.scrolled(this._getShadowRoot()).subscribe(S=>this._updateOnScroll(S)),this._boundaryElement&&(this._boundaryRect=Re(this._boundaryElement));let h=this._previewTemplate;this._pickupPositionInElement=h&&h.template&&!h.matchSize?{x:0,y:0}:this._getPointerPositionInElement(this._initialDomRect,t,e);let v=this._pickupPositionOnPage=this._lastKnownPointerPosition=this._getPointerPositionOnPage(e);this._pointerDirectionDelta={x:0,y:0},this._pointerPositionAtLastDirectionChange={x:v.x,y:v.y},this._dragStartTime=Date.now(),this._dragDropRegistry.startDragging(this,e)}_cleanupDragArtifacts(t){Tt(this._rootElement,!0,At),this._marker.parentNode.replaceChild(this._rootElement,this._marker),this._destroyPreview(),this._destroyPlaceholder(),this._initialDomRect=this._boundaryRect=this._previewRect=this._initialTransform=void 0,this._ngZone.run(()=>{let e=this._dropContainer,i=e.getItemIndex(this),s=this._getPointerPositionOnPage(t),n=this._getDragDistance(s),o=e._isOverContainer(s.x,s.y);this.ended.next({source:this,distance:n,dropPoint:s,event:t}),this.dropped.next({item:this,currentIndex:i,previousIndex:this._initialIndex,container:e,previousContainer:this._initialContainer,isPointerOverContainer:o,distance:n,dropPoint:s,event:t}),e.drop(this,i,this._initialIndex,this._initialContainer,o,n,s,t),this._dropContainer=this._initialContainer})}_updateActiveDropContainer({x:t,y:e},{x:i,y:s}){let n=this._initialContainer._getSiblingContainerFromPosition(this,t,e);!n&&this._dropContainer!==this._initialContainer&&this._initialContainer._isOverContainer(t,e)&&(n=this._initialContainer),n&&n!==this._dropContainer&&this._ngZone.run(()=>{let o=this._dropContainer.getItemIndex(this),a=this._dropContainer.getItemAtIndex(o+1)?.getVisibleElement()||null;this.exited.next({item:this,container:this._dropContainer}),this._dropContainer.exit(this),this._conditionallyInsertAnchor(n,this._dropContainer,a),this._dropContainer=n,this._dropContainer.enter(this,t,e,n===this._initialContainer&&n.sortingDisabled?this._initialIndex:void 0),this.entered.next({item:this,container:n,currentIndex:n.getItemIndex(this)})}),this.isDragging()&&(this._dropContainer._startScrollingIfNecessary(i,s),this._dropContainer._sortItem(this,t,e,this._pointerDirectionDelta),this.constrainPosition?this._applyPreviewTransform(t,e):this._applyPreviewTransform(t-this._pickupPositionInElement.x,e-this._pickupPositionInElement.y))}_animatePreviewToPlaceholder(){if(!this._hasMoved)return Promise.resolve();let t=this._placeholder.getBoundingClientRect();this._preview.addClass("cdk-drag-animating"),this._applyPreviewTransform(t.left,t.top);let e=this._preview.getTransitionDuration();return e===0?Promise.resolve():this._ngZone.runOutsideAngular(()=>new Promise(i=>{let s=a=>{(!a||this._preview&&F(a)===this._preview.element&&a.propertyName==="transform")&&(o(),i(),clearTimeout(n))},n=setTimeout(s,e*1.5),o=this._preview.addEventListener("transitionend",s)}))}_createPlaceholderElement(){let t=this._placeholderTemplate,e=t?t.template:null,i;return e?(this._placeholderRef=t.viewContainer.createEmbeddedView(e,t.context),this._placeholderRef.detectChanges(),i=Gt(this._placeholderRef,this._document)):i=we(this._rootElement),i.style.pointerEvents="none",i.classList.add(Nt),i}_getPointerPositionInElement(t,e,i){let s=e===this._rootElement?null:e,n=s?s.getBoundingClientRect():t,o=H(i)?i.targetTouches[0]:i,a=this._getViewportScrollPosition(),l=o.pageX-n.left-a.left,d=o.pageY-n.top-a.top;return{x:n.left-t.left+l,y:n.top-t.top+d}}_getPointerPositionOnPage(t){let e=this._getViewportScrollPosition(),i=H(t)?t.touches[0]||t.changedTouches[0]||{pageX:0,pageY:0}:t,s=i.pageX-e.left,n=i.pageY-e.top;if(this._ownerSVGElement){let o=this._ownerSVGElement.getScreenCTM();if(o){let a=this._ownerSVGElement.createSVGPoint();return a.x=s,a.y=n,a.matrixTransform(o.inverse())}}return{x:s,y:n}}_getConstrainedPointerPosition(t){let e=this._dropContainer?this._dropContainer.lockAxis:null,{x:i,y:s}=this.constrainPosition?this.constrainPosition(t,this,this._initialDomRect,this._pickupPositionInElement):t;if(this.lockAxis==="x"||e==="x"?s=this._pickupPositionOnPage.y-(this.constrainPosition?this._pickupPositionInElement.y:0):(this.lockAxis==="y"||e==="y")&&(i=this._pickupPositionOnPage.x-(this.constrainPosition?this._pickupPositionInElement.x:0)),this._boundaryRect){let{x:n,y:o}=this.constrainPosition?{x:0,y:0}:this._pickupPositionInElement,a=this._boundaryRect,{width:l,height:d}=this._getPreviewRect(),h=a.top+o,v=a.bottom-(d-o),S=a.left+n,Q=a.right-(l-n);i=Ft(i,S,Q),s=Ft(s,h,v)}return{x:i,y:s}}_updatePointerDirectionDelta(t){let{x:e,y:i}=t,s=this._pointerDirectionDelta,n=this._pointerPositionAtLastDirectionChange,o=Math.abs(e-n.x),a=Math.abs(i-n.y);return o>this._config.pointerDirectionChangeThreshold&&(s.x=e>n.x?1:-1,n.x=e),a>this._config.pointerDirectionChangeThreshold&&(s.y=i>n.y?1:-1,n.y=i),s}_toggleNativeDragInteractions(){if(!this._rootElement||!this._handles)return;let t=this._handles.length>0||!this.isDragging();t!==this._nativeInteractionsEnabled&&(this._nativeInteractionsEnabled=t,N(this._rootElement,t))}_removeRootElementListeners(){this._rootElementCleanups?.forEach(t=>t()),this._rootElementCleanups=void 0}_applyRootElementTransform(t,e){let i=1/this.scale,s=V(t*i,e*i),n=this._rootElement.style;this._initialTransform==null&&(this._initialTransform=n.transform&&n.transform!="none"?n.transform:""),n.transform=Y(s,this._initialTransform)}_applyPreviewTransform(t,e){let i=this._previewTemplate?.template?void 0:this._initialTransform,s=V(t,e);this._preview.setTransform(Y(s,i))}_getDragDistance(t){let e=this._pickupPositionOnPage;return e?{x:t.x-e.x,y:t.y-e.y}:{x:0,y:0}}_cleanupCachedDimensions(){this._boundaryRect=this._previewRect=void 0,this._parentPositions.clear()}_containInsideBoundaryOnResize(){let{x:t,y:e}=this._passiveTransform;if(t===0&&e===0||this.isDragging()||!this._boundaryElement)return;let i=this._rootElement.getBoundingClientRect(),s=this._boundaryElement.getBoundingClientRect();if(s.width===0&&s.height===0||i.width===0&&i.height===0)return;let n=s.left-i.left,o=i.right-s.right,a=s.top-i.top,l=i.bottom-s.bottom;s.width>i.width?(n>0&&(t+=n),o>0&&(t-=o)):t=0,s.height>i.height?(a>0&&(e+=a),l>0&&(e-=l)):e=0,(t!==this._passiveTransform.x||e!==this._passiveTransform.y)&&this.setFreeDragPosition({y:e,x:t})}_getDragStartDelay(t){let e=this.dragStartDelay;return typeof e=="number"?e:H(t)?e.touch:e?e.mouse:0}_updateOnScroll(t){let e=this._parentPositions.handleScroll(t);if(e){let i=F(t);this._boundaryRect&&i!==this._boundaryElement&&i.contains(this._boundaryElement)&&z(this._boundaryRect,e.top,e.left),this._pickupPositionOnPage.x+=e.left,this._pickupPositionOnPage.y+=e.top,this._dropContainer||(this._activeTransform.x-=e.left,this._activeTransform.y-=e.top,this._applyRootElementTransform(this._activeTransform.x,this._activeTransform.y))}}_getViewportScrollPosition(){return this._parentPositions.positions.get(this._document)?.scrollPosition||this._parentPositions.getViewportScrollPosition()}_getShadowRoot(){return this._cachedShadowRoot===void 0&&(this._cachedShadowRoot=j(this._rootElement)),this._cachedShadowRoot}_getPreviewInsertionPoint(t,e){let i=this._previewContainer||"global";if(i==="parent")return t;if(i==="global"){let s=this._document;return e||s.fullscreenElement||s.webkitFullscreenElement||s.mozFullScreenElement||s.msFullscreenElement||s.body}return x(i)}_getPreviewRect(){return(!this._previewRect||!this._previewRect.width&&!this._previewRect.height)&&(this._previewRect=this._preview?this._preview.getBoundingClientRect():this._initialDomRect),this._previewRect}_nativeDragStart=t=>{if(this._handles.length){let e=this._getTargetHandle(t);e&&!this._disabledHandles.has(e)&&!this.disabled&&t.preventDefault()}else this.disabled||t.preventDefault()};_getTargetHandle(t){return this._handles.find(e=>t.target&&(t.target===e||e.contains(t.target)))}_conditionallyInsertAnchor(t,e,i){if(t===this._initialContainer)this._anchor?.remove(),this._anchor=null;else if(e===this._initialContainer&&e.hasAnchor){let s=this._anchor??=we(this._placeholder);s.classList.remove(Nt),s.classList.add("cdk-drag-anchor"),s.style.transform="",i?i.before(s):x(e.element).appendChild(s)}}};function Ft(r,t,e){return Math.max(t,Math.min(e,r))}function H(r){return r.type[0]==="t"}function hi(r){r.preventDefault()}function J(r,t,e){let i=Ht(t,r.length-1),s=Ht(e,r.length-1);if(i===s)return;let n=r[i],o=s<i?-1:1;for(let a=i;a!==s;a+=o)r[a]=r[a+o];r[s]=n}function Ht(r,t){return Math.max(0,Math.min(t,r))}var X=class{_dragDropRegistry;_element;_sortPredicate;_itemPositions=[];_activeDraggables;orientation="vertical";direction;constructor(t){this._dragDropRegistry=t}_previousSwap={drag:null,delta:0,overlaps:!1};start(t){this.withItems(t)}sort(t,e,i,s){let n=this._itemPositions,o=this._getItemIndexFromPointerPosition(t,e,i,s);if(o===-1&&n.length>0)return null;let a=this.orientation==="horizontal",l=n.findIndex(D=>D.drag===t),d=n[o],h=n[l].clientRect,v=d.clientRect,S=l>o?1:-1,Q=this._getItemOffsetPx(h,v,S),ti=this._getSiblingOffsetPx(l,n,S),ii=n.slice();return J(n,l,o),n.forEach((D,si)=>{if(ii[si]===D)return;let Te=D.drag===t,ee=Te?Q:ti,ke=Te?t.getPlaceholderElement():D.drag.getRootElement();D.offset+=ee;let Oe=Math.round(D.offset*(1/D.drag.scale));a?(ke.style.transform=Y(`translate3d(${Oe}px, 0, 0)`,D.initialTransform),z(D.clientRect,0,ee)):(ke.style.transform=Y(`translate3d(0, ${Oe}px, 0)`,D.initialTransform),z(D.clientRect,ee,0))}),this._previousSwap.overlaps=Pe(v,e,i),this._previousSwap.drag=d.drag,this._previousSwap.delta=a?s.x:s.y,{previousIndex:l,currentIndex:o}}enter(t,e,i,s){let n=s==null||s<0?this._getItemIndexFromPointerPosition(t,e,i):s,o=this._activeDraggables,a=o.indexOf(t),l=t.getPlaceholderElement(),d=o[n];if(d===t&&(d=o[n+1]),!d&&(n==null||n===-1||n<o.length-1)&&this._shouldEnterAsFirstChild(e,i)&&(d=o[0]),a>-1&&o.splice(a,1),d&&!this._dragDropRegistry.isDragging(d)){let h=d.getRootElement();h.parentElement.insertBefore(l,h),o.splice(n,0,t)}else this._element.appendChild(l),o.push(t);l.style.transform="",this._cacheItemPositions()}withItems(t){this._activeDraggables=t.slice(),this._cacheItemPositions()}withSortPredicate(t){this._sortPredicate=t}reset(){this._activeDraggables?.forEach(t=>{let e=t.getRootElement();if(e){let i=this._itemPositions.find(s=>s.drag===t)?.initialTransform;e.style.transform=i||""}}),this._itemPositions=[],this._activeDraggables=[],this._previousSwap.drag=null,this._previousSwap.delta=0,this._previousSwap.overlaps=!1}getActiveItemsSnapshot(){return this._activeDraggables}getItemIndex(t){return this._getVisualItemPositions().findIndex(e=>e.drag===t)}getItemAtIndex(t){return this._getVisualItemPositions()[t]?.drag||null}updateOnScroll(t,e){this._itemPositions.forEach(({clientRect:i})=>{z(i,t,e)}),this._itemPositions.forEach(({drag:i})=>{this._dragDropRegistry.isDragging(i)&&i._sortFromLastPointerPosition()})}withElementContainer(t){this._element=t}_cacheItemPositions(){let t=this.orientation==="horizontal";this._itemPositions=this._activeDraggables.map(e=>{let i=e.getVisibleElement();return{drag:e,offset:0,initialTransform:i.style.transform||"",clientRect:Re(i)}}).sort((e,i)=>t?e.clientRect.left-i.clientRect.left:e.clientRect.top-i.clientRect.top)}_getVisualItemPositions(){return this.orientation==="horizontal"&&this.direction==="rtl"?this._itemPositions.slice().reverse():this._itemPositions}_getItemOffsetPx(t,e,i){let s=this.orientation==="horizontal",n=s?e.left-t.left:e.top-t.top;return i===-1&&(n+=s?e.width-t.width:e.height-t.height),n}_getSiblingOffsetPx(t,e,i){let s=this.orientation==="horizontal",n=e[t].clientRect,o=e[t+i*-1],a=n[s?"width":"height"]*i;if(o){let l=s?"left":"top",d=s?"right":"bottom";i===-1?a-=o.clientRect[l]-n[d]:a+=n[l]-o.clientRect[d]}return a}_shouldEnterAsFirstChild(t,e){if(!this._activeDraggables.length)return!1;let i=this._itemPositions,s=this.orientation==="horizontal";if(i[0].drag!==this._activeDraggables[0]){let o=i[i.length-1].clientRect;return s?t>=o.right:e>=o.bottom}else{let o=i[0].clientRect;return s?t<=o.left:e<=o.top}}_getItemIndexFromPointerPosition(t,e,i,s){let n=this.orientation==="horizontal",o=this._itemPositions.findIndex(({drag:a,clientRect:l})=>{if(a===t)return!1;if(s){let d=n?s.x:s.y;if(a===this._previousSwap.drag&&this._previousSwap.overlaps&&d===this._previousSwap.delta)return!1}return n?e>=Math.floor(l.left)&&e<Math.floor(l.right):i>=Math.floor(l.top)&&i<Math.floor(l.bottom)});return o===-1||!this._sortPredicate(o,t)?-1:o}},xe=class{_document;_dragDropRegistry;_element;_sortPredicate;_rootNode;_activeItems;_previousSwap={drag:null,deltaX:0,deltaY:0,overlaps:!1};_relatedNodes=[];constructor(t,e){this._document=t,this._dragDropRegistry=e}start(t){let e=this._element.childNodes;this._relatedNodes=[];for(let i=0;i<e.length;i++){let s=e[i];this._relatedNodes.push([s,s.nextSibling])}this.withItems(t)}sort(t,e,i,s){let n=this._getItemIndexFromPointerPosition(t,e,i),o=this._previousSwap;if(n===-1||this._activeItems[n]===t)return null;let a=this._activeItems[n];if(o.drag===a&&o.overlaps&&o.deltaX===s.x&&o.deltaY===s.y)return null;let l=this.getItemIndex(t),d=t.getPlaceholderElement(),h=a.getRootElement();n>l?h.after(d):h.before(d),J(this._activeItems,l,n);let v=this._getRootNode().elementFromPoint(e,i);return o.deltaX=s.x,o.deltaY=s.y,o.drag=a,o.overlaps=h===v||h.contains(v),{previousIndex:l,currentIndex:n}}enter(t,e,i,s){let n=this._activeItems.indexOf(t);n>-1&&this._activeItems.splice(n,1);let o=s==null||s<0?this._getItemIndexFromPointerPosition(t,e,i):s;o===-1&&(o=this._getClosestItemIndexToPointer(t,e,i));let a=this._activeItems[o];a&&!this._dragDropRegistry.isDragging(a)?(this._activeItems.splice(o,0,t),a.getRootElement().before(t.getPlaceholderElement())):(this._activeItems.push(t),this._element.appendChild(t.getPlaceholderElement()))}withItems(t){this._activeItems=t.slice()}withSortPredicate(t){this._sortPredicate=t}reset(){let t=this._element,e=this._previousSwap;for(let i=this._relatedNodes.length-1;i>-1;i--){let[s,n]=this._relatedNodes[i];s.parentNode===t&&s.nextSibling!==n&&(n===null?t.appendChild(s):n.parentNode===t&&t.insertBefore(s,n))}this._relatedNodes=[],this._activeItems=[],e.drag=null,e.deltaX=e.deltaY=0,e.overlaps=!1}getActiveItemsSnapshot(){return this._activeItems}getItemIndex(t){return this._activeItems.indexOf(t)}getItemAtIndex(t){return this._activeItems[t]||null}updateOnScroll(){this._activeItems.forEach(t=>{this._dragDropRegistry.isDragging(t)&&t._sortFromLastPointerPosition()})}withElementContainer(t){t!==this._element&&(this._element=t,this._rootNode=void 0)}_getItemIndexFromPointerPosition(t,e,i){let s=this._getRootNode().elementFromPoint(Math.floor(e),Math.floor(i)),n=s?this._activeItems.findIndex(o=>{let a=o.getRootElement();return s===a||a.contains(s)}):-1;return n===-1||!this._sortPredicate(n,t)?-1:n}_getRootNode(){return this._rootNode||(this._rootNode=j(this._element)||this._document),this._rootNode}_getClosestItemIndexToPointer(t,e,i){if(this._activeItems.length===0)return-1;if(this._activeItems.length===1)return 0;let s=1/0,n=-1;for(let o=0;o<this._activeItems.length;o++){let a=this._activeItems[o];if(a!==t){let{x:l,y:d}=a.getRootElement().getBoundingClientRect(),h=Math.hypot(e-l,i-d);h<s&&(s=h,n=o)}}return n}},Bt=.05,$t=.05,b=(function(r){return r[r.NONE=0]="NONE",r[r.UP=1]="UP",r[r.DOWN=2]="DOWN",r})(b||{}),m=(function(r){return r[r.NONE=0]="NONE",r[r.LEFT=1]="LEFT",r[r.RIGHT=2]="RIGHT",r})(m||{}),Ee=class{_dragDropRegistry;_ngZone;_viewportRuler;element;disabled=!1;sortingDisabled=!1;lockAxis;autoScrollDisabled=!1;autoScrollStep=2;hasAnchor=!1;enterPredicate=()=>!0;sortPredicate=()=>!0;beforeStarted=new _;entered=new _;exited=new _;dropped=new _;sorted=new _;receivingStarted=new _;receivingStopped=new _;data;_container;_isDragging=!1;_parentPositions;_sortStrategy;_domRect;_draggables=[];_siblings=[];_activeSiblings=new Set;_viewportScrollSubscription=T.EMPTY;_verticalScrollDirection=b.NONE;_horizontalScrollDirection=m.NONE;_scrollNode;_stopScrollTimers=new _;_cachedShadowRoot=null;_document;_scrollableElements=[];_initialScrollSnap;_direction="ltr";constructor(t,e,i,s,n){this._dragDropRegistry=e,this._ngZone=s,this._viewportRuler=n;let o=this.element=x(t);this._document=i,this.withOrientation("vertical").withElementContainer(o),e.registerDropContainer(this),this._parentPositions=new K(i)}dispose(){this._stopScrolling(),this._stopScrollTimers.complete(),this._viewportScrollSubscription.unsubscribe(),this.beforeStarted.complete(),this.entered.complete(),this.exited.complete(),this.dropped.complete(),this.sorted.complete(),this.receivingStarted.complete(),this.receivingStopped.complete(),this._activeSiblings.clear(),this._scrollNode=null,this._parentPositions.clear(),this._dragDropRegistry.removeDropContainer(this)}isDragging(){return this._isDragging}start(){this._draggingStarted(),this._notifyReceivingSiblings()}enter(t,e,i,s){this._draggingStarted(),s==null&&this.sortingDisabled&&(s=this._draggables.indexOf(t)),this._sortStrategy.enter(t,e,i,s),this._cacheParentPositions(),this._notifyReceivingSiblings(),this.entered.next({item:t,container:this,currentIndex:this.getItemIndex(t)})}exit(t){this._reset(),this.exited.next({item:t,container:this})}drop(t,e,i,s,n,o,a,l={}){this._reset(),this.dropped.next({item:t,currentIndex:e,previousIndex:i,container:this,previousContainer:s,isPointerOverContainer:n,distance:o,dropPoint:a,event:l})}withItems(t){let e=this._draggables;return this._draggables=t,t.forEach(i=>i._withDropContainer(this)),this.isDragging()&&(e.filter(s=>s.isDragging()).every(s=>t.indexOf(s)===-1)?this._reset():this._sortStrategy.withItems(this._draggables)),this}withDirection(t){return this._direction=t,this._sortStrategy instanceof X&&(this._sortStrategy.direction=t),this}connectedTo(t){return this._siblings=t.slice(),this}withOrientation(t){if(t==="mixed")this._sortStrategy=new xe(this._document,this._dragDropRegistry);else{let e=new X(this._dragDropRegistry);e.direction=this._direction,e.orientation=t,this._sortStrategy=e}return this._sortStrategy.withElementContainer(this._container),this._sortStrategy.withSortPredicate((e,i)=>this.sortPredicate(e,i,this)),this}withScrollableParents(t){let e=this._container;return this._scrollableElements=t.indexOf(e)===-1?[e,...t]:t.slice(),this}withElementContainer(t){if(t===this._container)return this;let e=x(this.element),i=this._scrollableElements.indexOf(this._container),s=this._scrollableElements.indexOf(t);return i>-1&&this._scrollableElements.splice(i,1),s>-1&&this._scrollableElements.splice(s,1),this._sortStrategy&&this._sortStrategy.withElementContainer(t),this._cachedShadowRoot=null,this._scrollableElements.unshift(t),this._container=t,this}getScrollableParents(){return this._scrollableElements}getItemIndex(t){return this._isDragging?this._sortStrategy.getItemIndex(t):this._draggables.indexOf(t)}getItemAtIndex(t){return this._isDragging?this._sortStrategy.getItemAtIndex(t):this._draggables[t]||null}isReceiving(){return this._activeSiblings.size>0}_sortItem(t,e,i,s){if(this.sortingDisabled||!this._domRect||!It(this._domRect,Bt,e,i))return;let n=this._sortStrategy.sort(t,e,i,s);n&&this.sorted.next({previousIndex:n.previousIndex,currentIndex:n.currentIndex,container:this,item:t})}_startScrollingIfNecessary(t,e){if(this.autoScrollDisabled)return;let i,s=b.NONE,n=m.NONE;if(this._parentPositions.positions.forEach((o,a)=>{a===this._document||!o.clientRect||i||It(o.clientRect,Bt,t,e)&&([s,n]=pi(a,o.clientRect,this._direction,t,e),(s||n)&&(i=a))}),!s&&!n){let{width:o,height:a}=this._viewportRuler.getViewportSize(),l={width:o,height:a,top:0,right:o,bottom:a,left:0};s=Ut(l,e),n=Wt(l,t),i=window}i&&(s!==this._verticalScrollDirection||n!==this._horizontalScrollDirection||i!==this._scrollNode)&&(this._verticalScrollDirection=s,this._horizontalScrollDirection=n,this._scrollNode=i,(s||n)&&i?this._ngZone.runOutsideAngular(this._startScrollInterval):this._stopScrolling())}_stopScrolling(){this._stopScrollTimers.next()}_draggingStarted(){let t=this._container.style;this.beforeStarted.next(),this._isDragging=!0,this._initialScrollSnap=t.msScrollSnapType||t.scrollSnapType||"",t.scrollSnapType=t.msScrollSnapType="none",this._sortStrategy.start(this._draggables),this._cacheParentPositions(),this._viewportScrollSubscription.unsubscribe(),this._listenToScrollEvents()}_cacheParentPositions(){this._parentPositions.cache(this._scrollableElements),this._domRect=this._parentPositions.positions.get(this._container).clientRect}_reset(){this._isDragging=!1;let t=this._container.style;t.scrollSnapType=t.msScrollSnapType=this._initialScrollSnap,this._siblings.forEach(e=>e._stopReceiving(this)),this._sortStrategy.reset(),this._stopScrolling(),this._viewportScrollSubscription.unsubscribe(),this._parentPositions.clear()}_startScrollInterval=()=>{this._stopScrolling(),Ae(0,Le).pipe(A(this._stopScrollTimers)).subscribe(()=>{let t=this._scrollNode,e=this.autoScrollStep;this._verticalScrollDirection===b.UP?t.scrollBy(0,-e):this._verticalScrollDirection===b.DOWN&&t.scrollBy(0,e),this._horizontalScrollDirection===m.LEFT?t.scrollBy(-e,0):this._horizontalScrollDirection===m.RIGHT&&t.scrollBy(e,0)})};_isOverContainer(t,e){return this._domRect!=null&&Pe(this._domRect,t,e)}_getSiblingContainerFromPosition(t,e,i){return this._siblings.find(s=>s._canReceive(t,e,i))}_canReceive(t,e,i){if(!this._domRect||!Pe(this._domRect,e,i)||!this.enterPredicate(t,this))return!1;let s=this._getShadowRoot().elementFromPoint(e,i);return s?s===this._container||this._container.contains(s):!1}_startReceiving(t,e){let i=this._activeSiblings;!i.has(t)&&e.every(s=>this.enterPredicate(s,this)||this._draggables.indexOf(s)>-1)&&(i.add(t),this._cacheParentPositions(),this._listenToScrollEvents(),this.receivingStarted.next({initiator:t,receiver:this,items:e}))}_stopReceiving(t){this._activeSiblings.delete(t),this._viewportScrollSubscription.unsubscribe(),this.receivingStopped.next({initiator:t,receiver:this})}_listenToScrollEvents(){this._viewportScrollSubscription=this._dragDropRegistry.scrolled(this._getShadowRoot()).subscribe(t=>{if(this.isDragging()){let e=this._parentPositions.handleScroll(t);e&&this._sortStrategy.updateOnScroll(e.top,e.left)}else this.isReceiving()&&this._cacheParentPositions()})}_getShadowRoot(){if(!this._cachedShadowRoot){let t=j(this._container);this._cachedShadowRoot=t||this._document}return this._cachedShadowRoot}_notifyReceivingSiblings(){let t=this._sortStrategy.getActiveItemsSnapshot().filter(e=>e.isDragging());this._siblings.forEach(e=>e._startReceiving(this,t))}};function Ut(r,t){let{top:e,bottom:i,height:s}=r,n=s*$t;return t>=e-n&&t<=e+n?b.UP:t>=i-n&&t<=i+n?b.DOWN:b.NONE}function Wt(r,t){let{left:e,right:i,width:s}=r,n=s*$t;return t>=e-n&&t<=e+n?m.LEFT:t>=i-n&&t<=i+n?m.RIGHT:m.NONE}function pi(r,t,e,i,s){let n=Ut(t,s),o=Wt(t,i),a=b.NONE,l=m.NONE;if(n){let d=r.scrollTop;n===b.UP?d>0&&(a=b.UP):r.scrollHeight-d>r.clientHeight&&(a=b.DOWN)}if(o){let d=r.scrollLeft;e==="rtl"?o===m.RIGHT?d<0&&(l=m.RIGHT):r.scrollWidth+d>r.clientWidth&&(l=m.LEFT):o===m.LEFT?d>0&&(l=m.LEFT):r.scrollWidth-d>r.clientWidth&&(l=m.RIGHT)}return[a,l]}var B={capture:!0},be={passive:!1,capture:!0},_i=(()=>{class r{static \u0275fac=function(i){return new(i||r)};static \u0275cmp=R({type:r,selectors:[["ng-component"]],hostAttrs:["cdk-drag-resets-container",""],decls:0,vars:0,template:function(i,s){},styles:[`@layer cdk-resets{.cdk-drag-preview{background:none;border:none;padding:0;color:inherit;inset:auto}}.cdk-drag-placeholder *,.cdk-drag-preview *{pointer-events:none !important}
2
- `],encapsulation:2,changeDetection:0})}return r})(),Zt=(()=>{class r{_ngZone=c($);_document=c(ne);_styleLoader=c(st);_renderer=c(le).createRenderer(null,null);_cleanupDocumentTouchmove;_scroll=new _;_dropInstances=new Set;_dragInstances=new Set;_activeDragInstances=re([]);_globalListeners;_draggingPredicate=e=>e.isDragging();_domNodesToDirectives=null;pointerMove=new _;pointerUp=new _;constructor(){}registerDropContainer(e){this._dropInstances.has(e)||this._dropInstances.add(e)}registerDragItem(e){this._dragInstances.add(e),this._dragInstances.size===1&&this._ngZone.runOutsideAngular(()=>{this._cleanupDocumentTouchmove?.(),this._cleanupDocumentTouchmove=this._renderer.listen(this._document,"touchmove",this._persistentTouchmoveListener,be)})}removeDropContainer(e){this._dropInstances.delete(e)}removeDragItem(e){this._dragInstances.delete(e),this.stopDragging(e),this._dragInstances.size===0&&this._cleanupDocumentTouchmove?.()}startDragging(e,i){if(!(this._activeDragInstances().indexOf(e)>-1)&&(this._styleLoader.load(_i),this._activeDragInstances.update(s=>[...s,e]),this._activeDragInstances().length===1)){let s=i.type.startsWith("touch"),n=a=>this.pointerUp.next(a),o=[["scroll",a=>this._scroll.next(a),B],["selectstart",this._preventDefaultWhileDragging,be]];s?o.push(["touchend",n,B],["touchcancel",n,B]):o.push(["mouseup",n,B]),s||o.push(["mousemove",a=>this.pointerMove.next(a),be]),this._ngZone.runOutsideAngular(()=>{this._globalListeners=o.map(([a,l,d])=>this._renderer.listen(this._document,a,l,d))})}}stopDragging(e){this._activeDragInstances.update(i=>{let s=i.indexOf(e);return s>-1?(i.splice(s,1),[...i]):i}),this._activeDragInstances().length===0&&this._clearGlobalListeners()}isDragging(e){return this._activeDragInstances().indexOf(e)>-1}scrolled(e){let i=[this._scroll];return e&&e!==this._document&&i.push(new te(s=>this._ngZone.runOutsideAngular(()=>{let n=this._renderer.listen(e,"scroll",o=>{this._activeDragInstances().length&&s.next(o)},B);return()=>{n()}}))),G(...i)}registerDirectiveNode(e,i){this._domNodesToDirectives??=new WeakMap,this._domNodesToDirectives.set(e,i)}removeDirectiveNode(e){this._domNodesToDirectives?.delete(e)}getDragDirectiveForNode(e){return this._domNodesToDirectives?.get(e)||null}ngOnDestroy(){this._dragInstances.forEach(e=>this.removeDragItem(e)),this._dropInstances.forEach(e=>this.removeDropContainer(e)),this._domNodesToDirectives=null,this._clearGlobalListeners(),this.pointerMove.complete(),this.pointerUp.complete()}_preventDefaultWhileDragging=e=>{this._activeDragInstances().length>0&&e.preventDefault()};_persistentTouchmoveListener=e=>{this._activeDragInstances().length>0&&(this._activeDragInstances().some(this._draggingPredicate)&&e.preventDefault(),this.pointerMove.next(e))};_clearGlobalListeners(){this._globalListeners?.forEach(e=>e()),this._globalListeners=void 0}static \u0275fac=function(i){return new(i||r)};static \u0275prov=se({token:r,factory:r.\u0275fac,providedIn:"root"})}return r})(),gi={dragStartThreshold:5,pointerDirectionChangeThreshold:5},jt=(()=>{class r{_document=c(ne);_ngZone=c($);_viewportRuler=c(_t);_dragDropRegistry=c(Zt);_renderer=c(le).createRenderer(null,null);constructor(){}createDrag(e,i=gi){return new ye(e,i,this._document,this._ngZone,this._viewportRuler,this._dragDropRegistry,this._renderer)}createDropList(e){return new Ee(e,this._dragDropRegistry,this._document,this._ngZone,this._viewportRuler)}static \u0275fac=function(i){return new(i||r)};static \u0275prov=se({token:r,factory:r.\u0275fac,providedIn:"root"})}return r})(),zt=new k("CDK_DRAG_PARENT");var mi=new k("CdkDragHandle");var qt=new k("CDK_DRAG_CONFIG"),Kt=new k("CdkDropList"),Yt=(()=>{class r{element=c(oe);dropContainer=c(Kt,{optional:!0,skipSelf:!0});_ngZone=c($);_viewContainerRef=c(Ge);_dir=c(fe,{optional:!0});_changeDetectorRef=c(ge);_selfHandle=c(mi,{optional:!0,self:!0});_parentDrag=c(zt,{optional:!0,skipSelf:!0});_dragDropRegistry=c(Zt);_destroyed=new _;_handles=new Me([]);_previewTemplate;_placeholderTemplate;_dragRef;data;lockAxis;rootElementSelector;boundaryElement;dragStartDelay;freeDragPosition;get disabled(){return this._disabled||!!(this.dropContainer&&this.dropContainer.disabled)}set disabled(e){this._disabled=e,this._dragRef.disabled=this._disabled}_disabled;constrainPosition;previewClass;previewContainer;scale=1;started=new P;released=new P;ended=new P;entered=new P;exited=new P;dropped=new P;moved=new te(e=>{let i=this._dragRef.moved.pipe(Ne(s=>({source:this,pointerPosition:s.pointerPosition,event:s.event,delta:s.delta,distance:s.distance}))).subscribe(e);return()=>{i.unsubscribe()}});_injector=c(ze);constructor(){let e=this.dropContainer,i=c(qt,{optional:!0}),s=c(jt);this._dragRef=s.createDrag(this.element,{dragStartThreshold:i&&i.dragStartThreshold!=null?i.dragStartThreshold:5,pointerDirectionChangeThreshold:i&&i.pointerDirectionChangeThreshold!=null?i.pointerDirectionChangeThreshold:5,zIndex:i?.zIndex}),this._dragRef.data=this,this._dragDropRegistry.registerDirectiveNode(this.element.nativeElement,this),i&&this._assignDefaults(i),e&&(e.addItem(this),e._dropListRef.beforeStarted.pipe(A(this._destroyed)).subscribe(()=>{this._dragRef.scale=this.scale})),this._syncInputs(this._dragRef),this._handleEvents(this._dragRef)}getPlaceholderElement(){return this._dragRef.getPlaceholderElement()}getRootElement(){return this._dragRef.getRootElement()}reset(){this._dragRef.reset()}resetToBoundary(){this._dragRef.resetToBoundary()}getFreeDragPosition(){return this._dragRef.getFreeDragPosition()}setFreeDragPosition(e){this._dragRef.setFreeDragPosition(e)}ngAfterViewInit(){$e(()=>{this._updateRootElement(),this._setupHandlesListener(),this._dragRef.scale=this.scale,this.freeDragPosition&&this._dragRef.setFreeDragPosition(this.freeDragPosition)},{injector:this._injector})}ngOnChanges(e){let i=e.rootElementSelector,s=e.freeDragPosition;i&&!i.firstChange&&this._updateRootElement(),this._dragRef.scale=this.scale,s&&!s.firstChange&&this.freeDragPosition&&this._dragRef.setFreeDragPosition(this.freeDragPosition)}ngOnDestroy(){this.dropContainer&&this.dropContainer.removeItem(this),this._dragDropRegistry.removeDirectiveNode(this.element.nativeElement),this._ngZone.runOutsideAngular(()=>{this._handles.complete(),this._destroyed.next(),this._destroyed.complete(),this._dragRef.dispose()})}_addHandle(e){let i=this._handles.getValue();i.push(e),this._handles.next(i)}_removeHandle(e){let i=this._handles.getValue(),s=i.indexOf(e);s>-1&&(i.splice(s,1),this._handles.next(i))}_setPreviewTemplate(e){this._previewTemplate=e}_resetPreviewTemplate(e){e===this._previewTemplate&&(this._previewTemplate=null)}_setPlaceholderTemplate(e){this._placeholderTemplate=e}_resetPlaceholderTemplate(e){e===this._placeholderTemplate&&(this._placeholderTemplate=null)}_updateRootElement(){let e=this.element.nativeElement,i=e;this.rootElementSelector&&(i=e.closest!==void 0?e.closest(this.rootElementSelector):e.parentElement?.closest(this.rootElementSelector)),this._dragRef.withRootElement(i||e)}_getBoundaryElement(){let e=this.boundaryElement;return e?typeof e=="string"?this.element.nativeElement.closest(e):x(e):null}_syncInputs(e){e.beforeStarted.subscribe(()=>{if(!e.isDragging()){let i=this._dir,s=this.dragStartDelay,n=this._placeholderTemplate?{template:this._placeholderTemplate.templateRef,context:this._placeholderTemplate.data,viewContainer:this._viewContainerRef}:null,o=this._previewTemplate?{template:this._previewTemplate.templateRef,context:this._previewTemplate.data,matchSize:this._previewTemplate.matchSize,viewContainer:this._viewContainerRef}:null;e.disabled=this.disabled,e.lockAxis=this.lockAxis,e.scale=this.scale,e.dragStartDelay=typeof s=="object"&&s?s:ue(s),e.constrainPosition=this.constrainPosition,e.previewClass=this.previewClass,e.withBoundaryElement(this._getBoundaryElement()).withPlaceholderTemplate(n).withPreviewTemplate(o).withPreviewContainer(this.previewContainer||"global"),i&&e.withDirection(i.value)}}),e.beforeStarted.pipe(Fe(1)).subscribe(()=>{if(this._parentDrag){e.withParent(this._parentDrag._dragRef);return}let i=this.element.nativeElement.parentElement;for(;i;){let s=this._dragDropRegistry.getDragDirectiveForNode(i);if(s){e.withParent(s._dragRef);break}i=i.parentElement}})}_handleEvents(e){e.started.subscribe(i=>{this.started.emit({source:this,event:i.event}),this._changeDetectorRef.markForCheck()}),e.released.subscribe(i=>{this.released.emit({source:this,event:i.event})}),e.ended.subscribe(i=>{this.ended.emit({source:this,distance:i.distance,dropPoint:i.dropPoint,event:i.event}),this._changeDetectorRef.markForCheck()}),e.entered.subscribe(i=>{this.entered.emit({container:i.container.data,item:this,currentIndex:i.currentIndex})}),e.exited.subscribe(i=>{this.exited.emit({container:i.container.data,item:this})}),e.dropped.subscribe(i=>{this.dropped.emit({previousIndex:i.previousIndex,currentIndex:i.currentIndex,previousContainer:i.previousContainer.data,container:i.container.data,isPointerOverContainer:i.isPointerOverContainer,item:this,distance:i.distance,dropPoint:i.dropPoint,event:i.event})})}_assignDefaults(e){let{lockAxis:i,dragStartDelay:s,constrainPosition:n,previewClass:o,boundaryElement:a,draggingDisabled:l,rootElementSelector:d,previewContainer:h}=e;this.disabled=l??!1,this.dragStartDelay=s||0,i&&(this.lockAxis=i),n&&(this.constrainPosition=n),o&&(this.previewClass=o),a&&(this.boundaryElement=a),d&&(this.rootElementSelector=d),h&&(this.previewContainer=h)}_setupHandlesListener(){this._handles.pipe(Be(e=>{let i=e.map(s=>s.element);this._selfHandle&&this.rootElementSelector&&i.push(this.element),this._dragRef.withHandles(i)}),He(e=>G(...e.map(i=>i._stateChanges.pipe(ie(i))))),A(this._destroyed)).subscribe(e=>{let i=this._dragRef,s=e.element.nativeElement;e.disabled?i.disableHandle(s):i.enableHandle(s)})}static \u0275fac=function(i){return new(i||r)};static \u0275dir=de({type:r,selectors:[["","cdkDrag",""]],hostAttrs:[1,"cdk-drag"],hostVars:4,hostBindings:function(i,s){i&2&&ce("cdk-drag-disabled",s.disabled)("cdk-drag-dragging",s._dragRef.isDragging())},inputs:{data:[0,"cdkDragData","data"],lockAxis:[0,"cdkDragLockAxis","lockAxis"],rootElementSelector:[0,"cdkDragRootElement","rootElementSelector"],boundaryElement:[0,"cdkDragBoundary","boundaryElement"],dragStartDelay:[0,"cdkDragStartDelay","dragStartDelay"],freeDragPosition:[0,"cdkDragFreeDragPosition","freeDragPosition"],disabled:[2,"cdkDragDisabled","disabled",O],constrainPosition:[0,"cdkDragConstrainPosition","constrainPosition"],previewClass:[0,"cdkDragPreviewClass","previewClass"],previewContainer:[0,"cdkDragPreviewContainer","previewContainer"],scale:[2,"cdkDragScale","scale",Ye]},outputs:{started:"cdkDragStarted",released:"cdkDragReleased",ended:"cdkDragEnded",entered:"cdkDragEntered",exited:"cdkDragExited",dropped:"cdkDragDropped",moved:"cdkDragMoved"},exportAs:["cdkDrag"],features:[pe([{provide:zt,useExisting:r}]),Ve]})}return r})(),Vt=new k("CdkDropListGroup");var Xt=(()=>{class r{element=c(oe);_changeDetectorRef=c(ge);_scrollDispatcher=c(pt);_dir=c(fe,{optional:!0});_group=c(Vt,{optional:!0,skipSelf:!0});_latestSortedRefs;_destroyed=new _;_scrollableParentsResolved;static _dropLists=[];_dropListRef;connectedTo=[];data;orientation;id=c(ot).getId("cdk-drop-list-");lockAxis;get disabled(){return this._disabled||!!this._group&&this._group.disabled}set disabled(e){this._dropListRef.disabled=this._disabled=e}_disabled;sortingDisabled;enterPredicate=()=>!0;sortPredicate=()=>!0;autoScrollDisabled;autoScrollStep;elementContainerSelector;hasAnchor;dropped=new P;entered=new P;exited=new P;sorted=new P;_unsortedItems=new Set;constructor(){let e=c(jt),i=c(qt,{optional:!0});this._dropListRef=e.createDropList(this.element),this._dropListRef.data=this,i&&this._assignDefaults(i),this._dropListRef.enterPredicate=(s,n)=>this.enterPredicate(s.data,n.data),this._dropListRef.sortPredicate=(s,n,o)=>this.sortPredicate(s,n.data,o.data),this._setupInputSyncSubscription(this._dropListRef),this._handleEvents(this._dropListRef),r._dropLists.push(this),this._group&&this._group._items.add(this)}addItem(e){this._unsortedItems.add(e),e._dragRef._withDropContainer(this._dropListRef),this._dropListRef.isDragging()&&this._syncItemsWithRef(this.getSortedItems().map(i=>i._dragRef))}removeItem(e){if(this._unsortedItems.delete(e),this._latestSortedRefs){let i=this._latestSortedRefs.indexOf(e._dragRef);i>-1&&(this._latestSortedRefs.splice(i,1),this._syncItemsWithRef(this._latestSortedRefs))}}getSortedItems(){return Array.from(this._unsortedItems).sort((e,i)=>e._dragRef.getVisibleElement().compareDocumentPosition(i._dragRef.getVisibleElement())&Node.DOCUMENT_POSITION_FOLLOWING?-1:1)}ngOnDestroy(){let e=r._dropLists.indexOf(this);e>-1&&r._dropLists.splice(e,1),this._group&&this._group._items.delete(this),this._latestSortedRefs=void 0,this._unsortedItems.clear(),this._dropListRef.dispose(),this._destroyed.next(),this._destroyed.complete()}_setupInputSyncSubscription(e){this._dir&&this._dir.change.pipe(ie(this._dir.value),A(this._destroyed)).subscribe(i=>e.withDirection(i)),e.beforeStarted.subscribe(()=>{let i=nt(this.connectedTo).map(s=>{if(typeof s=="string"){let n=r._dropLists.find(o=>o.id===s);return n}return s});if(this._group&&this._group._items.forEach(s=>{i.indexOf(s)===-1&&i.push(s)}),!this._scrollableParentsResolved){let s=this._scrollDispatcher.getAncestorScrollContainers(this.element).map(n=>n.getElementRef().nativeElement);this._dropListRef.withScrollableParents(s),this._scrollableParentsResolved=!0}if(this.elementContainerSelector){let s=this.element.nativeElement.querySelector(this.elementContainerSelector);e.withElementContainer(s)}e.disabled=this.disabled,e.lockAxis=this.lockAxis,e.sortingDisabled=this.sortingDisabled,e.autoScrollDisabled=this.autoScrollDisabled,e.autoScrollStep=ue(this.autoScrollStep,2),e.hasAnchor=this.hasAnchor,e.connectedTo(i.filter(s=>s&&s!==this).map(s=>s._dropListRef)).withOrientation(this.orientation)})}_handleEvents(e){e.beforeStarted.subscribe(()=>{this._syncItemsWithRef(this.getSortedItems().map(i=>i._dragRef)),this._changeDetectorRef.markForCheck()}),e.entered.subscribe(i=>{this.entered.emit({container:this,item:i.item.data,currentIndex:i.currentIndex})}),e.exited.subscribe(i=>{this.exited.emit({container:this,item:i.item.data}),this._changeDetectorRef.markForCheck()}),e.sorted.subscribe(i=>{this.sorted.emit({previousIndex:i.previousIndex,currentIndex:i.currentIndex,container:this,item:i.item.data})}),e.dropped.subscribe(i=>{this.dropped.emit({previousIndex:i.previousIndex,currentIndex:i.currentIndex,previousContainer:i.previousContainer.data,container:i.container.data,item:i.item.data,isPointerOverContainer:i.isPointerOverContainer,distance:i.distance,dropPoint:i.dropPoint,event:i.event}),this._changeDetectorRef.markForCheck()}),G(e.receivingStarted,e.receivingStopped).subscribe(()=>this._changeDetectorRef.markForCheck())}_assignDefaults(e){let{lockAxis:i,draggingDisabled:s,sortingDisabled:n,listAutoScrollDisabled:o,listOrientation:a}=e;this.disabled=s??!1,this.sortingDisabled=n??!1,this.autoScrollDisabled=o??!1,this.orientation=a||"vertical",i&&(this.lockAxis=i)}_syncItemsWithRef(e){this._latestSortedRefs=e,this._dropListRef.withItems(e)}static \u0275fac=function(i){return new(i||r)};static \u0275dir=de({type:r,selectors:[["","cdkDropList",""],["cdk-drop-list"]],hostAttrs:[1,"cdk-drop-list"],hostVars:7,hostBindings:function(i,s){i&2&&(Ue("id",s.id),ce("cdk-drop-list-disabled",s.disabled)("cdk-drop-list-dragging",s._dropListRef.isDragging())("cdk-drop-list-receiving",s._dropListRef.isReceiving()))},inputs:{connectedTo:[0,"cdkDropListConnectedTo","connectedTo"],data:[0,"cdkDropListData","data"],orientation:[0,"cdkDropListOrientation","orientation"],id:"id",lockAxis:[0,"cdkDropListLockAxis","lockAxis"],disabled:[2,"cdkDropListDisabled","disabled",O],sortingDisabled:[2,"cdkDropListSortingDisabled","sortingDisabled",O],enterPredicate:[0,"cdkDropListEnterPredicate","enterPredicate"],sortPredicate:[0,"cdkDropListSortPredicate","sortPredicate"],autoScrollDisabled:[2,"cdkDropListAutoScrollDisabled","autoScrollDisabled",O],autoScrollStep:[0,"cdkDropListAutoScrollStep","autoScrollStep"],elementContainerSelector:[0,"cdkDropListElementContainer","elementContainerSelector"],hasAnchor:[2,"cdkDropListHasAnchor","hasAnchor",O]},outputs:{dropped:"cdkDropListDropped",entered:"cdkDropListEntered",exited:"cdkDropListExited",sorted:"cdkDropListSorted"},exportAs:["cdkDropList"],features:[pe([{provide:Vt,useValue:void 0},{provide:Kt,useExisting:r}])]})}return r})();function ui(r,t){if(r&1){let e=W();p(0,"button",0),u("click",function(){E(e);let s=y();return C(s.clickAction("cancel"))}),p(1,"mat-icon",1),f(2,"close"),g(),p(3,"span"),f(4,"Close"),g()()}}var Qt=(()=>{class r{_bottomSheetRef=c(vt);data=c(ft);showCancel=!!(this.data&&this.data.showCancel);clickAction(e){this._bottomSheetRef.dismiss(e)}static \u0275fac=function(i){return new(i||r)};static \u0275cmp=R({type:r,selectors:[["dashboards-manage-bottom-sheet"]],decls:12,vars:1,consts:[["mat-list-item","",3,"click"],["matListItemIcon",""],["mat-list-item",""]],template:function(i,s){i&1&&(p(0,"mat-action-list")(1,"button",0),u("click",function(){return s.clickAction("duplicate")}),p(2,"mat-icon",1),f(3,"content_copy"),g(),p(4,"span"),f(5,"Duplicate"),g()(),p(6,"button",0),u("click",function(){return s.clickAction("delete")}),p(7,"mat-icon",1),f(8,"delete_forever"),g(),p(9,"span"),f(10,"Delete"),g()(),We(11,ui,5,0,"button",2),g()),i&2&&(w(11),Ze(s.showCancel?11:-1))},dependencies:[yt,Pt,St,wt,L,M],encapsulation:2})}return r})();var vi=(r,t)=>t.id;function Di(r,t){if(r&1){let e=W();p(0,"div",5),u("cdkDragStarted",function(){E(e);let s=y();return C(s.dragStart())})("cdkDragMoved",function(s){E(e);let n=y();return C(n.onDragMoved(s))})("cdkDragEnded",function(){E(e);let s=y();return C(s.dragEnd())})("press",function(s){let n=E(e).$index,o=y();return C(o.onPress(n,s))})("doubletap",function(){let s=E(e).$index,n=y();return C(n.editDashboard(s))}),p(1,"div",6),f(2),g(),p(3,"div"),U(4,"mat-icon",7),g(),p(5,"p",8),f(6),g()()}if(r&2){let e=t.$implicit,i=t.$index,s=y();I("cdkDragDisabled",s._sheetOpen||s.suppressDrag),w(2),he(i+1),w(2),Ke("width",72,"px")("height",72,"px"),I("svgIcon",e.icon||"dashboard"),w(2),he(e.name)}}var ei=(()=>{class r{pageTitle="Dashboards";_bottomSheet=c(Dt);_dashboard=c(et);_uiEvent=c(ut);_dialog=c(mt);_sanitizer=c(Je);_sheetOpen=!1;suppressDrag=!1;_dragActive=!1;_dragMoved=!1;_dragSuppressThresholdPx=4;addDashboard(){this._dialog.openDashboardPageEditorDialog({title:"New Dashboard",name:`Dashboard ${this._dashboard.dashboards().length+1}`,icon:"dashboard-dashboard",confirmBtnText:"Create",cancelBtnText:"Cancel"}).afterClosed().subscribe(e=>{e&&this._dashboard.add(e.name,[],e.icon)})}openBottomSheet(e){let i=typeof navigator<"u"&&/Linux/.test(navigator.platform)&&/Firefox/.test(navigator.userAgent);this._bottomSheet.open(Qt,i?{disableClose:!0,data:{showCancel:!0}}:{}).afterDismissed().subscribe(n=>{switch(this._sheetOpen=!1,n){case"delete":this.deleteDashboard(e);break;case"duplicate":this.duplicateDashboard(e,`${this._dashboard.dashboards()[e].name}`);break;default:break}})}editDashboard(e){let i=this._dashboard.dashboards()[e];this._dialog.openDashboardPageEditorDialog({title:"Dashboard Details",name:i.name,icon:i.icon||"dashboard-dashboard",confirmBtnText:"Save",cancelBtnText:"Cancel"}).afterClosed().subscribe(s=>{s&&this._dashboard.update(e,s.name,s.icon)})}deleteDashboard(e){this._dashboard.delete(e)}duplicateDashboard(e,i){let s=this._dashboard.dashboards()[e];this._dialog.openDashboardPageEditorDialog({title:"Duplicate Dashboard",name:`${i} copy`,icon:s.icon||"dashboard-dashboard",confirmBtnText:"Save",cancelBtnText:"Cancel"}).afterClosed().subscribe(n=>{n&&this._dashboard.duplicate(e,n.name,n.icon)})}drop(e){this._dashboard.dashboards.update(i=>{let s=[...i];J(s,e.previousIndex,e.currentIndex);let n=this._dashboard.activeDashboard();return n===e.previousIndex?this._dashboard.activeDashboard.set(e.currentIndex):n>e.previousIndex&&n<=e.currentIndex?this._dashboard.activeDashboard.set(n-1):n<e.previousIndex&&n>=e.currentIndex&&this._dashboard.activeDashboard.set(n+1),s})}dragStart(){this._sheetOpen||this.suppressDrag||(this._uiEvent.isDragging.set(!0),this._dragActive=!0,this._dragMoved=!1)}dragEnd(){this._uiEvent.isDragging.set(!1),this._dragActive=!1,setTimeout(()=>{this._dragMoved=!1},60)}onDragMoved(e){if(!this._dragActive||this._dragMoved)return;Math.hypot(e.distance.x,e.distance.y)>this._dragSuppressThresholdPx&&(this._dragMoved=!0)}onPress(e,i){i.preventDefault(),i.stopPropagation(),!this._dragMoved&&(this.cancelPointerSequence(),this.openBottomSheet(e))}cancelPointerSequence(){this.suppressDrag=!0,this._dragActive=!1,this._dragMoved=!1,["pointerup","mouseup","touchend"].forEach(e=>{document.dispatchEvent(new Event(e,{bubbles:!0}))})}_onPointerRelease(){this._sheetOpen||(this.suppressDrag=!1)}static \u0275fac=function(i){return new(i||r)};static \u0275cmp=R({type:r,selectors:[["dashboards-editor"]],hostBindings:function(i,s){i&1&&u("mouseup",function(){return s._onPointerRelease()},ae)("touchend",function(){return s._onPointerRelease()},ae)},decls:10,vars:0,consts:[["cdkDropList","","cdkDropListOrientation","mixed",1,"dashboard-manage",3,"cdkDropListDropped"],["kipGestures","","matRipple","","cdkDrag","","cdkDragBoundary",".dashboard-manage",1,"dashboard-card","dashboard-item",3,"cdkDragDisabled"],["tabindex","0",1,"dashboard-card","dashboard-item-add","dashboard-add-btn",3,"click","keydown"],["mat-fab",""],[2,"margin-top","10px"],["kipGestures","","matRipple","","cdkDrag","","cdkDragBoundary",".dashboard-manage",1,"dashboard-card","dashboard-item",3,"cdkDragStarted","cdkDragMoved","cdkDragEnded","press","doubletap","cdkDragDisabled"],[1,"item-index"],["aria-hidden","false",1,"dashboard-icon",3,"svgIcon"],[1,"dashboard-name"]],template:function(i,s){i&1&&(p(0,"div",0),u("cdkDropListDropped",function(o){return s.drop(o)}),je(1,Di,7,8,"div",1,vi),p(3,"div",2),u("click",function(){return s.addDashboard()})("keydown",function(){return s.addDashboard()}),p(4,"button",3)(5,"mat-icon"),f(6,"add_box"),g()(),p(7,"p",4)(8,"i"),f(9,"Add Dashboard"),g()()()()),i&2&&(w(),qe(s._dashboard.dashboards()))},dependencies:[bt,q,ht,L,M,Xt,Yt,ct,lt,Xe],styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%;overflow-y:auto;scroll-behavior:smooth}.dashboard-manage[_ngcontent-%COMP%]{box-sizing:border-box;padding:0 60px;width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-around;overflow-y:auto;scroll-behavior:smooth}.dashboard-card[_ngcontent-%COMP%]{position:relative;height:200px;width:300px;margin:10px;border-radius:15px;padding:10px;align-content:center;text-align:center;border:2px solid transparent}@media (max-width: 600px) and (orientation: portrait){.dashboard-manage[_ngcontent-%COMP%]{padding:0 70px}.dashboard-card[_ngcontent-%COMP%]{height:175px}}.dashboard-item[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-highest);cursor:pointer}.dashboard-item[_ngcontent-%COMP%]:hover{border:2px solid var(--mat-sys-outline)}.dashboard-item-add[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container);cursor:pointer}.dashboard-item-add[_ngcontent-%COMP%]:hover{border:2px solid var(--mat-sys-outline)}.dashboard-add-btn[_ngcontent-%COMP%]{align-content:center;text-align:center;border:dashed 1px var(--mat-sys-outline)}.item-index[_ngcontent-%COMP%]{position:absolute;top:20px;left:20px;display:inline-flex;flex-wrap:wrap;height:42px;width:42px;background-color:var(--kip-contrast-dim-color);color:var(--mat-sys-surface-bright);border-radius:25%;align-content:center;align-items:center;justify-content:center;font-weight:700;font-size:1.25em;z-index:1}.dashboard-icon[_ngcontent-%COMP%]{opacity:.5}.dashboard-name[_ngcontent-%COMP%]{margin-top:10px;margin-bottom:0;font-size:1.1em}.cdk-drag-preview[_ngcontent-%COMP%]{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px var(--mat-sys-on-primary-container),0 8px 10px 1px var(--mat-sys-on-primary-container),0 3px 14px 2px var(--mat-sys-on-primary-container)}.cdk-drag-placeholder[_ngcontent-%COMP%]{opacity:0}.cdk-drag-animating[_ngcontent-%COMP%]{transition:transform .25s cubic-bezier(0,0,.2,1)}"]})}return r})();var Ss=(()=>{class r{_router=c(Qe);app=c(at);_responsive=c(rt);_isPhonePortrait=me(this._responsive.observe(ve.HandsetPortrait));_isPhoneLandscape=me(this._responsive.observe(ve.HandsetLandscape));isPhonePortrait=_e(()=>this._isPhonePortrait().matches);isPhoneLandscape=_e(()=>this._isPhoneLandscape().matches);closePage(){this._router.navigate(["/dashboard"])}onActionItem(e){switch(e){case"help":this._router.navigate(["/help"]);break;case"datainspector":this._router.navigate(["/data"]);break;case"options":this._router.navigate(["/options"]);break;default:break}}static \u0275fac=function(i){return new(i||r)};static \u0275cmp=R({type:r,selectors:[["settings"]],decls:10,vars:15,consts:[[1,"home-container"],[1,"actions-header-container"],[1,"actions-buttons-container"],["tabindex","0","svgIcon","settings","label","Options",3,"click","iconOnly","compact","iconSize"],["tabindex","0","svgIcon","troubleshoot","label","Data Inspector",3,"click","iconOnly","compact","iconSize"],["tabindex","0","svgIcon","help-center","label","Help",3,"click","iconOnly","compact","iconSize"],["mat-icon-button","",1,"dialog-close-icon",3,"click"],[1,"dashboards-editor"]],template:function(i,s){i&1&&(p(0,"div",0)(1,"div",1)(2,"div",2)(3,"tile-large-icon",3),u("click",function(){return s.onActionItem("options")}),g(),p(4,"tile-large-icon",4),u("click",function(){return s.onActionItem("datainspector")}),g(),p(5,"tile-large-icon",5),u("click",function(){return s.onActionItem("help")}),g()(),p(6,"button",6),u("click",function(){return s.closePage()}),p(7,"mat-icon"),f(8,"close"),g()()(),U(9,"dashboards-editor",7),g()),i&2&&(w(3),Z(`${s.isPhoneLandscape()?"no-label":"with-label"}`),I("iconOnly",s.isPhoneLandscape())("compact",!0)("iconSize",48),w(),Z(`${s.isPhoneLandscape()?"no-label":"with-label"}`),I("iconOnly",s.isPhoneLandscape())("compact",!0)("iconSize",48),w(),Z(`${s.isPhoneLandscape()?"no-label":"with-label"}`),I("iconOnly",s.isPhoneLandscape())("compact",!0)("iconSize",48))},dependencies:[L,M,q,dt,xt,gt,ei],styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%}.home-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.actions-header-container[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:flex-start;width:100%;padding:5px 0 5px 10px}.with-label[_ngcontent-%COMP%]{height:80px;width:90px}.no-label[_ngcontent-%COMP%]{height:58px;width:63px}.dashboard-editor[_ngcontent-%COMP%]{flex:1 1 auto;min-height:0;overflow:auto}.actions-buttons-container[_ngcontent-%COMP%]{display:flex;flex-direction:row;flex-wrap:nowrap;gap:5px}.dialog-close-icon[_ngcontent-%COMP%]{margin-right:15px;margin-top:6px}.mat-mdc-dialog-content[_ngcontent-%COMP%]{max-height:max-content}"]})}return r})();export{Ss as SettingsComponent};