@blox/material
Version:
Material Components for Angular
91 lines • 11.3 kB
JavaScript
/**
* @license
* Copyright 2020 Google Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/**
* Priorities for the announce function
*/
export var AnnouncerPriority;
(function (AnnouncerPriority) {
AnnouncerPriority["POLITE"] = "polite";
AnnouncerPriority["ASSERTIVE"] = "assertive";
})(AnnouncerPriority || (AnnouncerPriority = {}));
/**
* Data attribute added to live region element.
*/
export const DATA_MDC_DOM_ANNOUNCE = 'data-mdc-dom-announce';
/**
* Announces the given message with optional priority, defaulting to "polite"
*/
export function announce(message, priority) {
Announcer.getInstance().say(message, priority);
}
class Announcer {
// Constructor made private to ensure only the singleton is used
constructor() {
this.liveRegions = new Map();
}
static getInstance() {
if (!Announcer.instance) {
Announcer.instance = new Announcer();
}
return Announcer.instance;
}
say(message, priority = AnnouncerPriority.POLITE) {
const liveRegion = this.getLiveRegion(priority);
// Reset the region to pick up the message, even if the message is the
// exact same as before.
liveRegion.textContent = '';
// Timeout is necessary for screen readers like NVDA and VoiceOver.
setTimeout(() => {
liveRegion.textContent = message;
document.addEventListener('click', clearLiveRegion);
}, 1);
function clearLiveRegion() {
liveRegion.textContent = '';
document.removeEventListener('click', clearLiveRegion);
}
}
getLiveRegion(priority) {
const existingLiveRegion = this.liveRegions.get(priority);
if (existingLiveRegion &&
document.body.contains(existingLiveRegion)) {
return existingLiveRegion;
}
const liveRegion = this.createLiveRegion(priority);
this.liveRegions.set(priority, liveRegion);
return liveRegion;
}
createLiveRegion(priority) {
const el = document.createElement('div');
el.style.position = 'absolute';
el.style.top = '-9999px';
el.style.left = '-9999px';
el.style.height = '1px';
el.style.overflow = 'hidden';
el.setAttribute('aria-atomic', 'true');
el.setAttribute('aria-live', priority);
el.setAttribute(DATA_MDC_DOM_ANNOUNCE, 'true');
document.body.appendChild(el);
return el;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhpcmRwYXJ0eS5hbm5vdW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90aGlyZHBhcnR5LmFubm91bmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGlCQUdUO0FBSEgsV0FBWSxpQkFBaUI7SUFDekIsc0NBQWlCLENBQUE7SUFDakIsNENBQXVCLENBQUE7QUFDekIsQ0FBQyxFQUhTLGlCQUFpQixLQUFqQixpQkFBaUIsUUFHMUI7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHVCQUF1QixDQUFDO0FBRTdEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxPQUFlLEVBQUUsUUFBNEI7SUFDcEUsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVELE1BQU0sU0FBUztJQVliLGdFQUFnRTtJQUNoRTtRQUNFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBWEQsTUFBTSxDQUFDLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUU7WUFDdkIsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1NBQ3RDO1FBRUQsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQzVCLENBQUM7SUFPRCxHQUFHLENBQUMsT0FBZSxFQUFFLFdBQThCLGlCQUFpQixDQUFDLE1BQU07UUFDekUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxzRUFBc0U7UUFDdEUsd0JBQXdCO1FBQ3hCLFVBQVUsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQzVCLG1FQUFtRTtRQUNuRSxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsVUFBVSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7WUFDakMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN0RCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFTixTQUFTLGVBQWU7WUFDdEIsVUFBVSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDNUIsUUFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLGFBQWEsQ0FBQyxRQUEyQjtRQUMvQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFELElBQUksa0JBQWtCO1lBQ2xCLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUEwQixDQUFDLEVBQUU7WUFDdEQsT0FBTyxrQkFBa0IsQ0FBQztTQUMzQjtRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDM0MsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFFBQTJCO1FBQ2xELE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQy9CLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQztRQUN6QixFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7UUFDMUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUM3QixFQUFFLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2QyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2QyxFQUFFLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG5cbi8qKlxuICogUHJpb3JpdGllcyBmb3IgdGhlIGFubm91bmNlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIEFubm91bmNlclByaW9yaXR5IHtcbiAgICBQT0xJVEUgPSAncG9saXRlJyxcbiAgICBBU1NFUlRJVkUgPSAnYXNzZXJ0aXZlJyxcbiAgfVxuICBcbiAgLyoqXG4gICAqIERhdGEgYXR0cmlidXRlIGFkZGVkIHRvIGxpdmUgcmVnaW9uIGVsZW1lbnQuXG4gICAqL1xuICBleHBvcnQgY29uc3QgREFUQV9NRENfRE9NX0FOTk9VTkNFID0gJ2RhdGEtbWRjLWRvbS1hbm5vdW5jZSc7XG4gIFxuICAvKipcbiAgICogQW5ub3VuY2VzIHRoZSBnaXZlbiBtZXNzYWdlIHdpdGggb3B0aW9uYWwgcHJpb3JpdHksIGRlZmF1bHRpbmcgdG8gXCJwb2xpdGVcIlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGFubm91bmNlKG1lc3NhZ2U6IHN0cmluZywgcHJpb3JpdHk/OiBBbm5vdW5jZXJQcmlvcml0eSkge1xuICAgIEFubm91bmNlci5nZXRJbnN0YW5jZSgpLnNheShtZXNzYWdlLCBwcmlvcml0eSk7XG4gIH1cbiAgXG4gIGNsYXNzIEFubm91bmNlciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEFubm91bmNlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpdmVSZWdpb25zOiBNYXA8QW5ub3VuY2VyUHJpb3JpdHksIEVsZW1lbnQ+O1xuICBcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogQW5ub3VuY2VyIHtcbiAgICAgIGlmICghQW5ub3VuY2VyLmluc3RhbmNlKSB7XG4gICAgICAgIEFubm91bmNlci5pbnN0YW5jZSA9IG5ldyBBbm5vdW5jZXIoKTtcbiAgICAgIH1cbiAgXG4gICAgICByZXR1cm4gQW5ub3VuY2VyLmluc3RhbmNlO1xuICAgIH1cbiAgXG4gICAgLy8gQ29uc3RydWN0b3IgbWFkZSBwcml2YXRlIHRvIGVuc3VyZSBvbmx5IHRoZSBzaW5nbGV0b24gaXMgdXNlZFxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmxpdmVSZWdpb25zID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgXG4gICAgc2F5KG1lc3NhZ2U6IHN0cmluZywgcHJpb3JpdHk6IEFubm91bmNlclByaW9yaXR5ID0gQW5ub3VuY2VyUHJpb3JpdHkuUE9MSVRFKSB7XG4gICAgICBjb25zdCBsaXZlUmVnaW9uID0gdGhpcy5nZXRMaXZlUmVnaW9uKHByaW9yaXR5KTtcbiAgICAgIC8vIFJlc2V0IHRoZSByZWdpb24gdG8gcGljayB1cCB0aGUgbWVzc2FnZSwgZXZlbiBpZiB0aGUgbWVzc2FnZSBpcyB0aGVcbiAgICAgIC8vIGV4YWN0IHNhbWUgYXMgYmVmb3JlLlxuICAgICAgbGl2ZVJlZ2lvbi50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgLy8gVGltZW91dCBpcyBuZWNlc3NhcnkgZm9yIHNjcmVlbiByZWFkZXJzIGxpa2UgTlZEQSBhbmQgVm9pY2VPdmVyLlxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGxpdmVSZWdpb24udGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsZWFyTGl2ZVJlZ2lvbik7XG4gICAgICB9LCAxKTtcbiAgXG4gICAgICBmdW5jdGlvbiBjbGVhckxpdmVSZWdpb24oKSB7XG4gICAgICAgIGxpdmVSZWdpb24udGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbGVhckxpdmVSZWdpb24pO1xuICAgICAgfVxuICAgIH1cbiAgXG4gICAgcHJpdmF0ZSBnZXRMaXZlUmVnaW9uKHByaW9yaXR5OiBBbm5vdW5jZXJQcmlvcml0eSk6IEVsZW1lbnQge1xuICAgICAgY29uc3QgZXhpc3RpbmdMaXZlUmVnaW9uID0gdGhpcy5saXZlUmVnaW9ucy5nZXQocHJpb3JpdHkpO1xuICAgICAgaWYgKGV4aXN0aW5nTGl2ZVJlZ2lvbiAmJlxuICAgICAgICAgIGRvY3VtZW50LmJvZHkuY29udGFpbnMoZXhpc3RpbmdMaXZlUmVnaW9uIGFzIE5vZGUpKSB7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0xpdmVSZWdpb247XG4gICAgICB9XG4gIFxuICAgICAgY29uc3QgbGl2ZVJlZ2lvbiA9IHRoaXMuY3JlYXRlTGl2ZVJlZ2lvbihwcmlvcml0eSk7XG4gICAgICB0aGlzLmxpdmVSZWdpb25zLnNldChwcmlvcml0eSwgbGl2ZVJlZ2lvbik7XG4gICAgICByZXR1cm4gbGl2ZVJlZ2lvbjtcbiAgICB9XG4gIFxuICAgIHByaXZhdGUgY3JlYXRlTGl2ZVJlZ2lvbihwcmlvcml0eTogQW5ub3VuY2VyUHJpb3JpdHkpOiBFbGVtZW50IHtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBlbC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICBlbC5zdHlsZS50b3AgPSAnLTk5OTlweCc7XG4gICAgICBlbC5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzFweCc7XG4gICAgICBlbC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCdhcmlhLWF0b21pYycsICd0cnVlJyk7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIHByaW9yaXR5KTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShEQVRBX01EQ19ET01fQU5OT1VOQ0UsICd0cnVlJyk7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgIHJldHVybiBlbDtcbiAgICB9XG4gIH0iXX0=