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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/.github/copilot-instructions.md +1 -1
  2. package/.github/instructions/angular.instructions.md +46 -0
  3. package/README.md +49 -12
  4. package/package.json +2 -4
  5. package/public/3rdpartylicenses.txt +77 -77
  6. package/public/app-help.component.css.map +7 -0
  7. package/public/app.component.css.map +7 -0
  8. package/public/assets/help-docs/configuration.md +4 -4
  9. package/public/assets/help-docs/dashboards.md +4 -2
  10. package/public/assets/svg/icons.svg +1 -1
  11. package/public/boolean-control-config.component.css.map +7 -0
  12. package/public/boolean-multicontrol-options.component.css.map +7 -0
  13. package/public/chunk-3EWIS24B.js +5237 -0
  14. package/public/chunk-3EWIS24B.js.map +1 -0
  15. package/public/chunk-3VR3EA35.js +1022 -0
  16. package/public/chunk-3VR3EA35.js.map +1 -0
  17. package/public/chunk-63ILPRXC.js +2091 -0
  18. package/public/chunk-63ILPRXC.js.map +1 -0
  19. package/public/chunk-65ZWQBS6.js +3102 -0
  20. package/public/chunk-65ZWQBS6.js.map +1 -0
  21. package/public/chunk-B3LKEWZP.js +4950 -0
  22. package/public/chunk-B3LKEWZP.js.map +1 -0
  23. package/public/chunk-BIBIW64D.js +16773 -0
  24. package/public/chunk-BIBIW64D.js.map +1 -0
  25. package/public/chunk-BM53SC5N.js +77 -0
  26. package/public/chunk-BM53SC5N.js.map +7 -0
  27. package/public/chunk-D7ILNFDM.js +3059 -0
  28. package/public/chunk-D7ILNFDM.js.map +1 -0
  29. package/public/chunk-E24UNLSJ.js +2228 -0
  30. package/public/chunk-E24UNLSJ.js.map +1 -0
  31. package/public/chunk-J42S2ELC.js +5927 -0
  32. package/public/chunk-J42S2ELC.js.map +1 -0
  33. package/public/chunk-KC22A6VH.js +17 -0
  34. package/public/chunk-KC22A6VH.js.map +7 -0
  35. package/public/chunk-MCEJWZB2.js +116 -0
  36. package/public/chunk-MCEJWZB2.js.map +1 -0
  37. package/public/chunk-NBF6SE6O.js +89 -0
  38. package/public/chunk-NBF6SE6O.js.map +7 -0
  39. package/public/chunk-QC7VGVAR.js +343 -0
  40. package/public/chunk-QC7VGVAR.js.map +7 -0
  41. package/public/chunk-SDOP6T56.js +42377 -0
  42. package/public/chunk-SDOP6T56.js.map +1 -0
  43. package/public/chunk-U2DCSTRY.js +159 -0
  44. package/public/chunk-U2DCSTRY.js.map +7 -0
  45. package/public/chunk-UHVNAEXC.js +4752 -0
  46. package/public/chunk-UHVNAEXC.js.map +1 -0
  47. package/public/chunk-UQYTD5AC.js +2723 -0
  48. package/public/chunk-UQYTD5AC.js.map +1 -0
  49. package/public/chunk-XSABJ5NZ.js +272 -0
  50. package/public/chunk-XSABJ5NZ.js.map +7 -0
  51. package/public/chunk-Y6N6O2IP.js +19852 -0
  52. package/public/chunk-Y6N6O2IP.js.map +1 -0
  53. package/public/chunk-YGJLBLOX.js +2708 -0
  54. package/public/chunk-YGJLBLOX.js.map +1 -0
  55. package/public/chunk-YT33DHC3.js +591 -0
  56. package/public/chunk-YT33DHC3.js.map +7 -0
  57. package/public/chunk-YZXYVP72.js +4934 -0
  58. package/public/chunk-YZXYVP72.js.map +1 -0
  59. package/public/chunk-ZEHRDSTB.js +13727 -0
  60. package/public/chunk-ZEHRDSTB.js.map +1 -0
  61. package/public/config.component.css.map +7 -0
  62. package/public/dashboard-scroller.component.css.map +7 -0
  63. package/public/dashboard.component.css.map +7 -0
  64. package/public/dashboards-editor.component.css.map +7 -0
  65. package/public/data-inspector-row.component.css.map +7 -0
  66. package/public/data-inspector.component.css.map +7 -0
  67. package/public/dataset-chart-options.component.css.map +7 -0
  68. package/public/datasets.component.css.map +7 -0
  69. package/public/dialog-confirmation.component.css.map +7 -0
  70. package/public/dialog-dashboard-page-editor.component.css.map +7 -0
  71. package/public/dialog-frame.component.css.map +7 -0
  72. package/public/dialog-name.component.css.map +7 -0
  73. package/public/display-chart-options.component.css.map +7 -0
  74. package/public/display.component.css.map +7 -0
  75. package/public/gauge-steel.component.css.map +7 -0
  76. package/public/home.component.css.map +7 -0
  77. package/public/index.html +19 -17
  78. package/public/main.js +36423 -0
  79. package/public/main.js.map +1 -0
  80. package/public/menu-actions.component.css.map +7 -0
  81. package/public/menu-notifications.component.css.map +7 -0
  82. package/public/minichart.component.css.map +7 -0
  83. package/public/modal-user-credential.component.css.map +7 -0
  84. package/public/modal-widget-config.component.css.map +7 -0
  85. package/public/notification-badge.component.css.map +7 -0
  86. package/public/page-header.component.css.map +7 -0
  87. package/public/path-control-config.component.css.map +7 -0
  88. package/public/paths-options.component.css.map +7 -0
  89. package/public/polyfills.js +4422 -0
  90. package/public/polyfills.js.map +1 -0
  91. package/public/select-autopilot.component.css.map +7 -0
  92. package/public/select-icon.component.css.map +7 -0
  93. package/public/settings.component.css.map +7 -0
  94. package/public/signalk.component.css.map +7 -0
  95. package/public/styles.css +1651 -0
  96. package/public/styles.css.map +7 -0
  97. package/public/svg-autopilot.component.css.map +7 -0
  98. package/public/svg-racesteer.component.css.map +7 -0
  99. package/public/svg-simple-linear-gauge.component.css.map +7 -0
  100. package/public/svg-windsteer.component.css.map +7 -0
  101. package/public/tile-large-icon.component.css.map +7 -0
  102. package/public/units.component.css.map +7 -0
  103. package/public/upgrade-config.component.css.map +7 -0
  104. package/public/widget-autopilot.component.css.map +7 -0
  105. package/public/widget-boolean-switch.component.css.map +7 -0
  106. package/public/widget-datetime.component.css.map +7 -0
  107. package/public/widget-freeboardsk.component.css.map +7 -0
  108. package/public/widget-gauge-ng-compass.component.css.map +7 -0
  109. package/public/widget-gauge-ng-linear.component.css.map +7 -0
  110. package/public/widget-gauge-ng-radial.component.css.map +7 -0
  111. package/public/widget-gauge-steel.component.css.map +7 -0
  112. package/public/widget-horizon.component.css.map +7 -0
  113. package/public/widget-host.component.css.map +7 -0
  114. package/public/widget-iframe.component.css.map +7 -0
  115. package/public/widget-label.component.css.map +7 -0
  116. package/public/widget-list-card.component.css.map +7 -0
  117. package/public/widget-numeric.component.css.map +7 -0
  118. package/public/widget-position.component.css.map +7 -0
  119. package/public/widget-race-timer.component.css.map +7 -0
  120. package/public/widget-racer-line.component.css.map +7 -0
  121. package/public/widget-racer-timer.component.css.map +7 -0
  122. package/public/widget-simple-linear.component.css.map +7 -0
  123. package/public/widget-slider.component.css.map +7 -0
  124. package/public/widget-text.component.css.map +7 -0
  125. package/public/widget-title.component.css.map +7 -0
  126. package/public/widget-tutorial.component.css.map +7 -0
  127. package/public/widgets-list.component.css.map +7 -0
  128. package/public/assets/hammer.min.js +0 -7
  129. package/public/chunk-2YVW3TBK.js +0 -2
  130. package/public/chunk-35L7BBBD.js +0 -15
  131. package/public/chunk-3LEMFOCV.js +0 -3
  132. package/public/chunk-3LJAKLLW.js +0 -1
  133. package/public/chunk-4JJLPUET.js +0 -60
  134. package/public/chunk-CBUY7NMR.js +0 -2
  135. package/public/chunk-CQXWGD3T.js +0 -2
  136. package/public/chunk-EUFDL4TJ.js +0 -6
  137. package/public/chunk-FBFTGVZ6.js +0 -1
  138. package/public/chunk-HCXH72CD.js +0 -5
  139. package/public/chunk-JY3WVS7C.js +0 -2
  140. package/public/chunk-KTDDP73O.js +0 -2
  141. package/public/chunk-NMEZOCU2.js +0 -1
  142. package/public/chunk-NS2FPVWM.js +0 -4
  143. package/public/chunk-OSYHJB4F.js +0 -11
  144. package/public/chunk-PKNLASTF.js +0 -4
  145. package/public/chunk-Q2Y75POI.js +0 -1
  146. package/public/chunk-RRTCHHRC.js +0 -3
  147. package/public/chunk-TA4GACKT.js +0 -4
  148. package/public/chunk-TXPLRBW5.js +0 -2
  149. package/public/chunk-VHFBF47T.js +0 -1
  150. package/public/chunk-VYUMZVH2.js +0 -2
  151. package/public/chunk-XRGAX4LS.js +0 -2
  152. package/public/chunk-YNJRIFUM.js +0 -1
  153. package/public/chunk-ZBCOJLI4.js +0 -6
  154. package/public/main-XM5EHMUE.js +0 -50
  155. package/public/polyfills-KH22MU6U.js +0 -2
  156. package/public/styles-RECKN66R.css +0 -1
  157. /package/public/media/{KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP-ILKS6RVC.woff2 → KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2} +0 -0
  158. /package/public/media/{KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ-MJ3CERJ6.woff2 → KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2} +0 -0
  159. /package/public/media/{KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP-UW3XWY7P.woff2 → KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2} +0 -0
  160. /package/public/media/{KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP-U3JTBV4H.woff2 → KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2} +0 -0
  161. /package/public/media/{KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP-36ULTGLY.woff2 → KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2} +0 -0
  162. /package/public/media/{KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP-5NJLO2HW.woff2 → KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2} +0 -0
  163. /package/public/media/{KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP-2EL65J2O.woff2 → KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2} +0 -0
  164. /package/public/media/{KFOlCnqEu92Fr1MmSU5fABc4AMP6lbBP-XWLWMQVU.woff2 → KFOlCnqEu92Fr1MmSU5fABc4AMP6lbBP.woff2} +0 -0
  165. /package/public/media/{KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ-PWGJWDFE.woff2 → KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2} +0 -0
  166. /package/public/media/{KFOlCnqEu92Fr1MmSU5fBxc4AMP6lbBP-ITB7NUJC.woff2 → KFOlCnqEu92Fr1MmSU5fBxc4AMP6lbBP.woff2} +0 -0
  167. /package/public/media/{KFOlCnqEu92Fr1MmSU5fCBc4AMP6lbBP-32PLHKPQ.woff2 → KFOlCnqEu92Fr1MmSU5fCBc4AMP6lbBP.woff2} +0 -0
  168. /package/public/media/{KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP-QPSNQEDD.woff2 → KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2} +0 -0
  169. /package/public/media/{KFOlCnqEu92Fr1MmSU5fChc4AMP6lbBP-JKBSJZY3.woff2 → KFOlCnqEu92Fr1MmSU5fChc4AMP6lbBP.woff2} +0 -0
  170. /package/public/media/{KFOlCnqEu92Fr1MmSU5fCxc4AMP6lbBP-OG5AHRIX.woff2 → KFOlCnqEu92Fr1MmSU5fCxc4AMP6lbBP.woff2} +0 -0
  171. /package/public/media/{KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz-PPTELUJT.woff2 → KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2} +0 -0
  172. /package/public/media/{KFOmCnqEu92Fr1Mu4mxKKTU1Kg-SNGEW7FX.woff2 → KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2} +0 -0
  173. /package/public/media/{KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz-DRL4U32S.woff2 → KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2} +0 -0
  174. /package/public/media/{KFOmCnqEu92Fr1Mu72xKKTU1Kvnz-PRJ7OQMU.woff2 → KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2} +0 -0
  175. /package/public/media/{KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz-HW6RMPJ3.woff2 → KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2} +0 -0
  176. /package/public/media/{KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz-KZD6JQRT.woff2 → KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2} +0 -0
  177. /package/public/media/{KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz-Z72STTMG.woff2 → KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2} +0 -0
  178. /package/public/media/{flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ-CN2J7AYH.woff2 → flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.woff2} +0 -0
@@ -0,0 +1,2723 @@
1
+ import {
2
+ APP_ID,
3
+ ApplicationModule,
4
+ CSP_NONCE,
5
+ ChangeDetectionStrategy,
6
+ CommonModule,
7
+ Component,
8
+ Console,
9
+ DOCUMENT,
10
+ DomAdapter,
11
+ ElementRef,
12
+ ErrorHandler,
13
+ HostAttributeToken,
14
+ HttpClient,
15
+ INJECTOR_SCOPE,
16
+ Inject,
17
+ Injectable,
18
+ InjectionToken,
19
+ Injector,
20
+ Input,
21
+ MatCommonModule,
22
+ NgModule,
23
+ NgZone,
24
+ Optional,
25
+ PLATFORM_BROWSER_ID,
26
+ PLATFORM_ID,
27
+ PLATFORM_INITIALIZER,
28
+ RendererFactory2,
29
+ RendererStyleFlags2,
30
+ RuntimeError,
31
+ SecurityContext,
32
+ SkipSelf,
33
+ Subscription,
34
+ TESTABILITY,
35
+ TESTABILITY_GETTER,
36
+ Testability,
37
+ TestabilityRegistry,
38
+ TracingService,
39
+ Version,
40
+ ViewEncapsulation,
41
+ XSS_SECURITY_URL,
42
+ XhrFactory,
43
+ __spreadValues,
44
+ _global,
45
+ _sanitizeHtml,
46
+ _sanitizeUrl,
47
+ allowSanitizationBypassAndThrow,
48
+ booleanAttribute,
49
+ bypassSanitizationTrustHtml,
50
+ bypassSanitizationTrustResourceUrl,
51
+ bypassSanitizationTrustScript,
52
+ bypassSanitizationTrustStyle,
53
+ bypassSanitizationTrustUrl,
54
+ catchError,
55
+ createPlatformFactory,
56
+ finalize,
57
+ forkJoin,
58
+ forwardRef,
59
+ getDOM,
60
+ inject,
61
+ internalCreateApplication,
62
+ map,
63
+ of,
64
+ parseCookieValue,
65
+ platformCore,
66
+ setClassMetadata,
67
+ setDocument,
68
+ setRootDomAdapter,
69
+ share,
70
+ take,
71
+ tap,
72
+ throwError,
73
+ unwrapSafeValue,
74
+ ɵɵattribute,
75
+ ɵɵclassMap,
76
+ ɵɵclassProp,
77
+ ɵɵdefineComponent,
78
+ ɵɵdefineInjectable,
79
+ ɵɵdefineInjector,
80
+ ɵɵdefineNgModule,
81
+ ɵɵinject,
82
+ ɵɵprojection,
83
+ ɵɵprojectionDef
84
+ } from "./chunk-SDOP6T56.js";
85
+
86
+ // node_modules/@angular/platform-browser/fesm2022/dom_renderer.mjs
87
+ var EVENT_MANAGER_PLUGINS = new InjectionToken(ngDevMode ? "EventManagerPlugins" : "");
88
+ var EventManager = class _EventManager {
89
+ _zone;
90
+ _plugins;
91
+ _eventNameToPlugin = /* @__PURE__ */ new Map();
92
+ /**
93
+ * Initializes an instance of the event-manager service.
94
+ */
95
+ constructor(plugins, _zone) {
96
+ this._zone = _zone;
97
+ plugins.forEach((plugin) => {
98
+ plugin.manager = this;
99
+ });
100
+ this._plugins = plugins.slice().reverse();
101
+ }
102
+ /**
103
+ * Registers a handler for a specific element and event.
104
+ *
105
+ * @param element The HTML element to receive event notifications.
106
+ * @param eventName The name of the event to listen for.
107
+ * @param handler A function to call when the notification occurs. Receives the
108
+ * event object as an argument.
109
+ * @param options Options that configure how the event listener is bound.
110
+ * @returns A callback function that can be used to remove the handler.
111
+ */
112
+ addEventListener(element, eventName, handler, options) {
113
+ const plugin = this._findPluginFor(eventName);
114
+ return plugin.addEventListener(element, eventName, handler, options);
115
+ }
116
+ /**
117
+ * Retrieves the compilation zone in which event listeners are registered.
118
+ */
119
+ getZone() {
120
+ return this._zone;
121
+ }
122
+ /** @internal */
123
+ _findPluginFor(eventName) {
124
+ let plugin = this._eventNameToPlugin.get(eventName);
125
+ if (plugin) {
126
+ return plugin;
127
+ }
128
+ const plugins = this._plugins;
129
+ plugin = plugins.find((plugin2) => plugin2.supports(eventName));
130
+ if (!plugin) {
131
+ throw new RuntimeError(5101, (typeof ngDevMode === "undefined" || ngDevMode) && `No event manager plugin found for event ${eventName}`);
132
+ }
133
+ this._eventNameToPlugin.set(eventName, plugin);
134
+ return plugin;
135
+ }
136
+ static \u0275fac = function EventManager_Factory(__ngFactoryType__) {
137
+ return new (__ngFactoryType__ || _EventManager)(\u0275\u0275inject(EVENT_MANAGER_PLUGINS), \u0275\u0275inject(NgZone));
138
+ };
139
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
140
+ token: _EventManager,
141
+ factory: _EventManager.\u0275fac
142
+ });
143
+ };
144
+ (() => {
145
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(EventManager, [{
146
+ type: Injectable
147
+ }], () => [{
148
+ type: void 0,
149
+ decorators: [{
150
+ type: Inject,
151
+ args: [EVENT_MANAGER_PLUGINS]
152
+ }]
153
+ }, {
154
+ type: NgZone
155
+ }], null);
156
+ })();
157
+ var EventManagerPlugin = class {
158
+ _doc;
159
+ // TODO: remove (has some usage in G3)
160
+ constructor(_doc) {
161
+ this._doc = _doc;
162
+ }
163
+ // Using non-null assertion because it's set by EventManager's constructor
164
+ manager;
165
+ };
166
+ var APP_ID_ATTRIBUTE_NAME = "ng-app-id";
167
+ function removeElements(elements) {
168
+ for (const element of elements) {
169
+ element.remove();
170
+ }
171
+ }
172
+ function createStyleElement(style, doc) {
173
+ const styleElement = doc.createElement("style");
174
+ styleElement.textContent = style;
175
+ return styleElement;
176
+ }
177
+ function addServerStyles(doc, appId, inline, external) {
178
+ const elements = doc.head?.querySelectorAll(`style[${APP_ID_ATTRIBUTE_NAME}="${appId}"],link[${APP_ID_ATTRIBUTE_NAME}="${appId}"]`);
179
+ if (elements) {
180
+ for (const styleElement of elements) {
181
+ styleElement.removeAttribute(APP_ID_ATTRIBUTE_NAME);
182
+ if (styleElement instanceof HTMLLinkElement) {
183
+ external.set(styleElement.href.slice(styleElement.href.lastIndexOf("/") + 1), {
184
+ usage: 0,
185
+ elements: [styleElement]
186
+ });
187
+ } else if (styleElement.textContent) {
188
+ inline.set(styleElement.textContent, {
189
+ usage: 0,
190
+ elements: [styleElement]
191
+ });
192
+ }
193
+ }
194
+ }
195
+ }
196
+ function createLinkElement(url, doc) {
197
+ const linkElement = doc.createElement("link");
198
+ linkElement.setAttribute("rel", "stylesheet");
199
+ linkElement.setAttribute("href", url);
200
+ return linkElement;
201
+ }
202
+ var SharedStylesHost = class _SharedStylesHost {
203
+ doc;
204
+ appId;
205
+ nonce;
206
+ /**
207
+ * Provides usage information for active inline style content and associated HTML <style> elements.
208
+ * Embedded styles typically originate from the `styles` metadata of a rendered component.
209
+ */
210
+ inline = /* @__PURE__ */ new Map();
211
+ /**
212
+ * Provides usage information for active external style URLs and the associated HTML <link> elements.
213
+ * External styles typically originate from the `ɵɵExternalStylesFeature` of a rendered component.
214
+ */
215
+ external = /* @__PURE__ */ new Map();
216
+ /**
217
+ * Set of host DOM nodes that will have styles attached.
218
+ */
219
+ hosts = /* @__PURE__ */ new Set();
220
+ constructor(doc, appId, nonce, platformId = {}) {
221
+ this.doc = doc;
222
+ this.appId = appId;
223
+ this.nonce = nonce;
224
+ addServerStyles(doc, appId, this.inline, this.external);
225
+ this.hosts.add(doc.head);
226
+ }
227
+ /**
228
+ * Adds embedded styles to the DOM via HTML `style` elements.
229
+ * @param styles An array of style content strings.
230
+ */
231
+ addStyles(styles, urls) {
232
+ for (const value of styles) {
233
+ this.addUsage(value, this.inline, createStyleElement);
234
+ }
235
+ urls?.forEach((value) => this.addUsage(value, this.external, createLinkElement));
236
+ }
237
+ /**
238
+ * Removes embedded styles from the DOM that were added as HTML `style` elements.
239
+ * @param styles An array of style content strings.
240
+ */
241
+ removeStyles(styles, urls) {
242
+ for (const value of styles) {
243
+ this.removeUsage(value, this.inline);
244
+ }
245
+ urls?.forEach((value) => this.removeUsage(value, this.external));
246
+ }
247
+ addUsage(value, usages, creator) {
248
+ const record = usages.get(value);
249
+ if (record) {
250
+ if ((typeof ngDevMode === "undefined" || ngDevMode) && record.usage === 0) {
251
+ record.elements.forEach((element) => element.setAttribute("ng-style-reused", ""));
252
+ }
253
+ record.usage++;
254
+ } else {
255
+ usages.set(value, {
256
+ usage: 1,
257
+ elements: [...this.hosts].map((host) => this.addElement(host, creator(value, this.doc)))
258
+ });
259
+ }
260
+ }
261
+ removeUsage(value, usages) {
262
+ const record = usages.get(value);
263
+ if (record) {
264
+ record.usage--;
265
+ if (record.usage <= 0) {
266
+ removeElements(record.elements);
267
+ usages.delete(value);
268
+ }
269
+ }
270
+ }
271
+ ngOnDestroy() {
272
+ for (const [, {
273
+ elements
274
+ }] of [...this.inline, ...this.external]) {
275
+ removeElements(elements);
276
+ }
277
+ this.hosts.clear();
278
+ }
279
+ /**
280
+ * Adds a host node to the set of style hosts and adds all existing style usage to
281
+ * the newly added host node.
282
+ *
283
+ * This is currently only used for Shadow DOM encapsulation mode.
284
+ */
285
+ addHost(hostNode) {
286
+ this.hosts.add(hostNode);
287
+ for (const [style, {
288
+ elements
289
+ }] of this.inline) {
290
+ elements.push(this.addElement(hostNode, createStyleElement(style, this.doc)));
291
+ }
292
+ for (const [url, {
293
+ elements
294
+ }] of this.external) {
295
+ elements.push(this.addElement(hostNode, createLinkElement(url, this.doc)));
296
+ }
297
+ }
298
+ removeHost(hostNode) {
299
+ this.hosts.delete(hostNode);
300
+ }
301
+ addElement(host, element) {
302
+ if (this.nonce) {
303
+ element.setAttribute("nonce", this.nonce);
304
+ }
305
+ if (false) {
306
+ element.setAttribute(APP_ID_ATTRIBUTE_NAME, this.appId);
307
+ }
308
+ return host.appendChild(element);
309
+ }
310
+ static \u0275fac = function SharedStylesHost_Factory(__ngFactoryType__) {
311
+ return new (__ngFactoryType__ || _SharedStylesHost)(\u0275\u0275inject(DOCUMENT), \u0275\u0275inject(APP_ID), \u0275\u0275inject(CSP_NONCE, 8), \u0275\u0275inject(PLATFORM_ID));
312
+ };
313
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
314
+ token: _SharedStylesHost,
315
+ factory: _SharedStylesHost.\u0275fac
316
+ });
317
+ };
318
+ (() => {
319
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(SharedStylesHost, [{
320
+ type: Injectable
321
+ }], () => [{
322
+ type: Document,
323
+ decorators: [{
324
+ type: Inject,
325
+ args: [DOCUMENT]
326
+ }]
327
+ }, {
328
+ type: void 0,
329
+ decorators: [{
330
+ type: Inject,
331
+ args: [APP_ID]
332
+ }]
333
+ }, {
334
+ type: void 0,
335
+ decorators: [{
336
+ type: Inject,
337
+ args: [CSP_NONCE]
338
+ }, {
339
+ type: Optional
340
+ }]
341
+ }, {
342
+ type: void 0,
343
+ decorators: [{
344
+ type: Inject,
345
+ args: [PLATFORM_ID]
346
+ }]
347
+ }], null);
348
+ })();
349
+ var NAMESPACE_URIS = {
350
+ "svg": "http://www.w3.org/2000/svg",
351
+ "xhtml": "http://www.w3.org/1999/xhtml",
352
+ "xlink": "http://www.w3.org/1999/xlink",
353
+ "xml": "http://www.w3.org/XML/1998/namespace",
354
+ "xmlns": "http://www.w3.org/2000/xmlns/",
355
+ "math": "http://www.w3.org/1998/Math/MathML"
356
+ };
357
+ var COMPONENT_REGEX = /%COMP%/g;
358
+ var SOURCEMAP_URL_REGEXP = /\/\*#\s*sourceMappingURL=(.+?)\s*\*\//;
359
+ var PROTOCOL_REGEXP = /^https?:/;
360
+ var COMPONENT_VARIABLE = "%COMP%";
361
+ var HOST_ATTR = `_nghost-${COMPONENT_VARIABLE}`;
362
+ var CONTENT_ATTR = `_ngcontent-${COMPONENT_VARIABLE}`;
363
+ var REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT = true;
364
+ var REMOVE_STYLES_ON_COMPONENT_DESTROY = new InjectionToken(ngDevMode ? "RemoveStylesOnCompDestroy" : "", {
365
+ providedIn: "root",
366
+ factory: () => REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT
367
+ });
368
+ function shimContentAttribute(componentShortId) {
369
+ return CONTENT_ATTR.replace(COMPONENT_REGEX, componentShortId);
370
+ }
371
+ function shimHostAttribute(componentShortId) {
372
+ return HOST_ATTR.replace(COMPONENT_REGEX, componentShortId);
373
+ }
374
+ function shimStylesContent(compId, styles) {
375
+ return styles.map((s) => s.replace(COMPONENT_REGEX, compId));
376
+ }
377
+ function addBaseHrefToCssSourceMap(baseHref, styles) {
378
+ if (!baseHref) {
379
+ return styles;
380
+ }
381
+ const absoluteBaseHrefUrl = new URL(baseHref, "http://localhost");
382
+ return styles.map((cssContent) => {
383
+ if (!cssContent.includes("sourceMappingURL=")) {
384
+ return cssContent;
385
+ }
386
+ return cssContent.replace(SOURCEMAP_URL_REGEXP, (_, sourceMapUrl) => {
387
+ if (sourceMapUrl[0] === "/" || sourceMapUrl.startsWith("data:") || PROTOCOL_REGEXP.test(sourceMapUrl)) {
388
+ return `/*# sourceMappingURL=${sourceMapUrl} */`;
389
+ }
390
+ const {
391
+ pathname: resolvedSourceMapUrl
392
+ } = new URL(sourceMapUrl, absoluteBaseHrefUrl);
393
+ return `/*# sourceMappingURL=${resolvedSourceMapUrl} */`;
394
+ });
395
+ });
396
+ }
397
+ var DomRendererFactory2 = class _DomRendererFactory2 {
398
+ eventManager;
399
+ sharedStylesHost;
400
+ appId;
401
+ removeStylesOnCompDestroy;
402
+ doc;
403
+ platformId;
404
+ ngZone;
405
+ nonce;
406
+ tracingService;
407
+ rendererByCompId = /* @__PURE__ */ new Map();
408
+ defaultRenderer;
409
+ platformIsServer;
410
+ constructor(eventManager, sharedStylesHost, appId, removeStylesOnCompDestroy, doc, platformId, ngZone, nonce = null, tracingService = null) {
411
+ this.eventManager = eventManager;
412
+ this.sharedStylesHost = sharedStylesHost;
413
+ this.appId = appId;
414
+ this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;
415
+ this.doc = doc;
416
+ this.platformId = platformId;
417
+ this.ngZone = ngZone;
418
+ this.nonce = nonce;
419
+ this.tracingService = tracingService;
420
+ this.platformIsServer = false;
421
+ this.defaultRenderer = new DefaultDomRenderer2(eventManager, doc, ngZone, this.platformIsServer, this.tracingService);
422
+ }
423
+ createRenderer(element, type) {
424
+ if (!element || !type) {
425
+ return this.defaultRenderer;
426
+ }
427
+ if (false) {
428
+ type = __spreadProps(__spreadValues({}, type), {
429
+ encapsulation: ViewEncapsulation.Emulated
430
+ });
431
+ }
432
+ const renderer = this.getOrCreateRenderer(element, type);
433
+ if (renderer instanceof EmulatedEncapsulationDomRenderer2) {
434
+ renderer.applyToHost(element);
435
+ } else if (renderer instanceof NoneEncapsulationDomRenderer) {
436
+ renderer.applyStyles();
437
+ }
438
+ return renderer;
439
+ }
440
+ getOrCreateRenderer(element, type) {
441
+ const rendererByCompId = this.rendererByCompId;
442
+ let renderer = rendererByCompId.get(type.id);
443
+ if (!renderer) {
444
+ const doc = this.doc;
445
+ const ngZone = this.ngZone;
446
+ const eventManager = this.eventManager;
447
+ const sharedStylesHost = this.sharedStylesHost;
448
+ const removeStylesOnCompDestroy = this.removeStylesOnCompDestroy;
449
+ const platformIsServer = this.platformIsServer;
450
+ const tracingService = this.tracingService;
451
+ switch (type.encapsulation) {
452
+ case ViewEncapsulation.Emulated:
453
+ renderer = new EmulatedEncapsulationDomRenderer2(eventManager, sharedStylesHost, type, this.appId, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService);
454
+ break;
455
+ case ViewEncapsulation.ShadowDom:
456
+ return new ShadowDomRenderer(eventManager, sharedStylesHost, element, type, doc, ngZone, this.nonce, platformIsServer, tracingService);
457
+ default:
458
+ renderer = new NoneEncapsulationDomRenderer(eventManager, sharedStylesHost, type, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService);
459
+ break;
460
+ }
461
+ rendererByCompId.set(type.id, renderer);
462
+ }
463
+ return renderer;
464
+ }
465
+ ngOnDestroy() {
466
+ this.rendererByCompId.clear();
467
+ }
468
+ /**
469
+ * Used during HMR to clear any cached data about a component.
470
+ * @param componentId ID of the component that is being replaced.
471
+ */
472
+ componentReplaced(componentId) {
473
+ this.rendererByCompId.delete(componentId);
474
+ }
475
+ static \u0275fac = function DomRendererFactory2_Factory(__ngFactoryType__) {
476
+ return new (__ngFactoryType__ || _DomRendererFactory2)(\u0275\u0275inject(EventManager), \u0275\u0275inject(SharedStylesHost), \u0275\u0275inject(APP_ID), \u0275\u0275inject(REMOVE_STYLES_ON_COMPONENT_DESTROY), \u0275\u0275inject(DOCUMENT), \u0275\u0275inject(PLATFORM_ID), \u0275\u0275inject(NgZone), \u0275\u0275inject(CSP_NONCE), \u0275\u0275inject(TracingService, 8));
477
+ };
478
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
479
+ token: _DomRendererFactory2,
480
+ factory: _DomRendererFactory2.\u0275fac
481
+ });
482
+ };
483
+ (() => {
484
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomRendererFactory2, [{
485
+ type: Injectable
486
+ }], () => [{
487
+ type: EventManager
488
+ }, {
489
+ type: SharedStylesHost
490
+ }, {
491
+ type: void 0,
492
+ decorators: [{
493
+ type: Inject,
494
+ args: [APP_ID]
495
+ }]
496
+ }, {
497
+ type: void 0,
498
+ decorators: [{
499
+ type: Inject,
500
+ args: [REMOVE_STYLES_ON_COMPONENT_DESTROY]
501
+ }]
502
+ }, {
503
+ type: Document,
504
+ decorators: [{
505
+ type: Inject,
506
+ args: [DOCUMENT]
507
+ }]
508
+ }, {
509
+ type: Object,
510
+ decorators: [{
511
+ type: Inject,
512
+ args: [PLATFORM_ID]
513
+ }]
514
+ }, {
515
+ type: NgZone
516
+ }, {
517
+ type: void 0,
518
+ decorators: [{
519
+ type: Inject,
520
+ args: [CSP_NONCE]
521
+ }]
522
+ }, {
523
+ type: TracingService,
524
+ decorators: [{
525
+ type: Inject,
526
+ args: [TracingService]
527
+ }, {
528
+ type: Optional
529
+ }]
530
+ }], null);
531
+ })();
532
+ var DefaultDomRenderer2 = class {
533
+ eventManager;
534
+ doc;
535
+ ngZone;
536
+ platformIsServer;
537
+ tracingService;
538
+ data = /* @__PURE__ */ Object.create(null);
539
+ /**
540
+ * By default this renderer throws when encountering synthetic properties
541
+ * This can be disabled for example by the AsyncAnimationRendererFactory
542
+ */
543
+ throwOnSyntheticProps = true;
544
+ constructor(eventManager, doc, ngZone, platformIsServer, tracingService) {
545
+ this.eventManager = eventManager;
546
+ this.doc = doc;
547
+ this.ngZone = ngZone;
548
+ this.platformIsServer = platformIsServer;
549
+ this.tracingService = tracingService;
550
+ }
551
+ destroy() {
552
+ }
553
+ destroyNode = null;
554
+ createElement(name, namespace) {
555
+ if (namespace) {
556
+ return this.doc.createElementNS(NAMESPACE_URIS[namespace] || namespace, name);
557
+ }
558
+ return this.doc.createElement(name);
559
+ }
560
+ createComment(value) {
561
+ return this.doc.createComment(value);
562
+ }
563
+ createText(value) {
564
+ return this.doc.createTextNode(value);
565
+ }
566
+ appendChild(parent, newChild) {
567
+ const targetParent = isTemplateNode(parent) ? parent.content : parent;
568
+ targetParent.appendChild(newChild);
569
+ }
570
+ insertBefore(parent, newChild, refChild) {
571
+ if (parent) {
572
+ const targetParent = isTemplateNode(parent) ? parent.content : parent;
573
+ targetParent.insertBefore(newChild, refChild);
574
+ }
575
+ }
576
+ removeChild(_parent, oldChild) {
577
+ oldChild.remove();
578
+ }
579
+ selectRootElement(selectorOrNode, preserveContent) {
580
+ let el = typeof selectorOrNode === "string" ? this.doc.querySelector(selectorOrNode) : selectorOrNode;
581
+ if (!el) {
582
+ throw new RuntimeError(-5104, (typeof ngDevMode === "undefined" || ngDevMode) && `The selector "${selectorOrNode}" did not match any elements`);
583
+ }
584
+ if (!preserveContent) {
585
+ el.textContent = "";
586
+ }
587
+ return el;
588
+ }
589
+ parentNode(node) {
590
+ return node.parentNode;
591
+ }
592
+ nextSibling(node) {
593
+ return node.nextSibling;
594
+ }
595
+ setAttribute(el, name, value, namespace) {
596
+ if (namespace) {
597
+ name = namespace + ":" + name;
598
+ const namespaceUri = NAMESPACE_URIS[namespace];
599
+ if (namespaceUri) {
600
+ el.setAttributeNS(namespaceUri, name, value);
601
+ } else {
602
+ el.setAttribute(name, value);
603
+ }
604
+ } else {
605
+ el.setAttribute(name, value);
606
+ }
607
+ }
608
+ removeAttribute(el, name, namespace) {
609
+ if (namespace) {
610
+ const namespaceUri = NAMESPACE_URIS[namespace];
611
+ if (namespaceUri) {
612
+ el.removeAttributeNS(namespaceUri, name);
613
+ } else {
614
+ el.removeAttribute(`${namespace}:${name}`);
615
+ }
616
+ } else {
617
+ el.removeAttribute(name);
618
+ }
619
+ }
620
+ addClass(el, name) {
621
+ el.classList.add(name);
622
+ }
623
+ removeClass(el, name) {
624
+ el.classList.remove(name);
625
+ }
626
+ setStyle(el, style, value, flags) {
627
+ if (flags & (RendererStyleFlags2.DashCase | RendererStyleFlags2.Important)) {
628
+ el.style.setProperty(style, value, flags & RendererStyleFlags2.Important ? "important" : "");
629
+ } else {
630
+ el.style[style] = value;
631
+ }
632
+ }
633
+ removeStyle(el, style, flags) {
634
+ if (flags & RendererStyleFlags2.DashCase) {
635
+ el.style.removeProperty(style);
636
+ } else {
637
+ el.style[style] = "";
638
+ }
639
+ }
640
+ setProperty(el, name, value) {
641
+ if (el == null) {
642
+ return;
643
+ }
644
+ (typeof ngDevMode === "undefined" || ngDevMode) && this.throwOnSyntheticProps && checkNoSyntheticProp(name, "property");
645
+ el[name] = value;
646
+ }
647
+ setValue(node, value) {
648
+ node.nodeValue = value;
649
+ }
650
+ listen(target, event, callback, options) {
651
+ (typeof ngDevMode === "undefined" || ngDevMode) && this.throwOnSyntheticProps && checkNoSyntheticProp(event, "listener");
652
+ if (typeof target === "string") {
653
+ target = getDOM().getGlobalEventTarget(this.doc, target);
654
+ if (!target) {
655
+ throw new RuntimeError(5102, (typeof ngDevMode === "undefined" || ngDevMode) && `Unsupported event target ${target} for event ${event}`);
656
+ }
657
+ }
658
+ let wrappedCallback = this.decoratePreventDefault(callback);
659
+ if (this.tracingService?.wrapEventListener) {
660
+ wrappedCallback = this.tracingService.wrapEventListener(target, event, wrappedCallback);
661
+ }
662
+ return this.eventManager.addEventListener(target, event, wrappedCallback, options);
663
+ }
664
+ decoratePreventDefault(eventHandler) {
665
+ return (event) => {
666
+ if (event === "__ngUnwrap__") {
667
+ return eventHandler;
668
+ }
669
+ const allowDefaultBehavior = false ? this.ngZone.runGuarded(() => eventHandler(event)) : eventHandler(event);
670
+ if (allowDefaultBehavior === false) {
671
+ event.preventDefault();
672
+ }
673
+ return void 0;
674
+ };
675
+ }
676
+ };
677
+ var AT_CHARCODE = (() => "@".charCodeAt(0))();
678
+ function checkNoSyntheticProp(name, nameKind) {
679
+ if (name.charCodeAt(0) === AT_CHARCODE) {
680
+ throw new RuntimeError(5105, `Unexpected synthetic ${nameKind} ${name} found. Please make sure that:
681
+ - Make sure \`provideAnimationsAsync()\`, \`provideAnimations()\` or \`provideNoopAnimations()\` call was added to a list of providers used to bootstrap an application.
682
+ - There is a corresponding animation configuration named \`${name}\` defined in the \`animations\` field of the \`@Component\` decorator (see https://angular.dev/api/core/Component#animations).`);
683
+ }
684
+ }
685
+ function isTemplateNode(node) {
686
+ return node.tagName === "TEMPLATE" && node.content !== void 0;
687
+ }
688
+ var ShadowDomRenderer = class extends DefaultDomRenderer2 {
689
+ sharedStylesHost;
690
+ hostEl;
691
+ shadowRoot;
692
+ constructor(eventManager, sharedStylesHost, hostEl, component, doc, ngZone, nonce, platformIsServer, tracingService) {
693
+ super(eventManager, doc, ngZone, platformIsServer, tracingService);
694
+ this.sharedStylesHost = sharedStylesHost;
695
+ this.hostEl = hostEl;
696
+ this.shadowRoot = hostEl.attachShadow({
697
+ mode: "open"
698
+ });
699
+ this.sharedStylesHost.addHost(this.shadowRoot);
700
+ let styles = component.styles;
701
+ if (ngDevMode) {
702
+ const baseHref = getDOM().getBaseHref(doc) ?? "";
703
+ styles = addBaseHrefToCssSourceMap(baseHref, styles);
704
+ }
705
+ styles = shimStylesContent(component.id, styles);
706
+ for (const style of styles) {
707
+ const styleEl = document.createElement("style");
708
+ if (nonce) {
709
+ styleEl.setAttribute("nonce", nonce);
710
+ }
711
+ styleEl.textContent = style;
712
+ this.shadowRoot.appendChild(styleEl);
713
+ }
714
+ const styleUrls = component.getExternalStyles?.();
715
+ if (styleUrls) {
716
+ for (const styleUrl of styleUrls) {
717
+ const linkEl = createLinkElement(styleUrl, doc);
718
+ if (nonce) {
719
+ linkEl.setAttribute("nonce", nonce);
720
+ }
721
+ this.shadowRoot.appendChild(linkEl);
722
+ }
723
+ }
724
+ }
725
+ nodeOrShadowRoot(node) {
726
+ return node === this.hostEl ? this.shadowRoot : node;
727
+ }
728
+ appendChild(parent, newChild) {
729
+ return super.appendChild(this.nodeOrShadowRoot(parent), newChild);
730
+ }
731
+ insertBefore(parent, newChild, refChild) {
732
+ return super.insertBefore(this.nodeOrShadowRoot(parent), newChild, refChild);
733
+ }
734
+ removeChild(_parent, oldChild) {
735
+ return super.removeChild(null, oldChild);
736
+ }
737
+ parentNode(node) {
738
+ return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(node)));
739
+ }
740
+ destroy() {
741
+ this.sharedStylesHost.removeHost(this.shadowRoot);
742
+ }
743
+ };
744
+ var NoneEncapsulationDomRenderer = class extends DefaultDomRenderer2 {
745
+ sharedStylesHost;
746
+ removeStylesOnCompDestroy;
747
+ styles;
748
+ styleUrls;
749
+ constructor(eventManager, sharedStylesHost, component, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService, compId) {
750
+ super(eventManager, doc, ngZone, platformIsServer, tracingService);
751
+ this.sharedStylesHost = sharedStylesHost;
752
+ this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;
753
+ let styles = component.styles;
754
+ if (ngDevMode) {
755
+ const baseHref = getDOM().getBaseHref(doc) ?? "";
756
+ styles = addBaseHrefToCssSourceMap(baseHref, styles);
757
+ }
758
+ this.styles = compId ? shimStylesContent(compId, styles) : styles;
759
+ this.styleUrls = component.getExternalStyles?.(compId);
760
+ }
761
+ applyStyles() {
762
+ this.sharedStylesHost.addStyles(this.styles, this.styleUrls);
763
+ }
764
+ destroy() {
765
+ if (!this.removeStylesOnCompDestroy) {
766
+ return;
767
+ }
768
+ this.sharedStylesHost.removeStyles(this.styles, this.styleUrls);
769
+ }
770
+ };
771
+ var EmulatedEncapsulationDomRenderer2 = class extends NoneEncapsulationDomRenderer {
772
+ contentAttr;
773
+ hostAttr;
774
+ constructor(eventManager, sharedStylesHost, component, appId, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService) {
775
+ const compId = appId + "-" + component.id;
776
+ super(eventManager, sharedStylesHost, component, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService, compId);
777
+ this.contentAttr = shimContentAttribute(compId);
778
+ this.hostAttr = shimHostAttribute(compId);
779
+ }
780
+ applyToHost(element) {
781
+ this.applyStyles();
782
+ this.setAttribute(element, this.hostAttr, "");
783
+ }
784
+ createElement(parent, name) {
785
+ const el = super.createElement(parent, name);
786
+ super.setAttribute(el, this.contentAttr, "");
787
+ return el;
788
+ }
789
+ };
790
+
791
+ // node_modules/@angular/platform-browser/fesm2022/browser.mjs
792
+ var BrowserDomAdapter = class _BrowserDomAdapter extends DomAdapter {
793
+ supportsDOMEvents = true;
794
+ static makeCurrent() {
795
+ setRootDomAdapter(new _BrowserDomAdapter());
796
+ }
797
+ onAndCancel(el, evt, listener, options) {
798
+ el.addEventListener(evt, listener, options);
799
+ return () => {
800
+ el.removeEventListener(evt, listener, options);
801
+ };
802
+ }
803
+ dispatchEvent(el, evt) {
804
+ el.dispatchEvent(evt);
805
+ }
806
+ remove(node) {
807
+ node.remove();
808
+ }
809
+ createElement(tagName, doc) {
810
+ doc = doc || this.getDefaultDocument();
811
+ return doc.createElement(tagName);
812
+ }
813
+ createHtmlDocument() {
814
+ return document.implementation.createHTMLDocument("fakeTitle");
815
+ }
816
+ getDefaultDocument() {
817
+ return document;
818
+ }
819
+ isElementNode(node) {
820
+ return node.nodeType === Node.ELEMENT_NODE;
821
+ }
822
+ isShadowRoot(node) {
823
+ return node instanceof DocumentFragment;
824
+ }
825
+ /** @deprecated No longer being used in Ivy code. To be removed in version 14. */
826
+ getGlobalEventTarget(doc, target) {
827
+ if (target === "window") {
828
+ return window;
829
+ }
830
+ if (target === "document") {
831
+ return doc;
832
+ }
833
+ if (target === "body") {
834
+ return doc.body;
835
+ }
836
+ return null;
837
+ }
838
+ getBaseHref(doc) {
839
+ const href = getBaseElementHref();
840
+ return href == null ? null : relativePath(href);
841
+ }
842
+ resetBaseElement() {
843
+ baseElement = null;
844
+ }
845
+ getUserAgent() {
846
+ return window.navigator.userAgent;
847
+ }
848
+ getCookie(name) {
849
+ return parseCookieValue(document.cookie, name);
850
+ }
851
+ };
852
+ var baseElement = null;
853
+ function getBaseElementHref() {
854
+ baseElement = baseElement || document.head.querySelector("base");
855
+ return baseElement ? baseElement.getAttribute("href") : null;
856
+ }
857
+ function relativePath(url) {
858
+ return new URL(url, document.baseURI).pathname;
859
+ }
860
+ var BrowserGetTestability = class {
861
+ addToWindow(registry) {
862
+ _global["getAngularTestability"] = (elem, findInAncestors = true) => {
863
+ const testability = registry.findTestabilityInTree(elem, findInAncestors);
864
+ if (testability == null) {
865
+ throw new RuntimeError(5103, (typeof ngDevMode === "undefined" || ngDevMode) && "Could not find testability for element.");
866
+ }
867
+ return testability;
868
+ };
869
+ _global["getAllAngularTestabilities"] = () => registry.getAllTestabilities();
870
+ _global["getAllAngularRootElements"] = () => registry.getAllRootElements();
871
+ const whenAllStable = (callback) => {
872
+ const testabilities = _global["getAllAngularTestabilities"]();
873
+ let count = testabilities.length;
874
+ const decrement = function() {
875
+ count--;
876
+ if (count == 0) {
877
+ callback();
878
+ }
879
+ };
880
+ testabilities.forEach((testability) => {
881
+ testability.whenStable(decrement);
882
+ });
883
+ };
884
+ if (!_global["frameworkStabilizers"]) {
885
+ _global["frameworkStabilizers"] = [];
886
+ }
887
+ _global["frameworkStabilizers"].push(whenAllStable);
888
+ }
889
+ findTestabilityInTree(registry, elem, findInAncestors) {
890
+ if (elem == null) {
891
+ return null;
892
+ }
893
+ const t = registry.getTestability(elem);
894
+ if (t != null) {
895
+ return t;
896
+ } else if (!findInAncestors) {
897
+ return null;
898
+ }
899
+ if (getDOM().isShadowRoot(elem)) {
900
+ return this.findTestabilityInTree(registry, elem.host, true);
901
+ }
902
+ return this.findTestabilityInTree(registry, elem.parentElement, true);
903
+ }
904
+ };
905
+ var BrowserXhr = class _BrowserXhr {
906
+ build() {
907
+ return new XMLHttpRequest();
908
+ }
909
+ static \u0275fac = function BrowserXhr_Factory(__ngFactoryType__) {
910
+ return new (__ngFactoryType__ || _BrowserXhr)();
911
+ };
912
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
913
+ token: _BrowserXhr,
914
+ factory: _BrowserXhr.\u0275fac
915
+ });
916
+ };
917
+ (() => {
918
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(BrowserXhr, [{
919
+ type: Injectable
920
+ }], null, null);
921
+ })();
922
+ var DomEventsPlugin = class _DomEventsPlugin extends EventManagerPlugin {
923
+ constructor(doc) {
924
+ super(doc);
925
+ }
926
+ // This plugin should come last in the list of plugins, because it accepts all
927
+ // events.
928
+ supports(eventName) {
929
+ return true;
930
+ }
931
+ addEventListener(element, eventName, handler, options) {
932
+ element.addEventListener(eventName, handler, options);
933
+ return () => this.removeEventListener(element, eventName, handler, options);
934
+ }
935
+ removeEventListener(target, eventName, callback, options) {
936
+ return target.removeEventListener(eventName, callback, options);
937
+ }
938
+ static \u0275fac = function DomEventsPlugin_Factory(__ngFactoryType__) {
939
+ return new (__ngFactoryType__ || _DomEventsPlugin)(\u0275\u0275inject(DOCUMENT));
940
+ };
941
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
942
+ token: _DomEventsPlugin,
943
+ factory: _DomEventsPlugin.\u0275fac
944
+ });
945
+ };
946
+ (() => {
947
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomEventsPlugin, [{
948
+ type: Injectable
949
+ }], () => [{
950
+ type: void 0,
951
+ decorators: [{
952
+ type: Inject,
953
+ args: [DOCUMENT]
954
+ }]
955
+ }], null);
956
+ })();
957
+ var MODIFIER_KEYS = ["alt", "control", "meta", "shift"];
958
+ var _keyMap = {
959
+ "\b": "Backspace",
960
+ " ": "Tab",
961
+ "\x7F": "Delete",
962
+ "\x1B": "Escape",
963
+ "Del": "Delete",
964
+ "Esc": "Escape",
965
+ "Left": "ArrowLeft",
966
+ "Right": "ArrowRight",
967
+ "Up": "ArrowUp",
968
+ "Down": "ArrowDown",
969
+ "Menu": "ContextMenu",
970
+ "Scroll": "ScrollLock",
971
+ "Win": "OS"
972
+ };
973
+ var MODIFIER_KEY_GETTERS = {
974
+ "alt": (event) => event.altKey,
975
+ "control": (event) => event.ctrlKey,
976
+ "meta": (event) => event.metaKey,
977
+ "shift": (event) => event.shiftKey
978
+ };
979
+ var KeyEventsPlugin = class _KeyEventsPlugin extends EventManagerPlugin {
980
+ /**
981
+ * Initializes an instance of the browser plug-in.
982
+ * @param doc The document in which key events will be detected.
983
+ */
984
+ constructor(doc) {
985
+ super(doc);
986
+ }
987
+ /**
988
+ * Reports whether a named key event is supported.
989
+ * @param eventName The event name to query.
990
+ * @return True if the named key event is supported.
991
+ */
992
+ supports(eventName) {
993
+ return _KeyEventsPlugin.parseEventName(eventName) != null;
994
+ }
995
+ /**
996
+ * Registers a handler for a specific element and key event.
997
+ * @param element The HTML element to receive event notifications.
998
+ * @param eventName The name of the key event to listen for.
999
+ * @param handler A function to call when the notification occurs. Receives the
1000
+ * event object as an argument.
1001
+ * @returns The key event that was registered.
1002
+ */
1003
+ addEventListener(element, eventName, handler, options) {
1004
+ const parsedEvent = _KeyEventsPlugin.parseEventName(eventName);
1005
+ const outsideHandler = _KeyEventsPlugin.eventCallback(parsedEvent["fullKey"], handler, this.manager.getZone());
1006
+ return this.manager.getZone().runOutsideAngular(() => {
1007
+ return getDOM().onAndCancel(element, parsedEvent["domEventName"], outsideHandler, options);
1008
+ });
1009
+ }
1010
+ /**
1011
+ * Parses the user provided full keyboard event definition and normalizes it for
1012
+ * later internal use. It ensures the string is all lowercase, converts special
1013
+ * characters to a standard spelling, and orders all the values consistently.
1014
+ *
1015
+ * @param eventName The name of the key event to listen for.
1016
+ * @returns an object with the full, normalized string, and the dom event name
1017
+ * or null in the case when the event doesn't match a keyboard event.
1018
+ */
1019
+ static parseEventName(eventName) {
1020
+ const parts = eventName.toLowerCase().split(".");
1021
+ const domEventName = parts.shift();
1022
+ if (parts.length === 0 || !(domEventName === "keydown" || domEventName === "keyup")) {
1023
+ return null;
1024
+ }
1025
+ const key = _KeyEventsPlugin._normalizeKey(parts.pop());
1026
+ let fullKey = "";
1027
+ let codeIX = parts.indexOf("code");
1028
+ if (codeIX > -1) {
1029
+ parts.splice(codeIX, 1);
1030
+ fullKey = "code.";
1031
+ }
1032
+ MODIFIER_KEYS.forEach((modifierName) => {
1033
+ const index = parts.indexOf(modifierName);
1034
+ if (index > -1) {
1035
+ parts.splice(index, 1);
1036
+ fullKey += modifierName + ".";
1037
+ }
1038
+ });
1039
+ fullKey += key;
1040
+ if (parts.length != 0 || key.length === 0) {
1041
+ return null;
1042
+ }
1043
+ const result = {};
1044
+ result["domEventName"] = domEventName;
1045
+ result["fullKey"] = fullKey;
1046
+ return result;
1047
+ }
1048
+ /**
1049
+ * Determines whether the actual keys pressed match the configured key code string.
1050
+ * The `fullKeyCode` event is normalized in the `parseEventName` method when the
1051
+ * event is attached to the DOM during the `addEventListener` call. This is unseen
1052
+ * by the end user and is normalized for internal consistency and parsing.
1053
+ *
1054
+ * @param event The keyboard event.
1055
+ * @param fullKeyCode The normalized user defined expected key event string
1056
+ * @returns boolean.
1057
+ */
1058
+ static matchEventFullKeyCode(event, fullKeyCode) {
1059
+ let keycode = _keyMap[event.key] || event.key;
1060
+ let key = "";
1061
+ if (fullKeyCode.indexOf("code.") > -1) {
1062
+ keycode = event.code;
1063
+ key = "code.";
1064
+ }
1065
+ if (keycode == null || !keycode) return false;
1066
+ keycode = keycode.toLowerCase();
1067
+ if (keycode === " ") {
1068
+ keycode = "space";
1069
+ } else if (keycode === ".") {
1070
+ keycode = "dot";
1071
+ }
1072
+ MODIFIER_KEYS.forEach((modifierName) => {
1073
+ if (modifierName !== keycode) {
1074
+ const modifierGetter = MODIFIER_KEY_GETTERS[modifierName];
1075
+ if (modifierGetter(event)) {
1076
+ key += modifierName + ".";
1077
+ }
1078
+ }
1079
+ });
1080
+ key += keycode;
1081
+ return key === fullKeyCode;
1082
+ }
1083
+ /**
1084
+ * Configures a handler callback for a key event.
1085
+ * @param fullKey The event name that combines all simultaneous keystrokes.
1086
+ * @param handler The function that responds to the key event.
1087
+ * @param zone The zone in which the event occurred.
1088
+ * @returns A callback function.
1089
+ */
1090
+ static eventCallback(fullKey, handler, zone) {
1091
+ return (event) => {
1092
+ if (_KeyEventsPlugin.matchEventFullKeyCode(event, fullKey)) {
1093
+ zone.runGuarded(() => handler(event));
1094
+ }
1095
+ };
1096
+ }
1097
+ /** @internal */
1098
+ static _normalizeKey(keyName) {
1099
+ return keyName === "esc" ? "escape" : keyName;
1100
+ }
1101
+ static \u0275fac = function KeyEventsPlugin_Factory(__ngFactoryType__) {
1102
+ return new (__ngFactoryType__ || _KeyEventsPlugin)(\u0275\u0275inject(DOCUMENT));
1103
+ };
1104
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
1105
+ token: _KeyEventsPlugin,
1106
+ factory: _KeyEventsPlugin.\u0275fac
1107
+ });
1108
+ };
1109
+ (() => {
1110
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(KeyEventsPlugin, [{
1111
+ type: Injectable
1112
+ }], () => [{
1113
+ type: void 0,
1114
+ decorators: [{
1115
+ type: Inject,
1116
+ args: [DOCUMENT]
1117
+ }]
1118
+ }], null);
1119
+ })();
1120
+ function bootstrapApplication(rootComponent, options) {
1121
+ const config = __spreadValues({
1122
+ rootComponent
1123
+ }, createProvidersConfig(options));
1124
+ if (false) {
1125
+ return resolveComponentResources(fetch).catch((error) => {
1126
+ console.error(error);
1127
+ return Promise.resolve();
1128
+ }).then(() => internalCreateApplication(config));
1129
+ }
1130
+ return internalCreateApplication(config);
1131
+ }
1132
+ function createProvidersConfig(options) {
1133
+ return {
1134
+ appProviders: [...BROWSER_MODULE_PROVIDERS, ...options?.providers ?? []],
1135
+ platformProviders: INTERNAL_BROWSER_PLATFORM_PROVIDERS
1136
+ };
1137
+ }
1138
+ function initDomAdapter() {
1139
+ BrowserDomAdapter.makeCurrent();
1140
+ }
1141
+ function errorHandler() {
1142
+ return new ErrorHandler();
1143
+ }
1144
+ function _document() {
1145
+ setDocument(document);
1146
+ return document;
1147
+ }
1148
+ var INTERNAL_BROWSER_PLATFORM_PROVIDERS = [{
1149
+ provide: PLATFORM_ID,
1150
+ useValue: PLATFORM_BROWSER_ID
1151
+ }, {
1152
+ provide: PLATFORM_INITIALIZER,
1153
+ useValue: initDomAdapter,
1154
+ multi: true
1155
+ }, {
1156
+ provide: DOCUMENT,
1157
+ useFactory: _document
1158
+ }];
1159
+ var platformBrowser = createPlatformFactory(platformCore, "browser", INTERNAL_BROWSER_PLATFORM_PROVIDERS);
1160
+ var BROWSER_MODULE_PROVIDERS_MARKER = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "BrowserModule Providers Marker" : "");
1161
+ var TESTABILITY_PROVIDERS = [{
1162
+ provide: TESTABILITY_GETTER,
1163
+ useClass: BrowserGetTestability
1164
+ }, {
1165
+ provide: TESTABILITY,
1166
+ useClass: Testability,
1167
+ deps: [NgZone, TestabilityRegistry, TESTABILITY_GETTER]
1168
+ }, {
1169
+ provide: Testability,
1170
+ // Also provide as `Testability` for backwards-compatibility.
1171
+ useClass: Testability,
1172
+ deps: [NgZone, TestabilityRegistry, TESTABILITY_GETTER]
1173
+ }];
1174
+ var BROWSER_MODULE_PROVIDERS = [{
1175
+ provide: INJECTOR_SCOPE,
1176
+ useValue: "root"
1177
+ }, {
1178
+ provide: ErrorHandler,
1179
+ useFactory: errorHandler
1180
+ }, {
1181
+ provide: EVENT_MANAGER_PLUGINS,
1182
+ useClass: DomEventsPlugin,
1183
+ multi: true,
1184
+ deps: [DOCUMENT]
1185
+ }, {
1186
+ provide: EVENT_MANAGER_PLUGINS,
1187
+ useClass: KeyEventsPlugin,
1188
+ multi: true,
1189
+ deps: [DOCUMENT]
1190
+ }, DomRendererFactory2, SharedStylesHost, EventManager, {
1191
+ provide: RendererFactory2,
1192
+ useExisting: DomRendererFactory2
1193
+ }, {
1194
+ provide: XhrFactory,
1195
+ useClass: BrowserXhr
1196
+ }, typeof ngDevMode === "undefined" || ngDevMode ? {
1197
+ provide: BROWSER_MODULE_PROVIDERS_MARKER,
1198
+ useValue: true
1199
+ } : []];
1200
+ var BrowserModule = class _BrowserModule {
1201
+ constructor() {
1202
+ if (typeof ngDevMode === "undefined" || ngDevMode) {
1203
+ const providersAlreadyPresent = inject(BROWSER_MODULE_PROVIDERS_MARKER, {
1204
+ optional: true,
1205
+ skipSelf: true
1206
+ });
1207
+ if (providersAlreadyPresent) {
1208
+ throw new RuntimeError(5100, `Providers from the \`BrowserModule\` have already been loaded. If you need access to common directives such as NgIf and NgFor, import the \`CommonModule\` instead.`);
1209
+ }
1210
+ }
1211
+ }
1212
+ static \u0275fac = function BrowserModule_Factory(__ngFactoryType__) {
1213
+ return new (__ngFactoryType__ || _BrowserModule)();
1214
+ };
1215
+ static \u0275mod = /* @__PURE__ */ \u0275\u0275defineNgModule({
1216
+ type: _BrowserModule,
1217
+ exports: [CommonModule, ApplicationModule]
1218
+ });
1219
+ static \u0275inj = /* @__PURE__ */ \u0275\u0275defineInjector({
1220
+ providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],
1221
+ imports: [CommonModule, ApplicationModule]
1222
+ });
1223
+ };
1224
+ (() => {
1225
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(BrowserModule, [{
1226
+ type: NgModule,
1227
+ args: [{
1228
+ providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],
1229
+ exports: [CommonModule, ApplicationModule]
1230
+ }]
1231
+ }], () => [], null);
1232
+ })();
1233
+
1234
+ // node_modules/@angular/platform-browser/fesm2022/platform-browser.mjs
1235
+ var Meta = class _Meta {
1236
+ _doc;
1237
+ _dom;
1238
+ constructor(_doc) {
1239
+ this._doc = _doc;
1240
+ this._dom = getDOM();
1241
+ }
1242
+ /**
1243
+ * Retrieves or creates a specific `<meta>` tag element in the current HTML document.
1244
+ * In searching for an existing tag, Angular attempts to match the `name` or `property` attribute
1245
+ * values in the provided tag definition, and verifies that all other attribute values are equal.
1246
+ * If an existing element is found, it is returned and is not modified in any way.
1247
+ * @param tag The definition of a `<meta>` element to match or create.
1248
+ * @param forceCreation True to create a new element without checking whether one already exists.
1249
+ * @returns The existing element with the same attributes and values if found,
1250
+ * the new element if no match is found, or `null` if the tag parameter is not defined.
1251
+ */
1252
+ addTag(tag, forceCreation = false) {
1253
+ if (!tag) return null;
1254
+ return this._getOrCreateElement(tag, forceCreation);
1255
+ }
1256
+ /**
1257
+ * Retrieves or creates a set of `<meta>` tag elements in the current HTML document.
1258
+ * In searching for an existing tag, Angular attempts to match the `name` or `property` attribute
1259
+ * values in the provided tag definition, and verifies that all other attribute values are equal.
1260
+ * @param tags An array of tag definitions to match or create.
1261
+ * @param forceCreation True to create new elements without checking whether they already exist.
1262
+ * @returns The matching elements if found, or the new elements.
1263
+ */
1264
+ addTags(tags, forceCreation = false) {
1265
+ if (!tags) return [];
1266
+ return tags.reduce((result, tag) => {
1267
+ if (tag) {
1268
+ result.push(this._getOrCreateElement(tag, forceCreation));
1269
+ }
1270
+ return result;
1271
+ }, []);
1272
+ }
1273
+ /**
1274
+ * Retrieves a `<meta>` tag element in the current HTML document.
1275
+ * @param attrSelector The tag attribute and value to match against, in the format
1276
+ * `"tag_attribute='value string'"`.
1277
+ * @returns The matching element, if any.
1278
+ */
1279
+ getTag(attrSelector) {
1280
+ if (!attrSelector) return null;
1281
+ return this._doc.querySelector(`meta[${attrSelector}]`) || null;
1282
+ }
1283
+ /**
1284
+ * Retrieves a set of `<meta>` tag elements in the current HTML document.
1285
+ * @param attrSelector The tag attribute and value to match against, in the format
1286
+ * `"tag_attribute='value string'"`.
1287
+ * @returns The matching elements, if any.
1288
+ */
1289
+ getTags(attrSelector) {
1290
+ if (!attrSelector) return [];
1291
+ const list = this._doc.querySelectorAll(`meta[${attrSelector}]`);
1292
+ return list ? [].slice.call(list) : [];
1293
+ }
1294
+ /**
1295
+ * Modifies an existing `<meta>` tag element in the current HTML document.
1296
+ * @param tag The tag description with which to replace the existing tag content.
1297
+ * @param selector A tag attribute and value to match against, to identify
1298
+ * an existing tag. A string in the format `"tag_attribute=`value string`"`.
1299
+ * If not supplied, matches a tag with the same `name` or `property` attribute value as the
1300
+ * replacement tag.
1301
+ * @return The modified element.
1302
+ */
1303
+ updateTag(tag, selector) {
1304
+ if (!tag) return null;
1305
+ selector = selector || this._parseSelector(tag);
1306
+ const meta = this.getTag(selector);
1307
+ if (meta) {
1308
+ return this._setMetaElementAttributes(tag, meta);
1309
+ }
1310
+ return this._getOrCreateElement(tag, true);
1311
+ }
1312
+ /**
1313
+ * Removes an existing `<meta>` tag element from the current HTML document.
1314
+ * @param attrSelector A tag attribute and value to match against, to identify
1315
+ * an existing tag. A string in the format `"tag_attribute=`value string`"`.
1316
+ */
1317
+ removeTag(attrSelector) {
1318
+ this.removeTagElement(this.getTag(attrSelector));
1319
+ }
1320
+ /**
1321
+ * Removes an existing `<meta>` tag element from the current HTML document.
1322
+ * @param meta The tag definition to match against to identify an existing tag.
1323
+ */
1324
+ removeTagElement(meta) {
1325
+ if (meta) {
1326
+ this._dom.remove(meta);
1327
+ }
1328
+ }
1329
+ _getOrCreateElement(meta, forceCreation = false) {
1330
+ if (!forceCreation) {
1331
+ const selector = this._parseSelector(meta);
1332
+ const elem = this.getTags(selector).filter((elem2) => this._containsAttributes(meta, elem2))[0];
1333
+ if (elem !== void 0) return elem;
1334
+ }
1335
+ const element = this._dom.createElement("meta");
1336
+ this._setMetaElementAttributes(meta, element);
1337
+ const head = this._doc.getElementsByTagName("head")[0];
1338
+ head.appendChild(element);
1339
+ return element;
1340
+ }
1341
+ _setMetaElementAttributes(tag, el) {
1342
+ Object.keys(tag).forEach((prop) => el.setAttribute(this._getMetaKeyMap(prop), tag[prop]));
1343
+ return el;
1344
+ }
1345
+ _parseSelector(tag) {
1346
+ const attr = tag.name ? "name" : "property";
1347
+ return `${attr}="${tag[attr]}"`;
1348
+ }
1349
+ _containsAttributes(tag, elem) {
1350
+ return Object.keys(tag).every((key) => elem.getAttribute(this._getMetaKeyMap(key)) === tag[key]);
1351
+ }
1352
+ _getMetaKeyMap(prop) {
1353
+ return META_KEYS_MAP[prop] || prop;
1354
+ }
1355
+ static \u0275fac = function Meta_Factory(__ngFactoryType__) {
1356
+ return new (__ngFactoryType__ || _Meta)(\u0275\u0275inject(DOCUMENT));
1357
+ };
1358
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
1359
+ token: _Meta,
1360
+ factory: _Meta.\u0275fac,
1361
+ providedIn: "root"
1362
+ });
1363
+ };
1364
+ (() => {
1365
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Meta, [{
1366
+ type: Injectable,
1367
+ args: [{
1368
+ providedIn: "root"
1369
+ }]
1370
+ }], () => [{
1371
+ type: void 0,
1372
+ decorators: [{
1373
+ type: Inject,
1374
+ args: [DOCUMENT]
1375
+ }]
1376
+ }], null);
1377
+ })();
1378
+ var META_KEYS_MAP = {
1379
+ httpEquiv: "http-equiv"
1380
+ };
1381
+ var Title = class _Title {
1382
+ _doc;
1383
+ constructor(_doc) {
1384
+ this._doc = _doc;
1385
+ }
1386
+ /**
1387
+ * Get the title of the current HTML document.
1388
+ */
1389
+ getTitle() {
1390
+ return this._doc.title;
1391
+ }
1392
+ /**
1393
+ * Set the title of the current HTML document.
1394
+ * @param newTitle
1395
+ */
1396
+ setTitle(newTitle) {
1397
+ this._doc.title = newTitle || "";
1398
+ }
1399
+ static \u0275fac = function Title_Factory(__ngFactoryType__) {
1400
+ return new (__ngFactoryType__ || _Title)(\u0275\u0275inject(DOCUMENT));
1401
+ };
1402
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
1403
+ token: _Title,
1404
+ factory: _Title.\u0275fac,
1405
+ providedIn: "root"
1406
+ });
1407
+ };
1408
+ (() => {
1409
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Title, [{
1410
+ type: Injectable,
1411
+ args: [{
1412
+ providedIn: "root"
1413
+ }]
1414
+ }], () => [{
1415
+ type: void 0,
1416
+ decorators: [{
1417
+ type: Inject,
1418
+ args: [DOCUMENT]
1419
+ }]
1420
+ }], null);
1421
+ })();
1422
+ var EVENT_NAMES = {
1423
+ // pan
1424
+ "pan": true,
1425
+ "panstart": true,
1426
+ "panmove": true,
1427
+ "panend": true,
1428
+ "pancancel": true,
1429
+ "panleft": true,
1430
+ "panright": true,
1431
+ "panup": true,
1432
+ "pandown": true,
1433
+ // pinch
1434
+ "pinch": true,
1435
+ "pinchstart": true,
1436
+ "pinchmove": true,
1437
+ "pinchend": true,
1438
+ "pinchcancel": true,
1439
+ "pinchin": true,
1440
+ "pinchout": true,
1441
+ // press
1442
+ "press": true,
1443
+ "pressup": true,
1444
+ // rotate
1445
+ "rotate": true,
1446
+ "rotatestart": true,
1447
+ "rotatemove": true,
1448
+ "rotateend": true,
1449
+ "rotatecancel": true,
1450
+ // swipe
1451
+ "swipe": true,
1452
+ "swipeleft": true,
1453
+ "swiperight": true,
1454
+ "swipeup": true,
1455
+ "swipedown": true,
1456
+ // tap
1457
+ "tap": true,
1458
+ "doubletap": true
1459
+ };
1460
+ var HAMMER_GESTURE_CONFIG = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "HammerGestureConfig" : "");
1461
+ var HAMMER_LOADER = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "HammerLoader" : "");
1462
+ var HammerGestureConfig = class _HammerGestureConfig {
1463
+ /**
1464
+ * A set of supported event names for gestures to be used in Angular.
1465
+ * Angular supports all built-in recognizers, as listed in
1466
+ * [HammerJS documentation](https://hammerjs.github.io/).
1467
+ */
1468
+ events = [];
1469
+ /**
1470
+ * Maps gesture event names to a set of configuration options
1471
+ * that specify overrides to the default values for specific properties.
1472
+ *
1473
+ * The key is a supported event name to be configured,
1474
+ * and the options object contains a set of properties, with override values
1475
+ * to be applied to the named recognizer event.
1476
+ * For example, to disable recognition of the rotate event, specify
1477
+ * `{"rotate": {"enable": false}}`.
1478
+ *
1479
+ * Properties that are not present take the HammerJS default values.
1480
+ * For information about which properties are supported for which events,
1481
+ * and their allowed and default values, see
1482
+ * [HammerJS documentation](https://hammerjs.github.io/).
1483
+ *
1484
+ */
1485
+ overrides = {};
1486
+ /**
1487
+ * Properties whose default values can be overridden for a given event.
1488
+ * Different sets of properties apply to different events.
1489
+ * For information about which properties are supported for which events,
1490
+ * and their allowed and default values, see
1491
+ * [HammerJS documentation](https://hammerjs.github.io/).
1492
+ */
1493
+ options;
1494
+ /**
1495
+ * Creates a [HammerJS Manager](https://hammerjs.github.io/api/#hammermanager)
1496
+ * and attaches it to a given HTML element.
1497
+ * @param element The element that will recognize gestures.
1498
+ * @returns A HammerJS event-manager object.
1499
+ */
1500
+ buildHammer(element) {
1501
+ const mc = new Hammer(element, this.options);
1502
+ mc.get("pinch").set({
1503
+ enable: true
1504
+ });
1505
+ mc.get("rotate").set({
1506
+ enable: true
1507
+ });
1508
+ for (const eventName in this.overrides) {
1509
+ mc.get(eventName).set(this.overrides[eventName]);
1510
+ }
1511
+ return mc;
1512
+ }
1513
+ static \u0275fac = function HammerGestureConfig_Factory(__ngFactoryType__) {
1514
+ return new (__ngFactoryType__ || _HammerGestureConfig)();
1515
+ };
1516
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
1517
+ token: _HammerGestureConfig,
1518
+ factory: _HammerGestureConfig.\u0275fac
1519
+ });
1520
+ };
1521
+ (() => {
1522
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HammerGestureConfig, [{
1523
+ type: Injectable
1524
+ }], null, null);
1525
+ })();
1526
+ var HammerGesturesPlugin = class _HammerGesturesPlugin extends EventManagerPlugin {
1527
+ _config;
1528
+ _injector;
1529
+ loader;
1530
+ _loaderPromise = null;
1531
+ constructor(doc, _config, _injector, loader) {
1532
+ super(doc);
1533
+ this._config = _config;
1534
+ this._injector = _injector;
1535
+ this.loader = loader;
1536
+ }
1537
+ supports(eventName) {
1538
+ if (!EVENT_NAMES.hasOwnProperty(eventName.toLowerCase()) && !this.isCustomEvent(eventName)) {
1539
+ return false;
1540
+ }
1541
+ if (!window.Hammer && !this.loader) {
1542
+ if (typeof ngDevMode === "undefined" || ngDevMode) {
1543
+ const _console = this._injector.get(Console);
1544
+ _console.warn(`The "${eventName}" event cannot be bound because Hammer.JS is not loaded and no custom loader has been specified.`);
1545
+ }
1546
+ return false;
1547
+ }
1548
+ return true;
1549
+ }
1550
+ addEventListener(element, eventName, handler) {
1551
+ const zone = this.manager.getZone();
1552
+ eventName = eventName.toLowerCase();
1553
+ if (!window.Hammer && this.loader) {
1554
+ this._loaderPromise = this._loaderPromise || zone.runOutsideAngular(() => this.loader());
1555
+ let cancelRegistration = false;
1556
+ let deregister = () => {
1557
+ cancelRegistration = true;
1558
+ };
1559
+ zone.runOutsideAngular(() => this._loaderPromise.then(() => {
1560
+ if (!window.Hammer) {
1561
+ if (typeof ngDevMode === "undefined" || ngDevMode) {
1562
+ const _console = this._injector.get(Console);
1563
+ _console.warn(`The custom HAMMER_LOADER completed, but Hammer.JS is not present.`);
1564
+ }
1565
+ deregister = () => {
1566
+ };
1567
+ return;
1568
+ }
1569
+ if (!cancelRegistration) {
1570
+ deregister = this.addEventListener(element, eventName, handler);
1571
+ }
1572
+ }).catch(() => {
1573
+ if (typeof ngDevMode === "undefined" || ngDevMode) {
1574
+ const _console = this._injector.get(Console);
1575
+ _console.warn(`The "${eventName}" event cannot be bound because the custom Hammer.JS loader failed.`);
1576
+ }
1577
+ deregister = () => {
1578
+ };
1579
+ }));
1580
+ return () => {
1581
+ deregister();
1582
+ };
1583
+ }
1584
+ return zone.runOutsideAngular(() => {
1585
+ const mc = this._config.buildHammer(element);
1586
+ const callback = function(eventObj) {
1587
+ zone.runGuarded(function() {
1588
+ handler(eventObj);
1589
+ });
1590
+ };
1591
+ mc.on(eventName, callback);
1592
+ return () => {
1593
+ mc.off(eventName, callback);
1594
+ if (typeof mc.destroy === "function") {
1595
+ mc.destroy();
1596
+ }
1597
+ };
1598
+ });
1599
+ }
1600
+ isCustomEvent(eventName) {
1601
+ return this._config.events.indexOf(eventName) > -1;
1602
+ }
1603
+ static \u0275fac = function HammerGesturesPlugin_Factory(__ngFactoryType__) {
1604
+ return new (__ngFactoryType__ || _HammerGesturesPlugin)(\u0275\u0275inject(DOCUMENT), \u0275\u0275inject(HAMMER_GESTURE_CONFIG), \u0275\u0275inject(Injector), \u0275\u0275inject(HAMMER_LOADER, 8));
1605
+ };
1606
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
1607
+ token: _HammerGesturesPlugin,
1608
+ factory: _HammerGesturesPlugin.\u0275fac
1609
+ });
1610
+ };
1611
+ (() => {
1612
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HammerGesturesPlugin, [{
1613
+ type: Injectable
1614
+ }], () => [{
1615
+ type: void 0,
1616
+ decorators: [{
1617
+ type: Inject,
1618
+ args: [DOCUMENT]
1619
+ }]
1620
+ }, {
1621
+ type: HammerGestureConfig,
1622
+ decorators: [{
1623
+ type: Inject,
1624
+ args: [HAMMER_GESTURE_CONFIG]
1625
+ }]
1626
+ }, {
1627
+ type: Injector
1628
+ }, {
1629
+ type: void 0,
1630
+ decorators: [{
1631
+ type: Optional
1632
+ }, {
1633
+ type: Inject,
1634
+ args: [HAMMER_LOADER]
1635
+ }]
1636
+ }], null);
1637
+ })();
1638
+ var HammerModule = class _HammerModule {
1639
+ static \u0275fac = function HammerModule_Factory(__ngFactoryType__) {
1640
+ return new (__ngFactoryType__ || _HammerModule)();
1641
+ };
1642
+ static \u0275mod = /* @__PURE__ */ \u0275\u0275defineNgModule({
1643
+ type: _HammerModule
1644
+ });
1645
+ static \u0275inj = /* @__PURE__ */ \u0275\u0275defineInjector({
1646
+ providers: [{
1647
+ provide: EVENT_MANAGER_PLUGINS,
1648
+ useClass: HammerGesturesPlugin,
1649
+ multi: true,
1650
+ deps: [DOCUMENT, HAMMER_GESTURE_CONFIG, Injector, [new Optional(), HAMMER_LOADER]]
1651
+ }, {
1652
+ provide: HAMMER_GESTURE_CONFIG,
1653
+ useClass: HammerGestureConfig
1654
+ }]
1655
+ });
1656
+ };
1657
+ (() => {
1658
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HammerModule, [{
1659
+ type: NgModule,
1660
+ args: [{
1661
+ providers: [{
1662
+ provide: EVENT_MANAGER_PLUGINS,
1663
+ useClass: HammerGesturesPlugin,
1664
+ multi: true,
1665
+ deps: [DOCUMENT, HAMMER_GESTURE_CONFIG, Injector, [new Optional(), HAMMER_LOADER]]
1666
+ }, {
1667
+ provide: HAMMER_GESTURE_CONFIG,
1668
+ useClass: HammerGestureConfig
1669
+ }]
1670
+ }]
1671
+ }], null, null);
1672
+ })();
1673
+ var DomSanitizer = class _DomSanitizer {
1674
+ static \u0275fac = function DomSanitizer_Factory(__ngFactoryType__) {
1675
+ return new (__ngFactoryType__ || _DomSanitizer)();
1676
+ };
1677
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
1678
+ token: _DomSanitizer,
1679
+ factory: function DomSanitizer_Factory(__ngFactoryType__) {
1680
+ let __ngConditionalFactory__ = null;
1681
+ if (__ngFactoryType__) {
1682
+ __ngConditionalFactory__ = new (__ngFactoryType__ || _DomSanitizer)();
1683
+ } else {
1684
+ __ngConditionalFactory__ = \u0275\u0275inject(DomSanitizerImpl);
1685
+ }
1686
+ return __ngConditionalFactory__;
1687
+ },
1688
+ providedIn: "root"
1689
+ });
1690
+ };
1691
+ (() => {
1692
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomSanitizer, [{
1693
+ type: Injectable,
1694
+ args: [{
1695
+ providedIn: "root",
1696
+ useExisting: forwardRef(() => DomSanitizerImpl)
1697
+ }]
1698
+ }], null, null);
1699
+ })();
1700
+ var DomSanitizerImpl = class _DomSanitizerImpl extends DomSanitizer {
1701
+ _doc;
1702
+ constructor(_doc) {
1703
+ super();
1704
+ this._doc = _doc;
1705
+ }
1706
+ sanitize(ctx, value) {
1707
+ if (value == null) return null;
1708
+ switch (ctx) {
1709
+ case SecurityContext.NONE:
1710
+ return value;
1711
+ case SecurityContext.HTML:
1712
+ if (allowSanitizationBypassAndThrow(
1713
+ value,
1714
+ "HTML"
1715
+ /* BypassType.Html */
1716
+ )) {
1717
+ return unwrapSafeValue(value);
1718
+ }
1719
+ return _sanitizeHtml(this._doc, String(value)).toString();
1720
+ case SecurityContext.STYLE:
1721
+ if (allowSanitizationBypassAndThrow(
1722
+ value,
1723
+ "Style"
1724
+ /* BypassType.Style */
1725
+ )) {
1726
+ return unwrapSafeValue(value);
1727
+ }
1728
+ return value;
1729
+ case SecurityContext.SCRIPT:
1730
+ if (allowSanitizationBypassAndThrow(
1731
+ value,
1732
+ "Script"
1733
+ /* BypassType.Script */
1734
+ )) {
1735
+ return unwrapSafeValue(value);
1736
+ }
1737
+ throw new RuntimeError(5200, (typeof ngDevMode === "undefined" || ngDevMode) && "unsafe value used in a script context");
1738
+ case SecurityContext.URL:
1739
+ if (allowSanitizationBypassAndThrow(
1740
+ value,
1741
+ "URL"
1742
+ /* BypassType.Url */
1743
+ )) {
1744
+ return unwrapSafeValue(value);
1745
+ }
1746
+ return _sanitizeUrl(String(value));
1747
+ case SecurityContext.RESOURCE_URL:
1748
+ if (allowSanitizationBypassAndThrow(
1749
+ value,
1750
+ "ResourceURL"
1751
+ /* BypassType.ResourceUrl */
1752
+ )) {
1753
+ return unwrapSafeValue(value);
1754
+ }
1755
+ throw new RuntimeError(5201, (typeof ngDevMode === "undefined" || ngDevMode) && `unsafe value used in a resource URL context (see ${XSS_SECURITY_URL})`);
1756
+ default:
1757
+ throw new RuntimeError(5202, (typeof ngDevMode === "undefined" || ngDevMode) && `Unexpected SecurityContext ${ctx} (see ${XSS_SECURITY_URL})`);
1758
+ }
1759
+ }
1760
+ bypassSecurityTrustHtml(value) {
1761
+ return bypassSanitizationTrustHtml(value);
1762
+ }
1763
+ bypassSecurityTrustStyle(value) {
1764
+ return bypassSanitizationTrustStyle(value);
1765
+ }
1766
+ bypassSecurityTrustScript(value) {
1767
+ return bypassSanitizationTrustScript(value);
1768
+ }
1769
+ bypassSecurityTrustUrl(value) {
1770
+ return bypassSanitizationTrustUrl(value);
1771
+ }
1772
+ bypassSecurityTrustResourceUrl(value) {
1773
+ return bypassSanitizationTrustResourceUrl(value);
1774
+ }
1775
+ static \u0275fac = function DomSanitizerImpl_Factory(__ngFactoryType__) {
1776
+ return new (__ngFactoryType__ || _DomSanitizerImpl)(\u0275\u0275inject(DOCUMENT));
1777
+ };
1778
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
1779
+ token: _DomSanitizerImpl,
1780
+ factory: _DomSanitizerImpl.\u0275fac,
1781
+ providedIn: "root"
1782
+ });
1783
+ };
1784
+ (() => {
1785
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomSanitizerImpl, [{
1786
+ type: Injectable,
1787
+ args: [{
1788
+ providedIn: "root"
1789
+ }]
1790
+ }], () => [{
1791
+ type: void 0,
1792
+ decorators: [{
1793
+ type: Inject,
1794
+ args: [DOCUMENT]
1795
+ }]
1796
+ }], null);
1797
+ })();
1798
+ var HydrationFeatureKind;
1799
+ (function(HydrationFeatureKind2) {
1800
+ HydrationFeatureKind2[HydrationFeatureKind2["NoHttpTransferCache"] = 0] = "NoHttpTransferCache";
1801
+ HydrationFeatureKind2[HydrationFeatureKind2["HttpTransferCacheOptions"] = 1] = "HttpTransferCacheOptions";
1802
+ HydrationFeatureKind2[HydrationFeatureKind2["I18nSupport"] = 2] = "I18nSupport";
1803
+ HydrationFeatureKind2[HydrationFeatureKind2["EventReplay"] = 3] = "EventReplay";
1804
+ HydrationFeatureKind2[HydrationFeatureKind2["IncrementalHydration"] = 4] = "IncrementalHydration";
1805
+ })(HydrationFeatureKind || (HydrationFeatureKind = {}));
1806
+ var VERSION = new Version("20.1.7");
1807
+
1808
+ // node_modules/@angular/material/fesm2022/icon-registry-CwOTJ7YM.mjs
1809
+ var policy;
1810
+ function getPolicy() {
1811
+ if (policy === void 0) {
1812
+ policy = null;
1813
+ if (typeof window !== "undefined") {
1814
+ const ttWindow = window;
1815
+ if (ttWindow.trustedTypes !== void 0) {
1816
+ policy = ttWindow.trustedTypes.createPolicy("angular#components", {
1817
+ createHTML: (s) => s
1818
+ });
1819
+ }
1820
+ }
1821
+ }
1822
+ return policy;
1823
+ }
1824
+ function trustedHTMLFromString(html) {
1825
+ return getPolicy()?.createHTML(html) || html;
1826
+ }
1827
+ function getMatIconNameNotFoundError(iconName) {
1828
+ return Error(`Unable to find icon with the name "${iconName}"`);
1829
+ }
1830
+ function getMatIconNoHttpProviderError() {
1831
+ return Error("Could not find HttpClient for use with Angular Material icons. Please add provideHttpClient() to your providers.");
1832
+ }
1833
+ function getMatIconFailedToSanitizeUrlError(url) {
1834
+ return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was "${url}".`);
1835
+ }
1836
+ function getMatIconFailedToSanitizeLiteralError(literal) {
1837
+ return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by Angular's DomSanitizer. Attempted literal was "${literal}".`);
1838
+ }
1839
+ var SvgIconConfig = class {
1840
+ url;
1841
+ svgText;
1842
+ options;
1843
+ svgElement;
1844
+ constructor(url, svgText, options) {
1845
+ this.url = url;
1846
+ this.svgText = svgText;
1847
+ this.options = options;
1848
+ }
1849
+ };
1850
+ var MatIconRegistry = class _MatIconRegistry {
1851
+ _httpClient;
1852
+ _sanitizer;
1853
+ _errorHandler;
1854
+ _document;
1855
+ /**
1856
+ * URLs and cached SVG elements for individual icons. Keys are of the format "[namespace]:[icon]".
1857
+ */
1858
+ _svgIconConfigs = /* @__PURE__ */ new Map();
1859
+ /**
1860
+ * SvgIconConfig objects and cached SVG elements for icon sets, keyed by namespace.
1861
+ * Multiple icon sets can be registered under the same namespace.
1862
+ */
1863
+ _iconSetConfigs = /* @__PURE__ */ new Map();
1864
+ /** Cache for icons loaded by direct URLs. */
1865
+ _cachedIconsByUrl = /* @__PURE__ */ new Map();
1866
+ /** In-progress icon fetches. Used to coalesce multiple requests to the same URL. */
1867
+ _inProgressUrlFetches = /* @__PURE__ */ new Map();
1868
+ /** Map from font identifiers to their CSS class names. Used for icon fonts. */
1869
+ _fontCssClassesByAlias = /* @__PURE__ */ new Map();
1870
+ /** Registered icon resolver functions. */
1871
+ _resolvers = [];
1872
+ /**
1873
+ * The CSS classes to apply when an `<mat-icon>` component has no icon name, url, or font
1874
+ * specified. The default 'material-icons' value assumes that the material icon font has been
1875
+ * loaded as described at https://google.github.io/material-design-icons/#icon-font-for-the-web
1876
+ */
1877
+ _defaultFontSetClass = ["material-icons", "mat-ligature-font"];
1878
+ constructor(_httpClient, _sanitizer, document2, _errorHandler) {
1879
+ this._httpClient = _httpClient;
1880
+ this._sanitizer = _sanitizer;
1881
+ this._errorHandler = _errorHandler;
1882
+ this._document = document2;
1883
+ }
1884
+ /**
1885
+ * Registers an icon by URL in the default namespace.
1886
+ * @param iconName Name under which the icon should be registered.
1887
+ * @param url
1888
+ */
1889
+ addSvgIcon(iconName, url, options) {
1890
+ return this.addSvgIconInNamespace("", iconName, url, options);
1891
+ }
1892
+ /**
1893
+ * Registers an icon using an HTML string in the default namespace.
1894
+ * @param iconName Name under which the icon should be registered.
1895
+ * @param literal SVG source of the icon.
1896
+ */
1897
+ addSvgIconLiteral(iconName, literal, options) {
1898
+ return this.addSvgIconLiteralInNamespace("", iconName, literal, options);
1899
+ }
1900
+ /**
1901
+ * Registers an icon by URL in the specified namespace.
1902
+ * @param namespace Namespace in which the icon should be registered.
1903
+ * @param iconName Name under which the icon should be registered.
1904
+ * @param url
1905
+ */
1906
+ addSvgIconInNamespace(namespace, iconName, url, options) {
1907
+ return this._addSvgIconConfig(namespace, iconName, new SvgIconConfig(url, null, options));
1908
+ }
1909
+ /**
1910
+ * Registers an icon resolver function with the registry. The function will be invoked with the
1911
+ * name and namespace of an icon when the registry tries to resolve the URL from which to fetch
1912
+ * the icon. The resolver is expected to return a `SafeResourceUrl` that points to the icon,
1913
+ * an object with the icon URL and icon options, or `null` if the icon is not supported. Resolvers
1914
+ * will be invoked in the order in which they have been registered.
1915
+ * @param resolver Resolver function to be registered.
1916
+ */
1917
+ addSvgIconResolver(resolver) {
1918
+ this._resolvers.push(resolver);
1919
+ return this;
1920
+ }
1921
+ /**
1922
+ * Registers an icon using an HTML string in the specified namespace.
1923
+ * @param namespace Namespace in which the icon should be registered.
1924
+ * @param iconName Name under which the icon should be registered.
1925
+ * @param literal SVG source of the icon.
1926
+ */
1927
+ addSvgIconLiteralInNamespace(namespace, iconName, literal, options) {
1928
+ const cleanLiteral = this._sanitizer.sanitize(SecurityContext.HTML, literal);
1929
+ if (!cleanLiteral) {
1930
+ throw getMatIconFailedToSanitizeLiteralError(literal);
1931
+ }
1932
+ const trustedLiteral = trustedHTMLFromString(cleanLiteral);
1933
+ return this._addSvgIconConfig(namespace, iconName, new SvgIconConfig("", trustedLiteral, options));
1934
+ }
1935
+ /**
1936
+ * Registers an icon set by URL in the default namespace.
1937
+ * @param url
1938
+ */
1939
+ addSvgIconSet(url, options) {
1940
+ return this.addSvgIconSetInNamespace("", url, options);
1941
+ }
1942
+ /**
1943
+ * Registers an icon set using an HTML string in the default namespace.
1944
+ * @param literal SVG source of the icon set.
1945
+ */
1946
+ addSvgIconSetLiteral(literal, options) {
1947
+ return this.addSvgIconSetLiteralInNamespace("", literal, options);
1948
+ }
1949
+ /**
1950
+ * Registers an icon set by URL in the specified namespace.
1951
+ * @param namespace Namespace in which to register the icon set.
1952
+ * @param url
1953
+ */
1954
+ addSvgIconSetInNamespace(namespace, url, options) {
1955
+ return this._addSvgIconSetConfig(namespace, new SvgIconConfig(url, null, options));
1956
+ }
1957
+ /**
1958
+ * Registers an icon set using an HTML string in the specified namespace.
1959
+ * @param namespace Namespace in which to register the icon set.
1960
+ * @param literal SVG source of the icon set.
1961
+ */
1962
+ addSvgIconSetLiteralInNamespace(namespace, literal, options) {
1963
+ const cleanLiteral = this._sanitizer.sanitize(SecurityContext.HTML, literal);
1964
+ if (!cleanLiteral) {
1965
+ throw getMatIconFailedToSanitizeLiteralError(literal);
1966
+ }
1967
+ const trustedLiteral = trustedHTMLFromString(cleanLiteral);
1968
+ return this._addSvgIconSetConfig(namespace, new SvgIconConfig("", trustedLiteral, options));
1969
+ }
1970
+ /**
1971
+ * Defines an alias for CSS class names to be used for icon fonts. Creating an matIcon
1972
+ * component with the alias as the fontSet input will cause the class name to be applied
1973
+ * to the `<mat-icon>` element.
1974
+ *
1975
+ * If the registered font is a ligature font, then don't forget to also include the special
1976
+ * class `mat-ligature-font` to allow the usage via attribute. So register like this:
1977
+ *
1978
+ * ```ts
1979
+ * iconRegistry.registerFontClassAlias('f1', 'font1 mat-ligature-font');
1980
+ * ```
1981
+ *
1982
+ * And use like this:
1983
+ *
1984
+ * ```html
1985
+ * <mat-icon fontSet="f1" fontIcon="home"></mat-icon>
1986
+ * ```
1987
+ *
1988
+ * @param alias Alias for the font.
1989
+ * @param classNames Class names override to be used instead of the alias.
1990
+ */
1991
+ registerFontClassAlias(alias, classNames = alias) {
1992
+ this._fontCssClassesByAlias.set(alias, classNames);
1993
+ return this;
1994
+ }
1995
+ /**
1996
+ * Returns the CSS class name associated with the alias by a previous call to
1997
+ * registerFontClassAlias. If no CSS class has been associated, returns the alias unmodified.
1998
+ */
1999
+ classNameForFontAlias(alias) {
2000
+ return this._fontCssClassesByAlias.get(alias) || alias;
2001
+ }
2002
+ /**
2003
+ * Sets the CSS classes to be used for icon fonts when an `<mat-icon>` component does not
2004
+ * have a fontSet input value, and is not loading an icon by name or URL.
2005
+ */
2006
+ setDefaultFontSetClass(...classNames) {
2007
+ this._defaultFontSetClass = classNames;
2008
+ return this;
2009
+ }
2010
+ /**
2011
+ * Returns the CSS classes to be used for icon fonts when an `<mat-icon>` component does not
2012
+ * have a fontSet input value, and is not loading an icon by name or URL.
2013
+ */
2014
+ getDefaultFontSetClass() {
2015
+ return this._defaultFontSetClass;
2016
+ }
2017
+ /**
2018
+ * Returns an Observable that produces the icon (as an `<svg>` DOM element) from the given URL.
2019
+ * The response from the URL may be cached so this will not always cause an HTTP request, but
2020
+ * the produced element will always be a new copy of the originally fetched icon. (That is,
2021
+ * it will not contain any modifications made to elements previously returned).
2022
+ *
2023
+ * @param safeUrl URL from which to fetch the SVG icon.
2024
+ */
2025
+ getSvgIconFromUrl(safeUrl) {
2026
+ const url = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, safeUrl);
2027
+ if (!url) {
2028
+ throw getMatIconFailedToSanitizeUrlError(safeUrl);
2029
+ }
2030
+ const cachedIcon = this._cachedIconsByUrl.get(url);
2031
+ if (cachedIcon) {
2032
+ return of(cloneSvg(cachedIcon));
2033
+ }
2034
+ return this._loadSvgIconFromConfig(new SvgIconConfig(safeUrl, null)).pipe(tap((svg) => this._cachedIconsByUrl.set(url, svg)), map((svg) => cloneSvg(svg)));
2035
+ }
2036
+ /**
2037
+ * Returns an Observable that produces the icon (as an `<svg>` DOM element) with the given name
2038
+ * and namespace. The icon must have been previously registered with addIcon or addIconSet;
2039
+ * if not, the Observable will throw an error.
2040
+ *
2041
+ * @param name Name of the icon to be retrieved.
2042
+ * @param namespace Namespace in which to look for the icon.
2043
+ */
2044
+ getNamedSvgIcon(name, namespace = "") {
2045
+ const key = iconKey(namespace, name);
2046
+ let config = this._svgIconConfigs.get(key);
2047
+ if (config) {
2048
+ return this._getSvgFromConfig(config);
2049
+ }
2050
+ config = this._getIconConfigFromResolvers(namespace, name);
2051
+ if (config) {
2052
+ this._svgIconConfigs.set(key, config);
2053
+ return this._getSvgFromConfig(config);
2054
+ }
2055
+ const iconSetConfigs = this._iconSetConfigs.get(namespace);
2056
+ if (iconSetConfigs) {
2057
+ return this._getSvgFromIconSetConfigs(name, iconSetConfigs);
2058
+ }
2059
+ return throwError(getMatIconNameNotFoundError(key));
2060
+ }
2061
+ ngOnDestroy() {
2062
+ this._resolvers = [];
2063
+ this._svgIconConfigs.clear();
2064
+ this._iconSetConfigs.clear();
2065
+ this._cachedIconsByUrl.clear();
2066
+ }
2067
+ /**
2068
+ * Returns the cached icon for a SvgIconConfig if available, or fetches it from its URL if not.
2069
+ */
2070
+ _getSvgFromConfig(config) {
2071
+ if (config.svgText) {
2072
+ return of(cloneSvg(this._svgElementFromConfig(config)));
2073
+ } else {
2074
+ return this._loadSvgIconFromConfig(config).pipe(map((svg) => cloneSvg(svg)));
2075
+ }
2076
+ }
2077
+ /**
2078
+ * Attempts to find an icon with the specified name in any of the SVG icon sets.
2079
+ * First searches the available cached icons for a nested element with a matching name, and
2080
+ * if found copies the element to a new `<svg>` element. If not found, fetches all icon sets
2081
+ * that have not been cached, and searches again after all fetches are completed.
2082
+ * The returned Observable produces the SVG element if possible, and throws
2083
+ * an error if no icon with the specified name can be found.
2084
+ */
2085
+ _getSvgFromIconSetConfigs(name, iconSetConfigs) {
2086
+ const namedIcon = this._extractIconWithNameFromAnySet(name, iconSetConfigs);
2087
+ if (namedIcon) {
2088
+ return of(namedIcon);
2089
+ }
2090
+ const iconSetFetchRequests = iconSetConfigs.filter((iconSetConfig) => !iconSetConfig.svgText).map((iconSetConfig) => {
2091
+ return this._loadSvgIconSetFromConfig(iconSetConfig).pipe(catchError((err) => {
2092
+ const url = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, iconSetConfig.url);
2093
+ const errorMessage = `Loading icon set URL: ${url} failed: ${err.message}`;
2094
+ this._errorHandler.handleError(new Error(errorMessage));
2095
+ return of(null);
2096
+ }));
2097
+ });
2098
+ return forkJoin(iconSetFetchRequests).pipe(map(() => {
2099
+ const foundIcon = this._extractIconWithNameFromAnySet(name, iconSetConfigs);
2100
+ if (!foundIcon) {
2101
+ throw getMatIconNameNotFoundError(name);
2102
+ }
2103
+ return foundIcon;
2104
+ }));
2105
+ }
2106
+ /**
2107
+ * Searches the cached SVG elements for the given icon sets for a nested icon element whose "id"
2108
+ * tag matches the specified name. If found, copies the nested element to a new SVG element and
2109
+ * returns it. Returns null if no matching element is found.
2110
+ */
2111
+ _extractIconWithNameFromAnySet(iconName, iconSetConfigs) {
2112
+ for (let i = iconSetConfigs.length - 1; i >= 0; i--) {
2113
+ const config = iconSetConfigs[i];
2114
+ if (config.svgText && config.svgText.toString().indexOf(iconName) > -1) {
2115
+ const svg = this._svgElementFromConfig(config);
2116
+ const foundIcon = this._extractSvgIconFromSet(svg, iconName, config.options);
2117
+ if (foundIcon) {
2118
+ return foundIcon;
2119
+ }
2120
+ }
2121
+ }
2122
+ return null;
2123
+ }
2124
+ /**
2125
+ * Loads the content of the icon URL specified in the SvgIconConfig and creates an SVG element
2126
+ * from it.
2127
+ */
2128
+ _loadSvgIconFromConfig(config) {
2129
+ return this._fetchIcon(config).pipe(tap((svgText) => config.svgText = svgText), map(() => this._svgElementFromConfig(config)));
2130
+ }
2131
+ /**
2132
+ * Loads the content of the icon set URL specified in the
2133
+ * SvgIconConfig and attaches it to the config.
2134
+ */
2135
+ _loadSvgIconSetFromConfig(config) {
2136
+ if (config.svgText) {
2137
+ return of(null);
2138
+ }
2139
+ return this._fetchIcon(config).pipe(tap((svgText) => config.svgText = svgText));
2140
+ }
2141
+ /**
2142
+ * Searches the cached element of the given SvgIconConfig for a nested icon element whose "id"
2143
+ * tag matches the specified name. If found, copies the nested element to a new SVG element and
2144
+ * returns it. Returns null if no matching element is found.
2145
+ */
2146
+ _extractSvgIconFromSet(iconSet, iconName, options) {
2147
+ const iconSource = iconSet.querySelector(`[id="${iconName}"]`);
2148
+ if (!iconSource) {
2149
+ return null;
2150
+ }
2151
+ const iconElement = iconSource.cloneNode(true);
2152
+ iconElement.removeAttribute("id");
2153
+ if (iconElement.nodeName.toLowerCase() === "svg") {
2154
+ return this._setSvgAttributes(iconElement, options);
2155
+ }
2156
+ if (iconElement.nodeName.toLowerCase() === "symbol") {
2157
+ return this._setSvgAttributes(this._toSvgElement(iconElement), options);
2158
+ }
2159
+ const svg = this._svgElementFromString(trustedHTMLFromString("<svg></svg>"));
2160
+ svg.appendChild(iconElement);
2161
+ return this._setSvgAttributes(svg, options);
2162
+ }
2163
+ /**
2164
+ * Creates a DOM element from the given SVG string.
2165
+ */
2166
+ _svgElementFromString(str) {
2167
+ const div = this._document.createElement("DIV");
2168
+ div.innerHTML = str;
2169
+ const svg = div.querySelector("svg");
2170
+ if (!svg) {
2171
+ throw Error("<svg> tag not found");
2172
+ }
2173
+ return svg;
2174
+ }
2175
+ /**
2176
+ * Converts an element into an SVG node by cloning all of its children.
2177
+ */
2178
+ _toSvgElement(element) {
2179
+ const svg = this._svgElementFromString(trustedHTMLFromString("<svg></svg>"));
2180
+ const attributes = element.attributes;
2181
+ for (let i = 0; i < attributes.length; i++) {
2182
+ const {
2183
+ name,
2184
+ value
2185
+ } = attributes[i];
2186
+ if (name !== "id") {
2187
+ svg.setAttribute(name, value);
2188
+ }
2189
+ }
2190
+ for (let i = 0; i < element.childNodes.length; i++) {
2191
+ if (element.childNodes[i].nodeType === this._document.ELEMENT_NODE) {
2192
+ svg.appendChild(element.childNodes[i].cloneNode(true));
2193
+ }
2194
+ }
2195
+ return svg;
2196
+ }
2197
+ /**
2198
+ * Sets the default attributes for an SVG element to be used as an icon.
2199
+ */
2200
+ _setSvgAttributes(svg, options) {
2201
+ svg.setAttribute("fit", "");
2202
+ svg.setAttribute("height", "100%");
2203
+ svg.setAttribute("width", "100%");
2204
+ svg.setAttribute("preserveAspectRatio", "xMidYMid meet");
2205
+ svg.setAttribute("focusable", "false");
2206
+ if (options && options.viewBox) {
2207
+ svg.setAttribute("viewBox", options.viewBox);
2208
+ }
2209
+ return svg;
2210
+ }
2211
+ /**
2212
+ * Returns an Observable which produces the string contents of the given icon. Results may be
2213
+ * cached, so future calls with the same URL may not cause another HTTP request.
2214
+ */
2215
+ _fetchIcon(iconConfig) {
2216
+ const {
2217
+ url: safeUrl,
2218
+ options
2219
+ } = iconConfig;
2220
+ const withCredentials = options?.withCredentials ?? false;
2221
+ if (!this._httpClient) {
2222
+ throw getMatIconNoHttpProviderError();
2223
+ }
2224
+ if (safeUrl == null) {
2225
+ throw Error(`Cannot fetch icon from URL "${safeUrl}".`);
2226
+ }
2227
+ const url = this._sanitizer.sanitize(SecurityContext.RESOURCE_URL, safeUrl);
2228
+ if (!url) {
2229
+ throw getMatIconFailedToSanitizeUrlError(safeUrl);
2230
+ }
2231
+ const inProgressFetch = this._inProgressUrlFetches.get(url);
2232
+ if (inProgressFetch) {
2233
+ return inProgressFetch;
2234
+ }
2235
+ const req = this._httpClient.get(url, {
2236
+ responseType: "text",
2237
+ withCredentials
2238
+ }).pipe(map((svg) => {
2239
+ return trustedHTMLFromString(svg);
2240
+ }), finalize(() => this._inProgressUrlFetches.delete(url)), share());
2241
+ this._inProgressUrlFetches.set(url, req);
2242
+ return req;
2243
+ }
2244
+ /**
2245
+ * Registers an icon config by name in the specified namespace.
2246
+ * @param namespace Namespace in which to register the icon config.
2247
+ * @param iconName Name under which to register the config.
2248
+ * @param config Config to be registered.
2249
+ */
2250
+ _addSvgIconConfig(namespace, iconName, config) {
2251
+ this._svgIconConfigs.set(iconKey(namespace, iconName), config);
2252
+ return this;
2253
+ }
2254
+ /**
2255
+ * Registers an icon set config in the specified namespace.
2256
+ * @param namespace Namespace in which to register the icon config.
2257
+ * @param config Config to be registered.
2258
+ */
2259
+ _addSvgIconSetConfig(namespace, config) {
2260
+ const configNamespace = this._iconSetConfigs.get(namespace);
2261
+ if (configNamespace) {
2262
+ configNamespace.push(config);
2263
+ } else {
2264
+ this._iconSetConfigs.set(namespace, [config]);
2265
+ }
2266
+ return this;
2267
+ }
2268
+ /** Parses a config's text into an SVG element. */
2269
+ _svgElementFromConfig(config) {
2270
+ if (!config.svgElement) {
2271
+ const svg = this._svgElementFromString(config.svgText);
2272
+ this._setSvgAttributes(svg, config.options);
2273
+ config.svgElement = svg;
2274
+ }
2275
+ return config.svgElement;
2276
+ }
2277
+ /** Tries to create an icon config through the registered resolver functions. */
2278
+ _getIconConfigFromResolvers(namespace, name) {
2279
+ for (let i = 0; i < this._resolvers.length; i++) {
2280
+ const result = this._resolvers[i](name, namespace);
2281
+ if (result) {
2282
+ return isSafeUrlWithOptions(result) ? new SvgIconConfig(result.url, null, result.options) : new SvgIconConfig(result, null);
2283
+ }
2284
+ }
2285
+ return void 0;
2286
+ }
2287
+ static \u0275fac = function MatIconRegistry_Factory(__ngFactoryType__) {
2288
+ return new (__ngFactoryType__ || _MatIconRegistry)(\u0275\u0275inject(HttpClient, 8), \u0275\u0275inject(DomSanitizer), \u0275\u0275inject(DOCUMENT, 8), \u0275\u0275inject(ErrorHandler));
2289
+ };
2290
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
2291
+ token: _MatIconRegistry,
2292
+ factory: _MatIconRegistry.\u0275fac,
2293
+ providedIn: "root"
2294
+ });
2295
+ };
2296
+ (() => {
2297
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatIconRegistry, [{
2298
+ type: Injectable,
2299
+ args: [{
2300
+ providedIn: "root"
2301
+ }]
2302
+ }], () => [{
2303
+ type: HttpClient,
2304
+ decorators: [{
2305
+ type: Optional
2306
+ }]
2307
+ }, {
2308
+ type: DomSanitizer
2309
+ }, {
2310
+ type: void 0,
2311
+ decorators: [{
2312
+ type: Optional
2313
+ }, {
2314
+ type: Inject,
2315
+ args: [DOCUMENT]
2316
+ }]
2317
+ }, {
2318
+ type: ErrorHandler
2319
+ }], null);
2320
+ })();
2321
+ function ICON_REGISTRY_PROVIDER_FACTORY(parentRegistry, httpClient, sanitizer, errorHandler2, document2) {
2322
+ return parentRegistry || new MatIconRegistry(httpClient, sanitizer, document2, errorHandler2);
2323
+ }
2324
+ var ICON_REGISTRY_PROVIDER = {
2325
+ // If there is already an MatIconRegistry available, use that. Otherwise, provide a new one.
2326
+ provide: MatIconRegistry,
2327
+ deps: [[new Optional(), new SkipSelf(), MatIconRegistry], [new Optional(), HttpClient], DomSanitizer, ErrorHandler, [new Optional(), DOCUMENT]],
2328
+ useFactory: ICON_REGISTRY_PROVIDER_FACTORY
2329
+ };
2330
+ function cloneSvg(svg) {
2331
+ return svg.cloneNode(true);
2332
+ }
2333
+ function iconKey(namespace, name) {
2334
+ return namespace + ":" + name;
2335
+ }
2336
+ function isSafeUrlWithOptions(value) {
2337
+ return !!(value.url && value.options);
2338
+ }
2339
+
2340
+ // node_modules/@angular/material/fesm2022/icon.mjs
2341
+ var _c0 = ["*"];
2342
+ var MAT_ICON_DEFAULT_OPTIONS = new InjectionToken("MAT_ICON_DEFAULT_OPTIONS");
2343
+ var MAT_ICON_LOCATION = new InjectionToken("mat-icon-location", {
2344
+ providedIn: "root",
2345
+ factory: MAT_ICON_LOCATION_FACTORY
2346
+ });
2347
+ function MAT_ICON_LOCATION_FACTORY() {
2348
+ const _document2 = inject(DOCUMENT);
2349
+ const _location = _document2 ? _document2.location : null;
2350
+ return {
2351
+ // Note that this needs to be a function, rather than a property, because Angular
2352
+ // will only resolve it once, but we want the current path on each call.
2353
+ getPathname: () => _location ? _location.pathname + _location.search : ""
2354
+ };
2355
+ }
2356
+ var funcIriAttributes = ["clip-path", "color-profile", "src", "cursor", "fill", "filter", "marker", "marker-start", "marker-mid", "marker-end", "mask", "stroke"];
2357
+ var funcIriAttributeSelector = funcIriAttributes.map((attr) => `[${attr}]`).join(", ");
2358
+ var funcIriPattern = /^url\(['"]?#(.*?)['"]?\)$/;
2359
+ var MatIcon = class _MatIcon {
2360
+ _elementRef = inject(ElementRef);
2361
+ _iconRegistry = inject(MatIconRegistry);
2362
+ _location = inject(MAT_ICON_LOCATION);
2363
+ _errorHandler = inject(ErrorHandler);
2364
+ _defaultColor;
2365
+ /**
2366
+ * Theme color of the icon. This API is supported in M2 themes only, it
2367
+ * has no effect in M3 themes. For color customization in M3, see https://material.angular.dev/components/icon/styling.
2368
+ *
2369
+ * For information on applying color variants in M3, see
2370
+ * https://material.angular.dev/guide/material-2-theming#optional-add-backwards-compatibility-styles-for-color-variants
2371
+ */
2372
+ get color() {
2373
+ return this._color || this._defaultColor;
2374
+ }
2375
+ set color(value) {
2376
+ this._color = value;
2377
+ }
2378
+ _color;
2379
+ /**
2380
+ * Whether the icon should be inlined, automatically sizing the icon to match the font size of
2381
+ * the element the icon is contained in.
2382
+ */
2383
+ inline = false;
2384
+ /** Name of the icon in the SVG icon set. */
2385
+ get svgIcon() {
2386
+ return this._svgIcon;
2387
+ }
2388
+ set svgIcon(value) {
2389
+ if (value !== this._svgIcon) {
2390
+ if (value) {
2391
+ this._updateSvgIcon(value);
2392
+ } else if (this._svgIcon) {
2393
+ this._clearSvgElement();
2394
+ }
2395
+ this._svgIcon = value;
2396
+ }
2397
+ }
2398
+ _svgIcon;
2399
+ /** Font set that the icon is a part of. */
2400
+ get fontSet() {
2401
+ return this._fontSet;
2402
+ }
2403
+ set fontSet(value) {
2404
+ const newValue = this._cleanupFontValue(value);
2405
+ if (newValue !== this._fontSet) {
2406
+ this._fontSet = newValue;
2407
+ this._updateFontIconClasses();
2408
+ }
2409
+ }
2410
+ _fontSet;
2411
+ /** Name of an icon within a font set. */
2412
+ get fontIcon() {
2413
+ return this._fontIcon;
2414
+ }
2415
+ set fontIcon(value) {
2416
+ const newValue = this._cleanupFontValue(value);
2417
+ if (newValue !== this._fontIcon) {
2418
+ this._fontIcon = newValue;
2419
+ this._updateFontIconClasses();
2420
+ }
2421
+ }
2422
+ _fontIcon;
2423
+ _previousFontSetClass = [];
2424
+ _previousFontIconClass;
2425
+ _svgName;
2426
+ _svgNamespace;
2427
+ /** Keeps track of the current page path. */
2428
+ _previousPath;
2429
+ /** Keeps track of the elements and attributes that we've prefixed with the current path. */
2430
+ _elementsWithExternalReferences;
2431
+ /** Subscription to the current in-progress SVG icon request. */
2432
+ _currentIconFetch = Subscription.EMPTY;
2433
+ constructor() {
2434
+ const ariaHidden = inject(new HostAttributeToken("aria-hidden"), {
2435
+ optional: true
2436
+ });
2437
+ const defaults = inject(MAT_ICON_DEFAULT_OPTIONS, {
2438
+ optional: true
2439
+ });
2440
+ if (defaults) {
2441
+ if (defaults.color) {
2442
+ this.color = this._defaultColor = defaults.color;
2443
+ }
2444
+ if (defaults.fontSet) {
2445
+ this.fontSet = defaults.fontSet;
2446
+ }
2447
+ }
2448
+ if (!ariaHidden) {
2449
+ this._elementRef.nativeElement.setAttribute("aria-hidden", "true");
2450
+ }
2451
+ }
2452
+ /**
2453
+ * Splits an svgIcon binding value into its icon set and icon name components.
2454
+ * Returns a 2-element array of [(icon set), (icon name)].
2455
+ * The separator for the two fields is ':'. If there is no separator, an empty
2456
+ * string is returned for the icon set and the entire value is returned for
2457
+ * the icon name. If the argument is falsy, returns an array of two empty strings.
2458
+ * Throws an error if the name contains two or more ':' separators.
2459
+ * Examples:
2460
+ * `'social:cake' -> ['social', 'cake']
2461
+ * 'penguin' -> ['', 'penguin']
2462
+ * null -> ['', '']
2463
+ * 'a:b:c' -> (throws Error)`
2464
+ */
2465
+ _splitIconName(iconName) {
2466
+ if (!iconName) {
2467
+ return ["", ""];
2468
+ }
2469
+ const parts = iconName.split(":");
2470
+ switch (parts.length) {
2471
+ case 1:
2472
+ return ["", parts[0]];
2473
+ // Use default namespace.
2474
+ case 2:
2475
+ return parts;
2476
+ default:
2477
+ throw Error(`Invalid icon name: "${iconName}"`);
2478
+ }
2479
+ }
2480
+ ngOnInit() {
2481
+ this._updateFontIconClasses();
2482
+ }
2483
+ ngAfterViewChecked() {
2484
+ const cachedElements = this._elementsWithExternalReferences;
2485
+ if (cachedElements && cachedElements.size) {
2486
+ const newPath = this._location.getPathname();
2487
+ if (newPath !== this._previousPath) {
2488
+ this._previousPath = newPath;
2489
+ this._prependPathToReferences(newPath);
2490
+ }
2491
+ }
2492
+ }
2493
+ ngOnDestroy() {
2494
+ this._currentIconFetch.unsubscribe();
2495
+ if (this._elementsWithExternalReferences) {
2496
+ this._elementsWithExternalReferences.clear();
2497
+ }
2498
+ }
2499
+ _usingFontIcon() {
2500
+ return !this.svgIcon;
2501
+ }
2502
+ _setSvgElement(svg) {
2503
+ this._clearSvgElement();
2504
+ const path = this._location.getPathname();
2505
+ this._previousPath = path;
2506
+ this._cacheChildrenWithExternalReferences(svg);
2507
+ this._prependPathToReferences(path);
2508
+ this._elementRef.nativeElement.appendChild(svg);
2509
+ }
2510
+ _clearSvgElement() {
2511
+ const layoutElement = this._elementRef.nativeElement;
2512
+ let childCount = layoutElement.childNodes.length;
2513
+ if (this._elementsWithExternalReferences) {
2514
+ this._elementsWithExternalReferences.clear();
2515
+ }
2516
+ while (childCount--) {
2517
+ const child = layoutElement.childNodes[childCount];
2518
+ if (child.nodeType !== 1 || child.nodeName.toLowerCase() === "svg") {
2519
+ child.remove();
2520
+ }
2521
+ }
2522
+ }
2523
+ _updateFontIconClasses() {
2524
+ if (!this._usingFontIcon()) {
2525
+ return;
2526
+ }
2527
+ const elem = this._elementRef.nativeElement;
2528
+ const fontSetClasses = (this.fontSet ? this._iconRegistry.classNameForFontAlias(this.fontSet).split(/ +/) : this._iconRegistry.getDefaultFontSetClass()).filter((className) => className.length > 0);
2529
+ this._previousFontSetClass.forEach((className) => elem.classList.remove(className));
2530
+ fontSetClasses.forEach((className) => elem.classList.add(className));
2531
+ this._previousFontSetClass = fontSetClasses;
2532
+ if (this.fontIcon !== this._previousFontIconClass && !fontSetClasses.includes("mat-ligature-font")) {
2533
+ if (this._previousFontIconClass) {
2534
+ elem.classList.remove(this._previousFontIconClass);
2535
+ }
2536
+ if (this.fontIcon) {
2537
+ elem.classList.add(this.fontIcon);
2538
+ }
2539
+ this._previousFontIconClass = this.fontIcon;
2540
+ }
2541
+ }
2542
+ /**
2543
+ * Cleans up a value to be used as a fontIcon or fontSet.
2544
+ * Since the value ends up being assigned as a CSS class, we
2545
+ * have to trim the value and omit space-separated values.
2546
+ */
2547
+ _cleanupFontValue(value) {
2548
+ return typeof value === "string" ? value.trim().split(" ")[0] : value;
2549
+ }
2550
+ /**
2551
+ * Prepends the current path to all elements that have an attribute pointing to a `FuncIRI`
2552
+ * reference. This is required because WebKit browsers require references to be prefixed with
2553
+ * the current path, if the page has a `base` tag.
2554
+ */
2555
+ _prependPathToReferences(path) {
2556
+ const elements = this._elementsWithExternalReferences;
2557
+ if (elements) {
2558
+ elements.forEach((attrs, element) => {
2559
+ attrs.forEach((attr) => {
2560
+ element.setAttribute(attr.name, `url('${path}#${attr.value}')`);
2561
+ });
2562
+ });
2563
+ }
2564
+ }
2565
+ /**
2566
+ * Caches the children of an SVG element that have `url()`
2567
+ * references that we need to prefix with the current path.
2568
+ */
2569
+ _cacheChildrenWithExternalReferences(element) {
2570
+ const elementsWithFuncIri = element.querySelectorAll(funcIriAttributeSelector);
2571
+ const elements = this._elementsWithExternalReferences = this._elementsWithExternalReferences || /* @__PURE__ */ new Map();
2572
+ for (let i = 0; i < elementsWithFuncIri.length; i++) {
2573
+ funcIriAttributes.forEach((attr) => {
2574
+ const elementWithReference = elementsWithFuncIri[i];
2575
+ const value = elementWithReference.getAttribute(attr);
2576
+ const match = value ? value.match(funcIriPattern) : null;
2577
+ if (match) {
2578
+ let attributes = elements.get(elementWithReference);
2579
+ if (!attributes) {
2580
+ attributes = [];
2581
+ elements.set(elementWithReference, attributes);
2582
+ }
2583
+ attributes.push({
2584
+ name: attr,
2585
+ value: match[1]
2586
+ });
2587
+ }
2588
+ });
2589
+ }
2590
+ }
2591
+ /** Sets a new SVG icon with a particular name. */
2592
+ _updateSvgIcon(rawName) {
2593
+ this._svgNamespace = null;
2594
+ this._svgName = null;
2595
+ this._currentIconFetch.unsubscribe();
2596
+ if (rawName) {
2597
+ const [namespace, iconName] = this._splitIconName(rawName);
2598
+ if (namespace) {
2599
+ this._svgNamespace = namespace;
2600
+ }
2601
+ if (iconName) {
2602
+ this._svgName = iconName;
2603
+ }
2604
+ this._currentIconFetch = this._iconRegistry.getNamedSvgIcon(iconName, namespace).pipe(take(1)).subscribe((svg) => this._setSvgElement(svg), (err) => {
2605
+ const errorMessage = `Error retrieving icon ${namespace}:${iconName}! ${err.message}`;
2606
+ this._errorHandler.handleError(new Error(errorMessage));
2607
+ });
2608
+ }
2609
+ }
2610
+ static \u0275fac = function MatIcon_Factory(__ngFactoryType__) {
2611
+ return new (__ngFactoryType__ || _MatIcon)();
2612
+ };
2613
+ static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({
2614
+ type: _MatIcon,
2615
+ selectors: [["mat-icon"]],
2616
+ hostAttrs: ["role", "img", 1, "mat-icon", "notranslate"],
2617
+ hostVars: 10,
2618
+ hostBindings: function MatIcon_HostBindings(rf, ctx) {
2619
+ if (rf & 2) {
2620
+ \u0275\u0275attribute("data-mat-icon-type", ctx._usingFontIcon() ? "font" : "svg")("data-mat-icon-name", ctx._svgName || ctx.fontIcon)("data-mat-icon-namespace", ctx._svgNamespace || ctx.fontSet)("fontIcon", ctx._usingFontIcon() ? ctx.fontIcon : null);
2621
+ \u0275\u0275classMap(ctx.color ? "mat-" + ctx.color : "");
2622
+ \u0275\u0275classProp("mat-icon-inline", ctx.inline)("mat-icon-no-color", ctx.color !== "primary" && ctx.color !== "accent" && ctx.color !== "warn");
2623
+ }
2624
+ },
2625
+ inputs: {
2626
+ color: "color",
2627
+ inline: [2, "inline", "inline", booleanAttribute],
2628
+ svgIcon: "svgIcon",
2629
+ fontSet: "fontSet",
2630
+ fontIcon: "fontIcon"
2631
+ },
2632
+ exportAs: ["matIcon"],
2633
+ ngContentSelectors: _c0,
2634
+ decls: 1,
2635
+ vars: 0,
2636
+ template: function MatIcon_Template(rf, ctx) {
2637
+ if (rf & 1) {
2638
+ \u0275\u0275projectionDef();
2639
+ \u0275\u0275projection(0);
2640
+ }
2641
+ },
2642
+ styles: ["mat-icon,mat-icon.mat-primary,mat-icon.mat-accent,mat-icon.mat-warn{color:var(--mat-icon-color, inherit)}.mat-icon{-webkit-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px;overflow:hidden}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}.mat-icon.mat-ligature-font[fontIcon]::before{content:attr(fontIcon)}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto}\n"],
2643
+ encapsulation: 2,
2644
+ changeDetection: 0
2645
+ });
2646
+ };
2647
+ (() => {
2648
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatIcon, [{
2649
+ type: Component,
2650
+ args: [{
2651
+ template: "<ng-content></ng-content>",
2652
+ selector: "mat-icon",
2653
+ exportAs: "matIcon",
2654
+ host: {
2655
+ "role": "img",
2656
+ "class": "mat-icon notranslate",
2657
+ "[class]": 'color ? "mat-" + color : ""',
2658
+ "[attr.data-mat-icon-type]": '_usingFontIcon() ? "font" : "svg"',
2659
+ "[attr.data-mat-icon-name]": "_svgName || fontIcon",
2660
+ "[attr.data-mat-icon-namespace]": "_svgNamespace || fontSet",
2661
+ "[attr.fontIcon]": "_usingFontIcon() ? fontIcon : null",
2662
+ "[class.mat-icon-inline]": "inline",
2663
+ "[class.mat-icon-no-color]": 'color !== "primary" && color !== "accent" && color !== "warn"'
2664
+ },
2665
+ encapsulation: ViewEncapsulation.None,
2666
+ changeDetection: ChangeDetectionStrategy.OnPush,
2667
+ styles: ["mat-icon,mat-icon.mat-primary,mat-icon.mat-accent,mat-icon.mat-warn{color:var(--mat-icon-color, inherit)}.mat-icon{-webkit-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px;overflow:hidden}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}.mat-icon.mat-ligature-font[fontIcon]::before{content:attr(fontIcon)}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto}\n"]
2668
+ }]
2669
+ }], () => [], {
2670
+ color: [{
2671
+ type: Input
2672
+ }],
2673
+ inline: [{
2674
+ type: Input,
2675
+ args: [{
2676
+ transform: booleanAttribute
2677
+ }]
2678
+ }],
2679
+ svgIcon: [{
2680
+ type: Input
2681
+ }],
2682
+ fontSet: [{
2683
+ type: Input
2684
+ }],
2685
+ fontIcon: [{
2686
+ type: Input
2687
+ }]
2688
+ });
2689
+ })();
2690
+ var MatIconModule = class _MatIconModule {
2691
+ static \u0275fac = function MatIconModule_Factory(__ngFactoryType__) {
2692
+ return new (__ngFactoryType__ || _MatIconModule)();
2693
+ };
2694
+ static \u0275mod = /* @__PURE__ */ \u0275\u0275defineNgModule({
2695
+ type: _MatIconModule,
2696
+ imports: [MatCommonModule, MatIcon],
2697
+ exports: [MatIcon, MatCommonModule]
2698
+ });
2699
+ static \u0275inj = /* @__PURE__ */ \u0275\u0275defineInjector({
2700
+ imports: [MatCommonModule, MatCommonModule]
2701
+ });
2702
+ };
2703
+ (() => {
2704
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatIconModule, [{
2705
+ type: NgModule,
2706
+ args: [{
2707
+ imports: [MatCommonModule, MatIcon],
2708
+ exports: [MatIcon, MatCommonModule]
2709
+ }]
2710
+ }], null, null);
2711
+ })();
2712
+
2713
+ export {
2714
+ DomRendererFactory2,
2715
+ bootstrapApplication,
2716
+ BrowserModule,
2717
+ Title,
2718
+ DomSanitizer,
2719
+ MatIconRegistry,
2720
+ MatIcon,
2721
+ MatIconModule
2722
+ };
2723
+ //# sourceMappingURL=chunk-UQYTD5AC.js.map