diff --git a/src/material/datepicker/calendar-header.html b/src/material/datepicker/calendar-header.html
index 8c577dcc4f60..32d7a24f263b 100644
--- a/src/material/datepicker/calendar-header.html
+++ b/src/material/datepicker/calendar-header.html
@@ -2,10 +2,11 @@
diff --git a/src/material/datepicker/calendar-header.spec.ts b/src/material/datepicker/calendar-header.spec.ts
index ce6c19dbe7b2..26ca0d653498 100644
--- a/src/material/datepicker/calendar-header.spec.ts
+++ b/src/material/datepicker/calendar-header.spec.ts
@@ -203,6 +203,14 @@ describe('MatCalendarHeader', () => {
expect(calendarInstance.currentView).toBe('multi-year');
expect(periodButton.textContent).toContain('FAKE_YEAR');
});
+
+ it('should label and describe period button for assistive technology', () => {
+ const description = periodButton.querySelector('span[id]');
+ expect(periodButton.hasAttribute('aria-label')).toBe(true);
+ expect(periodButton.hasAttribute('aria-describedby')).toBe(true);
+ expect(periodButton.getAttribute('aria-describedby')).toBe(description?.getAttribute('id')!);
+ });
+
});
describe('calendar with minDate only', () => {
diff --git a/src/material/datepicker/calendar.ts b/src/material/datepicker/calendar.ts
index 1548e51c35f2..2724cfabe834 100644
--- a/src/material/datepicker/calendar.ts
+++ b/src/material/datepicker/calendar.ts
@@ -50,6 +50,9 @@ import {MAT_SINGLE_DATE_SELECTION_MODEL_PROVIDER, DateRange} from './date-select
*/
export type MatCalendarView = 'month' | 'year' | 'multi-year';
+/** Counter used to generate unique IDs. */
+let uniqueId = 0;
+
/** Default header for MatCalendar */
@Component({
selector: 'mat-calendar-header',
@@ -59,6 +62,8 @@ export type MatCalendarView = 'month' | 'year' | 'multi-year';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class MatCalendarHeader {
+ _buttonDescriptionId = `mat-calendar-button-${uniqueId++}`;
+
constructor(private _intl: MatDatepickerIntl,
@Inject(forwardRef(() => MatCalendar)) public calendar: MatCalendar,
@Optional() private _dateAdapter: DateAdapter,
diff --git a/tools/public_api_guard/material/datepicker.d.ts b/tools/public_api_guard/material/datepicker.d.ts
index d0d94f8a916c..2b2b7ade3384 100644
--- a/tools/public_api_guard/material/datepicker.d.ts
+++ b/tools/public_api_guard/material/datepicker.d.ts
@@ -156,6 +156,7 @@ export declare type MatCalendarCellCssClasses = string | string[] | Set
};
export declare class MatCalendarHeader {
+ _buttonDescriptionId: string;
calendar: MatCalendar;
get nextButtonLabel(): string;
get periodButtonLabel(): string;