UNPKG

@angular/material

Version:
946 lines 75.8 kB
/** * @fileoverview added by tsickle * Generated from: src/material/radio/radio.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { FocusMonitor } from '@angular/cdk/a11y'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { UniqueSelectionDispatcher } from '@angular/cdk/collections'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, Directive, ElementRef, EventEmitter, forwardRef, Inject, InjectionToken, Input, Optional, Output, QueryList, ViewChild, ViewEncapsulation, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { mixinDisableRipple, mixinTabIndex, } from '@angular/material/core'; import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations'; /** * @record */ export function MatRadioDefaultOptions() { } if (false) { /** @type {?} */ MatRadioDefaultOptions.prototype.color; } /** @type {?} */ export const MAT_RADIO_DEFAULT_OPTIONS = new InjectionToken('mat-radio-default-options', { providedIn: 'root', factory: MAT_RADIO_DEFAULT_OPTIONS_FACTORY }); /** * @return {?} */ export function MAT_RADIO_DEFAULT_OPTIONS_FACTORY() { return { color: 'accent' }; } // Increasing integer for generating unique ids for radio components. /** @type {?} */ let nextUniqueId = 0; /** * Provider Expression that allows mat-radio-group to register as a ControlValueAccessor. This * allows it to support [(ngModel)] and ngControl. * \@docs-private * @type {?} */ export const MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => MatRadioGroup)), multi: true }; /** * Change event object emitted by MatRadio and MatRadioGroup. */ export class MatRadioChange { /** * @param {?} source * @param {?} value */ constructor(source, value) { this.source = source; this.value = value; } } if (false) { /** * The MatRadioButton that emits the change event. * @type {?} */ MatRadioChange.prototype.source; /** * The value of the MatRadioButton. * @type {?} */ MatRadioChange.prototype.value; } /** * A group of radio buttons. May contain one or more `<mat-radio-button>` elements. */ export class MatRadioGroup { /** * @param {?} _changeDetector */ constructor(_changeDetector) { this._changeDetector = _changeDetector; /** * Selected value for the radio group. */ this._value = null; /** * The HTML name attribute applied to radio buttons in this group. */ this._name = `mat-radio-group-${nextUniqueId++}`; /** * The currently selected radio button. Should match value. */ this._selected = null; /** * Whether the `value` has been set to its initial value. */ this._isInitialized = false; /** * Whether the labels should appear after or before the radio-buttons. Defaults to 'after' */ this._labelPosition = 'after'; /** * Whether the radio group is disabled. */ this._disabled = false; /** * Whether the radio group is required. */ this._required = false; /** * The method to be called in order to update ngModel */ this._controlValueAccessorChangeFn = (/** * @return {?} */ () => { }); /** * onTouch function registered via registerOnTouch (ControlValueAccessor). * \@docs-private */ this.onTouched = (/** * @return {?} */ () => { }); /** * Event emitted when the group value changes. * Change events are only emitted when the value changes due to user interaction with * a radio button (the same behavior as `<input type-"radio">`). */ this.change = new EventEmitter(); } /** * Name of the radio button group. All radio buttons inside this group will use this name. * @return {?} */ get name() { return this._name; } /** * @param {?} value * @return {?} */ set name(value) { this._name = value; this._updateRadioButtonNames(); } /** * Whether the labels should appear after or before the radio-buttons. Defaults to 'after' * @return {?} */ get labelPosition() { return this._labelPosition; } /** * @param {?} v * @return {?} */ set labelPosition(v) { this._labelPosition = v === 'before' ? 'before' : 'after'; this._markRadiosForCheck(); } /** * Value for the radio-group. Should equal the value of the selected radio button if there is * a corresponding radio button with a matching value. If there is not such a corresponding * radio button, this value persists to be applied in case a new radio button is added with a * matching value. * @return {?} */ get value() { return this._value; } /** * @param {?} newValue * @return {?} */ set value(newValue) { if (this._value !== newValue) { // Set this before proceeding to ensure no circular loop occurs with selection. this._value = newValue; this._updateSelectedRadioFromValue(); this._checkSelectedRadioButton(); } } /** * @return {?} */ _checkSelectedRadioButton() { if (this._selected && !this._selected.checked) { this._selected.checked = true; } } /** * The currently selected radio button. If set to a new radio button, the radio group value * will be updated to match the new selected button. * @return {?} */ get selected() { return this._selected; } /** * @param {?} selected * @return {?} */ set selected(selected) { this._selected = selected; this.value = selected ? selected.value : null; this._checkSelectedRadioButton(); } /** * Whether the radio group is disabled * @return {?} */ get disabled() { return this._disabled; } /** * @param {?} value * @return {?} */ set disabled(value) { this._disabled = coerceBooleanProperty(value); this._markRadiosForCheck(); } /** * Whether the radio group is required * @return {?} */ get required() { return this._required; } /** * @param {?} value * @return {?} */ set required(value) { this._required = coerceBooleanProperty(value); this._markRadiosForCheck(); } /** * Initialize properties once content children are available. * This allows us to propagate relevant attributes to associated buttons. * @return {?} */ ngAfterContentInit() { // Mark this component as initialized in AfterContentInit because the initial value can // possibly be set by NgModel on MatRadioGroup, and it is possible that the OnInit of the // NgModel occurs *after* the OnInit of the MatRadioGroup. this._isInitialized = true; } /** * Mark this group as being "touched" (for ngModel). Meant to be called by the contained * radio buttons upon their blur. * @return {?} */ _touch() { if (this.onTouched) { this.onTouched(); } } /** * @private * @return {?} */ _updateRadioButtonNames() { if (this._radios) { this._radios.forEach((/** * @param {?} radio * @return {?} */ radio => { radio.name = this.name; radio._markForCheck(); })); } } /** * Updates the `selected` radio button from the internal _value state. * @private * @return {?} */ _updateSelectedRadioFromValue() { // If the value already matches the selected radio, do nothing. /** @type {?} */ const isAlreadySelected = this._selected !== null && this._selected.value === this._value; if (this._radios && !isAlreadySelected) { this._selected = null; this._radios.forEach((/** * @param {?} radio * @return {?} */ radio => { radio.checked = this.value === radio.value; if (radio.checked) { this._selected = radio; } })); } } /** * Dispatch change event with current selection and group value. * @return {?} */ _emitChangeEvent() { if (this._isInitialized) { this.change.emit(new MatRadioChange((/** @type {?} */ (this._selected)), this._value)); } } /** * @return {?} */ _markRadiosForCheck() { if (this._radios) { this._radios.forEach((/** * @param {?} radio * @return {?} */ radio => radio._markForCheck())); } } /** * Sets the model value. Implemented as part of ControlValueAccessor. * @param {?} value * @return {?} */ writeValue(value) { this.value = value; this._changeDetector.markForCheck(); } /** * Registers a callback to be triggered when the model value changes. * Implemented as part of ControlValueAccessor. * @param {?} fn Callback to be registered. * @return {?} */ registerOnChange(fn) { this._controlValueAccessorChangeFn = fn; } /** * Registers a callback to be triggered when the control is touched. * Implemented as part of ControlValueAccessor. * @param {?} fn Callback to be registered. * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * Sets the disabled state of the control. Implemented as a part of ControlValueAccessor. * @param {?} isDisabled Whether the control should be disabled. * @return {?} */ setDisabledState(isDisabled) { this.disabled = isDisabled; this._changeDetector.markForCheck(); } } MatRadioGroup.decorators = [ { type: Directive, args: [{ selector: 'mat-radio-group', exportAs: 'matRadioGroup', providers: [MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR], host: { 'role': 'radiogroup', 'class': 'mat-radio-group', }, },] } ]; /** @nocollapse */ MatRadioGroup.ctorParameters = () => [ { type: ChangeDetectorRef } ]; MatRadioGroup.propDecorators = { change: [{ type: Output }], _radios: [{ type: ContentChildren, args: [forwardRef((/** * @return {?} */ () => MatRadioButton)), { descendants: true },] }], color: [{ type: Input }], name: [{ type: Input }], labelPosition: [{ type: Input }], value: [{ type: Input }], selected: [{ type: Input }], disabled: [{ type: Input }], required: [{ type: Input }] }; if (false) { /** @type {?} */ MatRadioGroup.ngAcceptInputType_disabled; /** @type {?} */ MatRadioGroup.ngAcceptInputType_required; /** * Selected value for the radio group. * @type {?} * @private */ MatRadioGroup.prototype._value; /** * The HTML name attribute applied to radio buttons in this group. * @type {?} * @private */ MatRadioGroup.prototype._name; /** * The currently selected radio button. Should match value. * @type {?} * @private */ MatRadioGroup.prototype._selected; /** * Whether the `value` has been set to its initial value. * @type {?} * @private */ MatRadioGroup.prototype._isInitialized; /** * Whether the labels should appear after or before the radio-buttons. Defaults to 'after' * @type {?} * @private */ MatRadioGroup.prototype._labelPosition; /** * Whether the radio group is disabled. * @type {?} * @private */ MatRadioGroup.prototype._disabled; /** * Whether the radio group is required. * @type {?} * @private */ MatRadioGroup.prototype._required; /** * The method to be called in order to update ngModel * @type {?} */ MatRadioGroup.prototype._controlValueAccessorChangeFn; /** * onTouch function registered via registerOnTouch (ControlValueAccessor). * \@docs-private * @type {?} */ MatRadioGroup.prototype.onTouched; /** * Event emitted when the group value changes. * Change events are only emitted when the value changes due to user interaction with * a radio button (the same behavior as `<input type-"radio">`). * @type {?} */ MatRadioGroup.prototype.change; /** * Child radio buttons. * @type {?} */ MatRadioGroup.prototype._radios; /** * Theme color for all of the radio buttons in the group. * @type {?} */ MatRadioGroup.prototype.color; /** * @type {?} * @private */ MatRadioGroup.prototype._changeDetector; } // Boilerplate for applying mixins to MatRadioButton. /** * \@docs-private */ class MatRadioButtonBase { /** * @param {?} _elementRef */ constructor(_elementRef) { this._elementRef = _elementRef; } } if (false) { /** @type {?} */ MatRadioButtonBase.prototype.disabled; /** @type {?} */ MatRadioButtonBase.prototype._elementRef; } // As per Material design specifications the selection control radio should use the accent color // palette by default. https://material.io/guidelines/components/selection-controls.html /** @type {?} */ const _MatRadioButtonMixinBase = mixinDisableRipple(mixinTabIndex(MatRadioButtonBase)); /** * A Material design radio-button. Typically placed inside of `<mat-radio-group>` elements. */ export class MatRadioButton extends _MatRadioButtonMixinBase { /** * @param {?} radioGroup * @param {?} elementRef * @param {?} _changeDetector * @param {?} _focusMonitor * @param {?} _radioDispatcher * @param {?=} _animationMode * @param {?=} _providerOverride */ constructor(radioGroup, elementRef, _changeDetector, _focusMonitor, _radioDispatcher, _animationMode, _providerOverride) { super(elementRef); this._changeDetector = _changeDetector; this._focusMonitor = _focusMonitor; this._radioDispatcher = _radioDispatcher; this._animationMode = _animationMode; this._providerOverride = _providerOverride; this._uniqueId = `mat-radio-${++nextUniqueId}`; /** * The unique ID for the radio button. */ this.id = this._uniqueId; /** * Event emitted when the checked state of this radio button changes. * Change events are only emitted when the value changes due to user interaction with * the radio button (the same behavior as `<input type-"radio">`). */ this.change = new EventEmitter(); /** * Whether this radio is checked. */ this._checked = false; /** * Value assigned to this radio. */ this._value = null; /** * Unregister function for _radioDispatcher */ this._removeUniqueSelectionListener = (/** * @return {?} */ () => { }); // Assertions. Ideally these should be stripped out by the compiler. // TODO(jelbourn): Assert that there's no name binding AND a parent radio group. this.radioGroup = radioGroup; this._removeUniqueSelectionListener = _radioDispatcher.listen((/** * @param {?} id * @param {?} name * @return {?} */ (id, name) => { if (id !== this.id && name === this.name) { this.checked = false; } })); } /** * Whether this radio button is checked. * @return {?} */ get checked() { return this._checked; } /** * @param {?} value * @return {?} */ set checked(value) { /** @type {?} */ const newCheckedState = coerceBooleanProperty(value); if (this._checked !== newCheckedState) { this._checked = newCheckedState; if (newCheckedState && this.radioGroup && this.radioGroup.value !== this.value) { this.radioGroup.selected = this; } else if (!newCheckedState && this.radioGroup && this.radioGroup.value === this.value) { // When unchecking the selected radio button, update the selected radio // property on the group. this.radioGroup.selected = null; } if (newCheckedState) { // Notify all radio buttons with the same name to un-check. this._radioDispatcher.notify(this.id, this.name); } this._changeDetector.markForCheck(); } } /** * The value of this radio button. * @return {?} */ get value() { return this._value; } /** * @param {?} value * @return {?} */ set value(value) { if (this._value !== value) { this._value = value; if (this.radioGroup !== null) { if (!this.checked) { // Update checked when the value changed to match the radio group's value this.checked = this.radioGroup.value === value; } if (this.checked) { this.radioGroup.selected = this; } } } } /** * Whether the label should appear after or before the radio button. Defaults to 'after' * @return {?} */ get labelPosition() { return this._labelPosition || (this.radioGroup && this.radioGroup.labelPosition) || 'after'; } /** * @param {?} value * @return {?} */ set labelPosition(value) { this._labelPosition = value; } /** * Whether the radio button is disabled. * @return {?} */ get disabled() { return this._disabled || (this.radioGroup !== null && this.radioGroup.disabled); } /** * @param {?} value * @return {?} */ set disabled(value) { /** @type {?} */ const newDisabledState = coerceBooleanProperty(value); if (this._disabled !== newDisabledState) { this._disabled = newDisabledState; this._changeDetector.markForCheck(); } } /** * Whether the radio button is required. * @return {?} */ get required() { return this._required || (this.radioGroup && this.radioGroup.required); } /** * @param {?} value * @return {?} */ set required(value) { this._required = coerceBooleanProperty(value); } /** * Theme color of the radio button. * @return {?} */ get color() { return this._color || (this.radioGroup && this.radioGroup.color) || this._providerOverride && this._providerOverride.color || 'accent'; } /** * @param {?} newValue * @return {?} */ set color(newValue) { this._color = newValue; } /** * ID of the native input element inside `<mat-radio-button>` * @return {?} */ get inputId() { return `${this.id || this._uniqueId}-input`; } /** * Focuses the radio button. * @param {?=} options * @return {?} */ focus(options) { this._focusMonitor.focusVia(this._inputElement, 'keyboard', options); } /** * Marks the radio button as needing checking for change detection. * This method is exposed because the parent radio group will directly * update bound properties of the radio button. * @return {?} */ _markForCheck() { // When group value changes, the button will not be notified. Use `markForCheck` to explicit // update radio button's status this._changeDetector.markForCheck(); } /** * @return {?} */ ngOnInit() { if (this.radioGroup) { // If the radio is inside a radio group, determine if it should be checked this.checked = this.radioGroup.value === this._value; // Copy name from parent radio group this.name = this.radioGroup.name; } } /** * @return {?} */ ngAfterViewInit() { this._focusMonitor .monitor(this._elementRef, true) .subscribe((/** * @param {?} focusOrigin * @return {?} */ focusOrigin => { if (!focusOrigin && this.radioGroup) { this.radioGroup._touch(); } })); } /** * @return {?} */ ngOnDestroy() { this._focusMonitor.stopMonitoring(this._elementRef); this._removeUniqueSelectionListener(); } /** * Dispatch change event with current value. * @private * @return {?} */ _emitChangeEvent() { this.change.emit(new MatRadioChange(this, this._value)); } /** * @return {?} */ _isRippleDisabled() { return this.disableRipple || this.disabled; } /** * @param {?} event * @return {?} */ _onInputClick(event) { // We have to stop propagation for click events on the visual hidden input element. // By default, when a user clicks on a label element, a generated click event will be // dispatched on the associated input element. Since we are using a label element as our // root container, the click event on the `radio-button` will be executed twice. // The real click event will bubble up, and the generated click event also tries to bubble up. // This will lead to multiple click events. // Preventing bubbling for the second event will solve that issue. event.stopPropagation(); } /** * Triggered when the radio button received a click or the input recognized any change. * Clicking on a label element, will trigger a change event on the associated input. * @param {?} event * @return {?} */ _onInputChange(event) { // We always have to stop propagation on the change event. // Otherwise the change event, from the input element, will bubble up and // emit its event object to the `change` output. event.stopPropagation(); /** @type {?} */ const groupValueChanged = this.radioGroup && this.value !== this.radioGroup.value; this.checked = true; this._emitChangeEvent(); if (this.radioGroup) { this.radioGroup._controlValueAccessorChangeFn(this.value); if (groupValueChanged) { this.radioGroup._emitChangeEvent(); } } } } MatRadioButton.decorators = [ { type: Component, args: [{ selector: 'mat-radio-button', template: "<!-- TODO(jelbourn): render the radio on either side of the content -->\n<!-- TODO(mtlin): Evaluate trade-offs of using native radio vs. cost of additional bindings. -->\n<label [attr.for]=\"inputId\" class=\"mat-radio-label\" #label>\n <!-- The actual 'radio' part of the control. -->\n <div class=\"mat-radio-container\">\n <div class=\"mat-radio-outer-circle\"></div>\n <div class=\"mat-radio-inner-circle\"></div>\n <div mat-ripple class=\"mat-radio-ripple\"\n [matRippleTrigger]=\"label\"\n [matRippleDisabled]=\"_isRippleDisabled()\"\n [matRippleCentered]=\"true\"\n [matRippleRadius]=\"20\"\n [matRippleAnimation]=\"{enterDuration: 150}\">\n\n <div class=\"mat-ripple-element mat-radio-persistent-ripple\"></div>\n </div>\n\n <input #input class=\"mat-radio-input cdk-visually-hidden\" type=\"radio\"\n [id]=\"inputId\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [tabIndex]=\"tabIndex\"\n [attr.name]=\"name\"\n [attr.value]=\"value\"\n [required]=\"required\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n [attr.aria-describedby]=\"ariaDescribedby\"\n (change)=\"_onInputChange($event)\"\n (click)=\"_onInputClick($event)\">\n </div>\n\n <!-- The label content for radio control. -->\n <div class=\"mat-radio-label-content\" [class.mat-radio-label-before]=\"labelPosition == 'before'\">\n <!-- Add an invisible span so JAWS can read the label -->\n <span style=\"display:none\">&nbsp;</span>\n <ng-content></ng-content>\n </div>\n</label>\n", inputs: ['disableRipple', 'tabIndex'], encapsulation: ViewEncapsulation.None, exportAs: 'matRadioButton', host: { 'class': 'mat-radio-button', '[class.mat-radio-checked]': 'checked', '[class.mat-radio-disabled]': 'disabled', '[class._mat-animation-noopable]': '_animationMode === "NoopAnimations"', '[class.mat-primary]': 'color === "primary"', '[class.mat-accent]': 'color === "accent"', '[class.mat-warn]': 'color === "warn"', // Needs to be -1 so the `focus` event still fires. '[attr.tabindex]': '-1', '[attr.id]': 'id', '[attr.aria-label]': 'null', '[attr.aria-labelledby]': 'null', '[attr.aria-describedby]': 'null', // Note: under normal conditions focus shouldn't land on this element, however it may be // programmatically set, for example inside of a focus trap, in this case we want to forward // the focus to the native element. '(focus)': '_inputElement.nativeElement.focus()', }, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".mat-radio-button{display:inline-block;-webkit-tap-highlight-color:transparent;outline:0}.mat-radio-label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;display:inline-flex;align-items:center;white-space:nowrap;vertical-align:middle;width:100%}.mat-radio-container{box-sizing:border-box;display:inline-block;position:relative;width:20px;height:20px;flex-shrink:0}.mat-radio-outer-circle{box-sizing:border-box;height:20px;left:0;position:absolute;top:0;transition:border-color ease 280ms;width:20px;border-width:2px;border-style:solid;border-radius:50%}._mat-animation-noopable .mat-radio-outer-circle{transition:none}.mat-radio-inner-circle{border-radius:50%;box-sizing:border-box;height:20px;left:0;position:absolute;top:0;transition:transform ease 280ms,background-color ease 280ms;width:20px;transform:scale(0.001)}._mat-animation-noopable .mat-radio-inner-circle{transition:none}.mat-radio-checked .mat-radio-inner-circle{transform:scale(0.5)}.cdk-high-contrast-active .mat-radio-checked .mat-radio-inner-circle{border:solid 10px}.mat-radio-label-content{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto;display:inline-block;order:0;line-height:inherit;padding-left:8px;padding-right:0}[dir=rtl] .mat-radio-label-content{padding-right:8px;padding-left:0}.mat-radio-label-content.mat-radio-label-before{order:-1;padding-left:0;padding-right:8px}[dir=rtl] .mat-radio-label-content.mat-radio-label-before{padding-right:0;padding-left:8px}.mat-radio-disabled,.mat-radio-disabled .mat-radio-label{cursor:default}.mat-radio-button .mat-radio-ripple{position:absolute;left:calc(50% - 20px);top:calc(50% - 20px);height:40px;width:40px;z-index:1;pointer-events:none}.mat-radio-button .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple){opacity:.16}.mat-radio-persistent-ripple{width:100%;height:100%;transform:none}.mat-radio-container:hover .mat-radio-persistent-ripple{opacity:.04}.mat-radio-button:not(.mat-radio-disabled).cdk-keyboard-focused .mat-radio-persistent-ripple,.mat-radio-button:not(.mat-radio-disabled).cdk-program-focused .mat-radio-persistent-ripple{opacity:.12}.mat-radio-persistent-ripple,.mat-radio-disabled .mat-radio-container:hover .mat-radio-persistent-ripple{opacity:0}@media(hover: none){.mat-radio-container:hover .mat-radio-persistent-ripple{display:none}}.mat-radio-input{bottom:0;left:50%}.cdk-high-contrast-active .mat-radio-disabled{opacity:.5}\n"] }] } ]; /** @nocollapse */ MatRadioButton.ctorParameters = () => [ { type: MatRadioGroup, decorators: [{ type: Optional }] }, { type: ElementRef }, { type: ChangeDetectorRef }, { type: FocusMonitor }, { type: UniqueSelectionDispatcher }, { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_RADIO_DEFAULT_OPTIONS,] }] } ]; MatRadioButton.propDecorators = { id: [{ type: Input }], name: [{ type: Input }], ariaLabel: [{ type: Input, args: ['aria-label',] }], ariaLabelledby: [{ type: Input, args: ['aria-labelledby',] }], ariaDescribedby: [{ type: Input, args: ['aria-describedby',] }], checked: [{ type: Input }], value: [{ type: Input }], labelPosition: [{ type: Input }], disabled: [{ type: Input }], required: [{ type: Input }], color: [{ type: Input }], change: [{ type: Output }], _inputElement: [{ type: ViewChild, args: ['input',] }] }; if (false) { /** @type {?} */ MatRadioButton.ngAcceptInputType_checked; /** @type {?} */ MatRadioButton.ngAcceptInputType_disabled; /** @type {?} */ MatRadioButton.ngAcceptInputType_required; /** @type {?} */ MatRadioButton.ngAcceptInputType_disableRipple; /** * @type {?} * @private */ MatRadioButton.prototype._uniqueId; /** * The unique ID for the radio button. * @type {?} */ MatRadioButton.prototype.id; /** * Analog to HTML 'name' attribute used to group radios for unique selection. * @type {?} */ MatRadioButton.prototype.name; /** * Used to set the 'aria-label' attribute on the underlying input element. * @type {?} */ MatRadioButton.prototype.ariaLabel; /** * The 'aria-labelledby' attribute takes precedence as the element's text alternative. * @type {?} */ MatRadioButton.prototype.ariaLabelledby; /** * The 'aria-describedby' attribute is read after the element's label and field type. * @type {?} */ MatRadioButton.prototype.ariaDescribedby; /** * @type {?} * @private */ MatRadioButton.prototype._labelPosition; /** * @type {?} * @private */ MatRadioButton.prototype._color; /** * Event emitted when the checked state of this radio button changes. * Change events are only emitted when the value changes due to user interaction with * the radio button (the same behavior as `<input type-"radio">`). * @type {?} */ MatRadioButton.prototype.change; /** * The parent radio group. May or may not be present. * @type {?} */ MatRadioButton.prototype.radioGroup; /** * Whether this radio is checked. * @type {?} * @private */ MatRadioButton.prototype._checked; /** * Whether this radio is disabled. * @type {?} * @private */ MatRadioButton.prototype._disabled; /** * Whether this radio is required. * @type {?} * @private */ MatRadioButton.prototype._required; /** * Value assigned to this radio. * @type {?} * @private */ MatRadioButton.prototype._value; /** * Unregister function for _radioDispatcher * @type {?} * @private */ MatRadioButton.prototype._removeUniqueSelectionListener; /** * The native `<input type=radio>` element * @type {?} */ MatRadioButton.prototype._inputElement; /** * @type {?} * @private */ MatRadioButton.prototype._changeDetector; /** * @type {?} * @private */ MatRadioButton.prototype._focusMonitor; /** * @type {?} * @private */ MatRadioButton.prototype._radioDispatcher; /** @type {?} */ MatRadioButton.prototype._animationMode; /** * @type {?} * @private */ MatRadioButton.prototype._providerOverride; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwvcmFkaW8vcmFkaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBZSxxQkFBcUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFFLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFHTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF1QixpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFLTCxrQkFBa0IsRUFDbEIsYUFBYSxHQUVkLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sc0NBQXNDLENBQUM7Ozs7QUFHM0UsNENBRUM7OztJQURDLHVDQUFvQjs7O0FBR3RCLE1BQU0sT0FBTyx5QkFBeUIsR0FDcEMsSUFBSSxjQUFjLENBQXlCLDJCQUEyQixFQUFFO0lBQ3hFLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxpQ0FBaUM7Q0FDM0MsQ0FBQzs7OztBQUVGLE1BQU0sVUFBVSxpQ0FBaUM7SUFDL0MsT0FBTztRQUNMLEtBQUssRUFBRSxRQUFRO0tBQ2hCLENBQUM7QUFDSixDQUFDOzs7SUFHRyxZQUFZLEdBQUcsQ0FBQzs7Ozs7OztBQU9wQixNQUFNLE9BQU8sc0NBQXNDLEdBQVE7SUFD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QUssU0FBQyxrQkFBa0I7c0JBR3hCLEtBQUs7b0JBd0JMLEtBQUs7NEJBa0JMLEtBQUs7dUJBVUwsS0FBSzt1QkFhTCxLQUFLO29CQVNMLEtBQUs7cUJBY0wsTUFBTTs0QkF3Qk4sU0FBUyxTQUFDLE9BQU87Ozs7SUEwR2xCLHlDQUErQzs7SUFDL0MsMENBQWdEOztJQUNoRCwwQ0FBZ0Q7O0lBQ2hELCtDQUFxRDs7Ozs7SUEvT3JELG1DQUEwRDs7Ozs7SUFHMUQsNEJBQXFDOzs7OztJQUdyQyw4QkFBc0I7Ozs7O0lBR3RCLG1DQUF1Qzs7Ozs7SUFHdkMsd0NBQWlEOzs7OztJQUdqRCx5Q0FBbUQ7Ozs7O0lBb0RuRCx3Q0FBMkM7Ozs7O0lBZ0MzQyxnQ0FBNkI7Ozs7Ozs7SUFPN0IsZ0NBQTZGOzs7OztJQUc3RixvQ0FBMEI7Ozs7OztJQU0xQixrQ0FBa0M7Ozs7OztJQUdsQyxtQ0FBMkI7Ozs7OztJQUczQixtQ0FBMkI7Ozs7OztJQUczQixnQ0FBMkI7Ozs7OztJQUczQix3REFBOEQ7Ozs7O0lBRzlELHVDQUFnRTs7Ozs7SUFJcEQseUNBQTBDOzs7OztJQUMxQyx1Q0FBbUM7Ozs7O0lBQ25DLDBDQUFtRDs7SUFDbkQsd0NBQXlFOzs7OztJQUN2RSwyQ0FDa0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtGb2N1c01vbml0b3J9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7Qm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1VuaXF1ZVNlbGVjdGlvbkRpc3BhdGNoZXJ9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0LFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIENhbkRpc2FibGVSaXBwbGUsXG4gIENhbkRpc2FibGVSaXBwbGVDdG9yLFxuICBIYXNUYWJJbmRleCxcbiAgSGFzVGFiSW5kZXhDdG9yLFxuICBtaXhpbkRpc2FibGVSaXBwbGUsXG4gIG1peGluVGFiSW5kZXgsXG4gIFRoZW1lUGFsZXR0ZSxcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQge0FOSU1BVElPTl9NT0RVTEVfVFlQRX0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci9hb