@ng-matero/extensions 18.4.1 → 19.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/_index.scss +3 -1
  2. package/alert/_alert-theme.scss +19 -8
  3. package/alert/alert.d.ts +1 -2
  4. package/button/button-loading.d.ts +1 -2
  5. package/checkbox-group/checkbox-group.d.ts +12 -4
  6. package/colorpicker/_colorpicker-theme.scss +19 -8
  7. package/colorpicker/colorpicker-input.d.ts +1 -3
  8. package/colorpicker/colorpicker-toggle.d.ts +3 -3
  9. package/colorpicker/colorpicker.d.ts +4 -7
  10. package/column-resize/column-resize-directives/column-resize-flex.d.ts +2 -1
  11. package/column-resize/column-resize-directives/column-resize.d.ts +2 -1
  12. package/column-resize/column-resize-notifier.d.ts +0 -1
  13. package/column-resize/column-resize.d.ts +1 -1
  14. package/column-resize/event-dispatcher.d.ts +0 -9
  15. package/column-resize/overlay-handle.d.ts +1 -1
  16. package/column-resize/resizable.d.ts +1 -1
  17. package/column-resize/resize-strategy.d.ts +4 -4
  18. package/core/datetime/datetime-adapter.d.ts +1 -2
  19. package/core/datetime/native-datetime-adapter.d.ts +3 -3
  20. package/core/style/_button-common.scss +18 -0
  21. package/core/theming/_config-validation.scss +4 -4
  22. package/core/theming/_definition.scss +12 -2
  23. package/core/theming/prebuilt/azure-blue.scss +10 -22
  24. package/core/theming/prebuilt/cyan-orange.scss +10 -22
  25. package/core/theming/prebuilt/magenta-violet.scss +10 -22
  26. package/core/theming/prebuilt/rose-red.scss +10 -22
  27. package/core/tokens/_m3-system.scss +273 -0
  28. package/core/tokens/_m3-tokens.scss +8 -151
  29. package/core/tokens/_token-utils.scss +102 -43
  30. package/core/tokens/m2/_index.scss +2 -0
  31. package/core/tokens/m3/definitions/_index.scss +1 -0
  32. package/core/tokens/m3/definitions/_md-comp-plain-tooltip.scss +51 -0
  33. package/core/tokens/m3/index.scss +2 -0
  34. package/core/tokens/m3/mdc/_plain-tooltip.scss +15 -0
  35. package/core/tokens/m3/mtx/_alert.scss +14 -14
  36. package/core/tokens/m3/mtx/_colorpicker.scss +2 -2
  37. package/core/tokens/m3/mtx/_datetimepicker.scss +2 -2
  38. package/core/tokens/m3/mtx/_drawer.scss +2 -2
  39. package/core/tokens/m3/mtx/_grid.scss +2 -2
  40. package/core/tokens/m3/mtx/_loader.scss +2 -2
  41. package/core/tokens/m3/mtx/_popover.scss +2 -2
  42. package/core/tokens/m3/mtx/_progress.scss +2 -2
  43. package/core/tokens/m3/mtx/_select.scss +2 -2
  44. package/core/tokens/m3/mtx/_split.scss +2 -2
  45. package/datetimepicker/_datetimepicker-theme.scss +23 -10
  46. package/datetimepicker/calendar-body.d.ts +26 -4
  47. package/datetimepicker/calendar-body.scss +58 -9
  48. package/datetimepicker/calendar.d.ts +31 -31
  49. package/datetimepicker/clock.d.ts +11 -5
  50. package/datetimepicker/datetimepicker-actions.d.ts +9 -5
  51. package/datetimepicker/datetimepicker-content.scss +15 -0
  52. package/datetimepicker/datetimepicker-input.d.ts +4 -5
  53. package/datetimepicker/datetimepicker-module.d.ts +2 -2
  54. package/datetimepicker/datetimepicker-toggle.d.ts +4 -3
  55. package/datetimepicker/datetimepicker.d.ts +12 -8
  56. package/datetimepicker/month-view.d.ts +22 -7
  57. package/datetimepicker/multi-year-view.d.ts +20 -20
  58. package/datetimepicker/public-api.d.ts +2 -2
  59. package/datetimepicker/{time.d.ts → time-view.d.ts} +21 -9
  60. package/datetimepicker/{time.scss → time-view.scss} +1 -1
  61. package/datetimepicker/year-view.d.ts +21 -11
  62. package/dialog/dialog-container.d.ts +1 -2
  63. package/dialog/dialog.d.ts +0 -1
  64. package/drawer/_drawer-theme.scss +19 -8
  65. package/drawer/drawer-container.d.ts +2 -5
  66. package/drawer/drawer.d.ts +3 -5
  67. package/fesm2022/mtxAlert.mjs +15 -15
  68. package/fesm2022/mtxAlert.mjs.map +1 -1
  69. package/fesm2022/mtxButton.mjs +13 -14
  70. package/fesm2022/mtxButton.mjs.map +1 -1
  71. package/fesm2022/mtxCheckboxGroup.mjs +51 -31
  72. package/fesm2022/mtxCheckboxGroup.mjs.map +1 -1
  73. package/fesm2022/mtxColorpicker.mjs +91 -109
  74. package/fesm2022/mtxColorpicker.mjs.map +1 -1
  75. package/fesm2022/mtxColumnResize.mjs +79 -96
  76. package/fesm2022/mtxColumnResize.mjs.map +1 -1
  77. package/fesm2022/mtxCore.mjs +31 -36
  78. package/fesm2022/mtxCore.mjs.map +1 -1
  79. package/fesm2022/mtxDatetimepicker.mjs +1179 -1092
  80. package/fesm2022/mtxDatetimepicker.mjs.map +1 -1
  81. package/fesm2022/mtxDialog.mjs +30 -41
  82. package/fesm2022/mtxDialog.mjs.map +1 -1
  83. package/fesm2022/mtxDrawer.mjs +36 -52
  84. package/fesm2022/mtxDrawer.mjs.map +1 -1
  85. package/fesm2022/mtxGrid.mjs +168 -204
  86. package/fesm2022/mtxGrid.mjs.map +1 -1
  87. package/fesm2022/mtxLoader.mjs +12 -12
  88. package/fesm2022/mtxLoader.mjs.map +1 -1
  89. package/fesm2022/mtxPhotoviewer.mjs +11 -12
  90. package/fesm2022/mtxPhotoviewer.mjs.map +1 -1
  91. package/fesm2022/mtxPopover.mjs +106 -119
  92. package/fesm2022/mtxPopover.mjs.map +1 -1
  93. package/fesm2022/mtxProgress.mjs +8 -8
  94. package/fesm2022/mtxProgress.mjs.map +1 -1
  95. package/fesm2022/mtxSelect.mjs +157 -169
  96. package/fesm2022/mtxSelect.mjs.map +1 -1
  97. package/fesm2022/mtxSplit.mjs +39 -40
  98. package/fesm2022/mtxSplit.mjs.map +1 -1
  99. package/fesm2022/mtxTooltip.mjs +105 -91
  100. package/fesm2022/mtxTooltip.mjs.map +1 -1
  101. package/grid/_grid-theme.scss +23 -10
  102. package/grid/cell.d.ts +1 -4
  103. package/grid/column-resize/column-resize-directives/column-resize-flex.d.ts +0 -1
  104. package/grid/column-resize/column-resize-directives/column-resize.d.ts +0 -1
  105. package/grid/column-resize/overlay-handle.d.ts +1 -2
  106. package/grid/column-resize/resizable-directives/resizable.d.ts +2 -3
  107. package/grid/column-resize/resize-strategy.d.ts +2 -4
  108. package/grid/grid-pipes.d.ts +0 -2
  109. package/grid/grid.d.ts +5 -5
  110. package/loader/_loader-theme.scss +19 -8
  111. package/loader/loader.d.ts +0 -2
  112. package/package.json +11 -47
  113. package/photoviewer/photoviewer.d.ts +1 -2
  114. package/popover/_popover-theme.scss +19 -8
  115. package/popover/popover-content.d.ts +1 -1
  116. package/popover/popover-target.d.ts +1 -2
  117. package/popover/popover-trigger.d.ts +5 -6
  118. package/popover/popover.d.ts +1 -2
  119. package/prebuilt-themes/azure-blue.css +1 -1
  120. package/prebuilt-themes/cyan-orange.css +1 -1
  121. package/prebuilt-themes/deeppurple-amber.css +1 -1
  122. package/prebuilt-themes/indigo-pink.css +1 -1
  123. package/prebuilt-themes/magenta-violet.css +1 -1
  124. package/prebuilt-themes/pink-bluegrey.css +1 -1
  125. package/prebuilt-themes/purple-green.css +1 -1
  126. package/prebuilt-themes/rose-red.css +1 -1
  127. package/progress/_progress-theme.scss +23 -10
  128. package/select/_select-theme.scss +23 -10
  129. package/select/option.d.ts +0 -1
  130. package/select/select-intl.d.ts +2 -4
  131. package/select/select.d.ts +8 -7
  132. package/select/select.scss +3 -3
  133. package/select/templates.d.ts +0 -12
  134. package/split/_split-theme.scss +19 -8
  135. package/split/split-pane.d.ts +3 -4
  136. package/split/split.d.ts +4 -4
  137. package/split/split.scss +1 -1
  138. package/tooltip/_tooltip-theme.scss +11 -4
  139. package/tooltip/tooltip.d.ts +17 -9
  140. package/tooltip/tooltip.scss +8 -3
  141. package/esm2022/alert/alert-module.mjs +0 -17
  142. package/esm2022/alert/alert.mjs +0 -46
  143. package/esm2022/alert/mtxAlert.mjs +0 -5
  144. package/esm2022/alert/public-api.mjs +0 -3
  145. package/esm2022/button/button-loading.mjs +0 -66
  146. package/esm2022/button/button-module.mjs +0 -19
  147. package/esm2022/button/mtxButton.mjs +0 -5
  148. package/esm2022/button/public-api.mjs +0 -3
  149. package/esm2022/checkbox-group/checkbox-group-module.mjs +0 -20
  150. package/esm2022/checkbox-group/checkbox-group.mjs +0 -222
  151. package/esm2022/checkbox-group/interfaces.mjs +0 -2
  152. package/esm2022/checkbox-group/mtxCheckboxGroup.mjs +0 -5
  153. package/esm2022/checkbox-group/public-api.mjs +0 -4
  154. package/esm2022/colorpicker/colorpicker-animations.mjs +0 -16
  155. package/esm2022/colorpicker/colorpicker-input.mjs +0 -228
  156. package/esm2022/colorpicker/colorpicker-module.mjs +0 -64
  157. package/esm2022/colorpicker/colorpicker-toggle.mjs +0 -102
  158. package/esm2022/colorpicker/colorpicker.mjs +0 -363
  159. package/esm2022/colorpicker/mtxColorpicker.mjs +0 -5
  160. package/esm2022/colorpicker/public-api.mjs +0 -6
  161. package/esm2022/column-resize/column-resize-directives/column-resize-flex.mjs +0 -40
  162. package/esm2022/column-resize/column-resize-directives/column-resize.mjs +0 -40
  163. package/esm2022/column-resize/column-resize-directives/constants.mjs +0 -21
  164. package/esm2022/column-resize/column-resize-module.mjs +0 -28
  165. package/esm2022/column-resize/column-resize-notifier.mjs +0 -52
  166. package/esm2022/column-resize/column-resize.mjs +0 -82
  167. package/esm2022/column-resize/column-size-store.mjs +0 -20
  168. package/esm2022/column-resize/event-dispatcher.mjs +0 -70
  169. package/esm2022/column-resize/mtxColumnResize.mjs +0 -5
  170. package/esm2022/column-resize/overlay-handle.mjs +0 -146
  171. package/esm2022/column-resize/polyfill.mjs +0 -19
  172. package/esm2022/column-resize/public-api.mjs +0 -13
  173. package/esm2022/column-resize/resizable.mjs +0 -199
  174. package/esm2022/column-resize/resize-ref.mjs +0 -17
  175. package/esm2022/column-resize/resize-strategy.mjs +0 -238
  176. package/esm2022/column-resize/selectors.mjs +0 -13
  177. package/esm2022/core/datetime/datetime-adapter.mjs +0 -132
  178. package/esm2022/core/datetime/datetime-formats.mjs +0 -3
  179. package/esm2022/core/datetime/datetime.module.mjs +0 -38
  180. package/esm2022/core/datetime/index.mjs +0 -6
  181. package/esm2022/core/datetime/native-datetime-adapter.mjs +0 -138
  182. package/esm2022/core/datetime/native-datetime-formats.mjs +0 -20
  183. package/esm2022/core/mtxCore.mjs +0 -5
  184. package/esm2022/core/pipes/index.mjs +0 -4
  185. package/esm2022/core/pipes/is-template-ref.pipe.mjs +0 -14
  186. package/esm2022/core/pipes/pipes.module.mjs +0 -18
  187. package/esm2022/core/pipes/to-observable.pipe.mjs +0 -15
  188. package/esm2022/core/public-api.mjs +0 -3
  189. package/esm2022/datetimepicker/calendar-body.mjs +0 -77
  190. package/esm2022/datetimepicker/calendar.mjs +0 -661
  191. package/esm2022/datetimepicker/clock.mjs +0 -362
  192. package/esm2022/datetimepicker/datetimepicker-actions.mjs +0 -88
  193. package/esm2022/datetimepicker/datetimepicker-animations.mjs +0 -44
  194. package/esm2022/datetimepicker/datetimepicker-errors.mjs +0 -8
  195. package/esm2022/datetimepicker/datetimepicker-filtertype.mjs +0 -7
  196. package/esm2022/datetimepicker/datetimepicker-input.mjs +0 -349
  197. package/esm2022/datetimepicker/datetimepicker-intl.mjs +0 -63
  198. package/esm2022/datetimepicker/datetimepicker-module.mjs +0 -116
  199. package/esm2022/datetimepicker/datetimepicker-toggle.mjs +0 -105
  200. package/esm2022/datetimepicker/datetimepicker-types.mjs +0 -2
  201. package/esm2022/datetimepicker/datetimepicker.mjs +0 -580
  202. package/esm2022/datetimepicker/month-view.mjs +0 -148
  203. package/esm2022/datetimepicker/mtxDatetimepicker.mjs +0 -5
  204. package/esm2022/datetimepicker/multi-year-view.mjs +0 -215
  205. package/esm2022/datetimepicker/public-api.mjs +0 -17
  206. package/esm2022/datetimepicker/time.mjs +0 -470
  207. package/esm2022/datetimepicker/year-view.mjs +0 -139
  208. package/esm2022/dialog/dialog-config.mjs +0 -2
  209. package/esm2022/dialog/dialog-container.mjs +0 -43
  210. package/esm2022/dialog/dialog-module.mjs +0 -40
  211. package/esm2022/dialog/dialog.mjs +0 -75
  212. package/esm2022/dialog/mtxDialog.mjs +0 -5
  213. package/esm2022/dialog/public-api.mjs +0 -5
  214. package/esm2022/drawer/drawer-animations.mjs +0 -18
  215. package/esm2022/drawer/drawer-config.mjs +0 -35
  216. package/esm2022/drawer/drawer-container.mjs +0 -88
  217. package/esm2022/drawer/drawer-module.mjs +0 -21
  218. package/esm2022/drawer/drawer-ref.mjs +0 -99
  219. package/esm2022/drawer/drawer.mjs +0 -144
  220. package/esm2022/drawer/mtxDrawer.mjs +0 -5
  221. package/esm2022/drawer/public-api.mjs +0 -7
  222. package/esm2022/grid/cell.mjs +0 -132
  223. package/esm2022/grid/column-menu.mjs +0 -133
  224. package/esm2022/grid/column-resize/column-resize-directives/column-resize-flex.mjs +0 -38
  225. package/esm2022/grid/column-resize/column-resize-directives/column-resize.mjs +0 -38
  226. package/esm2022/grid/column-resize/column-resize-directives/common.mjs +0 -27
  227. package/esm2022/grid/column-resize/column-resize-module.mjs +0 -42
  228. package/esm2022/grid/column-resize/index.mjs +0 -8
  229. package/esm2022/grid/column-resize/overlay-handle.mjs +0 -66
  230. package/esm2022/grid/column-resize/resizable-directives/common.mjs +0 -29
  231. package/esm2022/grid/column-resize/resizable-directives/resizable.mjs +0 -64
  232. package/esm2022/grid/column-resize/resize-strategy.mjs +0 -47
  233. package/esm2022/grid/expansion-toggle.mjs +0 -65
  234. package/esm2022/grid/grid-module.mjs +0 -151
  235. package/esm2022/grid/grid-pipes.mjs +0 -129
  236. package/esm2022/grid/grid-utils.mjs +0 -56
  237. package/esm2022/grid/grid.mjs +0 -644
  238. package/esm2022/grid/interfaces.mjs +0 -2
  239. package/esm2022/grid/mtxGrid.mjs +0 -5
  240. package/esm2022/grid/public-api.mjs +0 -18
  241. package/esm2022/grid/selectable-cell.mjs +0 -53
  242. package/esm2022/loader/loader-module.mjs +0 -19
  243. package/esm2022/loader/loader.mjs +0 -57
  244. package/esm2022/loader/mtxLoader.mjs +0 -5
  245. package/esm2022/loader/public-api.mjs +0 -3
  246. package/esm2022/ng-matero-extensions.mjs +0 -5
  247. package/esm2022/photoviewer/mtxPhotoviewer.mjs +0 -5
  248. package/esm2022/photoviewer/photoviewer-module.mjs +0 -16
  249. package/esm2022/photoviewer/photoviewer.mjs +0 -64
  250. package/esm2022/photoviewer/public-api.mjs +0 -3
  251. package/esm2022/popover/mtxPopover.mjs +0 -5
  252. package/esm2022/popover/popover-animations.mjs +0 -25
  253. package/esm2022/popover/popover-content.mjs +0 -91
  254. package/esm2022/popover/popover-errors.mjs +0 -27
  255. package/esm2022/popover/popover-interfaces.mjs +0 -2
  256. package/esm2022/popover/popover-module.mjs +0 -39
  257. package/esm2022/popover/popover-target.mjs +0 -18
  258. package/esm2022/popover/popover-trigger.mjs +0 -480
  259. package/esm2022/popover/popover-types.mjs +0 -2
  260. package/esm2022/popover/popover.mjs +0 -325
  261. package/esm2022/popover/public-api.mjs +0 -9
  262. package/esm2022/progress/mtxProgress.mjs +0 -5
  263. package/esm2022/progress/progress-module.mjs +0 -17
  264. package/esm2022/progress/progress.mjs +0 -43
  265. package/esm2022/progress/public-api.mjs +0 -3
  266. package/esm2022/public-api.mjs +0 -5
  267. package/esm2022/select/mtxSelect.mjs +0 -5
  268. package/esm2022/select/option.mjs +0 -52
  269. package/esm2022/select/public-api.mjs +0 -6
  270. package/esm2022/select/select-intl.mjs +0 -32
  271. package/esm2022/select/select-module.mjs +0 -89
  272. package/esm2022/select/select.mjs +0 -611
  273. package/esm2022/select/templates.mjs +0 -135
  274. package/esm2022/split/interfaces.mjs +0 -2
  275. package/esm2022/split/mtxSplit.mjs +0 -5
  276. package/esm2022/split/public-api.mjs +0 -6
  277. package/esm2022/split/split-module.mjs +0 -18
  278. package/esm2022/split/split-pane.mjs +0 -161
  279. package/esm2022/split/split.mjs +0 -634
  280. package/esm2022/split/utils.mjs +0 -219
  281. package/esm2022/tooltip/mtxTooltip.mjs +0 -5
  282. package/esm2022/tooltip/public-api.mjs +0 -4
  283. package/esm2022/tooltip/tooltip-animations.mjs +0 -17
  284. package/esm2022/tooltip/tooltip-module.mjs +0 -41
  285. package/esm2022/tooltip/tooltip.mjs +0 -915
@@ -1,386 +1,21 @@
1
- import { A11yModule } from '@angular/cdk/a11y';
2
- import * as i1$1 from '@angular/cdk/overlay';
1
+ import { CdkMonitorFocus, CdkTrapFocus, A11yModule } from '@angular/cdk/a11y';
3
2
  import { Overlay, OverlayConfig, OverlayModule } from '@angular/cdk/overlay';
4
3
  import { ComponentPortal, CdkPortalOutlet, TemplatePortal, PortalModule } from '@angular/cdk/portal';
5
4
  import { DOCUMENT, CommonModule } from '@angular/common';
6
5
  import * as i0 from '@angular/core';
7
- import { EventEmitter, booleanAttribute, Component, ViewEncapsulation, ChangeDetectionStrategy, Inject, Input, Output, Optional, Injectable, Directive, ElementRef, ViewChild, inject, Injector, afterNextRender, InjectionToken, forwardRef, Attribute, ContentChild, TemplateRef, NgModule } from '@angular/core';
6
+ import { Injectable, inject, ElementRef, NgZone, Injector, EventEmitter, afterNextRender, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, Output, ViewChild, ChangeDetectorRef, booleanAttribute, Directive, InjectionToken, ViewContainerRef, forwardRef, HostAttributeToken, ContentChild, TemplateRef, NgModule } from '@angular/core';
8
7
  import { MatButton, MatIconButton, MatButtonModule } from '@angular/material/button';
9
- import { UP_ARROW, DOWN_ARROW, ENTER, PAGE_DOWN, PAGE_UP, END, HOME, RIGHT_ARROW, LEFT_ARROW, ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';
10
- import * as i1 from '@ng-matero/extensions/core';
11
- import { MTX_DATETIME_FORMATS } from '@ng-matero/extensions/core';
12
- import { normalizePassiveListenerOptions, _getFocusedElementPierceShadowDom } from '@angular/cdk/platform';
8
+ import { DatetimeAdapter, MTX_DATETIME_FORMATS } from '@ng-matero/extensions/core';
13
9
  import { trigger, transition, animate, keyframes, style, state } from '@angular/animations';
14
- import { coerceNumberProperty, coerceStringArray } from '@angular/cdk/coercion';
15
10
  import { Subject, Subscription, merge, of } from 'rxjs';
11
+ import { SPACE, ENTER, PAGE_DOWN, PAGE_UP, END, HOME, DOWN_ARROW, UP_ARROW, RIGHT_ARROW, LEFT_ARROW, ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';
12
+ import { Directionality } from '@angular/cdk/bidi';
13
+ import { coerceNumberProperty, coerceStringArray } from '@angular/cdk/coercion';
14
+ import { normalizePassiveListenerOptions, _getFocusedElementPierceShadowDom } from '@angular/cdk/platform';
16
15
  import { take, filter } from 'rxjs/operators';
17
- import * as i3 from '@angular/cdk/bidi';
18
16
  import { NG_VALUE_ACCESSOR, NG_VALIDATORS, Validators } from '@angular/forms';
17
+ import { MatFormField } from '@angular/material/form-field';
19
18
  import { MAT_INPUT_VALUE_ACCESSOR } from '@angular/material/input';
20
- import * as i2 from '@angular/material/form-field';
21
-
22
- var MtxDatetimepickerFilterType;
23
- (function (MtxDatetimepickerFilterType) {
24
- MtxDatetimepickerFilterType[MtxDatetimepickerFilterType["DATE"] = 0] = "DATE";
25
- MtxDatetimepickerFilterType[MtxDatetimepickerFilterType["HOUR"] = 1] = "HOUR";
26
- MtxDatetimepickerFilterType[MtxDatetimepickerFilterType["MINUTE"] = 2] = "MINUTE";
27
- })(MtxDatetimepickerFilterType || (MtxDatetimepickerFilterType = {}));
28
-
29
- const activeEventOptions = normalizePassiveListenerOptions({ passive: false });
30
- const CLOCK_RADIUS = 50;
31
- const CLOCK_INNER_RADIUS = 27.5;
32
- const CLOCK_OUTER_RADIUS = 41.25;
33
- const CLOCK_TICK_RADIUS = 7.0833;
34
- /**
35
- * A clock that is used as part of the datetimepicker.
36
- * @docs-private
37
- */
38
- class MtxClock {
39
- constructor(_elementRef, _adapter, _changeDetectorRef, _document) {
40
- this._elementRef = _elementRef;
41
- this._adapter = _adapter;
42
- this._changeDetectorRef = _changeDetectorRef;
43
- this._document = _document;
44
- /** Step over minutes. */
45
- this.interval = 1;
46
- this.actionButtons = false;
47
- /** Whether the clock uses 12 hour format. */
48
- this.twelvehour = false;
49
- /** Whether the time is now in AM or PM. */
50
- this.AMPM = 'AM';
51
- /** Emits when the currently selected date changes. */
52
- this.selectedChange = new EventEmitter();
53
- /** Emits when any date is activated. */
54
- this.activeDateChange = new EventEmitter();
55
- /** Emits when any date is selected. */
56
- this._userSelection = new EventEmitter();
57
- /** Whether the clock is in hour view. */
58
- this._hourView = true;
59
- this._hours = [];
60
- this._minutes = [];
61
- this._timeChanged = false;
62
- /** Called when the user has put their pointer down on the clock. */
63
- this._pointerDown = (event) => {
64
- this._timeChanged = false;
65
- this.setTime(event);
66
- this._bindGlobalEvents(event);
67
- };
68
- /**
69
- * Called when the user has moved their pointer after
70
- * starting to drag. Bound on the document level.
71
- */
72
- this._pointerMove = (event) => {
73
- if (event.cancelable) {
74
- event.preventDefault();
75
- }
76
- this.setTime(event);
77
- };
78
- /** Called when the user has lifted their pointer. Bound on the document level. */
79
- this._pointerUp = (event) => {
80
- if (event.cancelable) {
81
- event.preventDefault();
82
- }
83
- this._removeGlobalEvents();
84
- if (this._timeChanged) {
85
- this.selectedChange.emit(this.activeDate);
86
- if (this.actionButtons || !this._hourView) {
87
- this._userSelection.emit();
88
- }
89
- }
90
- };
91
- }
92
- /**
93
- * The date to display in this clock view.
94
- */
95
- get activeDate() {
96
- return this._activeDate;
97
- }
98
- set activeDate(value) {
99
- const oldActiveDate = this._activeDate;
100
- this._activeDate = this._adapter.clampDate(value, this.minDate, this.maxDate);
101
- if (!this._adapter.sameMinute(oldActiveDate, this._activeDate)) {
102
- this._init();
103
- }
104
- }
105
- /** The currently selected date. */
106
- get selected() {
107
- return this._selected;
108
- }
109
- set selected(value) {
110
- this._selected = this._adapter.getValidDateOrNull(this._adapter.deserialize(value));
111
- if (this._selected) {
112
- this.activeDate = this._selected;
113
- }
114
- }
115
- /** The minimum selectable date. */
116
- get minDate() {
117
- return this._minDate;
118
- }
119
- set minDate(value) {
120
- this._minDate = this._adapter.getValidDateOrNull(this._adapter.deserialize(value));
121
- }
122
- /** The maximum selectable date. */
123
- get maxDate() {
124
- return this._maxDate;
125
- }
126
- set maxDate(value) {
127
- this._maxDate = this._adapter.getValidDateOrNull(this._adapter.deserialize(value));
128
- }
129
- /** Whether the clock should be started in hour or minute view. */
130
- set startView(value) {
131
- this._hourView = value !== 'minute';
132
- }
133
- get _hand() {
134
- const hour = this._adapter.getHour(this.activeDate);
135
- this._selectedHour = hour;
136
- this._selectedMinute = this._adapter.getMinute(this.activeDate);
137
- let deg = 0;
138
- let radius = CLOCK_OUTER_RADIUS;
139
- if (this._hourView) {
140
- const outer = this._selectedHour > 0 && this._selectedHour < 13;
141
- radius = outer ? CLOCK_OUTER_RADIUS : CLOCK_INNER_RADIUS;
142
- if (this.twelvehour) {
143
- radius = CLOCK_OUTER_RADIUS;
144
- }
145
- deg = Math.round(this._selectedHour * (360 / (24 / 2)));
146
- }
147
- else {
148
- deg = Math.round(this._selectedMinute * (360 / 60));
149
- }
150
- return {
151
- height: `${radius}%`,
152
- marginTop: `${50 - radius}%`,
153
- transform: `rotate(${deg}deg)`,
154
- };
155
- }
156
- ngAfterContentInit() {
157
- this.activeDate = this._activeDate || this._adapter.today();
158
- this._init();
159
- }
160
- ngOnDestroy() {
161
- this._removeGlobalEvents();
162
- }
163
- ngOnChanges() {
164
- this._init();
165
- }
166
- /** Binds our global move and end events. */
167
- _bindGlobalEvents(triggerEvent) {
168
- // Note that we bind the events to the `document`, because it allows us to capture
169
- // drag cancel events where the user's pointer is outside the browser window.
170
- const document = this._document;
171
- const isTouch = isTouchEvent(triggerEvent);
172
- const moveEventName = isTouch ? 'touchmove' : 'mousemove';
173
- const endEventName = isTouch ? 'touchend' : 'mouseup';
174
- document.addEventListener(moveEventName, this._pointerMove, activeEventOptions);
175
- document.addEventListener(endEventName, this._pointerUp, activeEventOptions);
176
- if (isTouch) {
177
- document.addEventListener('touchcancel', this._pointerUp, activeEventOptions);
178
- }
179
- }
180
- /** Removes any global event listeners that we may have added. */
181
- _removeGlobalEvents() {
182
- const document = this._document;
183
- document.removeEventListener('mousemove', this._pointerMove, activeEventOptions);
184
- document.removeEventListener('mouseup', this._pointerUp, activeEventOptions);
185
- document.removeEventListener('touchmove', this._pointerMove, activeEventOptions);
186
- document.removeEventListener('touchend', this._pointerUp, activeEventOptions);
187
- document.removeEventListener('touchcancel', this._pointerUp, activeEventOptions);
188
- }
189
- /** Initializes this clock view. */
190
- _init() {
191
- this._hours.length = 0;
192
- this._minutes.length = 0;
193
- const hourNames = this._adapter.getHourNames();
194
- const minuteNames = this._adapter.getMinuteNames();
195
- if (this.twelvehour) {
196
- const hours = [];
197
- for (let i = 0; i < hourNames.length; i++) {
198
- const radian = (i / 6) * Math.PI;
199
- const radius = CLOCK_OUTER_RADIUS;
200
- const hour = i;
201
- const date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), hour, 0);
202
- // Check if the date is enabled, no need to respect the minute setting here
203
- const enabled = (!this.minDate ||
204
- this._adapter.compareDatetime(date, this.minDate, false) >= 0) &&
205
- (!this.maxDate ||
206
- this._adapter.compareDatetime(date, this.maxDate, false) <= 0) &&
207
- (!this.dateFilter || this.dateFilter(date, MtxDatetimepickerFilterType.HOUR));
208
- // display value for twelvehour clock should be from 1-12 not including 0 and not above 12
209
- hours.push({
210
- value: i,
211
- displayValue: i % 12 === 0 ? '12' : hourNames[i % 12],
212
- enabled,
213
- top: CLOCK_RADIUS - Math.cos(radian) * radius - CLOCK_TICK_RADIUS,
214
- left: CLOCK_RADIUS + Math.sin(radian) * radius - CLOCK_TICK_RADIUS,
215
- });
216
- }
217
- // filter out AM or PM hours based on AMPM
218
- if (this.AMPM === 'AM') {
219
- this._hours = hours.filter(x => x.value < 12);
220
- }
221
- else {
222
- this._hours = hours.filter(x => x.value >= 12);
223
- }
224
- }
225
- else {
226
- for (let i = 0; i < hourNames.length; i++) {
227
- const radian = (i / 6) * Math.PI;
228
- const outer = i > 0 && i < 13;
229
- const radius = outer ? CLOCK_OUTER_RADIUS : CLOCK_INNER_RADIUS;
230
- const date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), i, 0);
231
- // Check if the date is enabled, no need to respect the minute setting here
232
- const enabled = (!this.minDate ||
233
- this._adapter.compareDatetime(date, this.minDate, false) >= 0) &&
234
- (!this.maxDate ||
235
- this._adapter.compareDatetime(date, this.maxDate, false) <= 0) &&
236
- (!this.dateFilter || this.dateFilter(date, MtxDatetimepickerFilterType.HOUR));
237
- this._hours.push({
238
- value: i,
239
- displayValue: i === 0 ? '00' : hourNames[i],
240
- enabled,
241
- top: CLOCK_RADIUS - Math.cos(radian) * radius - CLOCK_TICK_RADIUS,
242
- left: CLOCK_RADIUS + Math.sin(radian) * radius - CLOCK_TICK_RADIUS,
243
- fontSize: i > 0 && i < 13 ? '' : '80%',
244
- });
245
- }
246
- }
247
- for (let i = 0; i < minuteNames.length; i += 5) {
248
- const radian = (i / 30) * Math.PI;
249
- const date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this._adapter.getHour(this.activeDate), i);
250
- const enabled = (!this.minDate || this._adapter.compareDatetime(date, this.minDate) >= 0) &&
251
- (!this.maxDate || this._adapter.compareDatetime(date, this.maxDate) <= 0) &&
252
- (!this.dateFilter || this.dateFilter(date, MtxDatetimepickerFilterType.MINUTE));
253
- this._minutes.push({
254
- value: i,
255
- displayValue: i === 0 ? '00' : minuteNames[i],
256
- enabled,
257
- top: CLOCK_RADIUS - Math.cos(radian) * CLOCK_OUTER_RADIUS - CLOCK_TICK_RADIUS,
258
- left: CLOCK_RADIUS + Math.sin(radian) * CLOCK_OUTER_RADIUS - CLOCK_TICK_RADIUS,
259
- });
260
- }
261
- }
262
- /**
263
- * Set Time
264
- * @param event
265
- */
266
- setTime(event) {
267
- const trigger = this._elementRef.nativeElement;
268
- const triggerRect = trigger.getBoundingClientRect();
269
- const width = trigger.offsetWidth;
270
- const height = trigger.offsetHeight;
271
- const { pageX, pageY } = getPointerPositionOnPage(event);
272
- const x = width / 2 - (pageX - triggerRect.left - window.pageXOffset);
273
- const y = height / 2 - (pageY - triggerRect.top - window.pageYOffset);
274
- let radian = Math.atan2(-x, y);
275
- const unit = Math.PI / (this._hourView ? 6 : this.interval ? 30 / this.interval : 30);
276
- const z = Math.sqrt(x * x + y * y);
277
- const outer = this._hourView &&
278
- z > (width * (CLOCK_OUTER_RADIUS / 100) + width * (CLOCK_INNER_RADIUS / 100)) / 2;
279
- if (radian < 0) {
280
- radian = Math.PI * 2 + radian;
281
- }
282
- let value = Math.round(radian / unit);
283
- let date;
284
- if (this._hourView) {
285
- if (this.twelvehour) {
286
- if (this.AMPM === 'AM') {
287
- value = value === 0 ? 12 : value;
288
- }
289
- else {
290
- // if we chosen 12 in PM, the value should be 0 for 0:00,
291
- // else we can safely add 12 to the final value
292
- value = value === 12 ? 0 : value + 12;
293
- }
294
- }
295
- else {
296
- if (value === 12) {
297
- value = 0;
298
- }
299
- value = outer ? (value === 0 ? 12 : value) : value === 0 ? 0 : value + 12;
300
- }
301
- date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), value, this._adapter.getMinute(this.activeDate));
302
- }
303
- else {
304
- if (this.interval) {
305
- value *= this.interval;
306
- }
307
- if (value === 60) {
308
- value = 0;
309
- }
310
- date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this._adapter.getHour(this.activeDate), value);
311
- }
312
- // if there is a dateFilter, check if the date is allowed if it is not then do not set/emit new date
313
- // https://github.com/ng-matero/extensions/issues/244
314
- if (this.dateFilter &&
315
- !this.dateFilter(date, this._hourView ? MtxDatetimepickerFilterType.HOUR : MtxDatetimepickerFilterType.MINUTE)) {
316
- return;
317
- }
318
- this._timeChanged = true;
319
- this.activeDate = date;
320
- this._changeDetectorRef.markForCheck();
321
- this.activeDateChange.emit(this.activeDate);
322
- }
323
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxClock, deps: [{ token: i0.ElementRef }, { token: i1.DatetimeAdapter }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
324
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: MtxClock, isStandalone: true, selector: "mtx-clock", inputs: { dateFilter: "dateFilter", interval: "interval", actionButtons: "actionButtons", twelvehour: ["twelvehour", "twelvehour", booleanAttribute], AMPM: "AMPM", activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", startView: "startView" }, outputs: { selectedChange: "selectedChange", activeDateChange: "activeDateChange", _userSelection: "_userSelection" }, host: { attributes: { "role": "clock" }, listeners: { "mousedown": "_pointerDown($event)", "touchstart": "_pointerDown($event)" }, classAttribute: "mtx-clock" }, exportAs: ["mtxClock"], usesOnChanges: true, ngImport: i0, template: "<div class=\"mtx-clock-wrapper\">\n <div class=\"mtx-clock-center\"></div>\n <div class=\"mtx-clock-hand\" [style]=\"_hand\"></div>\n <div class=\"mtx-clock-hours\" [class.active]=\"_hourView\">\n @for (item of _hours; track item.value) {\n <div\n class=\"mtx-clock-cell\"\n [class.mtx-clock-cell-disabled]=\"!item.enabled\"\n [class.mtx-clock-cell-selected]=\"_selectedHour === item.value\"\n [style.fontSize]=\"item.fontSize\"\n [style.left]=\"item.left+'%'\"\n [style.top]=\"item.top+'%'\">{{ item.displayValue }}</div>\n }\n </div>\n <div class=\"mtx-clock-minutes\" [class.active]=\"!_hourView\">\n @for (item of _minutes; track item.value) {\n <div\n class=\"mtx-clock-cell\"\n [class.mtx-clock-cell-disabled]=\"!item.enabled\"\n [class.mtx-clock-cell-selected]=\"_selectedMinute === item.value\"\n [style.left]=\"item.left+'%'\"\n [style.top]=\"item.top+'%'\">{{ item.displayValue }}</div>\n }\n </div>\n</div>\n", styles: [".mtx-clock{position:relative;display:block;min-width:224px;margin:12px;box-sizing:border-box;-webkit-user-select:none;user-select:none;touch-action:none;font-size:var(--mtx-datetimepicker-clock-text-size, var(--mat-app-title-small-size))}.mtx-clock-wrapper{position:relative;width:100%;height:0;padding-top:100%;border-radius:50%;background-color:var(--mtx-datetimepicker-clock-dial-background-color, var(--mat-app-surface-container-highest))}.mtx-clock-center{position:absolute;top:50%;left:50%;width:3%;height:3%;margin:-1.5%;border-radius:50%;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-app-primary))}.mtx-clock-hand{position:absolute;inset:0;width:2px;margin:0 auto;transform-origin:bottom;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-app-primary))}.mtx-clock-hand:before{content:\"\";position:absolute;top:-4px;left:-3px;width:8px;height:8px;border-radius:50%;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-app-primary))}.mtx-clock-hours,.mtx-clock-minutes{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;visibility:hidden;transition:.35s;transform:scale(1.2)}.mtx-clock-hours.active,.mtx-clock-minutes.active{opacity:1;visibility:visible;transform:scale(1)}.mtx-clock-minutes{transform:scale(.8)}.mtx-clock-cell{position:absolute;display:flex;width:14.1666%;height:14.1666%;justify-content:center;box-sizing:border-box;border-radius:50%;align-items:center;cursor:pointer;color:var(--mtx-datetimepicker-clock-cell-text-color, var(--mat-app-on-surface))}.mtx-clock-cell.mtx-clock-cell-selected{color:#fff;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-app-primary))}.mtx-clock-cell:not(.mtx-clock-cell-selected,.mtx-clock-cell-disabled):hover{background-color:var(--mtx-datetimepicker-clock-cell-hover-state-background-color)}.mtx-clock-cell.mtx-clock-cell-disabled{pointer-events:none;color:var(--mtx-datetimepicker-clock-cell-disabled-state-text-color)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
325
- }
326
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxClock, decorators: [{
327
- type: Component,
328
- args: [{ selector: 'mtx-clock', host: {
329
- 'role': 'clock',
330
- 'class': 'mtx-clock',
331
- '(mousedown)': '_pointerDown($event)',
332
- '(touchstart)': '_pointerDown($event)',
333
- }, exportAs: 'mtxClock', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"mtx-clock-wrapper\">\n <div class=\"mtx-clock-center\"></div>\n <div class=\"mtx-clock-hand\" [style]=\"_hand\"></div>\n <div class=\"mtx-clock-hours\" [class.active]=\"_hourView\">\n @for (item of _hours; track item.value) {\n <div\n class=\"mtx-clock-cell\"\n [class.mtx-clock-cell-disabled]=\"!item.enabled\"\n [class.mtx-clock-cell-selected]=\"_selectedHour === item.value\"\n [style.fontSize]=\"item.fontSize\"\n [style.left]=\"item.left+'%'\"\n [style.top]=\"item.top+'%'\">{{ item.displayValue }}</div>\n }\n </div>\n <div class=\"mtx-clock-minutes\" [class.active]=\"!_hourView\">\n @for (item of _minutes; track item.value) {\n <div\n class=\"mtx-clock-cell\"\n [class.mtx-clock-cell-disabled]=\"!item.enabled\"\n [class.mtx-clock-cell-selected]=\"_selectedMinute === item.value\"\n [style.left]=\"item.left+'%'\"\n [style.top]=\"item.top+'%'\">{{ item.displayValue }}</div>\n }\n </div>\n</div>\n", styles: [".mtx-clock{position:relative;display:block;min-width:224px;margin:12px;box-sizing:border-box;-webkit-user-select:none;user-select:none;touch-action:none;font-size:var(--mtx-datetimepicker-clock-text-size, var(--mat-app-title-small-size))}.mtx-clock-wrapper{position:relative;width:100%;height:0;padding-top:100%;border-radius:50%;background-color:var(--mtx-datetimepicker-clock-dial-background-color, var(--mat-app-surface-container-highest))}.mtx-clock-center{position:absolute;top:50%;left:50%;width:3%;height:3%;margin:-1.5%;border-radius:50%;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-app-primary))}.mtx-clock-hand{position:absolute;inset:0;width:2px;margin:0 auto;transform-origin:bottom;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-app-primary))}.mtx-clock-hand:before{content:\"\";position:absolute;top:-4px;left:-3px;width:8px;height:8px;border-radius:50%;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-app-primary))}.mtx-clock-hours,.mtx-clock-minutes{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;visibility:hidden;transition:.35s;transform:scale(1.2)}.mtx-clock-hours.active,.mtx-clock-minutes.active{opacity:1;visibility:visible;transform:scale(1)}.mtx-clock-minutes{transform:scale(.8)}.mtx-clock-cell{position:absolute;display:flex;width:14.1666%;height:14.1666%;justify-content:center;box-sizing:border-box;border-radius:50%;align-items:center;cursor:pointer;color:var(--mtx-datetimepicker-clock-cell-text-color, var(--mat-app-on-surface))}.mtx-clock-cell.mtx-clock-cell-selected{color:#fff;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-app-primary))}.mtx-clock-cell:not(.mtx-clock-cell-selected,.mtx-clock-cell-disabled):hover{background-color:var(--mtx-datetimepicker-clock-cell-hover-state-background-color)}.mtx-clock-cell.mtx-clock-cell-disabled{pointer-events:none;color:var(--mtx-datetimepicker-clock-cell-disabled-state-text-color)}\n"] }]
334
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.DatetimeAdapter }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
335
- type: Inject,
336
- args: [DOCUMENT]
337
- }] }], propDecorators: { dateFilter: [{
338
- type: Input
339
- }], interval: [{
340
- type: Input
341
- }], actionButtons: [{
342
- type: Input
343
- }], twelvehour: [{
344
- type: Input,
345
- args: [{ transform: booleanAttribute }]
346
- }], AMPM: [{
347
- type: Input
348
- }], selectedChange: [{
349
- type: Output
350
- }], activeDateChange: [{
351
- type: Output
352
- }], _userSelection: [{
353
- type: Output
354
- }], activeDate: [{
355
- type: Input
356
- }], selected: [{
357
- type: Input
358
- }], minDate: [{
359
- type: Input
360
- }], maxDate: [{
361
- type: Input
362
- }], startView: [{
363
- type: Input
364
- }] } });
365
- /** Returns whether an event is a touch event. */
366
- function isTouchEvent(event) {
367
- // This function is called for every pixel that the user has dragged so we need it to be
368
- // as fast as possible. Since we only bind mouse events and touch events, we can assume
369
- // that if the event's name starts with `t`, it's a touch event.
370
- return event.type[0] === 't';
371
- }
372
- /** Gets the coordinates of a touch or mouse event relative to the document. */
373
- function getPointerPositionOnPage(event) {
374
- let point;
375
- if (isTouchEvent(event)) {
376
- // `touches` will be empty for start/end events so we have to fall back to `changedTouches`.
377
- point = event.touches[0] || event.changedTouches[0];
378
- }
379
- else {
380
- point = event;
381
- }
382
- return point;
383
- }
384
19
 
385
20
  /**
386
21
  * Animations used by the Material datetimepicker.
@@ -433,6 +68,74 @@ function createMissingDateImplError(provider) {
433
68
  `custom implementation.`);
434
69
  }
435
70
 
71
+ var MtxDatetimepickerFilterType;
72
+ (function (MtxDatetimepickerFilterType) {
73
+ MtxDatetimepickerFilterType[MtxDatetimepickerFilterType["DATE"] = 0] = "DATE";
74
+ MtxDatetimepickerFilterType[MtxDatetimepickerFilterType["HOUR"] = 1] = "HOUR";
75
+ MtxDatetimepickerFilterType[MtxDatetimepickerFilterType["MINUTE"] = 2] = "MINUTE";
76
+ })(MtxDatetimepickerFilterType || (MtxDatetimepickerFilterType = {}));
77
+
78
+ class MtxDatetimepickerIntl {
79
+ constructor() {
80
+ /**
81
+ * Stream to emit from when labels are changed. Use this to notify components when the labels have
82
+ * changed after initialization.
83
+ */
84
+ this.changes = new Subject();
85
+ /** A label for the calendar popup (used by screen readers). */
86
+ this.calendarLabel = 'Calendar';
87
+ /** A label for the button used to open the calendar popup (used by screen readers). */
88
+ this.openCalendarLabel = 'Open calendar';
89
+ /** Label for the button used to close the calendar popup. */
90
+ this.closeCalendarLabel = 'Close calendar';
91
+ /** A label for the previous month button (used by screen readers). */
92
+ this.prevMonthLabel = 'Previous month';
93
+ /** A label for the next month button (used by screen readers). */
94
+ this.nextMonthLabel = 'Next month';
95
+ /** A label for the previous year button (used by screen readers). */
96
+ this.prevYearLabel = 'Previous year';
97
+ /** A label for the next year button (used by screen readers). */
98
+ this.nextYearLabel = 'Next year';
99
+ /** A label for the previous multi-year button (used by screen readers). */
100
+ this.prevMultiYearLabel = 'Previous 24 years';
101
+ /** A label for the next multi-year button (used by screen readers). */
102
+ this.nextMultiYearLabel = 'Next 24 years';
103
+ /** A label for the 'switch to month view' button (used by screen readers). */
104
+ this.switchToMonthViewLabel = 'Choose date';
105
+ /** A label for the 'switch to year view' button (used by screen readers). */
106
+ this.switchToYearViewLabel = 'Choose month';
107
+ /** A label for the 'switch to multi-year view' button (used by screen readers). */
108
+ this.switchToMultiYearViewLabel = 'Choose month and year';
109
+ /** A label for the first date of a range of dates (used by screen readers). */
110
+ this.startDateLabel = 'Start date';
111
+ /** A label for the last date of a range of dates (used by screen readers). */
112
+ this.endDateLabel = 'End date';
113
+ /** A label for the 'switch to clock hour view' button (used by screen readers). */
114
+ this.switchToClockHourViewLabel = 'Choose hour';
115
+ /** A label for the 'switch to clock minute view' button (used by screen readers). */
116
+ this.switchToClockMinuteViewLabel = 'Choose minute';
117
+ /** Label used for ok button within the manual time input. */
118
+ this.okLabel = 'OK';
119
+ /** Label used for cancel button within the manual time input. */
120
+ this.cancelLabel = 'Cancel';
121
+ }
122
+ /** Formats a range of years (used for visuals). */
123
+ formatYearRange(start, end) {
124
+ return `${start} \u2013 ${end}`;
125
+ }
126
+ /** Formats a label for a range of years (used by screen readers). */
127
+ formatYearRangeLabel(start, end) {
128
+ return `${start} to ${end}`;
129
+ }
130
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerIntl, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
131
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerIntl, providedIn: 'root' }); }
132
+ }
133
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerIntl, decorators: [{
134
+ type: Injectable,
135
+ args: [{ providedIn: 'root' }]
136
+ }] });
137
+
138
+ let uniqueIdCounter$1 = 0;
436
139
  /**
437
140
  * An internal class that represents the data corresponding to a single calendar cell.
438
141
  * @docs-private
@@ -443,6 +146,7 @@ class MtxCalendarCell {
443
146
  this.displayValue = displayValue;
444
147
  this.ariaLabel = ariaLabel;
445
148
  this.enabled = enabled;
149
+ this.id = uniqueIdCounter$1++;
446
150
  }
447
151
  }
448
152
  /**
@@ -451,6 +155,14 @@ class MtxCalendarCell {
451
155
  */
452
156
  class MtxCalendarBody {
453
157
  constructor() {
158
+ this._elementRef = inject(ElementRef);
159
+ this._ngZone = inject(NgZone);
160
+ this._injector = inject(Injector);
161
+ /**
162
+ * The aspect ratio (width / height) to use for the cells in the table. This aspect ratio will be
163
+ * maintained even as the table resizes.
164
+ */
165
+ this.cellAspectRatio = 1;
454
166
  /** The number of columns in the table. */
455
167
  this.numCols = 7;
456
168
  /** Whether to allow selection of disabled cells. */
@@ -459,88 +171,330 @@ class MtxCalendarBody {
459
171
  this.activeCell = 0;
460
172
  /** Emits when a new value is selected. */
461
173
  this.selectedValueChange = new EventEmitter();
462
- }
463
- /** The number of blank cells to put at the beginning for the first row. */
464
- get _firstRowOffset() {
465
- return this.rows && this.rows.length && this.rows[0].length
466
- ? this.numCols - this.rows[0].length
467
- : 0;
174
+ /**
175
+ * Tracking function for rows based on their identity. Ideally we would use some sort of
176
+ * key on the row, but that would require a breaking change for the `rows` input. We don't
177
+ * use the built-in identity tracking, because it logs warnings.
178
+ */
179
+ this._trackRow = (row) => row;
468
180
  }
469
181
  _cellClicked(cell) {
470
182
  if (!this.allowDisabledSelection && !cell.enabled) {
471
183
  return;
472
184
  }
473
- this.selectedValueChange.emit(cell.value);
474
- }
475
- _isActiveCell(rowIndex, colIndex) {
476
- let cellNumber = rowIndex * this.numCols + colIndex;
477
- // Account for the fact that the first row may not have as many cells.
478
- if (rowIndex) {
479
- cellNumber -= this._firstRowOffset;
185
+ this.selectedValueChange.emit(cell.value);
186
+ }
187
+ _emitActiveDateChange(cell, event) {
188
+ if (cell.enabled) {
189
+ // this.activeDateChange.emit({ value: cell.value, event });
190
+ }
191
+ }
192
+ _isActiveCell(rowIndex, colIndex) {
193
+ let cellNumber = rowIndex * this.numCols + colIndex;
194
+ // Account for the fact that the first row may not have as many cells.
195
+ if (rowIndex) {
196
+ cellNumber -= this._firstRowOffset;
197
+ }
198
+ return cellNumber === this.activeCell;
199
+ }
200
+ ngOnChanges(changes) {
201
+ const columnChanges = changes['numCols'];
202
+ const { rows, numCols } = this;
203
+ if (changes['rows'] || columnChanges) {
204
+ this._firstRowOffset = rows && rows.length && rows[0].length ? numCols - rows[0].length : 0;
205
+ }
206
+ if (changes['cellAspectRatio'] || columnChanges || !this._cellPadding) {
207
+ this._cellPadding = `${(50 * this.cellAspectRatio) / numCols}%`;
208
+ }
209
+ if (columnChanges || !this._cellWidth) {
210
+ this._cellWidth = `${100 / numCols}%`;
211
+ }
212
+ }
213
+ _focusActiveCell(movePreview = true) {
214
+ afterNextRender(() => {
215
+ setTimeout(() => {
216
+ const activeCell = this._elementRef.nativeElement.querySelector('.mtx-calendar-body-active');
217
+ if (activeCell) {
218
+ activeCell.focus();
219
+ }
220
+ });
221
+ }, { injector: this._injector });
222
+ }
223
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxCalendarBody, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
224
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.4", type: MtxCalendarBody, isStandalone: true, selector: "[mtx-calendar-body]", inputs: { label: "label", rows: "rows", cellAspectRatio: "cellAspectRatio", todayValue: "todayValue", selectedValue: "selectedValue", labelMinRequiredCells: "labelMinRequiredCells", numCols: "numCols", allowDisabledSelection: "allowDisabledSelection", activeCell: "activeCell" }, outputs: { selectedValueChange: "selectedValueChange" }, host: { attributes: { "role": "grid", "aria-readonly": "true" }, classAttribute: "mtx-calendar-body" }, exportAs: ["mtxCalendarBody"], usesOnChanges: true, ngImport: i0, template: "<!--\n If there's not enough space in the first row, create a separate label row. We mark this row as\n aria-hidden because we don't want it to be read out as one of the weeks in the month.\n-->\n@if (_firstRowOffset < labelMinRequiredCells) {\n <tr aria-hidden=\"true\">\n <td\n class=\"mtx-calendar-body-label\"\n [attr.colspan]=\"numCols\"\n [style.paddingTop]=\"_cellPadding\"\n [style.paddingBottom]=\"_cellPadding\"\n >\n {{ label }}\n </td>\n </tr>\n}\n\n<!-- Create the first row separately so we can include a special spacer cell. -->\n@for (row of rows; track _trackRow(row); let rowIndex = $index) {\n <tr role=\"row\">\n <!--\n This cell is purely decorative, but we can't put `aria-hidden` or `role=\"presentation\"` on it,\n because it throws off the week days for the rest of the row on NVDA. The aspect ratio of the\n table cells is maintained by setting the top and bottom padding as a percentage of the width\n (a variant of the trick described here: https://www.w3schools.com/howto/howto_css_aspect_ratio.asp).\n -->\n @if (rowIndex === 0 && _firstRowOffset) {\n <td\n class=\"mtx-calendar-body-label\"\n [attr.colspan]=\"_firstRowOffset\"\n [style.paddingTop]=\"_cellPadding\"\n [style.paddingBottom]=\"_cellPadding\"\n >\n {{ _firstRowOffset >= labelMinRequiredCells ? label : '' }}\n </td>\n }\n <!--\n Each gridcell in the calendar contains a button, which signals to assistive technology that the\n cell is interactable, as well as the selection state via `aria-pressed`. See #23476 for\n background.\n -->\n @for (item of row; track item.id; let colIndex = $index) {\n <td\n role=\"gridcell\"\n class=\"mtx-calendar-body-cell-container\"\n [style.width]=\"_cellWidth\"\n [style.paddingTop]=\"_cellPadding\"\n [style.paddingBottom]=\"_cellPadding\"\n [attr.data-mat-row]=\"rowIndex\"\n [attr.data-mat-col]=\"colIndex\"\n >\n <button\n type=\"button\"\n class=\"mtx-calendar-body-cell\"\n [tabindex]=\"_isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [class.mtx-calendar-body-disabled]=\"!item.enabled\"\n [class.mtx-calendar-body-active]=\"_isActiveCell(rowIndex, colIndex)\"\n [attr.aria-label]=\"item.ariaLabel\"\n [attr.aria-disabled]=\"!item.enabled || null\"\n (click)=\"_cellClicked(item)\"\n >\n <span\n class=\"mtx-calendar-body-cell-content mat-focus-indicator\"\n [class.mtx-calendar-body-selected]=\"selectedValue === item.value\"\n [class.mtx-calendar-body-today]=\"todayValue === item.value\"\n >\n {{ item.displayValue }}\n </span>\n </button>\n </td>\n }\n </tr>\n}\n", styles: [".mtx-calendar-body{min-width:224px}.mtx-calendar-body-today:not(.mtx-calendar-body-selected){border-color:var(--mtx-datetimepicker-calendar-date-today-outline-color, var(--mat-sys-primary))}.mtx-calendar-body-label{height:0;line-height:0;text-align:left;padding-left:4.7142857143%;padding-right:4.7142857143%;font-size:var(--mtx-datetimepicker-calendar-body-label-text-size, var(--mat-sys-title-small-size));font-weight:var(--mtx-datetimepicker-calendar-body-label-text-weight, var(--mat-sys-title-small-weight));color:var(--mtx-datetimepicker-calendar-body-label-text-color, var(--mat-sys-on-surface))}[dir=rtl] .mtx-calendar-body-label{text-align:right}.mtx-calendar-body-cell-container{position:relative;height:0;line-height:0}.mtx-calendar-body-cell{position:absolute;top:0;left:0;width:100%;height:100%;background:none;text-align:center;font-family:inherit;margin:0;font-family:var(--mtx-datetimepicker-calendar-text-font, var(--mat-sys-body-large-font));font-size:var(--mtx-datetimepicker-calendar-text-size, var(--mat-sys-body-large-size));-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent}.mtx-calendar-body-cell::-moz-focus-inner{border:0}.mtx-calendar-body-disabled{cursor:default;pointer-events:none}.mtx-calendar-body-disabled>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected){color:var(--mtx-datetimepicker-calendar-date-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mtx-calendar-body-disabled>.mtx-calendar-body-today:not(.mtx-calendar-body-selected){border-color:var(--mtx-datetimepicker-calendar-date-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media (forced-colors: active){.mtx-calendar-body-disabled{opacity:.5}}.mtx-calendar-body-cell-content{top:5%;left:5%;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:90%;height:90%;line-height:1;border:1px;border-style:solid;border-radius:999px;color:var(--mtx-datetimepicker-calendar-date-text-color, var(--mat-sys-on-surface));border-color:var(--mtx-datetimepicker-calendar-date-outline-color, transparent)}.mtx-calendar-body-cell-content.mat-focus-indicator{position:absolute}@media (forced-colors: active){.mtx-calendar-body-cell-content{border:none}}.cdk-keyboard-focused .mtx-calendar-body-active>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected),.cdk-program-focused .mtx-calendar-body-active>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected){background-color:var(--mtx-datetimepicker-calendar-date-focus-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}@media (hover: hover){.mtx-calendar-body-cell:not(.mtx-calendar-body-disabled):hover>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected){background-color:var(--mtx-datetimepicker-calendar-date-hover-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}}.mtx-calendar-body-selected{background-color:var(--mtx-datetimepicker-calendar-date-selected-state-background-color, var(--mat-sys-primary));color:var(--mtx-datetimepicker-calendar-date-selected-state-text-color, var(--mat-sys-on-primary))}.mtx-calendar-body-disabled>.mtx-calendar-body-selected{background-color:var(--mtx-datetimepicker-calendar-date-selected-disabled-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mtx-calendar-body-selected.mtx-calendar-body-today{box-shadow:inset 0 0 0 1px var(--mtx-datetimepicker-calendar-date-today-selected-state-outline-color, var(--mat-sys-primary))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
225
+ }
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxCalendarBody, decorators: [{
227
+ type: Component,
228
+ args: [{ selector: '[mtx-calendar-body]', host: {
229
+ 'class': 'mtx-calendar-body',
230
+ 'role': 'grid',
231
+ 'aria-readonly': 'true',
232
+ }, exportAs: 'mtxCalendarBody', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n If there's not enough space in the first row, create a separate label row. We mark this row as\n aria-hidden because we don't want it to be read out as one of the weeks in the month.\n-->\n@if (_firstRowOffset < labelMinRequiredCells) {\n <tr aria-hidden=\"true\">\n <td\n class=\"mtx-calendar-body-label\"\n [attr.colspan]=\"numCols\"\n [style.paddingTop]=\"_cellPadding\"\n [style.paddingBottom]=\"_cellPadding\"\n >\n {{ label }}\n </td>\n </tr>\n}\n\n<!-- Create the first row separately so we can include a special spacer cell. -->\n@for (row of rows; track _trackRow(row); let rowIndex = $index) {\n <tr role=\"row\">\n <!--\n This cell is purely decorative, but we can't put `aria-hidden` or `role=\"presentation\"` on it,\n because it throws off the week days for the rest of the row on NVDA. The aspect ratio of the\n table cells is maintained by setting the top and bottom padding as a percentage of the width\n (a variant of the trick described here: https://www.w3schools.com/howto/howto_css_aspect_ratio.asp).\n -->\n @if (rowIndex === 0 && _firstRowOffset) {\n <td\n class=\"mtx-calendar-body-label\"\n [attr.colspan]=\"_firstRowOffset\"\n [style.paddingTop]=\"_cellPadding\"\n [style.paddingBottom]=\"_cellPadding\"\n >\n {{ _firstRowOffset >= labelMinRequiredCells ? label : '' }}\n </td>\n }\n <!--\n Each gridcell in the calendar contains a button, which signals to assistive technology that the\n cell is interactable, as well as the selection state via `aria-pressed`. See #23476 for\n background.\n -->\n @for (item of row; track item.id; let colIndex = $index) {\n <td\n role=\"gridcell\"\n class=\"mtx-calendar-body-cell-container\"\n [style.width]=\"_cellWidth\"\n [style.paddingTop]=\"_cellPadding\"\n [style.paddingBottom]=\"_cellPadding\"\n [attr.data-mat-row]=\"rowIndex\"\n [attr.data-mat-col]=\"colIndex\"\n >\n <button\n type=\"button\"\n class=\"mtx-calendar-body-cell\"\n [tabindex]=\"_isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [class.mtx-calendar-body-disabled]=\"!item.enabled\"\n [class.mtx-calendar-body-active]=\"_isActiveCell(rowIndex, colIndex)\"\n [attr.aria-label]=\"item.ariaLabel\"\n [attr.aria-disabled]=\"!item.enabled || null\"\n (click)=\"_cellClicked(item)\"\n >\n <span\n class=\"mtx-calendar-body-cell-content mat-focus-indicator\"\n [class.mtx-calendar-body-selected]=\"selectedValue === item.value\"\n [class.mtx-calendar-body-today]=\"todayValue === item.value\"\n >\n {{ item.displayValue }}\n </span>\n </button>\n </td>\n }\n </tr>\n}\n", styles: [".mtx-calendar-body{min-width:224px}.mtx-calendar-body-today:not(.mtx-calendar-body-selected){border-color:var(--mtx-datetimepicker-calendar-date-today-outline-color, var(--mat-sys-primary))}.mtx-calendar-body-label{height:0;line-height:0;text-align:left;padding-left:4.7142857143%;padding-right:4.7142857143%;font-size:var(--mtx-datetimepicker-calendar-body-label-text-size, var(--mat-sys-title-small-size));font-weight:var(--mtx-datetimepicker-calendar-body-label-text-weight, var(--mat-sys-title-small-weight));color:var(--mtx-datetimepicker-calendar-body-label-text-color, var(--mat-sys-on-surface))}[dir=rtl] .mtx-calendar-body-label{text-align:right}.mtx-calendar-body-cell-container{position:relative;height:0;line-height:0}.mtx-calendar-body-cell{position:absolute;top:0;left:0;width:100%;height:100%;background:none;text-align:center;font-family:inherit;margin:0;font-family:var(--mtx-datetimepicker-calendar-text-font, var(--mat-sys-body-large-font));font-size:var(--mtx-datetimepicker-calendar-text-size, var(--mat-sys-body-large-size));-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:transparent}.mtx-calendar-body-cell::-moz-focus-inner{border:0}.mtx-calendar-body-disabled{cursor:default;pointer-events:none}.mtx-calendar-body-disabled>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected){color:var(--mtx-datetimepicker-calendar-date-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mtx-calendar-body-disabled>.mtx-calendar-body-today:not(.mtx-calendar-body-selected){border-color:var(--mtx-datetimepicker-calendar-date-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media (forced-colors: active){.mtx-calendar-body-disabled{opacity:.5}}.mtx-calendar-body-cell-content{top:5%;left:5%;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:90%;height:90%;line-height:1;border:1px;border-style:solid;border-radius:999px;color:var(--mtx-datetimepicker-calendar-date-text-color, var(--mat-sys-on-surface));border-color:var(--mtx-datetimepicker-calendar-date-outline-color, transparent)}.mtx-calendar-body-cell-content.mat-focus-indicator{position:absolute}@media (forced-colors: active){.mtx-calendar-body-cell-content{border:none}}.cdk-keyboard-focused .mtx-calendar-body-active>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected),.cdk-program-focused .mtx-calendar-body-active>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected){background-color:var(--mtx-datetimepicker-calendar-date-focus-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}@media (hover: hover){.mtx-calendar-body-cell:not(.mtx-calendar-body-disabled):hover>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected){background-color:var(--mtx-datetimepicker-calendar-date-hover-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}}.mtx-calendar-body-selected{background-color:var(--mtx-datetimepicker-calendar-date-selected-state-background-color, var(--mat-sys-primary));color:var(--mtx-datetimepicker-calendar-date-selected-state-text-color, var(--mat-sys-on-primary))}.mtx-calendar-body-disabled>.mtx-calendar-body-selected{background-color:var(--mtx-datetimepicker-calendar-date-selected-disabled-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mtx-calendar-body-selected.mtx-calendar-body-today{box-shadow:inset 0 0 0 1px var(--mtx-datetimepicker-calendar-date-today-selected-state-outline-color, var(--mat-sys-primary))}\n"] }]
233
+ }], propDecorators: { label: [{
234
+ type: Input
235
+ }], rows: [{
236
+ type: Input
237
+ }], cellAspectRatio: [{
238
+ type: Input
239
+ }], todayValue: [{
240
+ type: Input
241
+ }], selectedValue: [{
242
+ type: Input
243
+ }], labelMinRequiredCells: [{
244
+ type: Input
245
+ }], numCols: [{
246
+ type: Input
247
+ }], allowDisabledSelection: [{
248
+ type: Input
249
+ }], activeCell: [{
250
+ type: Input
251
+ }], selectedValueChange: [{
252
+ type: Output
253
+ }] } });
254
+
255
+ const DAYS_PER_WEEK = 7;
256
+ let uniqueIdCounter = 0;
257
+ /**
258
+ * An internal component used to display a single month in the datetimepicker.
259
+ * @docs-private
260
+ */
261
+ class MtxMonthView {
262
+ constructor() {
263
+ this._adapter = inject(DatetimeAdapter, { optional: true });
264
+ this._dir = inject(Directionality, { optional: true });
265
+ this._dateFormats = inject(MTX_DATETIME_FORMATS, { optional: true });
266
+ this.type = 'date';
267
+ /** Emits when a new date is selected. */
268
+ this.selectedChange = new EventEmitter();
269
+ /** Emits when any date is selected. */
270
+ this._userSelection = new EventEmitter();
271
+ /** Emits when any date is activated. */
272
+ this.activeDateChange = new EventEmitter();
273
+ /** The names of the weekdays. */
274
+ this._weekdays = [];
275
+ this._selected = null;
276
+ if (!this._adapter) {
277
+ throw createMissingDateImplError('DatetimeAdapter');
278
+ }
279
+ if (!this._dateFormats) {
280
+ throw createMissingDateImplError('MTX_DATETIME_FORMATS');
281
+ }
282
+ this._activeDate = this._adapter.today();
283
+ }
284
+ /**
285
+ * The date to display in this month view (everything other than the month and year is ignored).
286
+ */
287
+ get activeDate() {
288
+ return this._activeDate;
289
+ }
290
+ set activeDate(value) {
291
+ const oldActiveDate = this._activeDate;
292
+ this._activeDate = value || this._adapter.today();
293
+ if (oldActiveDate &&
294
+ this._activeDate &&
295
+ !this._adapter.sameMonthAndYear(oldActiveDate, this._activeDate)) {
296
+ this._init();
297
+ if (this._adapter.isInNextMonth(oldActiveDate, this._activeDate)) {
298
+ this.calendarState('right');
299
+ }
300
+ else {
301
+ this.calendarState('left');
302
+ }
303
+ }
304
+ }
305
+ /** The currently selected date. */
306
+ get selected() {
307
+ return this._selected;
308
+ }
309
+ set selected(value) {
310
+ this._selected = value;
311
+ this._selectedDate = this._getDateInCurrentMonth(this.selected);
312
+ }
313
+ ngAfterContentInit() {
314
+ this._init();
315
+ }
316
+ /** Handles when a new date is selected. */
317
+ _dateSelected(date) {
318
+ const dateObject = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), date, this._adapter.getHour(this.activeDate), this._adapter.getMinute(this.activeDate));
319
+ this.selectedChange.emit(dateObject);
320
+ this._activeDate = dateObject;
321
+ if (this.type === 'date') {
322
+ this._userSelection.emit();
323
+ }
324
+ }
325
+ _calendarStateDone() {
326
+ this._calendarState = '';
327
+ }
328
+ /** Initializes this month view. */
329
+ _init() {
330
+ this._selectedDate = this._getDateInCurrentMonth(this.selected);
331
+ this._todayDate = this._getDateInCurrentMonth(this._adapter.today());
332
+ const firstOfMonth = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), 1, this._adapter.getHour(this.activeDate), this._adapter.getMinute(this.activeDate));
333
+ this._firstWeekOffset =
334
+ (DAYS_PER_WEEK +
335
+ this._adapter.getDayOfWeek(firstOfMonth) -
336
+ this._adapter.getFirstDayOfWeek()) %
337
+ DAYS_PER_WEEK;
338
+ this._initWeekdays();
339
+ this._createWeekCells();
340
+ }
341
+ /** Initializes the weekdays. */
342
+ _initWeekdays() {
343
+ const firstDayOfWeek = this._adapter.getFirstDayOfWeek();
344
+ const narrowWeekdays = this._adapter.getDayOfWeekNames('narrow');
345
+ const longWeekdays = this._adapter.getDayOfWeekNames('long');
346
+ // Rotate the labels for days of the week based on the configured first day of the week.
347
+ const weekdays = longWeekdays.map((long, i) => {
348
+ return { long, narrow: narrowWeekdays[i], id: uniqueIdCounter++ };
349
+ });
350
+ this._weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));
351
+ }
352
+ /** Creates MdCalendarCells for the dates in this month. */
353
+ _createWeekCells() {
354
+ const daysInMonth = this._adapter.getNumDaysInMonth(this.activeDate);
355
+ const dateNames = this._adapter.getDateNames();
356
+ this._weeks = [[]];
357
+ for (let i = 0, cell = this._firstWeekOffset; i < daysInMonth; i++, cell++) {
358
+ if (cell === DAYS_PER_WEEK) {
359
+ this._weeks.push([]);
360
+ cell = 0;
361
+ }
362
+ const date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), i + 1, this._adapter.getHour(this.activeDate), this._adapter.getMinute(this.activeDate));
363
+ const enabled = !this.dateFilter || this.dateFilter(date);
364
+ const ariaLabel = this._adapter.format(date, this._dateFormats.display.dateA11yLabel);
365
+ this._weeks[this._weeks.length - 1].push(new MtxCalendarCell(i + 1, dateNames[i], ariaLabel, enabled));
366
+ }
367
+ }
368
+ /**
369
+ * Gets the date in this month that the given Date falls on.
370
+ * Returns null if the given Date is in another month.
371
+ */
372
+ _getDateInCurrentMonth(date) {
373
+ return date && this._adapter.sameMonthAndYear(date, this.activeDate)
374
+ ? this._adapter.getDate(date)
375
+ : null;
376
+ }
377
+ calendarState(direction) {
378
+ this._calendarState = direction;
379
+ }
380
+ /** Handles keydown events on the calendar body when calendar is in month view. */
381
+ _handleCalendarBodyKeydown(event) {
382
+ // TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent
383
+ // disabled ones from being selected. This may not be ideal, we should look into whether
384
+ // navigation should skip over disabled dates, and if so, how to implement that efficiently.
385
+ const oldActiveDate = this._activeDate;
386
+ const isRtl = this._isRtl();
387
+ switch (event.keyCode) {
388
+ case LEFT_ARROW:
389
+ this.activeDate = this._adapter.addCalendarDays(this._activeDate, isRtl ? 1 : -1);
390
+ break;
391
+ case RIGHT_ARROW:
392
+ this.activeDate = this._adapter.addCalendarDays(this._activeDate, isRtl ? -1 : 1);
393
+ break;
394
+ case UP_ARROW:
395
+ this.activeDate = this._adapter.addCalendarDays(this._activeDate, -7);
396
+ break;
397
+ case DOWN_ARROW:
398
+ this.activeDate = this._adapter.addCalendarDays(this._activeDate, 7);
399
+ break;
400
+ case HOME:
401
+ this.activeDate = this._adapter.addCalendarDays(this._activeDate, 1 - this._adapter.getDate(this._activeDate));
402
+ break;
403
+ case END:
404
+ this.activeDate = this._adapter.addCalendarDays(this._activeDate, this._adapter.getNumDaysInMonth(this._activeDate) -
405
+ this._adapter.getDate(this._activeDate));
406
+ break;
407
+ case PAGE_UP:
408
+ this.activeDate = event.altKey
409
+ ? this._adapter.addCalendarYears(this._activeDate, -1)
410
+ : this._adapter.addCalendarMonths(this._activeDate, -1);
411
+ break;
412
+ case PAGE_DOWN:
413
+ this.activeDate = event.altKey
414
+ ? this._adapter.addCalendarYears(this._activeDate, 1)
415
+ : this._adapter.addCalendarMonths(this._activeDate, 1);
416
+ break;
417
+ case ENTER:
418
+ case SPACE:
419
+ if (!this.dateFilter || this.dateFilter(this._activeDate)) {
420
+ this._dateSelected(this._adapter.getDate(this._activeDate));
421
+ // this._userSelection.emit();
422
+ // Prevent unexpected default actions such as form submission.
423
+ event.preventDefault();
424
+ }
425
+ return;
426
+ default:
427
+ // Don't prevent default or focus active cell on keys that we don't explicitly handle.
428
+ return;
429
+ }
430
+ if (this._adapter.compareDate(oldActiveDate, this.activeDate)) {
431
+ this.activeDateChange.emit(this.activeDate);
480
432
  }
481
- return cellNumber === this.activeCell;
433
+ this._focusActiveCell();
434
+ // Prevent unexpected default actions such as form submission.
435
+ event.preventDefault();
436
+ }
437
+ /** Focuses the active cell after the microtask queue is empty. */
438
+ _focusActiveCell(movePreview) {
439
+ this._mtxCalendarBody._focusActiveCell(movePreview);
440
+ }
441
+ /** Determines whether the user has the RTL layout direction. */
442
+ _isRtl() {
443
+ return this._dir && this._dir.value === 'rtl';
482
444
  }
483
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxCalendarBody, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
484
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: MtxCalendarBody, isStandalone: true, selector: "[mtx-calendar-body]", inputs: { label: "label", rows: "rows", todayValue: "todayValue", selectedValue: "selectedValue", labelMinRequiredCells: "labelMinRequiredCells", numCols: "numCols", allowDisabledSelection: "allowDisabledSelection", activeCell: "activeCell" }, outputs: { selectedValueChange: "selectedValueChange" }, host: { classAttribute: "mtx-calendar-body" }, exportAs: ["mtxCalendarBody"], ngImport: i0, template: "<!--\n If there's not enough space in the first row, create a separate label row. We mark this row as\n aria-hidden because we don't want it to be read out as one of the weeks in the month.\n-->\n@if (_firstRowOffset < labelMinRequiredCells) {\n <tr aria-hidden=\"true\">\n <td class=\"mtx-calendar-body-label\" [attr.colspan]=\"numCols\">{{ label }}</td>\n </tr>\n}\n\n<!-- Create the first row separately so we can include a special spacer cell. -->\n@for (row of rows; track row; let rowIndex = $index) {\n <tr role=\"row\">\n <!--\n We mark this cell as aria-hidden so it doesn't get read out as one of the days in the week.\n -->\n @if (rowIndex === 0 && _firstRowOffset) {\n <td\n class=\"mtx-calendar-body-label\" [attr.colspan]=\"_firstRowOffset\" aria-hidden=\"true\">\n {{ _firstRowOffset >= labelMinRequiredCells ? label : '' }}\n </td>\n }\n @for (item of row; track item; let colIndex = $index) {\n <td\n role=\"gridcell\"\n class=\"mtx-calendar-body-cell\"\n [class.mtx-calendar-body-active]=\"_isActiveCell(rowIndex, colIndex)\"\n [class.mtx-calendar-body-disabled]=\"!item.enabled\"\n [tabindex]=\"_isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [attr.data-mat-row]=\"rowIndex\"\n [attr.data-mat-col]=\"colIndex\"\n [attr.aria-label]=\"item.ariaLabel\"\n [attr.aria-disabled]=\"!item.enabled || null\"\n (click)=\"_cellClicked(item)\">\n <div class=\"mtx-calendar-body-cell-content\"\n [class.mtx-calendar-body-selected]=\"selectedValue === item.value\"\n [class.mtx-calendar-body-today]=\"todayValue === item.value\"\n [attr.aria-selected]=\"selectedValue === item.value\">\n {{ item.displayValue }}\n </div>\n </td>\n }\n </tr>\n}\n", styles: [".mtx-calendar-body{min-width:224px}.mtx-calendar-body-today:not(.mtx-calendar-body-selected){border-color:var(--mtx-datetimepicker-calendar-date-today-outline-color, var(--mat-app-primary))}.mtx-calendar-body-label{height:0;line-height:0;text-align:left;padding:7.1428571429% 4.7142857143%;font-size:var(--mtx-datetimepicker-calendar-body-label-text-size, var(--mat-app-title-small-size));font-weight:var(--mtx-datetimepicker-calendar-body-label-text-weight, var(--mat-app-title-small-weight));color:var(--mtx-datetimepicker-calendar-body-label-text-color, var(--mat-app-on-surface))}[dir=rtl] .mtx-calendar-body-label{text-align:right}.mtx-calendar-body-cell{position:relative;width:14.2857142857%;height:0;line-height:0;padding:7.1428571429% 0;text-align:center;outline:none;cursor:pointer}.mtx-calendar-body-disabled{cursor:default;pointer-events:none}.mtx-calendar-body-disabled>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected){color:var(--mtx-datetimepicker-calendar-date-disabled-state-text-color)}.mtx-calendar-body-disabled>.mtx-calendar-body-today:not(.mtx-calendar-body-selected){border-color:var(--mtx-datetimepicker-calendar-date-disabled-state-text-color)}.mtx-calendar-body-cell-content{position:absolute;top:5%;left:5%;display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:90%;height:90%;border:1px solid transparent;border-radius:999px;color:var(--mtx-datetimepicker-calendar-date-text-color, var(--mat-app-on-surface));border-color:var(--mtx-datetimepicker-calendar-date-outline-color)}.mtx-calendar-body-active>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected){background-color:var(--mtx-datetimepicker-calendar-date-focus-state-background-color)}@media (hover: hover){.mtx-calendar-body-cell:not(.mtx-calendar-body-disabled):hover>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected){background-color:var(--mtx-datetimepicker-calendar-date-hover-state-background-color)}}.mtx-calendar-body-selected{background-color:var(--mtx-datetimepicker-calendar-date-selected-state-background-color, var(--mat-app-primary));color:var(--mtx-datetimepicker-calendar-date-selected-state-text-color, var(--mat-app-on-primary))}.mtx-calendar-body-disabled>.mtx-calendar-body-selected{background-color:var(--mtx-datetimepicker-calendar-date-selected-disabled-state-background-color)}.mtx-calendar-body-selected.mtx-calendar-body-today{box-shadow:inset 0 0 0 1px var(--mtx-datetimepicker-calendar-date-today-selected-state-outline-color, var(--mat-app-primary))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
445
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxMonthView, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
446
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.4", type: MtxMonthView, isStandalone: true, selector: "mtx-month-view", inputs: { type: "type", dateFilter: "dateFilter", activeDate: "activeDate", selected: "selected" }, outputs: { selectedChange: "selectedChange", _userSelection: "_userSelection", activeDateChange: "activeDateChange" }, viewQueries: [{ propertyName: "_mtxCalendarBody", first: true, predicate: MtxCalendarBody, descendants: true }], exportAs: ["mtxMonthView"], ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<table class=\"mtx-calendar-table\" role=\"grid\">\n <thead class=\"mtx-calendar-table-header\">\n <tr>\n @for (day of _weekdays; track day.id) {\n <th [attr.aria-label]=\"day.long\">{{day.narrow}}</th>\n }\n </tr>\n </thead>\n <tbody mtx-calendar-body\n (@slideCalendar.done)=\"_calendarStateDone()\"\n [@slideCalendar]=\"_calendarState\"\n [rows]=\"_weeks\"\n [todayValue]=\"_todayDate!\"\n [activeCell]=\"_adapter.getDate(activeDate) - 1\"\n [selectedValue]=\"_selectedDate!\"\n (selectedValueChange)=\"_dateSelected($event)\"\n (keydown)=\"_handleCalendarBodyKeydown($event)\"></tbody>\n</table>\n", dependencies: [{ kind: "component", type: MtxCalendarBody, selector: "[mtx-calendar-body]", inputs: ["label", "rows", "cellAspectRatio", "todayValue", "selectedValue", "labelMinRequiredCells", "numCols", "allowDisabledSelection", "activeCell"], outputs: ["selectedValueChange"], exportAs: ["mtxCalendarBody"] }], animations: [mtxDatetimepickerAnimations.slideCalendar], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
485
447
  }
486
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxCalendarBody, decorators: [{
448
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxMonthView, decorators: [{
487
449
  type: Component,
488
- args: [{ selector: '[mtx-calendar-body]', host: {
489
- class: 'mtx-calendar-body',
490
- }, exportAs: 'mtxCalendarBody', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<!--\n If there's not enough space in the first row, create a separate label row. We mark this row as\n aria-hidden because we don't want it to be read out as one of the weeks in the month.\n-->\n@if (_firstRowOffset < labelMinRequiredCells) {\n <tr aria-hidden=\"true\">\n <td class=\"mtx-calendar-body-label\" [attr.colspan]=\"numCols\">{{ label }}</td>\n </tr>\n}\n\n<!-- Create the first row separately so we can include a special spacer cell. -->\n@for (row of rows; track row; let rowIndex = $index) {\n <tr role=\"row\">\n <!--\n We mark this cell as aria-hidden so it doesn't get read out as one of the days in the week.\n -->\n @if (rowIndex === 0 && _firstRowOffset) {\n <td\n class=\"mtx-calendar-body-label\" [attr.colspan]=\"_firstRowOffset\" aria-hidden=\"true\">\n {{ _firstRowOffset >= labelMinRequiredCells ? label : '' }}\n </td>\n }\n @for (item of row; track item; let colIndex = $index) {\n <td\n role=\"gridcell\"\n class=\"mtx-calendar-body-cell\"\n [class.mtx-calendar-body-active]=\"_isActiveCell(rowIndex, colIndex)\"\n [class.mtx-calendar-body-disabled]=\"!item.enabled\"\n [tabindex]=\"_isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [attr.data-mat-row]=\"rowIndex\"\n [attr.data-mat-col]=\"colIndex\"\n [attr.aria-label]=\"item.ariaLabel\"\n [attr.aria-disabled]=\"!item.enabled || null\"\n (click)=\"_cellClicked(item)\">\n <div class=\"mtx-calendar-body-cell-content\"\n [class.mtx-calendar-body-selected]=\"selectedValue === item.value\"\n [class.mtx-calendar-body-today]=\"todayValue === item.value\"\n [attr.aria-selected]=\"selectedValue === item.value\">\n {{ item.displayValue }}\n </div>\n </td>\n }\n </tr>\n}\n", styles: [".mtx-calendar-body{min-width:224px}.mtx-calendar-body-today:not(.mtx-calendar-body-selected){border-color:var(--mtx-datetimepicker-calendar-date-today-outline-color, var(--mat-app-primary))}.mtx-calendar-body-label{height:0;line-height:0;text-align:left;padding:7.1428571429% 4.7142857143%;font-size:var(--mtx-datetimepicker-calendar-body-label-text-size, var(--mat-app-title-small-size));font-weight:var(--mtx-datetimepicker-calendar-body-label-text-weight, var(--mat-app-title-small-weight));color:var(--mtx-datetimepicker-calendar-body-label-text-color, var(--mat-app-on-surface))}[dir=rtl] .mtx-calendar-body-label{text-align:right}.mtx-calendar-body-cell{position:relative;width:14.2857142857%;height:0;line-height:0;padding:7.1428571429% 0;text-align:center;outline:none;cursor:pointer}.mtx-calendar-body-disabled{cursor:default;pointer-events:none}.mtx-calendar-body-disabled>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected){color:var(--mtx-datetimepicker-calendar-date-disabled-state-text-color)}.mtx-calendar-body-disabled>.mtx-calendar-body-today:not(.mtx-calendar-body-selected){border-color:var(--mtx-datetimepicker-calendar-date-disabled-state-text-color)}.mtx-calendar-body-cell-content{position:absolute;top:5%;left:5%;display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:90%;height:90%;border:1px solid transparent;border-radius:999px;color:var(--mtx-datetimepicker-calendar-date-text-color, var(--mat-app-on-surface));border-color:var(--mtx-datetimepicker-calendar-date-outline-color)}.mtx-calendar-body-active>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected){background-color:var(--mtx-datetimepicker-calendar-date-focus-state-background-color)}@media (hover: hover){.mtx-calendar-body-cell:not(.mtx-calendar-body-disabled):hover>.mtx-calendar-body-cell-content:not(.mtx-calendar-body-selected){background-color:var(--mtx-datetimepicker-calendar-date-hover-state-background-color)}}.mtx-calendar-body-selected{background-color:var(--mtx-datetimepicker-calendar-date-selected-state-background-color, var(--mat-app-primary));color:var(--mtx-datetimepicker-calendar-date-selected-state-text-color, var(--mat-app-on-primary))}.mtx-calendar-body-disabled>.mtx-calendar-body-selected{background-color:var(--mtx-datetimepicker-calendar-date-selected-disabled-state-background-color)}.mtx-calendar-body-selected.mtx-calendar-body-today{box-shadow:inset 0 0 0 1px var(--mtx-datetimepicker-calendar-date-today-selected-state-outline-color, var(--mat-app-primary))}\n"] }]
491
- }], propDecorators: { label: [{
492
- type: Input
493
- }], rows: [{
494
- type: Input
495
- }], todayValue: [{
496
- type: Input
497
- }], selectedValue: [{
450
+ args: [{ selector: 'mtx-month-view', exportAs: 'mtxMonthView', animations: [mtxDatetimepickerAnimations.slideCalendar], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MtxCalendarBody], template: "<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<table class=\"mtx-calendar-table\" role=\"grid\">\n <thead class=\"mtx-calendar-table-header\">\n <tr>\n @for (day of _weekdays; track day.id) {\n <th [attr.aria-label]=\"day.long\">{{day.narrow}}</th>\n }\n </tr>\n </thead>\n <tbody mtx-calendar-body\n (@slideCalendar.done)=\"_calendarStateDone()\"\n [@slideCalendar]=\"_calendarState\"\n [rows]=\"_weeks\"\n [todayValue]=\"_todayDate!\"\n [activeCell]=\"_adapter.getDate(activeDate) - 1\"\n [selectedValue]=\"_selectedDate!\"\n (selectedValueChange)=\"_dateSelected($event)\"\n (keydown)=\"_handleCalendarBodyKeydown($event)\"></tbody>\n</table>\n" }]
451
+ }], ctorParameters: () => [], propDecorators: { type: [{
498
452
  type: Input
499
- }], labelMinRequiredCells: [{
500
- type: Input
501
- }], numCols: [{
453
+ }], dateFilter: [{
502
454
  type: Input
503
- }], allowDisabledSelection: [{
455
+ }], selectedChange: [{
456
+ type: Output
457
+ }], _userSelection: [{
458
+ type: Output
459
+ }], activeDateChange: [{
460
+ type: Output
461
+ }], _mtxCalendarBody: [{
462
+ type: ViewChild,
463
+ args: [MtxCalendarBody]
464
+ }], activeDate: [{
504
465
  type: Input
505
- }], activeCell: [{
466
+ }], selected: [{
506
467
  type: Input
507
- }], selectedValueChange: [{
508
- type: Output
509
468
  }] } });
510
469
 
511
- const DAYS_PER_WEEK = 7;
470
+ const yearsPerPage = 24;
471
+ const yearsPerRow = 4;
512
472
  /**
513
- * An internal component used to display a single month in the datetimepicker.
473
+ * An internal component used to display multiple years in the datetimepicker.
514
474
  * @docs-private
515
475
  */
516
- class MtxMonthView {
517
- constructor(_adapter, _dateFormats) {
518
- this._adapter = _adapter;
519
- this._dateFormats = _dateFormats;
476
+ class MtxMultiYearView {
477
+ constructor() {
478
+ this._adapter = inject(DatetimeAdapter, { optional: true });
479
+ this._dir = inject(Directionality, { optional: true });
480
+ this._dateFormats = inject(MTX_DATETIME_FORMATS, { optional: true });
520
481
  this.type = 'date';
521
- /** Emits when a new date is selected. */
482
+ /** Emits when a new month is selected. */
522
483
  this.selectedChange = new EventEmitter();
523
484
  /** Emits when any date is selected. */
524
485
  this._userSelection = new EventEmitter();
486
+ /** Emits when any date is activated. */
487
+ this.activeDateChange = new EventEmitter();
488
+ this._selected = null;
525
489
  if (!this._adapter) {
526
490
  throw createMissingDateImplError('DatetimeAdapter');
527
491
  }
528
492
  if (!this._dateFormats) {
529
493
  throw createMissingDateImplError('MTX_DATETIME_FORMATS');
530
494
  }
531
- const firstDayOfWeek = this._adapter.getFirstDayOfWeek();
532
- const narrowWeekdays = this._adapter.getDayOfWeekNames('narrow');
533
- const longWeekdays = this._adapter.getDayOfWeekNames('long');
534
- // Rotate the labels for days of the week based on the configured first day of the week.
535
- const weekdays = longWeekdays.map((long, i) => {
536
- return { long, narrow: narrowWeekdays[i] };
537
- });
538
- this._weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));
539
495
  this._activeDate = this._adapter.today();
540
496
  }
541
- /**
542
- * The date to display in this month view (everything other than the month and year is ignored).
543
- */
497
+ /** The date to display in this multi year view */
544
498
  get activeDate() {
545
499
  return this._activeDate;
546
500
  }
@@ -549,14 +503,8 @@ class MtxMonthView {
549
503
  this._activeDate = value || this._adapter.today();
550
504
  if (oldActiveDate &&
551
505
  this._activeDate &&
552
- !this._adapter.sameMonthAndYear(oldActiveDate, this._activeDate)) {
506
+ !isSameMultiYearView(this._adapter, oldActiveDate, this._activeDate, this.minDate, this.maxDate)) {
553
507
  this._init();
554
- if (this._adapter.isInNextMonth(oldActiveDate, this._activeDate)) {
555
- this.calendarState('right');
556
- }
557
- else {
558
- this.calendarState('left');
559
- }
560
508
  }
561
509
  }
562
510
  /** The currently selected date. */
@@ -565,123 +513,279 @@ class MtxMonthView {
565
513
  }
566
514
  set selected(value) {
567
515
  this._selected = value;
568
- this._selectedDate = this._getDateInCurrentMonth(this.selected);
516
+ this._selectedYear = this._selected && this._adapter.getYear(this._selected);
517
+ }
518
+ /** The minimum selectable date. */
519
+ get minDate() {
520
+ return this._minDate;
521
+ }
522
+ set minDate(value) {
523
+ this._minDate = this._getValidDateOrNull(this._adapter.deserialize(value));
524
+ }
525
+ /** The maximum selectable date. */
526
+ get maxDate() {
527
+ return this._maxDate;
528
+ }
529
+ set maxDate(value) {
530
+ this._maxDate = this._getValidDateOrNull(this._adapter.deserialize(value));
569
531
  }
570
532
  ngAfterContentInit() {
571
533
  this._init();
572
534
  }
573
- /** Handles when a new date is selected. */
574
- _dateSelected(date) {
575
- const dateObject = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), date, this._adapter.getHour(this.activeDate), this._adapter.getMinute(this.activeDate));
535
+ /** Handles when a new year is selected. */
536
+ _yearSelected(year) {
537
+ const month = this._adapter.getMonth(this.activeDate);
538
+ const normalizedDate = this._adapter.createDatetime(year, month, 1, 0, 0);
539
+ const dateObject = this._adapter.createDatetime(year, month, Math.min(this._adapter.getDate(this.activeDate), this._adapter.getNumDaysInMonth(normalizedDate)), this._adapter.getHour(this.activeDate), this._adapter.getMinute(this.activeDate));
576
540
  this.selectedChange.emit(dateObject);
577
541
  this._activeDate = dateObject;
578
- if (this.type === 'date') {
542
+ if (this.type === 'year') {
579
543
  this._userSelection.emit();
580
544
  }
581
545
  }
582
- _calendarStateDone() {
583
- this._calendarState = '';
546
+ _getActiveCell() {
547
+ return getActiveOffset(this._adapter, this.activeDate, this.minDate, this.maxDate);
584
548
  }
585
- /** Initializes this month view. */
549
+ /** Initializes this year view. */
586
550
  _init() {
587
- this._selectedDate = this._getDateInCurrentMonth(this.selected);
588
- this._todayDate = this._getDateInCurrentMonth(this._adapter.today());
589
- const firstOfMonth = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), 1, this._adapter.getHour(this.activeDate), this._adapter.getMinute(this.activeDate));
590
- this._firstWeekOffset =
591
- (DAYS_PER_WEEK +
592
- this._adapter.getDayOfWeek(firstOfMonth) -
593
- this._adapter.getFirstDayOfWeek()) %
594
- DAYS_PER_WEEK;
595
- this._createWeekCells();
551
+ this._todayYear = this._adapter.getYear(this._adapter.today());
552
+ this._yearLabel = this._adapter.getYearName(this.activeDate);
553
+ const activeYear = this._adapter.getYear(this.activeDate);
554
+ const minYearOfPage = activeYear - getActiveOffset(this._adapter, this.activeDate, this.minDate, this.maxDate);
555
+ this._years = [];
556
+ for (let i = 0, row = []; i < yearsPerPage; i++) {
557
+ row.push(minYearOfPage + i);
558
+ if (row.length === yearsPerRow) {
559
+ this._years.push(row.map(year => this._createCellForYear(year)));
560
+ row = [];
561
+ }
562
+ }
596
563
  }
597
- /** Creates MdCalendarCells for the dates in this month. */
598
- _createWeekCells() {
599
- const daysInMonth = this._adapter.getNumDaysInMonth(this.activeDate);
600
- const dateNames = this._adapter.getDateNames();
601
- this._weeks = [[]];
602
- for (let i = 0, cell = this._firstWeekOffset; i < daysInMonth; i++, cell++) {
603
- if (cell === DAYS_PER_WEEK) {
604
- this._weeks.push([]);
605
- cell = 0;
564
+ /** Creates an MtxCalendarCell for the given year. */
565
+ _createCellForYear(year) {
566
+ const yearName = this._adapter.getYearName(this._adapter.createDate(year, 0, 1));
567
+ return new MtxCalendarCell(year, yearName, yearName, this._shouldEnableYear(year));
568
+ }
569
+ /** Whether the given year is enabled. */
570
+ _shouldEnableYear(year) {
571
+ // disable if the year is greater than maxDate lower than minDate
572
+ if (year === undefined ||
573
+ year === null ||
574
+ (this.maxDate && year > this._adapter.getYear(this.maxDate)) ||
575
+ (this.minDate && year < this._adapter.getYear(this.minDate))) {
576
+ return false;
577
+ }
578
+ // enable if it reaches here and there's no filter defined
579
+ if (!this.dateFilter) {
580
+ return true;
581
+ }
582
+ const firstOfYear = this._adapter.createDate(year, 0, 1);
583
+ // If any date in the year is enabled count the year as enabled.
584
+ for (let date = firstOfYear; this._adapter.getYear(date) === year; date = this._adapter.addCalendarDays(date, 1)) {
585
+ if (this.dateFilter(date)) {
586
+ return true;
606
587
  }
607
- const date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), i + 1, this._adapter.getHour(this.activeDate), this._adapter.getMinute(this.activeDate));
608
- const enabled = !this.dateFilter || this.dateFilter(date);
609
- const ariaLabel = this._adapter.format(date, this._dateFormats.display.dateA11yLabel);
610
- this._weeks[this._weeks.length - 1].push(new MtxCalendarCell(i + 1, dateNames[i], ariaLabel, enabled));
611
588
  }
589
+ return false;
612
590
  }
613
591
  /**
614
- * Gets the date in this month that the given Date falls on.
615
- * Returns null if the given Date is in another month.
592
+ * @param obj The object to check.
593
+ * @returns The given object if it is both a date instance and valid, otherwise null.
616
594
  */
617
- _getDateInCurrentMonth(date) {
618
- return this._adapter.sameMonthAndYear(date, this.activeDate)
619
- ? this._adapter.getDate(date)
620
- : null;
595
+ _getValidDateOrNull(obj) {
596
+ return this._adapter.isDateInstance(obj) && this._adapter.isValid(obj) ? obj : null;
597
+ }
598
+ /** Handles keydown events on the calendar body when calendar is in multi-year view. */
599
+ _handleCalendarBodyKeydown(event) {
600
+ const oldActiveDate = this._activeDate;
601
+ const isRtl = this._isRtl();
602
+ switch (event.keyCode) {
603
+ case LEFT_ARROW:
604
+ this.activeDate = this._adapter.addCalendarYears(this._activeDate, isRtl ? 1 : -1);
605
+ break;
606
+ case RIGHT_ARROW:
607
+ this.activeDate = this._adapter.addCalendarYears(this._activeDate, isRtl ? -1 : 1);
608
+ break;
609
+ case UP_ARROW:
610
+ this.activeDate = this._adapter.addCalendarYears(this._activeDate, -yearsPerRow);
611
+ break;
612
+ case DOWN_ARROW:
613
+ this.activeDate = this._adapter.addCalendarYears(this._activeDate, yearsPerRow);
614
+ break;
615
+ case HOME:
616
+ this.activeDate = this._adapter.addCalendarYears(this._activeDate, -getActiveOffset(this._adapter, this._activeDate, this.minDate, this.maxDate));
617
+ break;
618
+ case END:
619
+ this.activeDate = this._adapter.addCalendarYears(this._activeDate, yearsPerPage -
620
+ getActiveOffset(this._adapter, this._activeDate, this.minDate, this.maxDate) -
621
+ 1);
622
+ break;
623
+ case PAGE_UP:
624
+ this.activeDate = this._adapter.addCalendarYears(this._activeDate, event.altKey ? -yearsPerPage * 10 : -yearsPerPage);
625
+ break;
626
+ case PAGE_DOWN:
627
+ this.activeDate = this._adapter.addCalendarYears(this._activeDate, event.altKey ? yearsPerPage * 10 : yearsPerPage);
628
+ break;
629
+ case ENTER:
630
+ case SPACE:
631
+ this._yearSelected(this._adapter.getYear(this._activeDate));
632
+ break;
633
+ default:
634
+ // Don't prevent default or focus active cell on keys that we don't explicitly handle.
635
+ return;
636
+ }
637
+ if (this._adapter.compareDate(oldActiveDate, this.activeDate)) {
638
+ this.activeDateChange.emit(this.activeDate);
639
+ }
640
+ this._focusActiveCell();
641
+ // Prevent unexpected default actions such as form submission.
642
+ event.preventDefault();
643
+ }
644
+ /** Focuses the active cell after the microtask queue is empty. */
645
+ _focusActiveCell() {
646
+ this._mtxCalendarBody._focusActiveCell();
647
+ }
648
+ /** Determines whether the user has the RTL layout direction. */
649
+ _isRtl() {
650
+ return this._dir && this._dir.value === 'rtl';
651
+ }
652
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxMultiYearView, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
653
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.4", type: MtxMultiYearView, isStandalone: true, selector: "mtx-multi-year-view", inputs: { type: "type", dateFilter: "dateFilter", activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate" }, outputs: { selectedChange: "selectedChange", _userSelection: "_userSelection", activeDateChange: "activeDateChange" }, viewQueries: [{ propertyName: "_mtxCalendarBody", first: true, predicate: MtxCalendarBody, descendants: true }], exportAs: ["mtxMultiYearView"], ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<table class=\"mtx-calendar-table\" role=\"grid\">\n <thead class=\"mtx-calendar-table-header\"></thead>\n <tbody mtx-calendar-body\n [rows]=\"_years\"\n [todayValue]=\"_todayYear\"\n [numCols]=\"4\"\n [cellAspectRatio]=\"4 / 7\"\n [activeCell]=\"_getActiveCell()\"\n [allowDisabledSelection]=\"true\"\n [selectedValue]=\"_selectedYear!\"\n (selectedValueChange)=\"_yearSelected($event)\"\n (keydown)=\"_handleCalendarBodyKeydown($event)\"></tbody>\n</table>\n", dependencies: [{ kind: "component", type: MtxCalendarBody, selector: "[mtx-calendar-body]", inputs: ["label", "rows", "cellAspectRatio", "todayValue", "selectedValue", "labelMinRequiredCells", "numCols", "allowDisabledSelection", "activeCell"], outputs: ["selectedValueChange"], exportAs: ["mtxCalendarBody"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
654
+ }
655
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxMultiYearView, decorators: [{
656
+ type: Component,
657
+ args: [{ selector: 'mtx-multi-year-view', exportAs: 'mtxMultiYearView', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MtxCalendarBody], template: "<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<table class=\"mtx-calendar-table\" role=\"grid\">\n <thead class=\"mtx-calendar-table-header\"></thead>\n <tbody mtx-calendar-body\n [rows]=\"_years\"\n [todayValue]=\"_todayYear\"\n [numCols]=\"4\"\n [cellAspectRatio]=\"4 / 7\"\n [activeCell]=\"_getActiveCell()\"\n [allowDisabledSelection]=\"true\"\n [selectedValue]=\"_selectedYear!\"\n (selectedValueChange)=\"_yearSelected($event)\"\n (keydown)=\"_handleCalendarBodyKeydown($event)\"></tbody>\n</table>\n" }]
658
+ }], ctorParameters: () => [], propDecorators: { type: [{
659
+ type: Input
660
+ }], dateFilter: [{
661
+ type: Input
662
+ }], selectedChange: [{
663
+ type: Output
664
+ }], _userSelection: [{
665
+ type: Output
666
+ }], activeDateChange: [{
667
+ type: Output
668
+ }], _mtxCalendarBody: [{
669
+ type: ViewChild,
670
+ args: [MtxCalendarBody]
671
+ }], activeDate: [{
672
+ type: Input
673
+ }], selected: [{
674
+ type: Input
675
+ }], minDate: [{
676
+ type: Input
677
+ }], maxDate: [{
678
+ type: Input
679
+ }] } });
680
+ function isSameMultiYearView(dateAdapter, date1, date2, minDate, maxDate) {
681
+ const year1 = dateAdapter.getYear(date1);
682
+ const year2 = dateAdapter.getYear(date2);
683
+ const startingYear = getStartingYear(dateAdapter, minDate, maxDate);
684
+ return (Math.floor((year1 - startingYear) / yearsPerPage) ===
685
+ Math.floor((year2 - startingYear) / yearsPerPage));
686
+ }
687
+ /**
688
+ * When the multi-year view is first opened, the active year will be in view.
689
+ * So we compute how many years are between the active year and the *slot* where our
690
+ * "startingYear" will render when paged into view.
691
+ */
692
+ function getActiveOffset(dateAdapter, activeDate, minDate, maxDate) {
693
+ const activeYear = dateAdapter.getYear(activeDate);
694
+ return euclideanModulo(activeYear - getStartingYear(dateAdapter, minDate, maxDate), yearsPerPage);
695
+ }
696
+ /**
697
+ * We pick a "starting" year such that either the maximum year would be at the end
698
+ * or the minimum year would be at the beginning of a page.
699
+ */
700
+ function getStartingYear(dateAdapter, minDate, maxDate) {
701
+ let startingYear = 0;
702
+ if (maxDate) {
703
+ const maxYear = dateAdapter.getYear(maxDate);
704
+ startingYear = maxYear - yearsPerPage + 1;
621
705
  }
622
- calendarState(direction) {
623
- this._calendarState = direction;
706
+ else if (minDate) {
707
+ startingYear = dateAdapter.getYear(minDate);
624
708
  }
625
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxMonthView, deps: [{ token: i1.DatetimeAdapter, optional: true }, { token: MTX_DATETIME_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
626
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: MtxMonthView, isStandalone: true, selector: "mtx-month-view", inputs: { type: "type", dateFilter: "dateFilter", activeDate: "activeDate", selected: "selected" }, outputs: { selectedChange: "selectedChange", _userSelection: "_userSelection" }, exportAs: ["mtxMonthView"], ngImport: i0, template: "<table class=\"mtx-calendar-table\" role=\"grid\">\n <thead class=\"mtx-calendar-table-header\">\n <tr>\n @for (day of _weekdays; track day) {\n <th [attr.aria-label]=\"day.long\">{{day.narrow}}</th>\n }\n </tr>\n </thead>\n <tbody mtx-calendar-body\n (@slideCalendar.done)=\"_calendarStateDone()\"\n [@slideCalendar]=\"_calendarState\"\n [rows]=\"_weeks\"\n [todayValue]=\"_todayDate!\"\n [activeCell]=\"_adapter.getDate(activeDate) - 1\"\n [selectedValue]=\"_selectedDate!\"\n (selectedValueChange)=\"_dateSelected($event)\"></tbody>\n</table>\n", dependencies: [{ kind: "component", type: MtxCalendarBody, selector: "[mtx-calendar-body]", inputs: ["label", "rows", "todayValue", "selectedValue", "labelMinRequiredCells", "numCols", "allowDisabledSelection", "activeCell"], outputs: ["selectedValueChange"], exportAs: ["mtxCalendarBody"] }], animations: [mtxDatetimepickerAnimations.slideCalendar], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
709
+ return startingYear;
710
+ }
711
+ /** Gets remainder that is non-negative, even if first number is negative */
712
+ function euclideanModulo(a, b) {
713
+ return ((a % b) + b) % b;
627
714
  }
628
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxMonthView, decorators: [{
629
- type: Component,
630
- args: [{ selector: 'mtx-month-view', exportAs: 'mtxMonthView', animations: [mtxDatetimepickerAnimations.slideCalendar], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MtxCalendarBody], template: "<table class=\"mtx-calendar-table\" role=\"grid\">\n <thead class=\"mtx-calendar-table-header\">\n <tr>\n @for (day of _weekdays; track day) {\n <th [attr.aria-label]=\"day.long\">{{day.narrow}}</th>\n }\n </tr>\n </thead>\n <tbody mtx-calendar-body\n (@slideCalendar.done)=\"_calendarStateDone()\"\n [@slideCalendar]=\"_calendarState\"\n [rows]=\"_weeks\"\n [todayValue]=\"_todayDate!\"\n [activeCell]=\"_adapter.getDate(activeDate) - 1\"\n [selectedValue]=\"_selectedDate!\"\n (selectedValueChange)=\"_dateSelected($event)\"></tbody>\n</table>\n" }]
631
- }], ctorParameters: () => [{ type: i1.DatetimeAdapter, decorators: [{
632
- type: Optional
633
- }] }, { type: undefined, decorators: [{
634
- type: Optional
635
- }, {
636
- type: Inject,
637
- args: [MTX_DATETIME_FORMATS]
638
- }] }], propDecorators: { type: [{
639
- type: Input
640
- }], dateFilter: [{
641
- type: Input
642
- }], selectedChange: [{
643
- type: Output
644
- }], _userSelection: [{
645
- type: Output
646
- }], activeDate: [{
647
- type: Input
648
- }], selected: [{
649
- type: Input
650
- }] } });
651
715
 
652
- const yearsPerPage = 24;
653
- const yearsPerRow = 4;
716
+ const activeEventOptions = normalizePassiveListenerOptions({ passive: false });
717
+ const CLOCK_RADIUS = 50;
718
+ const CLOCK_INNER_RADIUS = 27.5;
719
+ const CLOCK_OUTER_RADIUS = 41.25;
720
+ const CLOCK_TICK_RADIUS = 7.0833;
654
721
  /**
655
- * An internal component used to display multiple years in the datetimepicker.
722
+ * A clock that is used as part of the datetimepicker.
656
723
  * @docs-private
657
724
  */
658
- class MtxMultiYearView {
659
- constructor(_adapter, _dateFormats) {
660
- this._adapter = _adapter;
661
- this._dateFormats = _dateFormats;
662
- this.type = 'date';
663
- /** Emits when a new month is selected. */
725
+ class MtxClock {
726
+ constructor() {
727
+ this._elementRef = inject(ElementRef);
728
+ this._adapter = inject(DatetimeAdapter);
729
+ this._changeDetectorRef = inject(ChangeDetectorRef);
730
+ this._document = inject(DOCUMENT);
731
+ /** Step over minutes. */
732
+ this.interval = 1;
733
+ this.actionButtons = false;
734
+ /** Whether the clock uses 12 hour format. */
735
+ this.twelvehour = false;
736
+ /** Whether the time is now in AM or PM. */
737
+ this.AMPM = 'AM';
738
+ /** Emits when the currently selected date changes. */
664
739
  this.selectedChange = new EventEmitter();
740
+ /** Emits when any date is activated. */
741
+ this.activeDateChange = new EventEmitter();
665
742
  /** Emits when any date is selected. */
666
743
  this._userSelection = new EventEmitter();
667
- if (!this._adapter) {
668
- throw createMissingDateImplError('DatetimeAdapter');
669
- }
670
- if (!this._dateFormats) {
671
- throw createMissingDateImplError('MTX_DATETIME_FORMATS');
672
- }
673
- this._activeDate = this._adapter.today();
744
+ /** Whether the clock is in hour view. */
745
+ this._hourView = true;
746
+ this._hours = [];
747
+ this._minutes = [];
748
+ this._timeChanged = false;
749
+ /** Called when the user has put their pointer down on the clock. */
750
+ this._pointerDown = (event) => {
751
+ this._timeChanged = false;
752
+ this.setTime(event);
753
+ this._bindGlobalEvents(event);
754
+ };
755
+ /**
756
+ * Called when the user has moved their pointer after
757
+ * starting to drag. Bound on the document level.
758
+ */
759
+ this._pointerMove = (event) => {
760
+ if (event.cancelable) {
761
+ event.preventDefault();
762
+ }
763
+ this.setTime(event);
764
+ };
765
+ /** Called when the user has lifted their pointer. Bound on the document level. */
766
+ this._pointerUp = (event) => {
767
+ if (event.cancelable) {
768
+ event.preventDefault();
769
+ }
770
+ this._removeGlobalEvents();
771
+ if (this._timeChanged) {
772
+ this.selectedChange.emit(this.activeDate);
773
+ if (this.actionButtons || !this._hourView) {
774
+ this._userSelection.emit();
775
+ }
776
+ }
777
+ };
674
778
  }
675
- /** The date to display in this multi year view */
779
+ /**
780
+ * The date to display in this clock view.
781
+ */
676
782
  get activeDate() {
677
783
  return this._activeDate;
678
784
  }
679
785
  set activeDate(value) {
680
786
  const oldActiveDate = this._activeDate;
681
- this._activeDate = value || this._adapter.today();
682
- if (oldActiveDate &&
683
- this._activeDate &&
684
- !isSameMultiYearView(this._adapter, oldActiveDate, this._activeDate, this.minDate, this.maxDate)) {
787
+ this._activeDate = this._adapter.clampDate(value, this.minDate, this.maxDate);
788
+ if (!this._adapter.sameMinute(oldActiveDate, this._activeDate)) {
685
789
  this._init();
686
790
  }
687
791
  }
@@ -690,126 +794,245 @@ class MtxMultiYearView {
690
794
  return this._selected;
691
795
  }
692
796
  set selected(value) {
693
- this._selected = value;
694
- this._selectedYear = this._selected && this._adapter.getYear(this._selected);
797
+ this._selected = this._adapter.getValidDateOrNull(this._adapter.deserialize(value));
798
+ if (this._selected) {
799
+ this.activeDate = this._selected;
800
+ }
695
801
  }
696
802
  /** The minimum selectable date. */
697
803
  get minDate() {
698
804
  return this._minDate;
699
805
  }
700
806
  set minDate(value) {
701
- this._minDate = this._getValidDateOrNull(this._adapter.deserialize(value));
807
+ this._minDate = this._adapter.getValidDateOrNull(this._adapter.deserialize(value));
702
808
  }
703
809
  /** The maximum selectable date. */
704
810
  get maxDate() {
705
811
  return this._maxDate;
706
812
  }
707
813
  set maxDate(value) {
708
- this._maxDate = this._getValidDateOrNull(this._adapter.deserialize(value));
814
+ this._maxDate = this._adapter.getValidDateOrNull(this._adapter.deserialize(value));
815
+ }
816
+ /** Whether the clock should be started in hour or minute view. */
817
+ set startView(value) {
818
+ this._hourView = value !== 'minute';
819
+ }
820
+ get _hand() {
821
+ const hour = this._adapter.getHour(this.activeDate);
822
+ this._selectedHour = hour;
823
+ this._selectedMinute = this._adapter.getMinute(this.activeDate);
824
+ let deg = 0;
825
+ let radius = CLOCK_OUTER_RADIUS;
826
+ if (this._hourView) {
827
+ const outer = this._selectedHour > 0 && this._selectedHour < 13;
828
+ radius = outer ? CLOCK_OUTER_RADIUS : CLOCK_INNER_RADIUS;
829
+ if (this.twelvehour) {
830
+ radius = CLOCK_OUTER_RADIUS;
831
+ }
832
+ deg = Math.round(this._selectedHour * (360 / (24 / 2)));
833
+ }
834
+ else {
835
+ deg = Math.round(this._selectedMinute * (360 / 60));
836
+ }
837
+ return {
838
+ height: `${radius}%`,
839
+ marginTop: `${50 - radius}%`,
840
+ transform: `rotate(${deg}deg)`,
841
+ };
709
842
  }
710
843
  ngAfterContentInit() {
844
+ this.activeDate = this._activeDate || this._adapter.today();
711
845
  this._init();
712
846
  }
713
- /** Handles when a new year is selected. */
714
- _yearSelected(year) {
715
- const month = this._adapter.getMonth(this.activeDate);
716
- const normalizedDate = this._adapter.createDatetime(year, month, 1, 0, 0);
717
- const dateObject = this._adapter.createDatetime(year, month, Math.min(this._adapter.getDate(this.activeDate), this._adapter.getNumDaysInMonth(normalizedDate)), this._adapter.getHour(this.activeDate), this._adapter.getMinute(this.activeDate));
718
- this.selectedChange.emit(dateObject);
719
- this._activeDate = dateObject;
720
- if (this.type === 'year') {
721
- this._userSelection.emit();
722
- }
847
+ ngOnDestroy() {
848
+ this._removeGlobalEvents();
723
849
  }
724
- _getActiveCell() {
725
- return getActiveOffset(this._adapter, this.activeDate, this.minDate, this.maxDate);
850
+ ngOnChanges() {
851
+ this._init();
726
852
  }
727
- _calendarStateDone() {
728
- this._calendarState = '';
853
+ /** Binds our global move and end events. */
854
+ _bindGlobalEvents(triggerEvent) {
855
+ // Note that we bind the events to the `document`, because it allows us to capture
856
+ // drag cancel events where the user's pointer is outside the browser window.
857
+ const document = this._document;
858
+ const isTouch = isTouchEvent(triggerEvent);
859
+ const moveEventName = isTouch ? 'touchmove' : 'mousemove';
860
+ const endEventName = isTouch ? 'touchend' : 'mouseup';
861
+ document.addEventListener(moveEventName, this._pointerMove, activeEventOptions);
862
+ document.addEventListener(endEventName, this._pointerUp, activeEventOptions);
863
+ if (isTouch) {
864
+ document.addEventListener('touchcancel', this._pointerUp, activeEventOptions);
865
+ }
729
866
  }
730
- /** Initializes this year view. */
867
+ /** Removes any global event listeners that we may have added. */
868
+ _removeGlobalEvents() {
869
+ const document = this._document;
870
+ document.removeEventListener('mousemove', this._pointerMove, activeEventOptions);
871
+ document.removeEventListener('mouseup', this._pointerUp, activeEventOptions);
872
+ document.removeEventListener('touchmove', this._pointerMove, activeEventOptions);
873
+ document.removeEventListener('touchend', this._pointerUp, activeEventOptions);
874
+ document.removeEventListener('touchcancel', this._pointerUp, activeEventOptions);
875
+ }
876
+ /** Initializes this clock view. */
731
877
  _init() {
732
- this._todayYear = this._adapter.getYear(this._adapter.today());
733
- this._yearLabel = this._adapter.getYearName(this.activeDate);
734
- const activeYear = this._adapter.getYear(this.activeDate);
735
- const minYearOfPage = activeYear - getActiveOffset(this._adapter, this.activeDate, this.minDate, this.maxDate);
736
- this._years = [];
737
- for (let i = 0, row = []; i < yearsPerPage; i++) {
738
- row.push(minYearOfPage + i);
739
- if (row.length === yearsPerRow) {
740
- this._years.push(row.map(year => this._createCellForYear(year)));
741
- row = [];
878
+ this._hours.length = 0;
879
+ this._minutes.length = 0;
880
+ const hourNames = this._adapter.getHourNames();
881
+ const minuteNames = this._adapter.getMinuteNames();
882
+ if (this.twelvehour) {
883
+ const hours = [];
884
+ for (let i = 0; i < hourNames.length; i++) {
885
+ const radian = (i / 6) * Math.PI;
886
+ const radius = CLOCK_OUTER_RADIUS;
887
+ const hour = i;
888
+ const date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), hour, 0);
889
+ // Check if the date is enabled, no need to respect the minute setting here
890
+ const enabled = (!this.minDate ||
891
+ this._adapter.compareDatetime(date, this.minDate, false) >= 0) &&
892
+ (!this.maxDate ||
893
+ this._adapter.compareDatetime(date, this.maxDate, false) <= 0) &&
894
+ (!this.dateFilter || this.dateFilter(date, MtxDatetimepickerFilterType.HOUR));
895
+ // display value for twelvehour clock should be from 1-12 not including 0 and not above 12
896
+ hours.push({
897
+ value: i,
898
+ displayValue: i % 12 === 0 ? '12' : hourNames[i % 12],
899
+ enabled,
900
+ top: CLOCK_RADIUS - Math.cos(radian) * radius - CLOCK_TICK_RADIUS,
901
+ left: CLOCK_RADIUS + Math.sin(radian) * radius - CLOCK_TICK_RADIUS,
902
+ });
903
+ }
904
+ // filter out AM or PM hours based on AMPM
905
+ if (this.AMPM === 'AM') {
906
+ this._hours = hours.filter(x => x.value < 12);
742
907
  }
908
+ else {
909
+ this._hours = hours.filter(x => x.value >= 12);
910
+ }
911
+ }
912
+ else {
913
+ for (let i = 0; i < hourNames.length; i++) {
914
+ const radian = (i / 6) * Math.PI;
915
+ const outer = i > 0 && i < 13;
916
+ const radius = outer ? CLOCK_OUTER_RADIUS : CLOCK_INNER_RADIUS;
917
+ const date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), i, 0);
918
+ // Check if the date is enabled, no need to respect the minute setting here
919
+ const enabled = (!this.minDate ||
920
+ this._adapter.compareDatetime(date, this.minDate, false) >= 0) &&
921
+ (!this.maxDate ||
922
+ this._adapter.compareDatetime(date, this.maxDate, false) <= 0) &&
923
+ (!this.dateFilter || this.dateFilter(date, MtxDatetimepickerFilterType.HOUR));
924
+ this._hours.push({
925
+ value: i,
926
+ displayValue: i === 0 ? '00' : hourNames[i],
927
+ enabled,
928
+ top: CLOCK_RADIUS - Math.cos(radian) * radius - CLOCK_TICK_RADIUS,
929
+ left: CLOCK_RADIUS + Math.sin(radian) * radius - CLOCK_TICK_RADIUS,
930
+ fontSize: i > 0 && i < 13 ? '' : '80%',
931
+ });
932
+ }
933
+ }
934
+ for (let i = 0; i < minuteNames.length; i += 5) {
935
+ const radian = (i / 30) * Math.PI;
936
+ const date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this._adapter.getHour(this.activeDate), i);
937
+ const enabled = (!this.minDate || this._adapter.compareDatetime(date, this.minDate) >= 0) &&
938
+ (!this.maxDate || this._adapter.compareDatetime(date, this.maxDate) <= 0) &&
939
+ (!this.dateFilter || this.dateFilter(date, MtxDatetimepickerFilterType.MINUTE));
940
+ this._minutes.push({
941
+ value: i,
942
+ displayValue: i === 0 ? '00' : minuteNames[i],
943
+ enabled,
944
+ top: CLOCK_RADIUS - Math.cos(radian) * CLOCK_OUTER_RADIUS - CLOCK_TICK_RADIUS,
945
+ left: CLOCK_RADIUS + Math.sin(radian) * CLOCK_OUTER_RADIUS - CLOCK_TICK_RADIUS,
946
+ });
743
947
  }
744
948
  }
745
- /** Creates an MtxCalendarCell for the given year. */
746
- _createCellForYear(year) {
747
- const yearName = this._adapter.getYearName(this._adapter.createDate(year, 0, 1));
748
- return new MtxCalendarCell(year, yearName, yearName, this._shouldEnableYear(year));
749
- }
750
- /** Whether the given year is enabled. */
751
- _shouldEnableYear(year) {
752
- // disable if the year is greater than maxDate lower than minDate
753
- if (year === undefined ||
754
- year === null ||
755
- (this.maxDate && year > this._adapter.getYear(this.maxDate)) ||
756
- (this.minDate && year < this._adapter.getYear(this.minDate))) {
757
- return false;
949
+ /**
950
+ * Set Time
951
+ * @param event
952
+ */
953
+ setTime(event) {
954
+ const trigger = this._elementRef.nativeElement;
955
+ const triggerRect = trigger.getBoundingClientRect();
956
+ const width = trigger.offsetWidth;
957
+ const height = trigger.offsetHeight;
958
+ const { pageX, pageY } = getPointerPositionOnPage(event);
959
+ const x = width / 2 - (pageX - triggerRect.left - window.pageXOffset);
960
+ const y = height / 2 - (pageY - triggerRect.top - window.pageYOffset);
961
+ let radian = Math.atan2(-x, y);
962
+ const unit = Math.PI / (this._hourView ? 6 : this.interval ? 30 / this.interval : 30);
963
+ const z = Math.sqrt(x * x + y * y);
964
+ const outer = this._hourView &&
965
+ z > (width * (CLOCK_OUTER_RADIUS / 100) + width * (CLOCK_INNER_RADIUS / 100)) / 2;
966
+ if (radian < 0) {
967
+ radian = Math.PI * 2 + radian;
758
968
  }
759
- // enable if it reaches here and there's no filter defined
760
- if (!this.dateFilter) {
761
- return true;
969
+ let value = Math.round(radian / unit);
970
+ let date;
971
+ if (this._hourView) {
972
+ if (this.twelvehour) {
973
+ if (this.AMPM === 'AM') {
974
+ value = value === 0 ? 12 : value;
975
+ }
976
+ else {
977
+ // if we chosen 12 in PM, the value should be 0 for 0:00,
978
+ // else we can safely add 12 to the final value
979
+ value = value === 12 ? 0 : value + 12;
980
+ }
981
+ }
982
+ else {
983
+ if (value === 12) {
984
+ value = 0;
985
+ }
986
+ value = outer ? (value === 0 ? 12 : value) : value === 0 ? 0 : value + 12;
987
+ }
988
+ date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), value, this._adapter.getMinute(this.activeDate));
762
989
  }
763
- const firstOfYear = this._adapter.createDate(year, 0, 1);
764
- // If any date in the year is enabled count the year as enabled.
765
- for (let date = firstOfYear; this._adapter.getYear(date) === year; date = this._adapter.addCalendarDays(date, 1)) {
766
- if (this.dateFilter(date)) {
767
- return true;
990
+ else {
991
+ if (this.interval) {
992
+ value *= this.interval;
993
+ }
994
+ if (value === 60) {
995
+ value = 0;
768
996
  }
997
+ date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this._adapter.getHour(this.activeDate), value);
769
998
  }
770
- return false;
771
- }
772
- /**
773
- * Gets the year in this years range that the given Date falls on.
774
- * Returns null if the given Date is not in this range.
775
- */
776
- _getYearInCurrentRange(date) {
777
- const year = this._adapter.getYear(date);
778
- return this._isInRange(year) ? year : null;
779
- }
780
- /**
781
- * Validate if the current year is in the current range
782
- * Returns true if is in range else returns false
783
- */
784
- _isInRange(year) {
785
- return true;
786
- }
787
- /**
788
- * @param obj The object to check.
789
- * @returns The given object if it is both a date instance and valid, otherwise null.
790
- */
791
- _getValidDateOrNull(obj) {
792
- return this._adapter.isDateInstance(obj) && this._adapter.isValid(obj) ? obj : null;
999
+ // if there is a dateFilter, check if the date is allowed if it is not then do not set/emit new date
1000
+ // https://github.com/ng-matero/extensions/issues/244
1001
+ if (this.dateFilter &&
1002
+ !this.dateFilter(date, this._hourView ? MtxDatetimepickerFilterType.HOUR : MtxDatetimepickerFilterType.MINUTE)) {
1003
+ return;
1004
+ }
1005
+ this._timeChanged = true;
1006
+ this.activeDate = date;
1007
+ this._changeDetectorRef.markForCheck();
1008
+ this.activeDateChange.emit(this.activeDate);
793
1009
  }
794
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxMultiYearView, deps: [{ token: i1.DatetimeAdapter, optional: true }, { token: MTX_DATETIME_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
795
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: MtxMultiYearView, isStandalone: true, selector: "mtx-multi-year-view", inputs: { type: "type", dateFilter: "dateFilter", activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate" }, outputs: { selectedChange: "selectedChange", _userSelection: "_userSelection" }, exportAs: ["mtxMultiYearView"], ngImport: i0, template: "<table class=\"mtx-calendar-table\" role=\"grid\">\n <thead class=\"mtx-calendar-table-header\"></thead>\n <tbody mtx-calendar-body\n (@slideCalendar.done)=\"_calendarStateDone()\"\n [@slideCalendar]=\"_calendarState\"\n [todayValue]=\"_todayYear\"\n [rows]=\"_years\"\n [numCols]=\"4\"\n [activeCell]=\"_getActiveCell()\"\n [allowDisabledSelection]=\"true\"\n [selectedValue]=\"_selectedYear!\"\n (selectedValueChange)=\"_yearSelected($event)\"></tbody>\n</table>\n", dependencies: [{ kind: "component", type: MtxCalendarBody, selector: "[mtx-calendar-body]", inputs: ["label", "rows", "todayValue", "selectedValue", "labelMinRequiredCells", "numCols", "allowDisabledSelection", "activeCell"], outputs: ["selectedValueChange"], exportAs: ["mtxCalendarBody"] }], animations: [mtxDatetimepickerAnimations.slideCalendar], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1010
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxClock, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1011
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.4", type: MtxClock, isStandalone: true, selector: "mtx-clock", inputs: { dateFilter: "dateFilter", interval: "interval", actionButtons: "actionButtons", twelvehour: ["twelvehour", "twelvehour", booleanAttribute], AMPM: "AMPM", activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", startView: "startView" }, outputs: { selectedChange: "selectedChange", activeDateChange: "activeDateChange", _userSelection: "_userSelection" }, host: { attributes: { "role": "clock" }, listeners: { "mousedown": "_pointerDown($event)", "touchstart": "_pointerDown($event)" }, classAttribute: "mtx-clock" }, exportAs: ["mtxClock"], usesOnChanges: true, ngImport: i0, template: "<div class=\"mtx-clock-wrapper\">\n <div class=\"mtx-clock-center\"></div>\n <div class=\"mtx-clock-hand\" [style]=\"_hand\"></div>\n <div class=\"mtx-clock-hours\" [class.active]=\"_hourView\">\n @for (item of _hours; track item.value) {\n <div\n class=\"mtx-clock-cell\"\n [class.mtx-clock-cell-disabled]=\"!item.enabled\"\n [class.mtx-clock-cell-selected]=\"_selectedHour === item.value\"\n [style.fontSize]=\"item.fontSize\"\n [style.left]=\"item.left+'%'\"\n [style.top]=\"item.top+'%'\">{{ item.displayValue }}</div>\n }\n </div>\n <div class=\"mtx-clock-minutes\" [class.active]=\"!_hourView\">\n @for (item of _minutes; track item.value) {\n <div\n class=\"mtx-clock-cell\"\n [class.mtx-clock-cell-disabled]=\"!item.enabled\"\n [class.mtx-clock-cell-selected]=\"_selectedMinute === item.value\"\n [style.left]=\"item.left+'%'\"\n [style.top]=\"item.top+'%'\">{{ item.displayValue }}</div>\n }\n </div>\n</div>\n", styles: [".mtx-clock{position:relative;display:block;min-width:224px;margin:12px;box-sizing:border-box;-webkit-user-select:none;user-select:none;touch-action:none;font-size:var(--mtx-datetimepicker-clock-text-size, var(--mat-sys-title-small-size))}.mtx-clock-wrapper{position:relative;width:100%;height:0;padding-top:100%;border-radius:50%;background-color:var(--mtx-datetimepicker-clock-dial-background-color, var(--mat-sys-surface-container-highest))}.mtx-clock-center{position:absolute;top:50%;left:50%;width:3%;height:3%;margin:-1.5%;border-radius:50%;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-sys-primary))}.mtx-clock-hand{position:absolute;inset:0;width:2px;margin:0 auto;transform-origin:bottom;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-sys-primary))}.mtx-clock-hand:before{content:\"\";position:absolute;top:-4px;left:-3px;width:8px;height:8px;border-radius:50%;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-sys-primary))}.mtx-clock-hours,.mtx-clock-minutes{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;visibility:hidden;transition:.35s;transform:scale(1.2)}.mtx-clock-hours.active,.mtx-clock-minutes.active{opacity:1;visibility:visible;transform:scale(1)}.mtx-clock-minutes{transform:scale(.8)}.mtx-clock-cell{position:absolute;display:flex;width:14.1666%;height:14.1666%;justify-content:center;box-sizing:border-box;border-radius:50%;align-items:center;cursor:pointer;color:var(--mtx-datetimepicker-clock-cell-text-color, var(--mat-sys-on-surface))}.mtx-clock-cell.mtx-clock-cell-selected{color:#fff;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-sys-primary))}.mtx-clock-cell:not(.mtx-clock-cell-selected,.mtx-clock-cell-disabled):hover{background-color:var(--mtx-datetimepicker-clock-cell-hover-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mtx-clock-cell.mtx-clock-cell-disabled{pointer-events:none;color:var(--mtx-datetimepicker-clock-cell-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
796
1012
  }
797
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxMultiYearView, decorators: [{
1013
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxClock, decorators: [{
798
1014
  type: Component,
799
- args: [{ selector: 'mtx-multi-year-view', exportAs: 'mtxMultiYearView', animations: [mtxDatetimepickerAnimations.slideCalendar], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MtxCalendarBody], template: "<table class=\"mtx-calendar-table\" role=\"grid\">\n <thead class=\"mtx-calendar-table-header\"></thead>\n <tbody mtx-calendar-body\n (@slideCalendar.done)=\"_calendarStateDone()\"\n [@slideCalendar]=\"_calendarState\"\n [todayValue]=\"_todayYear\"\n [rows]=\"_years\"\n [numCols]=\"4\"\n [activeCell]=\"_getActiveCell()\"\n [allowDisabledSelection]=\"true\"\n [selectedValue]=\"_selectedYear!\"\n (selectedValueChange)=\"_yearSelected($event)\"></tbody>\n</table>\n" }]
800
- }], ctorParameters: () => [{ type: i1.DatetimeAdapter, decorators: [{
801
- type: Optional
802
- }] }, { type: undefined, decorators: [{
803
- type: Optional
804
- }, {
805
- type: Inject,
806
- args: [MTX_DATETIME_FORMATS]
807
- }] }], propDecorators: { type: [{
1015
+ args: [{ selector: 'mtx-clock', host: {
1016
+ 'role': 'clock',
1017
+ 'class': 'mtx-clock',
1018
+ '(mousedown)': '_pointerDown($event)',
1019
+ '(touchstart)': '_pointerDown($event)',
1020
+ }, exportAs: 'mtxClock', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mtx-clock-wrapper\">\n <div class=\"mtx-clock-center\"></div>\n <div class=\"mtx-clock-hand\" [style]=\"_hand\"></div>\n <div class=\"mtx-clock-hours\" [class.active]=\"_hourView\">\n @for (item of _hours; track item.value) {\n <div\n class=\"mtx-clock-cell\"\n [class.mtx-clock-cell-disabled]=\"!item.enabled\"\n [class.mtx-clock-cell-selected]=\"_selectedHour === item.value\"\n [style.fontSize]=\"item.fontSize\"\n [style.left]=\"item.left+'%'\"\n [style.top]=\"item.top+'%'\">{{ item.displayValue }}</div>\n }\n </div>\n <div class=\"mtx-clock-minutes\" [class.active]=\"!_hourView\">\n @for (item of _minutes; track item.value) {\n <div\n class=\"mtx-clock-cell\"\n [class.mtx-clock-cell-disabled]=\"!item.enabled\"\n [class.mtx-clock-cell-selected]=\"_selectedMinute === item.value\"\n [style.left]=\"item.left+'%'\"\n [style.top]=\"item.top+'%'\">{{ item.displayValue }}</div>\n }\n </div>\n</div>\n", styles: [".mtx-clock{position:relative;display:block;min-width:224px;margin:12px;box-sizing:border-box;-webkit-user-select:none;user-select:none;touch-action:none;font-size:var(--mtx-datetimepicker-clock-text-size, var(--mat-sys-title-small-size))}.mtx-clock-wrapper{position:relative;width:100%;height:0;padding-top:100%;border-radius:50%;background-color:var(--mtx-datetimepicker-clock-dial-background-color, var(--mat-sys-surface-container-highest))}.mtx-clock-center{position:absolute;top:50%;left:50%;width:3%;height:3%;margin:-1.5%;border-radius:50%;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-sys-primary))}.mtx-clock-hand{position:absolute;inset:0;width:2px;margin:0 auto;transform-origin:bottom;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-sys-primary))}.mtx-clock-hand:before{content:\"\";position:absolute;top:-4px;left:-3px;width:8px;height:8px;border-radius:50%;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-sys-primary))}.mtx-clock-hours,.mtx-clock-minutes{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;visibility:hidden;transition:.35s;transform:scale(1.2)}.mtx-clock-hours.active,.mtx-clock-minutes.active{opacity:1;visibility:visible;transform:scale(1)}.mtx-clock-minutes{transform:scale(.8)}.mtx-clock-cell{position:absolute;display:flex;width:14.1666%;height:14.1666%;justify-content:center;box-sizing:border-box;border-radius:50%;align-items:center;cursor:pointer;color:var(--mtx-datetimepicker-clock-cell-text-color, var(--mat-sys-on-surface))}.mtx-clock-cell.mtx-clock-cell-selected{color:#fff;background-color:var(--mtx-datetimepicker-clock-hand-background-color, var(--mat-sys-primary))}.mtx-clock-cell:not(.mtx-clock-cell-selected,.mtx-clock-cell-disabled):hover{background-color:var(--mtx-datetimepicker-clock-cell-hover-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mtx-clock-cell.mtx-clock-cell-disabled{pointer-events:none;color:var(--mtx-datetimepicker-clock-cell-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}\n"] }]
1021
+ }], propDecorators: { dateFilter: [{
808
1022
  type: Input
809
- }], dateFilter: [{
1023
+ }], interval: [{
1024
+ type: Input
1025
+ }], actionButtons: [{
1026
+ type: Input
1027
+ }], twelvehour: [{
1028
+ type: Input,
1029
+ args: [{ transform: booleanAttribute }]
1030
+ }], AMPM: [{
810
1031
  type: Input
811
1032
  }], selectedChange: [{
812
1033
  type: Output
1034
+ }], activeDateChange: [{
1035
+ type: Output
813
1036
  }], _userSelection: [{
814
1037
  type: Output
815
1038
  }], activeDate: [{
@@ -820,102 +1043,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
820
1043
  type: Input
821
1044
  }], maxDate: [{
822
1045
  type: Input
1046
+ }], startView: [{
1047
+ type: Input
823
1048
  }] } });
824
- function isSameMultiYearView(dateAdapter, date1, date2, minDate, maxDate) {
825
- const year1 = dateAdapter.getYear(date1);
826
- const year2 = dateAdapter.getYear(date2);
827
- const startingYear = getStartingYear(dateAdapter, minDate, maxDate);
828
- return (Math.floor((year1 - startingYear) / yearsPerPage) ===
829
- Math.floor((year2 - startingYear) / yearsPerPage));
830
- }
831
- /**
832
- * When the multi-year view is first opened, the active year will be in view.
833
- * So we compute how many years are between the active year and the *slot* where our
834
- * "startingYear" will render when paged into view.
835
- */
836
- function getActiveOffset(dateAdapter, activeDate, minDate, maxDate) {
837
- const activeYear = dateAdapter.getYear(activeDate);
838
- return euclideanModulo(activeYear - getStartingYear(dateAdapter, minDate, maxDate), yearsPerPage);
839
- }
840
- /**
841
- * We pick a "starting" year such that either the maximum year would be at the end
842
- * or the minimum year would be at the beginning of a page.
843
- */
844
- function getStartingYear(dateAdapter, minDate, maxDate) {
845
- let startingYear = 0;
846
- if (maxDate) {
847
- const maxYear = dateAdapter.getYear(maxDate);
848
- startingYear = maxYear - yearsPerPage + 1;
849
- }
850
- else if (minDate) {
851
- startingYear = dateAdapter.getYear(minDate);
852
- }
853
- return startingYear;
854
- }
855
- /** Gets remainder that is non-negative, even if first number is negative */
856
- function euclideanModulo(a, b) {
857
- return ((a % b) + b) % b;
1049
+ /** Returns whether an event is a touch event. */
1050
+ function isTouchEvent(event) {
1051
+ // This function is called for every pixel that the user has dragged so we need it to be
1052
+ // as fast as possible. Since we only bind mouse events and touch events, we can assume
1053
+ // that if the event's name starts with `t`, it's a touch event.
1054
+ return event.type[0] === 't';
858
1055
  }
859
-
860
- class MtxDatetimepickerIntl {
861
- constructor() {
862
- /**
863
- * Stream to emit from when labels are changed. Use this to notify components when the labels have
864
- * changed after initialization.
865
- */
866
- this.changes = new Subject();
867
- /** A label for the calendar popup (used by screen readers). */
868
- this.calendarLabel = 'Calendar';
869
- /** A label for the button used to open the calendar popup (used by screen readers). */
870
- this.openCalendarLabel = 'Open calendar';
871
- /** Label for the button used to close the calendar popup. */
872
- this.closeCalendarLabel = 'Close calendar';
873
- /** A label for the previous month button (used by screen readers). */
874
- this.prevMonthLabel = 'Previous month';
875
- /** A label for the next month button (used by screen readers). */
876
- this.nextMonthLabel = 'Next month';
877
- /** A label for the previous year button (used by screen readers). */
878
- this.prevYearLabel = 'Previous year';
879
- /** A label for the next year button (used by screen readers). */
880
- this.nextYearLabel = 'Next year';
881
- /** A label for the previous multi-year button (used by screen readers). */
882
- this.prevMultiYearLabel = 'Previous 24 years';
883
- /** A label for the next multi-year button (used by screen readers). */
884
- this.nextMultiYearLabel = 'Next 24 years';
885
- /** A label for the 'switch to month view' button (used by screen readers). */
886
- this.switchToMonthViewLabel = 'Choose date';
887
- /** A label for the 'switch to year view' button (used by screen readers). */
888
- this.switchToYearViewLabel = 'Choose month';
889
- /** A label for the 'switch to multi-year view' button (used by screen readers). */
890
- this.switchToMultiYearViewLabel = 'Choose month and year';
891
- /** A label for the first date of a range of dates (used by screen readers). */
892
- this.startDateLabel = 'Start date';
893
- /** A label for the last date of a range of dates (used by screen readers). */
894
- this.endDateLabel = 'End date';
895
- /** A label for the 'switch to clock hour view' button (used by screen readers). */
896
- this.switchToClockHourViewLabel = 'Choose hour';
897
- /** A label for the 'switch to clock minute view' button (used by screen readers). */
898
- this.switchToClockMinuteViewLabel = 'Choose minute';
899
- /** Label used for ok button within the manual time input. */
900
- this.okLabel = 'OK';
901
- /** Label used for cancel button within the manual time input. */
902
- this.cancelLabel = 'Cancel';
903
- }
904
- /** Formats a range of years (used for visuals). */
905
- formatYearRange(start, end) {
906
- return `${start} \u2013 ${end}`;
1056
+ /** Gets the coordinates of a touch or mouse event relative to the document. */
1057
+ function getPointerPositionOnPage(event) {
1058
+ let point;
1059
+ if (isTouchEvent(event)) {
1060
+ // `touches` will be empty for start/end events so we have to fall back to `changedTouches`.
1061
+ point = event.touches[0] || event.changedTouches[0];
907
1062
  }
908
- /** Formats a label for a range of years (used by screen readers). */
909
- formatYearRangeLabel(start, end) {
910
- return `${start} to ${end}`;
1063
+ else {
1064
+ point = event;
911
1065
  }
912
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerIntl, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
913
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerIntl, providedIn: 'root' }); }
1066
+ return point;
914
1067
  }
915
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerIntl, decorators: [{
916
- type: Injectable,
917
- args: [{ providedIn: 'root' }]
918
- }] });
919
1068
 
920
1069
  function pad(num, size) {
921
1070
  num = String(num);
@@ -940,9 +1089,9 @@ class MtxTimeInput {
940
1089
  }
941
1090
  this.writePlaceholder(this._value);
942
1091
  }
943
- constructor(element, cdr) {
944
- this.element = element;
945
- this.cdr = cdr;
1092
+ constructor() {
1093
+ this.element = inject(ElementRef);
1094
+ this.cdr = inject(ChangeDetectorRef);
946
1095
  this._interval = 1;
947
1096
  this._min = 0;
948
1097
  this._max = Infinity;
@@ -1073,10 +1222,10 @@ class MtxTimeInput {
1073
1222
  this.inputElement.removeEventListener('keypress', this.keyPressListener);
1074
1223
  this.inputElement.removeEventListener('input', this.inputEventListener);
1075
1224
  }
1076
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxTimeInput, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
1077
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0", type: MtxTimeInput, isStandalone: true, selector: "input.mtx-time-input", inputs: { timeInterval: "timeInterval", timeMin: "timeMin", timeMax: "timeMax", timeValue: "timeValue" }, outputs: { timeValueChanged: "timeValueChanged" }, host: { listeners: { "blur": "blur($event)", "focus": "focus($event)" } }, exportAs: ["mtxTimeInput"], ngImport: i0 }); }
1225
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxTimeInput, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1226
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.4", type: MtxTimeInput, isStandalone: true, selector: "input.mtx-time-input", inputs: { timeInterval: "timeInterval", timeMin: "timeMin", timeMax: "timeMax", timeValue: "timeValue" }, outputs: { timeValueChanged: "timeValueChanged" }, host: { listeners: { "blur": "blur($event)", "focus": "focus($event)" } }, exportAs: ["mtxTimeInput"], ngImport: i0 }); }
1078
1227
  }
1079
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxTimeInput, decorators: [{
1228
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxTimeInput, decorators: [{
1080
1229
  type: Directive,
1081
1230
  args: [{
1082
1231
  selector: 'input.mtx-time-input',
@@ -1085,9 +1234,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
1085
1234
  '(focus)': 'focus($event)',
1086
1235
  },
1087
1236
  exportAs: 'mtxTimeInput',
1088
- standalone: true,
1089
1237
  }]
1090
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { timeInterval: [{
1238
+ }], ctorParameters: () => [], propDecorators: { timeInterval: [{
1091
1239
  type: Input,
1092
1240
  args: ['timeInterval']
1093
1241
  }], timeMin: [{
@@ -1102,7 +1250,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
1102
1250
  }], timeValueChanged: [{
1103
1251
  type: Output
1104
1252
  }] } });
1105
- class MtxTime {
1253
+ class MtxTimeView {
1106
1254
  /** The date to display in this clock view. */
1107
1255
  get activeDate() {
1108
1256
  return this._activeDate;
@@ -1179,10 +1327,11 @@ class MtxTime {
1179
1327
  }
1180
1328
  return String(value);
1181
1329
  }
1182
- constructor(_adapter, _changeDetectorRef, _datetimepickerIntl) {
1183
- this._adapter = _adapter;
1184
- this._changeDetectorRef = _changeDetectorRef;
1185
- this._datetimepickerIntl = _datetimepickerIntl;
1330
+ constructor() {
1331
+ this._adapter = inject(DatetimeAdapter);
1332
+ this._changeDetectorRef = inject(ChangeDetectorRef);
1333
+ this._elementRef = inject(ElementRef);
1334
+ this._datetimepickerIntl = inject(MtxDatetimepickerIntl);
1186
1335
  /** Emits when the currently selected date changes. */
1187
1336
  this.selectedChange = new EventEmitter();
1188
1337
  /** Emits when any date changes. */
@@ -1193,10 +1342,14 @@ class MtxTime {
1193
1342
  this.ampmChange = new EventEmitter();
1194
1343
  /** Emits when AM/PM button are clicked. */
1195
1344
  this.clockViewChange = new EventEmitter();
1345
+ /** Input for action buttons. */
1346
+ this.timeInput = false;
1196
1347
  /** Step over minutes. */
1197
1348
  this.interval = 1;
1198
1349
  /** Input for action buttons. */
1199
1350
  this.actionsPortal = null;
1351
+ /** Prevent user to select same date time */
1352
+ this.preventSameDateTimeSelection = false;
1200
1353
  /** Whether the time input should be auto-focused after view init. */
1201
1354
  this.autoFocus = true;
1202
1355
  /** Whether the clock uses 12 hour format. */
@@ -1213,30 +1366,58 @@ class MtxTime {
1213
1366
  // when clockView changes by input we should focus the correct input
1214
1367
  if (changes.clockView) {
1215
1368
  if (changes.clockView.currentValue !== changes.clockView.previousValue && this.autoFocus) {
1216
- this.focusInputElement();
1369
+ this._focusInputElement();
1217
1370
  }
1218
1371
  }
1219
1372
  }
1220
- ngAfterViewInit() {
1221
- if (this.autoFocus) {
1222
- this.focusInputElement();
1223
- }
1224
- }
1225
1373
  ngOnDestroy() {
1226
1374
  if (this.datetimepickerIntlChangesSubscription) {
1227
1375
  this.datetimepickerIntlChangesSubscription.unsubscribe();
1228
1376
  }
1229
1377
  }
1230
- focusInputElement() {
1378
+ /** Handles keydown events on the calendar body when calendar is in clock view. */
1379
+ _handleCalendarBodyKeydown(event) {
1380
+ const oldActiveDate = this._activeDate;
1381
+ switch (event.keyCode) {
1382
+ case UP_ARROW:
1383
+ this.selected =
1384
+ this._clockView === 'hour'
1385
+ ? this._adapter.addCalendarHours(this._activeDate, 1)
1386
+ : this._adapter.addCalendarMinutes(this._activeDate, this.interval);
1387
+ break;
1388
+ case DOWN_ARROW:
1389
+ this.selected =
1390
+ this._clockView === 'hour'
1391
+ ? this._adapter.addCalendarHours(this._activeDate, -1)
1392
+ : this._adapter.addCalendarMinutes(this._activeDate, -this.interval);
1393
+ break;
1394
+ case ENTER:
1395
+ case SPACE:
1396
+ if (this.timeInput && event.keyCode == SPACE) {
1397
+ return;
1398
+ }
1399
+ if (this.clockView == 'hour') {
1400
+ this._timeSelected(this._activeDate);
1401
+ this._focusInputElement();
1402
+ }
1403
+ else {
1404
+ this._userSelection.emit();
1405
+ }
1406
+ return;
1407
+ default:
1408
+ // Don't prevent default or focus active cell on keys that we don't explicitly handle.
1409
+ return;
1410
+ }
1411
+ this.selectedChange.emit(this.selected);
1412
+ // Prevent unexpected default actions such as form submission.
1413
+ event.preventDefault();
1414
+ }
1415
+ _focusInputElement() {
1231
1416
  if (this.clockView === 'hour') {
1232
- if (this.hourInputElement) {
1233
- this.hourInputElement.nativeElement.focus();
1234
- }
1417
+ this.hourInputElement?.nativeElement.focus();
1235
1418
  }
1236
1419
  else {
1237
- if (this.minuteInputElement) {
1238
- this.minuteInputElement.nativeElement.focus();
1239
- }
1420
+ this.minuteInputElement?.nativeElement.focus();
1240
1421
  }
1241
1422
  }
1242
1423
  _handleHourInputChange(value) {
@@ -1299,19 +1480,38 @@ class MtxTime {
1299
1480
  this.clockView = clockView;
1300
1481
  this.clockViewChange.emit(clockView);
1301
1482
  }
1302
- _timeSelected(date) {
1483
+ _dialTimeSelected(date) {
1303
1484
  if (this.clockView === 'hour') {
1304
- this.clockView = 'minute';
1485
+ this._activeDate = date;
1486
+ this._clockView = 'minute';
1487
+ }
1488
+ if (!this._adapter.sameDatetime(date, this.selected) || !this.preventSameDateTimeSelection) {
1489
+ this.selectedChange.emit(date);
1490
+ }
1491
+ }
1492
+ _timeSelected(date) {
1493
+ if (this.timeInput) {
1494
+ if (this.clockView === 'hour') {
1495
+ this.clockView = 'minute';
1496
+ }
1497
+ this._activeDate = this.selected = date;
1498
+ }
1499
+ else {
1500
+ this._dialTimeSelected(date);
1305
1501
  }
1306
- this._activeDate = this.selected = date;
1307
1502
  }
1308
1503
  _onActiveDateChange(date) {
1309
1504
  this._activeDate = date;
1310
1505
  this.activeDateChange.emit(date);
1311
1506
  }
1312
1507
  _handleSelection() {
1313
- if (this.actionsPortal && this._selected) {
1314
- this.selectedChange.emit(this._selected);
1508
+ if (this.timeInput) {
1509
+ if (this.actionsPortal && this._selected) {
1510
+ this.selectedChange.emit(this._selected);
1511
+ }
1512
+ }
1513
+ else {
1514
+ this._userSelection.emit();
1315
1515
  }
1316
1516
  }
1317
1517
  _handleOk() {
@@ -1323,15 +1523,28 @@ class MtxTime {
1323
1523
  _handleCancel() {
1324
1524
  this._userSelection.emit();
1325
1525
  }
1326
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxTime, deps: [{ token: i1.DatetimeAdapter }, { token: i0.ChangeDetectorRef }, { token: MtxDatetimepickerIntl }], target: i0.ɵɵFactoryTarget.Component }); }
1327
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: MtxTime, isStandalone: true, selector: "mtx-time", inputs: { dateFilter: "dateFilter", interval: "interval", actionsPortal: "actionsPortal", autoFocus: ["autoFocus", "autoFocus", booleanAttribute], twelvehour: ["twelvehour", "twelvehour", booleanAttribute], AMPM: "AMPM", activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", clockView: "clockView" }, outputs: { selectedChange: "selectedChange", activeDateChange: "activeDateChange", _userSelection: "_userSelection", ampmChange: "ampmChange", clockViewChange: "clockViewChange" }, host: { classAttribute: "mtx-time" }, viewQueries: [{ propertyName: "hourInputElement", first: true, predicate: ["hourInput"], descendants: true, read: (ElementRef) }, { propertyName: "hourInputDirective", first: true, predicate: ["hourInput"], descendants: true, read: MtxTimeInput }, { propertyName: "minuteInputElement", first: true, predicate: ["minuteInput"], descendants: true, read: (ElementRef) }, { propertyName: "minuteInputDirective", first: true, predicate: ["minuteInput"], descendants: true, read: MtxTimeInput }], exportAs: ["mtxTime"], usesOnChanges: true, ngImport: i0, template: "<div class=\"mtx-time-input-wrapper\">\n <div class=\"mtx-time-input-inner\">\n <input class=\"mtx-time-input\"\n [class.mtx-time-input-active]=\"clockView === 'hour'\"\n [class.mtx-time-input-warning]=\"!hourInput.valid\"\n #hourInput=\"mtxTimeInput\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [timeMin]=\"twelvehour ? 1 : 0\"\n [timeMax]=\"twelvehour ? 12 : 23\"\n [timeValue]=\"hour\"\n (timeValueChanged)=\"_handleHourInputChange($event)\"\n (focus)=\"_handleFocus('hour')\" />\n\n <div class=\"mtx-time-seperator\">:</div>\n\n <input class=\"mtx-time-input\"\n [class.mtx-time-input-active]=\"clockView === 'minute'\"\n [class.mtx-time-input-warning]=\"!minuteInput.valid\"\n #minuteInput=\"mtxTimeInput\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [timeMin]=\"0\"\n [timeMax]=\"59\"\n [timeValue]=\"minute\"\n (timeValueChanged)=\"_handleMinuteInputChange($event)\"\n [timeInterval]=\"interval\"\n (focus)=\"_handleFocus('minute')\" />\n\n @if (twelvehour) {\n <div class=\"mtx-time-ampm\">\n <button mat-button type=\"button\" class=\"mtx-time-am\"\n [class.mtx-time-ampm-active]=\"AMPM === 'AM'\" aria-label=\"AM\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"ampmChange.emit('AM')\">AM</button>\n <button mat-button type=\"button\" class=\"mtx-time-pm\"\n [class.mtx-time-ampm-active]=\"AMPM === 'PM'\" aria-label=\"PM\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"ampmChange.emit('PM')\">PM</button>\n </div>\n }\n </div>\n</div>\n\n<mtx-clock (selectedChange)=\"_timeSelected($event)\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (_userSelection)=\"_handleSelection()\"\n [AMPM]=\"AMPM\"\n [dateFilter]=\"dateFilter\"\n [actionButtons]=\"!!actionsPortal\"\n [interval]=\"interval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"selected\"\n [startView]=\"clockView\"\n [twelvehour]=\"twelvehour\">\n</mtx-clock>\n\n@if (!actionsPortal) {\n <div class=\"mtx-time-button-wrapper\">\n <button class=\"mtx-time-cancel-button\" mat-button type=\"button\" (click)=\"_handleCancel()\">\n {{ _datetimepickerIntl.cancelLabel }}\n </button>\n <button class=\"mtx-time-ok-button\" mat-button type=\"button\" (click)=\"_handleOk()\"\n [disabled]=\"minuteInputDirective?.invalid || hourInputDirective?.invalid\">\n {{ _datetimepickerIntl.okLabel }}\n </button>\n </div>\n}\n", styles: [".mtx-time{display:block;outline:none;-webkit-user-select:none;user-select:none}.mtx-time-input-wrapper{padding:8px 0;text-align:center}.mtx-time-input-inner{display:inline-flex;height:56px}.mtx-time-input{box-sizing:border-box;width:72px;height:100%;padding:0;font-size:36px;text-align:center;border:2px solid transparent;appearance:none;outline:none;border-radius:var(--mtx-datetimepicker-selector-container-shape, var(--mat-app-corner-small));background-color:var(--mtx-datetimepicker-time-input-background-color, var(--mat-app-surface-container-highest));color:var(--mtx-datetimepicker-time-input-text-color, var(--mat-app-on-surface))}.mtx-time-input.mtx-time-input-active{background-color:var(--mtx-datetimepicker-time-input-active-state-background-color, var(--mat-app-primary-container));color:var(--mtx-datetimepicker-time-input-active-state-text-color, var(--mat-app-on-primary-container))}.mtx-time-input.mtx-time-input-active:focus{border-color:var(--mtx-datetimepicker-time-input-focus-state-outline-color, var(--mat-app-primary));background-color:var(--mtx-datetimepicker-time-input-focus-state-background-color, var(--mat-app-primary-container))}.mtx-time-input.mtx-time-input-active:focus::placeholder{color:var(--mtx-datetimepicker-time-input-focus-state-placeholder-text-color, var(--mat-app-on-primary-container))}.mtx-time-input.mtx-time-input-warning{border-color:var(--mtx-datetimepicker-time-input-warn-state-outline-color, var(--mat-app-error))}.mtx-time-seperator{display:inline-flex;justify-content:center;align-items:center;width:24px;font-size:36px}.mtx-time-ampm{display:inline-flex;flex-direction:column;margin-left:12px}[dir=rtl] .mtx-time-ampm{margin-left:auto;margin-right:12px}.mtx-time-ampm .mtx-time-am,.mtx-time-ampm .mtx-time-pm{--mdc-text-button-label-text-weight: 400;flex:1;width:40px;min-width:auto;border-width:1px;border-style:solid;--mdc-text-button-label-text-color: var(--mtx-datetimepicker-time-ampm-text-color, var(--mat-app-on-surface));--mdc-text-button-container-shape: var(--mtx-datetimepicker-selector-container-shape, var(--mat-app-corner-small));border-color:var(--mtx-datetimepicker-time-ampm-outline-color, var(--mat-app-outline))}.mtx-time-ampm .mtx-time-am.mtx-time-ampm-active,.mtx-time-ampm .mtx-time-pm.mtx-time-ampm-active{--mdc-text-button-label-text-weight: 500;--mdc-text-button-label-text-color: var(--mtx-datetimepicker-time-ampm-selected-state-text-color, var(--mat-app-on-tertiary-container));background-color:var(--mtx-datetimepicker-time-ampm-selected-state-background-color, var(--mat-app-tertiary-container))}.mtx-time-ampm .mtx-time-am .mat-mdc-button-touch-target,.mtx-time-ampm .mtx-time-pm .mat-mdc-button-touch-target{height:100%}.mtx-time-ampm .mtx-time-am{border-bottom-left-radius:0;border-bottom-right-radius:0}.mtx-time-ampm .mtx-time-pm{border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.mtx-time-button-wrapper{display:flex;justify-content:flex-end;padding-top:8px}.mtx-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mtx-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MtxClock, selector: "mtx-clock", inputs: ["dateFilter", "interval", "actionButtons", "twelvehour", "AMPM", "activeDate", "selected", "minDate", "maxDate", "startView"], outputs: ["selectedChange", "activeDateChange", "_userSelection"], exportAs: ["mtxClock"] }, { kind: "directive", type: MtxTimeInput, selector: "input.mtx-time-input", inputs: ["timeInterval", "timeMin", "timeMax", "timeValue"], outputs: ["timeValueChanged"], exportAs: ["mtxTimeInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1526
+ /** Focuses the active cell after the microtask queue is empty. */
1527
+ _focusActiveCell() {
1528
+ if (this.timeInput) {
1529
+ if (this.autoFocus) {
1530
+ this._focusInputElement();
1531
+ }
1532
+ }
1533
+ else {
1534
+ this._elementRef.nativeElement.focus();
1535
+ }
1536
+ }
1537
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxTimeView, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1538
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.4", type: MtxTimeView, isStandalone: true, selector: "mtx-time-view", inputs: { dateFilter: "dateFilter", timeInput: ["timeInput", "timeInput", booleanAttribute], interval: "interval", actionsPortal: "actionsPortal", preventSameDateTimeSelection: ["preventSameDateTimeSelection", "preventSameDateTimeSelection", booleanAttribute], autoFocus: ["autoFocus", "autoFocus", booleanAttribute], twelvehour: ["twelvehour", "twelvehour", booleanAttribute], AMPM: "AMPM", activeDate: "activeDate", selected: "selected", minDate: "minDate", maxDate: "maxDate", clockView: "clockView" }, outputs: { selectedChange: "selectedChange", activeDateChange: "activeDateChange", _userSelection: "_userSelection", ampmChange: "ampmChange", clockViewChange: "clockViewChange" }, host: { attributes: { "tabindex": "0" }, listeners: { "keydown": "_handleCalendarBodyKeydown($event)" }, classAttribute: "mtx-time-view" }, viewQueries: [{ propertyName: "hourInputElement", first: true, predicate: ["hourInput"], descendants: true, read: (ElementRef) }, { propertyName: "hourInputDirective", first: true, predicate: ["hourInput"], descendants: true, read: MtxTimeInput }, { propertyName: "minuteInputElement", first: true, predicate: ["minuteInput"], descendants: true, read: (ElementRef) }, { propertyName: "minuteInputDirective", first: true, predicate: ["minuteInput"], descendants: true, read: MtxTimeInput }], exportAs: ["mtxTime"], usesOnChanges: true, ngImport: i0, template: "@if (timeInput) {\n <div class=\"mtx-time-input-wrapper\">\n <div class=\"mtx-time-input-inner\">\n <input class=\"mtx-time-input\"\n [class.mtx-time-input-active]=\"clockView === 'hour'\"\n [class.mtx-time-input-warning]=\"!hourInput.valid\"\n #hourInput=\"mtxTimeInput\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [timeMin]=\"twelvehour ? 1 : 0\"\n [timeMax]=\"twelvehour ? 12 : 23\"\n [timeValue]=\"hour\"\n (timeValueChanged)=\"_handleHourInputChange($event)\"\n (focus)=\"_handleFocus('hour')\" />\n\n <div class=\"mtx-time-seperator\">:</div>\n\n <input class=\"mtx-time-input\"\n [class.mtx-time-input-active]=\"clockView === 'minute'\"\n [class.mtx-time-input-warning]=\"!minuteInput.valid\"\n #minuteInput=\"mtxTimeInput\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [timeMin]=\"0\"\n [timeMax]=\"59\"\n [timeValue]=\"minute\"\n (timeValueChanged)=\"_handleMinuteInputChange($event)\"\n [timeInterval]=\"interval\"\n (focus)=\"_handleFocus('minute')\" />\n\n @if (twelvehour) {\n <div class=\"mtx-time-ampm\">\n <button mat-button type=\"button\" class=\"mtx-time-am\"\n [class.mtx-time-ampm-active]=\"AMPM === 'AM'\" aria-label=\"AM\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"ampmChange.emit('AM')\">AM</button>\n <button mat-button type=\"button\" class=\"mtx-time-pm\"\n [class.mtx-time-ampm-active]=\"AMPM === 'PM'\" aria-label=\"PM\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"ampmChange.emit('PM')\">PM</button>\n </div>\n }\n </div>\n </div>\n}\n\n<mtx-clock\n (selectedChange)=\"_timeSelected($event)\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (_userSelection)=\"_handleSelection()\"\n [AMPM]=\"AMPM\"\n [dateFilter]=\"dateFilter\"\n [actionButtons]=\"!!actionsPortal\"\n [interval]=\"interval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"selected\"\n [startView]=\"clockView\"\n [twelvehour]=\"twelvehour\">\n</mtx-clock>\n\n@if (timeInput && !actionsPortal) {\n <div class=\"mtx-time-button-wrapper\">\n <button class=\"mtx-time-cancel-button\" mat-button type=\"button\" (click)=\"_handleCancel()\">\n {{ _datetimepickerIntl.cancelLabel }}\n </button>\n <button class=\"mtx-time-ok-button\" mat-button type=\"button\" (click)=\"_handleOk()\"\n [disabled]=\"minuteInputDirective?.invalid || hourInputDirective?.invalid\">\n {{ _datetimepickerIntl.okLabel }}\n </button>\n </div>\n}\n", styles: [".mtx-time-view{display:block;outline:none;-webkit-user-select:none;user-select:none}.mtx-time-input-wrapper{padding:8px 0;text-align:center}.mtx-time-input-inner{display:inline-flex;height:56px}.mtx-time-input{box-sizing:border-box;width:72px;height:100%;padding:0;font-size:36px;text-align:center;border:2px solid transparent;appearance:none;outline:none;border-radius:var(--mtx-datetimepicker-selector-container-shape, var(--mat-sys-corner-small));background-color:var(--mtx-datetimepicker-time-input-background-color, var(--mat-sys-surface-container-highest));color:var(--mtx-datetimepicker-time-input-text-color, var(--mat-sys-on-surface))}.mtx-time-input.mtx-time-input-active{background-color:var(--mtx-datetimepicker-time-input-active-state-background-color, var(--mat-sys-primary-container));color:var(--mtx-datetimepicker-time-input-active-state-text-color, var(--mat-sys-on-primary-container))}.mtx-time-input.mtx-time-input-active:focus{border-color:var(--mtx-datetimepicker-time-input-focus-state-outline-color, var(--mat-sys-primary));background-color:var(--mtx-datetimepicker-time-input-focus-state-background-color, var(--mat-sys-primary-container))}.mtx-time-input.mtx-time-input-active:focus::placeholder{color:var(--mtx-datetimepicker-time-input-focus-state-placeholder-text-color, var(--mat-sys-on-primary-container))}.mtx-time-input.mtx-time-input-warning{border-color:var(--mtx-datetimepicker-time-input-warn-state-outline-color, var(--mat-sys-error))}.mtx-time-seperator{display:inline-flex;justify-content:center;align-items:center;width:24px;font-size:36px}.mtx-time-ampm{display:inline-flex;flex-direction:column;margin-left:12px}[dir=rtl] .mtx-time-ampm{margin-left:auto;margin-right:12px}.mtx-time-ampm .mtx-time-am,.mtx-time-ampm .mtx-time-pm{--mdc-text-button-label-text-weight: 400;flex:1;width:40px;min-width:auto;border-width:1px;border-style:solid;--mdc-text-button-label-text-color: var(--mtx-datetimepicker-time-ampm-text-color, var(--mat-sys-on-surface));--mdc-text-button-container-shape: var(--mtx-datetimepicker-selector-container-shape, var(--mat-sys-corner-small));border-color:var(--mtx-datetimepicker-time-ampm-outline-color, var(--mat-sys-outline))}.mtx-time-ampm .mtx-time-am.mtx-time-ampm-active,.mtx-time-ampm .mtx-time-pm.mtx-time-ampm-active{--mdc-text-button-label-text-weight: 500;--mdc-text-button-label-text-color: var(--mtx-datetimepicker-time-ampm-selected-state-text-color, var(--mat-sys-on-tertiary-container));background-color:var(--mtx-datetimepicker-time-ampm-selected-state-background-color, var(--mat-sys-tertiary-container))}.mtx-time-ampm .mtx-time-am .mat-mdc-button-touch-target,.mtx-time-ampm .mtx-time-pm .mat-mdc-button-touch-target{height:100%}.mtx-time-ampm .mtx-time-am{border-bottom-left-radius:0;border-bottom-right-radius:0}.mtx-time-ampm .mtx-time-pm{border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.mtx-time-button-wrapper{display:flex;justify-content:flex-end;padding-top:8px}.mtx-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mtx-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MtxClock, selector: "mtx-clock", inputs: ["dateFilter", "interval", "actionButtons", "twelvehour", "AMPM", "activeDate", "selected", "minDate", "maxDate", "startView"], outputs: ["selectedChange", "activeDateChange", "_userSelection"], exportAs: ["mtxClock"] }, { kind: "directive", type: MtxTimeInput, selector: "input.mtx-time-input", inputs: ["timeInterval", "timeMin", "timeMax", "timeValue"], outputs: ["timeValueChanged"], exportAs: ["mtxTimeInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1328
1539
  }
1329
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxTime, decorators: [{
1540
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxTimeView, decorators: [{
1330
1541
  type: Component,
1331
- args: [{ selector: 'mtx-time', exportAs: 'mtxTime', host: {
1332
- class: 'mtx-time',
1333
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatButton, MtxClock, MtxTimeInput], template: "<div class=\"mtx-time-input-wrapper\">\n <div class=\"mtx-time-input-inner\">\n <input class=\"mtx-time-input\"\n [class.mtx-time-input-active]=\"clockView === 'hour'\"\n [class.mtx-time-input-warning]=\"!hourInput.valid\"\n #hourInput=\"mtxTimeInput\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [timeMin]=\"twelvehour ? 1 : 0\"\n [timeMax]=\"twelvehour ? 12 : 23\"\n [timeValue]=\"hour\"\n (timeValueChanged)=\"_handleHourInputChange($event)\"\n (focus)=\"_handleFocus('hour')\" />\n\n <div class=\"mtx-time-seperator\">:</div>\n\n <input class=\"mtx-time-input\"\n [class.mtx-time-input-active]=\"clockView === 'minute'\"\n [class.mtx-time-input-warning]=\"!minuteInput.valid\"\n #minuteInput=\"mtxTimeInput\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [timeMin]=\"0\"\n [timeMax]=\"59\"\n [timeValue]=\"minute\"\n (timeValueChanged)=\"_handleMinuteInputChange($event)\"\n [timeInterval]=\"interval\"\n (focus)=\"_handleFocus('minute')\" />\n\n @if (twelvehour) {\n <div class=\"mtx-time-ampm\">\n <button mat-button type=\"button\" class=\"mtx-time-am\"\n [class.mtx-time-ampm-active]=\"AMPM === 'AM'\" aria-label=\"AM\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"ampmChange.emit('AM')\">AM</button>\n <button mat-button type=\"button\" class=\"mtx-time-pm\"\n [class.mtx-time-ampm-active]=\"AMPM === 'PM'\" aria-label=\"PM\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"ampmChange.emit('PM')\">PM</button>\n </div>\n }\n </div>\n</div>\n\n<mtx-clock (selectedChange)=\"_timeSelected($event)\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (_userSelection)=\"_handleSelection()\"\n [AMPM]=\"AMPM\"\n [dateFilter]=\"dateFilter\"\n [actionButtons]=\"!!actionsPortal\"\n [interval]=\"interval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"selected\"\n [startView]=\"clockView\"\n [twelvehour]=\"twelvehour\">\n</mtx-clock>\n\n@if (!actionsPortal) {\n <div class=\"mtx-time-button-wrapper\">\n <button class=\"mtx-time-cancel-button\" mat-button type=\"button\" (click)=\"_handleCancel()\">\n {{ _datetimepickerIntl.cancelLabel }}\n </button>\n <button class=\"mtx-time-ok-button\" mat-button type=\"button\" (click)=\"_handleOk()\"\n [disabled]=\"minuteInputDirective?.invalid || hourInputDirective?.invalid\">\n {{ _datetimepickerIntl.okLabel }}\n </button>\n </div>\n}\n", styles: [".mtx-time{display:block;outline:none;-webkit-user-select:none;user-select:none}.mtx-time-input-wrapper{padding:8px 0;text-align:center}.mtx-time-input-inner{display:inline-flex;height:56px}.mtx-time-input{box-sizing:border-box;width:72px;height:100%;padding:0;font-size:36px;text-align:center;border:2px solid transparent;appearance:none;outline:none;border-radius:var(--mtx-datetimepicker-selector-container-shape, var(--mat-app-corner-small));background-color:var(--mtx-datetimepicker-time-input-background-color, var(--mat-app-surface-container-highest));color:var(--mtx-datetimepicker-time-input-text-color, var(--mat-app-on-surface))}.mtx-time-input.mtx-time-input-active{background-color:var(--mtx-datetimepicker-time-input-active-state-background-color, var(--mat-app-primary-container));color:var(--mtx-datetimepicker-time-input-active-state-text-color, var(--mat-app-on-primary-container))}.mtx-time-input.mtx-time-input-active:focus{border-color:var(--mtx-datetimepicker-time-input-focus-state-outline-color, var(--mat-app-primary));background-color:var(--mtx-datetimepicker-time-input-focus-state-background-color, var(--mat-app-primary-container))}.mtx-time-input.mtx-time-input-active:focus::placeholder{color:var(--mtx-datetimepicker-time-input-focus-state-placeholder-text-color, var(--mat-app-on-primary-container))}.mtx-time-input.mtx-time-input-warning{border-color:var(--mtx-datetimepicker-time-input-warn-state-outline-color, var(--mat-app-error))}.mtx-time-seperator{display:inline-flex;justify-content:center;align-items:center;width:24px;font-size:36px}.mtx-time-ampm{display:inline-flex;flex-direction:column;margin-left:12px}[dir=rtl] .mtx-time-ampm{margin-left:auto;margin-right:12px}.mtx-time-ampm .mtx-time-am,.mtx-time-ampm .mtx-time-pm{--mdc-text-button-label-text-weight: 400;flex:1;width:40px;min-width:auto;border-width:1px;border-style:solid;--mdc-text-button-label-text-color: var(--mtx-datetimepicker-time-ampm-text-color, var(--mat-app-on-surface));--mdc-text-button-container-shape: var(--mtx-datetimepicker-selector-container-shape, var(--mat-app-corner-small));border-color:var(--mtx-datetimepicker-time-ampm-outline-color, var(--mat-app-outline))}.mtx-time-ampm .mtx-time-am.mtx-time-ampm-active,.mtx-time-ampm .mtx-time-pm.mtx-time-ampm-active{--mdc-text-button-label-text-weight: 500;--mdc-text-button-label-text-color: var(--mtx-datetimepicker-time-ampm-selected-state-text-color, var(--mat-app-on-tertiary-container));background-color:var(--mtx-datetimepicker-time-ampm-selected-state-background-color, var(--mat-app-tertiary-container))}.mtx-time-ampm .mtx-time-am .mat-mdc-button-touch-target,.mtx-time-ampm .mtx-time-pm .mat-mdc-button-touch-target{height:100%}.mtx-time-ampm .mtx-time-am{border-bottom-left-radius:0;border-bottom-right-radius:0}.mtx-time-ampm .mtx-time-pm{border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.mtx-time-button-wrapper{display:flex;justify-content:flex-end;padding-top:8px}.mtx-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mtx-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"] }]
1334
- }], ctorParameters: () => [{ type: i1.DatetimeAdapter }, { type: i0.ChangeDetectorRef }, { type: MtxDatetimepickerIntl }], propDecorators: { selectedChange: [{
1542
+ args: [{ selector: 'mtx-time-view', exportAs: 'mtxTime', host: {
1543
+ 'class': 'mtx-time-view',
1544
+ 'tabindex': '0',
1545
+ '(keydown)': '_handleCalendarBodyKeydown($event)',
1546
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatButton, MtxClock, MtxTimeInput], template: "@if (timeInput) {\n <div class=\"mtx-time-input-wrapper\">\n <div class=\"mtx-time-input-inner\">\n <input class=\"mtx-time-input\"\n [class.mtx-time-input-active]=\"clockView === 'hour'\"\n [class.mtx-time-input-warning]=\"!hourInput.valid\"\n #hourInput=\"mtxTimeInput\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [timeMin]=\"twelvehour ? 1 : 0\"\n [timeMax]=\"twelvehour ? 12 : 23\"\n [timeValue]=\"hour\"\n (timeValueChanged)=\"_handleHourInputChange($event)\"\n (focus)=\"_handleFocus('hour')\" />\n\n <div class=\"mtx-time-seperator\">:</div>\n\n <input class=\"mtx-time-input\"\n [class.mtx-time-input-active]=\"clockView === 'minute'\"\n [class.mtx-time-input-warning]=\"!minuteInput.valid\"\n #minuteInput=\"mtxTimeInput\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n [timeMin]=\"0\"\n [timeMax]=\"59\"\n [timeValue]=\"minute\"\n (timeValueChanged)=\"_handleMinuteInputChange($event)\"\n [timeInterval]=\"interval\"\n (focus)=\"_handleFocus('minute')\" />\n\n @if (twelvehour) {\n <div class=\"mtx-time-ampm\">\n <button mat-button type=\"button\" class=\"mtx-time-am\"\n [class.mtx-time-ampm-active]=\"AMPM === 'AM'\" aria-label=\"AM\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"ampmChange.emit('AM')\">AM</button>\n <button mat-button type=\"button\" class=\"mtx-time-pm\"\n [class.mtx-time-ampm-active]=\"AMPM === 'PM'\" aria-label=\"PM\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"ampmChange.emit('PM')\">PM</button>\n </div>\n }\n </div>\n </div>\n}\n\n<mtx-clock\n (selectedChange)=\"_timeSelected($event)\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (_userSelection)=\"_handleSelection()\"\n [AMPM]=\"AMPM\"\n [dateFilter]=\"dateFilter\"\n [actionButtons]=\"!!actionsPortal\"\n [interval]=\"interval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"selected\"\n [startView]=\"clockView\"\n [twelvehour]=\"twelvehour\">\n</mtx-clock>\n\n@if (timeInput && !actionsPortal) {\n <div class=\"mtx-time-button-wrapper\">\n <button class=\"mtx-time-cancel-button\" mat-button type=\"button\" (click)=\"_handleCancel()\">\n {{ _datetimepickerIntl.cancelLabel }}\n </button>\n <button class=\"mtx-time-ok-button\" mat-button type=\"button\" (click)=\"_handleOk()\"\n [disabled]=\"minuteInputDirective?.invalid || hourInputDirective?.invalid\">\n {{ _datetimepickerIntl.okLabel }}\n </button>\n </div>\n}\n", styles: [".mtx-time-view{display:block;outline:none;-webkit-user-select:none;user-select:none}.mtx-time-input-wrapper{padding:8px 0;text-align:center}.mtx-time-input-inner{display:inline-flex;height:56px}.mtx-time-input{box-sizing:border-box;width:72px;height:100%;padding:0;font-size:36px;text-align:center;border:2px solid transparent;appearance:none;outline:none;border-radius:var(--mtx-datetimepicker-selector-container-shape, var(--mat-sys-corner-small));background-color:var(--mtx-datetimepicker-time-input-background-color, var(--mat-sys-surface-container-highest));color:var(--mtx-datetimepicker-time-input-text-color, var(--mat-sys-on-surface))}.mtx-time-input.mtx-time-input-active{background-color:var(--mtx-datetimepicker-time-input-active-state-background-color, var(--mat-sys-primary-container));color:var(--mtx-datetimepicker-time-input-active-state-text-color, var(--mat-sys-on-primary-container))}.mtx-time-input.mtx-time-input-active:focus{border-color:var(--mtx-datetimepicker-time-input-focus-state-outline-color, var(--mat-sys-primary));background-color:var(--mtx-datetimepicker-time-input-focus-state-background-color, var(--mat-sys-primary-container))}.mtx-time-input.mtx-time-input-active:focus::placeholder{color:var(--mtx-datetimepicker-time-input-focus-state-placeholder-text-color, var(--mat-sys-on-primary-container))}.mtx-time-input.mtx-time-input-warning{border-color:var(--mtx-datetimepicker-time-input-warn-state-outline-color, var(--mat-sys-error))}.mtx-time-seperator{display:inline-flex;justify-content:center;align-items:center;width:24px;font-size:36px}.mtx-time-ampm{display:inline-flex;flex-direction:column;margin-left:12px}[dir=rtl] .mtx-time-ampm{margin-left:auto;margin-right:12px}.mtx-time-ampm .mtx-time-am,.mtx-time-ampm .mtx-time-pm{--mdc-text-button-label-text-weight: 400;flex:1;width:40px;min-width:auto;border-width:1px;border-style:solid;--mdc-text-button-label-text-color: var(--mtx-datetimepicker-time-ampm-text-color, var(--mat-sys-on-surface));--mdc-text-button-container-shape: var(--mtx-datetimepicker-selector-container-shape, var(--mat-sys-corner-small));border-color:var(--mtx-datetimepicker-time-ampm-outline-color, var(--mat-sys-outline))}.mtx-time-ampm .mtx-time-am.mtx-time-ampm-active,.mtx-time-ampm .mtx-time-pm.mtx-time-ampm-active{--mdc-text-button-label-text-weight: 500;--mdc-text-button-label-text-color: var(--mtx-datetimepicker-time-ampm-selected-state-text-color, var(--mat-sys-on-tertiary-container));background-color:var(--mtx-datetimepicker-time-ampm-selected-state-background-color, var(--mat-sys-tertiary-container))}.mtx-time-ampm .mtx-time-am .mat-mdc-button-touch-target,.mtx-time-ampm .mtx-time-pm .mat-mdc-button-touch-target{height:100%}.mtx-time-ampm .mtx-time-am{border-bottom-left-radius:0;border-bottom-right-radius:0}.mtx-time-ampm .mtx-time-pm{border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.mtx-time-button-wrapper{display:flex;justify-content:flex-end;padding-top:8px}.mtx-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mtx-time-button-wrapper .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"] }]
1547
+ }], ctorParameters: () => [], propDecorators: { selectedChange: [{
1335
1548
  type: Output
1336
1549
  }], activeDateChange: [{
1337
1550
  type: Output
@@ -1343,10 +1556,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
1343
1556
  type: Output
1344
1557
  }], dateFilter: [{
1345
1558
  type: Input
1559
+ }], timeInput: [{
1560
+ type: Input,
1561
+ args: [{ transform: booleanAttribute }]
1346
1562
  }], interval: [{
1347
1563
  type: Input
1348
1564
  }], actionsPortal: [{
1349
1565
  type: Input
1566
+ }], preventSameDateTimeSelection: [{
1567
+ type: Input,
1568
+ args: [{ transform: booleanAttribute }]
1350
1569
  }], autoFocus: [{
1351
1570
  type: Input,
1352
1571
  args: [{ transform: booleanAttribute }]
@@ -1384,14 +1603,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
1384
1603
  * @docs-private
1385
1604
  */
1386
1605
  class MtxYearView {
1387
- constructor(_adapter, _dateFormats) {
1388
- this._adapter = _adapter;
1389
- this._dateFormats = _dateFormats;
1606
+ constructor() {
1607
+ this._adapter = inject(DatetimeAdapter, { optional: true });
1608
+ this._dir = inject(Directionality, { optional: true });
1609
+ this._dateFormats = inject(MTX_DATETIME_FORMATS, { optional: true });
1390
1610
  this.type = 'date';
1391
1611
  /** Emits when a new month is selected. */
1392
1612
  this.selectedChange = new EventEmitter();
1393
1613
  /** Emits when any date is selected. */
1394
1614
  this._userSelection = new EventEmitter();
1615
+ /** Emits when any date is activated. */
1616
+ this.activeDateChange = new EventEmitter();
1617
+ this._selected = null;
1395
1618
  if (!this._adapter) {
1396
1619
  throw createMissingDateImplError('DatetimeAdapter');
1397
1620
  }
@@ -1411,11 +1634,6 @@ class MtxYearView {
1411
1634
  this._activeDate &&
1412
1635
  !this._adapter.sameYear(oldActiveDate, this._activeDate)) {
1413
1636
  this._init();
1414
- // if (oldActiveDate < this._activeDate) {
1415
- // this.calendarState('right');
1416
- // } else {
1417
- // this.calendarState('left');
1418
- // }
1419
1637
  }
1420
1638
  }
1421
1639
  /** The currently selected date. */
@@ -1439,9 +1657,6 @@ class MtxYearView {
1439
1657
  this._userSelection.emit();
1440
1658
  }
1441
1659
  }
1442
- _calendarStateDone() {
1443
- this._calendarState = '';
1444
- }
1445
1660
  /** Initializes this month view. */
1446
1661
  _init() {
1447
1662
  this._selectedMonth = this._getMonthInCurrentYear(this.selected);
@@ -1460,16 +1675,15 @@ class MtxYearView {
1460
1675
  * Returns null if the given Date is in another year.
1461
1676
  */
1462
1677
  _getMonthInCurrentYear(date) {
1463
- return this._adapter.sameYear(date, this.activeDate) ? this._adapter.getMonth(date) : null;
1678
+ return date && this._adapter.sameYear(date, this.activeDate)
1679
+ ? this._adapter.getMonth(date)
1680
+ : null;
1464
1681
  }
1465
1682
  /** Creates an MdCalendarCell for the given month. */
1466
1683
  _createCellForMonth(month, monthName) {
1467
1684
  const ariaLabel = this._adapter.format(this._adapter.createDatetime(this._adapter.getYear(this.activeDate), month, 1, this._adapter.getHour(this.activeDate), this._adapter.getMinute(this.activeDate)), this._dateFormats.display.monthYearA11yLabel);
1468
1685
  return new MtxCalendarCell(month, monthName.toLocaleUpperCase(), ariaLabel, this._isMonthEnabled(month));
1469
1686
  }
1470
- // private calendarState(direction: string): void {
1471
- // this._calendarState = direction;
1472
- // }
1473
1687
  /** Whether the given month is enabled. */
1474
1688
  _isMonthEnabled(month) {
1475
1689
  if (!this.dateFilter) {
@@ -1484,20 +1698,68 @@ class MtxYearView {
1484
1698
  }
1485
1699
  return false;
1486
1700
  }
1487
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxYearView, deps: [{ token: i1.DatetimeAdapter, optional: true }, { token: MTX_DATETIME_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
1488
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: MtxYearView, isStandalone: true, selector: "mtx-year-view", inputs: { type: "type", dateFilter: "dateFilter", activeDate: "activeDate", selected: "selected" }, outputs: { selectedChange: "selectedChange", _userSelection: "_userSelection" }, exportAs: ["mtxYearView"], ngImport: i0, template: "<table class=\"mtx-calendar-table\" role=\"grid\">\n <thead class=\"mtx-calendar-table-header\"></thead>\n <tbody mtx-calendar-body\n (@slideCalendar.done)=\"_calendarStateDone()\"\n [@slideCalendar]=\"_calendarState\"\n [label]=\"_yearLabel\"\n [rows]=\"_months\"\n [todayValue]=\"_todayMonth!\"\n [labelMinRequiredCells]=\"2\"\n [numCols]=\"4\"\n [activeCell]=\"_adapter.getMonth(activeDate)\"\n [selectedValue]=\"_selectedMonth!\"\n (selectedValueChange)=\"_monthSelected($event)\"\n [allowDisabledSelection]=\"true\"></tbody>\n</table>\n", dependencies: [{ kind: "component", type: MtxCalendarBody, selector: "[mtx-calendar-body]", inputs: ["label", "rows", "todayValue", "selectedValue", "labelMinRequiredCells", "numCols", "allowDisabledSelection", "activeCell"], outputs: ["selectedValueChange"], exportAs: ["mtxCalendarBody"] }], animations: [mtxDatetimepickerAnimations.slideCalendar], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1701
+ /** Handles keydown events on the calendar body when calendar is in year view. */
1702
+ _handleCalendarBodyKeydown(event) {
1703
+ // TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent
1704
+ // disabled ones from being selected. This may not be ideal, we should look into whether
1705
+ // navigation should skip over disabled dates, and if so, how to implement that efficiently.
1706
+ const oldActiveDate = this._activeDate;
1707
+ const isRtl = this._isRtl();
1708
+ switch (event.keyCode) {
1709
+ case LEFT_ARROW:
1710
+ this.activeDate = this._adapter.addCalendarMonths(this._activeDate, isRtl ? 1 : -1);
1711
+ break;
1712
+ case RIGHT_ARROW:
1713
+ this.activeDate = this._adapter.addCalendarMonths(this._activeDate, isRtl ? -1 : 1);
1714
+ break;
1715
+ case UP_ARROW:
1716
+ this.activeDate = this._adapter.addCalendarMonths(this._activeDate, -4);
1717
+ break;
1718
+ case DOWN_ARROW:
1719
+ this.activeDate = this._adapter.addCalendarMonths(this._activeDate, 4);
1720
+ break;
1721
+ case HOME:
1722
+ this.activeDate = this._adapter.addCalendarMonths(this._activeDate, -this._adapter.getMonth(this._activeDate));
1723
+ break;
1724
+ case END:
1725
+ this.activeDate = this._adapter.addCalendarMonths(this._activeDate, 11 - this._adapter.getMonth(this._activeDate));
1726
+ break;
1727
+ case PAGE_UP:
1728
+ this.activeDate = this._adapter.addCalendarYears(this._activeDate, event.altKey ? -10 : -1);
1729
+ break;
1730
+ case PAGE_DOWN:
1731
+ this.activeDate = this._adapter.addCalendarYears(this._activeDate, event.altKey ? 10 : 1);
1732
+ break;
1733
+ case ENTER:
1734
+ case SPACE:
1735
+ this._monthSelected(this._adapter.getMonth(this._activeDate));
1736
+ break;
1737
+ default:
1738
+ // Don't prevent default or focus active cell on keys that we don't explicitly handle.
1739
+ return;
1740
+ }
1741
+ if (this._adapter.compareDate(oldActiveDate, this.activeDate)) {
1742
+ this.activeDateChange.emit(this.activeDate);
1743
+ }
1744
+ this._focusActiveCell();
1745
+ // Prevent unexpected default actions such as form submission.
1746
+ event.preventDefault();
1747
+ }
1748
+ /** Focuses the active cell after the microtask queue is empty. */
1749
+ _focusActiveCell() {
1750
+ this._mtxCalendarBody._focusActiveCell();
1751
+ }
1752
+ /** Determines whether the user has the RTL layout direction. */
1753
+ _isRtl() {
1754
+ return this._dir && this._dir.value === 'rtl';
1755
+ }
1756
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxYearView, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1757
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.4", type: MtxYearView, isStandalone: true, selector: "mtx-year-view", inputs: { type: "type", dateFilter: "dateFilter", activeDate: "activeDate", selected: "selected" }, outputs: { selectedChange: "selectedChange", _userSelection: "_userSelection", activeDateChange: "activeDateChange" }, viewQueries: [{ propertyName: "_mtxCalendarBody", first: true, predicate: MtxCalendarBody, descendants: true }], exportAs: ["mtxYearView"], ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<table class=\"mtx-calendar-table\" role=\"grid\">\n <thead class=\"mtx-calendar-table-header\"></thead>\n <tbody mtx-calendar-body\n [label]=\"_yearLabel\"\n [rows]=\"_months\"\n [todayValue]=\"_todayMonth!\"\n [labelMinRequiredCells]=\"2\"\n [numCols]=\"4\"\n [cellAspectRatio]=\"4 / 7\"\n [activeCell]=\"_adapter.getMonth(activeDate)\"\n [selectedValue]=\"_selectedMonth!\"\n (selectedValueChange)=\"_monthSelected($event)\"\n [allowDisabledSelection]=\"true\"\n (keydown)=\"_handleCalendarBodyKeydown($event)\"></tbody>\n</table>\n", dependencies: [{ kind: "component", type: MtxCalendarBody, selector: "[mtx-calendar-body]", inputs: ["label", "rows", "cellAspectRatio", "todayValue", "selectedValue", "labelMinRequiredCells", "numCols", "allowDisabledSelection", "activeCell"], outputs: ["selectedValueChange"], exportAs: ["mtxCalendarBody"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1489
1758
  }
1490
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxYearView, decorators: [{
1759
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxYearView, decorators: [{
1491
1760
  type: Component,
1492
- args: [{ selector: 'mtx-year-view', exportAs: 'mtxYearView', animations: [mtxDatetimepickerAnimations.slideCalendar], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MtxCalendarBody], template: "<table class=\"mtx-calendar-table\" role=\"grid\">\n <thead class=\"mtx-calendar-table-header\"></thead>\n <tbody mtx-calendar-body\n (@slideCalendar.done)=\"_calendarStateDone()\"\n [@slideCalendar]=\"_calendarState\"\n [label]=\"_yearLabel\"\n [rows]=\"_months\"\n [todayValue]=\"_todayMonth!\"\n [labelMinRequiredCells]=\"2\"\n [numCols]=\"4\"\n [activeCell]=\"_adapter.getMonth(activeDate)\"\n [selectedValue]=\"_selectedMonth!\"\n (selectedValueChange)=\"_monthSelected($event)\"\n [allowDisabledSelection]=\"true\"></tbody>\n</table>\n" }]
1493
- }], ctorParameters: () => [{ type: i1.DatetimeAdapter, decorators: [{
1494
- type: Optional
1495
- }] }, { type: undefined, decorators: [{
1496
- type: Optional
1497
- }, {
1498
- type: Inject,
1499
- args: [MTX_DATETIME_FORMATS]
1500
- }] }], propDecorators: { type: [{
1761
+ args: [{ selector: 'mtx-year-view', exportAs: 'mtxYearView', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MtxCalendarBody], template: "<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<table class=\"mtx-calendar-table\" role=\"grid\">\n <thead class=\"mtx-calendar-table-header\"></thead>\n <tbody mtx-calendar-body\n [label]=\"_yearLabel\"\n [rows]=\"_months\"\n [todayValue]=\"_todayMonth!\"\n [labelMinRequiredCells]=\"2\"\n [numCols]=\"4\"\n [cellAspectRatio]=\"4 / 7\"\n [activeCell]=\"_adapter.getMonth(activeDate)\"\n [selectedValue]=\"_selectedMonth!\"\n (selectedValueChange)=\"_monthSelected($event)\"\n [allowDisabledSelection]=\"true\"\n (keydown)=\"_handleCalendarBodyKeydown($event)\"></tbody>\n</table>\n" }]
1762
+ }], ctorParameters: () => [], propDecorators: { type: [{
1501
1763
  type: Input
1502
1764
  }], dateFilter: [{
1503
1765
  type: Input
@@ -1505,6 +1767,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
1505
1767
  type: Output
1506
1768
  }], _userSelection: [{
1507
1769
  type: Output
1770
+ }], activeDateChange: [{
1771
+ type: Output
1772
+ }], _mtxCalendarBody: [{
1773
+ type: ViewChild,
1774
+ args: [MtxCalendarBody]
1508
1775
  }], activeDate: [{
1509
1776
  type: Input
1510
1777
  }], selected: [{
@@ -1516,12 +1783,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
1516
1783
  * @docs-private
1517
1784
  */
1518
1785
  class MtxCalendar {
1519
- constructor(_elementRef, _intl, _ngZone, _adapter, _dateFormats, _changeDetectorRef) {
1520
- this._elementRef = _elementRef;
1521
- this._intl = _intl;
1522
- this._ngZone = _ngZone;
1523
- this._adapter = _adapter;
1524
- this._dateFormats = _dateFormats;
1786
+ constructor() {
1787
+ this._intl = inject(MtxDatetimepickerIntl);
1788
+ this._changeDetectorRef = inject(ChangeDetectorRef);
1789
+ this._ngZone = inject(NgZone);
1790
+ this._adapter = inject(DatetimeAdapter, { optional: true });
1791
+ this._dateFormats = inject(MTX_DATETIME_FORMATS, { optional: true });
1525
1792
  /** Whether to show multi-year view. */
1526
1793
  this.multiYearSelector = false;
1527
1794
  /** Whether the clock uses 12 hour format. */
@@ -1540,7 +1807,12 @@ class MtxCalendar {
1540
1807
  this.viewChanged = new EventEmitter();
1541
1808
  this._userSelection = new EventEmitter();
1542
1809
  this._clockView = 'hour';
1543
- this._injector = inject(Injector);
1810
+ /**
1811
+ * Used for scheduling that focus should be moved to the active cell on the next tick.
1812
+ * We need to schedule it, rather than do it immediately, because we have to wait
1813
+ * for Angular to re-evaluate the view children.
1814
+ */
1815
+ this._moveFocusOnNextTick = false;
1544
1816
  this._type = 'date';
1545
1817
  /**
1546
1818
  * Whether the calendar is in time mode. In time mode the calendar clock gets time input
@@ -1556,13 +1828,16 @@ class MtxCalendar {
1556
1828
  (!this.minDate || this._adapter.compareDate(date, this.minDate) >= 0) &&
1557
1829
  (!this.maxDate || this._adapter.compareDate(date, this.maxDate) <= 0));
1558
1830
  };
1831
+ const _intl = this._intl;
1559
1832
  if (!this._adapter) {
1560
1833
  throw createMissingDateImplError('DatetimeAdapter');
1561
1834
  }
1562
1835
  if (!this._dateFormats) {
1563
1836
  throw createMissingDateImplError('MTX_DATETIME_FORMATS');
1564
1837
  }
1565
- this._intlChanges = _intl.changes.subscribe(() => _changeDetectorRef.markForCheck());
1838
+ this._intlChanges = _intl.changes.subscribe(() => {
1839
+ this._changeDetectorRef.markForCheck();
1840
+ });
1566
1841
  }
1567
1842
  /** The display type of datetimepicker. */
1568
1843
  get type() {
@@ -1625,14 +1900,20 @@ class MtxCalendar {
1625
1900
  this.calendarState('left');
1626
1901
  }
1627
1902
  }
1903
+ this._changeDetectorRef.markForCheck();
1628
1904
  }
1629
1905
  /** Whether the calendar is in month view. */
1630
1906
  get currentView() {
1631
1907
  return this._currentView;
1632
1908
  }
1633
- set currentView(view) {
1634
- this._currentView = view;
1635
- this.viewChanged.emit(view);
1909
+ set currentView(value) {
1910
+ const viewChangedResult = this._currentView !== value ? value : null;
1911
+ this._currentView = value;
1912
+ this._moveFocusOnNextTick = true;
1913
+ this._changeDetectorRef.markForCheck();
1914
+ if (viewChangedResult) {
1915
+ this.viewChanged.emit(viewChangedResult);
1916
+ }
1636
1917
  }
1637
1918
  get _yearPeriodText() {
1638
1919
  if (this.currentView === 'multi-year') {
@@ -1721,17 +2002,24 @@ class MtxCalendar {
1721
2002
  }
1722
2003
  this._activeDate = this.startAt || this._adapter.today();
1723
2004
  this._selectAMPM(this._activeDate);
2005
+ // Assign to the private property since we don't want to move focus on init.
1724
2006
  if (this.type === 'year') {
1725
- this.currentView = 'multi-year';
2007
+ this._currentView = 'multi-year';
1726
2008
  }
1727
2009
  else if (this.type === 'month') {
1728
- this.currentView = 'year';
2010
+ this._currentView = 'year';
1729
2011
  }
1730
2012
  else if (this.type === 'time') {
1731
- this.currentView = 'clock';
2013
+ this._currentView = 'clock';
1732
2014
  }
1733
2015
  else {
1734
- this.currentView = this.startView || 'month';
2016
+ this._currentView = this.startView;
2017
+ }
2018
+ }
2019
+ ngAfterViewChecked() {
2020
+ if (this._moveFocusOnNextTick) {
2021
+ this._moveFocusOnNextTick = false;
2022
+ this.focusActiveCell();
1735
2023
  }
1736
2024
  }
1737
2025
  ngOnDestroy() {
@@ -1784,15 +2072,6 @@ class MtxCalendar {
1784
2072
  this.selectedChange.emit(date);
1785
2073
  }
1786
2074
  }
1787
- _dialTimeSelected(date) {
1788
- if (this._clockView !== 'minute') {
1789
- this._activeDate = date;
1790
- this._clockView = 'minute';
1791
- }
1792
- if (!this._adapter.sameDatetime(date, this.selected) || !this.preventSameDateTimeSelection) {
1793
- this.selectedChange.emit(date);
1794
- }
1795
- }
1796
2075
  _onActiveDateChange(date) {
1797
2076
  this._activeDate = date;
1798
2077
  }
@@ -1804,7 +2083,10 @@ class MtxCalendar {
1804
2083
  else {
1805
2084
  this._AMPM = 'AM';
1806
2085
  }
1807
- if (this.actionsPortal && this._selected && !this._adapter.sameHour(date, this._selected)) {
2086
+ if (this.actionsPortal &&
2087
+ this.currentView === 'clock' &&
2088
+ this._selected &&
2089
+ !this._adapter.sameHour(date, this._selected)) {
1808
2090
  this.selectedChange.emit(date);
1809
2091
  }
1810
2092
  }
@@ -1876,29 +2158,6 @@ class MtxCalendar {
1876
2158
  _nextEnabled() {
1877
2159
  return !this.maxDate || !this._isSameView(this._activeDate, this.maxDate);
1878
2160
  }
1879
- /** Handles keydown events on the calendar body. */
1880
- _handleCalendarBodyKeydown(event) {
1881
- // TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent
1882
- // disabled ones from being selected. This may not be ideal, we should look into whether
1883
- // navigation should skip over disabled dates, and if so, how to implement that efficiently.
1884
- if (this.currentView === 'month') {
1885
- this._handleCalendarBodyKeydownInMonthView(event);
1886
- }
1887
- else if (this.currentView === 'year') {
1888
- this._handleCalendarBodyKeydownInYearView(event);
1889
- }
1890
- else if (this.currentView === 'multi-year') {
1891
- this._handleCalendarBodyKeydownInMultiYearView(event);
1892
- }
1893
- else {
1894
- this._handleCalendarBodyKeydownInClockView(event);
1895
- }
1896
- }
1897
- _focusActiveCell() {
1898
- afterNextRender(() => {
1899
- this._elementRef.nativeElement.focus();
1900
- }, { injector: this._injector });
1901
- }
1902
2161
  _calendarStateDone() {
1903
2162
  this._calendarState = '';
1904
2163
  }
@@ -1914,207 +2173,39 @@ class MtxCalendar {
1914
2173
  // Otherwise we are in 'multi-year' view.
1915
2174
  return isSameMultiYearView(this._adapter, date1, date2, this.minDate, this.maxDate);
1916
2175
  }
1917
- /** Handles keydown events on the calendar body when calendar is in month view. */
1918
- _handleCalendarBodyKeydownInMonthView(event) {
1919
- switch (event.keyCode) {
1920
- case LEFT_ARROW:
1921
- this._activeDate = this._adapter.addCalendarDays(this._activeDate, -1);
1922
- break;
1923
- case RIGHT_ARROW:
1924
- this._activeDate = this._adapter.addCalendarDays(this._activeDate, 1);
1925
- break;
1926
- case UP_ARROW:
1927
- this._activeDate = this._adapter.addCalendarDays(this._activeDate, -7);
1928
- break;
1929
- case DOWN_ARROW:
1930
- this._activeDate = this._adapter.addCalendarDays(this._activeDate, 7);
1931
- break;
1932
- case HOME:
1933
- this._activeDate = this._adapter.addCalendarDays(this._activeDate, 1 - this._adapter.getDate(this._activeDate));
1934
- break;
1935
- case END:
1936
- this._activeDate = this._adapter.addCalendarDays(this._activeDate, this._adapter.getNumDaysInMonth(this._activeDate) -
1937
- this._adapter.getDate(this._activeDate));
1938
- break;
1939
- case PAGE_UP:
1940
- this._activeDate = event.altKey
1941
- ? this._adapter.addCalendarYears(this._activeDate, -1)
1942
- : this._adapter.addCalendarMonths(this._activeDate, -1);
1943
- break;
1944
- case PAGE_DOWN:
1945
- this._activeDate = event.altKey
1946
- ? this._adapter.addCalendarYears(this._activeDate, 1)
1947
- : this._adapter.addCalendarMonths(this._activeDate, 1);
1948
- break;
1949
- case ENTER:
1950
- if (this._dateFilterForViews(this._activeDate)) {
1951
- this._dateSelected(this._activeDate);
1952
- // Prevent unexpected default actions such as form submission.
1953
- event.preventDefault();
1954
- }
1955
- return;
1956
- default:
1957
- // Don't prevent default or focus active cell on keys that we don't explicitly handle.
1958
- return;
1959
- }
1960
- // Prevent unexpected default actions such as form submission.
1961
- event.preventDefault();
1962
- }
1963
- /** Handles keydown events on the calendar body when calendar is in year view. */
1964
- _handleCalendarBodyKeydownInYearView(event) {
1965
- switch (event.keyCode) {
1966
- case LEFT_ARROW:
1967
- this._activeDate = this._adapter.addCalendarMonths(this._activeDate, -1);
1968
- break;
1969
- case RIGHT_ARROW:
1970
- this._activeDate = this._adapter.addCalendarMonths(this._activeDate, 1);
1971
- break;
1972
- case UP_ARROW:
1973
- this._activeDate = this._prevMonthInSameCol(this._activeDate);
1974
- break;
1975
- case DOWN_ARROW:
1976
- this._activeDate = this._nextMonthInSameCol(this._activeDate);
1977
- break;
1978
- case HOME:
1979
- this._activeDate = this._adapter.addCalendarMonths(this._activeDate, -this._adapter.getMonth(this._activeDate));
1980
- break;
1981
- case END:
1982
- this._activeDate = this._adapter.addCalendarMonths(this._activeDate, 11 - this._adapter.getMonth(this._activeDate));
1983
- break;
1984
- case PAGE_UP:
1985
- this._activeDate = this._adapter.addCalendarYears(this._activeDate, event.altKey ? -10 : -1);
1986
- break;
1987
- case PAGE_DOWN:
1988
- this._activeDate = this._adapter.addCalendarYears(this._activeDate, event.altKey ? 10 : 1);
1989
- break;
1990
- case ENTER:
1991
- this._monthSelected(this._activeDate);
1992
- break;
1993
- default:
1994
- // Don't prevent default or focus active cell on keys that we don't explicitly handle.
1995
- return;
1996
- }
1997
- // Prevent unexpected default actions such as form submission.
1998
- event.preventDefault();
1999
- }
2000
- /** Handles keydown events on the calendar body when calendar is in multi-year view. */
2001
- _handleCalendarBodyKeydownInMultiYearView(event) {
2002
- switch (event.keyCode) {
2003
- case LEFT_ARROW:
2004
- this._activeDate = this._adapter.addCalendarYears(this._activeDate, -1);
2005
- break;
2006
- case RIGHT_ARROW:
2007
- this._activeDate = this._adapter.addCalendarYears(this._activeDate, 1);
2008
- break;
2009
- case UP_ARROW:
2010
- this._activeDate = this._adapter.addCalendarYears(this._activeDate, -yearsPerRow);
2011
- break;
2012
- case DOWN_ARROW:
2013
- this._activeDate = this._adapter.addCalendarYears(this._activeDate, yearsPerRow);
2014
- break;
2015
- case HOME:
2016
- this._activeDate = this._adapter.addCalendarYears(this._activeDate, -getActiveOffset(this._adapter, this._activeDate, this.minDate, this.maxDate));
2017
- break;
2018
- case END:
2019
- this._activeDate = this._adapter.addCalendarYears(this._activeDate, yearsPerPage -
2020
- getActiveOffset(this._adapter, this._activeDate, this.minDate, this.maxDate) -
2021
- 1);
2022
- break;
2023
- case PAGE_UP:
2024
- this._activeDate = this._adapter.addCalendarYears(this._activeDate, event.altKey ? -yearsPerPage * 10 : -yearsPerPage);
2025
- break;
2026
- case PAGE_DOWN:
2027
- this._activeDate = this._adapter.addCalendarYears(this._activeDate, event.altKey ? yearsPerPage * 10 : yearsPerPage);
2028
- break;
2029
- case ENTER:
2030
- this._yearSelected(this._activeDate);
2031
- break;
2032
- default:
2033
- // Don't prevent default or focus active cell on keys that we don't explicitly handle.
2034
- return;
2035
- }
2036
- }
2037
- /** Handles keydown events on the calendar body when calendar is in month view. */
2038
- _handleCalendarBodyKeydownInClockView(event) {
2039
- switch (event.keyCode) {
2040
- case UP_ARROW:
2041
- this._activeDate =
2042
- this._clockView === 'hour'
2043
- ? this._adapter.addCalendarHours(this._activeDate, 1)
2044
- : this._adapter.addCalendarMinutes(this._activeDate, this.timeInterval);
2045
- break;
2046
- case DOWN_ARROW:
2047
- this._activeDate =
2048
- this._clockView === 'hour'
2049
- ? this._adapter.addCalendarHours(this._activeDate, -1)
2050
- : this._adapter.addCalendarMinutes(this._activeDate, -this.timeInterval);
2051
- break;
2052
- case ENTER:
2053
- if (!this.timeInput) {
2054
- this._dialTimeSelected(this._activeDate);
2055
- }
2056
- return;
2057
- default:
2058
- // Don't prevent default or focus active cell on keys that we don't explicitly handle.
2059
- return;
2060
- }
2061
- // Prevent unexpected default actions such as form submission.
2062
- event.preventDefault();
2063
- }
2064
- /**
2065
- * Determine the date for the month that comes before the given month in the same column in the
2066
- * calendar table.
2067
- */
2068
- _prevMonthInSameCol(date) {
2069
- // Determine how many months to jump forward given that there are 2 empty slots at the beginning
2070
- // of each year.
2071
- const increment = this._adapter.getMonth(date) <= 4 ? -5 : this._adapter.getMonth(date) >= 7 ? -7 : -12;
2072
- return this._adapter.addCalendarMonths(date, increment);
2073
- }
2074
- /**
2075
- * Determine the date for the month that comes after the given month in the same column in the
2076
- * calendar table.
2077
- */
2078
- _nextMonthInSameCol(date) {
2079
- // Determine how many months to jump forward given that there are 2 empty slots at the beginning
2080
- // of each year.
2081
- const increment = this._adapter.getMonth(date) <= 4 ? 7 : this._adapter.getMonth(date) >= 7 ? 5 : 12;
2082
- return this._adapter.addCalendarMonths(date, increment);
2083
- }
2084
2176
  calendarState(direction) {
2085
2177
  this._calendarState = direction;
2086
2178
  }
2087
2179
  _2digit(n) {
2088
2180
  return ('00' + n).slice(-2);
2089
2181
  }
2090
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxCalendar, deps: [{ token: i0.ElementRef }, { token: MtxDatetimepickerIntl }, { token: i0.NgZone }, { token: i1.DatetimeAdapter, optional: true }, { token: MTX_DATETIME_FORMATS, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
2091
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: MtxCalendar, isStandalone: true, selector: "mtx-calendar", inputs: { multiYearSelector: ["multiYearSelector", "multiYearSelector", booleanAttribute], twelvehour: ["twelvehour", "twelvehour", booleanAttribute], startView: "startView", timeInterval: "timeInterval", dateFilter: "dateFilter", preventSameDateTimeSelection: "preventSameDateTimeSelection", headerComponent: "headerComponent", actionsPortal: "actionsPortal", type: "type", startAt: "startAt", timeInput: ["timeInput", "timeInput", booleanAttribute], timeInputAutoFocus: ["timeInputAutoFocus", "timeInputAutoFocus", booleanAttribute], selected: "selected", minDate: "minDate", maxDate: "maxDate" }, outputs: { selectedChange: "selectedChange", viewChanged: "viewChanged", _userSelection: "_userSelection" }, host: { attributes: { "tabindex": "0" }, listeners: { "keydown": "_handleCalendarBodyKeydown($event)" }, properties: { "class.mtx-calendar-with-time-input": "timeInput" }, classAttribute: "mtx-calendar" }, exportAs: ["mtxCalendar"], ngImport: i0, template: "<div class=\"mtx-calendar-header\">\n @if (_calendarHeaderPortal) {\n <ng-template [cdkPortalOutlet]=\"_calendarHeaderPortal\"></ng-template>\n } @else {\n @if (type !== 'time') {\n <button\n mat-button type=\"button\" class=\"mtx-calendar-header-year\"\n [class.active]=\"currentView === 'year' || currentView === 'multi-year'\"\n [attr.aria-label]=\"_yearButtonLabel\"\n (click)=\"_yearClicked()\">\n <span>{{ _yearButtonText }}</span>\n @if (multiYearSelector || type === 'year') {\n <svg\n class=\"mtx-calendar-header-year-dropdown\" matButtonIcon iconPositionEnd\n width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M7,10L12,15L17,10H7Z\" />\n </svg>\n }\n </button>\n }\n @if (type !== 'year') {\n <div class=\"mtx-calendar-header-date-time\">\n @if (type !== 'time') {\n <button\n mat-button type=\"button\" class=\"mtx-calendar-header-date\"\n [class.active]=\"currentView === 'month'\"\n [class.not-clickable]=\"type === 'month'\"\n [attr.aria-label]=\"_dateButtonLabel\"\n (click)=\"_dateClicked()\">{{ _dateButtonText }}</button>\n }\n @if (type.endsWith('time')) {\n <span class=\"mtx-calendar-header-time\" [class.active]=\"currentView === 'clock'\">\n <span class=\"mtx-calendar-header-hour-minute-container\">\n <button mat-button type=\"button\" class=\"mtx-calendar-header-hours\"\n [class.active]=\"_clockView === 'hour'\"\n [attr.aria-label]=\"_hourButtonLabel\"\n (click)=\"_hoursClicked()\">{{ _hoursButtonText }}</button>\n <span class=\"mtx-calendar-header-hour-minute-separator\">:</span>\n <button mat-button type=\"button\" class=\"mtx-calendar-header-minutes\"\n [class.active]=\"_clockView === 'minute'\"\n [attr.aria-label]=\"_minuteButtonLabel\"\n (click)=\"_minutesClicked()\">{{ _minutesButtonText }}</button>\n </span>\n @if (twelvehour) {\n <span class=\"mtx-calendar-header-ampm-container\">\n <button mat-button type=\"button\" class=\"mtx-calendar-header-ampm\"\n [class.active]=\"_AMPM === 'AM'\" aria-label=\"AM\"\n (click)=\"_ampmClicked('AM')\">AM</button>\n <button mat-button type=\"button\" class=\"mtx-calendar-header-ampm\"\n [class.active]=\"_AMPM === 'PM'\" aria-label=\"PM\"\n (click)=\"_ampmClicked('PM')\">PM</button>\n </span>\n }\n </span>\n }\n </div>\n }\n }\n</div>\n\n<div class=\"mtx-calendar-content\">\n @if (currentView === 'month' || currentView === 'year' || currentView === 'multi-year') {\n <div class=\"mtx-month-content\">\n <div class=\"mtx-calendar-controls\">\n <button mat-icon-button type=\"button\"\n class=\"mtx-calendar-previous-button\"\n [class.disabled]=\"!_previousEnabled()\"\n [attr.aria-disabled]=\"!_previousEnabled()\"\n [attr.aria-label]=\"_prevButtonLabel\"\n (click)=\"_previousClicked()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n </button>\n <div class=\"mtx-calendar-period-button\"\n [@slideCalendar]=\"_calendarState\"\n (@slideCalendar.done)=\"_calendarStateDone()\">\n <strong>{{ _yearPeriodText }}</strong>\n </div>\n <button mat-icon-button type=\"button\"\n class=\"mtx-calendar-next-button\"\n [class.disabled]=\"!_nextEnabled()\"\n [attr.aria-disabled]=\"!_nextEnabled()\"\n [attr.aria-label]=\"_nextButtonLabel\"\n (click)=\"_nextClicked()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n </div>\n </div>\n }\n\n @switch (currentView) {\n @case ('month') {\n <mtx-month-view\n (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_dateSelected($event)\"\n [activeDate]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [selected]=\"selected!\"\n [type]=\"type\">\n </mtx-month-view>\n }\n @case ('year') {\n <mtx-year-view\n (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_monthSelected($event)\"\n [activeDate]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [selected]=\"selected!\"\n [type]=\"type\">\n </mtx-year-view>\n }\n @case ('multi-year') {\n <mtx-multi-year-view\n (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_yearSelected($event)\"\n [activeDate]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"selected!\"\n [type]=\"type\">\n </mtx-multi-year-view>\n }\n @default {\n @if (timeInput) {\n <mtx-time\n (_userSelection)=\"_userSelected()\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (selectedChange)=\"_timeSelected($event)\"\n [AMPM]=\"_AMPM\"\n (ampmChange)=\"_ampmClicked($event)\"\n [clockView]=\"_clockView\"\n (clockViewChange)=\"_clockView = $event\"\n [twelvehour]=\"twelvehour\"\n [dateFilter]=\"dateFilter\"\n [interval]=\"timeInterval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"_activeDate\"\n [actionsPortal]=\"actionsPortal\"\n [autoFocus]=\"timeInputAutoFocus\">\n </mtx-time>\n } @else {\n <mtx-clock (_userSelection)=\"_userSelected()\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (selectedChange)=\"_dialTimeSelected($event)\"\n [AMPM]=\"_AMPM\"\n [dateFilter]=\"dateFilter\"\n [interval]=\"timeInterval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"_activeDate\"\n [startView]=\"_clockView\"\n [twelvehour]=\"twelvehour\">\n </mtx-clock>\n }\n }\n }\n</div>\n", styles: [".mtx-calendar{display:block;outline:none;font-family:var(--mtx-datetimepicker-calendar-text-font, var(--mat-app-body-large-font));font-size:var(--mtx-datetimepicker-calendar-text-size, var(--mat-app-body-large-size))}.mtx-calendar-header{box-sizing:border-box;padding:8px;border-bottom:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-top-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));border-top-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));background-color:var(--mtx-datetimepicker-calendar-header-background-color);color:var(--mtx-datetimepicker-calendar-header-text-color, var(--mat-app-on-surface-variant));--mdc-text-button-container-shape: var(--mtx-datetimepicker-selector-container-shape, var(--mat-app-corner-small))}.mtx-calendar-header .mtx-calendar-header-year,.mtx-calendar-header .mtx-calendar-header-date,.mtx-calendar-header .mtx-calendar-header-hours,.mtx-calendar-header .mtx-calendar-header-minutes,.mtx-calendar-header .mtx-calendar-header-ampm{height:auto;min-width:auto;padding:0 4px;text-align:inherit;line-height:inherit;color:inherit;font-size:inherit;font-weight:inherit;letter-spacing:normal;white-space:normal;word-break:break-word}.mtx-calendar-header .mtx-calendar-header-year .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-date .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-hours .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-minutes .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-ampm .mat-mdc-button-touch-target{height:100%}.mtx-calendar-header .mtx-calendar-header-year{line-height:24px}.mtx-calendar-header-date-time{font-size:24px;line-height:36px}.mtx-calendar-header-year:not(.active),.mtx-calendar-header-date:not(.active),.mtx-calendar-header-hours:not(.active),.mtx-calendar-header-minutes:not(.active),.mtx-calendar-header-ampm:not(.active){opacity:.6}.mtx-calendar-header-year.not-clickable,.mtx-calendar-header-date.not-clickable,.mtx-calendar-header-hours.not-clickable,.mtx-calendar-header-minutes.not-clickable,.mtx-calendar-header-ampm.not-clickable{cursor:initial}.mtx-calendar-header-time{display:inline-flex}.mtx-calendar-header-time:not(.active){opacity:.6}.mtx-calendar-header-time:not(.active) .mtx-calendar-header-hours,.mtx-calendar-header-time:not(.active) .mtx-calendar-header-minutes,.mtx-calendar-header-time:not(.active) .mtx-calendar-header-ampm{opacity:1}.mtx-calendar-header-hour-minute-separator{display:inline-block;width:8px;text-align:center}.mtx-calendar-header-ampm-container{display:inline-flex;flex-direction:column;line-height:18px;font-size:12px}[mode=landscape] .mtx-calendar{display:flex}[mode=landscape] .mtx-calendar .mtx-calendar-header{width:144px;min-width:144px;padding:16px 8px;border-bottom-width:0;border-top-right-radius:0;border-bottom-right-radius:0;border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-top-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}[dir=rtl] [mode=landscape] .mtx-calendar .mtx-calendar-header{border-top-left-radius:0;border-bottom-left-radius:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-top-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}[mode=landscape] .mtx-calendar .mtx-calendar-header-year+.mtx-calendar-header-date-time,[mode=landscape] .mtx-calendar .mtx-calendar-header-date+.mtx-calendar-header-time{margin-top:4px}[mode=landscape] .mtx-calendar .mtx-calendar-header-date-time{font-size:28px}[mode=landscape] .mtx-calendar .mtx-calendar-header-time{display:flex;flex-direction:column}[mode=landscape] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-hours,[mode=landscape] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-minutes,[mode=landscape] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-ampm{width:40px;text-align:center}[mode=landscape] .mtx-calendar .mtx-calendar-header-ampm-container{flex-direction:row;font-size:20px}[mode=landscape] .mtx-calendar .mtx-calendar-header-ampm{padding:4px}[mode=landscape] .mtx-calendar .mtx-calendar-header-ampm+.mtx-calendar-header-ampm{margin:0 8px}[mode=landscape] .mtx-datetimepicker-content-container-with-actions .mtx-calendar .mtx-calendar-header{border-bottom-left-radius:0;border-bottom-right-radius:0}[mode=landscape] .mtx-datetimepicker-actions:before{position:absolute;top:0;left:0;box-sizing:border-box;width:144px;height:100%;content:\"\";border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));background-color:var(--mtx-datetimepicker-calendar-header-background-color);border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}[dir=rtl] [mode=landscape] .mtx-datetimepicker-actions:before{left:auto;right:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-bottom-left-radius:0;border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}@media all and (orientation: landscape){[mode=auto] .mtx-calendar{display:flex}[mode=auto] .mtx-calendar .mtx-calendar-header{width:144px;min-width:144px;padding:16px 8px;border-bottom-width:0;border-top-right-radius:0;border-bottom-right-radius:0;border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-top-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}[dir=rtl] [mode=auto] .mtx-calendar .mtx-calendar-header{border-top-left-radius:0;border-bottom-left-radius:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-top-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}[mode=auto] .mtx-calendar .mtx-calendar-header-year+.mtx-calendar-header-date-time,[mode=auto] .mtx-calendar .mtx-calendar-header-date+.mtx-calendar-header-time{margin-top:4px}[mode=auto] .mtx-calendar .mtx-calendar-header-date-time{font-size:28px}[mode=auto] .mtx-calendar .mtx-calendar-header-time{display:flex;flex-direction:column}[mode=auto] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-hours,[mode=auto] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-minutes,[mode=auto] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-ampm{width:40px;text-align:center}[mode=auto] .mtx-calendar .mtx-calendar-header-ampm-container{flex-direction:row;font-size:20px}[mode=auto] .mtx-calendar .mtx-calendar-header-ampm{padding:4px}[mode=auto] .mtx-calendar .mtx-calendar-header-ampm+.mtx-calendar-header-ampm{margin:0 8px}[mode=auto] .mtx-datetimepicker-content-container-with-actions .mtx-calendar .mtx-calendar-header{border-bottom-left-radius:0;border-bottom-right-radius:0}[mode=auto] .mtx-datetimepicker-actions:before{position:absolute;top:0;left:0;box-sizing:border-box;width:144px;height:100%;content:\"\";border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));background-color:var(--mtx-datetimepicker-calendar-header-background-color);border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}[dir=rtl] [mode=auto] .mtx-datetimepicker-actions:before{left:auto;right:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-bottom-left-radius:0;border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}}.mtx-calendar-content{width:100%;padding:8px;outline:none;box-sizing:border-box;overflow:hidden}.mtx-calendar-controls{display:flex;align-items:center;justify-content:space-between;margin:0 calc(4.7142857143% - 16px)}.mtx-calendar-controls .mat-icon-button:hover .mat-button-focus-overlay{opacity:.04}.mtx-calendar-period-button{display:inline-block;height:40px;line-height:40px;outline:none;border:0;background:transparent;box-sizing:border-box;font-size:var(--mtx-datetimepicker-calendar-period-button-text-size, var(--mat-app-title-small-size));font-weight:var(--mtx-datetimepicker-calendar-period-button-text-weight, var(--mat-app-title-small-weight))}.mtx-calendar-previous-button.disabled,.mtx-calendar-next-button.disabled{pointer-events:none;color:var(--mtx-datetimepicker-calendar-date-disabled-state-text-color)}.mtx-calendar-previous-button svg,.mtx-calendar-next-button svg{fill:currentColor;vertical-align:top}[dir=rtl] .mtx-calendar-previous-button svg,[dir=rtl] .mtx-calendar-next-button svg{transform:rotate(180deg)}.mtx-calendar-table{border-spacing:0;border-collapse:collapse;width:100%}.mtx-calendar-table-header th{text-align:center;padding:8px 0;color:var(--mtx-datetimepicker-calendar-table-header-text-color, var(--mat-app-on-surface));font-size:var(--mtx-datetimepicker-calendar-table-header-text-size);font-weight:var(--mtx-datetimepicker-calendar-table-header-text-weight)}\n"], dependencies: [{ kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MtxMonthView, selector: "mtx-month-view", inputs: ["type", "dateFilter", "activeDate", "selected"], outputs: ["selectedChange", "_userSelection"], exportAs: ["mtxMonthView"] }, { kind: "component", type: MtxYearView, selector: "mtx-year-view", inputs: ["type", "dateFilter", "activeDate", "selected"], outputs: ["selectedChange", "_userSelection"], exportAs: ["mtxYearView"] }, { kind: "component", type: MtxMultiYearView, selector: "mtx-multi-year-view", inputs: ["type", "dateFilter", "activeDate", "selected", "minDate", "maxDate"], outputs: ["selectedChange", "_userSelection"], exportAs: ["mtxMultiYearView"] }, { kind: "component", type: MtxTime, selector: "mtx-time", inputs: ["dateFilter", "interval", "actionsPortal", "autoFocus", "twelvehour", "AMPM", "activeDate", "selected", "minDate", "maxDate", "clockView"], outputs: ["selectedChange", "activeDateChange", "_userSelection", "ampmChange", "clockViewChange"], exportAs: ["mtxTime"] }, { kind: "component", type: MtxClock, selector: "mtx-clock", inputs: ["dateFilter", "interval", "actionButtons", "twelvehour", "AMPM", "activeDate", "selected", "minDate", "maxDate", "startView"], outputs: ["selectedChange", "activeDateChange", "_userSelection"], exportAs: ["mtxClock"] }], animations: [mtxDatetimepickerAnimations.slideCalendar], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2182
+ /** Returns the component instance that corresponds to the current calendar view. */
2183
+ _getCurrentViewComponent() {
2184
+ return this.monthView || this.yearView || this.multiYearView || this.timeView;
2185
+ }
2186
+ /** Focuses the active date. */
2187
+ focusActiveCell() {
2188
+ this._getCurrentViewComponent()._focusActiveCell(false);
2189
+ }
2190
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxCalendar, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2191
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.4", type: MtxCalendar, isStandalone: true, selector: "mtx-calendar", inputs: { multiYearSelector: ["multiYearSelector", "multiYearSelector", booleanAttribute], twelvehour: ["twelvehour", "twelvehour", booleanAttribute], startView: "startView", timeInterval: "timeInterval", dateFilter: "dateFilter", preventSameDateTimeSelection: ["preventSameDateTimeSelection", "preventSameDateTimeSelection", booleanAttribute], headerComponent: "headerComponent", actionsPortal: "actionsPortal", type: "type", startAt: "startAt", timeInput: ["timeInput", "timeInput", booleanAttribute], timeInputAutoFocus: ["timeInputAutoFocus", "timeInputAutoFocus", booleanAttribute], selected: "selected", minDate: "minDate", maxDate: "maxDate" }, outputs: { selectedChange: "selectedChange", viewChanged: "viewChanged", _userSelection: "_userSelection" }, host: { properties: { "class.mtx-calendar-with-time-input": "timeInput" }, classAttribute: "mtx-calendar" }, viewQueries: [{ propertyName: "monthView", first: true, predicate: MtxMonthView, descendants: true }, { propertyName: "yearView", first: true, predicate: MtxYearView, descendants: true }, { propertyName: "multiYearView", first: true, predicate: MtxMultiYearView, descendants: true }, { propertyName: "timeView", first: true, predicate: MtxTimeView, descendants: true }], exportAs: ["mtxCalendar"], ngImport: i0, template: "<div class=\"mtx-calendar-header\">\n @if (_calendarHeaderPortal) {\n <ng-template [cdkPortalOutlet]=\"_calendarHeaderPortal\"></ng-template>\n } @else {\n @if (type !== 'time') {\n <button\n mat-button type=\"button\" class=\"mtx-calendar-header-year\"\n [class.active]=\"currentView === 'year' || currentView === 'multi-year'\"\n [attr.aria-label]=\"_yearButtonLabel\"\n (click)=\"_yearClicked()\">\n <span>{{ _yearButtonText }}</span>\n @if (multiYearSelector || type === 'year') {\n <svg\n class=\"mtx-calendar-header-year-dropdown\" matButtonIcon iconPositionEnd\n width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M7,10L12,15L17,10H7Z\" />\n </svg>\n }\n </button>\n }\n @if (type !== 'year') {\n <div class=\"mtx-calendar-header-date-time\">\n @if (type !== 'time') {\n <button\n mat-button type=\"button\" class=\"mtx-calendar-header-date\"\n [class.active]=\"currentView === 'month'\"\n [class.not-clickable]=\"type === 'month'\"\n [attr.aria-label]=\"_dateButtonLabel\"\n (click)=\"_dateClicked()\">{{ _dateButtonText }}</button>\n }\n @if (type.endsWith('time')) {\n <span class=\"mtx-calendar-header-time\" [class.active]=\"currentView === 'clock'\">\n <span class=\"mtx-calendar-header-hour-minute-container\">\n <button mat-button type=\"button\" class=\"mtx-calendar-header-hours\"\n [class.active]=\"_clockView === 'hour'\"\n [attr.aria-label]=\"_hourButtonLabel\"\n (click)=\"_hoursClicked()\">{{ _hoursButtonText }}</button>\n <span class=\"mtx-calendar-header-hour-minute-separator\">:</span>\n <button mat-button type=\"button\" class=\"mtx-calendar-header-minutes\"\n [class.active]=\"_clockView === 'minute'\"\n [attr.aria-label]=\"_minuteButtonLabel\"\n (click)=\"_minutesClicked()\">{{ _minutesButtonText }}</button>\n </span>\n @if (twelvehour) {\n <span class=\"mtx-calendar-header-ampm-container\">\n <button mat-button type=\"button\" class=\"mtx-calendar-header-ampm\"\n [class.active]=\"_AMPM === 'AM'\" aria-label=\"AM\"\n (click)=\"_ampmClicked('AM')\">AM</button>\n <button mat-button type=\"button\" class=\"mtx-calendar-header-ampm\"\n [class.active]=\"_AMPM === 'PM'\" aria-label=\"PM\"\n (click)=\"_ampmClicked('PM')\">PM</button>\n </span>\n }\n </span>\n }\n </div>\n }\n }\n</div>\n\n<div class=\"mtx-calendar-content\">\n @if (currentView === 'month' || currentView === 'year' || currentView === 'multi-year') {\n <div class=\"mtx-calendar-controls\">\n <button mat-icon-button type=\"button\"\n class=\"mtx-calendar-previous-button\"\n [class.disabled]=\"!_previousEnabled()\"\n [attr.aria-disabled]=\"!_previousEnabled()\"\n [attr.aria-label]=\"_prevButtonLabel\"\n (click)=\"_previousClicked()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n </button>\n <div class=\"mtx-calendar-period-button\"\n [@slideCalendar]=\"_calendarState\"\n (@slideCalendar.done)=\"_calendarStateDone()\">\n <strong>{{ _yearPeriodText }}</strong>\n </div>\n <button mat-icon-button type=\"button\"\n class=\"mtx-calendar-next-button\"\n [class.disabled]=\"!_nextEnabled()\"\n [attr.aria-disabled]=\"!_nextEnabled()\"\n [attr.aria-label]=\"_nextButtonLabel\"\n (click)=\"_nextClicked()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n </div>\n }\n\n <div class=\"mtx-calendar-view\" cdkMonitorSubtreeFocus tabindex=\"-1\">\n @switch (currentView) {\n @case ('month') {\n <mtx-month-view\n (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_dateSelected($event)\"\n [(activeDate)]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [selected]=\"selected\"\n [type]=\"type\">\n </mtx-month-view>\n }\n @case ('year') {\n <mtx-year-view\n (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_monthSelected($event)\"\n [(activeDate)]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [selected]=\"selected\"\n [type]=\"type\">\n </mtx-year-view>\n }\n @case ('multi-year') {\n <mtx-multi-year-view\n (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_yearSelected($event)\"\n [(activeDate)]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"selected\"\n [type]=\"type\">\n </mtx-multi-year-view>\n }\n @default {\n <mtx-time-view\n (_userSelection)=\"_userSelected()\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (selectedChange)=\"_timeSelected($event)\"\n [AMPM]=\"_AMPM\"\n (ampmChange)=\"_ampmClicked($event)\"\n [clockView]=\"_clockView\"\n (clockViewChange)=\"_clockView = $event\"\n [twelvehour]=\"twelvehour\"\n [dateFilter]=\"dateFilter\"\n [interval]=\"timeInterval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [(selected)]=\"_activeDate\"\n [actionsPortal]=\"actionsPortal\"\n [autoFocus]=\"timeInputAutoFocus\"\n [timeInput]=\"timeInput\"\n [preventSameDateTimeSelection]=\"preventSameDateTimeSelection\">\n </mtx-time-view>\n }\n }\n </div>\n</div>\n", styles: [".mtx-calendar{display:block;outline:none;font-family:var(--mtx-datetimepicker-calendar-text-font, var(--mat-sys-body-large-font));font-size:var(--mtx-datetimepicker-calendar-text-size, var(--mat-sys-body-large-size))}.mtx-calendar-header{box-sizing:border-box;padding:8px;border-bottom:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-top-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));border-top-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));background-color:var(--mtx-datetimepicker-calendar-header-background-color, transparent);color:var(--mtx-datetimepicker-calendar-header-text-color, var(--mat-sys-on-surface-variant));--mdc-text-button-container-shape: var(--mtx-datetimepicker-selector-container-shape, var(--mat-sys-corner-small))}.mtx-calendar-header .mtx-calendar-header-year,.mtx-calendar-header .mtx-calendar-header-date,.mtx-calendar-header .mtx-calendar-header-hours,.mtx-calendar-header .mtx-calendar-header-minutes,.mtx-calendar-header .mtx-calendar-header-ampm{height:auto;min-width:auto;padding:0 4px;text-align:inherit;line-height:inherit;color:inherit;font-size:inherit;font-weight:inherit;letter-spacing:normal;white-space:normal;word-break:break-word}.mtx-calendar-header .mtx-calendar-header-year .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-date .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-hours .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-minutes .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-ampm .mat-mdc-button-touch-target{height:100%}.mtx-calendar-header .mtx-calendar-header-year{line-height:24px}.mtx-calendar-header-date-time{font-size:24px;line-height:36px}.mtx-calendar-header-year:not(.active),.mtx-calendar-header-date:not(.active),.mtx-calendar-header-hours:not(.active),.mtx-calendar-header-minutes:not(.active),.mtx-calendar-header-ampm:not(.active){opacity:.6}.mtx-calendar-header-year.not-clickable,.mtx-calendar-header-date.not-clickable,.mtx-calendar-header-hours.not-clickable,.mtx-calendar-header-minutes.not-clickable,.mtx-calendar-header-ampm.not-clickable{cursor:initial}.mtx-calendar-header-time{display:inline-flex}.mtx-calendar-header-time:not(.active){opacity:.6}.mtx-calendar-header-time:not(.active) .mtx-calendar-header-hours,.mtx-calendar-header-time:not(.active) .mtx-calendar-header-minutes,.mtx-calendar-header-time:not(.active) .mtx-calendar-header-ampm{opacity:1}.mtx-calendar-header-hour-minute-separator{display:inline-block;width:8px;text-align:center}.mtx-calendar-header-ampm-container{display:inline-flex;flex-direction:column;line-height:18px;font-size:12px}[mode=landscape] .mtx-calendar{display:flex}[mode=landscape] .mtx-calendar .mtx-calendar-header{width:144px;min-width:144px;padding:16px 8px;border-bottom-width:0;border-top-right-radius:0;border-bottom-right-radius:0;border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-top-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}[dir=rtl] [mode=landscape] .mtx-calendar .mtx-calendar-header{border-top-left-radius:0;border-bottom-left-radius:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-top-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}[mode=landscape] .mtx-calendar .mtx-calendar-header-year+.mtx-calendar-header-date-time,[mode=landscape] .mtx-calendar .mtx-calendar-header-date+.mtx-calendar-header-time{margin-top:4px}[mode=landscape] .mtx-calendar .mtx-calendar-header-date-time{font-size:28px}[mode=landscape] .mtx-calendar .mtx-calendar-header-time{display:flex;flex-direction:column}[mode=landscape] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-hours,[mode=landscape] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-minutes,[mode=landscape] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-ampm{width:40px;text-align:center}[mode=landscape] .mtx-calendar .mtx-calendar-header-ampm-container{flex-direction:row;font-size:20px}[mode=landscape] .mtx-calendar .mtx-calendar-header-ampm{padding:4px}[mode=landscape] .mtx-calendar .mtx-calendar-header-ampm+.mtx-calendar-header-ampm{margin:0 8px}[mode=landscape] .mtx-datetimepicker-content-container-with-actions .mtx-calendar .mtx-calendar-header{border-bottom-left-radius:0;border-bottom-right-radius:0}[mode=landscape] .mtx-datetimepicker-actions:before{position:absolute;top:0;left:0;box-sizing:border-box;width:144px;height:100%;content:\"\";border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));background-color:var(--mtx-datetimepicker-calendar-header-background-color, transparent);border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}[dir=rtl] [mode=landscape] .mtx-datetimepicker-actions:before{left:auto;right:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-bottom-left-radius:0;border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}@media all and (orientation: landscape){[mode=auto] .mtx-calendar{display:flex}[mode=auto] .mtx-calendar .mtx-calendar-header{width:144px;min-width:144px;padding:16px 8px;border-bottom-width:0;border-top-right-radius:0;border-bottom-right-radius:0;border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-top-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}[dir=rtl] [mode=auto] .mtx-calendar .mtx-calendar-header{border-top-left-radius:0;border-bottom-left-radius:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-top-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}[mode=auto] .mtx-calendar .mtx-calendar-header-year+.mtx-calendar-header-date-time,[mode=auto] .mtx-calendar .mtx-calendar-header-date+.mtx-calendar-header-time{margin-top:4px}[mode=auto] .mtx-calendar .mtx-calendar-header-date-time{font-size:28px}[mode=auto] .mtx-calendar .mtx-calendar-header-time{display:flex;flex-direction:column}[mode=auto] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-hours,[mode=auto] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-minutes,[mode=auto] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-ampm{width:40px;text-align:center}[mode=auto] .mtx-calendar .mtx-calendar-header-ampm-container{flex-direction:row;font-size:20px}[mode=auto] .mtx-calendar .mtx-calendar-header-ampm{padding:4px}[mode=auto] .mtx-calendar .mtx-calendar-header-ampm+.mtx-calendar-header-ampm{margin:0 8px}[mode=auto] .mtx-datetimepicker-content-container-with-actions .mtx-calendar .mtx-calendar-header{border-bottom-left-radius:0;border-bottom-right-radius:0}[mode=auto] .mtx-datetimepicker-actions:before{position:absolute;top:0;left:0;box-sizing:border-box;width:144px;height:100%;content:\"\";border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));background-color:var(--mtx-datetimepicker-calendar-header-background-color, transparent);border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}[dir=rtl] [mode=auto] .mtx-datetimepicker-actions:before{left:auto;right:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-bottom-left-radius:0;border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}}.mtx-calendar-content{width:100%;padding:8px;outline:none;box-sizing:border-box;overflow:hidden}.mtx-calendar-controls{display:flex;align-items:center;justify-content:space-between;margin:0 calc(4.7142857143% - 16px)}.mtx-calendar-controls .mat-icon-button:hover .mat-button-focus-overlay{opacity:.04}.mtx-calendar-period-button{display:inline-block;height:40px;line-height:40px;outline:none;border:0;background:transparent;box-sizing:border-box;font-size:var(--mtx-datetimepicker-calendar-period-button-text-size, var(--mat-sys-title-small-size));font-weight:var(--mtx-datetimepicker-calendar-period-button-text-weight, var(--mat-sys-title-small-weight))}.mtx-calendar-previous-button.disabled,.mtx-calendar-next-button.disabled{pointer-events:none;color:var(--mtx-datetimepicker-calendar-date-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mtx-calendar-previous-button svg,.mtx-calendar-next-button svg{fill:currentColor;vertical-align:top}[dir=rtl] .mtx-calendar-previous-button svg,[dir=rtl] .mtx-calendar-next-button svg{transform:rotate(180deg)}.mtx-calendar-table{border-spacing:0;border-collapse:collapse;width:100%}.mtx-calendar-table-header th{text-align:center;padding:8px 0;color:var(--mtx-datetimepicker-calendar-table-header-text-color, var(--mat-sys-on-surface));font-size:var(--mtx-datetimepicker-calendar-table-header-text-size);font-weight:var(--mtx-datetimepicker-calendar-table-header-text-weight)}\n"], dependencies: [{ kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "directive", type: CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MtxMonthView, selector: "mtx-month-view", inputs: ["type", "dateFilter", "activeDate", "selected"], outputs: ["selectedChange", "_userSelection", "activeDateChange"], exportAs: ["mtxMonthView"] }, { kind: "component", type: MtxYearView, selector: "mtx-year-view", inputs: ["type", "dateFilter", "activeDate", "selected"], outputs: ["selectedChange", "_userSelection", "activeDateChange"], exportAs: ["mtxYearView"] }, { kind: "component", type: MtxMultiYearView, selector: "mtx-multi-year-view", inputs: ["type", "dateFilter", "activeDate", "selected", "minDate", "maxDate"], outputs: ["selectedChange", "_userSelection", "activeDateChange"], exportAs: ["mtxMultiYearView"] }, { kind: "component", type: MtxTimeView, selector: "mtx-time-view", inputs: ["dateFilter", "timeInput", "interval", "actionsPortal", "preventSameDateTimeSelection", "autoFocus", "twelvehour", "AMPM", "activeDate", "selected", "minDate", "maxDate", "clockView"], outputs: ["selectedChange", "activeDateChange", "_userSelection", "ampmChange", "clockViewChange"], exportAs: ["mtxTime"] }], animations: [mtxDatetimepickerAnimations.slideCalendar], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2092
2192
  }
2093
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxCalendar, decorators: [{
2193
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxCalendar, decorators: [{
2094
2194
  type: Component,
2095
2195
  args: [{ selector: 'mtx-calendar', host: {
2096
2196
  'class': 'mtx-calendar',
2097
2197
  '[class.mtx-calendar-with-time-input]': 'timeInput',
2098
- 'tabindex': '0',
2099
- '(keydown)': '_handleCalendarBodyKeydown($event)',
2100
- }, exportAs: 'mtxCalendar', animations: [mtxDatetimepickerAnimations.slideCalendar], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
2198
+ }, exportAs: 'mtxCalendar', animations: [mtxDatetimepickerAnimations.slideCalendar], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
2101
2199
  CdkPortalOutlet,
2200
+ CdkMonitorFocus,
2102
2201
  MatButton,
2103
2202
  MatIconButton,
2104
2203
  MtxMonthView,
2105
2204
  MtxYearView,
2106
2205
  MtxMultiYearView,
2107
- MtxTime,
2108
- MtxClock,
2109
- ], template: "<div class=\"mtx-calendar-header\">\n @if (_calendarHeaderPortal) {\n <ng-template [cdkPortalOutlet]=\"_calendarHeaderPortal\"></ng-template>\n } @else {\n @if (type !== 'time') {\n <button\n mat-button type=\"button\" class=\"mtx-calendar-header-year\"\n [class.active]=\"currentView === 'year' || currentView === 'multi-year'\"\n [attr.aria-label]=\"_yearButtonLabel\"\n (click)=\"_yearClicked()\">\n <span>{{ _yearButtonText }}</span>\n @if (multiYearSelector || type === 'year') {\n <svg\n class=\"mtx-calendar-header-year-dropdown\" matButtonIcon iconPositionEnd\n width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M7,10L12,15L17,10H7Z\" />\n </svg>\n }\n </button>\n }\n @if (type !== 'year') {\n <div class=\"mtx-calendar-header-date-time\">\n @if (type !== 'time') {\n <button\n mat-button type=\"button\" class=\"mtx-calendar-header-date\"\n [class.active]=\"currentView === 'month'\"\n [class.not-clickable]=\"type === 'month'\"\n [attr.aria-label]=\"_dateButtonLabel\"\n (click)=\"_dateClicked()\">{{ _dateButtonText }}</button>\n }\n @if (type.endsWith('time')) {\n <span class=\"mtx-calendar-header-time\" [class.active]=\"currentView === 'clock'\">\n <span class=\"mtx-calendar-header-hour-minute-container\">\n <button mat-button type=\"button\" class=\"mtx-calendar-header-hours\"\n [class.active]=\"_clockView === 'hour'\"\n [attr.aria-label]=\"_hourButtonLabel\"\n (click)=\"_hoursClicked()\">{{ _hoursButtonText }}</button>\n <span class=\"mtx-calendar-header-hour-minute-separator\">:</span>\n <button mat-button type=\"button\" class=\"mtx-calendar-header-minutes\"\n [class.active]=\"_clockView === 'minute'\"\n [attr.aria-label]=\"_minuteButtonLabel\"\n (click)=\"_minutesClicked()\">{{ _minutesButtonText }}</button>\n </span>\n @if (twelvehour) {\n <span class=\"mtx-calendar-header-ampm-container\">\n <button mat-button type=\"button\" class=\"mtx-calendar-header-ampm\"\n [class.active]=\"_AMPM === 'AM'\" aria-label=\"AM\"\n (click)=\"_ampmClicked('AM')\">AM</button>\n <button mat-button type=\"button\" class=\"mtx-calendar-header-ampm\"\n [class.active]=\"_AMPM === 'PM'\" aria-label=\"PM\"\n (click)=\"_ampmClicked('PM')\">PM</button>\n </span>\n }\n </span>\n }\n </div>\n }\n }\n</div>\n\n<div class=\"mtx-calendar-content\">\n @if (currentView === 'month' || currentView === 'year' || currentView === 'multi-year') {\n <div class=\"mtx-month-content\">\n <div class=\"mtx-calendar-controls\">\n <button mat-icon-button type=\"button\"\n class=\"mtx-calendar-previous-button\"\n [class.disabled]=\"!_previousEnabled()\"\n [attr.aria-disabled]=\"!_previousEnabled()\"\n [attr.aria-label]=\"_prevButtonLabel\"\n (click)=\"_previousClicked()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n </button>\n <div class=\"mtx-calendar-period-button\"\n [@slideCalendar]=\"_calendarState\"\n (@slideCalendar.done)=\"_calendarStateDone()\">\n <strong>{{ _yearPeriodText }}</strong>\n </div>\n <button mat-icon-button type=\"button\"\n class=\"mtx-calendar-next-button\"\n [class.disabled]=\"!_nextEnabled()\"\n [attr.aria-disabled]=\"!_nextEnabled()\"\n [attr.aria-label]=\"_nextButtonLabel\"\n (click)=\"_nextClicked()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n </div>\n </div>\n }\n\n @switch (currentView) {\n @case ('month') {\n <mtx-month-view\n (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_dateSelected($event)\"\n [activeDate]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [selected]=\"selected!\"\n [type]=\"type\">\n </mtx-month-view>\n }\n @case ('year') {\n <mtx-year-view\n (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_monthSelected($event)\"\n [activeDate]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [selected]=\"selected!\"\n [type]=\"type\">\n </mtx-year-view>\n }\n @case ('multi-year') {\n <mtx-multi-year-view\n (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_yearSelected($event)\"\n [activeDate]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"selected!\"\n [type]=\"type\">\n </mtx-multi-year-view>\n }\n @default {\n @if (timeInput) {\n <mtx-time\n (_userSelection)=\"_userSelected()\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (selectedChange)=\"_timeSelected($event)\"\n [AMPM]=\"_AMPM\"\n (ampmChange)=\"_ampmClicked($event)\"\n [clockView]=\"_clockView\"\n (clockViewChange)=\"_clockView = $event\"\n [twelvehour]=\"twelvehour\"\n [dateFilter]=\"dateFilter\"\n [interval]=\"timeInterval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"_activeDate\"\n [actionsPortal]=\"actionsPortal\"\n [autoFocus]=\"timeInputAutoFocus\">\n </mtx-time>\n } @else {\n <mtx-clock (_userSelection)=\"_userSelected()\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (selectedChange)=\"_dialTimeSelected($event)\"\n [AMPM]=\"_AMPM\"\n [dateFilter]=\"dateFilter\"\n [interval]=\"timeInterval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"_activeDate\"\n [startView]=\"_clockView\"\n [twelvehour]=\"twelvehour\">\n </mtx-clock>\n }\n }\n }\n</div>\n", styles: [".mtx-calendar{display:block;outline:none;font-family:var(--mtx-datetimepicker-calendar-text-font, var(--mat-app-body-large-font));font-size:var(--mtx-datetimepicker-calendar-text-size, var(--mat-app-body-large-size))}.mtx-calendar-header{box-sizing:border-box;padding:8px;border-bottom:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-top-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));border-top-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));background-color:var(--mtx-datetimepicker-calendar-header-background-color);color:var(--mtx-datetimepicker-calendar-header-text-color, var(--mat-app-on-surface-variant));--mdc-text-button-container-shape: var(--mtx-datetimepicker-selector-container-shape, var(--mat-app-corner-small))}.mtx-calendar-header .mtx-calendar-header-year,.mtx-calendar-header .mtx-calendar-header-date,.mtx-calendar-header .mtx-calendar-header-hours,.mtx-calendar-header .mtx-calendar-header-minutes,.mtx-calendar-header .mtx-calendar-header-ampm{height:auto;min-width:auto;padding:0 4px;text-align:inherit;line-height:inherit;color:inherit;font-size:inherit;font-weight:inherit;letter-spacing:normal;white-space:normal;word-break:break-word}.mtx-calendar-header .mtx-calendar-header-year .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-date .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-hours .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-minutes .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-ampm .mat-mdc-button-touch-target{height:100%}.mtx-calendar-header .mtx-calendar-header-year{line-height:24px}.mtx-calendar-header-date-time{font-size:24px;line-height:36px}.mtx-calendar-header-year:not(.active),.mtx-calendar-header-date:not(.active),.mtx-calendar-header-hours:not(.active),.mtx-calendar-header-minutes:not(.active),.mtx-calendar-header-ampm:not(.active){opacity:.6}.mtx-calendar-header-year.not-clickable,.mtx-calendar-header-date.not-clickable,.mtx-calendar-header-hours.not-clickable,.mtx-calendar-header-minutes.not-clickable,.mtx-calendar-header-ampm.not-clickable{cursor:initial}.mtx-calendar-header-time{display:inline-flex}.mtx-calendar-header-time:not(.active){opacity:.6}.mtx-calendar-header-time:not(.active) .mtx-calendar-header-hours,.mtx-calendar-header-time:not(.active) .mtx-calendar-header-minutes,.mtx-calendar-header-time:not(.active) .mtx-calendar-header-ampm{opacity:1}.mtx-calendar-header-hour-minute-separator{display:inline-block;width:8px;text-align:center}.mtx-calendar-header-ampm-container{display:inline-flex;flex-direction:column;line-height:18px;font-size:12px}[mode=landscape] .mtx-calendar{display:flex}[mode=landscape] .mtx-calendar .mtx-calendar-header{width:144px;min-width:144px;padding:16px 8px;border-bottom-width:0;border-top-right-radius:0;border-bottom-right-radius:0;border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-top-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}[dir=rtl] [mode=landscape] .mtx-calendar .mtx-calendar-header{border-top-left-radius:0;border-bottom-left-radius:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-top-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}[mode=landscape] .mtx-calendar .mtx-calendar-header-year+.mtx-calendar-header-date-time,[mode=landscape] .mtx-calendar .mtx-calendar-header-date+.mtx-calendar-header-time{margin-top:4px}[mode=landscape] .mtx-calendar .mtx-calendar-header-date-time{font-size:28px}[mode=landscape] .mtx-calendar .mtx-calendar-header-time{display:flex;flex-direction:column}[mode=landscape] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-hours,[mode=landscape] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-minutes,[mode=landscape] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-ampm{width:40px;text-align:center}[mode=landscape] .mtx-calendar .mtx-calendar-header-ampm-container{flex-direction:row;font-size:20px}[mode=landscape] .mtx-calendar .mtx-calendar-header-ampm{padding:4px}[mode=landscape] .mtx-calendar .mtx-calendar-header-ampm+.mtx-calendar-header-ampm{margin:0 8px}[mode=landscape] .mtx-datetimepicker-content-container-with-actions .mtx-calendar .mtx-calendar-header{border-bottom-left-radius:0;border-bottom-right-radius:0}[mode=landscape] .mtx-datetimepicker-actions:before{position:absolute;top:0;left:0;box-sizing:border-box;width:144px;height:100%;content:\"\";border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));background-color:var(--mtx-datetimepicker-calendar-header-background-color);border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}[dir=rtl] [mode=landscape] .mtx-datetimepicker-actions:before{left:auto;right:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-bottom-left-radius:0;border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}@media all and (orientation: landscape){[mode=auto] .mtx-calendar{display:flex}[mode=auto] .mtx-calendar .mtx-calendar-header{width:144px;min-width:144px;padding:16px 8px;border-bottom-width:0;border-top-right-radius:0;border-bottom-right-radius:0;border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-top-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}[dir=rtl] [mode=auto] .mtx-calendar .mtx-calendar-header{border-top-left-radius:0;border-bottom-left-radius:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-top-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}[mode=auto] .mtx-calendar .mtx-calendar-header-year+.mtx-calendar-header-date-time,[mode=auto] .mtx-calendar .mtx-calendar-header-date+.mtx-calendar-header-time{margin-top:4px}[mode=auto] .mtx-calendar .mtx-calendar-header-date-time{font-size:28px}[mode=auto] .mtx-calendar .mtx-calendar-header-time{display:flex;flex-direction:column}[mode=auto] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-hours,[mode=auto] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-minutes,[mode=auto] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-ampm{width:40px;text-align:center}[mode=auto] .mtx-calendar .mtx-calendar-header-ampm-container{flex-direction:row;font-size:20px}[mode=auto] .mtx-calendar .mtx-calendar-header-ampm{padding:4px}[mode=auto] .mtx-calendar .mtx-calendar-header-ampm+.mtx-calendar-header-ampm{margin:0 8px}[mode=auto] .mtx-datetimepicker-content-container-with-actions .mtx-calendar .mtx-calendar-header{border-bottom-left-radius:0;border-bottom-right-radius:0}[mode=auto] .mtx-datetimepicker-actions:before{position:absolute;top:0;left:0;box-sizing:border-box;width:144px;height:100%;content:\"\";border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));background-color:var(--mtx-datetimepicker-calendar-header-background-color);border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}[dir=rtl] [mode=auto] .mtx-datetimepicker-actions:before{left:auto;right:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-app-outline-variant));border-bottom-left-radius:0;border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large))}}.mtx-calendar-content{width:100%;padding:8px;outline:none;box-sizing:border-box;overflow:hidden}.mtx-calendar-controls{display:flex;align-items:center;justify-content:space-between;margin:0 calc(4.7142857143% - 16px)}.mtx-calendar-controls .mat-icon-button:hover .mat-button-focus-overlay{opacity:.04}.mtx-calendar-period-button{display:inline-block;height:40px;line-height:40px;outline:none;border:0;background:transparent;box-sizing:border-box;font-size:var(--mtx-datetimepicker-calendar-period-button-text-size, var(--mat-app-title-small-size));font-weight:var(--mtx-datetimepicker-calendar-period-button-text-weight, var(--mat-app-title-small-weight))}.mtx-calendar-previous-button.disabled,.mtx-calendar-next-button.disabled{pointer-events:none;color:var(--mtx-datetimepicker-calendar-date-disabled-state-text-color)}.mtx-calendar-previous-button svg,.mtx-calendar-next-button svg{fill:currentColor;vertical-align:top}[dir=rtl] .mtx-calendar-previous-button svg,[dir=rtl] .mtx-calendar-next-button svg{transform:rotate(180deg)}.mtx-calendar-table{border-spacing:0;border-collapse:collapse;width:100%}.mtx-calendar-table-header th{text-align:center;padding:8px 0;color:var(--mtx-datetimepicker-calendar-table-header-text-color, var(--mat-app-on-surface));font-size:var(--mtx-datetimepicker-calendar-table-header-text-size);font-weight:var(--mtx-datetimepicker-calendar-table-header-text-weight)}\n"] }]
2110
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: MtxDatetimepickerIntl }, { type: i0.NgZone }, { type: i1.DatetimeAdapter, decorators: [{
2111
- type: Optional
2112
- }] }, { type: undefined, decorators: [{
2113
- type: Optional
2114
- }, {
2115
- type: Inject,
2116
- args: [MTX_DATETIME_FORMATS]
2117
- }] }, { type: i0.ChangeDetectorRef }], propDecorators: { multiYearSelector: [{
2206
+ MtxTimeView,
2207
+ ], template: "<div class=\"mtx-calendar-header\">\n @if (_calendarHeaderPortal) {\n <ng-template [cdkPortalOutlet]=\"_calendarHeaderPortal\"></ng-template>\n } @else {\n @if (type !== 'time') {\n <button\n mat-button type=\"button\" class=\"mtx-calendar-header-year\"\n [class.active]=\"currentView === 'year' || currentView === 'multi-year'\"\n [attr.aria-label]=\"_yearButtonLabel\"\n (click)=\"_yearClicked()\">\n <span>{{ _yearButtonText }}</span>\n @if (multiYearSelector || type === 'year') {\n <svg\n class=\"mtx-calendar-header-year-dropdown\" matButtonIcon iconPositionEnd\n width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M7,10L12,15L17,10H7Z\" />\n </svg>\n }\n </button>\n }\n @if (type !== 'year') {\n <div class=\"mtx-calendar-header-date-time\">\n @if (type !== 'time') {\n <button\n mat-button type=\"button\" class=\"mtx-calendar-header-date\"\n [class.active]=\"currentView === 'month'\"\n [class.not-clickable]=\"type === 'month'\"\n [attr.aria-label]=\"_dateButtonLabel\"\n (click)=\"_dateClicked()\">{{ _dateButtonText }}</button>\n }\n @if (type.endsWith('time')) {\n <span class=\"mtx-calendar-header-time\" [class.active]=\"currentView === 'clock'\">\n <span class=\"mtx-calendar-header-hour-minute-container\">\n <button mat-button type=\"button\" class=\"mtx-calendar-header-hours\"\n [class.active]=\"_clockView === 'hour'\"\n [attr.aria-label]=\"_hourButtonLabel\"\n (click)=\"_hoursClicked()\">{{ _hoursButtonText }}</button>\n <span class=\"mtx-calendar-header-hour-minute-separator\">:</span>\n <button mat-button type=\"button\" class=\"mtx-calendar-header-minutes\"\n [class.active]=\"_clockView === 'minute'\"\n [attr.aria-label]=\"_minuteButtonLabel\"\n (click)=\"_minutesClicked()\">{{ _minutesButtonText }}</button>\n </span>\n @if (twelvehour) {\n <span class=\"mtx-calendar-header-ampm-container\">\n <button mat-button type=\"button\" class=\"mtx-calendar-header-ampm\"\n [class.active]=\"_AMPM === 'AM'\" aria-label=\"AM\"\n (click)=\"_ampmClicked('AM')\">AM</button>\n <button mat-button type=\"button\" class=\"mtx-calendar-header-ampm\"\n [class.active]=\"_AMPM === 'PM'\" aria-label=\"PM\"\n (click)=\"_ampmClicked('PM')\">PM</button>\n </span>\n }\n </span>\n }\n </div>\n }\n }\n</div>\n\n<div class=\"mtx-calendar-content\">\n @if (currentView === 'month' || currentView === 'year' || currentView === 'multi-year') {\n <div class=\"mtx-calendar-controls\">\n <button mat-icon-button type=\"button\"\n class=\"mtx-calendar-previous-button\"\n [class.disabled]=\"!_previousEnabled()\"\n [attr.aria-disabled]=\"!_previousEnabled()\"\n [attr.aria-label]=\"_prevButtonLabel\"\n (click)=\"_previousClicked()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n </button>\n <div class=\"mtx-calendar-period-button\"\n [@slideCalendar]=\"_calendarState\"\n (@slideCalendar.done)=\"_calendarStateDone()\">\n <strong>{{ _yearPeriodText }}</strong>\n </div>\n <button mat-icon-button type=\"button\"\n class=\"mtx-calendar-next-button\"\n [class.disabled]=\"!_nextEnabled()\"\n [attr.aria-disabled]=\"!_nextEnabled()\"\n [attr.aria-label]=\"_nextButtonLabel\"\n (click)=\"_nextClicked()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n </div>\n }\n\n <div class=\"mtx-calendar-view\" cdkMonitorSubtreeFocus tabindex=\"-1\">\n @switch (currentView) {\n @case ('month') {\n <mtx-month-view\n (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_dateSelected($event)\"\n [(activeDate)]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [selected]=\"selected\"\n [type]=\"type\">\n </mtx-month-view>\n }\n @case ('year') {\n <mtx-year-view\n (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_monthSelected($event)\"\n [(activeDate)]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [selected]=\"selected\"\n [type]=\"type\">\n </mtx-year-view>\n }\n @case ('multi-year') {\n <mtx-multi-year-view\n (_userSelection)=\"_userSelected()\"\n (selectedChange)=\"_yearSelected($event)\"\n [(activeDate)]=\"_activeDate\"\n [dateFilter]=\"_dateFilterForViews\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [selected]=\"selected\"\n [type]=\"type\">\n </mtx-multi-year-view>\n }\n @default {\n <mtx-time-view\n (_userSelection)=\"_userSelected()\"\n (activeDateChange)=\"_onActiveDateChange($event)\"\n (selectedChange)=\"_timeSelected($event)\"\n [AMPM]=\"_AMPM\"\n (ampmChange)=\"_ampmClicked($event)\"\n [clockView]=\"_clockView\"\n (clockViewChange)=\"_clockView = $event\"\n [twelvehour]=\"twelvehour\"\n [dateFilter]=\"dateFilter\"\n [interval]=\"timeInterval\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [(selected)]=\"_activeDate\"\n [actionsPortal]=\"actionsPortal\"\n [autoFocus]=\"timeInputAutoFocus\"\n [timeInput]=\"timeInput\"\n [preventSameDateTimeSelection]=\"preventSameDateTimeSelection\">\n </mtx-time-view>\n }\n }\n </div>\n</div>\n", styles: [".mtx-calendar{display:block;outline:none;font-family:var(--mtx-datetimepicker-calendar-text-font, var(--mat-sys-body-large-font));font-size:var(--mtx-datetimepicker-calendar-text-size, var(--mat-sys-body-large-size))}.mtx-calendar-header{box-sizing:border-box;padding:8px;border-bottom:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-top-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));border-top-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));background-color:var(--mtx-datetimepicker-calendar-header-background-color, transparent);color:var(--mtx-datetimepicker-calendar-header-text-color, var(--mat-sys-on-surface-variant));--mdc-text-button-container-shape: var(--mtx-datetimepicker-selector-container-shape, var(--mat-sys-corner-small))}.mtx-calendar-header .mtx-calendar-header-year,.mtx-calendar-header .mtx-calendar-header-date,.mtx-calendar-header .mtx-calendar-header-hours,.mtx-calendar-header .mtx-calendar-header-minutes,.mtx-calendar-header .mtx-calendar-header-ampm{height:auto;min-width:auto;padding:0 4px;text-align:inherit;line-height:inherit;color:inherit;font-size:inherit;font-weight:inherit;letter-spacing:normal;white-space:normal;word-break:break-word}.mtx-calendar-header .mtx-calendar-header-year .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-date .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-hours .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-minutes .mat-mdc-button-touch-target,.mtx-calendar-header .mtx-calendar-header-ampm .mat-mdc-button-touch-target{height:100%}.mtx-calendar-header .mtx-calendar-header-year{line-height:24px}.mtx-calendar-header-date-time{font-size:24px;line-height:36px}.mtx-calendar-header-year:not(.active),.mtx-calendar-header-date:not(.active),.mtx-calendar-header-hours:not(.active),.mtx-calendar-header-minutes:not(.active),.mtx-calendar-header-ampm:not(.active){opacity:.6}.mtx-calendar-header-year.not-clickable,.mtx-calendar-header-date.not-clickable,.mtx-calendar-header-hours.not-clickable,.mtx-calendar-header-minutes.not-clickable,.mtx-calendar-header-ampm.not-clickable{cursor:initial}.mtx-calendar-header-time{display:inline-flex}.mtx-calendar-header-time:not(.active){opacity:.6}.mtx-calendar-header-time:not(.active) .mtx-calendar-header-hours,.mtx-calendar-header-time:not(.active) .mtx-calendar-header-minutes,.mtx-calendar-header-time:not(.active) .mtx-calendar-header-ampm{opacity:1}.mtx-calendar-header-hour-minute-separator{display:inline-block;width:8px;text-align:center}.mtx-calendar-header-ampm-container{display:inline-flex;flex-direction:column;line-height:18px;font-size:12px}[mode=landscape] .mtx-calendar{display:flex}[mode=landscape] .mtx-calendar .mtx-calendar-header{width:144px;min-width:144px;padding:16px 8px;border-bottom-width:0;border-top-right-radius:0;border-bottom-right-radius:0;border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-top-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}[dir=rtl] [mode=landscape] .mtx-calendar .mtx-calendar-header{border-top-left-radius:0;border-bottom-left-radius:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-top-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}[mode=landscape] .mtx-calendar .mtx-calendar-header-year+.mtx-calendar-header-date-time,[mode=landscape] .mtx-calendar .mtx-calendar-header-date+.mtx-calendar-header-time{margin-top:4px}[mode=landscape] .mtx-calendar .mtx-calendar-header-date-time{font-size:28px}[mode=landscape] .mtx-calendar .mtx-calendar-header-time{display:flex;flex-direction:column}[mode=landscape] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-hours,[mode=landscape] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-minutes,[mode=landscape] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-ampm{width:40px;text-align:center}[mode=landscape] .mtx-calendar .mtx-calendar-header-ampm-container{flex-direction:row;font-size:20px}[mode=landscape] .mtx-calendar .mtx-calendar-header-ampm{padding:4px}[mode=landscape] .mtx-calendar .mtx-calendar-header-ampm+.mtx-calendar-header-ampm{margin:0 8px}[mode=landscape] .mtx-datetimepicker-content-container-with-actions .mtx-calendar .mtx-calendar-header{border-bottom-left-radius:0;border-bottom-right-radius:0}[mode=landscape] .mtx-datetimepicker-actions:before{position:absolute;top:0;left:0;box-sizing:border-box;width:144px;height:100%;content:\"\";border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));background-color:var(--mtx-datetimepicker-calendar-header-background-color, transparent);border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}[dir=rtl] [mode=landscape] .mtx-datetimepicker-actions:before{left:auto;right:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-bottom-left-radius:0;border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}@media all and (orientation: landscape){[mode=auto] .mtx-calendar{display:flex}[mode=auto] .mtx-calendar .mtx-calendar-header{width:144px;min-width:144px;padding:16px 8px;border-bottom-width:0;border-top-right-radius:0;border-bottom-right-radius:0;border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-top-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}[dir=rtl] [mode=auto] .mtx-calendar .mtx-calendar-header{border-top-left-radius:0;border-bottom-left-radius:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-top-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}[mode=auto] .mtx-calendar .mtx-calendar-header-year+.mtx-calendar-header-date-time,[mode=auto] .mtx-calendar .mtx-calendar-header-date+.mtx-calendar-header-time{margin-top:4px}[mode=auto] .mtx-calendar .mtx-calendar-header-date-time{font-size:28px}[mode=auto] .mtx-calendar .mtx-calendar-header-time{display:flex;flex-direction:column}[mode=auto] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-hours,[mode=auto] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-minutes,[mode=auto] .mtx-calendar .mtx-calendar-header-time .mtx-calendar-header-ampm{width:40px;text-align:center}[mode=auto] .mtx-calendar .mtx-calendar-header-ampm-container{flex-direction:row;font-size:20px}[mode=auto] .mtx-calendar .mtx-calendar-header-ampm{padding:4px}[mode=auto] .mtx-calendar .mtx-calendar-header-ampm+.mtx-calendar-header-ampm{margin:0 8px}[mode=auto] .mtx-datetimepicker-content-container-with-actions .mtx-calendar .mtx-calendar-header{border-bottom-left-radius:0;border-bottom-right-radius:0}[mode=auto] .mtx-datetimepicker-actions:before{position:absolute;top:0;left:0;box-sizing:border-box;width:144px;height:100%;content:\"\";border-right:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));background-color:var(--mtx-datetimepicker-calendar-header-background-color, transparent);border-bottom-left-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}[dir=rtl] [mode=auto] .mtx-datetimepicker-actions:before{left:auto;right:0;border-right-width:0;border-left:1px solid var(--mtx-datetimepicker-calendar-header-divider-color, var(--mat-sys-outline-variant));border-bottom-left-radius:0;border-bottom-right-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large))}}.mtx-calendar-content{width:100%;padding:8px;outline:none;box-sizing:border-box;overflow:hidden}.mtx-calendar-controls{display:flex;align-items:center;justify-content:space-between;margin:0 calc(4.7142857143% - 16px)}.mtx-calendar-controls .mat-icon-button:hover .mat-button-focus-overlay{opacity:.04}.mtx-calendar-period-button{display:inline-block;height:40px;line-height:40px;outline:none;border:0;background:transparent;box-sizing:border-box;font-size:var(--mtx-datetimepicker-calendar-period-button-text-size, var(--mat-sys-title-small-size));font-weight:var(--mtx-datetimepicker-calendar-period-button-text-weight, var(--mat-sys-title-small-weight))}.mtx-calendar-previous-button.disabled,.mtx-calendar-next-button.disabled{pointer-events:none;color:var(--mtx-datetimepicker-calendar-date-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mtx-calendar-previous-button svg,.mtx-calendar-next-button svg{fill:currentColor;vertical-align:top}[dir=rtl] .mtx-calendar-previous-button svg,[dir=rtl] .mtx-calendar-next-button svg{transform:rotate(180deg)}.mtx-calendar-table{border-spacing:0;border-collapse:collapse;width:100%}.mtx-calendar-table-header th{text-align:center;padding:8px 0;color:var(--mtx-datetimepicker-calendar-table-header-text-color, var(--mat-sys-on-surface));font-size:var(--mtx-datetimepicker-calendar-table-header-text-size);font-weight:var(--mtx-datetimepicker-calendar-table-header-text-weight)}\n"] }]
2208
+ }], ctorParameters: () => [], propDecorators: { multiYearSelector: [{
2118
2209
  type: Input,
2119
2210
  args: [{ transform: booleanAttribute }]
2120
2211
  }], twelvehour: [{
@@ -2127,7 +2218,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
2127
2218
  }], dateFilter: [{
2128
2219
  type: Input
2129
2220
  }], preventSameDateTimeSelection: [{
2130
- type: Input
2221
+ type: Input,
2222
+ args: [{ transform: booleanAttribute }]
2131
2223
  }], headerComponent: [{
2132
2224
  type: Input
2133
2225
  }], actionsPortal: [{
@@ -2138,6 +2230,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
2138
2230
  type: Output
2139
2231
  }], _userSelection: [{
2140
2232
  type: Output
2233
+ }], monthView: [{
2234
+ type: ViewChild,
2235
+ args: [MtxMonthView]
2236
+ }], yearView: [{
2237
+ type: ViewChild,
2238
+ args: [MtxYearView]
2239
+ }], multiYearView: [{
2240
+ type: ViewChild,
2241
+ args: [MtxMultiYearView]
2242
+ }], timeView: [{
2243
+ type: ViewChild,
2244
+ args: [MtxTimeView]
2141
2245
  }], type: [{
2142
2246
  type: Input
2143
2247
  }], startAt: [{
@@ -2182,8 +2286,8 @@ const MTX_DATETIMEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER = {
2182
2286
  * @docs-private
2183
2287
  */
2184
2288
  class MtxDatetimepickerContent {
2185
- constructor(_changeDetectorRef) {
2186
- this._changeDetectorRef = _changeDetectorRef;
2289
+ constructor() {
2290
+ this._changeDetectorRef = inject(ChangeDetectorRef);
2187
2291
  /** Emits when an animation has finished. */
2188
2292
  this._animationDone = new Subject();
2189
2293
  /** Id of the label for the `role="dialog"` element. */
@@ -2194,6 +2298,12 @@ class MtxDatetimepickerContent {
2194
2298
  this.type = 'datetime';
2195
2299
  /** The view of the calendar. */
2196
2300
  this.view = 'month';
2301
+ /** Text for the close button. */
2302
+ this._closeButtonText = '';
2303
+ /** Whether the close button currently has focus. */
2304
+ this._closeButtonFocused = false;
2305
+ const intl = inject(MtxDatetimepickerIntl);
2306
+ this._closeButtonText = intl.closeCalendarLabel;
2197
2307
  }
2198
2308
  _viewChanged(view) {
2199
2309
  this.view = view;
@@ -2201,8 +2311,8 @@ class MtxDatetimepickerContent {
2201
2311
  ngOnInit() {
2202
2312
  this._animationState = this.datetimepicker.touchUi ? 'enter-dialog' : 'enter-dropdown';
2203
2313
  }
2204
- ngAfterContentInit() {
2205
- this._calendar._focusActiveCell();
2314
+ ngAfterViewInit() {
2315
+ this._calendar.focusActiveCell();
2206
2316
  }
2207
2317
  ngOnDestroy() {
2208
2318
  this._animationDone.complete();
@@ -2228,13 +2338,13 @@ class MtxDatetimepickerContent {
2228
2338
  this._changeDetectorRef.detectChanges();
2229
2339
  }
2230
2340
  }
2231
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerContent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
2232
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: MtxDatetimepickerContent, isStandalone: true, selector: "mtx-datetimepicker-content", inputs: { color: "color" }, host: { listeners: { "@transformPanel.done": "_animationDone.next()" }, properties: { "class": "color ? \"mat-\" + color : \"\"", "class.mtx-datetimepicker-content-touch": "datetimepicker?.touchUi", "attr.mode": "datetimepicker.mode", "@transformPanel": "_animationState" }, classAttribute: "mtx-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: MtxCalendar, descendants: true, static: true }], ngImport: i0, template: "<div cdkTrapFocus\n role=\"dialog\"\n [attr.aria-modal]=\"true\"\n [attr.aria-labelledby]=\"_dialogLabelId ?? undefined\"\n [attr.mode]=\"datetimepicker.mode\"\n class=\"mtx-datetimepicker-content-container\"\n [class.mtx-datetimepicker-content-container-with-custom-header]=\"datetimepicker.calendarHeaderComponent\"\n [class.mtx-datetimepicker-content-container-with-actions]=\"_actionsPortal\"\n [class.mtx-datetimepicker-content-container-with-time-input]=\"datetimepicker.timeInput\">\n <mtx-calendar [id]=\"datetimepicker.id\"\n [class]=\"datetimepicker.panelClass\"\n [attr.mode]=\"datetimepicker.mode\"\n [type]=\"datetimepicker.type\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [headerComponent]=\"datetimepicker.calendarHeaderComponent\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [selected]=\"datetimepicker._selected\"\n [timeInput]=\"datetimepicker.timeInput\"\n [actionsPortal]=\"_actionsPortal\"\n [timeInputAutoFocus]=\"datetimepicker.timeInputAutoFocus\"\n (selectedChange)=\"datetimepicker._select($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n (viewChanged)=\"_viewChanged($event)\"\n (_userSelection)=\"_handleUserSelection()\"\n [@fadeInCalendar]=\"'enter'\">\n </mtx-calendar>\n\n <ng-template [cdkPortalOutlet]=\"_actionsPortal\"></ng-template>\n</div>\n", styles: [".mtx-datetimepicker-content{display:block;border-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));background-color:var(--mtx-datetimepicker-container-background-color, var(--mat-app-surface-container-high));box-shadow:var(--mtx-datetimepicker-container-elevation-shadow);color:var(--mtx-datetimepicker-container-text-color, var(--mat-app-on-surface))}.mtx-datetimepicker-content .mtx-calendar{width:296px;height:424px}.mtx-datetimepicker-content .mtx-calendar.mtx-calendar-with-time-input{height:490px}.mtx-datetimepicker-content .mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{height:442px}.mtx-datetimepicker-content-container{display:flex;flex-direction:column;justify-content:space-between}.mtx-datetimepicker-content[mode=landscape] .mtx-calendar{width:432px;height:328px}.mtx-datetimepicker-content[mode=landscape] .mtx-calendar.mtx-calendar-with-time-input{height:404px}.mtx-datetimepicker-content[mode=landscape] .mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{height:356px}@media all and (orientation: landscape){.mtx-datetimepicker-content[mode=auto] .mtx-calendar{width:432px;height:328px}.mtx-datetimepicker-content[mode=auto] .mtx-calendar.mtx-calendar-with-time-input{height:404px}.mtx-datetimepicker-content[mode=auto] .mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{height:356px}}.mtx-datetimepicker-content-touch{display:block;max-height:84vh;box-shadow:var(--mtx-datetimepicker-container-touch-elevation-shadow);border-radius:var(--mtx-datetimepicker-container-touch-shape, var(--mat-app-corner-extra-large));position:relative;overflow:visible}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container{min-height:300px;max-height:850px;min-width:250px;max-width:750px}.mtx-datetimepicker-content-touch .mtx-calendar{width:100%;height:auto}.mtx-datetimepicker-content-touch .mtx-clock{width:50vh;max-width:80%;margin:12px auto}@media all and (orientation: landscape){.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto],.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape]{width:120vh;height:80vh}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto] .mtx-calendar,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto].mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape] .mtx-calendar,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape].mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{width:auto;height:100%}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait]{width:64vh;height:80vh}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait] .mtx-calendar{width:100%;height:auto}}@media all and (orientation: portrait){.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto],.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait]{width:80vw;height:120vw}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto] .mtx-calendar,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait] .mtx-calendar{width:100%;height:auto}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto].mtx-datetimepicker-content-container-with-actions,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto].mtx-datetimepicker-content-container-with-time-input,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait].mtx-datetimepicker-content-container-with-actions,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait].mtx-datetimepicker-content-container-with-time-input{height:124vw}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape]{width:90vw;height:64vw}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape] .mtx-calendar{width:auto;height:100%}}\n"], dependencies: [{ kind: "component", type: MtxCalendar, selector: "mtx-calendar", inputs: ["multiYearSelector", "twelvehour", "startView", "timeInterval", "dateFilter", "preventSameDateTimeSelection", "headerComponent", "actionsPortal", "type", "startAt", "timeInput", "timeInputAutoFocus", "selected", "minDate", "maxDate"], outputs: ["selectedChange", "viewChanged", "_userSelection"], exportAs: ["mtxCalendar"] }, { kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], animations: [
2341
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerContent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2342
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.4", type: MtxDatetimepickerContent, isStandalone: true, selector: "mtx-datetimepicker-content", inputs: { color: "color" }, host: { listeners: { "@transformPanel.done": "_animationDone.next()" }, properties: { "class": "color ? \"mat-\" + color : \"\"", "class.mtx-datetimepicker-content-touch": "datetimepicker?.touchUi", "attr.mode": "datetimepicker.mode", "@transformPanel": "_animationState" }, classAttribute: "mtx-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: MtxCalendar, descendants: true, static: true }], ngImport: i0, template: "<div cdkTrapFocus\n role=\"dialog\"\n [attr.aria-modal]=\"true\"\n [attr.aria-labelledby]=\"_dialogLabelId ?? undefined\"\n [attr.mode]=\"datetimepicker.mode\"\n class=\"mtx-datetimepicker-content-container\"\n [class.mtx-datetimepicker-content-container-with-custom-header]=\"datetimepicker.calendarHeaderComponent\"\n [class.mtx-datetimepicker-content-container-with-actions]=\"_actionsPortal\"\n [class.mtx-datetimepicker-content-container-with-time-input]=\"datetimepicker.timeInput\">\n <mtx-calendar [id]=\"datetimepicker.id\"\n [class]=\"datetimepicker.panelClass\"\n [attr.mode]=\"datetimepicker.mode\"\n [type]=\"datetimepicker.type\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [headerComponent]=\"datetimepicker.calendarHeaderComponent\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [selected]=\"datetimepicker._selected\"\n [timeInput]=\"datetimepicker.timeInput\"\n [actionsPortal]=\"_actionsPortal\"\n [timeInputAutoFocus]=\"datetimepicker.timeInputAutoFocus\"\n (selectedChange)=\"datetimepicker._select($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n (viewChanged)=\"_viewChanged($event)\"\n (_userSelection)=\"_handleUserSelection()\"\n [@fadeInCalendar]=\"'enter'\">\n </mtx-calendar>\n\n <ng-template [cdkPortalOutlet]=\"_actionsPortal\"></ng-template>\n\n <!-- Invisible close button for screen reader users. -->\n <button\n type=\"button\"\n mat-raised-button\n [color]=\"color || 'primary'\"\n class=\"mtx-datetimepicker-close-button\"\n [class.cdk-visually-hidden]=\"!_closeButtonFocused\"\n (focus)=\"_closeButtonFocused = true\"\n (blur)=\"_closeButtonFocused = false\"\n (click)=\"datetimepicker.close()\">{{ _closeButtonText }}</button>\n</div>\n", styles: [".mtx-datetimepicker-content{display:block;border-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));background-color:var(--mtx-datetimepicker-container-background-color, var(--mat-sys-surface-container-high));box-shadow:var(--mtx-datetimepicker-container-elevation-shadow, 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12));color:var(--mtx-datetimepicker-container-text-color, var(--mat-sys-on-surface))}.mtx-datetimepicker-content .mtx-calendar{width:296px;height:424px}.mtx-datetimepicker-content .mtx-calendar.mtx-calendar-with-time-input{height:490px}.mtx-datetimepicker-content .mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{height:442px}.mtx-datetimepicker-content .mtx-datetimepicker-close-button{position:absolute;top:100%;left:0;margin-top:8px}.ng-animating .mtx-datetimepicker-content .mtx-datetimepicker-close-button{display:none}.mtx-datetimepicker-content-container{display:flex;flex-direction:column;justify-content:space-between}.mtx-datetimepicker-content[mode=landscape] .mtx-calendar{width:432px;height:328px}.mtx-datetimepicker-content[mode=landscape] .mtx-calendar.mtx-calendar-with-time-input{height:404px}.mtx-datetimepicker-content[mode=landscape] .mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{height:356px}@media all and (orientation: landscape){.mtx-datetimepicker-content[mode=auto] .mtx-calendar{width:432px;height:328px}.mtx-datetimepicker-content[mode=auto] .mtx-calendar.mtx-calendar-with-time-input{height:404px}.mtx-datetimepicker-content[mode=auto] .mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{height:356px}}.mtx-datetimepicker-content-touch{display:block;max-height:84vh;box-shadow:var(--mtx-datetimepicker-container-touch-elevation-shadow, 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12));border-radius:var(--mtx-datetimepicker-container-touch-shape, var(--mat-sys-corner-extra-large));position:relative;overflow:visible}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container{min-height:300px;max-height:850px;min-width:250px;max-width:750px}.mtx-datetimepicker-content-touch .mtx-calendar{width:100%;height:auto}.mtx-datetimepicker-content-touch .mtx-clock{width:50vh;max-width:80%;margin:12px auto}@media all and (orientation: landscape){.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto],.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape]{width:120vh;height:80vh}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto] .mtx-calendar,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto].mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape] .mtx-calendar,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape].mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{width:auto;height:100%}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait]{width:64vh;height:80vh}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait] .mtx-calendar{width:100%;height:auto}}@media all and (orientation: portrait){.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto],.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait]{width:80vw;height:120vw}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto] .mtx-calendar,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait] .mtx-calendar{width:100%;height:auto}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto].mtx-datetimepicker-content-container-with-actions,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto].mtx-datetimepicker-content-container-with-time-input,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait].mtx-datetimepicker-content-container-with-actions,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait].mtx-datetimepicker-content-container-with-time-input{height:124vw}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape]{width:90vw;height:64vw}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape] .mtx-calendar{width:auto;height:100%}}\n"], dependencies: [{ kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: MtxCalendar, selector: "mtx-calendar", inputs: ["multiYearSelector", "twelvehour", "startView", "timeInterval", "dateFilter", "preventSameDateTimeSelection", "headerComponent", "actionsPortal", "type", "startAt", "timeInput", "timeInputAutoFocus", "selected", "minDate", "maxDate"], outputs: ["selectedChange", "viewChanged", "_userSelection"], exportAs: ["mtxCalendar"] }, { kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }], animations: [
2233
2343
  mtxDatetimepickerAnimations.transformPanel,
2234
2344
  mtxDatetimepickerAnimations.fadeInCalendar,
2235
2345
  ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2236
2346
  }
2237
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerContent, decorators: [{
2347
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerContent, decorators: [{
2238
2348
  type: Component,
2239
2349
  args: [{ selector: 'mtx-datetimepicker-content', host: {
2240
2350
  'class': 'mtx-datetimepicker-content',
@@ -2246,8 +2356,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
2246
2356
  }, animations: [
2247
2357
  mtxDatetimepickerAnimations.transformPanel,
2248
2358
  mtxDatetimepickerAnimations.fadeInCalendar,
2249
- ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MtxCalendar, CdkPortalOutlet], template: "<div cdkTrapFocus\n role=\"dialog\"\n [attr.aria-modal]=\"true\"\n [attr.aria-labelledby]=\"_dialogLabelId ?? undefined\"\n [attr.mode]=\"datetimepicker.mode\"\n class=\"mtx-datetimepicker-content-container\"\n [class.mtx-datetimepicker-content-container-with-custom-header]=\"datetimepicker.calendarHeaderComponent\"\n [class.mtx-datetimepicker-content-container-with-actions]=\"_actionsPortal\"\n [class.mtx-datetimepicker-content-container-with-time-input]=\"datetimepicker.timeInput\">\n <mtx-calendar [id]=\"datetimepicker.id\"\n [class]=\"datetimepicker.panelClass\"\n [attr.mode]=\"datetimepicker.mode\"\n [type]=\"datetimepicker.type\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [headerComponent]=\"datetimepicker.calendarHeaderComponent\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [selected]=\"datetimepicker._selected\"\n [timeInput]=\"datetimepicker.timeInput\"\n [actionsPortal]=\"_actionsPortal\"\n [timeInputAutoFocus]=\"datetimepicker.timeInputAutoFocus\"\n (selectedChange)=\"datetimepicker._select($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n (viewChanged)=\"_viewChanged($event)\"\n (_userSelection)=\"_handleUserSelection()\"\n [@fadeInCalendar]=\"'enter'\">\n </mtx-calendar>\n\n <ng-template [cdkPortalOutlet]=\"_actionsPortal\"></ng-template>\n</div>\n", styles: [".mtx-datetimepicker-content{display:block;border-radius:var(--mtx-datetimepicker-container-shape, var(--mat-app-corner-large));background-color:var(--mtx-datetimepicker-container-background-color, var(--mat-app-surface-container-high));box-shadow:var(--mtx-datetimepicker-container-elevation-shadow);color:var(--mtx-datetimepicker-container-text-color, var(--mat-app-on-surface))}.mtx-datetimepicker-content .mtx-calendar{width:296px;height:424px}.mtx-datetimepicker-content .mtx-calendar.mtx-calendar-with-time-input{height:490px}.mtx-datetimepicker-content .mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{height:442px}.mtx-datetimepicker-content-container{display:flex;flex-direction:column;justify-content:space-between}.mtx-datetimepicker-content[mode=landscape] .mtx-calendar{width:432px;height:328px}.mtx-datetimepicker-content[mode=landscape] .mtx-calendar.mtx-calendar-with-time-input{height:404px}.mtx-datetimepicker-content[mode=landscape] .mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{height:356px}@media all and (orientation: landscape){.mtx-datetimepicker-content[mode=auto] .mtx-calendar{width:432px;height:328px}.mtx-datetimepicker-content[mode=auto] .mtx-calendar.mtx-calendar-with-time-input{height:404px}.mtx-datetimepicker-content[mode=auto] .mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{height:356px}}.mtx-datetimepicker-content-touch{display:block;max-height:84vh;box-shadow:var(--mtx-datetimepicker-container-touch-elevation-shadow);border-radius:var(--mtx-datetimepicker-container-touch-shape, var(--mat-app-corner-extra-large));position:relative;overflow:visible}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container{min-height:300px;max-height:850px;min-width:250px;max-width:750px}.mtx-datetimepicker-content-touch .mtx-calendar{width:100%;height:auto}.mtx-datetimepicker-content-touch .mtx-clock{width:50vh;max-width:80%;margin:12px auto}@media all and (orientation: landscape){.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto],.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape]{width:120vh;height:80vh}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto] .mtx-calendar,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto].mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape] .mtx-calendar,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape].mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{width:auto;height:100%}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait]{width:64vh;height:80vh}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait] .mtx-calendar{width:100%;height:auto}}@media all and (orientation: portrait){.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto],.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait]{width:80vw;height:120vw}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto] .mtx-calendar,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait] .mtx-calendar{width:100%;height:auto}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto].mtx-datetimepicker-content-container-with-actions,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto].mtx-datetimepicker-content-container-with-time-input,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait].mtx-datetimepicker-content-container-with-actions,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait].mtx-datetimepicker-content-container-with-time-input{height:124vw}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape]{width:90vw;height:64vw}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape] .mtx-calendar{width:auto;height:100%}}\n"] }]
2250
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { _calendar: [{
2359
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CdkTrapFocus, MtxCalendar, CdkPortalOutlet, MatButton], template: "<div cdkTrapFocus\n role=\"dialog\"\n [attr.aria-modal]=\"true\"\n [attr.aria-labelledby]=\"_dialogLabelId ?? undefined\"\n [attr.mode]=\"datetimepicker.mode\"\n class=\"mtx-datetimepicker-content-container\"\n [class.mtx-datetimepicker-content-container-with-custom-header]=\"datetimepicker.calendarHeaderComponent\"\n [class.mtx-datetimepicker-content-container-with-actions]=\"_actionsPortal\"\n [class.mtx-datetimepicker-content-container-with-time-input]=\"datetimepicker.timeInput\">\n <mtx-calendar [id]=\"datetimepicker.id\"\n [class]=\"datetimepicker.panelClass\"\n [attr.mode]=\"datetimepicker.mode\"\n [type]=\"datetimepicker.type\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [headerComponent]=\"datetimepicker.calendarHeaderComponent\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [selected]=\"datetimepicker._selected\"\n [timeInput]=\"datetimepicker.timeInput\"\n [actionsPortal]=\"_actionsPortal\"\n [timeInputAutoFocus]=\"datetimepicker.timeInputAutoFocus\"\n (selectedChange)=\"datetimepicker._select($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n (viewChanged)=\"_viewChanged($event)\"\n (_userSelection)=\"_handleUserSelection()\"\n [@fadeInCalendar]=\"'enter'\">\n </mtx-calendar>\n\n <ng-template [cdkPortalOutlet]=\"_actionsPortal\"></ng-template>\n\n <!-- Invisible close button for screen reader users. -->\n <button\n type=\"button\"\n mat-raised-button\n [color]=\"color || 'primary'\"\n class=\"mtx-datetimepicker-close-button\"\n [class.cdk-visually-hidden]=\"!_closeButtonFocused\"\n (focus)=\"_closeButtonFocused = true\"\n (blur)=\"_closeButtonFocused = false\"\n (click)=\"datetimepicker.close()\">{{ _closeButtonText }}</button>\n</div>\n", styles: [".mtx-datetimepicker-content{display:block;border-radius:var(--mtx-datetimepicker-container-shape, var(--mat-sys-corner-large));background-color:var(--mtx-datetimepicker-container-background-color, var(--mat-sys-surface-container-high));box-shadow:var(--mtx-datetimepicker-container-elevation-shadow, 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12));color:var(--mtx-datetimepicker-container-text-color, var(--mat-sys-on-surface))}.mtx-datetimepicker-content .mtx-calendar{width:296px;height:424px}.mtx-datetimepicker-content .mtx-calendar.mtx-calendar-with-time-input{height:490px}.mtx-datetimepicker-content .mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{height:442px}.mtx-datetimepicker-content .mtx-datetimepicker-close-button{position:absolute;top:100%;left:0;margin-top:8px}.ng-animating .mtx-datetimepicker-content .mtx-datetimepicker-close-button{display:none}.mtx-datetimepicker-content-container{display:flex;flex-direction:column;justify-content:space-between}.mtx-datetimepicker-content[mode=landscape] .mtx-calendar{width:432px;height:328px}.mtx-datetimepicker-content[mode=landscape] .mtx-calendar.mtx-calendar-with-time-input{height:404px}.mtx-datetimepicker-content[mode=landscape] .mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{height:356px}@media all and (orientation: landscape){.mtx-datetimepicker-content[mode=auto] .mtx-calendar{width:432px;height:328px}.mtx-datetimepicker-content[mode=auto] .mtx-calendar.mtx-calendar-with-time-input{height:404px}.mtx-datetimepicker-content[mode=auto] .mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{height:356px}}.mtx-datetimepicker-content-touch{display:block;max-height:84vh;box-shadow:var(--mtx-datetimepicker-container-touch-elevation-shadow, 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12));border-radius:var(--mtx-datetimepicker-container-touch-shape, var(--mat-sys-corner-extra-large));position:relative;overflow:visible}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container{min-height:300px;max-height:850px;min-width:250px;max-width:750px}.mtx-datetimepicker-content-touch .mtx-calendar{width:100%;height:auto}.mtx-datetimepicker-content-touch .mtx-clock{width:50vh;max-width:80%;margin:12px auto}@media all and (orientation: landscape){.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto],.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape]{width:120vh;height:80vh}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto] .mtx-calendar,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto].mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape] .mtx-calendar,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape].mtx-datetimepicker-content-container-with-actions .mtx-calendar.mtx-calendar-with-time-input{width:auto;height:100%}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait]{width:64vh;height:80vh}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait] .mtx-calendar{width:100%;height:auto}}@media all and (orientation: portrait){.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto],.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait]{width:80vw;height:120vw}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto] .mtx-calendar,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait] .mtx-calendar{width:100%;height:auto}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto].mtx-datetimepicker-content-container-with-actions,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=auto].mtx-datetimepicker-content-container-with-time-input,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait].mtx-datetimepicker-content-container-with-actions,.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=portrait].mtx-datetimepicker-content-container-with-time-input{height:124vw}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape]{width:90vw;height:64vw}.mtx-datetimepicker-content-touch .mtx-datetimepicker-content-container[mode=landscape] .mtx-calendar{width:auto;height:100%}}\n"] }]
2360
+ }], ctorParameters: () => [], propDecorators: { _calendar: [{
2251
2361
  type: ViewChild,
2252
2362
  args: [MtxCalendar, { static: true }]
2253
2363
  }], color: [{
@@ -2276,12 +2386,12 @@ class MtxDatetimepicker {
2276
2386
  set color(value) {
2277
2387
  this._color = value;
2278
2388
  }
2279
- constructor(_overlay, _viewContainerRef, _scrollStrategy, _dateAdapter, _dir) {
2280
- this._overlay = _overlay;
2281
- this._viewContainerRef = _viewContainerRef;
2282
- this._scrollStrategy = _scrollStrategy;
2283
- this._dateAdapter = _dateAdapter;
2284
- this._dir = _dir;
2389
+ constructor() {
2390
+ this._overlay = inject(Overlay);
2391
+ this._viewContainerRef = inject(ViewContainerRef);
2392
+ this._scrollStrategy = inject(MTX_DATETIMEPICKER_SCROLL_STRATEGY);
2393
+ this._dateAdapter = inject(DatetimeAdapter, { optional: true });
2394
+ this._dir = inject(Directionality, { optional: true });
2285
2395
  this._document = inject(DOCUMENT);
2286
2396
  this._injector = inject(Injector);
2287
2397
  /** Whether to show multi-year view. */
@@ -2524,7 +2634,7 @@ class MtxDatetimepicker {
2524
2634
  isDialog ? 'cdk-overlay-dark-backdrop' : 'mat-overlay-transparent-backdrop',
2525
2635
  this._backdropHarnessClass,
2526
2636
  ],
2527
- direction: this._dir,
2637
+ direction: this._dir || undefined,
2528
2638
  scrollStrategy: isDialog ? this._overlay.scrollStrategies.block() : this._scrollStrategy(),
2529
2639
  panelClass: `mtx-datetimepicker-${isDialog ? 'dialog' : 'popup'}`,
2530
2640
  })));
@@ -2640,10 +2750,10 @@ class MtxDatetimepicker {
2640
2750
  this._componentRef?.instance._assignActions(null, true);
2641
2751
  }
2642
2752
  }
2643
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepicker, deps: [{ token: i1$1.Overlay }, { token: i0.ViewContainerRef }, { token: MTX_DATETIMEPICKER_SCROLL_STRATEGY }, { token: i1.DatetimeAdapter, optional: true }, { token: i3.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
2644
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.0", type: MtxDatetimepicker, isStandalone: true, selector: "mtx-datetimepicker", inputs: { multiYearSelector: ["multiYearSelector", "multiYearSelector", booleanAttribute], twelvehour: ["twelvehour", "twelvehour", booleanAttribute], startView: "startView", mode: "mode", timeInterval: "timeInterval", preventSameDateTimeSelection: ["preventSameDateTimeSelection", "preventSameDateTimeSelection", booleanAttribute], calendarHeaderComponent: "calendarHeaderComponent", panelClass: "panelClass", opened: ["opened", "opened", booleanAttribute], color: "color", startAt: "startAt", type: "type", touchUi: ["touchUi", "touchUi", booleanAttribute], timeInput: ["timeInput", "timeInput", booleanAttribute], timeInputAutoFocus: ["timeInputAutoFocus", "timeInputAutoFocus", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], xPosition: "xPosition", yPosition: "yPosition", restoreFocus: ["restoreFocus", "restoreFocus", booleanAttribute] }, outputs: { selectedChanged: "selectedChanged", openedStream: "opened", closedStream: "closed", viewChanged: "viewChanged" }, exportAs: ["mtxDatetimepicker"], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2753
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepicker, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2754
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "19.0.4", type: MtxDatetimepicker, isStandalone: true, selector: "mtx-datetimepicker", inputs: { multiYearSelector: ["multiYearSelector", "multiYearSelector", booleanAttribute], twelvehour: ["twelvehour", "twelvehour", booleanAttribute], startView: "startView", mode: "mode", timeInterval: "timeInterval", preventSameDateTimeSelection: ["preventSameDateTimeSelection", "preventSameDateTimeSelection", booleanAttribute], calendarHeaderComponent: "calendarHeaderComponent", panelClass: "panelClass", opened: ["opened", "opened", booleanAttribute], color: "color", startAt: "startAt", type: "type", touchUi: ["touchUi", "touchUi", booleanAttribute], timeInput: ["timeInput", "timeInput", booleanAttribute], timeInputAutoFocus: ["timeInputAutoFocus", "timeInputAutoFocus", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], xPosition: "xPosition", yPosition: "yPosition", restoreFocus: ["restoreFocus", "restoreFocus", booleanAttribute] }, outputs: { selectedChanged: "selectedChanged", openedStream: "opened", closedStream: "closed", viewChanged: "viewChanged" }, exportAs: ["mtxDatetimepicker"], ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2645
2755
  }
2646
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepicker, decorators: [{
2756
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepicker, decorators: [{
2647
2757
  type: Component,
2648
2758
  args: [{
2649
2759
  selector: 'mtx-datetimepicker',
@@ -2652,16 +2762,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
2652
2762
  changeDetection: ChangeDetectionStrategy.OnPush,
2653
2763
  encapsulation: ViewEncapsulation.None,
2654
2764
  preserveWhitespaces: false,
2655
- standalone: true,
2656
2765
  }]
2657
- }], ctorParameters: () => [{ type: i1$1.Overlay }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{
2658
- type: Inject,
2659
- args: [MTX_DATETIMEPICKER_SCROLL_STRATEGY]
2660
- }] }, { type: i1.DatetimeAdapter, decorators: [{
2661
- type: Optional
2662
- }] }, { type: i3.Directionality, decorators: [{
2663
- type: Optional
2664
- }] }], propDecorators: { multiYearSelector: [{
2766
+ }], ctorParameters: () => [], propDecorators: { multiYearSelector: [{
2665
2767
  type: Input,
2666
2768
  args: [{ transform: booleanAttribute }]
2667
2769
  }], twelvehour: [{
@@ -2744,11 +2846,11 @@ class MtxDatetimepickerInputEvent {
2744
2846
  }
2745
2847
  /** Directive used to connect an input to a MtxDatetimepicker. */
2746
2848
  class MtxDatetimepickerInput {
2747
- constructor(_elementRef, _dateAdapter, _dateFormats, _formField) {
2748
- this._elementRef = _elementRef;
2749
- this._dateAdapter = _dateAdapter;
2750
- this._dateFormats = _dateFormats;
2751
- this._formField = _formField;
2849
+ constructor() {
2850
+ this._elementRef = inject(ElementRef);
2851
+ this._dateAdapter = inject(DatetimeAdapter, { optional: true });
2852
+ this._dateFormats = inject(MTX_DATETIME_FORMATS, { optional: true });
2853
+ this._formField = inject(MatFormField, { optional: true });
2752
2854
  /** Emits when a `change` event is fired on this `<input>`. */
2753
2855
  this.dateChange = new EventEmitter();
2754
2856
  /** Emits when an `input` event is fired on this `<input>`. */
@@ -2804,6 +2906,7 @@ class MtxDatetimepickerInput {
2804
2906
  this._maxValidator,
2805
2907
  this._filterValidator,
2806
2908
  ]);
2909
+ const _dateAdapter = this._dateAdapter;
2807
2910
  if (!this._dateAdapter) {
2808
2911
  throw createMissingDateImplError('DatetimeAdapter');
2809
2912
  }
@@ -3000,14 +3103,14 @@ class MtxDatetimepickerInput {
3000
3103
  getThemePalette() {
3001
3104
  return this._formField ? this._formField.color : undefined;
3002
3105
  }
3003
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerInput, deps: [{ token: i0.ElementRef }, { token: i1.DatetimeAdapter, optional: true }, { token: MTX_DATETIME_FORMATS, optional: true }, { token: i2.MatFormField, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
3004
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.0", type: MtxDatetimepickerInput, isStandalone: true, selector: "input[mtxDatetimepicker]", inputs: { mtxDatetimepicker: "mtxDatetimepicker", mtxDatetimepickerFilter: "mtxDatetimepickerFilter", value: "value", min: "min", max: "max", disabled: ["disabled", "disabled", booleanAttribute] }, outputs: { dateChange: "dateChange", dateInput: "dateInput" }, host: { listeners: { "input": "_onInput($event.target.value)", "change": "_onChange()", "blur": "_onBlur()", "keydown": "_onKeydown($event)" }, properties: { "attr.aria-haspopup": "true", "attr.aria-owns": "(_datetimepicker?.opened && _datetimepicker.id) || null", "attr.min": "min ? _dateAdapter.toIso8601(min) : null", "attr.max": "max ? _dateAdapter.toIso8601(max) : null", "disabled": "disabled" } }, providers: [
3106
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerInput, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3107
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "19.0.4", type: MtxDatetimepickerInput, isStandalone: true, selector: "input[mtxDatetimepicker]", inputs: { mtxDatetimepicker: "mtxDatetimepicker", mtxDatetimepickerFilter: "mtxDatetimepickerFilter", value: "value", min: "min", max: "max", disabled: ["disabled", "disabled", booleanAttribute] }, outputs: { dateChange: "dateChange", dateInput: "dateInput" }, host: { listeners: { "input": "_onInput($event.target.value)", "change": "_onChange()", "blur": "_onBlur()", "keydown": "_onKeydown($event)" }, properties: { "attr.aria-haspopup": "true", "attr.aria-owns": "(_datetimepicker?.opened && _datetimepicker.id) || null", "attr.min": "min ? _dateAdapter.toIso8601(min) : null", "attr.max": "max ? _dateAdapter.toIso8601(max) : null", "disabled": "disabled" } }, providers: [
3005
3108
  MAT_DATETIMEPICKER_VALUE_ACCESSOR,
3006
3109
  MAT_DATETIMEPICKER_VALIDATORS,
3007
3110
  { provide: MAT_INPUT_VALUE_ACCESSOR, useExisting: MtxDatetimepickerInput },
3008
3111
  ], exportAs: ["mtxDatetimepickerInput"], ngImport: i0 }); }
3009
3112
  }
3010
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerInput, decorators: [{
3113
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerInput, decorators: [{
3011
3114
  type: Directive,
3012
3115
  args: [{
3013
3116
  selector: 'input[mtxDatetimepicker]',
@@ -3028,18 +3131,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
3028
3131
  '(keydown)': '_onKeydown($event)',
3029
3132
  },
3030
3133
  exportAs: 'mtxDatetimepickerInput',
3031
- standalone: true,
3032
3134
  }]
3033
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.DatetimeAdapter, decorators: [{
3034
- type: Optional
3035
- }] }, { type: undefined, decorators: [{
3036
- type: Optional
3037
- }, {
3038
- type: Inject,
3039
- args: [MTX_DATETIME_FORMATS]
3040
- }] }, { type: i2.MatFormField, decorators: [{
3041
- type: Optional
3042
- }] }], propDecorators: { dateChange: [{
3135
+ }], ctorParameters: () => [], propDecorators: { dateChange: [{
3043
3136
  type: Output
3044
3137
  }], dateInput: [{
3045
3138
  type: Output
@@ -3060,14 +3153,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
3060
3153
 
3061
3154
  /** Can be used to override the icon of a `mtxDatetimepickerToggle`. */
3062
3155
  class MtxDatetimepickerToggleIcon {
3063
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerToggleIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3064
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0", type: MtxDatetimepickerToggleIcon, isStandalone: true, selector: "[mtxDatetimepickerToggleIcon]", ngImport: i0 }); }
3156
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerToggleIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3157
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.4", type: MtxDatetimepickerToggleIcon, isStandalone: true, selector: "[mtxDatetimepickerToggleIcon]", ngImport: i0 }); }
3065
3158
  }
3066
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerToggleIcon, decorators: [{
3159
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerToggleIcon, decorators: [{
3067
3160
  type: Directive,
3068
3161
  args: [{
3069
3162
  selector: '[mtxDatetimepickerToggleIcon]',
3070
- standalone: true,
3071
3163
  }]
3072
3164
  }] });
3073
3165
  class MtxDatetimepickerToggle {
@@ -3078,10 +3170,11 @@ class MtxDatetimepickerToggle {
3078
3170
  set disabled(value) {
3079
3171
  this._disabled = value;
3080
3172
  }
3081
- constructor(_intl, _changeDetectorRef, defaultTabIndex) {
3082
- this._intl = _intl;
3083
- this._changeDetectorRef = _changeDetectorRef;
3173
+ constructor() {
3174
+ this._intl = inject(MtxDatetimepickerIntl);
3175
+ this._changeDetectorRef = inject(ChangeDetectorRef);
3084
3176
  this._stateChanges = Subscription.EMPTY;
3177
+ const defaultTabIndex = inject(new HostAttributeToken('tabindex'), { optional: true });
3085
3178
  const parsedTabIndex = Number(defaultTabIndex);
3086
3179
  this.tabIndex = parsedTabIndex || parsedTabIndex === 0 ? parsedTabIndex : null;
3087
3180
  }
@@ -3115,10 +3208,10 @@ class MtxDatetimepickerToggle {
3115
3208
  this._stateChanges.unsubscribe();
3116
3209
  this._stateChanges = merge(this._intl.changes, datetimepickerDisabled, inputDisabled, datetimepickerToggled).subscribe(() => this._changeDetectorRef.markForCheck());
3117
3210
  }
3118
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerToggle, deps: [{ token: MtxDatetimepickerIntl }, { token: i0.ChangeDetectorRef }, { token: 'tabindex', attribute: true }], target: i0.ɵɵFactoryTarget.Component }); }
3119
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: MtxDatetimepickerToggle, isStandalone: true, selector: "mtx-datetimepicker-toggle", inputs: { datetimepicker: ["for", "datetimepicker"], tabIndex: "tabIndex", ariaLabel: ["aria-label", "ariaLabel"], disabled: ["disabled", "disabled", booleanAttribute], disableRipple: ["disableRipple", "disableRipple", booleanAttribute] }, host: { listeners: { "click": "_open($event)" }, properties: { "attr.tabindex": "null", "class.mtx-datetimepicker-toggle-active": "datetimepicker && datetimepicker.opened", "class.mat-accent": "datetimepicker && datetimepicker.color === \"accent\"", "class.mat-warn": "datetimepicker && datetimepicker.color === \"warn\"", "attr.data-mtx-calendar": "datetimepicker ? datetimepicker.id : null" }, classAttribute: "mtx-datetimepicker-toggle" }, queries: [{ propertyName: "_customIcon", first: true, predicate: MtxDatetimepickerToggleIcon, descendants: true }], viewQueries: [{ propertyName: "_button", first: true, predicate: ["button"], descendants: true }], exportAs: ["mtxDatetimepickerToggle"], usesOnChanges: true, ngImport: i0, template: "<button #button\n mat-icon-button\n type=\"button\"\n [attr.aria-haspopup]=\"datetimepicker ? 'dialog' : null\"\n [attr.aria-label]=\"ariaLabel || _intl.openCalendarLabel\"\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\n [disabled]=\"disabled\"\n [disableRipple]=\"disableRipple\">\n\n @if (!_customIcon) {\n @switch (datetimepicker.type) {\n @case ('time') {\n <svg\n class=\"mtx-datetimepicker-toggle-default-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\">\n <path d=\"M12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22C6.47,22 2,17.5 2,12A10,10 0 0,1 12,2M12.5,7V12.25L17,14.92L16.25,16.15L11,13V7H12.5Z\" />\n </svg>\n }\n @case ('datetime') {\n <svg\n class=\"mtx-datetimepicker-toggle-default-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\">\n <path d=\"M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z\" />\n </svg>\n }\n @default {\n <svg\n class=\"mtx-datetimepicker-toggle-default-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\">\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z\" />\n </svg>\n }\n }\n }\n\n <ng-content select=\"[mtxDatetimepickerToggleIcon]\"></ng-content>\n</button>\n", styles: [".mtx-datetimepicker-toggle{pointer-events:auto;color:var(--mtx-datetimepicker-toggle-icon-color, var(--mat-app-on-surface-variant))}.mtx-datetimepicker-toggle-active{color:var(--mtx-datetimepicker-toggle-active-state-icon-color, var(--mat-app-on-surface-variant))}.cdk-high-contrast-active .mtx-datetimepicker-toggle-default-icon{color:CanvasText}\n"], dependencies: [{ kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3211
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerToggle, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3212
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.4", type: MtxDatetimepickerToggle, isStandalone: true, selector: "mtx-datetimepicker-toggle", inputs: { datetimepicker: ["for", "datetimepicker"], tabIndex: "tabIndex", ariaLabel: ["aria-label", "ariaLabel"], disabled: ["disabled", "disabled", booleanAttribute], disableRipple: ["disableRipple", "disableRipple", booleanAttribute] }, host: { listeners: { "click": "_open($event)" }, properties: { "attr.tabindex": "null", "class.mtx-datetimepicker-toggle-active": "datetimepicker && datetimepicker.opened", "class.mat-accent": "datetimepicker && datetimepicker.color === \"accent\"", "class.mat-warn": "datetimepicker && datetimepicker.color === \"warn\"", "attr.data-mtx-calendar": "datetimepicker ? datetimepicker.id : null" }, classAttribute: "mtx-datetimepicker-toggle" }, queries: [{ propertyName: "_customIcon", first: true, predicate: MtxDatetimepickerToggleIcon, descendants: true }], viewQueries: [{ propertyName: "_button", first: true, predicate: ["button"], descendants: true }], exportAs: ["mtxDatetimepickerToggle"], usesOnChanges: true, ngImport: i0, template: "<button #button\n mat-icon-button\n type=\"button\"\n [attr.aria-haspopup]=\"datetimepicker ? 'dialog' : null\"\n [attr.aria-label]=\"ariaLabel || _intl.openCalendarLabel\"\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\n [disabled]=\"disabled\"\n [disableRipple]=\"disableRipple\">\n\n @if (!_customIcon) {\n @switch (datetimepicker.type) {\n @case ('time') {\n <svg\n class=\"mtx-datetimepicker-toggle-default-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\">\n <path d=\"M12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22C6.47,22 2,17.5 2,12A10,10 0 0,1 12,2M12.5,7V12.25L17,14.92L16.25,16.15L11,13V7H12.5Z\" />\n </svg>\n }\n @case ('datetime') {\n <svg\n class=\"mtx-datetimepicker-toggle-default-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\">\n <path d=\"M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z\" />\n </svg>\n }\n @default {\n <svg\n class=\"mtx-datetimepicker-toggle-default-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\">\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z\" />\n </svg>\n }\n }\n }\n\n <ng-content select=\"[mtxDatetimepickerToggleIcon]\"></ng-content>\n</button>\n", styles: [".mtx-datetimepicker-toggle{pointer-events:auto;color:var(--mtx-datetimepicker-toggle-icon-color, var(--mat-sys-on-surface-variant))}.mtx-datetimepicker-toggle-active{color:var(--mtx-datetimepicker-toggle-active-state-icon-color, var(--mat-sys-on-surface-variant))}@media (forced-colors: active){.mtx-datetimepicker-toggle-default-icon{color:CanvasText}}\n"], dependencies: [{ kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3120
3213
  }
3121
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerToggle, decorators: [{
3214
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerToggle, decorators: [{
3122
3215
  type: Component,
3123
3216
  args: [{ selector: 'mtx-datetimepicker-toggle', host: {
3124
3217
  'class': 'mtx-datetimepicker-toggle',
@@ -3132,11 +3225,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
3132
3225
  // `stopPropagation` on it without affecting the user's `click` handlers. We need to stop
3133
3226
  // it so that the input doesn't get focused automatically by the form field (See #21836).
3134
3227
  '(click)': '_open($event)',
3135
- }, exportAs: 'mtxDatetimepickerToggle', encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatIconButton], template: "<button #button\n mat-icon-button\n type=\"button\"\n [attr.aria-haspopup]=\"datetimepicker ? 'dialog' : null\"\n [attr.aria-label]=\"ariaLabel || _intl.openCalendarLabel\"\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\n [disabled]=\"disabled\"\n [disableRipple]=\"disableRipple\">\n\n @if (!_customIcon) {\n @switch (datetimepicker.type) {\n @case ('time') {\n <svg\n class=\"mtx-datetimepicker-toggle-default-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\">\n <path d=\"M12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22C6.47,22 2,17.5 2,12A10,10 0 0,1 12,2M12.5,7V12.25L17,14.92L16.25,16.15L11,13V7H12.5Z\" />\n </svg>\n }\n @case ('datetime') {\n <svg\n class=\"mtx-datetimepicker-toggle-default-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\">\n <path d=\"M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z\" />\n </svg>\n }\n @default {\n <svg\n class=\"mtx-datetimepicker-toggle-default-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\">\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z\" />\n </svg>\n }\n }\n }\n\n <ng-content select=\"[mtxDatetimepickerToggleIcon]\"></ng-content>\n</button>\n", styles: [".mtx-datetimepicker-toggle{pointer-events:auto;color:var(--mtx-datetimepicker-toggle-icon-color, var(--mat-app-on-surface-variant))}.mtx-datetimepicker-toggle-active{color:var(--mtx-datetimepicker-toggle-active-state-icon-color, var(--mat-app-on-surface-variant))}.cdk-high-contrast-active .mtx-datetimepicker-toggle-default-icon{color:CanvasText}\n"] }]
3136
- }], ctorParameters: () => [{ type: MtxDatetimepickerIntl }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
3137
- type: Attribute,
3138
- args: ['tabindex']
3139
- }] }], propDecorators: { datetimepicker: [{
3228
+ }, exportAs: 'mtxDatetimepickerToggle', encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatIconButton], template: "<button #button\n mat-icon-button\n type=\"button\"\n [attr.aria-haspopup]=\"datetimepicker ? 'dialog' : null\"\n [attr.aria-label]=\"ariaLabel || _intl.openCalendarLabel\"\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\n [disabled]=\"disabled\"\n [disableRipple]=\"disableRipple\">\n\n @if (!_customIcon) {\n @switch (datetimepicker.type) {\n @case ('time') {\n <svg\n class=\"mtx-datetimepicker-toggle-default-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\">\n <path d=\"M12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22C6.47,22 2,17.5 2,12A10,10 0 0,1 12,2M12.5,7V12.25L17,14.92L16.25,16.15L11,13V7H12.5Z\" />\n </svg>\n }\n @case ('datetime') {\n <svg\n class=\"mtx-datetimepicker-toggle-default-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\">\n <path d=\"M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z\" />\n </svg>\n }\n @default {\n <svg\n class=\"mtx-datetimepicker-toggle-default-icon\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n height=\"24px\"\n fill=\"currentColor\"\n focusable=\"false\">\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z\" />\n </svg>\n }\n }\n }\n\n <ng-content select=\"[mtxDatetimepickerToggleIcon]\"></ng-content>\n</button>\n", styles: [".mtx-datetimepicker-toggle{pointer-events:auto;color:var(--mtx-datetimepicker-toggle-icon-color, var(--mat-sys-on-surface-variant))}.mtx-datetimepicker-toggle-active{color:var(--mtx-datetimepicker-toggle-active-state-icon-color, var(--mat-sys-on-surface-variant))}@media (forced-colors: active){.mtx-datetimepicker-toggle-default-icon{color:CanvasText}}\n"] }]
3229
+ }], ctorParameters: () => [], propDecorators: { datetimepicker: [{
3140
3230
  type: Input,
3141
3231
  args: ['for']
3142
3232
  }], tabIndex: [{
@@ -3159,54 +3249,51 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
3159
3249
  }] } });
3160
3250
 
3161
3251
  class MtxDatetimepickerApply {
3162
- constructor(_datetimepicker) {
3163
- this._datetimepicker = _datetimepicker;
3252
+ constructor() {
3253
+ this._datetimepicker = inject(MtxDatetimepicker);
3164
3254
  }
3165
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerApply, deps: [{ token: MtxDatetimepicker }], target: i0.ɵɵFactoryTarget.Directive }); }
3166
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0", type: MtxDatetimepickerApply, isStandalone: true, selector: "[mtxDatetimepickerApply]", host: { listeners: { "click": "_datetimepicker._selectManually()" } }, ngImport: i0 }); }
3255
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerApply, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3256
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.4", type: MtxDatetimepickerApply, isStandalone: true, selector: "[mtxDatetimepickerApply]", host: { listeners: { "click": "_datetimepicker._selectManually()" } }, ngImport: i0 }); }
3167
3257
  }
3168
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerApply, decorators: [{
3258
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerApply, decorators: [{
3169
3259
  type: Directive,
3170
3260
  args: [{
3171
3261
  selector: '[mtxDatetimepickerApply]',
3172
3262
  host: { '(click)': '_datetimepicker._selectManually()' },
3173
- standalone: true,
3174
3263
  }]
3175
- }], ctorParameters: () => [{ type: MtxDatetimepicker }] });
3264
+ }], ctorParameters: () => [] });
3176
3265
  class MtxDatetimepickerCancel {
3177
- constructor(_datetimepicker) {
3178
- this._datetimepicker = _datetimepicker;
3266
+ constructor() {
3267
+ this._datetimepicker = inject(MtxDatetimepicker);
3179
3268
  }
3180
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerCancel, deps: [{ token: MtxDatetimepicker }], target: i0.ɵɵFactoryTarget.Directive }); }
3181
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0", type: MtxDatetimepickerCancel, isStandalone: true, selector: "[mtxDatetimepickerCancel]", host: { listeners: { "click": "_datetimepicker.close()" } }, ngImport: i0 }); }
3269
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerCancel, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3270
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.4", type: MtxDatetimepickerCancel, isStandalone: true, selector: "[mtxDatetimepickerCancel]", host: { listeners: { "click": "_datetimepicker.close()" } }, ngImport: i0 }); }
3182
3271
  }
3183
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerCancel, decorators: [{
3272
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerCancel, decorators: [{
3184
3273
  type: Directive,
3185
3274
  args: [{
3186
3275
  selector: '[mtxDatetimepickerCancel]',
3187
3276
  host: { '(click)': '_datetimepicker.close()' },
3188
- standalone: true,
3189
3277
  }]
3190
- }], ctorParameters: () => [{ type: MtxDatetimepicker }] });
3278
+ }], ctorParameters: () => [] });
3191
3279
  class MtxDatetimepickerClear {
3192
- constructor(_datetimepicker) {
3193
- this._datetimepicker = _datetimepicker;
3280
+ constructor() {
3281
+ this._datetimepicker = inject(MtxDatetimepicker);
3194
3282
  }
3195
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerClear, deps: [{ token: MtxDatetimepicker }], target: i0.ɵɵFactoryTarget.Directive }); }
3196
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0", type: MtxDatetimepickerClear, isStandalone: true, selector: "[mtxDatetimepickerClear]", host: { listeners: { "click": "_datetimepicker._clearSelected()" } }, ngImport: i0 }); }
3283
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerClear, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3284
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.4", type: MtxDatetimepickerClear, isStandalone: true, selector: "[mtxDatetimepickerClear]", host: { listeners: { "click": "_datetimepicker._clearSelected()" } }, ngImport: i0 }); }
3197
3285
  }
3198
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerClear, decorators: [{
3286
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerClear, decorators: [{
3199
3287
  type: Directive,
3200
3288
  args: [{
3201
3289
  selector: '[mtxDatetimepickerClear]',
3202
3290
  host: { '(click)': '_datetimepicker._clearSelected()' },
3203
- standalone: true,
3204
3291
  }]
3205
- }], ctorParameters: () => [{ type: MtxDatetimepicker }] });
3292
+ }], ctorParameters: () => [] });
3206
3293
  class MtxDatetimepickerActions {
3207
- constructor(_datetimepicker, _viewContainerRef) {
3208
- this._datetimepicker = _datetimepicker;
3209
- this._viewContainerRef = _viewContainerRef;
3294
+ constructor() {
3295
+ this._datetimepicker = inject(MtxDatetimepicker);
3296
+ this._viewContainerRef = inject(ViewContainerRef);
3210
3297
  }
3211
3298
  ngAfterViewInit() {
3212
3299
  this._portal = new TemplatePortal(this._template, this._viewContainerRef);
@@ -3219,8 +3306,8 @@ class MtxDatetimepickerActions {
3219
3306
  this._portal?.detach();
3220
3307
  }
3221
3308
  }
3222
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerActions, deps: [{ token: MtxDatetimepicker }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
3223
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: MtxDatetimepickerActions, isStandalone: true, selector: "mtx-datetimepicker-actions", viewQueries: [{ propertyName: "_template", first: true, predicate: TemplateRef, descendants: true }], ngImport: i0, template: `
3309
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerActions, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3310
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.4", type: MtxDatetimepickerActions, isStandalone: true, selector: "mtx-datetimepicker-actions", viewQueries: [{ propertyName: "_template", first: true, predicate: TemplateRef, descendants: true }], ngImport: i0, template: `
3224
3311
  <ng-template>
3225
3312
  <div class="mtx-datetimepicker-actions">
3226
3313
  <ng-content></ng-content>
@@ -3228,7 +3315,7 @@ class MtxDatetimepickerActions {
3228
3315
  </ng-template>
3229
3316
  `, isInline: true, styles: [".mtx-datetimepicker-actions{position:relative;display:flex;justify-content:flex-end;align-items:center;padding:0 8px 8px}.mtx-datetimepicker-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mtx-datetimepicker-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
3230
3317
  }
3231
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerActions, decorators: [{
3318
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerActions, decorators: [{
3232
3319
  type: Component,
3233
3320
  args: [{ selector: 'mtx-datetimepicker-actions', template: `
3234
3321
  <ng-template>
@@ -3236,15 +3323,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
3236
3323
  <ng-content></ng-content>
3237
3324
  </div>
3238
3325
  </ng-template>
3239
- `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, styles: [".mtx-datetimepicker-actions{position:relative;display:flex;justify-content:flex-end;align-items:center;padding:0 8px 8px}.mtx-datetimepicker-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mtx-datetimepicker-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"] }]
3240
- }], ctorParameters: () => [{ type: MtxDatetimepicker }, { type: i0.ViewContainerRef }], propDecorators: { _template: [{
3326
+ `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".mtx-datetimepicker-actions{position:relative;display:flex;justify-content:flex-end;align-items:center;padding:0 8px 8px}.mtx-datetimepicker-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mtx-datetimepicker-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}\n"] }]
3327
+ }], ctorParameters: () => [], propDecorators: { _template: [{
3241
3328
  type: ViewChild,
3242
3329
  args: [TemplateRef]
3243
3330
  }] } });
3244
3331
 
3245
3332
  class MtxDatetimepickerModule {
3246
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3247
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerModule, imports: [CommonModule,
3333
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3334
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerModule, imports: [CommonModule,
3248
3335
  OverlayModule,
3249
3336
  A11yModule,
3250
3337
  PortalModule,
@@ -3252,7 +3339,7 @@ class MtxDatetimepickerModule {
3252
3339
  MtxCalendar,
3253
3340
  MtxCalendarBody,
3254
3341
  MtxClock,
3255
- MtxTime,
3342
+ MtxTimeView,
3256
3343
  MtxTimeInput,
3257
3344
  MtxDatetimepicker,
3258
3345
  MtxDatetimepickerToggle,
@@ -3268,7 +3355,7 @@ class MtxDatetimepickerModule {
3268
3355
  MtxDatetimepickerActions], exports: [MtxCalendar,
3269
3356
  MtxCalendarBody,
3270
3357
  MtxClock,
3271
- MtxTime,
3358
+ MtxTimeView,
3272
3359
  MtxDatetimepicker,
3273
3360
  MtxDatetimepickerToggle,
3274
3361
  MtxDatetimepickerToggleIcon,
@@ -3281,17 +3368,17 @@ class MtxDatetimepickerModule {
3281
3368
  MtxDatetimepickerCancel,
3282
3369
  MtxDatetimepickerClear,
3283
3370
  MtxDatetimepickerActions] }); }
3284
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerModule, providers: [MTX_DATETIMEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER], imports: [CommonModule,
3371
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerModule, providers: [MTX_DATETIMEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER], imports: [CommonModule,
3285
3372
  OverlayModule,
3286
3373
  A11yModule,
3287
3374
  PortalModule,
3288
3375
  MatButtonModule,
3289
3376
  MtxCalendar,
3290
- MtxTime,
3377
+ MtxTimeView,
3291
3378
  MtxDatetimepickerToggle,
3292
3379
  MtxDatetimepickerContent] }); }
3293
3380
  }
3294
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxDatetimepickerModule, decorators: [{
3381
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: MtxDatetimepickerModule, decorators: [{
3295
3382
  type: NgModule,
3296
3383
  args: [{
3297
3384
  imports: [
@@ -3303,7 +3390,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
3303
3390
  MtxCalendar,
3304
3391
  MtxCalendarBody,
3305
3392
  MtxClock,
3306
- MtxTime,
3393
+ MtxTimeView,
3307
3394
  MtxTimeInput,
3308
3395
  MtxDatetimepicker,
3309
3396
  MtxDatetimepickerToggle,
@@ -3322,7 +3409,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
3322
3409
  MtxCalendar,
3323
3410
  MtxCalendarBody,
3324
3411
  MtxClock,
3325
- MtxTime,
3412
+ MtxTimeView,
3326
3413
  MtxDatetimepicker,
3327
3414
  MtxDatetimepickerToggle,
3328
3415
  MtxDatetimepickerToggleIcon,
@@ -3344,5 +3431,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
3344
3431
  * Generated bundle index. Do not edit.
3345
3432
  */
3346
3433
 
3347
- export { CLOCK_INNER_RADIUS, CLOCK_OUTER_RADIUS, CLOCK_RADIUS, CLOCK_TICK_RADIUS, MAT_DATETIMEPICKER_VALIDATORS, MAT_DATETIMEPICKER_VALUE_ACCESSOR, MTX_DATETIMEPICKER_SCROLL_STRATEGY, MTX_DATETIMEPICKER_SCROLL_STRATEGY_FACTORY, MTX_DATETIMEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER, MtxCalendar, MtxCalendarBody, MtxCalendarCell, MtxClock, MtxDatetimepicker, MtxDatetimepickerActions, MtxDatetimepickerApply, MtxDatetimepickerCancel, MtxDatetimepickerClear, MtxDatetimepickerContent, MtxDatetimepickerFilterType, MtxDatetimepickerInput, MtxDatetimepickerInputEvent, MtxDatetimepickerIntl, MtxDatetimepickerModule, MtxDatetimepickerToggle, MtxDatetimepickerToggleIcon, MtxMonthView, MtxMultiYearView, MtxTime, MtxTimeInput, MtxYearView, getActiveOffset, isSameMultiYearView, mtxDatetimepickerAnimations, yearsPerPage, yearsPerRow };
3434
+ export { CLOCK_INNER_RADIUS, CLOCK_OUTER_RADIUS, CLOCK_RADIUS, CLOCK_TICK_RADIUS, MAT_DATETIMEPICKER_VALIDATORS, MAT_DATETIMEPICKER_VALUE_ACCESSOR, MTX_DATETIMEPICKER_SCROLL_STRATEGY, MTX_DATETIMEPICKER_SCROLL_STRATEGY_FACTORY, MTX_DATETIMEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER, MtxCalendar, MtxCalendarBody, MtxCalendarCell, MtxClock, MtxDatetimepicker, MtxDatetimepickerActions, MtxDatetimepickerApply, MtxDatetimepickerCancel, MtxDatetimepickerClear, MtxDatetimepickerContent, MtxDatetimepickerFilterType, MtxDatetimepickerInput, MtxDatetimepickerInputEvent, MtxDatetimepickerIntl, MtxDatetimepickerModule, MtxDatetimepickerToggle, MtxDatetimepickerToggleIcon, MtxMonthView, MtxMultiYearView, MtxTimeInput, MtxTimeView, MtxYearView, getActiveOffset, isSameMultiYearView, mtxDatetimepickerAnimations, yearsPerPage, yearsPerRow };
3348
3435
  //# sourceMappingURL=mtxDatetimepicker.mjs.map