UNPKG

@blox/material

Version:

Material Components for Angular

91 lines 11.3 kB
/** * @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=