@angular/material 10.1.1 → 10.2.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 (663) hide show
  1. package/_theming.scss +46 -20
  2. package/autocomplete/autocomplete-origin.d.ts +8 -5
  3. package/autocomplete/autocomplete-trigger.d.ts +23 -17
  4. package/autocomplete/autocomplete.d.ts +23 -12
  5. package/autocomplete/index.metadata.json +1 -1
  6. package/badge/badge.d.ts +3 -1
  7. package/badge/index.metadata.json +1 -1
  8. package/bottom-sheet/index.metadata.json +1 -1
  9. package/bundles/material-autocomplete-testing.umd.js +316 -256
  10. package/bundles/material-autocomplete-testing.umd.js.map +1 -1
  11. package/bundles/material-autocomplete-testing.umd.min.js +2 -16
  12. package/bundles/material-autocomplete-testing.umd.min.js.map +1 -1
  13. package/bundles/material-autocomplete.umd.js +553 -436
  14. package/bundles/material-autocomplete.umd.js.map +1 -1
  15. package/bundles/material-autocomplete.umd.min.js +3 -25
  16. package/bundles/material-autocomplete.umd.min.js.map +1 -1
  17. package/bundles/material-badge-testing.umd.js +301 -243
  18. package/bundles/material-badge-testing.umd.js.map +1 -1
  19. package/bundles/material-badge-testing.umd.min.js +2 -16
  20. package/bundles/material-badge-testing.umd.min.js.map +1 -1
  21. package/bundles/material-badge.umd.js +356 -282
  22. package/bundles/material-badge.umd.js.map +1 -1
  23. package/bundles/material-badge.umd.min.js +2 -2
  24. package/bundles/material-badge.umd.min.js.map +1 -1
  25. package/bundles/material-bottom-sheet-testing.umd.js +302 -244
  26. package/bundles/material-bottom-sheet-testing.umd.js.map +1 -1
  27. package/bundles/material-bottom-sheet-testing.umd.min.js +2 -16
  28. package/bundles/material-bottom-sheet-testing.umd.min.js.map +1 -1
  29. package/bundles/material-bottom-sheet.umd.js +376 -302
  30. package/bundles/material-bottom-sheet.umd.js.map +1 -1
  31. package/bundles/material-bottom-sheet.umd.min.js +17 -2
  32. package/bundles/material-bottom-sheet.umd.min.js.map +1 -1
  33. package/bundles/material-button-testing.umd.js +310 -252
  34. package/bundles/material-button-testing.umd.js.map +1 -1
  35. package/bundles/material-button-testing.umd.min.js +2 -16
  36. package/bundles/material-button-testing.umd.min.js.map +1 -1
  37. package/bundles/material-button-toggle-testing.umd.js +304 -261
  38. package/bundles/material-button-toggle-testing.umd.js.map +1 -1
  39. package/bundles/material-button-toggle-testing.umd.min.js +2 -31
  40. package/bundles/material-button-toggle-testing.umd.min.js.map +1 -1
  41. package/bundles/material-button-toggle.umd.js +388 -322
  42. package/bundles/material-button-toggle.umd.js.map +1 -1
  43. package/bundles/material-button-toggle.umd.min.js +2 -10
  44. package/bundles/material-button-toggle.umd.min.js.map +1 -1
  45. package/bundles/material-button.umd.js +375 -309
  46. package/bundles/material-button.umd.js.map +1 -1
  47. package/bundles/material-button.umd.min.js +2 -10
  48. package/bundles/material-button.umd.min.js.map +1 -1
  49. package/bundles/material-card-testing.umd.js +306 -250
  50. package/bundles/material-card-testing.umd.js.map +1 -1
  51. package/bundles/material-card-testing.umd.min.js +2 -16
  52. package/bundles/material-card-testing.umd.min.js.map +1 -1
  53. package/bundles/material-card.umd.js +139 -139
  54. package/bundles/material-card.umd.js.map +1 -1
  55. package/bundles/material-card.umd.min.js +2 -2
  56. package/bundles/material-card.umd.min.js.map +1 -1
  57. package/bundles/material-checkbox-testing.umd.js +302 -244
  58. package/bundles/material-checkbox-testing.umd.js.map +1 -1
  59. package/bundles/material-checkbox-testing.umd.min.js +2 -16
  60. package/bundles/material-checkbox-testing.umd.min.js.map +1 -1
  61. package/bundles/material-checkbox.umd.js +371 -312
  62. package/bundles/material-checkbox.umd.js.map +1 -1
  63. package/bundles/material-checkbox.umd.min.js +2 -9
  64. package/bundles/material-checkbox.umd.min.js.map +1 -1
  65. package/bundles/material-chips-testing.umd.js +802 -0
  66. package/bundles/material-chips-testing.umd.js.map +1 -0
  67. package/bundles/material-chips-testing.umd.min.js +30 -0
  68. package/bundles/material-chips-testing.umd.min.js.map +1 -0
  69. package/bundles/material-chips.umd.js +598 -551
  70. package/bundles/material-chips.umd.js.map +1 -1
  71. package/bundles/material-chips.umd.min.js +18 -3
  72. package/bundles/material-chips.umd.min.js.map +1 -1
  73. package/bundles/material-core-testing.umd.js +304 -261
  74. package/bundles/material-core-testing.umd.js.map +1 -1
  75. package/bundles/material-core-testing.umd.min.js +2 -31
  76. package/bundles/material-core-testing.umd.min.js.map +1 -1
  77. package/bundles/material-core.umd.js +605 -540
  78. package/bundles/material-core.umd.js.map +1 -1
  79. package/bundles/material-core.umd.min.js +37 -12
  80. package/bundles/material-core.umd.min.js.map +1 -1
  81. package/bundles/material-datepicker-testing.umd.js +1342 -0
  82. package/bundles/material-datepicker-testing.umd.js.map +1 -0
  83. package/bundles/material-datepicker-testing.umd.min.js +30 -0
  84. package/bundles/material-datepicker-testing.umd.min.js.map +1 -0
  85. package/bundles/material-datepicker.umd.js +1014 -981
  86. package/bundles/material-datepicker.umd.js.map +1 -1
  87. package/bundles/material-datepicker.umd.min.js +43 -9
  88. package/bundles/material-datepicker.umd.min.js.map +1 -1
  89. package/bundles/material-dialog-testing.umd.js +303 -245
  90. package/bundles/material-dialog-testing.umd.js.map +1 -1
  91. package/bundles/material-dialog-testing.umd.min.js +2 -16
  92. package/bundles/material-dialog-testing.umd.min.js.map +1 -1
  93. package/bundles/material-dialog.umd.js +597 -476
  94. package/bundles/material-dialog.umd.js.map +1 -1
  95. package/bundles/material-dialog.umd.min.js +10 -8
  96. package/bundles/material-dialog.umd.min.js.map +1 -1
  97. package/bundles/material-divider-testing.umd.js +300 -242
  98. package/bundles/material-divider-testing.umd.js.map +1 -1
  99. package/bundles/material-divider-testing.umd.min.js +2 -16
  100. package/bundles/material-divider-testing.umd.min.js.map +1 -1
  101. package/bundles/material-divider.umd.js +28 -28
  102. package/bundles/material-divider.umd.js.map +1 -1
  103. package/bundles/material-divider.umd.min.js +2 -9
  104. package/bundles/material-divider.umd.min.js.map +1 -1
  105. package/bundles/material-expansion-testing.umd.js +303 -254
  106. package/bundles/material-expansion-testing.umd.js.map +1 -1
  107. package/bundles/material-expansion-testing.umd.min.js +2 -17
  108. package/bundles/material-expansion-testing.umd.min.js.map +1 -1
  109. package/bundles/material-expansion.umd.js +471 -433
  110. package/bundles/material-expansion.umd.js.map +1 -1
  111. package/bundles/material-expansion.umd.min.js +12 -4
  112. package/bundles/material-expansion.umd.min.js.map +1 -1
  113. package/bundles/material-form-field-testing-control.umd.js +299 -233
  114. package/bundles/material-form-field-testing-control.umd.js.map +1 -1
  115. package/bundles/material-form-field-testing-control.umd.min.js.map +1 -1
  116. package/bundles/material-form-field-testing.umd.js +301 -243
  117. package/bundles/material-form-field-testing.umd.js.map +1 -1
  118. package/bundles/material-form-field-testing.umd.min.js +3 -17
  119. package/bundles/material-form-field-testing.umd.min.js.map +1 -1
  120. package/bundles/material-form-field.umd.js +480 -417
  121. package/bundles/material-form-field.umd.js.map +1 -1
  122. package/bundles/material-form-field.umd.min.js +51 -4
  123. package/bundles/material-form-field.umd.min.js.map +1 -1
  124. package/bundles/material-grid-list-testing.umd.js +311 -260
  125. package/bundles/material-grid-list-testing.umd.js.map +1 -1
  126. package/bundles/material-grid-list-testing.umd.min.js +2 -24
  127. package/bundles/material-grid-list-testing.umd.min.js.map +1 -1
  128. package/bundles/material-grid-list.umd.js +414 -340
  129. package/bundles/material-grid-list.umd.js.map +1 -1
  130. package/bundles/material-grid-list.umd.min.js +20 -5
  131. package/bundles/material-grid-list.umd.min.js.map +1 -1
  132. package/bundles/material-icon-testing.umd.js +409 -12
  133. package/bundles/material-icon-testing.umd.js.map +1 -1
  134. package/bundles/material-icon-testing.umd.min.js +18 -3
  135. package/bundles/material-icon-testing.umd.min.js.map +1 -1
  136. package/bundles/material-icon.umd.js +404 -336
  137. package/bundles/material-icon.umd.js.map +1 -1
  138. package/bundles/material-icon.umd.min.js +2 -9
  139. package/bundles/material-icon.umd.min.js.map +1 -1
  140. package/bundles/material-input-testing.umd.js +309 -262
  141. package/bundles/material-input-testing.umd.js.map +1 -1
  142. package/bundles/material-input-testing.umd.min.js +2 -16
  143. package/bundles/material-input-testing.umd.min.js.map +1 -1
  144. package/bundles/material-input.umd.js +399 -333
  145. package/bundles/material-input.umd.js.map +1 -1
  146. package/bundles/material-input.umd.min.js +5 -18
  147. package/bundles/material-input.umd.min.js.map +1 -1
  148. package/bundles/material-list-testing.umd.js +333 -311
  149. package/bundles/material-list-testing.umd.js.map +1 -1
  150. package/bundles/material-list-testing.umd.min.js +1 -9
  151. package/bundles/material-list-testing.umd.min.js.map +1 -1
  152. package/bundles/material-list.umd.js +527 -466
  153. package/bundles/material-list.umd.js.map +1 -1
  154. package/bundles/material-list.umd.min.js +2 -10
  155. package/bundles/material-list.umd.min.js.map +1 -1
  156. package/bundles/material-menu-testing.umd.js +305 -247
  157. package/bundles/material-menu-testing.umd.js.map +1 -1
  158. package/bundles/material-menu-testing.umd.min.js +2 -17
  159. package/bundles/material-menu-testing.umd.min.js.map +1 -1
  160. package/bundles/material-menu.umd.js +476 -429
  161. package/bundles/material-menu.umd.js.map +1 -1
  162. package/bundles/material-menu.umd.min.js +3 -17
  163. package/bundles/material-menu.umd.min.js.map +1 -1
  164. package/bundles/material-paginator-testing.umd.js +302 -244
  165. package/bundles/material-paginator-testing.umd.js.map +1 -1
  166. package/bundles/material-paginator-testing.umd.min.js +2 -16
  167. package/bundles/material-paginator-testing.umd.min.js.map +1 -1
  168. package/bundles/material-paginator.umd.js +349 -280
  169. package/bundles/material-paginator.umd.js.map +1 -1
  170. package/bundles/material-paginator.umd.min.js +2 -9
  171. package/bundles/material-paginator.umd.min.js.map +1 -1
  172. package/bundles/material-progress-bar-testing.umd.js +301 -243
  173. package/bundles/material-progress-bar-testing.umd.js.map +1 -1
  174. package/bundles/material-progress-bar-testing.umd.min.js +2 -16
  175. package/bundles/material-progress-bar-testing.umd.min.js.map +1 -1
  176. package/bundles/material-progress-bar.umd.js +339 -266
  177. package/bundles/material-progress-bar.umd.js.map +1 -1
  178. package/bundles/material-progress-bar.umd.min.js +4 -3
  179. package/bundles/material-progress-bar.umd.min.js.map +1 -1
  180. package/bundles/material-progress-spinner-testing.umd.js +301 -243
  181. package/bundles/material-progress-spinner-testing.umd.js.map +1 -1
  182. package/bundles/material-progress-spinner-testing.umd.min.js +2 -16
  183. package/bundles/material-progress-spinner-testing.umd.min.js.map +1 -1
  184. package/bundles/material-progress-spinner.umd.js +420 -365
  185. package/bundles/material-progress-spinner.umd.js.map +1 -1
  186. package/bundles/material-progress-spinner.umd.min.js +3 -11
  187. package/bundles/material-progress-spinner.umd.min.js.map +1 -1
  188. package/bundles/material-radio-testing.umd.js +304 -246
  189. package/bundles/material-radio-testing.umd.js.map +1 -1
  190. package/bundles/material-radio-testing.umd.min.js +2 -17
  191. package/bundles/material-radio-testing.umd.min.js.map +1 -1
  192. package/bundles/material-radio.umd.js +405 -339
  193. package/bundles/material-radio.umd.js.map +1 -1
  194. package/bundles/material-radio.umd.min.js +2 -10
  195. package/bundles/material-radio.umd.min.js.map +1 -1
  196. package/bundles/material-select-testing.umd.js +316 -260
  197. package/bundles/material-select-testing.umd.js.map +1 -1
  198. package/bundles/material-select-testing.umd.min.js +2 -16
  199. package/bundles/material-select-testing.umd.min.js.map +1 -1
  200. package/bundles/material-select.umd.js +469 -389
  201. package/bundles/material-select.umd.js.map +1 -1
  202. package/bundles/material-select.umd.min.js +5 -12
  203. package/bundles/material-select.umd.min.js.map +1 -1
  204. package/bundles/material-sidenav-testing.umd.js +303 -252
  205. package/bundles/material-sidenav-testing.umd.js.map +1 -1
  206. package/bundles/material-sidenav-testing.umd.min.js +1 -23
  207. package/bundles/material-sidenav-testing.umd.min.js.map +1 -1
  208. package/bundles/material-sidenav.umd.js +535 -496
  209. package/bundles/material-sidenav.umd.js.map +1 -1
  210. package/bundles/material-sidenav.umd.min.js +3 -3
  211. package/bundles/material-sidenav.umd.min.js.map +1 -1
  212. package/bundles/material-slide-toggle-testing.umd.js +302 -244
  213. package/bundles/material-slide-toggle-testing.umd.js.map +1 -1
  214. package/bundles/material-slide-toggle-testing.umd.min.js +2 -16
  215. package/bundles/material-slide-toggle-testing.umd.min.js.map +1 -1
  216. package/bundles/material-slide-toggle.umd.js +373 -314
  217. package/bundles/material-slide-toggle.umd.js.map +1 -1
  218. package/bundles/material-slide-toggle.umd.min.js +2 -9
  219. package/bundles/material-slide-toggle.umd.min.js.map +1 -1
  220. package/bundles/material-slider-testing.umd.js +302 -236
  221. package/bundles/material-slider-testing.umd.js.map +1 -1
  222. package/bundles/material-slider-testing.umd.min.js +2 -9
  223. package/bundles/material-slider-testing.umd.min.js.map +1 -1
  224. package/bundles/material-slider.umd.js +479 -448
  225. package/bundles/material-slider.umd.js.map +1 -1
  226. package/bundles/material-slider.umd.min.js +4 -3
  227. package/bundles/material-slider.umd.min.js.map +1 -1
  228. package/bundles/material-snack-bar-testing.umd.js +304 -246
  229. package/bundles/material-snack-bar-testing.umd.js.map +1 -1
  230. package/bundles/material-snack-bar-testing.umd.min.js +2 -16
  231. package/bundles/material-snack-bar-testing.umd.min.js.map +1 -1
  232. package/bundles/material-snack-bar.umd.js +394 -317
  233. package/bundles/material-snack-bar.umd.js.map +1 -1
  234. package/bundles/material-snack-bar.umd.min.js +26 -2
  235. package/bundles/material-snack-bar.umd.min.js.map +1 -1
  236. package/bundles/material-sort-testing.umd.js +302 -243
  237. package/bundles/material-sort-testing.umd.js.map +1 -1
  238. package/bundles/material-sort-testing.umd.min.js +2 -17
  239. package/bundles/material-sort-testing.umd.min.js.map +1 -1
  240. package/bundles/material-sort.umd.js +383 -326
  241. package/bundles/material-sort.umd.js.map +1 -1
  242. package/bundles/material-sort.umd.min.js +3 -33
  243. package/bundles/material-sort.umd.min.js.map +1 -1
  244. package/bundles/material-stepper-testing.umd.js +727 -0
  245. package/bundles/material-stepper-testing.umd.js.map +1 -0
  246. package/bundles/material-stepper-testing.umd.min.js +30 -0
  247. package/bundles/material-stepper-testing.umd.min.js.map +1 -0
  248. package/bundles/material-stepper.umd.js +496 -446
  249. package/bundles/material-stepper.umd.js.map +1 -1
  250. package/bundles/material-stepper.umd.min.js +4 -11
  251. package/bundles/material-stepper.umd.min.js.map +1 -1
  252. package/bundles/material-table-testing.umd.js +317 -265
  253. package/bundles/material-table-testing.umd.js.map +1 -1
  254. package/bundles/material-table-testing.umd.min.js +2 -24
  255. package/bundles/material-table-testing.umd.min.js.map +1 -1
  256. package/bundles/material-table.umd.js +521 -465
  257. package/bundles/material-table.umd.js.map +1 -1
  258. package/bundles/material-table.umd.min.js +4 -11
  259. package/bundles/material-table.umd.min.js.map +1 -1
  260. package/bundles/material-tabs-testing.umd.js +303 -244
  261. package/bundles/material-tabs-testing.umd.js.map +1 -1
  262. package/bundles/material-tabs-testing.umd.min.js +1 -16
  263. package/bundles/material-tabs-testing.umd.min.js.map +1 -1
  264. package/bundles/material-tabs.umd.js +677 -646
  265. package/bundles/material-tabs.umd.js.map +1 -1
  266. package/bundles/material-tabs.umd.min.js +29 -4
  267. package/bundles/material-tabs.umd.min.js.map +1 -1
  268. package/bundles/material-toolbar-testing.umd.js +301 -243
  269. package/bundles/material-toolbar-testing.umd.js.map +1 -1
  270. package/bundles/material-toolbar-testing.umd.min.js +2 -16
  271. package/bundles/material-toolbar-testing.umd.min.js.map +1 -1
  272. package/bundles/material-toolbar.umd.js +350 -286
  273. package/bundles/material-toolbar.umd.js.map +1 -1
  274. package/bundles/material-toolbar.umd.min.js +4 -3
  275. package/bundles/material-toolbar.umd.min.js.map +1 -1
  276. package/bundles/material-tooltip-testing.umd.js +301 -243
  277. package/bundles/material-tooltip-testing.umd.js.map +1 -1
  278. package/bundles/material-tooltip-testing.umd.min.js +2 -16
  279. package/bundles/material-tooltip-testing.umd.min.js.map +1 -1
  280. package/bundles/material-tooltip.umd.js +424 -324
  281. package/bundles/material-tooltip.umd.js.map +1 -1
  282. package/bundles/material-tooltip.umd.min.js +11 -3
  283. package/bundles/material-tooltip.umd.min.js.map +1 -1
  284. package/bundles/material-tree.umd.js +446 -385
  285. package/bundles/material-tree.umd.js.map +1 -1
  286. package/bundles/material-tree.umd.min.js +3 -3
  287. package/bundles/material-tree.umd.min.js.map +1 -1
  288. package/button/index.metadata.json +1 -1
  289. package/chips/chip-default-options.d.ts +1 -1
  290. package/chips/chip-input.d.ts +1 -1
  291. package/chips/chip.d.ts +2 -2
  292. package/chips/index.metadata.json +1 -1
  293. package/chips/testing/chip-harness-filters.d.ts +28 -0
  294. package/chips/testing/chip-harness.d.ts +41 -0
  295. package/chips/testing/chip-input-harness.d.ts +47 -0
  296. package/chips/testing/chip-list-harness.d.ts +49 -0
  297. package/chips/testing/chip-remove-harness.d.ts +22 -0
  298. package/chips/testing/index.d.ts +8 -0
  299. package/chips/testing/package.json +9 -0
  300. package/chips/testing/public-api.d.ts +12 -0
  301. package/core/common-behaviors/color.d.ts +2 -0
  302. package/core/common-behaviors/constructor.d.ts +7 -0
  303. package/core/common-behaviors/disable-ripple.d.ts +2 -2
  304. package/core/common-behaviors/tabindex.d.ts +4 -2
  305. package/core/datetime/date-adapter.d.ts +9 -2
  306. package/core/index.metadata.json +1 -1
  307. package/core/option/optgroup.d.ts +8 -6
  308. package/core/option/option.d.ts +12 -9
  309. package/core/style/_vendor-prefixes.scss +5 -0
  310. package/datepicker/_datepicker-theme.scss +42 -21
  311. package/datepicker/calendar-body.d.ts +15 -4
  312. package/datepicker/calendar.d.ts +2 -7
  313. package/datepicker/date-range-input.d.ts +0 -5
  314. package/datepicker/date-range-selection-strategy.d.ts +5 -1
  315. package/datepicker/datepicker-base.d.ts +9 -11
  316. package/datepicker/datepicker-input-base.d.ts +0 -5
  317. package/datepicker/index.d.ts +4 -3
  318. package/datepicker/index.metadata.json +1 -1
  319. package/datepicker/month-view.d.ts +5 -9
  320. package/datepicker/multi-year-view.d.ts +3 -6
  321. package/datepicker/public-api.d.ts +1 -1
  322. package/datepicker/testing/calendar-cell-harness.d.ts +64 -0
  323. package/datepicker/testing/calendar-harness.d.ts +53 -0
  324. package/datepicker/testing/date-range-input-harness.d.ts +59 -0
  325. package/datepicker/testing/datepicker-harness-filters.d.ts +45 -0
  326. package/datepicker/testing/datepicker-input-harness-base.d.ts +43 -0
  327. package/datepicker/testing/datepicker-input-harness.d.ts +36 -0
  328. package/datepicker/testing/datepicker-toggle-harness.d.ts +28 -0
  329. package/datepicker/testing/datepicker-trigger-harness-base.d.ts +44 -0
  330. package/datepicker/testing/index.d.ts +8 -0
  331. package/datepicker/testing/package.json +9 -0
  332. package/datepicker/testing/public-api.d.ts +13 -0
  333. package/datepicker/year-view.d.ts +3 -6
  334. package/dialog/dialog-config.d.ts +1 -1
  335. package/dialog/dialog-container.d.ts +39 -22
  336. package/dialog/dialog-ref.d.ts +3 -3
  337. package/dialog/dialog.d.ts +25 -14
  338. package/dialog/index.metadata.json +1 -1
  339. package/esm2015/autocomplete/autocomplete-module.js +10 -5
  340. package/esm2015/autocomplete/autocomplete-origin.js +15 -9
  341. package/esm2015/autocomplete/autocomplete-trigger.js +73 -53
  342. package/esm2015/autocomplete/autocomplete.js +35 -22
  343. package/esm2015/autocomplete/testing/autocomplete-harness-filters.js +1 -0
  344. package/esm2015/badge/badge.js +15 -7
  345. package/esm2015/badge/testing/badge-harness-filters.js +1 -0
  346. package/esm2015/bottom-sheet/bottom-sheet-container.js +2 -2
  347. package/esm2015/bottom-sheet/bottom-sheet-ref.js +3 -3
  348. package/esm2015/bottom-sheet/bottom-sheet.js +14 -13
  349. package/esm2015/bottom-sheet/testing/bottom-sheet-harness-filters.js +1 -0
  350. package/esm2015/button/button.js +3 -3
  351. package/esm2015/button/testing/button-harness-filters.js +1 -0
  352. package/esm2015/button-toggle/button-toggle.js +2 -2
  353. package/esm2015/button-toggle/testing/button-toggle-group-harness-filters.js +1 -0
  354. package/esm2015/button-toggle/testing/button-toggle-group-harness.js +2 -2
  355. package/esm2015/button-toggle/testing/button-toggle-harness-filters.js +1 -0
  356. package/esm2015/button-toggle/testing/button-toggle-harness.js +2 -2
  357. package/esm2015/card/testing/card-harness-filters.js +1 -0
  358. package/esm2015/card/testing/card-harness.js +2 -2
  359. package/esm2015/checkbox/checkbox.js +2 -2
  360. package/esm2015/checkbox/testing/checkbox-harness-filters.js +1 -0
  361. package/esm2015/checkbox/testing/checkbox-harness.js +2 -2
  362. package/esm2015/chips/chip-default-options.js +1 -1
  363. package/esm2015/chips/chip-input.js +3 -8
  364. package/esm2015/chips/chip-list.js +7 -13
  365. package/esm2015/chips/chip-text-control.js +1 -0
  366. package/esm2015/chips/chip.js +1 -2
  367. package/esm2015/chips/testing/chip-harness-filters.js +2 -0
  368. package/esm2015/chips/testing/chip-harness.js +82 -0
  369. package/esm2015/chips/testing/chip-input-harness.js +101 -0
  370. package/esm2015/chips/testing/chip-list-harness.js +94 -0
  371. package/esm2015/chips/testing/chip-remove-harness.js +29 -0
  372. package/esm2015/chips/testing/index.js +9 -0
  373. package/esm2015/chips/testing/public-api.js +13 -0
  374. package/esm2015/chips/testing/testing.externs.js +0 -0
  375. package/esm2015/core/common-behaviors/color.js +3 -2
  376. package/esm2015/core/common-behaviors/common-module.js +6 -2
  377. package/esm2015/core/common-behaviors/constructor.js +2 -1
  378. package/esm2015/core/common-behaviors/disable-ripple.js +7 -3
  379. package/esm2015/core/common-behaviors/initialized.js +2 -2
  380. package/esm2015/core/common-behaviors/tabindex.js +11 -4
  381. package/esm2015/core/datetime/date-adapter.js +12 -3
  382. package/esm2015/core/datetime/native-date-adapter.js +11 -9
  383. package/esm2015/core/option/optgroup.js +16 -11
  384. package/esm2015/core/option/option.js +29 -16
  385. package/esm2015/core/testing/optgroup-harness-filters.js +1 -0
  386. package/esm2015/core/testing/option-harness-filters.js +1 -0
  387. package/esm2015/core/version.js +1 -1
  388. package/esm2015/datepicker/calendar-body.js +20 -5
  389. package/esm2015/datepicker/calendar.js +13 -18
  390. package/esm2015/datepicker/date-range-input-parts.js +5 -5
  391. package/esm2015/datepicker/date-range-input.js +15 -16
  392. package/esm2015/datepicker/date-range-picker.js +6 -2
  393. package/esm2015/datepicker/date-range-selection-strategy.js +12 -2
  394. package/esm2015/datepicker/date-selection-model.js +2 -2
  395. package/esm2015/datepicker/datepicker-base.js +17 -19
  396. package/esm2015/datepicker/datepicker-input-base.js +13 -18
  397. package/esm2015/datepicker/datepicker-input.js +7 -3
  398. package/esm2015/datepicker/datepicker-module.js +2 -7
  399. package/esm2015/datepicker/datepicker-toggle.js +3 -1
  400. package/esm2015/datepicker/index.js +5 -4
  401. package/esm2015/datepicker/month-view.js +19 -18
  402. package/esm2015/datepicker/multi-year-view.js +12 -16
  403. package/esm2015/datepicker/public-api.js +2 -2
  404. package/esm2015/datepicker/testing/calendar-cell-harness.js +181 -0
  405. package/esm2015/datepicker/testing/calendar-harness.js +91 -0
  406. package/esm2015/datepicker/testing/date-range-input-harness.js +116 -0
  407. package/esm2015/datepicker/testing/datepicker-harness-filters.js +9 -0
  408. package/esm2015/datepicker/testing/datepicker-input-harness-base.js +100 -0
  409. package/esm2015/datepicker/testing/datepicker-input-harness.js +69 -0
  410. package/esm2015/datepicker/testing/datepicker-toggle-harness.js +48 -0
  411. package/esm2015/datepicker/testing/datepicker-trigger-harness-base.js +77 -0
  412. package/esm2015/datepicker/testing/index.js +9 -0
  413. package/esm2015/datepicker/testing/public-api.js +14 -0
  414. package/esm2015/datepicker/testing/testing.externs.js +0 -0
  415. package/esm2015/datepicker/year-view.js +18 -20
  416. package/esm2015/dialog/dialog-config.js +1 -1
  417. package/esm2015/dialog/dialog-container.js +73 -50
  418. package/esm2015/dialog/dialog-content-directives.js +9 -3
  419. package/esm2015/dialog/dialog-ref.js +8 -8
  420. package/esm2015/dialog/dialog.js +58 -29
  421. package/esm2015/dialog/testing/dialog-harness-filters.js +1 -0
  422. package/esm2015/divider/testing/divider-harness-filters.js +1 -0
  423. package/esm2015/divider/testing/divider-harness.js +2 -2
  424. package/esm2015/expansion/accordion.js +3 -20
  425. package/esm2015/expansion/expansion-panel-header.js +7 -13
  426. package/esm2015/expansion/expansion-panel.js +7 -6
  427. package/esm2015/expansion/testing/expansion-harness-filters.js +1 -0
  428. package/esm2015/form-field/form-field-control.js +1 -1
  429. package/esm2015/form-field/form-field.js +26 -17
  430. package/esm2015/form-field/testing/form-field-harness-filters.js +1 -0
  431. package/esm2015/grid-list/grid-list.js +2 -2
  432. package/esm2015/grid-list/testing/grid-list-harness-filters.js +1 -0
  433. package/esm2015/grid-list/tile-coordinator.js +2 -2
  434. package/esm2015/grid-list/tile-styler.js +4 -3
  435. package/esm2015/icon/icon-registry.js +44 -52
  436. package/esm2015/icon/icon.js +13 -2
  437. package/esm2015/icon/testing/icon-harness-filters.js +9 -0
  438. package/esm2015/icon/testing/icon-harness.js +63 -0
  439. package/esm2015/icon/testing/public-api.js +3 -1
  440. package/esm2015/input/input.js +17 -10
  441. package/esm2015/input/testing/input-harness-filters.js +1 -0
  442. package/esm2015/input/testing/input-harness.js +7 -7
  443. package/esm2015/list/list.js +2 -2
  444. package/esm2015/list/selection-list.js +33 -31
  445. package/esm2015/list/testing/action-list-harness.js +2 -2
  446. package/esm2015/list/testing/list-harness-filters.js +1 -0
  447. package/esm2015/list/testing/list-harness.js +2 -2
  448. package/esm2015/list/testing/list-item-harness-base.js +2 -2
  449. package/esm2015/list/testing/nav-list-harness.js +2 -2
  450. package/esm2015/list/testing/selection-list-harness.js +3 -3
  451. package/esm2015/menu/menu-positions.js +1 -0
  452. package/esm2015/menu/menu-trigger.js +12 -6
  453. package/esm2015/menu/menu.js +11 -14
  454. package/esm2015/menu/testing/menu-harness-filters.js +1 -0
  455. package/esm2015/paginator/paginator.js +6 -3
  456. package/esm2015/paginator/testing/paginator-harness-filters.js +1 -0
  457. package/esm2015/progress-bar/testing/progress-bar-harness-filters.js +1 -0
  458. package/esm2015/progress-bar/testing/progress-bar-harness.js +2 -2
  459. package/esm2015/progress-spinner/progress-spinner.js +25 -16
  460. package/esm2015/progress-spinner/testing/progress-spinner-harness-filters.js +1 -0
  461. package/esm2015/progress-spinner/testing/progress-spinner-harness.js +2 -2
  462. package/esm2015/radio/radio.js +1 -1
  463. package/esm2015/radio/testing/radio-harness-filters.js +1 -0
  464. package/esm2015/radio/testing/radio-harness.js +3 -3
  465. package/esm2015/select/select.js +71 -57
  466. package/esm2015/select/testing/select-harness-filters.js +1 -0
  467. package/esm2015/select/testing/select-harness.js +2 -3
  468. package/esm2015/sidenav/drawer.js +23 -28
  469. package/esm2015/sidenav/testing/drawer-harness-filters.js +1 -0
  470. package/esm2015/slide-toggle/testing/slide-toggle-harness-filters.js +1 -0
  471. package/esm2015/slide-toggle/testing/slide-toggle-harness.js +2 -2
  472. package/esm2015/slider/slider.js +28 -31
  473. package/esm2015/slider/testing/slider-harness-filters.js +1 -0
  474. package/esm2015/slider/testing/slider-harness.js +2 -2
  475. package/esm2015/snack-bar/snack-bar-container.js +3 -3
  476. package/esm2015/snack-bar/snack-bar-ref.js +3 -3
  477. package/esm2015/snack-bar/snack-bar.js +13 -9
  478. package/esm2015/snack-bar/testing/snack-bar-harness-filters.js +1 -0
  479. package/esm2015/sort/sort-direction.js +1 -0
  480. package/esm2015/sort/sort-header.js +6 -3
  481. package/esm2015/sort/sort.js +11 -8
  482. package/esm2015/sort/testing/sort-harness-filters.js +1 -0
  483. package/esm2015/stepper/step-header.js +2 -2
  484. package/esm2015/stepper/stepper-button.js +3 -1
  485. package/esm2015/stepper/stepper.js +7 -4
  486. package/esm2015/stepper/testing/index.js +9 -0
  487. package/esm2015/stepper/testing/public-api.js +12 -0
  488. package/esm2015/stepper/testing/step-harness-filters.js +2 -0
  489. package/esm2015/stepper/testing/step-harness.js +132 -0
  490. package/esm2015/stepper/testing/stepper-button-harnesses.js +55 -0
  491. package/esm2015/stepper/testing/stepper-harness.js +57 -0
  492. package/esm2015/stepper/testing/testing.externs.js +0 -0
  493. package/esm2015/table/cell.js +15 -26
  494. package/esm2015/table/table-data-source.js +14 -1
  495. package/esm2015/table/table.js +11 -4
  496. package/esm2015/table/testing/table-harness-filters.js +1 -0
  497. package/esm2015/tabs/paginated-tab-header.js +3 -10
  498. package/esm2015/tabs/tab-nav-bar/tab-nav-bar.js +3 -3
  499. package/esm2015/tabs/tab.js +17 -10
  500. package/esm2015/tabs/testing/tab-harness-filters.js +1 -0
  501. package/esm2015/toolbar/testing/toolbar-harness-filters.js +1 -0
  502. package/esm2015/toolbar/testing/toolbar-harness.js +2 -2
  503. package/esm2015/toolbar/toolbar.js +15 -17
  504. package/esm2015/tooltip/testing/tooltip-harness-filters.js +1 -0
  505. package/esm2015/tooltip/tooltip.js +53 -31
  506. package/esm2015/tree/node.js +2 -2
  507. package/esm2015/tree/padding.js +7 -1
  508. package/esm2015/tree/toggle.js +8 -4
  509. package/expansion/expansion-panel-header.d.ts +6 -12
  510. package/expansion/expansion-panel.d.ts +5 -4
  511. package/expansion/index.metadata.json +1 -1
  512. package/fesm2015/autocomplete.js +128 -84
  513. package/fesm2015/autocomplete.js.map +1 -1
  514. package/fesm2015/badge.js +14 -6
  515. package/fesm2015/badge.js.map +1 -1
  516. package/fesm2015/bottom-sheet.js +17 -16
  517. package/fesm2015/bottom-sheet.js.map +1 -1
  518. package/fesm2015/button-toggle/testing.js +2 -2
  519. package/fesm2015/button-toggle/testing.js.map +1 -1
  520. package/fesm2015/button-toggle.js +1 -1
  521. package/fesm2015/button-toggle.js.map +1 -1
  522. package/fesm2015/button.js +2 -2
  523. package/fesm2015/button.js.map +1 -1
  524. package/fesm2015/card/testing.js +1 -1
  525. package/fesm2015/card/testing.js.map +1 -1
  526. package/fesm2015/checkbox/testing.js +1 -1
  527. package/fesm2015/checkbox/testing.js.map +1 -1
  528. package/fesm2015/checkbox.js +1 -1
  529. package/fesm2015/checkbox.js.map +1 -1
  530. package/fesm2015/chips/testing.js +316 -0
  531. package/fesm2015/chips/testing.js.map +1 -0
  532. package/fesm2015/chips.js +7 -19
  533. package/fesm2015/chips.js.map +1 -1
  534. package/fesm2015/core.js +87 -42
  535. package/fesm2015/core.js.map +1 -1
  536. package/fesm2015/datepicker/testing.js +690 -0
  537. package/fesm2015/datepicker/testing.js.map +1 -0
  538. package/fesm2015/datepicker.js +146 -134
  539. package/fesm2015/datepicker.js.map +1 -1
  540. package/fesm2015/dialog.js +143 -85
  541. package/fesm2015/dialog.js.map +1 -1
  542. package/fesm2015/divider/testing.js +1 -1
  543. package/fesm2015/divider/testing.js.map +1 -1
  544. package/fesm2015/expansion.js +9 -30
  545. package/fesm2015/expansion.js.map +1 -1
  546. package/fesm2015/form-field.js +25 -16
  547. package/fesm2015/form-field.js.map +1 -1
  548. package/fesm2015/grid-list.js +5 -4
  549. package/fesm2015/grid-list.js.map +1 -1
  550. package/fesm2015/icon/testing.js +72 -1
  551. package/fesm2015/icon/testing.js.map +1 -1
  552. package/fesm2015/icon.js +56 -53
  553. package/fesm2015/icon.js.map +1 -1
  554. package/fesm2015/input/testing.js +6 -6
  555. package/fesm2015/input/testing.js.map +1 -1
  556. package/fesm2015/input.js +15 -8
  557. package/fesm2015/input.js.map +1 -1
  558. package/fesm2015/list/testing.js +6 -6
  559. package/fesm2015/list/testing.js.map +1 -1
  560. package/fesm2015/list.js +33 -31
  561. package/fesm2015/list.js.map +1 -1
  562. package/fesm2015/menu.js +20 -17
  563. package/fesm2015/menu.js.map +1 -1
  564. package/fesm2015/paginator.js +5 -2
  565. package/fesm2015/paginator.js.map +1 -1
  566. package/fesm2015/progress-bar/testing.js +1 -1
  567. package/fesm2015/progress-bar/testing.js.map +1 -1
  568. package/fesm2015/progress-spinner/testing.js +1 -1
  569. package/fesm2015/progress-spinner/testing.js.map +1 -1
  570. package/fesm2015/progress-spinner.js +24 -15
  571. package/fesm2015/progress-spinner.js.map +1 -1
  572. package/fesm2015/radio/testing.js +2 -2
  573. package/fesm2015/radio/testing.js.map +1 -1
  574. package/fesm2015/radio.js.map +1 -1
  575. package/fesm2015/select/testing.js +1 -2
  576. package/fesm2015/select/testing.js.map +1 -1
  577. package/fesm2015/select.js +70 -56
  578. package/fesm2015/select.js.map +1 -1
  579. package/fesm2015/sidenav.js +22 -27
  580. package/fesm2015/sidenav.js.map +1 -1
  581. package/fesm2015/slide-toggle/testing.js +1 -1
  582. package/fesm2015/slide-toggle/testing.js.map +1 -1
  583. package/fesm2015/slider/testing.js +1 -1
  584. package/fesm2015/slider/testing.js.map +1 -1
  585. package/fesm2015/slider.js +27 -30
  586. package/fesm2015/slider.js.map +1 -1
  587. package/fesm2015/snack-bar.js +17 -13
  588. package/fesm2015/snack-bar.js.map +1 -1
  589. package/fesm2015/sort.js +15 -9
  590. package/fesm2015/sort.js.map +1 -1
  591. package/fesm2015/stepper/testing.js +258 -0
  592. package/fesm2015/stepper/testing.js.map +1 -0
  593. package/fesm2015/stepper.js +10 -5
  594. package/fesm2015/stepper.js.map +1 -1
  595. package/fesm2015/table.js +37 -28
  596. package/fesm2015/table.js.map +1 -1
  597. package/fesm2015/tabs.js +20 -20
  598. package/fesm2015/tabs.js.map +1 -1
  599. package/fesm2015/toolbar/testing.js +1 -1
  600. package/fesm2015/toolbar/testing.js.map +1 -1
  601. package/fesm2015/toolbar.js +14 -16
  602. package/fesm2015/toolbar.js.map +1 -1
  603. package/fesm2015/tooltip.js +52 -30
  604. package/fesm2015/tooltip.js.map +1 -1
  605. package/fesm2015/tree.js +13 -4
  606. package/fesm2015/tree.js.map +1 -1
  607. package/form-field/form-field-control.d.ts +5 -0
  608. package/form-field/form-field.d.ts +8 -5
  609. package/form-field/index.metadata.json +1 -1
  610. package/icon/icon-registry.d.ts +4 -6
  611. package/icon/icon.d.ts +3 -1
  612. package/icon/index.metadata.json +1 -1
  613. package/icon/testing/icon-harness-filters.d.ts +22 -0
  614. package/icon/testing/icon-harness.d.ts +29 -0
  615. package/icon/testing/index.metadata.json +1 -1
  616. package/icon/testing/public-api.d.ts +2 -0
  617. package/input/index.metadata.json +1 -1
  618. package/input/input.d.ts +6 -3
  619. package/list/index.metadata.json +1 -1
  620. package/list/selection-list.d.ts +3 -7
  621. package/menu/index.metadata.json +1 -1
  622. package/package.json +2 -2
  623. package/paginator/index.metadata.json +1 -1
  624. package/paginator/paginator.d.ts +5 -0
  625. package/prebuilt-themes/deeppurple-amber.css +1 -1
  626. package/prebuilt-themes/indigo-pink.css +1 -1
  627. package/prebuilt-themes/pink-bluegrey.css +1 -1
  628. package/prebuilt-themes/purple-green.css +1 -1
  629. package/progress-spinner/index.metadata.json +1 -1
  630. package/progress-spinner/progress-spinner.d.ts +9 -5
  631. package/radio/index.metadata.json +1 -1
  632. package/radio/radio.d.ts +2 -2
  633. package/schematics/ng-add/index.js +1 -1
  634. package/schematics/ng-generate/tree/files/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.html.template +1 -1
  635. package/schematics/ng-update/data/index.js +1 -1
  636. package/select/index.metadata.json +1 -1
  637. package/select/select.d.ts +9 -8
  638. package/sidenav/drawer.d.ts +5 -5
  639. package/sidenav/index.metadata.json +1 -1
  640. package/slider/index.metadata.json +1 -1
  641. package/slider/slider.d.ts +8 -10
  642. package/snack-bar/index.metadata.json +1 -1
  643. package/sort/index.metadata.json +1 -1
  644. package/stepper/index.metadata.json +1 -1
  645. package/stepper/stepper.d.ts +3 -1
  646. package/stepper/testing/index.d.ts +8 -0
  647. package/stepper/testing/package.json +9 -0
  648. package/stepper/testing/public-api.d.ts +11 -0
  649. package/stepper/testing/step-harness-filters.d.ts +37 -0
  650. package/stepper/testing/step-harness.d.ts +57 -0
  651. package/stepper/testing/stepper-button-harnesses.d.ts +41 -0
  652. package/stepper/testing/stepper-harness.d.ts +35 -0
  653. package/table/cell.d.ts +9 -5
  654. package/table/index.metadata.json +1 -1
  655. package/table/table.d.ts +2 -0
  656. package/tabs/index.metadata.json +1 -1
  657. package/tabs/tab.d.ts +8 -1
  658. package/toolbar/index.metadata.json +1 -1
  659. package/tooltip/index.metadata.json +1 -1
  660. package/tooltip/tooltip.d.ts +6 -2
  661. package/tree/index.metadata.json +1 -1
  662. package/tree/padding.d.ts +4 -2
  663. package/tree/toggle.d.ts +2 -1
@@ -173,8 +173,8 @@ class MatCalendarBody {
173
173
  }
174
174
  }
175
175
  /** Returns whether a cell should be marked as selected. */
176
- _isSelected(cell) {
177
- return this.startValue === cell.compareValue || this.endValue === cell.compareValue;
176
+ _isSelected(value) {
177
+ return this.startValue === value || this.endValue === value;
178
178
  }
179
179
  ngOnChanges(changes) {
180
180
  const columnChanges = changes['numCols'];
@@ -208,7 +208,7 @@ class MatCalendarBody {
208
208
  /** Focuses the active cell after the microtask queue is empty. */
209
209
  _focusActiveCell(movePreview = true) {
210
210
  this._ngZone.runOutsideAngular(() => {
211
- this._ngZone.onStable.asObservable().pipe(take(1)).subscribe(() => {
211
+ this._ngZone.onStable.pipe(take(1)).subscribe(() => {
212
212
  const activeCell = this._elementRef.nativeElement.querySelector('.mat-calendar-body-active');
213
213
  if (activeCell) {
214
214
  if (!movePreview) {
@@ -267,6 +267,21 @@ class MatCalendarBody {
267
267
  _isInComparisonRange(value) {
268
268
  return isInRange(value, this.comparisonStart, this.comparisonEnd, this.isRange);
269
269
  }
270
+ /**
271
+ * Gets whether a value is the same as the start and end of the comparison range.
272
+ * For context, the functions that we use to determine whether something is the start/end of
273
+ * a range don't allow for the start and end to be on the same day, because we'd have to use
274
+ * much more specific CSS selectors to style them correctly in all scenarios. This is fine for
275
+ * the regular range, because when it happens, the selected styles take over and still show where
276
+ * the range would've been, however we don't have these selected styles for a comparison range.
277
+ * This function is used to apply a class that serves the same purpose as the one for selected
278
+ * dates, but it only applies in the context of a comparison range.
279
+ */
280
+ _isComparisonIdentical(value) {
281
+ // Note that we don't need to null check the start/end
282
+ // here, because the `value` will always be defined.
283
+ return this.comparisonStart === this.comparisonEnd && value === this.comparisonStart;
284
+ }
270
285
  /** Gets whether a value is the start of the preview range. */
271
286
  _isPreviewStart(value) {
272
287
  return isStart(value, this.previewStart, this.previewEnd);
@@ -301,7 +316,7 @@ class MatCalendarBody {
301
316
  MatCalendarBody.decorators = [
302
317
  { type: Component, args: [{
303
318
  selector: '[mat-calendar-body]',
304
- 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<tr *ngIf=\"_firstRowOffset < labelMinRequiredCells\" aria-hidden=\"true\">\n <td class=\"mat-calendar-body-label\"\n [attr.colspan]=\"numCols\"\n [style.paddingTop]=\"_cellPadding\"\n [style.paddingBottom]=\"_cellPadding\">\n {{label}}\n </td>\n</tr>\n\n<!-- Create the first row separately so we can include a special spacer cell. -->\n<tr *ngFor=\"let row of rows; let rowIndex = index\" 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 The aspect ratio of the table cells is maintained by setting the top and bottom padding as a\n percentage of the width (a variant of the trick described here:\n https://www.w3schools.com/howto/howto_css_aspect_ratio.asp).\n -->\n <td *ngIf=\"rowIndex === 0 && _firstRowOffset\"\n aria-hidden=\"true\"\n class=\"mat-calendar-body-label\"\n [attr.colspan]=\"_firstRowOffset\"\n [style.paddingTop]=\"_cellPadding\"\n [style.paddingBottom]=\"_cellPadding\">\n {{_firstRowOffset >= labelMinRequiredCells ? label : ''}}\n </td>\n <td *ngFor=\"let item of row; let colIndex = index\"\n role=\"gridcell\"\n class=\"mat-calendar-body-cell\"\n [ngClass]=\"item.cssClasses\"\n [tabindex]=\"_isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [attr.data-mat-row]=\"rowIndex\"\n [attr.data-mat-col]=\"colIndex\"\n [class.mat-calendar-body-disabled]=\"!item.enabled\"\n [class.mat-calendar-body-active]=\"_isActiveCell(rowIndex, colIndex)\"\n [class.mat-calendar-body-range-start]=\"_isRangeStart(item.compareValue)\"\n [class.mat-calendar-body-range-end]=\"_isRangeEnd(item.compareValue)\"\n [class.mat-calendar-body-in-range]=\"_isInRange(item.compareValue)\"\n [class.mat-calendar-body-comparison-bridge-start]=\"_isComparisonBridgeStart(item.compareValue, rowIndex, colIndex)\"\n [class.mat-calendar-body-comparison-bridge-end]=\"_isComparisonBridgeEnd(item.compareValue, rowIndex, colIndex)\"\n [class.mat-calendar-body-comparison-start]=\"_isComparisonStart(item.compareValue)\"\n [class.mat-calendar-body-comparison-end]=\"_isComparisonEnd(item.compareValue)\"\n [class.mat-calendar-body-in-comparison-range]=\"_isInComparisonRange(item.compareValue)\"\n [class.mat-calendar-body-preview-start]=\"_isPreviewStart(item.compareValue)\"\n [class.mat-calendar-body-preview-end]=\"_isPreviewEnd(item.compareValue)\"\n [class.mat-calendar-body-in-preview]=\"_isInPreview(item.compareValue)\"\n [attr.aria-label]=\"item.ariaLabel\"\n [attr.aria-disabled]=\"!item.enabled || null\"\n [attr.aria-selected]=\"_isSelected(item)\"\n (click)=\"_cellClicked(item, $event)\"\n [style.width]=\"_cellWidth\"\n [style.paddingTop]=\"_cellPadding\"\n [style.paddingBottom]=\"_cellPadding\">\n <div class=\"mat-calendar-body-cell-content mat-focus-indicator\"\n [class.mat-calendar-body-selected]=\"_isSelected(item)\"\n [class.mat-calendar-body-today]=\"todayValue === item.compareValue\">\n {{item.displayValue}}\n </div>\n <div class=\"mat-calendar-body-cell-preview\"></div>\n </td>\n</tr>\n",
319
+ 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<tr *ngIf=\"_firstRowOffset < labelMinRequiredCells\" aria-hidden=\"true\">\n <td class=\"mat-calendar-body-label\"\n [attr.colspan]=\"numCols\"\n [style.paddingTop]=\"_cellPadding\"\n [style.paddingBottom]=\"_cellPadding\">\n {{label}}\n </td>\n</tr>\n\n<!-- Create the first row separately so we can include a special spacer cell. -->\n<tr *ngFor=\"let row of rows; let rowIndex = index\" 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 The aspect ratio of the table cells is maintained by setting the top and bottom padding as a\n percentage of the width (a variant of the trick described here:\n https://www.w3schools.com/howto/howto_css_aspect_ratio.asp).\n -->\n <td *ngIf=\"rowIndex === 0 && _firstRowOffset\"\n aria-hidden=\"true\"\n class=\"mat-calendar-body-label\"\n [attr.colspan]=\"_firstRowOffset\"\n [style.paddingTop]=\"_cellPadding\"\n [style.paddingBottom]=\"_cellPadding\">\n {{_firstRowOffset >= labelMinRequiredCells ? label : ''}}\n </td>\n <td *ngFor=\"let item of row; let colIndex = index\"\n role=\"gridcell\"\n class=\"mat-calendar-body-cell\"\n [ngClass]=\"item.cssClasses\"\n [tabindex]=\"_isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [attr.data-mat-row]=\"rowIndex\"\n [attr.data-mat-col]=\"colIndex\"\n [class.mat-calendar-body-disabled]=\"!item.enabled\"\n [class.mat-calendar-body-active]=\"_isActiveCell(rowIndex, colIndex)\"\n [class.mat-calendar-body-range-start]=\"_isRangeStart(item.compareValue)\"\n [class.mat-calendar-body-range-end]=\"_isRangeEnd(item.compareValue)\"\n [class.mat-calendar-body-in-range]=\"_isInRange(item.compareValue)\"\n [class.mat-calendar-body-comparison-bridge-start]=\"_isComparisonBridgeStart(item.compareValue, rowIndex, colIndex)\"\n [class.mat-calendar-body-comparison-bridge-end]=\"_isComparisonBridgeEnd(item.compareValue, rowIndex, colIndex)\"\n [class.mat-calendar-body-comparison-start]=\"_isComparisonStart(item.compareValue)\"\n [class.mat-calendar-body-comparison-end]=\"_isComparisonEnd(item.compareValue)\"\n [class.mat-calendar-body-in-comparison-range]=\"_isInComparisonRange(item.compareValue)\"\n [class.mat-calendar-body-preview-start]=\"_isPreviewStart(item.compareValue)\"\n [class.mat-calendar-body-preview-end]=\"_isPreviewEnd(item.compareValue)\"\n [class.mat-calendar-body-in-preview]=\"_isInPreview(item.compareValue)\"\n [attr.aria-label]=\"item.ariaLabel\"\n [attr.aria-disabled]=\"!item.enabled || null\"\n [attr.aria-selected]=\"_isSelected(item.compareValue)\"\n (click)=\"_cellClicked(item, $event)\"\n [style.width]=\"_cellWidth\"\n [style.paddingTop]=\"_cellPadding\"\n [style.paddingBottom]=\"_cellPadding\">\n <div class=\"mat-calendar-body-cell-content mat-focus-indicator\"\n [class.mat-calendar-body-selected]=\"_isSelected(item.compareValue)\"\n [class.mat-calendar-body-comparison-identical]=\"_isComparisonIdentical(item.compareValue)\"\n [class.mat-calendar-body-today]=\"todayValue === item.compareValue\">\n {{item.displayValue}}\n </div>\n <div class=\"mat-calendar-body-cell-preview\"></div>\n </td>\n</tr>\n",
305
320
  host: {
306
321
  'class': 'mat-calendar-body',
307
322
  'role': 'grid',
@@ -380,7 +395,7 @@ class MatDateSelectionModel {
380
395
  this._adapter = _adapter;
381
396
  this._selectionChanged = new Subject();
382
397
  /** Emits when the selection has changed. */
383
- this.selectionChanged = this._selectionChanged.asObservable();
398
+ this.selectionChanged = this._selectionChanged;
384
399
  this.selection = selection;
385
400
  }
386
401
  /**
@@ -555,6 +570,16 @@ DefaultMatCalendarRangeStrategy.decorators = [
555
570
  DefaultMatCalendarRangeStrategy.ctorParameters = () => [
556
571
  { type: DateAdapter }
557
572
  ];
573
+ /** @docs-private */
574
+ function MAT_CALENDAR_RANGE_STRATEGY_PROVIDER_FACTORY(parent, adapter) {
575
+ return parent || new DefaultMatCalendarRangeStrategy(adapter);
576
+ }
577
+ /** @docs-private */
578
+ const MAT_CALENDAR_RANGE_STRATEGY_PROVIDER = {
579
+ provide: MAT_DATE_RANGE_SELECTION_STRATEGY,
580
+ deps: [[new Optional(), new SkipSelf(), MAT_DATE_RANGE_SELECTION_STRATEGY], DateAdapter],
581
+ useFactory: MAT_CALENDAR_RANGE_STRATEGY_PROVIDER_FACTORY,
582
+ };
558
583
 
559
584
  /**
560
585
  * @license
@@ -582,11 +607,13 @@ class MatMonthView {
582
607
  this._userSelection = new EventEmitter();
583
608
  /** Emits when any date is activated. */
584
609
  this.activeDateChange = new EventEmitter();
585
- if (!this._dateAdapter) {
586
- throw createMissingDateImplError('DateAdapter');
587
- }
588
- if (!this._dateFormats) {
589
- throw createMissingDateImplError('MAT_DATE_FORMATS');
610
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
611
+ if (!this._dateAdapter) {
612
+ throw createMissingDateImplError('DateAdapter');
613
+ }
614
+ if (!this._dateFormats) {
615
+ throw createMissingDateImplError('MAT_DATE_FORMATS');
616
+ }
590
617
  }
591
618
  this._activeDate = this._dateAdapter.today();
592
619
  }
@@ -596,7 +623,7 @@ class MatMonthView {
596
623
  get activeDate() { return this._activeDate; }
597
624
  set activeDate(value) {
598
625
  const oldActiveDate = this._activeDate;
599
- const validDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value)) || this._dateAdapter.today();
626
+ const validDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value)) || this._dateAdapter.today();
600
627
  this._activeDate = this._dateAdapter.clampDate(validDate, this.minDate, this.maxDate);
601
628
  if (!this._hasSameMonthAndYear(oldActiveDate, this._activeDate)) {
602
629
  this._init();
@@ -609,25 +636,31 @@ class MatMonthView {
609
636
  this._selected = value;
610
637
  }
611
638
  else {
612
- this._selected = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
639
+ this._selected = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
613
640
  }
614
641
  this._setRanges(this._selected);
615
642
  }
616
643
  /** The minimum selectable date. */
617
644
  get minDate() { return this._minDate; }
618
645
  set minDate(value) {
619
- this._minDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
646
+ this._minDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
620
647
  }
621
648
  /** The maximum selectable date. */
622
649
  get maxDate() { return this._maxDate; }
623
650
  set maxDate(value) {
624
- this._maxDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
651
+ this._maxDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
625
652
  }
626
653
  ngAfterContentInit() {
627
654
  this._rerenderSubscription = this._dateAdapter.localeChanges
628
655
  .pipe(startWith(null))
629
656
  .subscribe(() => this._init());
630
657
  }
658
+ ngOnChanges(changes) {
659
+ const comparisonChange = changes['comparisonStart'] || changes['comparisonEnd'];
660
+ if (comparisonChange && !comparisonChange.firstChange) {
661
+ this._setRanges(this.selected);
662
+ }
663
+ }
631
664
  ngOnDestroy() {
632
665
  this._rerenderSubscription.unsubscribe();
633
666
  }
@@ -776,7 +809,7 @@ class MatMonthView {
776
809
  const date = this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), this._dateAdapter.getMonth(this.activeDate), i + 1);
777
810
  const enabled = this._shouldEnableDate(date);
778
811
  const ariaLabel = this._dateAdapter.format(date, this._dateFormats.display.dateA11yLabel);
779
- const cellClasses = this.dateClass ? this.dateClass(date) : undefined;
812
+ const cellClasses = this.dateClass ? this.dateClass(date, 'month') : undefined;
780
813
  this._weeks[this._weeks.length - 1].push(new MatCalendarCell(i + 1, dateNames[i], ariaLabel, enabled, cellClasses, this._getCellCompareValue(date), date));
781
814
  }
782
815
  }
@@ -812,13 +845,6 @@ class MatMonthView {
812
845
  }
813
846
  return null;
814
847
  }
815
- /**
816
- * @param obj The object to check.
817
- * @returns The given object if it is both a date instance and valid, otherwise null.
818
- */
819
- _getValidDateOrNull(obj) {
820
- return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;
821
- }
822
848
  /** Determines whether the user has the RTL layout direction. */
823
849
  _isRtl() {
824
850
  return this._dir && this._dir.value === 'rtl';
@@ -894,7 +920,7 @@ class MatMultiYearView {
894
920
  this.yearSelected = new EventEmitter();
895
921
  /** Emits when any date is activated. */
896
922
  this.activeDateChange = new EventEmitter();
897
- if (!this._dateAdapter) {
923
+ if (!this._dateAdapter && (typeof ngDevMode === 'undefined' || ngDevMode)) {
898
924
  throw createMissingDateImplError('DateAdapter');
899
925
  }
900
926
  this._activeDate = this._dateAdapter.today();
@@ -903,7 +929,7 @@ class MatMultiYearView {
903
929
  get activeDate() { return this._activeDate; }
904
930
  set activeDate(value) {
905
931
  let oldActiveDate = this._activeDate;
906
- const validDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value)) || this._dateAdapter.today();
932
+ const validDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value)) || this._dateAdapter.today();
907
933
  this._activeDate = this._dateAdapter.clampDate(validDate, this.minDate, this.maxDate);
908
934
  if (!isSameMultiYearView(this._dateAdapter, oldActiveDate, this._activeDate, this.minDate, this.maxDate)) {
909
935
  this._init();
@@ -916,19 +942,19 @@ class MatMultiYearView {
916
942
  this._selected = value;
917
943
  }
918
944
  else {
919
- this._selected = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
945
+ this._selected = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
920
946
  }
921
947
  this._setSelectedYear(value);
922
948
  }
923
949
  /** The minimum selectable date. */
924
950
  get minDate() { return this._minDate; }
925
951
  set minDate(value) {
926
- this._minDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
952
+ this._minDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
927
953
  }
928
954
  /** The maximum selectable date. */
929
955
  get maxDate() { return this._maxDate; }
930
956
  set maxDate(value) {
931
- this._maxDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
957
+ this._maxDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
932
958
  }
933
959
  ngAfterContentInit() {
934
960
  this._rerenderSubscription = this._dateAdapter.localeChanges
@@ -1021,8 +1047,10 @@ class MatMultiYearView {
1021
1047
  }
1022
1048
  /** Creates an MatCalendarCell for the given year. */
1023
1049
  _createCellForYear(year) {
1024
- let yearName = this._dateAdapter.getYearName(this._dateAdapter.createDate(year, 0, 1));
1025
- return new MatCalendarCell(year, yearName, yearName, this._shouldEnableYear(year));
1050
+ const date = this._dateAdapter.createDate(year, 0, 1);
1051
+ const yearName = this._dateAdapter.getYearName(date);
1052
+ const cellClasses = this.dateClass ? this.dateClass(date, 'multi-year') : undefined;
1053
+ return new MatCalendarCell(year, yearName, yearName, this._shouldEnableYear(year), cellClasses);
1026
1054
  }
1027
1055
  /** Whether the given year is enabled. */
1028
1056
  _shouldEnableYear(year) {
@@ -1045,13 +1073,6 @@ class MatMultiYearView {
1045
1073
  }
1046
1074
  return false;
1047
1075
  }
1048
- /**
1049
- * @param obj The object to check.
1050
- * @returns The given object if it is both a date instance and valid, otherwise null.
1051
- */
1052
- _getValidDateOrNull(obj) {
1053
- return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;
1054
- }
1055
1076
  /** Determines whether the user has the RTL layout direction. */
1056
1077
  _isRtl() {
1057
1078
  return this._dir && this._dir.value === 'rtl';
@@ -1090,6 +1111,7 @@ MatMultiYearView.propDecorators = {
1090
1111
  minDate: [{ type: Input }],
1091
1112
  maxDate: [{ type: Input }],
1092
1113
  dateFilter: [{ type: Input }],
1114
+ dateClass: [{ type: Input }],
1093
1115
  selectedChange: [{ type: Output }],
1094
1116
  yearSelected: [{ type: Output }],
1095
1117
  activeDateChange: [{ type: Output }],
@@ -1155,11 +1177,13 @@ class MatYearView {
1155
1177
  this.monthSelected = new EventEmitter();
1156
1178
  /** Emits when any date is activated. */
1157
1179
  this.activeDateChange = new EventEmitter();
1158
- if (!this._dateAdapter) {
1159
- throw createMissingDateImplError('DateAdapter');
1160
- }
1161
- if (!this._dateFormats) {
1162
- throw createMissingDateImplError('MAT_DATE_FORMATS');
1180
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
1181
+ if (!this._dateAdapter) {
1182
+ throw createMissingDateImplError('DateAdapter');
1183
+ }
1184
+ if (!this._dateFormats) {
1185
+ throw createMissingDateImplError('MAT_DATE_FORMATS');
1186
+ }
1163
1187
  }
1164
1188
  this._activeDate = this._dateAdapter.today();
1165
1189
  }
@@ -1167,7 +1191,7 @@ class MatYearView {
1167
1191
  get activeDate() { return this._activeDate; }
1168
1192
  set activeDate(value) {
1169
1193
  let oldActiveDate = this._activeDate;
1170
- const validDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value)) || this._dateAdapter.today();
1194
+ const validDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value)) || this._dateAdapter.today();
1171
1195
  this._activeDate = this._dateAdapter.clampDate(validDate, this.minDate, this.maxDate);
1172
1196
  if (this._dateAdapter.getYear(oldActiveDate) !== this._dateAdapter.getYear(this._activeDate)) {
1173
1197
  this._init();
@@ -1180,19 +1204,19 @@ class MatYearView {
1180
1204
  this._selected = value;
1181
1205
  }
1182
1206
  else {
1183
- this._selected = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
1207
+ this._selected = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
1184
1208
  }
1185
1209
  this._setSelectedMonth(value);
1186
1210
  }
1187
1211
  /** The minimum selectable date. */
1188
1212
  get minDate() { return this._minDate; }
1189
1213
  set minDate(value) {
1190
- this._minDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
1214
+ this._minDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
1191
1215
  }
1192
1216
  /** The maximum selectable date. */
1193
1217
  get maxDate() { return this._maxDate; }
1194
1218
  set maxDate(value) {
1195
- this._maxDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
1219
+ this._maxDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
1196
1220
  }
1197
1221
  ngAfterContentInit() {
1198
1222
  this._rerenderSubscription = this._dateAdapter.localeChanges
@@ -1283,8 +1307,10 @@ class MatYearView {
1283
1307
  }
1284
1308
  /** Creates an MatCalendarCell for the given month. */
1285
1309
  _createCellForMonth(month, monthName) {
1286
- let ariaLabel = this._dateAdapter.format(this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), month, 1), this._dateFormats.display.monthYearA11yLabel);
1287
- return new MatCalendarCell(month, monthName.toLocaleUpperCase(), ariaLabel, this._shouldEnableMonth(month));
1310
+ const date = this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), month, 1);
1311
+ const ariaLabel = this._dateAdapter.format(date, this._dateFormats.display.monthYearA11yLabel);
1312
+ const cellClasses = this.dateClass ? this.dateClass(date, 'year') : undefined;
1313
+ return new MatCalendarCell(month, monthName.toLocaleUpperCase(), ariaLabel, this._shouldEnableMonth(month), cellClasses);
1288
1314
  }
1289
1315
  /** Whether the given month is enabled. */
1290
1316
  _shouldEnableMonth(month) {
@@ -1330,13 +1356,6 @@ class MatYearView {
1330
1356
  }
1331
1357
  return false;
1332
1358
  }
1333
- /**
1334
- * @param obj The object to check.
1335
- * @returns The given object if it is both a date instance and valid, otherwise null.
1336
- */
1337
- _getValidDateOrNull(obj) {
1338
- return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;
1339
- }
1340
1359
  /** Determines whether the user has the RTL layout direction. */
1341
1360
  _isRtl() {
1342
1361
  return this._dir && this._dir.value === 'rtl';
@@ -1373,6 +1392,7 @@ MatYearView.propDecorators = {
1373
1392
  minDate: [{ type: Input }],
1374
1393
  maxDate: [{ type: Input }],
1375
1394
  dateFilter: [{ type: Input }],
1395
+ dateClass: [{ type: Input }],
1376
1396
  selectedChange: [{ type: Output }],
1377
1397
  monthSelected: [{ type: Output }],
1378
1398
  activeDateChange: [{ type: Output }],
@@ -1531,11 +1551,13 @@ class MatCalendar {
1531
1551
  * Emits whenever there is a state change that the header may need to respond to.
1532
1552
  */
1533
1553
  this.stateChanges = new Subject();
1534
- if (!this._dateAdapter) {
1535
- throw createMissingDateImplError('DateAdapter');
1536
- }
1537
- if (!this._dateFormats) {
1538
- throw createMissingDateImplError('MAT_DATE_FORMATS');
1554
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
1555
+ if (!this._dateAdapter) {
1556
+ throw createMissingDateImplError('DateAdapter');
1557
+ }
1558
+ if (!this._dateFormats) {
1559
+ throw createMissingDateImplError('MAT_DATE_FORMATS');
1560
+ }
1539
1561
  }
1540
1562
  this._intlChanges = _intl.changes.subscribe(() => {
1541
1563
  _changeDetectorRef.markForCheck();
@@ -1545,7 +1567,7 @@ class MatCalendar {
1545
1567
  /** A date representing the period (month or year) to start the calendar in. */
1546
1568
  get startAt() { return this._startAt; }
1547
1569
  set startAt(value) {
1548
- this._startAt = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
1570
+ this._startAt = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
1549
1571
  }
1550
1572
  /** The currently selected date. */
1551
1573
  get selected() { return this._selected; }
@@ -1554,18 +1576,18 @@ class MatCalendar {
1554
1576
  this._selected = value;
1555
1577
  }
1556
1578
  else {
1557
- this._selected = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
1579
+ this._selected = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
1558
1580
  }
1559
1581
  }
1560
1582
  /** The minimum selectable date. */
1561
1583
  get minDate() { return this._minDate; }
1562
1584
  set minDate(value) {
1563
- this._minDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
1585
+ this._minDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
1564
1586
  }
1565
1587
  /** The maximum selectable date. */
1566
1588
  get maxDate() { return this._maxDate; }
1567
1589
  set maxDate(value) {
1568
- this._maxDate = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
1590
+ this._maxDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
1569
1591
  }
1570
1592
  /**
1571
1593
  * The current active date. This determines which time period is shown and which date is
@@ -1655,13 +1677,6 @@ class MatCalendar {
1655
1677
  this.activeDate = date;
1656
1678
  this.currentView = view;
1657
1679
  }
1658
- /**
1659
- * @param obj The object to check.
1660
- * @returns The given object if it is both a date instance and valid, otherwise null.
1661
- */
1662
- _getValidDateOrNull(obj) {
1663
- return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;
1664
- }
1665
1680
  /** Returns the component instance that corresponds to the current calendar view. */
1666
1681
  _getCurrentViewComponent() {
1667
1682
  return this.monthView || this.yearView || this.multiYearView;
@@ -1670,7 +1685,7 @@ class MatCalendar {
1670
1685
  MatCalendar.decorators = [
1671
1686
  { type: Component, args: [{
1672
1687
  selector: 'mat-calendar',
1673
- template: "<ng-template [cdkPortalOutlet]=\"_calendarHeaderPortal\"></ng-template>\n\n<div class=\"mat-calendar-content\" [ngSwitch]=\"currentView\" cdkMonitorSubtreeFocus tabindex=\"-1\">\n <mat-month-view\n *ngSwitchCase=\"'month'\"\n [(activeDate)]=\"activeDate\"\n [selected]=\"selected\"\n [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [dateClass]=\"dateClass\"\n [comparisonStart]=\"comparisonStart\"\n [comparisonEnd]=\"comparisonEnd\"\n (_userSelection)=\"_dateSelected($event)\">\n </mat-month-view>\n\n <mat-year-view\n *ngSwitchCase=\"'year'\"\n [(activeDate)]=\"activeDate\"\n [selected]=\"selected\"\n [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n (monthSelected)=\"_monthSelectedInYearView($event)\"\n (selectedChange)=\"_goToDateInView($event, 'month')\">\n </mat-year-view>\n\n <mat-multi-year-view\n *ngSwitchCase=\"'multi-year'\"\n [(activeDate)]=\"activeDate\"\n [selected]=\"selected\"\n [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n (yearSelected)=\"_yearSelectedInMultiYearView($event)\"\n (selectedChange)=\"_goToDateInView($event, 'year')\">\n </mat-multi-year-view>\n</div>\n",
1688
+ template: "<ng-template [cdkPortalOutlet]=\"_calendarHeaderPortal\"></ng-template>\n\n<div class=\"mat-calendar-content\" [ngSwitch]=\"currentView\" cdkMonitorSubtreeFocus tabindex=\"-1\">\n <mat-month-view\n *ngSwitchCase=\"'month'\"\n [(activeDate)]=\"activeDate\"\n [selected]=\"selected\"\n [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [dateClass]=\"dateClass\"\n [comparisonStart]=\"comparisonStart\"\n [comparisonEnd]=\"comparisonEnd\"\n (_userSelection)=\"_dateSelected($event)\">\n </mat-month-view>\n\n <mat-year-view\n *ngSwitchCase=\"'year'\"\n [(activeDate)]=\"activeDate\"\n [selected]=\"selected\"\n [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [dateClass]=\"dateClass\"\n (monthSelected)=\"_monthSelectedInYearView($event)\"\n (selectedChange)=\"_goToDateInView($event, 'month')\">\n </mat-year-view>\n\n <mat-multi-year-view\n *ngSwitchCase=\"'multi-year'\"\n [(activeDate)]=\"activeDate\"\n [selected]=\"selected\"\n [dateFilter]=\"dateFilter\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n [dateClass]=\"dateClass\"\n (yearSelected)=\"_yearSelectedInMultiYearView($event)\"\n (selectedChange)=\"_goToDateInView($event, 'year')\">\n </mat-multi-year-view>\n</div>\n",
1674
1689
  host: {
1675
1690
  'class': 'mat-calendar',
1676
1691
  },
@@ -1849,7 +1864,7 @@ class MatDatepickerContent extends _MatDatepickerContentMixinBase {
1849
1864
  MatDatepickerContent.decorators = [
1850
1865
  { type: Component, args: [{
1851
1866
  selector: 'mat-datepicker-content',
1852
- template: "<mat-calendar cdkTrapFocus\n [id]=\"datepicker.id\"\n [ngClass]=\"datepicker.panelClass\"\n [startAt]=\"datepicker.startAt\"\n [startView]=\"datepicker.startView\"\n [minDate]=\"datepicker._minDate\"\n [maxDate]=\"datepicker._maxDate\"\n [dateFilter]=\"datepicker._dateFilter\"\n [headerComponent]=\"datepicker.calendarHeaderComponent\"\n [selected]=\"_getSelected()\"\n [dateClass]=\"datepicker.dateClass\"\n [comparisonStart]=\"comparisonStart\"\n [comparisonEnd]=\"comparisonEnd\"\n [@fadeInCalendar]=\"'enter'\"\n (yearSelected)=\"datepicker._selectYear($event)\"\n (monthSelected)=\"datepicker._selectMonth($event)\"\n (_userSelection)=\"_handleUserSelection($event)\">\n</mat-calendar>\n",
1867
+ template: "<mat-calendar cdkTrapFocus\n [id]=\"datepicker.id\"\n [ngClass]=\"datepicker.panelClass\"\n [startAt]=\"datepicker.startAt\"\n [startView]=\"datepicker.startView\"\n [minDate]=\"datepicker._getMinDate()\"\n [maxDate]=\"datepicker._getMaxDate()\"\n [dateFilter]=\"datepicker._getDateFilter()\"\n [headerComponent]=\"datepicker.calendarHeaderComponent\"\n [selected]=\"_getSelected()\"\n [dateClass]=\"datepicker.dateClass\"\n [comparisonStart]=\"comparisonStart\"\n [comparisonEnd]=\"comparisonEnd\"\n [@fadeInCalendar]=\"'enter'\"\n (yearSelected)=\"datepicker._selectYear($event)\"\n (monthSelected)=\"datepicker._selectMonth($event)\"\n (_userSelection)=\"_handleUserSelection($event)\">\n</mat-calendar>\n",
1853
1868
  host: {
1854
1869
  'class': 'mat-datepicker-content',
1855
1870
  '[@transformPanel]': '_animationState',
@@ -1915,9 +1930,11 @@ class MatDatepickerBase {
1915
1930
  this.id = `mat-datepicker-${datepickerUid++}`;
1916
1931
  /** The element that was focused before the datepicker was opened. */
1917
1932
  this._focusedElementBeforeOpen = null;
1933
+ /** Unique class that will be added to the backdrop so that the test harnesses can look it up. */
1934
+ this._backdropHarnessClass = `${this.id}-backdrop`;
1918
1935
  /** Emits when the datepicker's state changes. */
1919
1936
  this._stateChanges = new Subject();
1920
- if (!this._dateAdapter) {
1937
+ if (!this._dateAdapter && (typeof ngDevMode === 'undefined' || ngDevMode)) {
1921
1938
  throw createMissingDateImplError('DateAdapter');
1922
1939
  }
1923
1940
  this._scrollStrategy = scrollStrategy;
@@ -1929,7 +1946,7 @@ class MatDatepickerBase {
1929
1946
  return this._startAt || (this._datepickerInput ? this._datepickerInput.getStartValue() : null);
1930
1947
  }
1931
1948
  set startAt(value) {
1932
- this._startAt = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
1949
+ this._startAt = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
1933
1950
  }
1934
1951
  /** Color palette to use on the datepicker's calendar. */
1935
1952
  get color() {
@@ -1961,16 +1978,18 @@ class MatDatepickerBase {
1961
1978
  }
1962
1979
  /** Whether the calendar is open. */
1963
1980
  get opened() { return this._opened; }
1964
- set opened(value) { value ? this.open() : this.close(); }
1981
+ set opened(value) {
1982
+ coerceBooleanProperty(value) ? this.open() : this.close();
1983
+ }
1965
1984
  /** The minimum selectable date. */
1966
- get _minDate() {
1985
+ _getMinDate() {
1967
1986
  return this._datepickerInput && this._datepickerInput.min;
1968
1987
  }
1969
1988
  /** The maximum selectable date. */
1970
- get _maxDate() {
1989
+ _getMaxDate() {
1971
1990
  return this._datepickerInput && this._datepickerInput.max;
1972
1991
  }
1973
- get _dateFilter() {
1992
+ _getDateFilter() {
1974
1993
  return this._datepickerInput && this._datepickerInput.dateFilter;
1975
1994
  }
1976
1995
  ngOnChanges(changes) {
@@ -2007,7 +2026,7 @@ class MatDatepickerBase {
2007
2026
  * @returns Selection model that the input should hook itself up to.
2008
2027
  */
2009
2028
  _registerInput(input) {
2010
- if (this._datepickerInput) {
2029
+ if (this._datepickerInput && (typeof ngDevMode === 'undefined' || ngDevMode)) {
2011
2030
  throw Error('A MatDatepicker can only be associated with a single input.');
2012
2031
  }
2013
2032
  this._inputStateChanges.unsubscribe();
@@ -2021,7 +2040,7 @@ class MatDatepickerBase {
2021
2040
  if (this._opened || this.disabled) {
2022
2041
  return;
2023
2042
  }
2024
- if (!this._datepickerInput) {
2043
+ if (!this._datepickerInput && (typeof ngDevMode === 'undefined' || ngDevMode)) {
2025
2044
  throw Error('Attempted to open an MatDatepicker with no associated input.');
2026
2045
  }
2027
2046
  if (this._document) {
@@ -2085,6 +2104,7 @@ class MatDatepickerBase {
2085
2104
  // datepicker dialog behaves consistently even if the user changed the defaults.
2086
2105
  hasBackdrop: true,
2087
2106
  disableClose: false,
2107
+ backdropClass: ['cdk-overlay-dark-backdrop', this._backdropHarnessClass],
2088
2108
  width: '',
2089
2109
  height: '',
2090
2110
  minWidth: '',
@@ -2112,7 +2132,7 @@ class MatDatepickerBase {
2112
2132
  this._popupComponentRef = this._popupRef.attach(portal);
2113
2133
  this._forwardContentValues(this._popupComponentRef.instance);
2114
2134
  // Update the position once the calendar has rendered.
2115
- this._ngZone.onStable.asObservable().pipe(take(1)).subscribe(() => {
2135
+ this._ngZone.onStable.pipe(take(1)).subscribe(() => {
2116
2136
  this._popupRef.updatePosition();
2117
2137
  });
2118
2138
  }
@@ -2132,7 +2152,7 @@ class MatDatepickerBase {
2132
2152
  const overlayConfig = new OverlayConfig({
2133
2153
  positionStrategy: this._setConnectedPositions(positionStrategy),
2134
2154
  hasBackdrop: true,
2135
- backdropClass: 'mat-overlay-transparent-backdrop',
2155
+ backdropClass: ['mat-overlay-transparent-backdrop', this._backdropHarnessClass],
2136
2156
  direction: this._dir,
2137
2157
  scrollStrategy: this._scrollStrategy(),
2138
2158
  panelClass: 'mat-datepicker-popup',
@@ -2190,13 +2210,6 @@ class MatDatepickerBase {
2190
2210
  }
2191
2211
  ]);
2192
2212
  }
2193
- /**
2194
- * @param obj The object to check.
2195
- * @returns The given object if it is both a date instance and valid, otherwise null.
2196
- */
2197
- _getValidDateOrNull(obj) {
2198
- return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;
2199
- }
2200
2213
  }
2201
2214
  MatDatepickerBase.decorators = [
2202
2215
  { type: Directive }
@@ -2303,14 +2316,14 @@ class MatDatepickerInputBase {
2303
2316
  };
2304
2317
  /** The form control validator for the date filter. */
2305
2318
  this._filterValidator = (control) => {
2306
- const controlValue = this._getValidDateOrNull(this._dateAdapter.deserialize(control.value));
2319
+ const controlValue = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(control.value));
2307
2320
  const dateFilter = this._getDateFilter();
2308
2321
  return !dateFilter || !controlValue || dateFilter(controlValue) ?
2309
2322
  null : { 'matDatepickerFilter': true };
2310
2323
  };
2311
2324
  /** The form control validator for the min date. */
2312
2325
  this._minValidator = (control) => {
2313
- const controlValue = this._getValidDateOrNull(this._dateAdapter.deserialize(control.value));
2326
+ const controlValue = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(control.value));
2314
2327
  const min = this._getMinDate();
2315
2328
  return (!min || !controlValue ||
2316
2329
  this._dateAdapter.compareDate(min, controlValue) <= 0) ?
@@ -2318,7 +2331,7 @@ class MatDatepickerInputBase {
2318
2331
  };
2319
2332
  /** The form control validator for the max date. */
2320
2333
  this._maxValidator = (control) => {
2321
- const controlValue = this._getValidDateOrNull(this._dateAdapter.deserialize(control.value));
2334
+ const controlValue = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(control.value));
2322
2335
  const max = this._getMaxDate();
2323
2336
  return (!max || !controlValue ||
2324
2337
  this._dateAdapter.compareDate(max, controlValue) >= 0) ?
@@ -2326,11 +2339,13 @@ class MatDatepickerInputBase {
2326
2339
  };
2327
2340
  /** Whether the last value set on the input was valid. */
2328
2341
  this._lastValueValid = false;
2329
- if (!this._dateAdapter) {
2330
- throw createMissingDateImplError('DateAdapter');
2331
- }
2332
- if (!this._dateFormats) {
2333
- throw createMissingDateImplError('MAT_DATE_FORMATS');
2342
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
2343
+ if (!this._dateAdapter) {
2344
+ throw createMissingDateImplError('DateAdapter');
2345
+ }
2346
+ if (!this._dateFormats) {
2347
+ throw createMissingDateImplError('MAT_DATE_FORMATS');
2348
+ }
2334
2349
  }
2335
2350
  // Update the displayed date when the locale changes.
2336
2351
  this._localeSubscription = _dateAdapter.localeChanges.subscribe(() => {
@@ -2344,7 +2359,7 @@ class MatDatepickerInputBase {
2344
2359
  set value(value) {
2345
2360
  value = this._dateAdapter.deserialize(value);
2346
2361
  this._lastValueValid = this._isValidValue(value);
2347
- value = this._getValidDateOrNull(value);
2362
+ value = this._dateAdapter.getValidDateOrNull(value);
2348
2363
  const oldDate = this.value;
2349
2364
  this._assignValue(value);
2350
2365
  this._formatValue(value);
@@ -2450,7 +2465,7 @@ class MatDatepickerInputBase {
2450
2465
  const lastValueWasValid = this._lastValueValid;
2451
2466
  let date = this._dateAdapter.parse(value, this._dateFormats.parse.dateInput);
2452
2467
  this._lastValueValid = this._isValidValue(date);
2453
- date = this._getValidDateOrNull(date);
2468
+ date = this._dateAdapter.getValidDateOrNull(date);
2454
2469
  if (!this._dateAdapter.sameDate(date, this.value)) {
2455
2470
  this._assignValue(date);
2456
2471
  this._cvaOnChange(date);
@@ -2484,13 +2499,6 @@ class MatDatepickerInputBase {
2484
2499
  this._elementRef.nativeElement.value =
2485
2500
  value ? this._dateAdapter.format(value, this._dateFormats.display.dateInput) : '';
2486
2501
  }
2487
- /**
2488
- * @param obj The object to check.
2489
- * @returns The given object if it is both a date instance and valid, otherwise null.
2490
- */
2491
- _getValidDateOrNull(obj) {
2492
- return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;
2493
- }
2494
2502
  /** Assigns a value to the model. */
2495
2503
  _assignValue(value) {
2496
2504
  // We may get some incoming values before the model was
@@ -2566,13 +2574,13 @@ class MatDatepickerInput extends MatDatepickerInputBase {
2566
2574
  /** The minimum valid date. */
2567
2575
  get min() { return this._min; }
2568
2576
  set min(value) {
2569
- this._min = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
2577
+ this._min = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
2570
2578
  this._validatorOnChange();
2571
2579
  }
2572
2580
  /** The maximum valid date. */
2573
2581
  get max() { return this._max; }
2574
2582
  set max(value) {
2575
- this._max = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
2583
+ this._max = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
2576
2584
  this._validatorOnChange();
2577
2585
  }
2578
2586
  /** Function that can be used to filter out dates within the datepicker. */
@@ -2642,10 +2650,14 @@ MatDatepickerInput.decorators = [
2642
2650
  { provide: MAT_INPUT_VALUE_ACCESSOR, useExisting: MatDatepickerInput },
2643
2651
  ],
2644
2652
  host: {
2653
+ 'class': 'mat-datepicker-input',
2645
2654
  '[attr.aria-haspopup]': '_datepicker ? "dialog" : null',
2646
2655
  '[attr.aria-owns]': '(_datepicker?.opened && _datepicker.id) || null',
2647
2656
  '[attr.min]': 'min ? _dateAdapter.toIso8601(min) : null',
2648
2657
  '[attr.max]': 'max ? _dateAdapter.toIso8601(max) : null',
2658
+ // Used by the test harness to tie this input to its calendar. We can't depend on
2659
+ // `aria-owns` for this, because it's only defined while the calendar is open.
2660
+ '[attr.data-mat-calendar]': '_datepicker ? _datepicker.id : null',
2649
2661
  '[disabled]': 'disabled',
2650
2662
  '(input)': '_onInput($event.target.value)',
2651
2663
  '(change)': '_onChange()',
@@ -2741,6 +2753,8 @@ MatDatepickerToggle.decorators = [
2741
2753
  '[class.mat-datepicker-toggle-active]': 'datepicker && datepicker.opened',
2742
2754
  '[class.mat-accent]': 'datepicker && datepicker.color === "accent"',
2743
2755
  '[class.mat-warn]': 'datepicker && datepicker.color === "warn"',
2756
+ // Used by the test harness to tie this toggle to its datepicker.
2757
+ '[attr.data-mat-calendar]': 'datepicker ? datepicker.id : null',
2744
2758
  '(focus)': '_button.focus()',
2745
2759
  },
2746
2760
  exportAs: 'matDatepickerToggle',
@@ -2874,7 +2888,7 @@ class MatStartDate extends _MatDateRangeInputBase {
2874
2888
  super(rangeInput, elementRef, defaultErrorStateMatcher, injector, parentForm, parentFormGroup, dateAdapter, dateFormats);
2875
2889
  /** Validator that checks that the start date isn't after the end date. */
2876
2890
  this._startValidator = (control) => {
2877
- const start = this._getValidDateOrNull(this._dateAdapter.deserialize(control.value));
2891
+ const start = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(control.value));
2878
2892
  const end = this._model ? this._model.selection.end : null;
2879
2893
  return (!start || !end ||
2880
2894
  this._dateAdapter.compareDate(start, end) <= 0) ?
@@ -2911,7 +2925,7 @@ MatStartDate.decorators = [
2911
2925
  { type: Directive, args: [{
2912
2926
  selector: 'input[matStartDate]',
2913
2927
  host: {
2914
- 'class': 'mat-date-range-input-inner',
2928
+ 'class': 'mat-start-date mat-date-range-input-inner',
2915
2929
  '[disabled]': 'disabled',
2916
2930
  '(input)': '_onInput($event.target.value)',
2917
2931
  '(change)': '_onChange()',
@@ -2949,7 +2963,7 @@ class MatEndDate extends _MatDateRangeInputBase {
2949
2963
  super(rangeInput, elementRef, defaultErrorStateMatcher, injector, parentForm, parentFormGroup, dateAdapter, dateFormats);
2950
2964
  /** Validator that checks that the end date isn't before the start date. */
2951
2965
  this._endValidator = (control) => {
2952
- const end = this._getValidDateOrNull(this._dateAdapter.deserialize(control.value));
2966
+ const end = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(control.value));
2953
2967
  const start = this._model ? this._model.selection.start : null;
2954
2968
  return (!end || !start ||
2955
2969
  this._dateAdapter.compareDate(end, start) >= 0) ?
@@ -2982,7 +2996,7 @@ MatEndDate.decorators = [
2982
2996
  { type: Directive, args: [{
2983
2997
  selector: 'input[matEndDate]',
2984
2998
  host: {
2985
- 'class': 'mat-date-range-input-inner',
2999
+ 'class': 'mat-end-date mat-date-range-input-inner',
2986
3000
  '[disabled]': 'disabled',
2987
3001
  '(input)': '_onInput($event.target.value)',
2988
3002
  '(change)': '_onChange()',
@@ -3039,7 +3053,10 @@ MatDateRangePicker.decorators = [
3039
3053
  exportAs: 'matDateRangePicker',
3040
3054
  changeDetection: ChangeDetectionStrategy.OnPush,
3041
3055
  encapsulation: ViewEncapsulation.None,
3042
- providers: [MAT_RANGE_DATE_SELECTION_MODEL_PROVIDER]
3056
+ providers: [
3057
+ MAT_RANGE_DATE_SELECTION_MODEL_PROVIDER,
3058
+ MAT_CALENDAR_RANGE_STRATEGY_PROVIDER,
3059
+ ]
3043
3060
  },] }
3044
3061
  ];
3045
3062
 
@@ -3076,7 +3093,7 @@ class MatDateRangeInput {
3076
3093
  this.comparisonEnd = null;
3077
3094
  /** Emits when the input's state changes. */
3078
3095
  this._stateChanges = new Subject();
3079
- if (!_dateAdapter) {
3096
+ if (!_dateAdapter && (typeof ngDevMode === 'undefined' || ngDevMode)) {
3080
3097
  throw createMissingDateImplError('DateAdapter');
3081
3098
  }
3082
3099
  // TODO(crisbeto): remove `as any` after #18206 lands.
@@ -3124,13 +3141,13 @@ class MatDateRangeInput {
3124
3141
  /** The minimum valid date. */
3125
3142
  get min() { return this._min; }
3126
3143
  set min(value) {
3127
- this._min = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
3144
+ this._min = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
3128
3145
  this._revalidate();
3129
3146
  }
3130
3147
  /** The maximum valid date. */
3131
3148
  get max() { return this._max; }
3132
3149
  set max(value) {
3133
- this._max = this._getValidDateOrNull(this._dateAdapter.deserialize(value));
3150
+ this._max = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));
3134
3151
  this._revalidate();
3135
3152
  }
3136
3153
  /** Whether the input is disabled. */
@@ -3181,11 +3198,13 @@ class MatDateRangeInput {
3181
3198
  }
3182
3199
  }
3183
3200
  ngAfterContentInit() {
3184
- if (!this._startInput) {
3185
- throw Error('mat-date-range-input must contain a matStartDate input');
3186
- }
3187
- if (!this._endInput) {
3188
- throw Error('mat-date-range-input must contain a matEndDate input');
3201
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
3202
+ if (!this._startInput) {
3203
+ throw Error('mat-date-range-input must contain a matStartDate input');
3204
+ }
3205
+ if (!this._endInput) {
3206
+ throw Error('mat-date-range-input must contain a matEndDate input');
3207
+ }
3189
3208
  }
3190
3209
  if (this._model) {
3191
3210
  this._registerModel(this._model);
@@ -3243,13 +3262,6 @@ class MatDateRangeInput {
3243
3262
  const formField = this._formField;
3244
3263
  return formField && formField._hasFloatingLabel() ? formField._labelId : null;
3245
3264
  }
3246
- /**
3247
- * @param obj The object to check.
3248
- * @returns The given object if it is both a date instance and valid, otherwise null.
3249
- */
3250
- _getValidDateOrNull(obj) {
3251
- return (this._dateAdapter.isDateInstance(obj) && this._dateAdapter.isValid(obj)) ? obj : null;
3252
- }
3253
3265
  /** Re-runs the validators on the start/end inputs. */
3254
3266
  _revalidate() {
3255
3267
  if (this._startInput) {
@@ -3277,10 +3289,14 @@ MatDateRangeInput.decorators = [
3277
3289
  host: {
3278
3290
  'class': 'mat-date-range-input',
3279
3291
  '[class.mat-date-range-input-hide-placeholders]': '_shouldHidePlaceholders()',
3292
+ '[class.mat-date-range-input-required]': 'required',
3280
3293
  '[attr.id]': 'null',
3281
3294
  'role': 'group',
3282
3295
  '[attr.aria-labelledby]': '_getAriaLabelledby()',
3283
3296
  '[attr.aria-describedby]': '_ariaDescribedBy',
3297
+ // Used by the test harness to tie this input to its calendar. We can't depend on
3298
+ // `aria-owns` for this, because it's only defined while the calendar is open.
3299
+ '[attr.data-mat-calendar]': 'rangePicker ? rangePicker.id : null',
3284
3300
  },
3285
3301
  changeDetection: ChangeDetectionStrategy.OnPush,
3286
3302
  encapsulation: ViewEncapsulation.None,
@@ -3368,11 +3384,7 @@ MatDatepickerModule.decorators = [
3368
3384
  ],
3369
3385
  providers: [
3370
3386
  MatDatepickerIntl,
3371
- MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER,
3372
- {
3373
- provide: MAT_DATE_RANGE_SELECTION_STRATEGY,
3374
- useClass: DefaultMatCalendarRangeStrategy
3375
- }
3387
+ MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER
3376
3388
  ],
3377
3389
  entryComponents: [
3378
3390
  MatDatepickerContent,
@@ -3393,5 +3405,5 @@ MatDatepickerModule.decorators = [
3393
3405
  * Generated bundle index. Do not edit.
3394
3406
  */
3395
3407
 
3396
- export { DateRange, DefaultMatCalendarRangeStrategy, MAT_DATEPICKER_SCROLL_STRATEGY, MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY, MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER, MAT_DATEPICKER_VALIDATORS, MAT_DATEPICKER_VALUE_ACCESSOR, MAT_DATE_RANGE_SELECTION_STRATEGY, MAT_RANGE_DATE_SELECTION_MODEL_FACTORY, MAT_RANGE_DATE_SELECTION_MODEL_PROVIDER, MAT_SINGLE_DATE_SELECTION_MODEL_FACTORY, MAT_SINGLE_DATE_SELECTION_MODEL_PROVIDER, MatCalendar, MatCalendarBody, MatCalendarCell, MatCalendarHeader, MatDateRangeInput, MatDateRangePicker, MatDateSelectionModel, MatDatepicker, MatDatepickerContent, MatDatepickerInput, MatDatepickerInputEvent, MatDatepickerIntl, MatDatepickerModule, MatDatepickerToggle, MatDatepickerToggleIcon, MatEndDate, MatMonthView, MatMultiYearView, MatRangeDateSelectionModel, MatSingleDateSelectionModel, MatStartDate, MatYearView, matDatepickerAnimations, yearsPerPage, yearsPerRow, MatDatepickerBase as ɵangular_material_src_material_datepicker_datepicker_a, MatDatepickerInputBase as ɵangular_material_src_material_datepicker_datepicker_b, MAT_DATE_RANGE_INPUT_PARENT as ɵangular_material_src_material_datepicker_datepicker_c };
3408
+ export { DateRange, DefaultMatCalendarRangeStrategy, MAT_DATEPICKER_SCROLL_STRATEGY, MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY, MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER, MAT_DATEPICKER_VALIDATORS, MAT_DATEPICKER_VALUE_ACCESSOR, MAT_DATE_RANGE_SELECTION_STRATEGY, MAT_RANGE_DATE_SELECTION_MODEL_FACTORY, MAT_RANGE_DATE_SELECTION_MODEL_PROVIDER, MAT_SINGLE_DATE_SELECTION_MODEL_FACTORY, MAT_SINGLE_DATE_SELECTION_MODEL_PROVIDER, MatCalendar, MatCalendarBody, MatCalendarCell, MatCalendarHeader, MatDateRangeInput, MatDateRangePicker, MatDateSelectionModel, MatDatepicker, MatDatepickerContent, MatDatepickerInput, MatDatepickerInputEvent, MatDatepickerIntl, MatDatepickerModule, MatDatepickerToggle, MatDatepickerToggleIcon, MatEndDate, MatMonthView, MatMultiYearView, MatRangeDateSelectionModel, MatSingleDateSelectionModel, MatStartDate, MatYearView, matDatepickerAnimations, yearsPerPage, yearsPerRow, MAT_CALENDAR_RANGE_STRATEGY_PROVIDER_FACTORY as ɵangular_material_src_material_datepicker_datepicker_a, MAT_CALENDAR_RANGE_STRATEGY_PROVIDER as ɵangular_material_src_material_datepicker_datepicker_b, MatDatepickerBase as ɵangular_material_src_material_datepicker_datepicker_c, MatDatepickerInputBase as ɵangular_material_src_material_datepicker_datepicker_d, MAT_DATE_RANGE_INPUT_PARENT as ɵangular_material_src_material_datepicker_datepicker_e };
3397
3409
  //# sourceMappingURL=datepicker.js.map