{"version":3,"sources":["src/material/material-button-toggle.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","material","buttonToggle","cdk","a11y","coercion","collections","core","forms","this","core$1","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__read","o","n","m","Symbol","iterator","r","e","i","ar","next","done","push","value","error","MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS","InjectionToken","MAT_BUTTON_TOGGLE_GROUP","MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","MatButtonToggleGroup","multi","uniqueIdCounter","MatButtonToggleChange","source","_changeDetector","defaultOptions","_vertical","_multiple","_disabled","_controlValueAccessorChangeFn","_onTouched","_name","valueChange","EventEmitter","change","appearance","defineProperty","get","set","_this","_buttonToggles","forEach","toggle","name","_markForCheck","enumerable","configurable","coerceBooleanProperty","selected","_selectionModel","multiple","map","undefined","newValue","_setSelectionByValue","emit","ngOnInit","SelectionModel","ngAfterContentInit","_a","select","apply","__spread","arguments","length","concat","filter","checked","writeValue","markForCheck","registerOnChange","fn","registerOnTouched","setDisabledState","isDisabled","disabled","_emitChangeEvent","isArray","event","_syncButtonToggle","isUserInput","deferEvents","deselect","Promise","resolve","then","_updateModelValue","_isSelected","isSelected","_isPrechecked","_rawValue","some","_clearSelection","currentValue","_selectValue","clear","correspondingOption","find","decorators","type","Directive","args","selector","providers","host","role","class","[attr.aria-disabled]","[class.mat-button-toggle-vertical]","[class.mat-button-toggle-group-appearance-standard]","exportAs","ctorParameters","ChangeDetectorRef","Optional","Inject","propDecorators","ContentChildren","MatButtonToggle","descendants","Input","vertical","Output","MatButtonToggleModule","_super","toggleGroup","_changeDetectorRef","_elementRef","_focusMonitor","defaultTabIndex","_isSingleSelector","_checked","ariaLabelledby","parsedTabIndex","Number","tabIndex","buttonToggleGroup","__extends","TypeError","String","__","constructor","create","id","_appearance","group","ngAfterViewInit","monitor","ngOnDestroy","stopMonitoring","focus","options","_buttonElement","nativeElement","_onButtonClick","newChecked","mixinDisableRipple","MatButtonToggleBase","Component","template","encapsulation","ViewEncapsulation","None","changeDetection","ChangeDetectionStrategy","OnPush","inputs","[class.mat-button-toggle-standalone]","[class.mat-button-toggle-checked]","[class.mat-button-toggle-disabled]","[class.mat-button-toggle-appearance-standard]","[attr.aria-label]","[attr.aria-labelledby]","[attr.id]","[attr.name]","(focus)","styles","ElementRef","FocusMonitor","Attribute","ariaLabel","ViewChild","NgModule","imports","MatCommonModule","MatRippleModule","declarations"],"mappings":"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","sourcesContent":["(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/cdk/a11y'), require('@angular/cdk/coercion'), require('@angular/cdk/collections'), require('@angular/core'), require('@angular/forms'), require('@angular/material/core')) :\n    typeof define === 'function' && define.amd ? define('@angular/material/button-toggle', ['exports', '@angular/cdk/a11y', '@angular/cdk/coercion', '@angular/cdk/collections', '@angular/core', '@angular/forms', '@angular/material/core'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.material = global.ng.material || {}, global.ng.material.buttonToggle = {}), global.ng.cdk.a11y, global.ng.cdk.coercion, global.ng.cdk.collections, global.ng.core, global.ng.forms, global.ng.material.core));\n}(this, (function (exports, a11y, coercion, collections, core, forms, core$1) { 'use strict';\n\n    /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n    /* global Reflect, Promise */\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b)\n                if (Object.prototype.hasOwnProperty.call(b, p))\n                    d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    function __extends(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    }\n    var __assign = function () {\n        __assign = Object.assign || function __assign(t) {\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\n                s = arguments[i];\n                for (var p in s)\n                    if (Object.prototype.hasOwnProperty.call(s, p))\n                        t[p] = s[p];\n            }\n            return t;\n        };\n        return __assign.apply(this, arguments);\n    };\n    function __rest(s, e) {\n        var t = {};\n        for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n                t[p] = s[p];\n        if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                    t[p[i]] = s[p[i]];\n            }\n        return t;\n    }\n    function __decorate(decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\")\n            r = Reflect.decorate(decorators, target, key, desc);\n        else\n            for (var i = decorators.length - 1; i >= 0; i--)\n                if (d = decorators[i])\n                    r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    }\n    function __param(paramIndex, decorator) {\n        return function (target, key) { decorator(target, key, paramIndex); };\n    }\n    function __metadata(metadataKey, metadataValue) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\")\n            return Reflect.metadata(metadataKey, metadataValue);\n    }\n    function __awaiter(thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try {\n                step(generator.next(value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function rejected(value) { try {\n                step(generator[\"throw\"](value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    }\n    function __generator(thisArg, body) {\n        var _ = { label: 0, sent: function () { if (t[0] & 1)\n                throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n        return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () { return this; }), g;\n        function verb(n) { return function (v) { return step([n, v]); }; }\n        function step(op) {\n            if (f)\n                throw new TypeError(\"Generator is already executing.\");\n            while (_)\n                try {\n                    if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)\n                        return t;\n                    if (y = 0, t)\n                        op = [op[0] & 2, t.value];\n                    switch (op[0]) {\n                        case 0:\n                        case 1:\n                            t = op;\n                            break;\n                        case 4:\n                            _.label++;\n                            return { value: op[1], done: false };\n                        case 5:\n                            _.label++;\n                            y = op[1];\n                            op = [0];\n                            continue;\n                        case 7:\n                            op = _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                        default:\n                            if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                                _ = 0;\n                                continue;\n                            }\n                            if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {\n                                _.label = op[1];\n                                break;\n                            }\n                            if (op[0] === 6 && _.label < t[1]) {\n                                _.label = t[1];\n                                t = op;\n                                break;\n                            }\n                            if (t && _.label < t[2]) {\n                                _.label = t[2];\n                                _.ops.push(op);\n                                break;\n                            }\n                            if (t[2])\n                                _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                    }\n                    op = body.call(thisArg, _);\n                }\n                catch (e) {\n                    op = [6, e];\n                    y = 0;\n                }\n                finally {\n                    f = t = 0;\n                }\n            if (op[0] & 5)\n                throw op[1];\n            return { value: op[0] ? op[1] : void 0, done: true };\n        }\n    }\n    var __createBinding = Object.create ? (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });\n    }) : (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        o[k2] = m[k];\n    });\n    function __exportStar(m, o) {\n        for (var p in m)\n            if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p))\n                __createBinding(o, m, p);\n    }\n    function __values(o) {\n        var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n        if (m)\n            return m.call(o);\n        if (o && typeof o.length === \"number\")\n            return {\n                next: function () {\n                    if (o && i >= o.length)\n                        o = void 0;\n                    return { value: o && o[i++], done: !o };\n                }\n            };\n        throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n    }\n    function __read(o, n) {\n        var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n        if (!m)\n            return o;\n        var i = m.call(o), r, ar = [], e;\n        try {\n            while ((n === void 0 || n-- > 0) && !(r = i.next()).done)\n                ar.push(r.value);\n        }\n        catch (error) {\n            e = { error: error };\n        }\n        finally {\n            try {\n                if (r && !r.done && (m = i[\"return\"]))\n                    m.call(i);\n            }\n            finally {\n                if (e)\n                    throw e.error;\n            }\n        }\n        return ar;\n    }\n    /** @deprecated */\n    function __spread() {\n        for (var ar = [], i = 0; i < arguments.length; i++)\n            ar = ar.concat(__read(arguments[i]));\n        return ar;\n    }\n    /** @deprecated */\n    function __spreadArrays() {\n        for (var s = 0, i = 0, il = arguments.length; i < il; i++)\n            s += arguments[i].length;\n        for (var r = Array(s), k = 0, i = 0; i < il; i++)\n            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n                r[k] = a[j];\n        return r;\n    }\n    function __spreadArray(to, from) {\n        for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n            to[j] = from[i];\n        return to;\n    }\n    function __await(v) {\n        return this instanceof __await ? (this.v = v, this) : new __await(v);\n    }\n    function __asyncGenerator(thisArg, _arguments, generator) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var g = generator.apply(thisArg, _arguments || []), i, q = [];\n        return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n        function verb(n) { if (g[n])\n            i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n        function resume(n, v) { try {\n            step(g[n](v));\n        }\n        catch (e) {\n            settle(q[0][3], e);\n        } }\n        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n        function fulfill(value) { resume(\"next\", value); }\n        function reject(value) { resume(\"throw\", value); }\n        function settle(f, v) { if (f(v), q.shift(), q.length)\n            resume(q[0][0], q[0][1]); }\n    }\n    function __asyncDelegator(o) {\n        var i, p;\n        return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\n    }\n    function __asyncValues(o) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var m = o[Symbol.asyncIterator], i;\n        return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }\n    }\n    function __makeTemplateObject(cooked, raw) {\n        if (Object.defineProperty) {\n            Object.defineProperty(cooked, \"raw\", { value: raw });\n        }\n        else {\n            cooked.raw = raw;\n        }\n        return cooked;\n    }\n    ;\n    var __setModuleDefault = Object.create ? (function (o, v) {\n        Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    }) : function (o, v) {\n        o[\"default\"] = v;\n    };\n    function __importStar(mod) {\n        if (mod && mod.__esModule)\n            return mod;\n        var result = {};\n        if (mod != null)\n            for (var k in mod)\n                if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k))\n                    __createBinding(result, mod, k);\n        __setModuleDefault(result, mod);\n        return result;\n    }\n    function __importDefault(mod) {\n        return (mod && mod.__esModule) ? mod : { default: mod };\n    }\n    function __classPrivateFieldGet(receiver, privateMap) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to get private field on non-instance\");\n        }\n        return privateMap.get(receiver);\n    }\n    function __classPrivateFieldSet(receiver, privateMap, value) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to set private field on non-instance\");\n        }\n        privateMap.set(receiver, value);\n        return value;\n    }\n\n    /**\n     * Injection token that can be used to configure the\n     * default options for all button toggles within an app.\n     */\n    var MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS = new core.InjectionToken('MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS');\n    /**\n     * Injection token that can be used to reference instances of `MatButtonToggleGroup`.\n     * It serves as alternative token to the actual `MatButtonToggleGroup` class which\n     * could cause unnecessary retention of the class and its component metadata.\n     */\n    var MAT_BUTTON_TOGGLE_GROUP = new core.InjectionToken('MatButtonToggleGroup');\n    /**\n     * Provider Expression that allows mat-button-toggle-group to register as a ControlValueAccessor.\n     * This allows it to support [(ngModel)].\n     * @docs-private\n     */\n    var MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR = {\n        provide: forms.NG_VALUE_ACCESSOR,\n        useExisting: core.forwardRef(function () { return MatButtonToggleGroup; }),\n        multi: true\n    };\n    // Counter used to generate unique IDs.\n    var uniqueIdCounter = 0;\n    /** Change event object emitted by MatButtonToggle. */\n    var MatButtonToggleChange = /** @class */ (function () {\n        function MatButtonToggleChange(\n        /** The MatButtonToggle that emits the event. */\n        source, \n        /** The value assigned to the MatButtonToggle. */\n        value) {\n            this.source = source;\n            this.value = value;\n        }\n        return MatButtonToggleChange;\n    }());\n    /** Exclusive selection button toggle group that behaves like a radio-button group. */\n    var MatButtonToggleGroup = /** @class */ (function () {\n        function MatButtonToggleGroup(_changeDetector, defaultOptions) {\n            this._changeDetector = _changeDetector;\n            this._vertical = false;\n            this._multiple = false;\n            this._disabled = false;\n            /**\n             * The method to be called in order to update ngModel.\n             * Now `ngModel` binding is not supported in multiple selection mode.\n             */\n            this._controlValueAccessorChangeFn = function () { };\n            /** onTouch function registered via registerOnTouch (ControlValueAccessor). */\n            this._onTouched = function () { };\n            this._name = \"mat-button-toggle-group-\" + uniqueIdCounter++;\n            /**\n             * Event that emits whenever the value of the group changes.\n             * Used to facilitate two-way data binding.\n             * @docs-private\n             */\n            this.valueChange = new core.EventEmitter();\n            /** Event emitted when the group's value changes. */\n            this.change = new core.EventEmitter();\n            this.appearance =\n                defaultOptions && defaultOptions.appearance ? defaultOptions.appearance : 'standard';\n        }\n        Object.defineProperty(MatButtonToggleGroup.prototype, \"name\", {\n            /** `name` attribute for the underlying `input` element. */\n            get: function () { return this._name; },\n            set: function (value) {\n                var _this = this;\n                this._name = value;\n                if (this._buttonToggles) {\n                    this._buttonToggles.forEach(function (toggle) {\n                        toggle.name = _this._name;\n                        toggle._markForCheck();\n                    });\n                }\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(MatButtonToggleGroup.prototype, \"vertical\", {\n            /** Whether the toggle group is vertical. */\n            get: function () { return this._vertical; },\n            set: function (value) {\n                this._vertical = coercion.coerceBooleanProperty(value);\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(MatButtonToggleGroup.prototype, \"value\", {\n            /** Value of the toggle group. */\n            get: function () {\n                var selected = this._selectionModel ? this._selectionModel.selected : [];\n                if (this.multiple) {\n                    return selected.map(function (toggle) { return toggle.value; });\n                }\n                return selected[0] ? selected[0].value : undefined;\n            },\n            set: function (newValue) {\n                this._setSelectionByValue(newValue);\n                this.valueChange.emit(this.value);\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(MatButtonToggleGroup.prototype, \"selected\", {\n            /** Selected button toggles in the group. */\n            get: function () {\n                var selected = this._selectionModel ? this._selectionModel.selected : [];\n                return this.multiple ? selected : (selected[0] || null);\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(MatButtonToggleGroup.prototype, \"multiple\", {\n            /** Whether multiple button toggles can be selected. */\n            get: function () { return this._multiple; },\n            set: function (value) {\n                this._multiple = coercion.coerceBooleanProperty(value);\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(MatButtonToggleGroup.prototype, \"disabled\", {\n            /** Whether multiple button toggle group is disabled. */\n            get: function () { return this._disabled; },\n            set: function (value) {\n                this._disabled = coercion.coerceBooleanProperty(value);\n                if (this._buttonToggles) {\n                    this._buttonToggles.forEach(function (toggle) { return toggle._markForCheck(); });\n                }\n            },\n            enumerable: false,\n            configurable: true\n        });\n        MatButtonToggleGroup.prototype.ngOnInit = function () {\n            this._selectionModel = new collections.SelectionModel(this.multiple, undefined, false);\n        };\n        MatButtonToggleGroup.prototype.ngAfterContentInit = function () {\n            var _a;\n            (_a = this._selectionModel).select.apply(_a, __spread(this._buttonToggles.filter(function (toggle) { return toggle.checked; })));\n        };\n        /**\n         * Sets the model value. Implemented as part of ControlValueAccessor.\n         * @param value Value to be set to the model.\n         */\n        MatButtonToggleGroup.prototype.writeValue = function (value) {\n            this.value = value;\n            this._changeDetector.markForCheck();\n        };\n        // Implemented as part of ControlValueAccessor.\n        MatButtonToggleGroup.prototype.registerOnChange = function (fn) {\n            this._controlValueAccessorChangeFn = fn;\n        };\n        // Implemented as part of ControlValueAccessor.\n        MatButtonToggleGroup.prototype.registerOnTouched = function (fn) {\n            this._onTouched = fn;\n        };\n        // Implemented as part of ControlValueAccessor.\n        MatButtonToggleGroup.prototype.setDisabledState = function (isDisabled) {\n            this.disabled = isDisabled;\n        };\n        /** Dispatch change event with current selection and group value. */\n        MatButtonToggleGroup.prototype._emitChangeEvent = function () {\n            var selected = this.selected;\n            var source = Array.isArray(selected) ? selected[selected.length - 1] : selected;\n            var event = new MatButtonToggleChange(source, this.value);\n            this._controlValueAccessorChangeFn(event.value);\n            this.change.emit(event);\n        };\n        /**\n         * Syncs a button toggle's selected state with the model value.\n         * @param toggle Toggle to be synced.\n         * @param select Whether the toggle should be selected.\n         * @param isUserInput Whether the change was a result of a user interaction.\n         * @param deferEvents Whether to defer emitting the change events.\n         */\n        MatButtonToggleGroup.prototype._syncButtonToggle = function (toggle, select, isUserInput, deferEvents) {\n            var _this = this;\n            if (isUserInput === void 0) { isUserInput = false; }\n            if (deferEvents === void 0) { deferEvents = false; }\n            // Deselect the currently-selected toggle, if we're in single-selection\n            // mode and the button being toggled isn't selected at the moment.\n            if (!this.multiple && this.selected && !toggle.checked) {\n                this.selected.checked = false;\n            }\n            if (this._selectionModel) {\n                if (select) {\n                    this._selectionModel.select(toggle);\n                }\n                else {\n                    this._selectionModel.deselect(toggle);\n                }\n            }\n            else {\n                deferEvents = true;\n            }\n            // We need to defer in some cases in order to avoid \"changed after checked errors\", however\n            // the side-effect is that we may end up updating the model value out of sequence in others\n            // The `deferEvents` flag allows us to decide whether to do it on a case-by-case basis.\n            if (deferEvents) {\n                Promise.resolve().then(function () { return _this._updateModelValue(isUserInput); });\n            }\n            else {\n                this._updateModelValue(isUserInput);\n            }\n        };\n        /** Checks whether a button toggle is selected. */\n        MatButtonToggleGroup.prototype._isSelected = function (toggle) {\n            return this._selectionModel && this._selectionModel.isSelected(toggle);\n        };\n        /** Determines whether a button toggle should be checked on init. */\n        MatButtonToggleGroup.prototype._isPrechecked = function (toggle) {\n            if (typeof this._rawValue === 'undefined') {\n                return false;\n            }\n            if (this.multiple && Array.isArray(this._rawValue)) {\n                return this._rawValue.some(function (value) { return toggle.value != null && value === toggle.value; });\n            }\n            return toggle.value === this._rawValue;\n        };\n        /** Updates the selection state of the toggles in the group based on a value. */\n        MatButtonToggleGroup.prototype._setSelectionByValue = function (value) {\n            var _this = this;\n            this._rawValue = value;\n            if (!this._buttonToggles) {\n                return;\n            }\n            if (this.multiple && value) {\n                if (!Array.isArray(value) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n                    throw Error('Value must be an array in multiple-selection mode.');\n                }\n                this._clearSelection();\n                value.forEach(function (currentValue) { return _this._selectValue(currentValue); });\n            }\n            else {\n                this._clearSelection();\n                this._selectValue(value);\n            }\n        };\n        /** Clears the selected toggles. */\n        MatButtonToggleGroup.prototype._clearSelection = function () {\n            this._selectionModel.clear();\n            this._buttonToggles.forEach(function (toggle) { return toggle.checked = false; });\n        };\n        /** Selects a value if there's a toggle that corresponds to it. */\n        MatButtonToggleGroup.prototype._selectValue = function (value) {\n            var correspondingOption = this._buttonToggles.find(function (toggle) {\n                return toggle.value != null && toggle.value === value;\n            });\n            if (correspondingOption) {\n                correspondingOption.checked = true;\n                this._selectionModel.select(correspondingOption);\n            }\n        };\n        /** Syncs up the group's value with the model and emits the change event. */\n        MatButtonToggleGroup.prototype._updateModelValue = function (isUserInput) {\n            // Only emit the change event for user input.\n            if (isUserInput) {\n                this._emitChangeEvent();\n            }\n            // Note: we emit this one no matter whether it was a user interaction, because\n            // it is used by Angular to sync up the two-way data binding.\n            this.valueChange.emit(this.value);\n        };\n        return MatButtonToggleGroup;\n    }());\n    MatButtonToggleGroup.decorators = [\n        { type: core.Directive, args: [{\n                    selector: 'mat-button-toggle-group',\n                    providers: [\n                        MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR,\n                        { provide: MAT_BUTTON_TOGGLE_GROUP, useExisting: MatButtonToggleGroup },\n                    ],\n                    host: {\n                        'role': 'group',\n                        'class': 'mat-button-toggle-group',\n                        '[attr.aria-disabled]': 'disabled',\n                        '[class.mat-button-toggle-vertical]': 'vertical',\n                        '[class.mat-button-toggle-group-appearance-standard]': 'appearance === \"standard\"',\n                    },\n                    exportAs: 'matButtonToggleGroup',\n                },] }\n    ];\n    MatButtonToggleGroup.ctorParameters = function () { return [\n        { type: core.ChangeDetectorRef },\n        { type: undefined, decorators: [{ type: core.Optional }, { type: core.Inject, args: [MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS,] }] }\n    ]; };\n    MatButtonToggleGroup.propDecorators = {\n        _buttonToggles: [{ type: core.ContentChildren, args: [core.forwardRef(function () { return MatButtonToggle; }), {\n                        // Note that this would technically pick up toggles\n                        // from nested groups, but that's not a case that we support.\n                        descendants: true\n                    },] }],\n        appearance: [{ type: core.Input }],\n        name: [{ type: core.Input }],\n        vertical: [{ type: core.Input }],\n        value: [{ type: core.Input }],\n        valueChange: [{ type: core.Output }],\n        multiple: [{ type: core.Input }],\n        disabled: [{ type: core.Input }],\n        change: [{ type: core.Output }]\n    };\n    // Boilerplate for applying mixins to the MatButtonToggle class.\n    /** @docs-private */\n    var MatButtonToggleBase = /** @class */ (function () {\n        function MatButtonToggleBase() {\n        }\n        return MatButtonToggleBase;\n    }());\n    var _MatButtonToggleMixinBase = core$1.mixinDisableRipple(MatButtonToggleBase);\n    /** Single button inside of a toggle group. */\n    var MatButtonToggle = /** @class */ (function (_super) {\n        __extends(MatButtonToggle, _super);\n        function MatButtonToggle(toggleGroup, _changeDetectorRef, _elementRef, _focusMonitor, defaultTabIndex, defaultOptions) {\n            var _this = _super.call(this) || this;\n            _this._changeDetectorRef = _changeDetectorRef;\n            _this._elementRef = _elementRef;\n            _this._focusMonitor = _focusMonitor;\n            _this._isSingleSelector = false;\n            _this._checked = false;\n            /**\n             * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\n             */\n            _this.ariaLabelledby = null;\n            _this._disabled = false;\n            /** Event emitted when the group value changes. */\n            _this.change = new core.EventEmitter();\n            var parsedTabIndex = Number(defaultTabIndex);\n            _this.tabIndex = (parsedTabIndex || parsedTabIndex === 0) ? parsedTabIndex : null;\n            _this.buttonToggleGroup = toggleGroup;\n            _this.appearance =\n                defaultOptions && defaultOptions.appearance ? defaultOptions.appearance : 'standard';\n            return _this;\n        }\n        Object.defineProperty(MatButtonToggle.prototype, \"buttonId\", {\n            /** Unique ID for the underlying `button` element. */\n            get: function () { return this.id + \"-button\"; },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(MatButtonToggle.prototype, \"appearance\", {\n            /** The appearance style of the button. */\n            get: function () {\n                return this.buttonToggleGroup ? this.buttonToggleGroup.appearance : this._appearance;\n            },\n            set: function (value) {\n                this._appearance = value;\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(MatButtonToggle.prototype, \"checked\", {\n            /** Whether the button is checked. */\n            get: function () {\n                return this.buttonToggleGroup ? this.buttonToggleGroup._isSelected(this) : this._checked;\n            },\n            set: function (value) {\n                var newValue = coercion.coerceBooleanProperty(value);\n                if (newValue !== this._checked) {\n                    this._checked = newValue;\n                    if (this.buttonToggleGroup) {\n                        this.buttonToggleGroup._syncButtonToggle(this, this._checked);\n                    }\n                    this._changeDetectorRef.markForCheck();\n                }\n            },\n            enumerable: false,\n            configurable: true\n        });\n        Object.defineProperty(MatButtonToggle.prototype, \"disabled\", {\n            /** Whether the button is disabled. */\n            get: function () {\n                return this._disabled || (this.buttonToggleGroup && this.buttonToggleGroup.disabled);\n            },\n            set: function (value) { this._disabled = coercion.coerceBooleanProperty(value); },\n            enumerable: false,\n            configurable: true\n        });\n        MatButtonToggle.prototype.ngOnInit = function () {\n            var group = this.buttonToggleGroup;\n            this._isSingleSelector = group && !group.multiple;\n            this.id = this.id || \"mat-button-toggle-\" + uniqueIdCounter++;\n            if (this._isSingleSelector) {\n                this.name = group.name;\n            }\n            if (group) {\n                if (group._isPrechecked(this)) {\n                    this.checked = true;\n                }\n                else if (group._isSelected(this) !== this._checked) {\n                    // As as side effect of the circular dependency between the toggle group and the button,\n                    // we may end up in a state where the button is supposed to be checked on init, but it\n                    // isn't, because the checked value was assigned too early. This can happen when Ivy\n                    // assigns the static input value before the `ngOnInit` has run.\n                    group._syncButtonToggle(this, this._checked);\n                }\n            }\n        };\n        MatButtonToggle.prototype.ngAfterViewInit = function () {\n            this._focusMonitor.monitor(this._elementRef, true);\n        };\n        MatButtonToggle.prototype.ngOnDestroy = function () {\n            var group = this.buttonToggleGroup;\n            this._focusMonitor.stopMonitoring(this._elementRef);\n            // Remove the toggle from the selection once it's destroyed. Needs to happen\n            // on the next tick in order to avoid \"changed after checked\" errors.\n            if (group && group._isSelected(this)) {\n                group._syncButtonToggle(this, false, false, true);\n            }\n        };\n        /** Focuses the button. */\n        MatButtonToggle.prototype.focus = function (options) {\n            this._buttonElement.nativeElement.focus(options);\n        };\n        /** Checks the button toggle due to an interaction with the underlying native button. */\n        MatButtonToggle.prototype._onButtonClick = function () {\n            var newChecked = this._isSingleSelector ? true : !this._checked;\n            if (newChecked !== this._checked) {\n                this._checked = newChecked;\n                if (this.buttonToggleGroup) {\n                    this.buttonToggleGroup._syncButtonToggle(this, this._checked, true);\n                    this.buttonToggleGroup._onTouched();\n                }\n            }\n            // Emit a change event when it's the single selector\n            this.change.emit(new MatButtonToggleChange(this, this.value));\n        };\n        /**\n         * Marks the button toggle as needing checking for change detection.\n         * This method is exposed because the parent button toggle group will directly\n         * update bound properties of the radio button.\n         */\n        MatButtonToggle.prototype._markForCheck = function () {\n            // When the group value changes, the button will not be notified.\n            // Use `markForCheck` to explicit update button toggle's status.\n            this._changeDetectorRef.markForCheck();\n        };\n        return MatButtonToggle;\n    }(_MatButtonToggleMixinBase));\n    MatButtonToggle.decorators = [\n        { type: core.Component, args: [{\n                    selector: 'mat-button-toggle',\n                    template: \"<button #button class=\\\"mat-button-toggle-button mat-focus-indicator\\\"\\n        type=\\\"button\\\"\\n        [id]=\\\"buttonId\\\"\\n        [attr.tabindex]=\\\"disabled ? -1 : tabIndex\\\"\\n        [attr.aria-pressed]=\\\"checked\\\"\\n        [disabled]=\\\"disabled || null\\\"\\n        [attr.name]=\\\"name || null\\\"\\n        [attr.aria-label]=\\\"ariaLabel\\\"\\n        [attr.aria-labelledby]=\\\"ariaLabelledby\\\"\\n        (click)=\\\"_onButtonClick()\\\">\\n  <span class=\\\"mat-button-toggle-label-content\\\">\\n    <ng-content></ng-content>\\n  </span>\\n</button>\\n\\n<span class=\\\"mat-button-toggle-focus-overlay\\\"></span>\\n<span class=\\\"mat-button-toggle-ripple\\\" matRipple\\n     [matRippleTrigger]=\\\"button\\\"\\n     [matRippleDisabled]=\\\"this.disableRipple || this.disabled\\\">\\n</span>\\n\",\n                    encapsulation: core.ViewEncapsulation.None,\n                    exportAs: 'matButtonToggle',\n                    changeDetection: core.ChangeDetectionStrategy.OnPush,\n                    inputs: ['disableRipple'],\n                    host: {\n                        '[class.mat-button-toggle-standalone]': '!buttonToggleGroup',\n                        '[class.mat-button-toggle-checked]': 'checked',\n                        '[class.mat-button-toggle-disabled]': 'disabled',\n                        '[class.mat-button-toggle-appearance-standard]': 'appearance === \"standard\"',\n                        'class': 'mat-button-toggle',\n                        '[attr.aria-label]': 'null',\n                        '[attr.aria-labelledby]': 'null',\n                        '[attr.id]': 'id',\n                        '[attr.name]': 'null',\n                        '(focus)': 'focus()',\n                        'role': 'presentation',\n                    },\n                    styles: [\".mat-button-toggle-standalone,.mat-button-toggle-group{position:relative;display:inline-flex;flex-direction:row;white-space:nowrap;overflow:hidden;border-radius:2px;-webkit-tap-highlight-color:transparent}.cdk-high-contrast-active .mat-button-toggle-standalone,.cdk-high-contrast-active .mat-button-toggle-group{outline:solid 1px}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border-radius:4px}.cdk-high-contrast-active .mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.cdk-high-contrast-active .mat-button-toggle-group-appearance-standard{outline:0}.mat-button-toggle-vertical{flex-direction:column}.mat-button-toggle-vertical .mat-button-toggle-label-content{display:block}.mat-button-toggle{white-space:nowrap;position:relative}.mat-button-toggle .mat-icon svg{vertical-align:top}.mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:1}.cdk-high-contrast-active .mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:.5}.mat-button-toggle-appearance-standard:not(.mat-button-toggle-disabled):hover .mat-button-toggle-focus-overlay{opacity:.04}.mat-button-toggle-appearance-standard.cdk-keyboard-focused:not(.mat-button-toggle-disabled) .mat-button-toggle-focus-overlay{opacity:.12}.cdk-high-contrast-active .mat-button-toggle-appearance-standard.cdk-keyboard-focused:not(.mat-button-toggle-disabled) .mat-button-toggle-focus-overlay{opacity:.5}@media(hover: none){.mat-button-toggle-appearance-standard:not(.mat-button-toggle-disabled):hover .mat-button-toggle-focus-overlay{display:none}}.mat-button-toggle-label-content{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:inline-block;line-height:36px;padding:0 16px;position:relative}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{padding:0 12px}.mat-button-toggle-label-content>*{vertical-align:middle}.mat-button-toggle-focus-overlay{border-radius:inherit;pointer-events:none;opacity:0;top:0;left:0;right:0;bottom:0;position:absolute}.mat-button-toggle-checked .mat-button-toggle-focus-overlay{border-bottom:solid 36px}.cdk-high-contrast-active .mat-button-toggle-checked .mat-button-toggle-focus-overlay{opacity:.5;height:0}.cdk-high-contrast-active .mat-button-toggle-checked.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{border-bottom:solid 500px}.mat-button-toggle .mat-button-toggle-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-toggle-button{border:0;background:none;color:inherit;padding:0;margin:0;font:inherit;outline:none;width:100%;cursor:pointer}.mat-button-toggle-disabled .mat-button-toggle-button{cursor:default}.mat-button-toggle-button::-moz-focus-inner{border:0}\\n\"]\n                },] }\n    ];\n    MatButtonToggle.ctorParameters = function () { return [\n        { type: MatButtonToggleGroup, decorators: [{ type: core.Optional }, { type: core.Inject, args: [MAT_BUTTON_TOGGLE_GROUP,] }] },\n        { type: core.ChangeDetectorRef },\n        { type: core.ElementRef },\n        { type: a11y.FocusMonitor },\n        { type: String, decorators: [{ type: core.Attribute, args: ['tabindex',] }] },\n        { type: undefined, decorators: [{ type: core.Optional }, { type: core.Inject, args: [MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS,] }] }\n    ]; };\n    MatButtonToggle.propDecorators = {\n        ariaLabel: [{ type: core.Input, args: ['aria-label',] }],\n        ariaLabelledby: [{ type: core.Input, args: ['aria-labelledby',] }],\n        _buttonElement: [{ type: core.ViewChild, args: ['button',] }],\n        id: [{ type: core.Input }],\n        name: [{ type: core.Input }],\n        value: [{ type: core.Input }],\n        tabIndex: [{ type: core.Input }],\n        appearance: [{ type: core.Input }],\n        checked: [{ type: core.Input }],\n        disabled: [{ type: core.Input }],\n        change: [{ type: core.Output }]\n    };\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n    var MatButtonToggleModule = /** @class */ (function () {\n        function MatButtonToggleModule() {\n        }\n        return MatButtonToggleModule;\n    }());\n    MatButtonToggleModule.decorators = [\n        { type: core.NgModule, args: [{\n                    imports: [core$1.MatCommonModule, core$1.MatRippleModule],\n                    exports: [core$1.MatCommonModule, MatButtonToggleGroup, MatButtonToggle],\n                    declarations: [MatButtonToggleGroup, MatButtonToggle],\n                },] }\n    ];\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * Generated bundle index. Do not edit.\n     */\n\n    exports.MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS = MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS;\n    exports.MAT_BUTTON_TOGGLE_GROUP = MAT_BUTTON_TOGGLE_GROUP;\n    exports.MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR = MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR;\n    exports.MatButtonToggle = MatButtonToggle;\n    exports.MatButtonToggleChange = MatButtonToggleChange;\n    exports.MatButtonToggleGroup = MatButtonToggleGroup;\n    exports.MatButtonToggleModule = MatButtonToggleModule;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=material-button-toggle.umd.js.map\n"]}