Skip to content

Commit 6a490a2

Browse files
feat: add message-list announceMessages API (#9252) (#9270)
Co-authored-by: Tomi Virkki <tomivirkki@users.noreply.github.com>
1 parent 46e0871 commit 6a490a2

File tree

6 files changed

+54
-6
lines changed

6 files changed

+54
-6
lines changed

dev/messages.html

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,25 @@
2727
userColorIndex: 2,
2828
},
2929
];
30+
31+
const input = document.querySelector('vaadin-message-input');
32+
input.addEventListener('submit', (e) => {
33+
const message = e.detail.value;
34+
list.items = [
35+
...list.items,
36+
{
37+
text: message,
38+
time: 'now',
39+
userName: 'You',
40+
userColorIndex: 0,
41+
},
42+
];
43+
});
3044
</script>
3145
</head>
3246

3347
<body>
34-
<vaadin-message-list></vaadin-message-list>
48+
<vaadin-message-list announce-messages></vaadin-message-list>
3549
<vaadin-message-input>
3650
<vaadin-tooltip slot="tooltip" text="Press Enter to send"></vaadin-tooltip>
3751
</vaadin-message-input>

packages/message-list/src/vaadin-message-list-mixin.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,10 @@ export declare class MessageListMixinClass {
4848
* When set to `true`, the message text is parsed as Markdown.
4949
*/
5050
markdown: boolean | undefined;
51+
52+
/**
53+
* When set to `true`, new messages are announced to assistive technologies using ARIA live regions.
54+
* @attr {boolean} announce-messages
55+
*/
56+
announceMessages: boolean | undefined;
5157
}

packages/message-list/src/vaadin-message-list-mixin.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@ export const MessageListMixin = (superClass) =>
4949
observer: '__markdownChanged',
5050
reflectToAttribute: true,
5151
},
52+
53+
/**
54+
* When set to `true`, new messages are announced to assistive technologies using ARIA live regions.
55+
* @attr {boolean} announce-messages
56+
* @type {boolean}
57+
*/
58+
announceMessages: {
59+
type: Boolean,
60+
value: false,
61+
observer: '__announceChanged',
62+
sync: true,
63+
},
5264
};
5365
}
5466

@@ -63,7 +75,7 @@ export const MessageListMixin = (superClass) =>
6375

6476
// Make screen readers announce new messages
6577
this.setAttribute('aria-relevant', 'additions');
66-
this.setAttribute('role', 'log');
78+
this.setAttribute('role', 'region');
6779
}
6880

6981
/** @protected */
@@ -193,4 +205,9 @@ export const MessageListMixin = (superClass) =>
193205
const index = this._messages.findIndex((e) => e.tabIndex === 0);
194206
return index !== -1 ? index : 0;
195207
}
208+
209+
/** @private */
210+
__announceChanged(announceMessages) {
211+
this.ariaLive = announceMessages ? 'polite' : null;
212+
}
196213
};

packages/message-list/test/dom/__snapshots__/message-list.test.snap.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export const snapshots = {};
44
snapshots["vaadin-message-list default"] =
55
`<vaadin-message-list
66
aria-relevant="additions"
7-
role="log"
7+
role="region"
88
>
99
</vaadin-message-list>
1010
`;
@@ -13,7 +13,7 @@ snapshots["vaadin-message-list default"] =
1313
snapshots["vaadin-message-list items"] =
1414
`<vaadin-message-list
1515
aria-relevant="additions"
16-
role="log"
16+
role="region"
1717
>
1818
<vaadin-message
1919
role="listitem"
@@ -54,7 +54,7 @@ snapshots["vaadin-message-list items"] =
5454
snapshots["vaadin-message-list theme"] =
5555
`<vaadin-message-list
5656
aria-relevant="additions"
57-
role="log"
57+
role="region"
5858
>
5959
<vaadin-message
6060
role="listitem"
@@ -80,7 +80,7 @@ snapshots["vaadin-message-list theme"] =
8080
snapshots["vaadin-message-list className"] =
8181
`<vaadin-message-list
8282
aria-relevant="additions"
83-
role="log"
83+
role="region"
8484
>
8585
<vaadin-message
8686
class="pinned"

packages/message-list/test/message-list.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,4 +409,14 @@ describe('message-list', () => {
409409
expect(messageElements[1].hasAttribute('focused')).to.be.true;
410410
});
411411
});
412+
413+
describe('a11y', () => {
414+
it('should toggle aria live', () => {
415+
expect(messageList.getAttribute('aria-live')).to.be.null;
416+
messageList.announceMessages = true;
417+
expect(messageList.getAttribute('aria-live')).to.equal('polite');
418+
messageList.announceMessages = false;
419+
expect(messageList.getAttribute('aria-live')).to.be.null;
420+
});
421+
});
412422
});

packages/message-list/test/typings/message-list.types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const list = document.createElement('vaadin-message-list');
1313
// Properties
1414
assertType<MessageListItem[] | null | undefined>(list.items);
1515
assertType<boolean | undefined>(list.markdown);
16+
assertType<boolean | undefined>(list.announceMessages);
1617

1718
// Item properties
1819
const item: MessageListItem = list.items ? list.items[0] : {};

0 commit comments

Comments
 (0)