@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,3102 @@
1
+ import {
2
+ ErrorStateMatcher,
3
+ FormGroupDirective,
4
+ MAT_FORM_FIELD,
5
+ MatFormFieldControl,
6
+ MatFormFieldModule,
7
+ NgControl,
8
+ NgForm,
9
+ Validators,
10
+ _ErrorStateTracker
11
+ } from "./chunk-BIBIW64D.js";
12
+ import {
13
+ A,
14
+ ActiveDescendantKeyManager,
15
+ CdkConnectedOverlay,
16
+ CdkOverlayOrigin,
17
+ CdkScrollableModule,
18
+ ChangeDetectionStrategy,
19
+ ChangeDetectorRef,
20
+ Component,
21
+ ContentChild,
22
+ ContentChildren,
23
+ DOWN_ARROW,
24
+ Directionality,
25
+ Directive,
26
+ ENTER,
27
+ ESCAPE,
28
+ ElementRef,
29
+ EventEmitter,
30
+ HostAttributeToken,
31
+ Injectable,
32
+ InjectionToken,
33
+ Injector,
34
+ Input,
35
+ LEFT_ARROW,
36
+ LOCALE_ID,
37
+ LiveAnnouncer,
38
+ MatCommonModule,
39
+ MatRipple,
40
+ MatRippleModule,
41
+ NgClass,
42
+ NgModule,
43
+ Output,
44
+ OverlayModule,
45
+ RIGHT_ARROW,
46
+ Renderer2,
47
+ SPACE,
48
+ Subject,
49
+ UP_ARROW,
50
+ Version,
51
+ ViewChild,
52
+ ViewEncapsulation,
53
+ ViewportRuler,
54
+ _CdkPrivateStyleLoader,
55
+ _IdGenerator,
56
+ _StructuralStylesLoader,
57
+ _ViewRepeaterOperation,
58
+ _VisuallyHiddenLoader,
59
+ __spreadProps,
60
+ __spreadValues,
61
+ _animationsDisabled,
62
+ addAriaReferencedId,
63
+ booleanAttribute,
64
+ createRepositionScrollStrategy,
65
+ defer,
66
+ filter,
67
+ hasModifierKey,
68
+ inject,
69
+ isSignal,
70
+ map,
71
+ merge,
72
+ numberAttribute,
73
+ removeAriaReferencedId,
74
+ setClassMetadata,
75
+ signal,
76
+ startWith,
77
+ switchMap,
78
+ take,
79
+ takeUntil,
80
+ ɵɵNgOnChangesFeature,
81
+ ɵɵProvidersFeature,
82
+ ɵɵadvance,
83
+ ɵɵattribute,
84
+ ɵɵclassMap,
85
+ ɵɵclassProp,
86
+ ɵɵconditional,
87
+ ɵɵconditionalCreate,
88
+ ɵɵcontentQuery,
89
+ ɵɵdefineComponent,
90
+ ɵɵdefineDirective,
91
+ ɵɵdefineInjectable,
92
+ ɵɵdefineInjector,
93
+ ɵɵdefineNgModule,
94
+ ɵɵdomElementEnd,
95
+ ɵɵdomElementStart,
96
+ ɵɵdomProperty,
97
+ ɵɵelement,
98
+ ɵɵelementEnd,
99
+ ɵɵelementStart,
100
+ ɵɵgetCurrentView,
101
+ ɵɵinterpolate1,
102
+ ɵɵlistener,
103
+ ɵɵloadQuery,
104
+ ɵɵnamespaceSVG,
105
+ ɵɵnextContext,
106
+ ɵɵprojection,
107
+ ɵɵprojectionDef,
108
+ ɵɵproperty,
109
+ ɵɵqueryRefresh,
110
+ ɵɵreference,
111
+ ɵɵresetView,
112
+ ɵɵrestoreView,
113
+ ɵɵtemplate,
114
+ ɵɵtext,
115
+ ɵɵtextInterpolate,
116
+ ɵɵtextInterpolate1,
117
+ ɵɵviewQuery
118
+ } from "./chunk-SDOP6T56.js";
119
+
120
+ // node_modules/@angular/material/fesm2022/pseudo-checkbox-AUVlNJs_.mjs
121
+ var MatPseudoCheckbox = class _MatPseudoCheckbox {
122
+ _animationsDisabled = _animationsDisabled();
123
+ /** Display state of the checkbox. */
124
+ state = "unchecked";
125
+ /** Whether the checkbox is disabled. */
126
+ disabled = false;
127
+ /**
128
+ * Appearance of the pseudo checkbox. Default appearance of 'full' renders a checkmark/mixedmark
129
+ * indicator inside a square box. 'minimal' appearance only renders the checkmark/mixedmark.
130
+ */
131
+ appearance = "full";
132
+ constructor() {
133
+ }
134
+ static \u0275fac = function MatPseudoCheckbox_Factory(__ngFactoryType__) {
135
+ return new (__ngFactoryType__ || _MatPseudoCheckbox)();
136
+ };
137
+ static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({
138
+ type: _MatPseudoCheckbox,
139
+ selectors: [["mat-pseudo-checkbox"]],
140
+ hostAttrs: [1, "mat-pseudo-checkbox"],
141
+ hostVars: 12,
142
+ hostBindings: function MatPseudoCheckbox_HostBindings(rf, ctx) {
143
+ if (rf & 2) {
144
+ \u0275\u0275classProp("mat-pseudo-checkbox-indeterminate", ctx.state === "indeterminate")("mat-pseudo-checkbox-checked", ctx.state === "checked")("mat-pseudo-checkbox-disabled", ctx.disabled)("mat-pseudo-checkbox-minimal", ctx.appearance === "minimal")("mat-pseudo-checkbox-full", ctx.appearance === "full")("_mat-animation-noopable", ctx._animationsDisabled);
145
+ }
146
+ },
147
+ inputs: {
148
+ state: "state",
149
+ disabled: "disabled",
150
+ appearance: "appearance"
151
+ },
152
+ decls: 0,
153
+ vars: 0,
154
+ template: function MatPseudoCheckbox_Template(rf, ctx) {
155
+ },
156
+ styles: ['.mat-pseudo-checkbox{border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox._mat-animation-noopable{transition:none !important;animation:none !important}.mat-pseudo-checkbox._mat-animation-noopable::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{left:1px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{left:1px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-minimal-selected-checkmark-color, var(--mat-sys-primary))}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full{border-color:var(--mat-pseudo-checkbox-full-unselected-icon-color, var(--mat-sys-on-surface-variant));border-width:2px;border-style:solid}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-disabled{border-color:var(--mat-pseudo-checkbox-full-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate{background-color:var(--mat-pseudo-checkbox-full-selected-icon-color, var(--mat-sys-primary));border-color:rgba(0,0,0,0)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-full-selected-checkmark-color, var(--mat-sys-on-primary))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background-color:var(--mat-pseudo-checkbox-full-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-full-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mat-pseudo-checkbox{width:18px;height:18px}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after{width:14px;height:6px;transform-origin:center;top:-4.2426406871px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{top:8px;width:16px}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after{width:10px;height:4px;transform-origin:center;top:-2.8284271247px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{top:6px;width:12px}\n'],
157
+ encapsulation: 2,
158
+ changeDetection: 0
159
+ });
160
+ };
161
+ (() => {
162
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatPseudoCheckbox, [{
163
+ type: Component,
164
+ args: [{
165
+ encapsulation: ViewEncapsulation.None,
166
+ changeDetection: ChangeDetectionStrategy.OnPush,
167
+ selector: "mat-pseudo-checkbox",
168
+ template: "",
169
+ host: {
170
+ "class": "mat-pseudo-checkbox",
171
+ "[class.mat-pseudo-checkbox-indeterminate]": 'state === "indeterminate"',
172
+ "[class.mat-pseudo-checkbox-checked]": 'state === "checked"',
173
+ "[class.mat-pseudo-checkbox-disabled]": "disabled",
174
+ "[class.mat-pseudo-checkbox-minimal]": 'appearance === "minimal"',
175
+ "[class.mat-pseudo-checkbox-full]": 'appearance === "full"',
176
+ "[class._mat-animation-noopable]": "_animationsDisabled"
177
+ },
178
+ styles: ['.mat-pseudo-checkbox{border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox._mat-animation-noopable{transition:none !important;animation:none !important}.mat-pseudo-checkbox._mat-animation-noopable::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{left:1px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{left:1px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-minimal-selected-checkmark-color, var(--mat-sys-primary))}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full{border-color:var(--mat-pseudo-checkbox-full-unselected-icon-color, var(--mat-sys-on-surface-variant));border-width:2px;border-style:solid}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-disabled{border-color:var(--mat-pseudo-checkbox-full-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate{background-color:var(--mat-pseudo-checkbox-full-selected-icon-color, var(--mat-sys-primary));border-color:rgba(0,0,0,0)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-full-selected-checkmark-color, var(--mat-sys-on-primary))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background-color:var(--mat-pseudo-checkbox-full-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-full-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mat-pseudo-checkbox{width:18px;height:18px}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after{width:14px;height:6px;transform-origin:center;top:-4.2426406871px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{top:8px;width:16px}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after{width:10px;height:4px;transform-origin:center;top:-2.8284271247px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{top:6px;width:12px}\n']
179
+ }]
180
+ }], () => [], {
181
+ state: [{
182
+ type: Input
183
+ }],
184
+ disabled: [{
185
+ type: Input
186
+ }],
187
+ appearance: [{
188
+ type: Input
189
+ }]
190
+ });
191
+ })();
192
+
193
+ // node_modules/@angular/material/fesm2022/option-CEIjUDzj.mjs
194
+ var _c0 = ["*", [["mat-option"], ["ng-container"]]];
195
+ var _c1 = ["*", "mat-option, ng-container"];
196
+ var _c2 = ["text"];
197
+ var _c3 = [[["mat-icon"]], "*"];
198
+ var _c4 = ["mat-icon", "*"];
199
+ function MatOption_Conditional_0_Template(rf, ctx) {
200
+ if (rf & 1) {
201
+ \u0275\u0275element(0, "mat-pseudo-checkbox", 1);
202
+ }
203
+ if (rf & 2) {
204
+ const ctx_r0 = \u0275\u0275nextContext();
205
+ \u0275\u0275property("disabled", ctx_r0.disabled)("state", ctx_r0.selected ? "checked" : "unchecked");
206
+ }
207
+ }
208
+ function MatOption_Conditional_5_Template(rf, ctx) {
209
+ if (rf & 1) {
210
+ \u0275\u0275element(0, "mat-pseudo-checkbox", 3);
211
+ }
212
+ if (rf & 2) {
213
+ const ctx_r0 = \u0275\u0275nextContext();
214
+ \u0275\u0275property("disabled", ctx_r0.disabled);
215
+ }
216
+ }
217
+ function MatOption_Conditional_6_Template(rf, ctx) {
218
+ if (rf & 1) {
219
+ \u0275\u0275elementStart(0, "span", 4);
220
+ \u0275\u0275text(1);
221
+ \u0275\u0275elementEnd();
222
+ }
223
+ if (rf & 2) {
224
+ const ctx_r0 = \u0275\u0275nextContext();
225
+ \u0275\u0275advance();
226
+ \u0275\u0275textInterpolate1("(", ctx_r0.group.label, ")");
227
+ }
228
+ }
229
+ var MAT_OPTION_PARENT_COMPONENT = new InjectionToken("MAT_OPTION_PARENT_COMPONENT");
230
+ var MAT_OPTGROUP = new InjectionToken("MatOptgroup");
231
+ var MatOptgroup = class _MatOptgroup {
232
+ /** Label for the option group. */
233
+ label;
234
+ /** whether the option group is disabled. */
235
+ disabled = false;
236
+ /** Unique id for the underlying label. */
237
+ _labelId = inject(_IdGenerator).getId("mat-optgroup-label-");
238
+ /** Whether the group is in inert a11y mode. */
239
+ _inert;
240
+ constructor() {
241
+ const parent = inject(MAT_OPTION_PARENT_COMPONENT, {
242
+ optional: true
243
+ });
244
+ this._inert = parent?.inertGroups ?? false;
245
+ }
246
+ static \u0275fac = function MatOptgroup_Factory(__ngFactoryType__) {
247
+ return new (__ngFactoryType__ || _MatOptgroup)();
248
+ };
249
+ static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({
250
+ type: _MatOptgroup,
251
+ selectors: [["mat-optgroup"]],
252
+ hostAttrs: [1, "mat-mdc-optgroup"],
253
+ hostVars: 3,
254
+ hostBindings: function MatOptgroup_HostBindings(rf, ctx) {
255
+ if (rf & 2) {
256
+ \u0275\u0275attribute("role", ctx._inert ? null : "group")("aria-disabled", ctx._inert ? null : ctx.disabled.toString())("aria-labelledby", ctx._inert ? null : ctx._labelId);
257
+ }
258
+ },
259
+ inputs: {
260
+ label: "label",
261
+ disabled: [2, "disabled", "disabled", booleanAttribute]
262
+ },
263
+ exportAs: ["matOptgroup"],
264
+ features: [\u0275\u0275ProvidersFeature([{
265
+ provide: MAT_OPTGROUP,
266
+ useExisting: _MatOptgroup
267
+ }])],
268
+ ngContentSelectors: _c1,
269
+ decls: 5,
270
+ vars: 4,
271
+ consts: [["role", "presentation", 1, "mat-mdc-optgroup-label", 3, "id"], [1, "mdc-list-item__primary-text"]],
272
+ template: function MatOptgroup_Template(rf, ctx) {
273
+ if (rf & 1) {
274
+ \u0275\u0275projectionDef(_c0);
275
+ \u0275\u0275domElementStart(0, "span", 0)(1, "span", 1);
276
+ \u0275\u0275text(2);
277
+ \u0275\u0275projection(3);
278
+ \u0275\u0275domElementEnd()();
279
+ \u0275\u0275projection(4, 1);
280
+ }
281
+ if (rf & 2) {
282
+ \u0275\u0275classProp("mdc-list-item--disabled", ctx.disabled);
283
+ \u0275\u0275domProperty("id", ctx._labelId);
284
+ \u0275\u0275advance(2);
285
+ \u0275\u0275textInterpolate1("", ctx.label, " ");
286
+ }
287
+ },
288
+ styles: [".mat-mdc-optgroup{color:var(--mat-optgroup-label-text-color, var(--mat-sys-on-surface-variant));font-family:var(--mat-optgroup-label-text-font, var(--mat-sys-title-small-font));line-height:var(--mat-optgroup-label-text-line-height, var(--mat-sys-title-small-line-height));font-size:var(--mat-optgroup-label-text-size, var(--mat-sys-title-small-size));letter-spacing:var(--mat-optgroup-label-text-tracking, var(--mat-sys-title-small-tracking));font-weight:var(--mat-optgroup-label-text-weight, var(--mat-sys-title-small-weight))}.mat-mdc-optgroup-label{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;min-height:48px;padding:0 16px;outline:none}.mat-mdc-optgroup-label.mdc-list-item--disabled{opacity:.38}.mat-mdc-optgroup-label .mdc-list-item__primary-text{font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;white-space:normal;color:inherit}\n"],
289
+ encapsulation: 2,
290
+ changeDetection: 0
291
+ });
292
+ };
293
+ (() => {
294
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatOptgroup, [{
295
+ type: Component,
296
+ args: [{
297
+ selector: "mat-optgroup",
298
+ exportAs: "matOptgroup",
299
+ encapsulation: ViewEncapsulation.None,
300
+ changeDetection: ChangeDetectionStrategy.OnPush,
301
+ host: {
302
+ "class": "mat-mdc-optgroup",
303
+ "[attr.role]": '_inert ? null : "group"',
304
+ "[attr.aria-disabled]": "_inert ? null : disabled.toString()",
305
+ "[attr.aria-labelledby]": "_inert ? null : _labelId"
306
+ },
307
+ providers: [{
308
+ provide: MAT_OPTGROUP,
309
+ useExisting: MatOptgroup
310
+ }],
311
+ template: '<span\n class="mat-mdc-optgroup-label"\n role="presentation"\n [class.mdc-list-item--disabled]="disabled"\n [id]="_labelId">\n <span class="mdc-list-item__primary-text">{{ label }} <ng-content></ng-content></span>\n</span>\n\n<ng-content select="mat-option, ng-container"></ng-content>\n',
312
+ styles: [".mat-mdc-optgroup{color:var(--mat-optgroup-label-text-color, var(--mat-sys-on-surface-variant));font-family:var(--mat-optgroup-label-text-font, var(--mat-sys-title-small-font));line-height:var(--mat-optgroup-label-text-line-height, var(--mat-sys-title-small-line-height));font-size:var(--mat-optgroup-label-text-size, var(--mat-sys-title-small-size));letter-spacing:var(--mat-optgroup-label-text-tracking, var(--mat-sys-title-small-tracking));font-weight:var(--mat-optgroup-label-text-weight, var(--mat-sys-title-small-weight))}.mat-mdc-optgroup-label{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;min-height:48px;padding:0 16px;outline:none}.mat-mdc-optgroup-label.mdc-list-item--disabled{opacity:.38}.mat-mdc-optgroup-label .mdc-list-item__primary-text{font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;white-space:normal;color:inherit}\n"]
313
+ }]
314
+ }], () => [], {
315
+ label: [{
316
+ type: Input
317
+ }],
318
+ disabled: [{
319
+ type: Input,
320
+ args: [{
321
+ transform: booleanAttribute
322
+ }]
323
+ }]
324
+ });
325
+ })();
326
+ var MatOptionSelectionChange = class {
327
+ source;
328
+ isUserInput;
329
+ constructor(source, isUserInput = false) {
330
+ this.source = source;
331
+ this.isUserInput = isUserInput;
332
+ }
333
+ };
334
+ var MatOption = class _MatOption {
335
+ _element = inject(ElementRef);
336
+ _changeDetectorRef = inject(ChangeDetectorRef);
337
+ _parent = inject(MAT_OPTION_PARENT_COMPONENT, {
338
+ optional: true
339
+ });
340
+ group = inject(MAT_OPTGROUP, {
341
+ optional: true
342
+ });
343
+ _signalDisableRipple = false;
344
+ _selected = false;
345
+ _active = false;
346
+ _mostRecentViewValue = "";
347
+ /** Whether the wrapping component is in multiple selection mode. */
348
+ get multiple() {
349
+ return this._parent && this._parent.multiple;
350
+ }
351
+ /** Whether or not the option is currently selected. */
352
+ get selected() {
353
+ return this._selected;
354
+ }
355
+ /** The form value of the option. */
356
+ value;
357
+ /** The unique ID of the option. */
358
+ id = inject(_IdGenerator).getId("mat-option-");
359
+ /** Whether the option is disabled. */
360
+ get disabled() {
361
+ return this.group && this.group.disabled || this._disabled();
362
+ }
363
+ set disabled(value) {
364
+ this._disabled.set(value);
365
+ }
366
+ _disabled = signal(false);
367
+ /** Whether ripples for the option are disabled. */
368
+ get disableRipple() {
369
+ return this._signalDisableRipple ? this._parent.disableRipple() : !!this._parent?.disableRipple;
370
+ }
371
+ /** Whether to display checkmark for single-selection. */
372
+ get hideSingleSelectionIndicator() {
373
+ return !!(this._parent && this._parent.hideSingleSelectionIndicator);
374
+ }
375
+ /** Event emitted when the option is selected or deselected. */
376
+ // tslint:disable-next-line:no-output-on-prefix
377
+ onSelectionChange = new EventEmitter();
378
+ /** Element containing the option's text. */
379
+ _text;
380
+ /** Emits when the state of the option changes and any parents have to be notified. */
381
+ _stateChanges = new Subject();
382
+ constructor() {
383
+ const styleLoader = inject(_CdkPrivateStyleLoader);
384
+ styleLoader.load(_StructuralStylesLoader);
385
+ styleLoader.load(_VisuallyHiddenLoader);
386
+ this._signalDisableRipple = !!this._parent && isSignal(this._parent.disableRipple);
387
+ }
388
+ /**
389
+ * Whether or not the option is currently active and ready to be selected.
390
+ * An active option displays styles as if it is focused, but the
391
+ * focus is actually retained somewhere else. This comes in handy
392
+ * for components like autocomplete where focus must remain on the input.
393
+ */
394
+ get active() {
395
+ return this._active;
396
+ }
397
+ /**
398
+ * The displayed value of the option. It is necessary to show the selected option in the
399
+ * select's trigger.
400
+ */
401
+ get viewValue() {
402
+ return (this._text?.nativeElement.textContent || "").trim();
403
+ }
404
+ /** Selects the option. */
405
+ select(emitEvent = true) {
406
+ if (!this._selected) {
407
+ this._selected = true;
408
+ this._changeDetectorRef.markForCheck();
409
+ if (emitEvent) {
410
+ this._emitSelectionChangeEvent();
411
+ }
412
+ }
413
+ }
414
+ /** Deselects the option. */
415
+ deselect(emitEvent = true) {
416
+ if (this._selected) {
417
+ this._selected = false;
418
+ this._changeDetectorRef.markForCheck();
419
+ if (emitEvent) {
420
+ this._emitSelectionChangeEvent();
421
+ }
422
+ }
423
+ }
424
+ /** Sets focus onto this option. */
425
+ focus(_origin, options) {
426
+ const element = this._getHostElement();
427
+ if (typeof element.focus === "function") {
428
+ element.focus(options);
429
+ }
430
+ }
431
+ /**
432
+ * This method sets display styles on the option to make it appear
433
+ * active. This is used by the ActiveDescendantKeyManager so key
434
+ * events will display the proper options as active on arrow key events.
435
+ */
436
+ setActiveStyles() {
437
+ if (!this._active) {
438
+ this._active = true;
439
+ this._changeDetectorRef.markForCheck();
440
+ }
441
+ }
442
+ /**
443
+ * This method removes display styles on the option that made it appear
444
+ * active. This is used by the ActiveDescendantKeyManager so key
445
+ * events will display the proper options as active on arrow key events.
446
+ */
447
+ setInactiveStyles() {
448
+ if (this._active) {
449
+ this._active = false;
450
+ this._changeDetectorRef.markForCheck();
451
+ }
452
+ }
453
+ /** Gets the label to be used when determining whether the option should be focused. */
454
+ getLabel() {
455
+ return this.viewValue;
456
+ }
457
+ /** Ensures the option is selected when activated from the keyboard. */
458
+ _handleKeydown(event) {
459
+ if ((event.keyCode === ENTER || event.keyCode === SPACE) && !hasModifierKey(event)) {
460
+ this._selectViaInteraction();
461
+ event.preventDefault();
462
+ }
463
+ }
464
+ /**
465
+ * `Selects the option while indicating the selection came from the user. Used to
466
+ * determine if the select's view -> model callback should be invoked.`
467
+ */
468
+ _selectViaInteraction() {
469
+ if (!this.disabled) {
470
+ this._selected = this.multiple ? !this._selected : true;
471
+ this._changeDetectorRef.markForCheck();
472
+ this._emitSelectionChangeEvent(true);
473
+ }
474
+ }
475
+ /** Returns the correct tabindex for the option depending on disabled state. */
476
+ // This method is only used by `MatLegacyOption`. Keeping it here to avoid breaking the types.
477
+ // That's because `MatLegacyOption` use `MatOption` type in a few places such as
478
+ // `MatOptionSelectionChange`. It is safe to delete this when `MatLegacyOption` is deleted.
479
+ _getTabIndex() {
480
+ return this.disabled ? "-1" : "0";
481
+ }
482
+ /** Gets the host DOM element. */
483
+ _getHostElement() {
484
+ return this._element.nativeElement;
485
+ }
486
+ ngAfterViewChecked() {
487
+ if (this._selected) {
488
+ const viewValue = this.viewValue;
489
+ if (viewValue !== this._mostRecentViewValue) {
490
+ if (this._mostRecentViewValue) {
491
+ this._stateChanges.next();
492
+ }
493
+ this._mostRecentViewValue = viewValue;
494
+ }
495
+ }
496
+ }
497
+ ngOnDestroy() {
498
+ this._stateChanges.complete();
499
+ }
500
+ /** Emits the selection change event. */
501
+ _emitSelectionChangeEvent(isUserInput = false) {
502
+ this.onSelectionChange.emit(new MatOptionSelectionChange(this, isUserInput));
503
+ }
504
+ static \u0275fac = function MatOption_Factory(__ngFactoryType__) {
505
+ return new (__ngFactoryType__ || _MatOption)();
506
+ };
507
+ static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({
508
+ type: _MatOption,
509
+ selectors: [["mat-option"]],
510
+ viewQuery: function MatOption_Query(rf, ctx) {
511
+ if (rf & 1) {
512
+ \u0275\u0275viewQuery(_c2, 7);
513
+ }
514
+ if (rf & 2) {
515
+ let _t;
516
+ \u0275\u0275queryRefresh(_t = \u0275\u0275loadQuery()) && (ctx._text = _t.first);
517
+ }
518
+ },
519
+ hostAttrs: ["role", "option", 1, "mat-mdc-option", "mdc-list-item"],
520
+ hostVars: 11,
521
+ hostBindings: function MatOption_HostBindings(rf, ctx) {
522
+ if (rf & 1) {
523
+ \u0275\u0275listener("click", function MatOption_click_HostBindingHandler() {
524
+ return ctx._selectViaInteraction();
525
+ })("keydown", function MatOption_keydown_HostBindingHandler($event) {
526
+ return ctx._handleKeydown($event);
527
+ });
528
+ }
529
+ if (rf & 2) {
530
+ \u0275\u0275domProperty("id", ctx.id);
531
+ \u0275\u0275attribute("aria-selected", ctx.selected)("aria-disabled", ctx.disabled.toString());
532
+ \u0275\u0275classProp("mdc-list-item--selected", ctx.selected)("mat-mdc-option-multiple", ctx.multiple)("mat-mdc-option-active", ctx.active)("mdc-list-item--disabled", ctx.disabled);
533
+ }
534
+ },
535
+ inputs: {
536
+ value: "value",
537
+ id: "id",
538
+ disabled: [2, "disabled", "disabled", booleanAttribute]
539
+ },
540
+ outputs: {
541
+ onSelectionChange: "onSelectionChange"
542
+ },
543
+ exportAs: ["matOption"],
544
+ ngContentSelectors: _c4,
545
+ decls: 8,
546
+ vars: 5,
547
+ consts: [["text", ""], ["aria-hidden", "true", 1, "mat-mdc-option-pseudo-checkbox", 3, "disabled", "state"], [1, "mdc-list-item__primary-text"], ["state", "checked", "aria-hidden", "true", "appearance", "minimal", 1, "mat-mdc-option-pseudo-checkbox", 3, "disabled"], [1, "cdk-visually-hidden"], ["aria-hidden", "true", "mat-ripple", "", 1, "mat-mdc-option-ripple", "mat-focus-indicator", 3, "matRippleTrigger", "matRippleDisabled"]],
548
+ template: function MatOption_Template(rf, ctx) {
549
+ if (rf & 1) {
550
+ \u0275\u0275projectionDef(_c3);
551
+ \u0275\u0275conditionalCreate(0, MatOption_Conditional_0_Template, 1, 2, "mat-pseudo-checkbox", 1);
552
+ \u0275\u0275projection(1);
553
+ \u0275\u0275elementStart(2, "span", 2, 0);
554
+ \u0275\u0275projection(4, 1);
555
+ \u0275\u0275elementEnd();
556
+ \u0275\u0275conditionalCreate(5, MatOption_Conditional_5_Template, 1, 1, "mat-pseudo-checkbox", 3);
557
+ \u0275\u0275conditionalCreate(6, MatOption_Conditional_6_Template, 2, 1, "span", 4);
558
+ \u0275\u0275element(7, "div", 5);
559
+ }
560
+ if (rf & 2) {
561
+ \u0275\u0275conditional(ctx.multiple ? 0 : -1);
562
+ \u0275\u0275advance(5);
563
+ \u0275\u0275conditional(!ctx.multiple && ctx.selected && !ctx.hideSingleSelectionIndicator ? 5 : -1);
564
+ \u0275\u0275advance();
565
+ \u0275\u0275conditional(ctx.group && ctx.group._inert ? 6 : -1);
566
+ \u0275\u0275advance();
567
+ \u0275\u0275property("matRippleTrigger", ctx._getHostElement())("matRippleDisabled", ctx.disabled || ctx.disableRipple);
568
+ }
569
+ },
570
+ dependencies: [MatPseudoCheckbox, MatRipple],
571
+ styles: ['.mat-mdc-option{-webkit-user-select:none;user-select:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;min-height:48px;padding:0 16px;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0);color:var(--mat-option-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-option-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-option-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-option-label-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-option-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-option-label-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-option:hover:not(.mdc-list-item--disabled){background-color:var(--mat-option-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:var(--mat-option-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent));outline:0}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-multiple){background-color:var(--mat-option-selected-state-layer-color, var(--mat-sys-secondary-container))}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-multiple) .mdc-list-item__primary-text{color:var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option.mdc-list-item{align-items:center;background:rgba(0,0,0,0)}.mat-mdc-option.mdc-list-item--disabled{cursor:default;pointer-events:none}.mat-mdc-option.mdc-list-item--disabled .mat-mdc-option-pseudo-checkbox,.mat-mdc-option.mdc-list-item--disabled .mdc-list-item__primary-text,.mat-mdc-option.mdc-list-item--disabled>mat-icon{opacity:.38}.mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:32px}[dir=rtl] .mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:16px;padding-right:32px}.mat-mdc-option .mat-icon,.mat-mdc-option .mat-pseudo-checkbox-full{margin-right:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-icon,[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:0;margin-left:16px}.mat-mdc-option .mat-pseudo-checkbox-minimal{margin-left:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-minimal{margin-right:16px;margin-left:0}.mat-mdc-option .mat-mdc-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-option .mdc-list-item__primary-text{white-space:normal;font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;margin-right:auto}[dir=rtl] .mat-mdc-option .mdc-list-item__primary-text{margin-right:0;margin-left:auto}@media(forced-colors: active){.mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{content:"";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}[dir=rtl] .mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{right:auto;left:16px}}.mat-mdc-option-multiple{--mat-list-list-item-selected-container-color: var(--mat-list-list-item-container-color, transparent)}.mat-mdc-option-active .mat-focus-indicator::before{content:""}\n'],
572
+ encapsulation: 2,
573
+ changeDetection: 0
574
+ });
575
+ };
576
+ (() => {
577
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatOption, [{
578
+ type: Component,
579
+ args: [{
580
+ selector: "mat-option",
581
+ exportAs: "matOption",
582
+ host: {
583
+ "role": "option",
584
+ "[class.mdc-list-item--selected]": "selected",
585
+ "[class.mat-mdc-option-multiple]": "multiple",
586
+ "[class.mat-mdc-option-active]": "active",
587
+ "[class.mdc-list-item--disabled]": "disabled",
588
+ "[id]": "id",
589
+ // Set aria-selected to false for non-selected items and true for selected items. Conform to
590
+ // [WAI ARIA Listbox authoring practices guide](
591
+ // https://www.w3.org/WAI/ARIA/apg/patterns/listbox/), "If any options are selected, each
592
+ // selected option has either aria-selected or aria-checked set to true. All options that are
593
+ // selectable but not selected have either aria-selected or aria-checked set to false." Align
594
+ // aria-selected implementation of Chips and List components.
595
+ //
596
+ // Set `aria-selected="false"` on not-selected listbox options to fix VoiceOver announcing
597
+ // every option as "selected" (#21491).
598
+ "[attr.aria-selected]": "selected",
599
+ "[attr.aria-disabled]": "disabled.toString()",
600
+ "(click)": "_selectViaInteraction()",
601
+ "(keydown)": "_handleKeydown($event)",
602
+ "class": "mat-mdc-option mdc-list-item"
603
+ },
604
+ encapsulation: ViewEncapsulation.None,
605
+ changeDetection: ChangeDetectionStrategy.OnPush,
606
+ imports: [MatPseudoCheckbox, MatRipple],
607
+ template: `<!-- Set aria-hidden="true" to this DOM node and other decorative nodes in this file. This might
608
+ be contributing to issue where sometimes VoiceOver focuses on a TextNode in the a11y tree instead
609
+ of the Option node (#23202). Most assistive technology will generally ignore non-role,
610
+ non-text-content elements. Adding aria-hidden seems to make VoiceOver behave more consistently. -->
611
+ @if (multiple) {
612
+ <mat-pseudo-checkbox
613
+ class="mat-mdc-option-pseudo-checkbox"
614
+ [disabled]="disabled"
615
+ [state]="selected ? 'checked' : 'unchecked'"
616
+ aria-hidden="true"></mat-pseudo-checkbox>
617
+ }
618
+
619
+ <ng-content select="mat-icon"></ng-content>
620
+
621
+ <span class="mdc-list-item__primary-text" #text><ng-content></ng-content></span>
622
+
623
+ <!-- Render checkmark at the end for single-selection. -->
624
+ @if (!multiple && selected && !hideSingleSelectionIndicator) {
625
+ <mat-pseudo-checkbox
626
+ class="mat-mdc-option-pseudo-checkbox"
627
+ [disabled]="disabled"
628
+ state="checked"
629
+ aria-hidden="true"
630
+ appearance="minimal"></mat-pseudo-checkbox>
631
+ }
632
+
633
+ <!-- See a11y notes inside optgroup.ts for context behind this element. -->
634
+ @if (group && group._inert) {
635
+ <span class="cdk-visually-hidden">({{ group.label }})</span>
636
+ }
637
+
638
+ <div class="mat-mdc-option-ripple mat-focus-indicator" aria-hidden="true" mat-ripple
639
+ [matRippleTrigger]="_getHostElement()" [matRippleDisabled]="disabled || disableRipple">
640
+ </div>
641
+ `,
642
+ styles: ['.mat-mdc-option{-webkit-user-select:none;user-select:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;min-height:48px;padding:0 16px;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0);color:var(--mat-option-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-option-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-option-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-option-label-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-option-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-option-label-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-option:hover:not(.mdc-list-item--disabled){background-color:var(--mat-option-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:var(--mat-option-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent));outline:0}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-multiple){background-color:var(--mat-option-selected-state-layer-color, var(--mat-sys-secondary-container))}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-multiple) .mdc-list-item__primary-text{color:var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option.mdc-list-item{align-items:center;background:rgba(0,0,0,0)}.mat-mdc-option.mdc-list-item--disabled{cursor:default;pointer-events:none}.mat-mdc-option.mdc-list-item--disabled .mat-mdc-option-pseudo-checkbox,.mat-mdc-option.mdc-list-item--disabled .mdc-list-item__primary-text,.mat-mdc-option.mdc-list-item--disabled>mat-icon{opacity:.38}.mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:32px}[dir=rtl] .mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:16px;padding-right:32px}.mat-mdc-option .mat-icon,.mat-mdc-option .mat-pseudo-checkbox-full{margin-right:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-icon,[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:0;margin-left:16px}.mat-mdc-option .mat-pseudo-checkbox-minimal{margin-left:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-minimal{margin-right:16px;margin-left:0}.mat-mdc-option .mat-mdc-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-option .mdc-list-item__primary-text{white-space:normal;font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;margin-right:auto}[dir=rtl] .mat-mdc-option .mdc-list-item__primary-text{margin-right:0;margin-left:auto}@media(forced-colors: active){.mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{content:"";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}[dir=rtl] .mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{right:auto;left:16px}}.mat-mdc-option-multiple{--mat-list-list-item-selected-container-color: var(--mat-list-list-item-container-color, transparent)}.mat-mdc-option-active .mat-focus-indicator::before{content:""}\n']
643
+ }]
644
+ }], () => [], {
645
+ value: [{
646
+ type: Input
647
+ }],
648
+ id: [{
649
+ type: Input
650
+ }],
651
+ disabled: [{
652
+ type: Input,
653
+ args: [{
654
+ transform: booleanAttribute
655
+ }]
656
+ }],
657
+ onSelectionChange: [{
658
+ type: Output
659
+ }],
660
+ _text: [{
661
+ type: ViewChild,
662
+ args: ["text", {
663
+ static: true
664
+ }]
665
+ }]
666
+ });
667
+ })();
668
+ function _countGroupLabelsBeforeOption(optionIndex, options, optionGroups) {
669
+ if (optionGroups.length) {
670
+ let optionsArray = options.toArray();
671
+ let groups = optionGroups.toArray();
672
+ let groupCounter = 0;
673
+ for (let i = 0; i < optionIndex + 1; i++) {
674
+ if (optionsArray[i].group && optionsArray[i].group === groups[groupCounter]) {
675
+ groupCounter++;
676
+ }
677
+ }
678
+ return groupCounter;
679
+ }
680
+ return 0;
681
+ }
682
+ function _getOptionScrollPosition(optionOffset, optionHeight, currentScrollPosition, panelHeight) {
683
+ if (optionOffset < currentScrollPosition) {
684
+ return optionOffset;
685
+ }
686
+ if (optionOffset + optionHeight > currentScrollPosition + panelHeight) {
687
+ return Math.max(0, optionOffset - panelHeight + optionHeight);
688
+ }
689
+ return currentScrollPosition;
690
+ }
691
+
692
+ // node_modules/@angular/cdk/fesm2022/unique-selection-dispatcher-Cewa_Eg3.mjs
693
+ var UniqueSelectionDispatcher = class _UniqueSelectionDispatcher {
694
+ _listeners = [];
695
+ /**
696
+ * Notify other items that selection for the given name has been set.
697
+ * @param id ID of the item.
698
+ * @param name Name of the item.
699
+ */
700
+ notify(id, name) {
701
+ for (let listener of this._listeners) {
702
+ listener(id, name);
703
+ }
704
+ }
705
+ /**
706
+ * Listen for future changes to item selection.
707
+ * @return Function used to deregister listener
708
+ */
709
+ listen(listener) {
710
+ this._listeners.push(listener);
711
+ return () => {
712
+ this._listeners = this._listeners.filter((registered) => {
713
+ return listener !== registered;
714
+ });
715
+ };
716
+ }
717
+ ngOnDestroy() {
718
+ this._listeners = [];
719
+ }
720
+ static \u0275fac = function UniqueSelectionDispatcher_Factory(__ngFactoryType__) {
721
+ return new (__ngFactoryType__ || _UniqueSelectionDispatcher)();
722
+ };
723
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
724
+ token: _UniqueSelectionDispatcher,
725
+ factory: _UniqueSelectionDispatcher.\u0275fac,
726
+ providedIn: "root"
727
+ });
728
+ };
729
+ (() => {
730
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(UniqueSelectionDispatcher, [{
731
+ type: Injectable,
732
+ args: [{
733
+ providedIn: "root"
734
+ }]
735
+ }], null, null);
736
+ })();
737
+
738
+ // node_modules/@angular/cdk/fesm2022/dispose-view-repeater-strategy-Cvpav0PR.mjs
739
+ var _DisposeViewRepeaterStrategy = class {
740
+ applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {
741
+ changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {
742
+ let view;
743
+ let operation;
744
+ if (record.previousIndex == null) {
745
+ const insertContext = itemContextFactory(record, adjustedPreviousIndex, currentIndex);
746
+ view = viewContainerRef.createEmbeddedView(insertContext.templateRef, insertContext.context, insertContext.index);
747
+ operation = _ViewRepeaterOperation.INSERTED;
748
+ } else if (currentIndex == null) {
749
+ viewContainerRef.remove(adjustedPreviousIndex);
750
+ operation = _ViewRepeaterOperation.REMOVED;
751
+ } else {
752
+ view = viewContainerRef.get(adjustedPreviousIndex);
753
+ viewContainerRef.move(view, currentIndex);
754
+ operation = _ViewRepeaterOperation.MOVED;
755
+ }
756
+ if (itemViewChanged) {
757
+ itemViewChanged({
758
+ context: view?.context,
759
+ operation,
760
+ record
761
+ });
762
+ }
763
+ });
764
+ }
765
+ detach() {
766
+ }
767
+ };
768
+
769
+ // node_modules/@angular/cdk/fesm2022/selection-model-BCgC8uEN.mjs
770
+ var SelectionModel = class {
771
+ _multiple;
772
+ _emitChanges;
773
+ compareWith;
774
+ /** Currently-selected values. */
775
+ _selection = /* @__PURE__ */ new Set();
776
+ /** Keeps track of the deselected options that haven't been emitted by the change event. */
777
+ _deselectedToEmit = [];
778
+ /** Keeps track of the selected options that haven't been emitted by the change event. */
779
+ _selectedToEmit = [];
780
+ /** Cache for the array value of the selected items. */
781
+ _selected;
782
+ /** Selected values. */
783
+ get selected() {
784
+ if (!this._selected) {
785
+ this._selected = Array.from(this._selection.values());
786
+ }
787
+ return this._selected;
788
+ }
789
+ /** Event emitted when the value has changed. */
790
+ changed = new Subject();
791
+ constructor(_multiple = false, initiallySelectedValues, _emitChanges = true, compareWith) {
792
+ this._multiple = _multiple;
793
+ this._emitChanges = _emitChanges;
794
+ this.compareWith = compareWith;
795
+ if (initiallySelectedValues && initiallySelectedValues.length) {
796
+ if (_multiple) {
797
+ initiallySelectedValues.forEach((value) => this._markSelected(value));
798
+ } else {
799
+ this._markSelected(initiallySelectedValues[0]);
800
+ }
801
+ this._selectedToEmit.length = 0;
802
+ }
803
+ }
804
+ /**
805
+ * Selects a value or an array of values.
806
+ * @param values The values to select
807
+ * @return Whether the selection changed as a result of this call
808
+ */
809
+ select(...values) {
810
+ this._verifyValueAssignment(values);
811
+ values.forEach((value) => this._markSelected(value));
812
+ const changed = this._hasQueuedChanges();
813
+ this._emitChangeEvent();
814
+ return changed;
815
+ }
816
+ /**
817
+ * Deselects a value or an array of values.
818
+ * @param values The values to deselect
819
+ * @return Whether the selection changed as a result of this call
820
+ */
821
+ deselect(...values) {
822
+ this._verifyValueAssignment(values);
823
+ values.forEach((value) => this._unmarkSelected(value));
824
+ const changed = this._hasQueuedChanges();
825
+ this._emitChangeEvent();
826
+ return changed;
827
+ }
828
+ /**
829
+ * Sets the selected values
830
+ * @param values The new selected values
831
+ * @return Whether the selection changed as a result of this call
832
+ */
833
+ setSelection(...values) {
834
+ this._verifyValueAssignment(values);
835
+ const oldValues = this.selected;
836
+ const newSelectedSet = new Set(values.map((value) => this._getConcreteValue(value)));
837
+ values.forEach((value) => this._markSelected(value));
838
+ oldValues.filter((value) => !newSelectedSet.has(this._getConcreteValue(value, newSelectedSet))).forEach((value) => this._unmarkSelected(value));
839
+ const changed = this._hasQueuedChanges();
840
+ this._emitChangeEvent();
841
+ return changed;
842
+ }
843
+ /**
844
+ * Toggles a value between selected and deselected.
845
+ * @param value The value to toggle
846
+ * @return Whether the selection changed as a result of this call
847
+ */
848
+ toggle(value) {
849
+ return this.isSelected(value) ? this.deselect(value) : this.select(value);
850
+ }
851
+ /**
852
+ * Clears all of the selected values.
853
+ * @param flushEvent Whether to flush the changes in an event.
854
+ * If false, the changes to the selection will be flushed along with the next event.
855
+ * @return Whether the selection changed as a result of this call
856
+ */
857
+ clear(flushEvent = true) {
858
+ this._unmarkAll();
859
+ const changed = this._hasQueuedChanges();
860
+ if (flushEvent) {
861
+ this._emitChangeEvent();
862
+ }
863
+ return changed;
864
+ }
865
+ /**
866
+ * Determines whether a value is selected.
867
+ */
868
+ isSelected(value) {
869
+ return this._selection.has(this._getConcreteValue(value));
870
+ }
871
+ /**
872
+ * Determines whether the model does not have a value.
873
+ */
874
+ isEmpty() {
875
+ return this._selection.size === 0;
876
+ }
877
+ /**
878
+ * Determines whether the model has a value.
879
+ */
880
+ hasValue() {
881
+ return !this.isEmpty();
882
+ }
883
+ /**
884
+ * Sorts the selected values based on a predicate function.
885
+ */
886
+ sort(predicate) {
887
+ if (this._multiple && this.selected) {
888
+ this._selected.sort(predicate);
889
+ }
890
+ }
891
+ /**
892
+ * Gets whether multiple values can be selected.
893
+ */
894
+ isMultipleSelection() {
895
+ return this._multiple;
896
+ }
897
+ /** Emits a change event and clears the records of selected and deselected values. */
898
+ _emitChangeEvent() {
899
+ this._selected = null;
900
+ if (this._selectedToEmit.length || this._deselectedToEmit.length) {
901
+ this.changed.next({
902
+ source: this,
903
+ added: this._selectedToEmit,
904
+ removed: this._deselectedToEmit
905
+ });
906
+ this._deselectedToEmit = [];
907
+ this._selectedToEmit = [];
908
+ }
909
+ }
910
+ /** Selects a value. */
911
+ _markSelected(value) {
912
+ value = this._getConcreteValue(value);
913
+ if (!this.isSelected(value)) {
914
+ if (!this._multiple) {
915
+ this._unmarkAll();
916
+ }
917
+ if (!this.isSelected(value)) {
918
+ this._selection.add(value);
919
+ }
920
+ if (this._emitChanges) {
921
+ this._selectedToEmit.push(value);
922
+ }
923
+ }
924
+ }
925
+ /** Deselects a value. */
926
+ _unmarkSelected(value) {
927
+ value = this._getConcreteValue(value);
928
+ if (this.isSelected(value)) {
929
+ this._selection.delete(value);
930
+ if (this._emitChanges) {
931
+ this._deselectedToEmit.push(value);
932
+ }
933
+ }
934
+ }
935
+ /** Clears out the selected values. */
936
+ _unmarkAll() {
937
+ if (!this.isEmpty()) {
938
+ this._selection.forEach((value) => this._unmarkSelected(value));
939
+ }
940
+ }
941
+ /**
942
+ * Verifies the value assignment and throws an error if the specified value array is
943
+ * including multiple values while the selection model is not supporting multiple values.
944
+ */
945
+ _verifyValueAssignment(values) {
946
+ if (values.length > 1 && !this._multiple && (typeof ngDevMode === "undefined" || ngDevMode)) {
947
+ throw getMultipleValuesInSingleSelectionError();
948
+ }
949
+ }
950
+ /** Whether there are queued up change to be emitted. */
951
+ _hasQueuedChanges() {
952
+ return !!(this._deselectedToEmit.length || this._selectedToEmit.length);
953
+ }
954
+ /** Returns a value that is comparable to inputValue by applying compareWith function, returns the same inputValue otherwise. */
955
+ _getConcreteValue(inputValue, selection) {
956
+ if (!this.compareWith) {
957
+ return inputValue;
958
+ } else {
959
+ selection = selection ?? this._selection;
960
+ for (let selectedValue of selection) {
961
+ if (this.compareWith(inputValue, selectedValue)) {
962
+ return selectedValue;
963
+ }
964
+ }
965
+ return inputValue;
966
+ }
967
+ }
968
+ };
969
+ function getMultipleValuesInSingleSelectionError() {
970
+ return Error("Cannot pass multiple values into SelectionModel with single-value mode.");
971
+ }
972
+
973
+ // node_modules/@angular/material/fesm2022/pseudo-checkbox-module-BymSaWBn.mjs
974
+ var MatPseudoCheckboxModule = class _MatPseudoCheckboxModule {
975
+ static \u0275fac = function MatPseudoCheckboxModule_Factory(__ngFactoryType__) {
976
+ return new (__ngFactoryType__ || _MatPseudoCheckboxModule)();
977
+ };
978
+ static \u0275mod = /* @__PURE__ */ \u0275\u0275defineNgModule({
979
+ type: _MatPseudoCheckboxModule,
980
+ imports: [MatCommonModule, MatPseudoCheckbox],
981
+ exports: [MatPseudoCheckbox]
982
+ });
983
+ static \u0275inj = /* @__PURE__ */ \u0275\u0275defineInjector({
984
+ imports: [MatCommonModule]
985
+ });
986
+ };
987
+ (() => {
988
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatPseudoCheckboxModule, [{
989
+ type: NgModule,
990
+ args: [{
991
+ imports: [MatCommonModule, MatPseudoCheckbox],
992
+ exports: [MatPseudoCheckbox]
993
+ }]
994
+ }], null, null);
995
+ })();
996
+
997
+ // node_modules/@angular/material/fesm2022/index-ZUoC96yG.mjs
998
+ var MatOptionModule = class _MatOptionModule {
999
+ static \u0275fac = function MatOptionModule_Factory(__ngFactoryType__) {
1000
+ return new (__ngFactoryType__ || _MatOptionModule)();
1001
+ };
1002
+ static \u0275mod = /* @__PURE__ */ \u0275\u0275defineNgModule({
1003
+ type: _MatOptionModule,
1004
+ imports: [MatRippleModule, MatCommonModule, MatPseudoCheckboxModule, MatOption, MatOptgroup],
1005
+ exports: [MatOption, MatOptgroup]
1006
+ });
1007
+ static \u0275inj = /* @__PURE__ */ \u0275\u0275defineInjector({
1008
+ imports: [MatRippleModule, MatCommonModule, MatPseudoCheckboxModule, MatOption]
1009
+ });
1010
+ };
1011
+ (() => {
1012
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatOptionModule, [{
1013
+ type: NgModule,
1014
+ args: [{
1015
+ imports: [MatRippleModule, MatCommonModule, MatPseudoCheckboxModule, MatOption, MatOptgroup],
1016
+ exports: [MatOption, MatOptgroup]
1017
+ }]
1018
+ }], null, null);
1019
+ })();
1020
+
1021
+ // node_modules/@angular/material/fesm2022/module-CZcVPeGQ.mjs
1022
+ var _c02 = ["trigger"];
1023
+ var _c12 = ["panel"];
1024
+ var _c22 = [[["mat-select-trigger"]], "*"];
1025
+ var _c32 = ["mat-select-trigger", "*"];
1026
+ function MatSelect_Conditional_4_Template(rf, ctx) {
1027
+ if (rf & 1) {
1028
+ \u0275\u0275elementStart(0, "span", 4);
1029
+ \u0275\u0275text(1);
1030
+ \u0275\u0275elementEnd();
1031
+ }
1032
+ if (rf & 2) {
1033
+ const ctx_r1 = \u0275\u0275nextContext();
1034
+ \u0275\u0275advance();
1035
+ \u0275\u0275textInterpolate(ctx_r1.placeholder);
1036
+ }
1037
+ }
1038
+ function MatSelect_Conditional_5_Conditional_1_Template(rf, ctx) {
1039
+ if (rf & 1) {
1040
+ \u0275\u0275projection(0);
1041
+ }
1042
+ }
1043
+ function MatSelect_Conditional_5_Conditional_2_Template(rf, ctx) {
1044
+ if (rf & 1) {
1045
+ \u0275\u0275elementStart(0, "span", 11);
1046
+ \u0275\u0275text(1);
1047
+ \u0275\u0275elementEnd();
1048
+ }
1049
+ if (rf & 2) {
1050
+ const ctx_r1 = \u0275\u0275nextContext(2);
1051
+ \u0275\u0275advance();
1052
+ \u0275\u0275textInterpolate(ctx_r1.triggerValue);
1053
+ }
1054
+ }
1055
+ function MatSelect_Conditional_5_Template(rf, ctx) {
1056
+ if (rf & 1) {
1057
+ \u0275\u0275elementStart(0, "span", 5);
1058
+ \u0275\u0275conditionalCreate(1, MatSelect_Conditional_5_Conditional_1_Template, 1, 0)(2, MatSelect_Conditional_5_Conditional_2_Template, 2, 1, "span", 11);
1059
+ \u0275\u0275elementEnd();
1060
+ }
1061
+ if (rf & 2) {
1062
+ const ctx_r1 = \u0275\u0275nextContext();
1063
+ \u0275\u0275advance();
1064
+ \u0275\u0275conditional(ctx_r1.customTrigger ? 1 : 2);
1065
+ }
1066
+ }
1067
+ function MatSelect_ng_template_10_Template(rf, ctx) {
1068
+ if (rf & 1) {
1069
+ const _r3 = \u0275\u0275getCurrentView();
1070
+ \u0275\u0275elementStart(0, "div", 12, 1);
1071
+ \u0275\u0275listener("keydown", function MatSelect_ng_template_10_Template_div_keydown_0_listener($event) {
1072
+ \u0275\u0275restoreView(_r3);
1073
+ const ctx_r1 = \u0275\u0275nextContext();
1074
+ return \u0275\u0275resetView(ctx_r1._handleKeydown($event));
1075
+ });
1076
+ \u0275\u0275projection(2, 1);
1077
+ \u0275\u0275elementEnd();
1078
+ }
1079
+ if (rf & 2) {
1080
+ const ctx_r1 = \u0275\u0275nextContext();
1081
+ \u0275\u0275classMap(\u0275\u0275interpolate1("mat-mdc-select-panel mdc-menu-surface mdc-menu-surface--open ", ctx_r1._getPanelTheme()));
1082
+ \u0275\u0275classProp("mat-select-panel-animations-enabled", !ctx_r1._animationsDisabled);
1083
+ \u0275\u0275property("ngClass", ctx_r1.panelClass);
1084
+ \u0275\u0275attribute("id", ctx_r1.id + "-panel")("aria-multiselectable", ctx_r1.multiple)("aria-label", ctx_r1.ariaLabel || null)("aria-labelledby", ctx_r1._getPanelAriaLabelledby());
1085
+ }
1086
+ }
1087
+ function getMatSelectDynamicMultipleError() {
1088
+ return Error("Cannot change `multiple` mode of select after initialization.");
1089
+ }
1090
+ function getMatSelectNonArrayValueError() {
1091
+ return Error("Value must be an array in multiple-selection mode.");
1092
+ }
1093
+ function getMatSelectNonFunctionValueError() {
1094
+ return Error("`compareWith` must be a function.");
1095
+ }
1096
+ var MAT_SELECT_SCROLL_STRATEGY = new InjectionToken("mat-select-scroll-strategy", {
1097
+ providedIn: "root",
1098
+ factory: () => {
1099
+ const injector = inject(Injector);
1100
+ return () => createRepositionScrollStrategy(injector);
1101
+ }
1102
+ });
1103
+ function MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY(_overlay) {
1104
+ const injector = inject(Injector);
1105
+ return () => createRepositionScrollStrategy(injector);
1106
+ }
1107
+ var MAT_SELECT_CONFIG = new InjectionToken("MAT_SELECT_CONFIG");
1108
+ var MAT_SELECT_SCROLL_STRATEGY_PROVIDER = {
1109
+ provide: MAT_SELECT_SCROLL_STRATEGY,
1110
+ deps: [],
1111
+ useFactory: MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY
1112
+ };
1113
+ var MAT_SELECT_TRIGGER = new InjectionToken("MatSelectTrigger");
1114
+ var MatSelectChange = class {
1115
+ source;
1116
+ value;
1117
+ constructor(source, value) {
1118
+ this.source = source;
1119
+ this.value = value;
1120
+ }
1121
+ };
1122
+ var MatSelect = class _MatSelect {
1123
+ _viewportRuler = inject(ViewportRuler);
1124
+ _changeDetectorRef = inject(ChangeDetectorRef);
1125
+ _elementRef = inject(ElementRef);
1126
+ _dir = inject(Directionality, {
1127
+ optional: true
1128
+ });
1129
+ _idGenerator = inject(_IdGenerator);
1130
+ _renderer = inject(Renderer2);
1131
+ _parentFormField = inject(MAT_FORM_FIELD, {
1132
+ optional: true
1133
+ });
1134
+ ngControl = inject(NgControl, {
1135
+ self: true,
1136
+ optional: true
1137
+ });
1138
+ _liveAnnouncer = inject(LiveAnnouncer);
1139
+ _defaultOptions = inject(MAT_SELECT_CONFIG, {
1140
+ optional: true
1141
+ });
1142
+ _animationsDisabled = _animationsDisabled();
1143
+ _initialized = new Subject();
1144
+ _cleanupDetach;
1145
+ /** All of the defined select options. */
1146
+ options;
1147
+ // TODO(crisbeto): this is only necessary for the non-MDC select, but it's technically a
1148
+ // public API so we have to keep it. It should be deprecated and removed eventually.
1149
+ /** All of the defined groups of options. */
1150
+ optionGroups;
1151
+ /** User-supplied override of the trigger element. */
1152
+ customTrigger;
1153
+ /**
1154
+ * This position config ensures that the top "start" corner of the overlay
1155
+ * is aligned with with the top "start" of the origin by default (overlapping
1156
+ * the trigger completely). If the panel cannot fit below the trigger, it
1157
+ * will fall back to a position above the trigger.
1158
+ */
1159
+ _positions = [{
1160
+ originX: "start",
1161
+ originY: "bottom",
1162
+ overlayX: "start",
1163
+ overlayY: "top"
1164
+ }, {
1165
+ originX: "end",
1166
+ originY: "bottom",
1167
+ overlayX: "end",
1168
+ overlayY: "top"
1169
+ }, {
1170
+ originX: "start",
1171
+ originY: "top",
1172
+ overlayX: "start",
1173
+ overlayY: "bottom",
1174
+ panelClass: "mat-mdc-select-panel-above"
1175
+ }, {
1176
+ originX: "end",
1177
+ originY: "top",
1178
+ overlayX: "end",
1179
+ overlayY: "bottom",
1180
+ panelClass: "mat-mdc-select-panel-above"
1181
+ }];
1182
+ /** Scrolls a particular option into the view. */
1183
+ _scrollOptionIntoView(index) {
1184
+ const option = this.options.toArray()[index];
1185
+ if (option) {
1186
+ const panel = this.panel.nativeElement;
1187
+ const labelCount = _countGroupLabelsBeforeOption(index, this.options, this.optionGroups);
1188
+ const element = option._getHostElement();
1189
+ if (index === 0 && labelCount === 1) {
1190
+ panel.scrollTop = 0;
1191
+ } else {
1192
+ panel.scrollTop = _getOptionScrollPosition(element.offsetTop, element.offsetHeight, panel.scrollTop, panel.offsetHeight);
1193
+ }
1194
+ }
1195
+ }
1196
+ /** Called when the panel has been opened and the overlay has settled on its final position. */
1197
+ _positioningSettled() {
1198
+ this._scrollOptionIntoView(this._keyManager.activeItemIndex || 0);
1199
+ }
1200
+ /** Creates a change event object that should be emitted by the select. */
1201
+ _getChangeEvent(value) {
1202
+ return new MatSelectChange(this, value);
1203
+ }
1204
+ /** Factory function used to create a scroll strategy for this select. */
1205
+ _scrollStrategyFactory = inject(MAT_SELECT_SCROLL_STRATEGY);
1206
+ /** Whether or not the overlay panel is open. */
1207
+ _panelOpen = false;
1208
+ /** Comparison function to specify which option is displayed. Defaults to object equality. */
1209
+ _compareWith = (o1, o2) => o1 === o2;
1210
+ /** Unique id for this input. */
1211
+ _uid = this._idGenerator.getId("mat-select-");
1212
+ /** Current `aria-labelledby` value for the select trigger. */
1213
+ _triggerAriaLabelledBy = null;
1214
+ /**
1215
+ * Keeps track of the previous form control assigned to the select.
1216
+ * Used to detect if it has changed.
1217
+ */
1218
+ _previousControl;
1219
+ /** Emits whenever the component is destroyed. */
1220
+ _destroy = new Subject();
1221
+ /** Tracks the error state of the select. */
1222
+ _errorStateTracker;
1223
+ /**
1224
+ * Emits whenever the component state changes and should cause the parent
1225
+ * form-field to update. Implemented as part of `MatFormFieldControl`.
1226
+ * @docs-private
1227
+ */
1228
+ stateChanges = new Subject();
1229
+ /**
1230
+ * Disable the automatic labeling to avoid issues like #27241.
1231
+ * @docs-private
1232
+ */
1233
+ disableAutomaticLabeling = true;
1234
+ /**
1235
+ * Implemented as part of MatFormFieldControl.
1236
+ * @docs-private
1237
+ */
1238
+ userAriaDescribedBy;
1239
+ /** Deals with the selection logic. */
1240
+ _selectionModel;
1241
+ /** Manages keyboard events for options in the panel. */
1242
+ _keyManager;
1243
+ /** Ideal origin for the overlay panel. */
1244
+ _preferredOverlayOrigin;
1245
+ /** Width of the overlay panel. */
1246
+ _overlayWidth;
1247
+ /** `View -> model callback called when value changes` */
1248
+ _onChange = () => {
1249
+ };
1250
+ /** `View -> model callback called when select has been touched` */
1251
+ _onTouched = () => {
1252
+ };
1253
+ /** ID for the DOM node containing the select's value. */
1254
+ _valueId = this._idGenerator.getId("mat-select-value-");
1255
+ /** Strategy that will be used to handle scrolling while the select panel is open. */
1256
+ _scrollStrategy;
1257
+ _overlayPanelClass = this._defaultOptions?.overlayPanelClass || "";
1258
+ /** Whether the select is focused. */
1259
+ get focused() {
1260
+ return this._focused || this._panelOpen;
1261
+ }
1262
+ _focused = false;
1263
+ /** A name for this control that can be used by `mat-form-field`. */
1264
+ controlType = "mat-select";
1265
+ /** Trigger that opens the select. */
1266
+ trigger;
1267
+ /** Panel containing the select options. */
1268
+ panel;
1269
+ /** Overlay pane containing the options. */
1270
+ _overlayDir;
1271
+ /** Classes to be passed to the select panel. Supports the same syntax as `ngClass`. */
1272
+ panelClass;
1273
+ /** Whether the select is disabled. */
1274
+ disabled = false;
1275
+ /** Whether ripples in the select are disabled. */
1276
+ get disableRipple() {
1277
+ return this._disableRipple();
1278
+ }
1279
+ set disableRipple(value) {
1280
+ this._disableRipple.set(value);
1281
+ }
1282
+ _disableRipple = signal(false);
1283
+ /** Tab index of the select. */
1284
+ tabIndex = 0;
1285
+ /** Whether checkmark indicator for single-selection options is hidden. */
1286
+ get hideSingleSelectionIndicator() {
1287
+ return this._hideSingleSelectionIndicator;
1288
+ }
1289
+ set hideSingleSelectionIndicator(value) {
1290
+ this._hideSingleSelectionIndicator = value;
1291
+ this._syncParentProperties();
1292
+ }
1293
+ _hideSingleSelectionIndicator = this._defaultOptions?.hideSingleSelectionIndicator ?? false;
1294
+ /** Placeholder to be shown if no value has been selected. */
1295
+ get placeholder() {
1296
+ return this._placeholder;
1297
+ }
1298
+ set placeholder(value) {
1299
+ this._placeholder = value;
1300
+ this.stateChanges.next();
1301
+ }
1302
+ _placeholder;
1303
+ /** Whether the component is required. */
1304
+ get required() {
1305
+ return this._required ?? this.ngControl?.control?.hasValidator(Validators.required) ?? false;
1306
+ }
1307
+ set required(value) {
1308
+ this._required = value;
1309
+ this.stateChanges.next();
1310
+ }
1311
+ _required;
1312
+ /** Whether the user should be allowed to select multiple options. */
1313
+ get multiple() {
1314
+ return this._multiple;
1315
+ }
1316
+ set multiple(value) {
1317
+ if (this._selectionModel && (typeof ngDevMode === "undefined" || ngDevMode)) {
1318
+ throw getMatSelectDynamicMultipleError();
1319
+ }
1320
+ this._multiple = value;
1321
+ }
1322
+ _multiple = false;
1323
+ /** Whether to center the active option over the trigger. */
1324
+ disableOptionCentering = this._defaultOptions?.disableOptionCentering ?? false;
1325
+ /**
1326
+ * Function to compare the option values with the selected values. The first argument
1327
+ * is a value from an option. The second is a value from the selection. A boolean
1328
+ * should be returned.
1329
+ */
1330
+ get compareWith() {
1331
+ return this._compareWith;
1332
+ }
1333
+ set compareWith(fn) {
1334
+ if (typeof fn !== "function" && (typeof ngDevMode === "undefined" || ngDevMode)) {
1335
+ throw getMatSelectNonFunctionValueError();
1336
+ }
1337
+ this._compareWith = fn;
1338
+ if (this._selectionModel) {
1339
+ this._initializeSelection();
1340
+ }
1341
+ }
1342
+ /** Value of the select control. */
1343
+ get value() {
1344
+ return this._value;
1345
+ }
1346
+ set value(newValue) {
1347
+ const hasAssigned = this._assignValue(newValue);
1348
+ if (hasAssigned) {
1349
+ this._onChange(newValue);
1350
+ }
1351
+ }
1352
+ _value;
1353
+ /** Aria label of the select. */
1354
+ ariaLabel = "";
1355
+ /** Input that can be used to specify the `aria-labelledby` attribute. */
1356
+ ariaLabelledby;
1357
+ /** Object used to control when error messages are shown. */
1358
+ get errorStateMatcher() {
1359
+ return this._errorStateTracker.matcher;
1360
+ }
1361
+ set errorStateMatcher(value) {
1362
+ this._errorStateTracker.matcher = value;
1363
+ }
1364
+ /** Time to wait in milliseconds after the last keystroke before moving focus to an item. */
1365
+ typeaheadDebounceInterval;
1366
+ /**
1367
+ * Function used to sort the values in a select in multiple mode.
1368
+ * Follows the same logic as `Array.prototype.sort`.
1369
+ */
1370
+ sortComparator;
1371
+ /** Unique id of the element. */
1372
+ get id() {
1373
+ return this._id;
1374
+ }
1375
+ set id(value) {
1376
+ this._id = value || this._uid;
1377
+ this.stateChanges.next();
1378
+ }
1379
+ _id;
1380
+ /** Whether the select is in an error state. */
1381
+ get errorState() {
1382
+ return this._errorStateTracker.errorState;
1383
+ }
1384
+ set errorState(value) {
1385
+ this._errorStateTracker.errorState = value;
1386
+ }
1387
+ /**
1388
+ * Width of the panel. If set to `auto`, the panel will match the trigger width.
1389
+ * If set to null or an empty string, the panel will grow to match the longest option's text.
1390
+ */
1391
+ panelWidth = this._defaultOptions && typeof this._defaultOptions.panelWidth !== "undefined" ? this._defaultOptions.panelWidth : "auto";
1392
+ /**
1393
+ * By default selecting an option with a `null` or `undefined` value will reset the select's
1394
+ * value. Enable this option if the reset behavior doesn't match your requirements and instead
1395
+ * the nullable options should become selected. The value of this input can be controlled app-wide
1396
+ * using the `MAT_SELECT_CONFIG` injection token.
1397
+ */
1398
+ canSelectNullableOptions = this._defaultOptions?.canSelectNullableOptions ?? false;
1399
+ /** Combined stream of all of the child options' change events. */
1400
+ optionSelectionChanges = defer(() => {
1401
+ const options = this.options;
1402
+ if (options) {
1403
+ return options.changes.pipe(startWith(options), switchMap(() => merge(...options.map((option) => option.onSelectionChange))));
1404
+ }
1405
+ return this._initialized.pipe(switchMap(() => this.optionSelectionChanges));
1406
+ });
1407
+ /** Event emitted when the select panel has been toggled. */
1408
+ openedChange = new EventEmitter();
1409
+ /** Event emitted when the select has been opened. */
1410
+ _openedStream = this.openedChange.pipe(filter((o) => o), map(() => {
1411
+ }));
1412
+ /** Event emitted when the select has been closed. */
1413
+ _closedStream = this.openedChange.pipe(filter((o) => !o), map(() => {
1414
+ }));
1415
+ /** Event emitted when the selected value has been changed by the user. */
1416
+ selectionChange = new EventEmitter();
1417
+ /**
1418
+ * Event that emits whenever the raw value of the select changes. This is here primarily
1419
+ * to facilitate the two-way binding for the `value` input.
1420
+ * @docs-private
1421
+ */
1422
+ valueChange = new EventEmitter();
1423
+ constructor() {
1424
+ const defaultErrorStateMatcher = inject(ErrorStateMatcher);
1425
+ const parentForm = inject(NgForm, {
1426
+ optional: true
1427
+ });
1428
+ const parentFormGroup = inject(FormGroupDirective, {
1429
+ optional: true
1430
+ });
1431
+ const tabIndex = inject(new HostAttributeToken("tabindex"), {
1432
+ optional: true
1433
+ });
1434
+ if (this.ngControl) {
1435
+ this.ngControl.valueAccessor = this;
1436
+ }
1437
+ if (this._defaultOptions?.typeaheadDebounceInterval != null) {
1438
+ this.typeaheadDebounceInterval = this._defaultOptions.typeaheadDebounceInterval;
1439
+ }
1440
+ this._errorStateTracker = new _ErrorStateTracker(defaultErrorStateMatcher, this.ngControl, parentFormGroup, parentForm, this.stateChanges);
1441
+ this._scrollStrategy = this._scrollStrategyFactory();
1442
+ this.tabIndex = tabIndex == null ? 0 : parseInt(tabIndex) || 0;
1443
+ this.id = this.id;
1444
+ }
1445
+ ngOnInit() {
1446
+ this._selectionModel = new SelectionModel(this.multiple);
1447
+ this.stateChanges.next();
1448
+ this._viewportRuler.change().pipe(takeUntil(this._destroy)).subscribe(() => {
1449
+ if (this.panelOpen) {
1450
+ this._overlayWidth = this._getOverlayWidth(this._preferredOverlayOrigin);
1451
+ this._changeDetectorRef.detectChanges();
1452
+ }
1453
+ });
1454
+ }
1455
+ ngAfterContentInit() {
1456
+ this._initialized.next();
1457
+ this._initialized.complete();
1458
+ this._initKeyManager();
1459
+ this._selectionModel.changed.pipe(takeUntil(this._destroy)).subscribe((event) => {
1460
+ event.added.forEach((option) => option.select());
1461
+ event.removed.forEach((option) => option.deselect());
1462
+ });
1463
+ this.options.changes.pipe(startWith(null), takeUntil(this._destroy)).subscribe(() => {
1464
+ this._resetOptions();
1465
+ this._initializeSelection();
1466
+ });
1467
+ }
1468
+ ngDoCheck() {
1469
+ const newAriaLabelledby = this._getTriggerAriaLabelledby();
1470
+ const ngControl = this.ngControl;
1471
+ if (newAriaLabelledby !== this._triggerAriaLabelledBy) {
1472
+ const element = this._elementRef.nativeElement;
1473
+ this._triggerAriaLabelledBy = newAriaLabelledby;
1474
+ if (newAriaLabelledby) {
1475
+ element.setAttribute("aria-labelledby", newAriaLabelledby);
1476
+ } else {
1477
+ element.removeAttribute("aria-labelledby");
1478
+ }
1479
+ }
1480
+ if (ngControl) {
1481
+ if (this._previousControl !== ngControl.control) {
1482
+ if (this._previousControl !== void 0 && ngControl.disabled !== null && ngControl.disabled !== this.disabled) {
1483
+ this.disabled = ngControl.disabled;
1484
+ }
1485
+ this._previousControl = ngControl.control;
1486
+ }
1487
+ this.updateErrorState();
1488
+ }
1489
+ }
1490
+ ngOnChanges(changes) {
1491
+ if (changes["disabled"] || changes["userAriaDescribedBy"]) {
1492
+ this.stateChanges.next();
1493
+ }
1494
+ if (changes["typeaheadDebounceInterval"] && this._keyManager) {
1495
+ this._keyManager.withTypeAhead(this.typeaheadDebounceInterval);
1496
+ }
1497
+ }
1498
+ ngOnDestroy() {
1499
+ this._cleanupDetach?.();
1500
+ this._keyManager?.destroy();
1501
+ this._destroy.next();
1502
+ this._destroy.complete();
1503
+ this.stateChanges.complete();
1504
+ this._clearFromModal();
1505
+ }
1506
+ /** Toggles the overlay panel open or closed. */
1507
+ toggle() {
1508
+ this.panelOpen ? this.close() : this.open();
1509
+ }
1510
+ /** Opens the overlay panel. */
1511
+ open() {
1512
+ if (!this._canOpen()) {
1513
+ return;
1514
+ }
1515
+ if (this._parentFormField) {
1516
+ this._preferredOverlayOrigin = this._parentFormField.getConnectedOverlayOrigin();
1517
+ }
1518
+ this._cleanupDetach?.();
1519
+ this._overlayWidth = this._getOverlayWidth(this._preferredOverlayOrigin);
1520
+ this._applyModalPanelOwnership();
1521
+ this._panelOpen = true;
1522
+ this._overlayDir.positionChange.pipe(take(1)).subscribe(() => {
1523
+ this._changeDetectorRef.detectChanges();
1524
+ this._positioningSettled();
1525
+ });
1526
+ this._overlayDir.attachOverlay();
1527
+ this._keyManager.withHorizontalOrientation(null);
1528
+ this._highlightCorrectOption();
1529
+ this._changeDetectorRef.markForCheck();
1530
+ this.stateChanges.next();
1531
+ Promise.resolve().then(() => this.openedChange.emit(true));
1532
+ }
1533
+ /**
1534
+ * Track which modal we have modified the `aria-owns` attribute of. When the combobox trigger is
1535
+ * inside an aria-modal, we apply aria-owns to the parent modal with the `id` of the options
1536
+ * panel. Track the modal we have changed so we can undo the changes on destroy.
1537
+ */
1538
+ _trackedModal = null;
1539
+ /**
1540
+ * If the autocomplete trigger is inside of an `aria-modal` element, connect
1541
+ * that modal to the options panel with `aria-owns`.
1542
+ *
1543
+ * For some browser + screen reader combinations, when navigation is inside
1544
+ * of an `aria-modal` element, the screen reader treats everything outside
1545
+ * of that modal as hidden or invisible.
1546
+ *
1547
+ * This causes a problem when the combobox trigger is _inside_ of a modal, because the
1548
+ * options panel is rendered _outside_ of that modal, preventing screen reader navigation
1549
+ * from reaching the panel.
1550
+ *
1551
+ * We can work around this issue by applying `aria-owns` to the modal with the `id` of
1552
+ * the options panel. This effectively communicates to assistive technology that the
1553
+ * options panel is part of the same interaction as the modal.
1554
+ *
1555
+ * At time of this writing, this issue is present in VoiceOver.
1556
+ * See https://github.com/angular/components/issues/20694
1557
+ */
1558
+ _applyModalPanelOwnership() {
1559
+ const modal = this._elementRef.nativeElement.closest('body > .cdk-overlay-container [aria-modal="true"]');
1560
+ if (!modal) {
1561
+ return;
1562
+ }
1563
+ const panelId = `${this.id}-panel`;
1564
+ if (this._trackedModal) {
1565
+ removeAriaReferencedId(this._trackedModal, "aria-owns", panelId);
1566
+ }
1567
+ addAriaReferencedId(modal, "aria-owns", panelId);
1568
+ this._trackedModal = modal;
1569
+ }
1570
+ /** Clears the reference to the listbox overlay element from the modal it was added to. */
1571
+ _clearFromModal() {
1572
+ if (!this._trackedModal) {
1573
+ return;
1574
+ }
1575
+ const panelId = `${this.id}-panel`;
1576
+ removeAriaReferencedId(this._trackedModal, "aria-owns", panelId);
1577
+ this._trackedModal = null;
1578
+ }
1579
+ /** Closes the overlay panel and focuses the host element. */
1580
+ close() {
1581
+ if (this._panelOpen) {
1582
+ this._panelOpen = false;
1583
+ this._exitAndDetach();
1584
+ this._keyManager.withHorizontalOrientation(this._isRtl() ? "rtl" : "ltr");
1585
+ this._changeDetectorRef.markForCheck();
1586
+ this._onTouched();
1587
+ this.stateChanges.next();
1588
+ Promise.resolve().then(() => this.openedChange.emit(false));
1589
+ }
1590
+ }
1591
+ /** Triggers the exit animation and detaches the overlay at the end. */
1592
+ _exitAndDetach() {
1593
+ if (this._animationsDisabled || !this.panel) {
1594
+ this._detachOverlay();
1595
+ return;
1596
+ }
1597
+ this._cleanupDetach?.();
1598
+ this._cleanupDetach = () => {
1599
+ cleanupEvent();
1600
+ clearTimeout(exitFallbackTimer);
1601
+ this._cleanupDetach = void 0;
1602
+ };
1603
+ const panel = this.panel.nativeElement;
1604
+ const cleanupEvent = this._renderer.listen(panel, "animationend", (event) => {
1605
+ if (event.animationName === "_mat-select-exit") {
1606
+ this._cleanupDetach?.();
1607
+ this._detachOverlay();
1608
+ }
1609
+ });
1610
+ const exitFallbackTimer = setTimeout(() => {
1611
+ this._cleanupDetach?.();
1612
+ this._detachOverlay();
1613
+ }, 200);
1614
+ panel.classList.add("mat-select-panel-exit");
1615
+ }
1616
+ /** Detaches the current overlay directive. */
1617
+ _detachOverlay() {
1618
+ this._overlayDir.detachOverlay();
1619
+ this._changeDetectorRef.markForCheck();
1620
+ }
1621
+ /**
1622
+ * Sets the select's value. Part of the ControlValueAccessor interface
1623
+ * required to integrate with Angular's core forms API.
1624
+ *
1625
+ * @param value New value to be written to the model.
1626
+ */
1627
+ writeValue(value) {
1628
+ this._assignValue(value);
1629
+ }
1630
+ /**
1631
+ * Saves a callback function to be invoked when the select's value
1632
+ * changes from user input. Part of the ControlValueAccessor interface
1633
+ * required to integrate with Angular's core forms API.
1634
+ *
1635
+ * @param fn Callback to be triggered when the value changes.
1636
+ */
1637
+ registerOnChange(fn) {
1638
+ this._onChange = fn;
1639
+ }
1640
+ /**
1641
+ * Saves a callback function to be invoked when the select is blurred
1642
+ * by the user. Part of the ControlValueAccessor interface required
1643
+ * to integrate with Angular's core forms API.
1644
+ *
1645
+ * @param fn Callback to be triggered when the component has been touched.
1646
+ */
1647
+ registerOnTouched(fn) {
1648
+ this._onTouched = fn;
1649
+ }
1650
+ /**
1651
+ * Disables the select. Part of the ControlValueAccessor interface required
1652
+ * to integrate with Angular's core forms API.
1653
+ *
1654
+ * @param isDisabled Sets whether the component is disabled.
1655
+ */
1656
+ setDisabledState(isDisabled) {
1657
+ this.disabled = isDisabled;
1658
+ this._changeDetectorRef.markForCheck();
1659
+ this.stateChanges.next();
1660
+ }
1661
+ /** Whether or not the overlay panel is open. */
1662
+ get panelOpen() {
1663
+ return this._panelOpen;
1664
+ }
1665
+ /** The currently selected option. */
1666
+ get selected() {
1667
+ return this.multiple ? this._selectionModel?.selected || [] : this._selectionModel?.selected[0];
1668
+ }
1669
+ /** The value displayed in the trigger. */
1670
+ get triggerValue() {
1671
+ if (this.empty) {
1672
+ return "";
1673
+ }
1674
+ if (this._multiple) {
1675
+ const selectedOptions = this._selectionModel.selected.map((option) => option.viewValue);
1676
+ if (this._isRtl()) {
1677
+ selectedOptions.reverse();
1678
+ }
1679
+ return selectedOptions.join(", ");
1680
+ }
1681
+ return this._selectionModel.selected[0].viewValue;
1682
+ }
1683
+ /** Refreshes the error state of the select. */
1684
+ updateErrorState() {
1685
+ this._errorStateTracker.updateErrorState();
1686
+ }
1687
+ /** Whether the element is in RTL mode. */
1688
+ _isRtl() {
1689
+ return this._dir ? this._dir.value === "rtl" : false;
1690
+ }
1691
+ /** Handles all keydown events on the select. */
1692
+ _handleKeydown(event) {
1693
+ if (!this.disabled) {
1694
+ this.panelOpen ? this._handleOpenKeydown(event) : this._handleClosedKeydown(event);
1695
+ }
1696
+ }
1697
+ /** Handles keyboard events while the select is closed. */
1698
+ _handleClosedKeydown(event) {
1699
+ const keyCode = event.keyCode;
1700
+ const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW || keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW;
1701
+ const isOpenKey = keyCode === ENTER || keyCode === SPACE;
1702
+ const manager = this._keyManager;
1703
+ if (!manager.isTyping() && isOpenKey && !hasModifierKey(event) || (this.multiple || event.altKey) && isArrowKey) {
1704
+ event.preventDefault();
1705
+ this.open();
1706
+ } else if (!this.multiple) {
1707
+ const previouslySelectedOption = this.selected;
1708
+ manager.onKeydown(event);
1709
+ const selectedOption = this.selected;
1710
+ if (selectedOption && previouslySelectedOption !== selectedOption) {
1711
+ this._liveAnnouncer.announce(selectedOption.viewValue, 1e4);
1712
+ }
1713
+ }
1714
+ }
1715
+ /** Handles keyboard events when the selected is open. */
1716
+ _handleOpenKeydown(event) {
1717
+ const manager = this._keyManager;
1718
+ const keyCode = event.keyCode;
1719
+ const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;
1720
+ const isTyping = manager.isTyping();
1721
+ if (isArrowKey && event.altKey) {
1722
+ event.preventDefault();
1723
+ this.close();
1724
+ } else if (!isTyping && (keyCode === ENTER || keyCode === SPACE) && manager.activeItem && !hasModifierKey(event)) {
1725
+ event.preventDefault();
1726
+ manager.activeItem._selectViaInteraction();
1727
+ } else if (!isTyping && this._multiple && keyCode === A && event.ctrlKey) {
1728
+ event.preventDefault();
1729
+ const hasDeselectedOptions = this.options.some((opt) => !opt.disabled && !opt.selected);
1730
+ this.options.forEach((option) => {
1731
+ if (!option.disabled) {
1732
+ hasDeselectedOptions ? option.select() : option.deselect();
1733
+ }
1734
+ });
1735
+ } else {
1736
+ const previouslyFocusedIndex = manager.activeItemIndex;
1737
+ manager.onKeydown(event);
1738
+ if (this._multiple && isArrowKey && event.shiftKey && manager.activeItem && manager.activeItemIndex !== previouslyFocusedIndex) {
1739
+ manager.activeItem._selectViaInteraction();
1740
+ }
1741
+ }
1742
+ }
1743
+ /** Handles keyboard events coming from the overlay. */
1744
+ _handleOverlayKeydown(event) {
1745
+ if (event.keyCode === ESCAPE && !hasModifierKey(event)) {
1746
+ event.preventDefault();
1747
+ this.close();
1748
+ }
1749
+ }
1750
+ _onFocus() {
1751
+ if (!this.disabled) {
1752
+ this._focused = true;
1753
+ this.stateChanges.next();
1754
+ }
1755
+ }
1756
+ /**
1757
+ * Calls the touched callback only if the panel is closed. Otherwise, the trigger will
1758
+ * "blur" to the panel when it opens, causing a false positive.
1759
+ */
1760
+ _onBlur() {
1761
+ this._focused = false;
1762
+ this._keyManager?.cancelTypeahead();
1763
+ if (!this.disabled && !this.panelOpen) {
1764
+ this._onTouched();
1765
+ this._changeDetectorRef.markForCheck();
1766
+ this.stateChanges.next();
1767
+ }
1768
+ }
1769
+ /** Returns the theme to be used on the panel. */
1770
+ _getPanelTheme() {
1771
+ return this._parentFormField ? `mat-${this._parentFormField.color}` : "";
1772
+ }
1773
+ /** Whether the select has a value. */
1774
+ get empty() {
1775
+ return !this._selectionModel || this._selectionModel.isEmpty();
1776
+ }
1777
+ _initializeSelection() {
1778
+ Promise.resolve().then(() => {
1779
+ if (this.ngControl) {
1780
+ this._value = this.ngControl.value;
1781
+ }
1782
+ this._setSelectionByValue(this._value);
1783
+ this.stateChanges.next();
1784
+ });
1785
+ }
1786
+ /**
1787
+ * Sets the selected option based on a value. If no option can be
1788
+ * found with the designated value, the select trigger is cleared.
1789
+ */
1790
+ _setSelectionByValue(value) {
1791
+ this.options.forEach((option) => option.setInactiveStyles());
1792
+ this._selectionModel.clear();
1793
+ if (this.multiple && value) {
1794
+ if (!Array.isArray(value) && (typeof ngDevMode === "undefined" || ngDevMode)) {
1795
+ throw getMatSelectNonArrayValueError();
1796
+ }
1797
+ value.forEach((currentValue) => this._selectOptionByValue(currentValue));
1798
+ this._sortValues();
1799
+ } else {
1800
+ const correspondingOption = this._selectOptionByValue(value);
1801
+ if (correspondingOption) {
1802
+ this._keyManager.updateActiveItem(correspondingOption);
1803
+ } else if (!this.panelOpen) {
1804
+ this._keyManager.updateActiveItem(-1);
1805
+ }
1806
+ }
1807
+ this._changeDetectorRef.markForCheck();
1808
+ }
1809
+ /**
1810
+ * Finds and selects and option based on its value.
1811
+ * @returns Option that has the corresponding value.
1812
+ */
1813
+ _selectOptionByValue(value) {
1814
+ const correspondingOption = this.options.find((option) => {
1815
+ if (this._selectionModel.isSelected(option)) {
1816
+ return false;
1817
+ }
1818
+ try {
1819
+ return (option.value != null || this.canSelectNullableOptions) && this._compareWith(option.value, value);
1820
+ } catch (error) {
1821
+ if (typeof ngDevMode === "undefined" || ngDevMode) {
1822
+ console.warn(error);
1823
+ }
1824
+ return false;
1825
+ }
1826
+ });
1827
+ if (correspondingOption) {
1828
+ this._selectionModel.select(correspondingOption);
1829
+ }
1830
+ return correspondingOption;
1831
+ }
1832
+ /** Assigns a specific value to the select. Returns whether the value has changed. */
1833
+ _assignValue(newValue) {
1834
+ if (newValue !== this._value || this._multiple && Array.isArray(newValue)) {
1835
+ if (this.options) {
1836
+ this._setSelectionByValue(newValue);
1837
+ }
1838
+ this._value = newValue;
1839
+ return true;
1840
+ }
1841
+ return false;
1842
+ }
1843
+ // `skipPredicate` determines if key manager should avoid putting a given option in the tab
1844
+ // order. Allow disabled list items to receive focus via keyboard to align with WAI ARIA
1845
+ // recommendation.
1846
+ //
1847
+ // Normally WAI ARIA's instructions are to exclude disabled items from the tab order, but it
1848
+ // makes a few exceptions for compound widgets.
1849
+ //
1850
+ // From [Developing a Keyboard Interface](
1851
+ // https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/):
1852
+ // "For the following composite widget elements, keep them focusable when disabled: Options in a
1853
+ // Listbox..."
1854
+ //
1855
+ // The user can focus disabled options using the keyboard, but the user cannot click disabled
1856
+ // options.
1857
+ _skipPredicate = (option) => {
1858
+ if (this.panelOpen) {
1859
+ return false;
1860
+ }
1861
+ return option.disabled;
1862
+ };
1863
+ /** Gets how wide the overlay panel should be. */
1864
+ _getOverlayWidth(preferredOrigin) {
1865
+ if (this.panelWidth === "auto") {
1866
+ const refToMeasure = preferredOrigin instanceof CdkOverlayOrigin ? preferredOrigin.elementRef : preferredOrigin || this._elementRef;
1867
+ return refToMeasure.nativeElement.getBoundingClientRect().width;
1868
+ }
1869
+ return this.panelWidth === null ? "" : this.panelWidth;
1870
+ }
1871
+ /** Syncs the parent state with the individual options. */
1872
+ _syncParentProperties() {
1873
+ if (this.options) {
1874
+ for (const option of this.options) {
1875
+ option._changeDetectorRef.markForCheck();
1876
+ }
1877
+ }
1878
+ }
1879
+ /** Sets up a key manager to listen to keyboard events on the overlay panel. */
1880
+ _initKeyManager() {
1881
+ this._keyManager = new ActiveDescendantKeyManager(this.options).withTypeAhead(this.typeaheadDebounceInterval).withVerticalOrientation().withHorizontalOrientation(this._isRtl() ? "rtl" : "ltr").withHomeAndEnd().withPageUpDown().withAllowedModifierKeys(["shiftKey"]).skipPredicate(this._skipPredicate);
1882
+ this._keyManager.tabOut.subscribe(() => {
1883
+ if (this.panelOpen) {
1884
+ if (!this.multiple && this._keyManager.activeItem) {
1885
+ this._keyManager.activeItem._selectViaInteraction();
1886
+ }
1887
+ this.focus();
1888
+ this.close();
1889
+ }
1890
+ });
1891
+ this._keyManager.change.subscribe(() => {
1892
+ if (this._panelOpen && this.panel) {
1893
+ this._scrollOptionIntoView(this._keyManager.activeItemIndex || 0);
1894
+ } else if (!this._panelOpen && !this.multiple && this._keyManager.activeItem) {
1895
+ this._keyManager.activeItem._selectViaInteraction();
1896
+ }
1897
+ });
1898
+ }
1899
+ /** Drops current option subscriptions and IDs and resets from scratch. */
1900
+ _resetOptions() {
1901
+ const changedOrDestroyed = merge(this.options.changes, this._destroy);
1902
+ this.optionSelectionChanges.pipe(takeUntil(changedOrDestroyed)).subscribe((event) => {
1903
+ this._onSelect(event.source, event.isUserInput);
1904
+ if (event.isUserInput && !this.multiple && this._panelOpen) {
1905
+ this.close();
1906
+ this.focus();
1907
+ }
1908
+ });
1909
+ merge(...this.options.map((option) => option._stateChanges)).pipe(takeUntil(changedOrDestroyed)).subscribe(() => {
1910
+ this._changeDetectorRef.detectChanges();
1911
+ this.stateChanges.next();
1912
+ });
1913
+ }
1914
+ /** Invoked when an option is clicked. */
1915
+ _onSelect(option, isUserInput) {
1916
+ const wasSelected = this._selectionModel.isSelected(option);
1917
+ if (!this.canSelectNullableOptions && option.value == null && !this._multiple) {
1918
+ option.deselect();
1919
+ this._selectionModel.clear();
1920
+ if (this.value != null) {
1921
+ this._propagateChanges(option.value);
1922
+ }
1923
+ } else {
1924
+ if (wasSelected !== option.selected) {
1925
+ option.selected ? this._selectionModel.select(option) : this._selectionModel.deselect(option);
1926
+ }
1927
+ if (isUserInput) {
1928
+ this._keyManager.setActiveItem(option);
1929
+ }
1930
+ if (this.multiple) {
1931
+ this._sortValues();
1932
+ if (isUserInput) {
1933
+ this.focus();
1934
+ }
1935
+ }
1936
+ }
1937
+ if (wasSelected !== this._selectionModel.isSelected(option)) {
1938
+ this._propagateChanges();
1939
+ }
1940
+ this.stateChanges.next();
1941
+ }
1942
+ /** Sorts the selected values in the selected based on their order in the panel. */
1943
+ _sortValues() {
1944
+ if (this.multiple) {
1945
+ const options = this.options.toArray();
1946
+ this._selectionModel.sort((a, b) => {
1947
+ return this.sortComparator ? this.sortComparator(a, b, options) : options.indexOf(a) - options.indexOf(b);
1948
+ });
1949
+ this.stateChanges.next();
1950
+ }
1951
+ }
1952
+ /** Emits change event to set the model value. */
1953
+ _propagateChanges(fallbackValue) {
1954
+ let valueToEmit;
1955
+ if (this.multiple) {
1956
+ valueToEmit = this.selected.map((option) => option.value);
1957
+ } else {
1958
+ valueToEmit = this.selected ? this.selected.value : fallbackValue;
1959
+ }
1960
+ this._value = valueToEmit;
1961
+ this.valueChange.emit(valueToEmit);
1962
+ this._onChange(valueToEmit);
1963
+ this.selectionChange.emit(this._getChangeEvent(valueToEmit));
1964
+ this._changeDetectorRef.markForCheck();
1965
+ }
1966
+ /**
1967
+ * Highlights the selected item. If no option is selected, it will highlight
1968
+ * the first *enabled* option.
1969
+ */
1970
+ _highlightCorrectOption() {
1971
+ if (this._keyManager) {
1972
+ if (this.empty) {
1973
+ let firstEnabledOptionIndex = -1;
1974
+ for (let index = 0; index < this.options.length; index++) {
1975
+ const option = this.options.get(index);
1976
+ if (!option.disabled) {
1977
+ firstEnabledOptionIndex = index;
1978
+ break;
1979
+ }
1980
+ }
1981
+ this._keyManager.setActiveItem(firstEnabledOptionIndex);
1982
+ } else {
1983
+ this._keyManager.setActiveItem(this._selectionModel.selected[0]);
1984
+ }
1985
+ }
1986
+ }
1987
+ /** Whether the panel is allowed to open. */
1988
+ _canOpen() {
1989
+ return !this._panelOpen && !this.disabled && this.options?.length > 0 && !!this._overlayDir;
1990
+ }
1991
+ /** Focuses the select element. */
1992
+ focus(options) {
1993
+ this._elementRef.nativeElement.focus(options);
1994
+ }
1995
+ /** Gets the aria-labelledby for the select panel. */
1996
+ _getPanelAriaLabelledby() {
1997
+ if (this.ariaLabel) {
1998
+ return null;
1999
+ }
2000
+ const labelId = this._parentFormField?.getLabelId() || null;
2001
+ const labelExpression = labelId ? labelId + " " : "";
2002
+ return this.ariaLabelledby ? labelExpression + this.ariaLabelledby : labelId;
2003
+ }
2004
+ /** Determines the `aria-activedescendant` to be set on the host. */
2005
+ _getAriaActiveDescendant() {
2006
+ if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {
2007
+ return this._keyManager.activeItem.id;
2008
+ }
2009
+ return null;
2010
+ }
2011
+ /** Gets the aria-labelledby of the select component trigger. */
2012
+ _getTriggerAriaLabelledby() {
2013
+ if (this.ariaLabel) {
2014
+ return null;
2015
+ }
2016
+ let value = this._parentFormField?.getLabelId() || "";
2017
+ if (this.ariaLabelledby) {
2018
+ value += " " + this.ariaLabelledby;
2019
+ }
2020
+ if (!value) {
2021
+ value = this._valueId;
2022
+ }
2023
+ return value;
2024
+ }
2025
+ /**
2026
+ * Implemented as part of MatFormFieldControl.
2027
+ * @docs-private
2028
+ */
2029
+ get describedByIds() {
2030
+ const element = this._elementRef.nativeElement;
2031
+ const existingDescribedBy = element.getAttribute("aria-describedby");
2032
+ return existingDescribedBy?.split(" ") || [];
2033
+ }
2034
+ /**
2035
+ * Implemented as part of MatFormFieldControl.
2036
+ * @docs-private
2037
+ */
2038
+ setDescribedByIds(ids) {
2039
+ if (ids.length) {
2040
+ this._elementRef.nativeElement.setAttribute("aria-describedby", ids.join(" "));
2041
+ } else {
2042
+ this._elementRef.nativeElement.removeAttribute("aria-describedby");
2043
+ }
2044
+ }
2045
+ /**
2046
+ * Implemented as part of MatFormFieldControl.
2047
+ * @docs-private
2048
+ */
2049
+ onContainerClick() {
2050
+ this.focus();
2051
+ this.open();
2052
+ }
2053
+ /**
2054
+ * Implemented as part of MatFormFieldControl.
2055
+ * @docs-private
2056
+ */
2057
+ get shouldLabelFloat() {
2058
+ return this.panelOpen || !this.empty || this.focused && !!this.placeholder;
2059
+ }
2060
+ static \u0275fac = function MatSelect_Factory(__ngFactoryType__) {
2061
+ return new (__ngFactoryType__ || _MatSelect)();
2062
+ };
2063
+ static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({
2064
+ type: _MatSelect,
2065
+ selectors: [["mat-select"]],
2066
+ contentQueries: function MatSelect_ContentQueries(rf, ctx, dirIndex) {
2067
+ if (rf & 1) {
2068
+ \u0275\u0275contentQuery(dirIndex, MAT_SELECT_TRIGGER, 5);
2069
+ \u0275\u0275contentQuery(dirIndex, MatOption, 5);
2070
+ \u0275\u0275contentQuery(dirIndex, MAT_OPTGROUP, 5);
2071
+ }
2072
+ if (rf & 2) {
2073
+ let _t;
2074
+ \u0275\u0275queryRefresh(_t = \u0275\u0275loadQuery()) && (ctx.customTrigger = _t.first);
2075
+ \u0275\u0275queryRefresh(_t = \u0275\u0275loadQuery()) && (ctx.options = _t);
2076
+ \u0275\u0275queryRefresh(_t = \u0275\u0275loadQuery()) && (ctx.optionGroups = _t);
2077
+ }
2078
+ },
2079
+ viewQuery: function MatSelect_Query(rf, ctx) {
2080
+ if (rf & 1) {
2081
+ \u0275\u0275viewQuery(_c02, 5);
2082
+ \u0275\u0275viewQuery(_c12, 5);
2083
+ \u0275\u0275viewQuery(CdkConnectedOverlay, 5);
2084
+ }
2085
+ if (rf & 2) {
2086
+ let _t;
2087
+ \u0275\u0275queryRefresh(_t = \u0275\u0275loadQuery()) && (ctx.trigger = _t.first);
2088
+ \u0275\u0275queryRefresh(_t = \u0275\u0275loadQuery()) && (ctx.panel = _t.first);
2089
+ \u0275\u0275queryRefresh(_t = \u0275\u0275loadQuery()) && (ctx._overlayDir = _t.first);
2090
+ }
2091
+ },
2092
+ hostAttrs: ["role", "combobox", "aria-haspopup", "listbox", 1, "mat-mdc-select"],
2093
+ hostVars: 19,
2094
+ hostBindings: function MatSelect_HostBindings(rf, ctx) {
2095
+ if (rf & 1) {
2096
+ \u0275\u0275listener("keydown", function MatSelect_keydown_HostBindingHandler($event) {
2097
+ return ctx._handleKeydown($event);
2098
+ })("focus", function MatSelect_focus_HostBindingHandler() {
2099
+ return ctx._onFocus();
2100
+ })("blur", function MatSelect_blur_HostBindingHandler() {
2101
+ return ctx._onBlur();
2102
+ });
2103
+ }
2104
+ if (rf & 2) {
2105
+ \u0275\u0275attribute("id", ctx.id)("tabindex", ctx.disabled ? -1 : ctx.tabIndex)("aria-controls", ctx.panelOpen ? ctx.id + "-panel" : null)("aria-expanded", ctx.panelOpen)("aria-label", ctx.ariaLabel || null)("aria-required", ctx.required.toString())("aria-disabled", ctx.disabled.toString())("aria-invalid", ctx.errorState)("aria-activedescendant", ctx._getAriaActiveDescendant());
2106
+ \u0275\u0275classProp("mat-mdc-select-disabled", ctx.disabled)("mat-mdc-select-invalid", ctx.errorState)("mat-mdc-select-required", ctx.required)("mat-mdc-select-empty", ctx.empty)("mat-mdc-select-multiple", ctx.multiple);
2107
+ }
2108
+ },
2109
+ inputs: {
2110
+ userAriaDescribedBy: [0, "aria-describedby", "userAriaDescribedBy"],
2111
+ panelClass: "panelClass",
2112
+ disabled: [2, "disabled", "disabled", booleanAttribute],
2113
+ disableRipple: [2, "disableRipple", "disableRipple", booleanAttribute],
2114
+ tabIndex: [2, "tabIndex", "tabIndex", (value) => value == null ? 0 : numberAttribute(value)],
2115
+ hideSingleSelectionIndicator: [2, "hideSingleSelectionIndicator", "hideSingleSelectionIndicator", booleanAttribute],
2116
+ placeholder: "placeholder",
2117
+ required: [2, "required", "required", booleanAttribute],
2118
+ multiple: [2, "multiple", "multiple", booleanAttribute],
2119
+ disableOptionCentering: [2, "disableOptionCentering", "disableOptionCentering", booleanAttribute],
2120
+ compareWith: "compareWith",
2121
+ value: "value",
2122
+ ariaLabel: [0, "aria-label", "ariaLabel"],
2123
+ ariaLabelledby: [0, "aria-labelledby", "ariaLabelledby"],
2124
+ errorStateMatcher: "errorStateMatcher",
2125
+ typeaheadDebounceInterval: [2, "typeaheadDebounceInterval", "typeaheadDebounceInterval", numberAttribute],
2126
+ sortComparator: "sortComparator",
2127
+ id: "id",
2128
+ panelWidth: "panelWidth",
2129
+ canSelectNullableOptions: [2, "canSelectNullableOptions", "canSelectNullableOptions", booleanAttribute]
2130
+ },
2131
+ outputs: {
2132
+ openedChange: "openedChange",
2133
+ _openedStream: "opened",
2134
+ _closedStream: "closed",
2135
+ selectionChange: "selectionChange",
2136
+ valueChange: "valueChange"
2137
+ },
2138
+ exportAs: ["matSelect"],
2139
+ features: [\u0275\u0275ProvidersFeature([{
2140
+ provide: MatFormFieldControl,
2141
+ useExisting: _MatSelect
2142
+ }, {
2143
+ provide: MAT_OPTION_PARENT_COMPONENT,
2144
+ useExisting: _MatSelect
2145
+ }]), \u0275\u0275NgOnChangesFeature],
2146
+ ngContentSelectors: _c32,
2147
+ decls: 11,
2148
+ vars: 9,
2149
+ consts: [["fallbackOverlayOrigin", "cdkOverlayOrigin", "trigger", ""], ["panel", ""], ["cdk-overlay-origin", "", 1, "mat-mdc-select-trigger", 3, "click"], [1, "mat-mdc-select-value"], [1, "mat-mdc-select-placeholder", "mat-mdc-select-min-line"], [1, "mat-mdc-select-value-text"], [1, "mat-mdc-select-arrow-wrapper"], [1, "mat-mdc-select-arrow"], ["viewBox", "0 0 24 24", "width", "24px", "height", "24px", "focusable", "false", "aria-hidden", "true"], ["d", "M7 10l5 5 5-5z"], ["cdk-connected-overlay", "", "cdkConnectedOverlayLockPosition", "", "cdkConnectedOverlayHasBackdrop", "", "cdkConnectedOverlayBackdropClass", "cdk-overlay-transparent-backdrop", 3, "detach", "backdropClick", "overlayKeydown", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayWidth", "cdkConnectedOverlayFlexibleDimensions"], [1, "mat-mdc-select-min-line"], ["role", "listbox", "tabindex", "-1", 3, "keydown", "ngClass"]],
2150
+ template: function MatSelect_Template(rf, ctx) {
2151
+ if (rf & 1) {
2152
+ const _r1 = \u0275\u0275getCurrentView();
2153
+ \u0275\u0275projectionDef(_c22);
2154
+ \u0275\u0275elementStart(0, "div", 2, 0);
2155
+ \u0275\u0275listener("click", function MatSelect_Template_div_click_0_listener() {
2156
+ \u0275\u0275restoreView(_r1);
2157
+ return \u0275\u0275resetView(ctx.open());
2158
+ });
2159
+ \u0275\u0275elementStart(3, "div", 3);
2160
+ \u0275\u0275conditionalCreate(4, MatSelect_Conditional_4_Template, 2, 1, "span", 4)(5, MatSelect_Conditional_5_Template, 3, 1, "span", 5);
2161
+ \u0275\u0275elementEnd();
2162
+ \u0275\u0275elementStart(6, "div", 6)(7, "div", 7);
2163
+ \u0275\u0275namespaceSVG();
2164
+ \u0275\u0275elementStart(8, "svg", 8);
2165
+ \u0275\u0275element(9, "path", 9);
2166
+ \u0275\u0275elementEnd()()()();
2167
+ \u0275\u0275template(10, MatSelect_ng_template_10_Template, 3, 10, "ng-template", 10);
2168
+ \u0275\u0275listener("detach", function MatSelect_Template_ng_template_detach_10_listener() {
2169
+ \u0275\u0275restoreView(_r1);
2170
+ return \u0275\u0275resetView(ctx.close());
2171
+ })("backdropClick", function MatSelect_Template_ng_template_backdropClick_10_listener() {
2172
+ \u0275\u0275restoreView(_r1);
2173
+ return \u0275\u0275resetView(ctx.close());
2174
+ })("overlayKeydown", function MatSelect_Template_ng_template_overlayKeydown_10_listener($event) {
2175
+ \u0275\u0275restoreView(_r1);
2176
+ return \u0275\u0275resetView(ctx._handleOverlayKeydown($event));
2177
+ });
2178
+ }
2179
+ if (rf & 2) {
2180
+ const fallbackOverlayOrigin_r4 = \u0275\u0275reference(1);
2181
+ \u0275\u0275advance(3);
2182
+ \u0275\u0275attribute("id", ctx._valueId);
2183
+ \u0275\u0275advance();
2184
+ \u0275\u0275conditional(ctx.empty ? 4 : 5);
2185
+ \u0275\u0275advance(6);
2186
+ \u0275\u0275property("cdkConnectedOverlayDisableClose", true)("cdkConnectedOverlayPanelClass", ctx._overlayPanelClass)("cdkConnectedOverlayScrollStrategy", ctx._scrollStrategy)("cdkConnectedOverlayOrigin", ctx._preferredOverlayOrigin || fallbackOverlayOrigin_r4)("cdkConnectedOverlayPositions", ctx._positions)("cdkConnectedOverlayWidth", ctx._overlayWidth)("cdkConnectedOverlayFlexibleDimensions", true);
2187
+ }
2188
+ },
2189
+ dependencies: [CdkOverlayOrigin, CdkConnectedOverlay, NgClass],
2190
+ styles: ['@keyframes _mat-select-enter{from{opacity:0;transform:scaleY(0.8)}to{opacity:1;transform:none}}@keyframes _mat-select-exit{from{opacity:1}to{opacity:0}}.mat-mdc-select{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-sys-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-sys-body-large-tracking))}div.mat-mdc-select-panel{box-shadow:var(--mat-select-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12))}.mat-mdc-select-disabled{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-disabled .mat-mdc-select-placeholder{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-trigger{display:inline-flex;align-items:center;cursor:pointer;position:relative;box-sizing:border-box;width:100%}.mat-mdc-select-disabled .mat-mdc-select-trigger{-webkit-user-select:none;user-select:none;cursor:default}.mat-mdc-select-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-mdc-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-mdc-select-arrow-wrapper{height:24px;flex-shrink:0;display:inline-flex;align-items:center}.mat-form-field-appearance-fill .mdc-text-field--no-label .mat-mdc-select-arrow-wrapper{transform:none}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-invalid .mat-mdc-select-arrow,.mat-form-field-invalid:not(.mat-form-field-disabled) .mat-mdc-form-field-infix::after{color:var(--mat-select-invalid-arrow-color, var(--mat-sys-error))}.mat-mdc-select-arrow{width:10px;height:5px;position:relative;color:var(--mat-select-enabled-arrow-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field.mat-focused .mat-mdc-select-arrow{color:var(--mat-select-focused-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-disabled .mat-mdc-select-arrow{color:var(--mat-select-disabled-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-arrow svg{fill:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}@media(forced-colors: active){.mat-mdc-select-arrow svg{fill:CanvasText}.mat-mdc-select-disabled .mat-mdc-select-arrow svg{fill:GrayText}}div.mat-mdc-select-panel{width:100%;max-height:275px;outline:0;overflow:auto;padding:8px 0;border-radius:4px;box-sizing:border-box;position:relative;background-color:var(--mat-select-panel-background-color, var(--mat-sys-surface-container))}@media(forced-colors: active){div.mat-mdc-select-panel{outline:solid 1px}}.cdk-overlay-pane:not(.mat-mdc-select-panel-above) div.mat-mdc-select-panel{border-top-left-radius:0;border-top-right-radius:0;transform-origin:top center}.mat-mdc-select-panel-above div.mat-mdc-select-panel{border-bottom-left-radius:0;border-bottom-right-radius:0;transform-origin:bottom center}.mat-select-panel-animations-enabled{animation:_mat-select-enter 120ms cubic-bezier(0, 0, 0.2, 1)}.mat-select-panel-animations-enabled.mat-select-panel-exit{animation:_mat-select-exit 100ms linear}.mat-mdc-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1);color:var(--mat-select-placeholder-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field:not(.mat-form-field-animations-enabled) .mat-mdc-select-placeholder,._mat-animation-noopable .mat-mdc-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-mdc-select-placeholder{color:rgba(0,0,0,0);-webkit-text-fill-color:rgba(0,0,0,0);transition:none;display:block}.mat-mdc-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mat-mdc-floating-label{max-width:calc(100% - 18px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mdc-floating-label--float-above{max-width:calc(100%/0.75 - 24px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-text-field--label-floating .mdc-notched-outline__notch{max-width:calc(100% - 24px)}.mat-mdc-select-min-line:empty::before{content:" ";white-space:pre;width:1px;display:inline-block;visibility:hidden}.mat-form-field-appearance-fill .mat-mdc-select-arrow-wrapper{transform:var(--mat-select-arrow-transform, translateY(-8px))}\n'],
2191
+ encapsulation: 2,
2192
+ changeDetection: 0
2193
+ });
2194
+ };
2195
+ (() => {
2196
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatSelect, [{
2197
+ type: Component,
2198
+ args: [{
2199
+ selector: "mat-select",
2200
+ exportAs: "matSelect",
2201
+ encapsulation: ViewEncapsulation.None,
2202
+ changeDetection: ChangeDetectionStrategy.OnPush,
2203
+ host: {
2204
+ "role": "combobox",
2205
+ "aria-haspopup": "listbox",
2206
+ "class": "mat-mdc-select",
2207
+ "[attr.id]": "id",
2208
+ "[attr.tabindex]": "disabled ? -1 : tabIndex",
2209
+ "[attr.aria-controls]": 'panelOpen ? id + "-panel" : null',
2210
+ "[attr.aria-expanded]": "panelOpen",
2211
+ "[attr.aria-label]": "ariaLabel || null",
2212
+ "[attr.aria-required]": "required.toString()",
2213
+ "[attr.aria-disabled]": "disabled.toString()",
2214
+ "[attr.aria-invalid]": "errorState",
2215
+ "[attr.aria-activedescendant]": "_getAriaActiveDescendant()",
2216
+ "[class.mat-mdc-select-disabled]": "disabled",
2217
+ "[class.mat-mdc-select-invalid]": "errorState",
2218
+ "[class.mat-mdc-select-required]": "required",
2219
+ "[class.mat-mdc-select-empty]": "empty",
2220
+ "[class.mat-mdc-select-multiple]": "multiple",
2221
+ "(keydown)": "_handleKeydown($event)",
2222
+ "(focus)": "_onFocus()",
2223
+ "(blur)": "_onBlur()"
2224
+ },
2225
+ providers: [{
2226
+ provide: MatFormFieldControl,
2227
+ useExisting: MatSelect
2228
+ }, {
2229
+ provide: MAT_OPTION_PARENT_COMPONENT,
2230
+ useExisting: MatSelect
2231
+ }],
2232
+ imports: [CdkOverlayOrigin, CdkConnectedOverlay, NgClass],
2233
+ template: `<div cdk-overlay-origin
2234
+ class="mat-mdc-select-trigger"
2235
+ (click)="open()"
2236
+ #fallbackOverlayOrigin="cdkOverlayOrigin"
2237
+ #trigger>
2238
+
2239
+ <div class="mat-mdc-select-value" [attr.id]="_valueId">
2240
+ @if (empty) {
2241
+ <span class="mat-mdc-select-placeholder mat-mdc-select-min-line">{{placeholder}}</span>
2242
+ } @else {
2243
+ <span class="mat-mdc-select-value-text">
2244
+ @if (customTrigger) {
2245
+ <ng-content select="mat-select-trigger"></ng-content>
2246
+ } @else {
2247
+ <span class="mat-mdc-select-min-line">{{triggerValue}}</span>
2248
+ }
2249
+ </span>
2250
+ }
2251
+ </div>
2252
+
2253
+ <div class="mat-mdc-select-arrow-wrapper">
2254
+ <div class="mat-mdc-select-arrow">
2255
+ <!-- Use an inline SVG, because it works better than a CSS triangle in high contrast mode. -->
2256
+ <svg viewBox="0 0 24 24" width="24px" height="24px" focusable="false" aria-hidden="true">
2257
+ <path d="M7 10l5 5 5-5z"/>
2258
+ </svg>
2259
+ </div>
2260
+ </div>
2261
+ </div>
2262
+
2263
+ <ng-template
2264
+ cdk-connected-overlay
2265
+ cdkConnectedOverlayLockPosition
2266
+ cdkConnectedOverlayHasBackdrop
2267
+ cdkConnectedOverlayBackdropClass="cdk-overlay-transparent-backdrop"
2268
+ [cdkConnectedOverlayDisableClose]="true"
2269
+ [cdkConnectedOverlayPanelClass]="_overlayPanelClass"
2270
+ [cdkConnectedOverlayScrollStrategy]="_scrollStrategy"
2271
+ [cdkConnectedOverlayOrigin]="_preferredOverlayOrigin || fallbackOverlayOrigin"
2272
+ [cdkConnectedOverlayPositions]="_positions"
2273
+ [cdkConnectedOverlayWidth]="_overlayWidth"
2274
+ [cdkConnectedOverlayFlexibleDimensions]="true"
2275
+ (detach)="close()"
2276
+ (backdropClick)="close()"
2277
+ (overlayKeydown)="_handleOverlayKeydown($event)">
2278
+ <div
2279
+ #panel
2280
+ role="listbox"
2281
+ tabindex="-1"
2282
+ class="mat-mdc-select-panel mdc-menu-surface mdc-menu-surface--open {{ _getPanelTheme() }}"
2283
+ [class.mat-select-panel-animations-enabled]="!_animationsDisabled"
2284
+ [attr.id]="id + '-panel'"
2285
+ [attr.aria-multiselectable]="multiple"
2286
+ [attr.aria-label]="ariaLabel || null"
2287
+ [attr.aria-labelledby]="_getPanelAriaLabelledby()"
2288
+ [ngClass]="panelClass"
2289
+ (keydown)="_handleKeydown($event)">
2290
+ <ng-content></ng-content>
2291
+ </div>
2292
+ </ng-template>
2293
+ `,
2294
+ styles: ['@keyframes _mat-select-enter{from{opacity:0;transform:scaleY(0.8)}to{opacity:1;transform:none}}@keyframes _mat-select-exit{from{opacity:1}to{opacity:0}}.mat-mdc-select{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-sys-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-sys-body-large-tracking))}div.mat-mdc-select-panel{box-shadow:var(--mat-select-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12))}.mat-mdc-select-disabled{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-disabled .mat-mdc-select-placeholder{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-trigger{display:inline-flex;align-items:center;cursor:pointer;position:relative;box-sizing:border-box;width:100%}.mat-mdc-select-disabled .mat-mdc-select-trigger{-webkit-user-select:none;user-select:none;cursor:default}.mat-mdc-select-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-mdc-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-mdc-select-arrow-wrapper{height:24px;flex-shrink:0;display:inline-flex;align-items:center}.mat-form-field-appearance-fill .mdc-text-field--no-label .mat-mdc-select-arrow-wrapper{transform:none}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-invalid .mat-mdc-select-arrow,.mat-form-field-invalid:not(.mat-form-field-disabled) .mat-mdc-form-field-infix::after{color:var(--mat-select-invalid-arrow-color, var(--mat-sys-error))}.mat-mdc-select-arrow{width:10px;height:5px;position:relative;color:var(--mat-select-enabled-arrow-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field.mat-focused .mat-mdc-select-arrow{color:var(--mat-select-focused-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-disabled .mat-mdc-select-arrow{color:var(--mat-select-disabled-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-arrow svg{fill:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}@media(forced-colors: active){.mat-mdc-select-arrow svg{fill:CanvasText}.mat-mdc-select-disabled .mat-mdc-select-arrow svg{fill:GrayText}}div.mat-mdc-select-panel{width:100%;max-height:275px;outline:0;overflow:auto;padding:8px 0;border-radius:4px;box-sizing:border-box;position:relative;background-color:var(--mat-select-panel-background-color, var(--mat-sys-surface-container))}@media(forced-colors: active){div.mat-mdc-select-panel{outline:solid 1px}}.cdk-overlay-pane:not(.mat-mdc-select-panel-above) div.mat-mdc-select-panel{border-top-left-radius:0;border-top-right-radius:0;transform-origin:top center}.mat-mdc-select-panel-above div.mat-mdc-select-panel{border-bottom-left-radius:0;border-bottom-right-radius:0;transform-origin:bottom center}.mat-select-panel-animations-enabled{animation:_mat-select-enter 120ms cubic-bezier(0, 0, 0.2, 1)}.mat-select-panel-animations-enabled.mat-select-panel-exit{animation:_mat-select-exit 100ms linear}.mat-mdc-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1);color:var(--mat-select-placeholder-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field:not(.mat-form-field-animations-enabled) .mat-mdc-select-placeholder,._mat-animation-noopable .mat-mdc-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-mdc-select-placeholder{color:rgba(0,0,0,0);-webkit-text-fill-color:rgba(0,0,0,0);transition:none;display:block}.mat-mdc-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mat-mdc-floating-label{max-width:calc(100% - 18px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mdc-floating-label--float-above{max-width:calc(100%/0.75 - 24px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-text-field--label-floating .mdc-notched-outline__notch{max-width:calc(100% - 24px)}.mat-mdc-select-min-line:empty::before{content:" ";white-space:pre;width:1px;display:inline-block;visibility:hidden}.mat-form-field-appearance-fill .mat-mdc-select-arrow-wrapper{transform:var(--mat-select-arrow-transform, translateY(-8px))}\n']
2295
+ }]
2296
+ }], () => [], {
2297
+ options: [{
2298
+ type: ContentChildren,
2299
+ args: [MatOption, {
2300
+ descendants: true
2301
+ }]
2302
+ }],
2303
+ optionGroups: [{
2304
+ type: ContentChildren,
2305
+ args: [MAT_OPTGROUP, {
2306
+ descendants: true
2307
+ }]
2308
+ }],
2309
+ customTrigger: [{
2310
+ type: ContentChild,
2311
+ args: [MAT_SELECT_TRIGGER]
2312
+ }],
2313
+ userAriaDescribedBy: [{
2314
+ type: Input,
2315
+ args: ["aria-describedby"]
2316
+ }],
2317
+ trigger: [{
2318
+ type: ViewChild,
2319
+ args: ["trigger"]
2320
+ }],
2321
+ panel: [{
2322
+ type: ViewChild,
2323
+ args: ["panel"]
2324
+ }],
2325
+ _overlayDir: [{
2326
+ type: ViewChild,
2327
+ args: [CdkConnectedOverlay]
2328
+ }],
2329
+ panelClass: [{
2330
+ type: Input
2331
+ }],
2332
+ disabled: [{
2333
+ type: Input,
2334
+ args: [{
2335
+ transform: booleanAttribute
2336
+ }]
2337
+ }],
2338
+ disableRipple: [{
2339
+ type: Input,
2340
+ args: [{
2341
+ transform: booleanAttribute
2342
+ }]
2343
+ }],
2344
+ tabIndex: [{
2345
+ type: Input,
2346
+ args: [{
2347
+ transform: (value) => value == null ? 0 : numberAttribute(value)
2348
+ }]
2349
+ }],
2350
+ hideSingleSelectionIndicator: [{
2351
+ type: Input,
2352
+ args: [{
2353
+ transform: booleanAttribute
2354
+ }]
2355
+ }],
2356
+ placeholder: [{
2357
+ type: Input
2358
+ }],
2359
+ required: [{
2360
+ type: Input,
2361
+ args: [{
2362
+ transform: booleanAttribute
2363
+ }]
2364
+ }],
2365
+ multiple: [{
2366
+ type: Input,
2367
+ args: [{
2368
+ transform: booleanAttribute
2369
+ }]
2370
+ }],
2371
+ disableOptionCentering: [{
2372
+ type: Input,
2373
+ args: [{
2374
+ transform: booleanAttribute
2375
+ }]
2376
+ }],
2377
+ compareWith: [{
2378
+ type: Input
2379
+ }],
2380
+ value: [{
2381
+ type: Input
2382
+ }],
2383
+ ariaLabel: [{
2384
+ type: Input,
2385
+ args: ["aria-label"]
2386
+ }],
2387
+ ariaLabelledby: [{
2388
+ type: Input,
2389
+ args: ["aria-labelledby"]
2390
+ }],
2391
+ errorStateMatcher: [{
2392
+ type: Input
2393
+ }],
2394
+ typeaheadDebounceInterval: [{
2395
+ type: Input,
2396
+ args: [{
2397
+ transform: numberAttribute
2398
+ }]
2399
+ }],
2400
+ sortComparator: [{
2401
+ type: Input
2402
+ }],
2403
+ id: [{
2404
+ type: Input
2405
+ }],
2406
+ panelWidth: [{
2407
+ type: Input
2408
+ }],
2409
+ canSelectNullableOptions: [{
2410
+ type: Input,
2411
+ args: [{
2412
+ transform: booleanAttribute
2413
+ }]
2414
+ }],
2415
+ openedChange: [{
2416
+ type: Output
2417
+ }],
2418
+ _openedStream: [{
2419
+ type: Output,
2420
+ args: ["opened"]
2421
+ }],
2422
+ _closedStream: [{
2423
+ type: Output,
2424
+ args: ["closed"]
2425
+ }],
2426
+ selectionChange: [{
2427
+ type: Output
2428
+ }],
2429
+ valueChange: [{
2430
+ type: Output
2431
+ }]
2432
+ });
2433
+ })();
2434
+ var MatSelectTrigger = class _MatSelectTrigger {
2435
+ static \u0275fac = function MatSelectTrigger_Factory(__ngFactoryType__) {
2436
+ return new (__ngFactoryType__ || _MatSelectTrigger)();
2437
+ };
2438
+ static \u0275dir = /* @__PURE__ */ \u0275\u0275defineDirective({
2439
+ type: _MatSelectTrigger,
2440
+ selectors: [["mat-select-trigger"]],
2441
+ features: [\u0275\u0275ProvidersFeature([{
2442
+ provide: MAT_SELECT_TRIGGER,
2443
+ useExisting: _MatSelectTrigger
2444
+ }])]
2445
+ });
2446
+ };
2447
+ (() => {
2448
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatSelectTrigger, [{
2449
+ type: Directive,
2450
+ args: [{
2451
+ selector: "mat-select-trigger",
2452
+ providers: [{
2453
+ provide: MAT_SELECT_TRIGGER,
2454
+ useExisting: MatSelectTrigger
2455
+ }]
2456
+ }]
2457
+ }], null, null);
2458
+ })();
2459
+ var MatSelectModule = class _MatSelectModule {
2460
+ static \u0275fac = function MatSelectModule_Factory(__ngFactoryType__) {
2461
+ return new (__ngFactoryType__ || _MatSelectModule)();
2462
+ };
2463
+ static \u0275mod = /* @__PURE__ */ \u0275\u0275defineNgModule({
2464
+ type: _MatSelectModule,
2465
+ imports: [OverlayModule, MatOptionModule, MatCommonModule, MatSelect, MatSelectTrigger],
2466
+ exports: [CdkScrollableModule, MatFormFieldModule, MatSelect, MatSelectTrigger, MatOptionModule, MatCommonModule]
2467
+ });
2468
+ static \u0275inj = /* @__PURE__ */ \u0275\u0275defineInjector({
2469
+ providers: [MAT_SELECT_SCROLL_STRATEGY_PROVIDER],
2470
+ imports: [OverlayModule, MatOptionModule, MatCommonModule, CdkScrollableModule, MatFormFieldModule, MatOptionModule, MatCommonModule]
2471
+ });
2472
+ };
2473
+ (() => {
2474
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatSelectModule, [{
2475
+ type: NgModule,
2476
+ args: [{
2477
+ imports: [OverlayModule, MatOptionModule, MatCommonModule, MatSelect, MatSelectTrigger],
2478
+ exports: [CdkScrollableModule, MatFormFieldModule, MatSelect, MatSelectTrigger, MatOptionModule, MatCommonModule],
2479
+ providers: [MAT_SELECT_SCROLL_STRATEGY_PROVIDER]
2480
+ }]
2481
+ }], null, null);
2482
+ })();
2483
+
2484
+ // node_modules/@angular/material/fesm2022/internal-form-field-D5iFxU6d.mjs
2485
+ var _c03 = ["mat-internal-form-field", ""];
2486
+ var _c13 = ["*"];
2487
+ var _MatInternalFormField = class __MatInternalFormField {
2488
+ /** Position of the label relative to the content. */
2489
+ labelPosition;
2490
+ static \u0275fac = function _MatInternalFormField_Factory(__ngFactoryType__) {
2491
+ return new (__ngFactoryType__ || __MatInternalFormField)();
2492
+ };
2493
+ static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({
2494
+ type: __MatInternalFormField,
2495
+ selectors: [["div", "mat-internal-form-field", ""]],
2496
+ hostAttrs: [1, "mdc-form-field", "mat-internal-form-field"],
2497
+ hostVars: 2,
2498
+ hostBindings: function _MatInternalFormField_HostBindings(rf, ctx) {
2499
+ if (rf & 2) {
2500
+ \u0275\u0275classProp("mdc-form-field--align-end", ctx.labelPosition === "before");
2501
+ }
2502
+ },
2503
+ inputs: {
2504
+ labelPosition: "labelPosition"
2505
+ },
2506
+ attrs: _c03,
2507
+ ngContentSelectors: _c13,
2508
+ decls: 1,
2509
+ vars: 0,
2510
+ template: function _MatInternalFormField_Template(rf, ctx) {
2511
+ if (rf & 1) {
2512
+ \u0275\u0275projectionDef();
2513
+ \u0275\u0275projection(0);
2514
+ }
2515
+ },
2516
+ styles: [".mat-internal-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-flex;align-items:center;vertical-align:middle}.mat-internal-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mat-internal-form-field>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end .mdc-form-field--align-end label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0}\n"],
2517
+ encapsulation: 2,
2518
+ changeDetection: 0
2519
+ });
2520
+ };
2521
+ (() => {
2522
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(_MatInternalFormField, [{
2523
+ type: Component,
2524
+ args: [{
2525
+ selector: "div[mat-internal-form-field]",
2526
+ template: "<ng-content></ng-content>",
2527
+ encapsulation: ViewEncapsulation.None,
2528
+ changeDetection: ChangeDetectionStrategy.OnPush,
2529
+ host: {
2530
+ "class": "mdc-form-field mat-internal-form-field",
2531
+ "[class.mdc-form-field--align-end]": 'labelPosition === "before"'
2532
+ },
2533
+ styles: [".mat-internal-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-flex;align-items:center;vertical-align:middle}.mat-internal-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mat-internal-form-field>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end .mdc-form-field--align-end label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0}\n"]
2534
+ }]
2535
+ }], null, {
2536
+ labelPosition: [{
2537
+ type: Input,
2538
+ args: [{
2539
+ required: true
2540
+ }]
2541
+ }]
2542
+ });
2543
+ })();
2544
+
2545
+ // node_modules/@angular/material/fesm2022/date-formats-K6TQue-Y.mjs
2546
+ var MAT_DATE_LOCALE = new InjectionToken("MAT_DATE_LOCALE", {
2547
+ providedIn: "root",
2548
+ factory: MAT_DATE_LOCALE_FACTORY
2549
+ });
2550
+ function MAT_DATE_LOCALE_FACTORY() {
2551
+ return inject(LOCALE_ID);
2552
+ }
2553
+ var NOT_IMPLEMENTED = "Method not implemented";
2554
+ var DateAdapter = class {
2555
+ /** The locale to use for all dates. */
2556
+ locale;
2557
+ _localeChanges = new Subject();
2558
+ /** A stream that emits when the locale changes. */
2559
+ localeChanges = this._localeChanges;
2560
+ /**
2561
+ * Sets the time of one date to the time of another.
2562
+ * @param target Date whose time will be set.
2563
+ * @param hours New hours to set on the date object.
2564
+ * @param minutes New minutes to set on the date object.
2565
+ * @param seconds New seconds to set on the date object.
2566
+ */
2567
+ setTime(target, hours, minutes, seconds) {
2568
+ throw new Error(NOT_IMPLEMENTED);
2569
+ }
2570
+ /**
2571
+ * Gets the hours component of the given date.
2572
+ * @param date The date to extract the hours from.
2573
+ */
2574
+ getHours(date) {
2575
+ throw new Error(NOT_IMPLEMENTED);
2576
+ }
2577
+ /**
2578
+ * Gets the minutes component of the given date.
2579
+ * @param date The date to extract the minutes from.
2580
+ */
2581
+ getMinutes(date) {
2582
+ throw new Error(NOT_IMPLEMENTED);
2583
+ }
2584
+ /**
2585
+ * Gets the seconds component of the given date.
2586
+ * @param date The date to extract the seconds from.
2587
+ */
2588
+ getSeconds(date) {
2589
+ throw new Error(NOT_IMPLEMENTED);
2590
+ }
2591
+ /**
2592
+ * Parses a date with a specific time from a user-provided value.
2593
+ * @param value The value to parse.
2594
+ * @param parseFormat The expected format of the value being parsed
2595
+ * (type is implementation-dependent).
2596
+ */
2597
+ parseTime(value, parseFormat) {
2598
+ throw new Error(NOT_IMPLEMENTED);
2599
+ }
2600
+ /**
2601
+ * Adds an amount of seconds to the specified date.
2602
+ * @param date Date to which to add the seconds.
2603
+ * @param amount Amount of seconds to add to the date.
2604
+ */
2605
+ addSeconds(date, amount) {
2606
+ throw new Error(NOT_IMPLEMENTED);
2607
+ }
2608
+ /**
2609
+ * Given a potential date object, returns that same date object if it is
2610
+ * a valid date, or `null` if it's not a valid date.
2611
+ * @param obj The object to check.
2612
+ * @returns A date or `null`.
2613
+ */
2614
+ getValidDateOrNull(obj) {
2615
+ return this.isDateInstance(obj) && this.isValid(obj) ? obj : null;
2616
+ }
2617
+ /**
2618
+ * Attempts to deserialize a value to a valid date object. This is different from parsing in that
2619
+ * deserialize should only accept non-ambiguous, locale-independent formats (e.g. a ISO 8601
2620
+ * string). The default implementation does not allow any deserialization, it simply checks that
2621
+ * the given value is already a valid date object or null. The `<mat-datepicker>` will call this
2622
+ * method on all of its `@Input()` properties that accept dates. It is therefore possible to
2623
+ * support passing values from your backend directly to these properties by overriding this method
2624
+ * to also deserialize the format used by your backend.
2625
+ * @param value The value to be deserialized into a date object.
2626
+ * @returns The deserialized date object, either a valid date, null if the value can be
2627
+ * deserialized into a null date (e.g. the empty string), or an invalid date.
2628
+ */
2629
+ deserialize(value) {
2630
+ if (value == null || this.isDateInstance(value) && this.isValid(value)) {
2631
+ return value;
2632
+ }
2633
+ return this.invalid();
2634
+ }
2635
+ /**
2636
+ * Sets the locale used for all dates.
2637
+ * @param locale The new locale.
2638
+ */
2639
+ setLocale(locale) {
2640
+ this.locale = locale;
2641
+ this._localeChanges.next();
2642
+ }
2643
+ /**
2644
+ * Compares two dates.
2645
+ * @param first The first date to compare.
2646
+ * @param second The second date to compare.
2647
+ * @returns 0 if the dates are equal, a number less than 0 if the first date is earlier,
2648
+ * a number greater than 0 if the first date is later.
2649
+ */
2650
+ compareDate(first, second) {
2651
+ return this.getYear(first) - this.getYear(second) || this.getMonth(first) - this.getMonth(second) || this.getDate(first) - this.getDate(second);
2652
+ }
2653
+ /**
2654
+ * Compares the time values of two dates.
2655
+ * @param first First date to compare.
2656
+ * @param second Second date to compare.
2657
+ * @returns 0 if the times are equal, a number less than 0 if the first time is earlier,
2658
+ * a number greater than 0 if the first time is later.
2659
+ */
2660
+ compareTime(first, second) {
2661
+ return this.getHours(first) - this.getHours(second) || this.getMinutes(first) - this.getMinutes(second) || this.getSeconds(first) - this.getSeconds(second);
2662
+ }
2663
+ /**
2664
+ * Checks if two dates are equal.
2665
+ * @param first The first date to check.
2666
+ * @param second The second date to check.
2667
+ * @returns Whether the two dates are equal.
2668
+ * Null dates are considered equal to other null dates.
2669
+ */
2670
+ sameDate(first, second) {
2671
+ if (first && second) {
2672
+ let firstValid = this.isValid(first);
2673
+ let secondValid = this.isValid(second);
2674
+ if (firstValid && secondValid) {
2675
+ return !this.compareDate(first, second);
2676
+ }
2677
+ return firstValid == secondValid;
2678
+ }
2679
+ return first == second;
2680
+ }
2681
+ /**
2682
+ * Checks if the times of two dates are equal.
2683
+ * @param first The first date to check.
2684
+ * @param second The second date to check.
2685
+ * @returns Whether the times of the two dates are equal.
2686
+ * Null dates are considered equal to other null dates.
2687
+ */
2688
+ sameTime(first, second) {
2689
+ if (first && second) {
2690
+ const firstValid = this.isValid(first);
2691
+ const secondValid = this.isValid(second);
2692
+ if (firstValid && secondValid) {
2693
+ return !this.compareTime(first, second);
2694
+ }
2695
+ return firstValid == secondValid;
2696
+ }
2697
+ return first == second;
2698
+ }
2699
+ /**
2700
+ * Clamp the given date between min and max dates.
2701
+ * @param date The date to clamp.
2702
+ * @param min The minimum value to allow. If null or omitted no min is enforced.
2703
+ * @param max The maximum value to allow. If null or omitted no max is enforced.
2704
+ * @returns `min` if `date` is less than `min`, `max` if date is greater than `max`,
2705
+ * otherwise `date`.
2706
+ */
2707
+ clampDate(date, min, max) {
2708
+ if (min && this.compareDate(date, min) < 0) {
2709
+ return min;
2710
+ }
2711
+ if (max && this.compareDate(date, max) > 0) {
2712
+ return max;
2713
+ }
2714
+ return date;
2715
+ }
2716
+ };
2717
+ var MAT_DATE_FORMATS = new InjectionToken("mat-date-formats");
2718
+
2719
+ // node_modules/@angular/material/fesm2022/core.mjs
2720
+ var VERSION = new Version("20.1.6");
2721
+ var ISO_8601_REGEX = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|(?:(?:\+|-)\d{2}:\d{2}))?)?$/;
2722
+ var TIME_REGEX = /^(\d?\d)[:.](\d?\d)(?:[:.](\d?\d))?\s*(AM|PM)?$/i;
2723
+ function range(length, valueFunction) {
2724
+ const valuesArray = Array(length);
2725
+ for (let i = 0; i < length; i++) {
2726
+ valuesArray[i] = valueFunction(i);
2727
+ }
2728
+ return valuesArray;
2729
+ }
2730
+ var NativeDateAdapter = class _NativeDateAdapter extends DateAdapter {
2731
+ /**
2732
+ * @deprecated No longer being used. To be removed.
2733
+ * @breaking-change 14.0.0
2734
+ */
2735
+ useUtcForDisplay = false;
2736
+ /** The injected locale. */
2737
+ _matDateLocale = inject(MAT_DATE_LOCALE, {
2738
+ optional: true
2739
+ });
2740
+ constructor() {
2741
+ super();
2742
+ const matDateLocale = inject(MAT_DATE_LOCALE, {
2743
+ optional: true
2744
+ });
2745
+ if (matDateLocale !== void 0) {
2746
+ this._matDateLocale = matDateLocale;
2747
+ }
2748
+ super.setLocale(this._matDateLocale);
2749
+ }
2750
+ getYear(date) {
2751
+ return date.getFullYear();
2752
+ }
2753
+ getMonth(date) {
2754
+ return date.getMonth();
2755
+ }
2756
+ getDate(date) {
2757
+ return date.getDate();
2758
+ }
2759
+ getDayOfWeek(date) {
2760
+ return date.getDay();
2761
+ }
2762
+ getMonthNames(style) {
2763
+ const dtf = new Intl.DateTimeFormat(this.locale, {
2764
+ month: style,
2765
+ timeZone: "utc"
2766
+ });
2767
+ return range(12, (i) => this._format(dtf, new Date(2017, i, 1)));
2768
+ }
2769
+ getDateNames() {
2770
+ const dtf = new Intl.DateTimeFormat(this.locale, {
2771
+ day: "numeric",
2772
+ timeZone: "utc"
2773
+ });
2774
+ return range(31, (i) => this._format(dtf, new Date(2017, 0, i + 1)));
2775
+ }
2776
+ getDayOfWeekNames(style) {
2777
+ const dtf = new Intl.DateTimeFormat(this.locale, {
2778
+ weekday: style,
2779
+ timeZone: "utc"
2780
+ });
2781
+ return range(7, (i) => this._format(dtf, new Date(2017, 0, i + 1)));
2782
+ }
2783
+ getYearName(date) {
2784
+ const dtf = new Intl.DateTimeFormat(this.locale, {
2785
+ year: "numeric",
2786
+ timeZone: "utc"
2787
+ });
2788
+ return this._format(dtf, date);
2789
+ }
2790
+ getFirstDayOfWeek() {
2791
+ if (typeof Intl !== "undefined" && Intl.Locale) {
2792
+ const locale = new Intl.Locale(this.locale);
2793
+ const firstDay = (locale.getWeekInfo?.() || locale.weekInfo)?.firstDay ?? 0;
2794
+ return firstDay === 7 ? 0 : firstDay;
2795
+ }
2796
+ return 0;
2797
+ }
2798
+ getNumDaysInMonth(date) {
2799
+ return this.getDate(this._createDateWithOverflow(this.getYear(date), this.getMonth(date) + 1, 0));
2800
+ }
2801
+ clone(date) {
2802
+ return new Date(date.getTime());
2803
+ }
2804
+ createDate(year, month, date) {
2805
+ if (typeof ngDevMode === "undefined" || ngDevMode) {
2806
+ if (month < 0 || month > 11) {
2807
+ throw Error(`Invalid month index "${month}". Month index has to be between 0 and 11.`);
2808
+ }
2809
+ if (date < 1) {
2810
+ throw Error(`Invalid date "${date}". Date has to be greater than 0.`);
2811
+ }
2812
+ }
2813
+ let result = this._createDateWithOverflow(year, month, date);
2814
+ if (result.getMonth() != month && (typeof ngDevMode === "undefined" || ngDevMode)) {
2815
+ throw Error(`Invalid date "${date}" for month with index "${month}".`);
2816
+ }
2817
+ return result;
2818
+ }
2819
+ today() {
2820
+ return /* @__PURE__ */ new Date();
2821
+ }
2822
+ parse(value, parseFormat) {
2823
+ if (typeof value == "number") {
2824
+ return new Date(value);
2825
+ }
2826
+ return value ? new Date(Date.parse(value)) : null;
2827
+ }
2828
+ format(date, displayFormat) {
2829
+ if (!this.isValid(date)) {
2830
+ throw Error("NativeDateAdapter: Cannot format invalid date.");
2831
+ }
2832
+ const dtf = new Intl.DateTimeFormat(this.locale, __spreadProps(__spreadValues({}, displayFormat), {
2833
+ timeZone: "utc"
2834
+ }));
2835
+ return this._format(dtf, date);
2836
+ }
2837
+ addCalendarYears(date, years) {
2838
+ return this.addCalendarMonths(date, years * 12);
2839
+ }
2840
+ addCalendarMonths(date, months) {
2841
+ let newDate = this._createDateWithOverflow(this.getYear(date), this.getMonth(date) + months, this.getDate(date));
2842
+ if (this.getMonth(newDate) != ((this.getMonth(date) + months) % 12 + 12) % 12) {
2843
+ newDate = this._createDateWithOverflow(this.getYear(newDate), this.getMonth(newDate), 0);
2844
+ }
2845
+ return newDate;
2846
+ }
2847
+ addCalendarDays(date, days) {
2848
+ return this._createDateWithOverflow(this.getYear(date), this.getMonth(date), this.getDate(date) + days);
2849
+ }
2850
+ toIso8601(date) {
2851
+ return [date.getUTCFullYear(), this._2digit(date.getUTCMonth() + 1), this._2digit(date.getUTCDate())].join("-");
2852
+ }
2853
+ /**
2854
+ * Returns the given value if given a valid Date or null. Deserializes valid ISO 8601 strings
2855
+ * (https://www.ietf.org/rfc/rfc3339.txt) into valid Dates and empty string into null. Returns an
2856
+ * invalid date for all other values.
2857
+ */
2858
+ deserialize(value) {
2859
+ if (typeof value === "string") {
2860
+ if (!value) {
2861
+ return null;
2862
+ }
2863
+ if (ISO_8601_REGEX.test(value)) {
2864
+ let date = new Date(value);
2865
+ if (this.isValid(date)) {
2866
+ return date;
2867
+ }
2868
+ }
2869
+ }
2870
+ return super.deserialize(value);
2871
+ }
2872
+ isDateInstance(obj) {
2873
+ return obj instanceof Date;
2874
+ }
2875
+ isValid(date) {
2876
+ return !isNaN(date.getTime());
2877
+ }
2878
+ invalid() {
2879
+ return /* @__PURE__ */ new Date(NaN);
2880
+ }
2881
+ setTime(target, hours, minutes, seconds) {
2882
+ if (typeof ngDevMode === "undefined" || ngDevMode) {
2883
+ if (!inRange(hours, 0, 23)) {
2884
+ throw Error(`Invalid hours "${hours}". Hours value must be between 0 and 23.`);
2885
+ }
2886
+ if (!inRange(minutes, 0, 59)) {
2887
+ throw Error(`Invalid minutes "${minutes}". Minutes value must be between 0 and 59.`);
2888
+ }
2889
+ if (!inRange(seconds, 0, 59)) {
2890
+ throw Error(`Invalid seconds "${seconds}". Seconds value must be between 0 and 59.`);
2891
+ }
2892
+ }
2893
+ const clone = this.clone(target);
2894
+ clone.setHours(hours, minutes, seconds, 0);
2895
+ return clone;
2896
+ }
2897
+ getHours(date) {
2898
+ return date.getHours();
2899
+ }
2900
+ getMinutes(date) {
2901
+ return date.getMinutes();
2902
+ }
2903
+ getSeconds(date) {
2904
+ return date.getSeconds();
2905
+ }
2906
+ parseTime(userValue, parseFormat) {
2907
+ if (typeof userValue !== "string") {
2908
+ return userValue instanceof Date ? new Date(userValue.getTime()) : null;
2909
+ }
2910
+ const value = userValue.trim();
2911
+ if (value.length === 0) {
2912
+ return null;
2913
+ }
2914
+ let result = this._parseTimeString(value);
2915
+ if (result === null) {
2916
+ const withoutExtras = value.replace(/[^0-9:(AM|PM)]/gi, "").trim();
2917
+ if (withoutExtras.length > 0) {
2918
+ result = this._parseTimeString(withoutExtras);
2919
+ }
2920
+ }
2921
+ return result || this.invalid();
2922
+ }
2923
+ addSeconds(date, amount) {
2924
+ return new Date(date.getTime() + amount * 1e3);
2925
+ }
2926
+ /** Creates a date but allows the month and date to overflow. */
2927
+ _createDateWithOverflow(year, month, date) {
2928
+ const d = /* @__PURE__ */ new Date();
2929
+ d.setFullYear(year, month, date);
2930
+ d.setHours(0, 0, 0, 0);
2931
+ return d;
2932
+ }
2933
+ /**
2934
+ * Pads a number to make it two digits.
2935
+ * @param n The number to pad.
2936
+ * @returns The padded number.
2937
+ */
2938
+ _2digit(n) {
2939
+ return ("00" + n).slice(-2);
2940
+ }
2941
+ /**
2942
+ * When converting Date object to string, javascript built-in functions may return wrong
2943
+ * results because it applies its internal DST rules. The DST rules around the world change
2944
+ * very frequently, and the current valid rule is not always valid in previous years though.
2945
+ * We work around this problem building a new Date object which has its internal UTC
2946
+ * representation with the local date and time.
2947
+ * @param dtf Intl.DateTimeFormat object, containing the desired string format. It must have
2948
+ * timeZone set to 'utc' to work fine.
2949
+ * @param date Date from which we want to get the string representation according to dtf
2950
+ * @returns A Date object with its UTC representation based on the passed in date info
2951
+ */
2952
+ _format(dtf, date) {
2953
+ const d = /* @__PURE__ */ new Date();
2954
+ d.setUTCFullYear(date.getFullYear(), date.getMonth(), date.getDate());
2955
+ d.setUTCHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());
2956
+ return dtf.format(d);
2957
+ }
2958
+ /**
2959
+ * Attempts to parse a time string into a date object. Returns null if it cannot be parsed.
2960
+ * @param value Time string to parse.
2961
+ */
2962
+ _parseTimeString(value) {
2963
+ const parsed = value.toUpperCase().match(TIME_REGEX);
2964
+ if (parsed) {
2965
+ let hours = parseInt(parsed[1]);
2966
+ const minutes = parseInt(parsed[2]);
2967
+ let seconds = parsed[3] == null ? void 0 : parseInt(parsed[3]);
2968
+ const amPm = parsed[4];
2969
+ if (hours === 12) {
2970
+ hours = amPm === "AM" ? 0 : hours;
2971
+ } else if (amPm === "PM") {
2972
+ hours += 12;
2973
+ }
2974
+ if (inRange(hours, 0, 23) && inRange(minutes, 0, 59) && (seconds == null || inRange(seconds, 0, 59))) {
2975
+ return this.setTime(this.today(), hours, minutes, seconds || 0);
2976
+ }
2977
+ }
2978
+ return null;
2979
+ }
2980
+ static \u0275fac = function NativeDateAdapter_Factory(__ngFactoryType__) {
2981
+ return new (__ngFactoryType__ || _NativeDateAdapter)();
2982
+ };
2983
+ static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({
2984
+ token: _NativeDateAdapter,
2985
+ factory: _NativeDateAdapter.\u0275fac
2986
+ });
2987
+ };
2988
+ (() => {
2989
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NativeDateAdapter, [{
2990
+ type: Injectable
2991
+ }], () => [], null);
2992
+ })();
2993
+ function inRange(value, min, max) {
2994
+ return !isNaN(value) && value >= min && value <= max;
2995
+ }
2996
+ var MAT_NATIVE_DATE_FORMATS = {
2997
+ parse: {
2998
+ dateInput: null,
2999
+ timeInput: null
3000
+ },
3001
+ display: {
3002
+ dateInput: {
3003
+ year: "numeric",
3004
+ month: "numeric",
3005
+ day: "numeric"
3006
+ },
3007
+ timeInput: {
3008
+ hour: "numeric",
3009
+ minute: "numeric"
3010
+ },
3011
+ monthYearLabel: {
3012
+ year: "numeric",
3013
+ month: "short"
3014
+ },
3015
+ dateA11yLabel: {
3016
+ year: "numeric",
3017
+ month: "long",
3018
+ day: "numeric"
3019
+ },
3020
+ monthYearA11yLabel: {
3021
+ year: "numeric",
3022
+ month: "long"
3023
+ },
3024
+ timeOptionLabel: {
3025
+ hour: "numeric",
3026
+ minute: "numeric"
3027
+ }
3028
+ }
3029
+ };
3030
+ var NativeDateModule = class _NativeDateModule {
3031
+ static \u0275fac = function NativeDateModule_Factory(__ngFactoryType__) {
3032
+ return new (__ngFactoryType__ || _NativeDateModule)();
3033
+ };
3034
+ static \u0275mod = /* @__PURE__ */ \u0275\u0275defineNgModule({
3035
+ type: _NativeDateModule
3036
+ });
3037
+ static \u0275inj = /* @__PURE__ */ \u0275\u0275defineInjector({
3038
+ providers: [{
3039
+ provide: DateAdapter,
3040
+ useClass: NativeDateAdapter
3041
+ }]
3042
+ });
3043
+ };
3044
+ (() => {
3045
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NativeDateModule, [{
3046
+ type: NgModule,
3047
+ args: [{
3048
+ providers: [{
3049
+ provide: DateAdapter,
3050
+ useClass: NativeDateAdapter
3051
+ }]
3052
+ }]
3053
+ }], null, null);
3054
+ })();
3055
+ var MatNativeDateModule = class _MatNativeDateModule {
3056
+ static \u0275fac = function MatNativeDateModule_Factory(__ngFactoryType__) {
3057
+ return new (__ngFactoryType__ || _MatNativeDateModule)();
3058
+ };
3059
+ static \u0275mod = /* @__PURE__ */ \u0275\u0275defineNgModule({
3060
+ type: _MatNativeDateModule
3061
+ });
3062
+ static \u0275inj = /* @__PURE__ */ \u0275\u0275defineInjector({
3063
+ providers: [provideNativeDateAdapter()]
3064
+ });
3065
+ };
3066
+ (() => {
3067
+ (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MatNativeDateModule, [{
3068
+ type: NgModule,
3069
+ args: [{
3070
+ providers: [provideNativeDateAdapter()]
3071
+ }]
3072
+ }], null, null);
3073
+ })();
3074
+ function provideNativeDateAdapter(formats = MAT_NATIVE_DATE_FORMATS) {
3075
+ return [{
3076
+ provide: DateAdapter,
3077
+ useClass: NativeDateAdapter
3078
+ }, {
3079
+ provide: MAT_DATE_FORMATS,
3080
+ useValue: formats
3081
+ }];
3082
+ }
3083
+
3084
+ export {
3085
+ MatPseudoCheckbox,
3086
+ MAT_OPTION_PARENT_COMPONENT,
3087
+ MAT_OPTGROUP,
3088
+ MatOptgroup,
3089
+ MatOptionSelectionChange,
3090
+ MatOption,
3091
+ _countGroupLabelsBeforeOption,
3092
+ _getOptionScrollPosition,
3093
+ UniqueSelectionDispatcher,
3094
+ _DisposeViewRepeaterStrategy,
3095
+ SelectionModel,
3096
+ MatPseudoCheckboxModule,
3097
+ MatOptionModule,
3098
+ MatSelect,
3099
+ MatSelectModule,
3100
+ _MatInternalFormField
3101
+ };
3102
+ //# sourceMappingURL=chunk-65ZWQBS6.js.map