UNPKG

@angular/material

Version:
1 lines 45.3 kB
{"version":3,"file":"radio.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/radio/radio.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/radio/radio.html","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/radio/radio-module.ts"],"sourcesContent":["/**\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.dev/license\n */\n\nimport {_IdGenerator, FocusMonitor, FocusOrigin} from '@angular/cdk/a11y';\nimport {UniqueSelectionDispatcher} from '@angular/cdk/collections';\nimport {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n Directive,\n DoCheck,\n ElementRef,\n EventEmitter,\n InjectionToken,\n Injector,\n Input,\n NgZone,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n afterNextRender,\n booleanAttribute,\n forwardRef,\n inject,\n numberAttribute,\n HostAttributeToken,\n Renderer2,\n} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {\n MatRipple,\n ThemePalette,\n _MatInternalFormField,\n _StructuralStylesLoader,\n _animationsDisabled,\n} from '../core';\nimport {Subscription} from 'rxjs';\nimport {_CdkPrivateStyleLoader} from '@angular/cdk/private';\n\n/** Change event object emitted by radio button and radio group. */\nexport class MatRadioChange<T = any> {\n constructor(\n /** The radio button that emits the change event. */\n public source: MatRadioButton,\n /** The value of the radio button. */\n public value: T,\n ) {}\n}\n\n/**\n * Provider Expression that allows mat-radio-group to register as a ControlValueAccessor. This\n * allows it to support [(ngModel)] and ngControl.\n * @docs-private\n */\nexport const MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatRadioGroup),\n multi: true,\n};\n\n/**\n * Injection token that can be used to inject instances of `MatRadioGroup`. It serves as\n * alternative token to the actual `MatRadioGroup` class which could cause unnecessary\n * retention of the class and its component metadata.\n */\nexport const MAT_RADIO_GROUP = new InjectionToken<MatRadioGroup>('MatRadioGroup');\n\nexport interface MatRadioDefaultOptions {\n /**\n * Theme color of the radio button. This API is supported in M2 themes only, it\n * has no effect in M3 themes. For color customization in M3, see https://material.angular.dev/components/radio/styling.\n *\n * For information on applying color variants in M3, see\n * https://material.angular.dev/guide/material-2-theming#optional-add-backwards-compatibility-styles-for-color-variants\n */\n color: ThemePalette;\n\n /** Whether disabled radio buttons should be interactive. */\n disabledInteractive?: boolean;\n}\n\nexport const MAT_RADIO_DEFAULT_OPTIONS = new InjectionToken<MatRadioDefaultOptions>(\n 'mat-radio-default-options',\n {\n providedIn: 'root',\n factory: () => ({\n color: 'accent',\n disabledInteractive: false,\n }),\n },\n);\n\n/**\n * A group of radio buttons. May contain one or more `<mat-radio-button>` elements.\n */\n@Directive({\n selector: 'mat-radio-group',\n exportAs: 'matRadioGroup',\n providers: [\n MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR,\n {provide: MAT_RADIO_GROUP, useExisting: MatRadioGroup},\n ],\n host: {\n 'role': 'radiogroup',\n 'class': 'mat-mdc-radio-group',\n },\n})\nexport class MatRadioGroup implements AfterContentInit, OnDestroy, ControlValueAccessor {\n private _changeDetector = inject(ChangeDetectorRef);\n\n /** Selected value for the radio group. */\n private _value: any = null;\n\n /** The HTML name attribute applied to radio buttons in this group. */\n private _name: string = inject(_IdGenerator).getId('mat-radio-group-');\n\n /** The currently selected radio button. Should match value. */\n private _selected: MatRadioButton | null = null;\n\n /** Whether the `value` has been set to its initial value. */\n private _isInitialized: boolean = false;\n\n /** Whether the labels should appear after or before the radio-buttons. Defaults to 'after' */\n private _labelPosition: 'before' | 'after' = 'after';\n\n /** Whether the radio group is disabled. */\n private _disabled: boolean = false;\n\n /** Whether the radio group is required. */\n private _required: boolean = false;\n\n /** Subscription to changes in amount of radio buttons. */\n private _buttonChanges!: Subscription;\n\n /** The method to be called in order to update ngModel */\n _controlValueAccessorChangeFn: (value: any) => void = () => {};\n\n /**\n * onTouch function registered via registerOnTouch (ControlValueAccessor).\n * @docs-private\n */\n onTouched: () => any = () => {};\n\n /**\n * Event emitted when the group value changes.\n * Change events are only emitted when the value changes due to user interaction with\n * a radio button (the same behavior as `<input type-\"radio\">`).\n */\n @Output() readonly change: EventEmitter<MatRadioChange> = new EventEmitter<MatRadioChange>();\n\n /** Child radio buttons. */\n @ContentChildren(forwardRef(() => MatRadioButton), {descendants: true})\n _radios!: QueryList<MatRadioButton>;\n\n /**\n * Theme color of the radio buttons in the group. This API is supported in M2\n * themes only, it has no effect in M3 themes. For color customization in M3, see https://material.angular.dev/components/radio/styling.\n *\n * For information on applying color variants in M3, see\n * https://material.angular.dev/guide/material-2-theming#optional-add-backwards-compatibility-styles-for-color-variants\n */\n @Input() color!: ThemePalette;\n\n /** Name of the radio button group. All radio buttons inside this group will use this name. */\n @Input()\n get name(): string {\n return this._name;\n }\n set name(value: string) {\n this._name = value;\n this._updateRadioButtonNames();\n }\n\n /** Whether the labels should appear after or before the radio-buttons. Defaults to 'after' */\n @Input()\n get labelPosition(): 'before' | 'after' {\n return this._labelPosition;\n }\n set labelPosition(v) {\n this._labelPosition = v === 'before' ? 'before' : 'after';\n this._markRadiosForCheck();\n }\n\n /**\n * Value for the radio-group. Should equal the value of the selected radio button if there is\n * a corresponding radio button with a matching value. If there is not such a corresponding\n * radio button, this value persists to be applied in case a new radio button is added with a\n * matching value.\n */\n @Input()\n get value(): any {\n return this._value;\n }\n set value(newValue: any) {\n if (this._value !== newValue) {\n // Set this before proceeding to ensure no circular loop occurs with selection.\n this._value = newValue;\n\n this._updateSelectedRadioFromValue();\n this._checkSelectedRadioButton();\n }\n }\n\n _checkSelectedRadioButton() {\n if (this._selected && !this._selected.checked) {\n this._selected.checked = true;\n }\n }\n\n /**\n * The currently selected radio button. If set to a new radio button, the radio group value\n * will be updated to match the new selected button.\n */\n @Input()\n get selected() {\n return this._selected;\n }\n set selected(selected: MatRadioButton | null) {\n this._selected = selected;\n this.value = selected ? selected.value : null;\n this._checkSelectedRadioButton();\n }\n\n /** Whether the radio group is disabled */\n @Input({transform: booleanAttribute})\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value: boolean) {\n this._disabled = value;\n this._markRadiosForCheck();\n }\n\n /** Whether the radio group is required */\n @Input({transform: booleanAttribute})\n get required(): boolean {\n return this._required;\n }\n set required(value: boolean) {\n this._required = value;\n this._markRadiosForCheck();\n }\n\n /** Whether buttons in the group should be interactive while they're disabled. */\n @Input({transform: booleanAttribute})\n get disabledInteractive(): boolean {\n return this._disabledInteractive;\n }\n set disabledInteractive(value: boolean) {\n this._disabledInteractive = value;\n this._markRadiosForCheck();\n }\n private _disabledInteractive = false;\n\n /**\n * Initialize properties once content children are available.\n * This allows us to propagate relevant attributes to associated buttons.\n */\n ngAfterContentInit() {\n // Mark this component as initialized in AfterContentInit because the initial value can\n // possibly be set by NgModel on MatRadioGroup, and it is possible that the OnInit of the\n // NgModel occurs *after* the OnInit of the MatRadioGroup.\n this._isInitialized = true;\n\n // Clear the `selected` button when it's destroyed since the tabindex of the rest of the\n // buttons depends on it. Note that we don't clear the `value`, because the radio button\n // may be swapped out with a similar one and there are some internal apps that depend on\n // that behavior.\n this._buttonChanges = this._radios.changes.subscribe(() => {\n if (this.selected && !this._radios.find(radio => radio === this.selected)) {\n this._selected = null;\n }\n });\n }\n\n ngOnDestroy() {\n this._buttonChanges?.unsubscribe();\n }\n\n /**\n * Mark this group as being \"touched\" (for ngModel). Meant to be called by the contained\n * radio buttons upon their blur.\n */\n _touch() {\n if (this.onTouched) {\n this.onTouched();\n }\n }\n\n private _updateRadioButtonNames(): void {\n if (this._radios) {\n this._radios.forEach(radio => {\n radio.name = this.name;\n radio._markForCheck();\n });\n }\n }\n\n /** Updates the `selected` radio button from the internal _value state. */\n private _updateSelectedRadioFromValue(): void {\n // If the value already matches the selected radio, do nothing.\n const isAlreadySelected = this._selected !== null && this._selected.value === this._value;\n\n if (this._radios && !isAlreadySelected) {\n this._selected = null;\n this._radios.forEach(radio => {\n radio.checked = this.value === radio.value;\n if (radio.checked) {\n this._selected = radio;\n }\n });\n }\n }\n\n /** Dispatch change event with current selection and group value. */\n _emitChangeEvent(): void {\n if (this._isInitialized) {\n this.change.emit(new MatRadioChange(this._selected!, this._value));\n }\n }\n\n _markRadiosForCheck() {\n if (this._radios) {\n this._radios.forEach(radio => radio._markForCheck());\n }\n }\n\n /**\n * Sets the model value. Implemented as part of ControlValueAccessor.\n * @param value\n */\n writeValue(value: any) {\n this.value = value;\n this._changeDetector.markForCheck();\n }\n\n /**\n * Registers a callback to be triggered when the model value changes.\n * Implemented as part of ControlValueAccessor.\n * @param fn Callback to be registered.\n */\n registerOnChange(fn: (value: any) => void) {\n this._controlValueAccessorChangeFn = fn;\n }\n\n /**\n * Registers a callback to be triggered when the control is touched.\n * Implemented as part of ControlValueAccessor.\n * @param fn Callback to be registered.\n */\n registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n /**\n * Sets the disabled state of the control. Implemented as a part of ControlValueAccessor.\n * @param isDisabled Whether the control should be disabled.\n */\n setDisabledState(isDisabled: boolean) {\n this.disabled = isDisabled;\n this._changeDetector.markForCheck();\n }\n}\n\n@Component({\n selector: 'mat-radio-button',\n templateUrl: 'radio.html',\n styleUrl: 'radio.css',\n host: {\n 'class': 'mat-mdc-radio-button',\n '[attr.id]': 'id',\n '[class.mat-primary]': 'color === \"primary\"',\n '[class.mat-accent]': 'color === \"accent\"',\n '[class.mat-warn]': 'color === \"warn\"',\n '[class.mat-mdc-radio-checked]': 'checked',\n '[class.mat-mdc-radio-disabled]': 'disabled',\n '[class.mat-mdc-radio-disabled-interactive]': 'disabledInteractive',\n '[class._mat-animation-noopable]': '_noopAnimations',\n // Needs to be removed since it causes some a11y issues (see #21266).\n '[attr.tabindex]': 'null',\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n '[attr.aria-describedby]': 'null',\n // Note: under normal conditions focus shouldn't land on this element, however it may be\n // programmatically set, for example inside of a focus trap, in this case we want to forward\n // the focus to the native element.\n '(focus)': '_inputElement.nativeElement.focus()',\n },\n exportAs: 'matRadioButton',\n encapsulation: ViewEncapsulation.None,\n imports: [MatRipple, _MatInternalFormField],\n})\nexport class MatRadioButton implements OnInit, AfterViewInit, DoCheck, OnDestroy {\n protected _elementRef = inject(ElementRef);\n private _changeDetector = inject(ChangeDetectorRef);\n private _focusMonitor = inject(FocusMonitor);\n private _radioDispatcher = inject(UniqueSelectionDispatcher);\n private _defaultOptions = inject<MatRadioDefaultOptions>(MAT_RADIO_DEFAULT_OPTIONS, {\n optional: true,\n });\n\n private _ngZone = inject(NgZone);\n private _renderer = inject(Renderer2);\n private _uniqueId = inject(_IdGenerator).getId('mat-radio-');\n private _cleanupClick: (() => void) | undefined;\n\n /** The unique ID for the radio button. */\n @Input() id: string = this._uniqueId;\n\n /** Analog to HTML 'name' attribute used to group radios for unique selection. */\n @Input() name!: string;\n\n /** Used to set the 'aria-label' attribute on the underlying input element. */\n @Input('aria-label') ariaLabel!: string | null;\n\n /** The 'aria-labelledby' attribute takes precedence as the element's text alternative. */\n @Input('aria-labelledby') ariaLabelledby!: string | null;\n\n /** The 'aria-describedby' attribute is read after the element's label and field type. */\n @Input('aria-describedby') ariaDescribedby!: string | null;\n\n /** Whether ripples are disabled inside the radio button */\n @Input({transform: booleanAttribute})\n disableRipple: boolean = false;\n\n /** Tabindex of the radio button. */\n @Input({\n transform: (value: unknown) => (value == null ? 0 : numberAttribute(value)),\n })\n tabIndex: number = 0;\n\n /** Whether this radio button is checked. */\n @Input({transform: booleanAttribute})\n get checked(): boolean {\n return this._checked;\n }\n set checked(value: boolean) {\n if (this._checked !== value) {\n this._checked = value;\n if (value && this.radioGroup && this.radioGroup.value !== this.value) {\n this.radioGroup.selected = this;\n } else if (!value && this.radioGroup && this.radioGroup.value === this.value) {\n // When unchecking the selected radio button, update the selected radio\n // property on the group.\n this.radioGroup.selected = null;\n }\n\n if (value) {\n // Notify all radio buttons with the same name to un-check.\n this._radioDispatcher.notify(this.id, this.name);\n }\n this._changeDetector.markForCheck();\n }\n }\n\n /** The value of this radio button. */\n @Input()\n get value(): any {\n return this._value;\n }\n set value(value: any) {\n if (this._value !== value) {\n this._value = value;\n if (this.radioGroup !== null) {\n if (!this.checked) {\n // Update checked when the value changed to match the radio group's value\n this.checked = this.radioGroup.value === value;\n }\n if (this.checked) {\n this.radioGroup.selected = this;\n }\n }\n }\n }\n\n /** Whether the label should appear after or before the radio button. Defaults to 'after' */\n @Input()\n get labelPosition(): 'before' | 'after' {\n return this._labelPosition || (this.radioGroup && this.radioGroup.labelPosition) || 'after';\n }\n set labelPosition(value) {\n this._labelPosition = value;\n }\n private _labelPosition: 'before' | 'after' | undefined;\n\n /** Whether the radio button is disabled. */\n @Input({transform: booleanAttribute})\n get disabled(): boolean {\n return this._disabled || (this.radioGroup !== null && this.radioGroup.disabled);\n }\n set disabled(value: boolean) {\n this._setDisabled(value);\n }\n\n /** Whether the radio button is required. */\n @Input({transform: booleanAttribute})\n get required(): boolean {\n return this._required || (this.radioGroup && this.radioGroup.required);\n }\n set required(value: boolean) {\n if (value !== this._required) {\n this._changeDetector.markForCheck();\n }\n this._required = value;\n }\n\n /**\n * Theme color of the radio button. This API is supported in M2 themes only, it\n * has no effect in M3 themes. For color customization in M3, see https://material.angular.dev/components/radio/styling.\n *\n * For information on applying color variants in M3, see\n * https://material.angular.dev/guide/material-2-theming#optional-add-backwards-compatibility-styles-for-color-variants\n */\n @Input()\n get color(): ThemePalette {\n // As per M2 design specifications the selection control radio should use the accent color\n // palette by default. https://m2.material.io/components/radio-buttons#specs\n return (\n this._color ||\n (this.radioGroup && this.radioGroup.color) ||\n (this._defaultOptions && this._defaultOptions.color) ||\n 'accent'\n );\n }\n set color(newValue: ThemePalette) {\n this._color = newValue;\n }\n private _color: ThemePalette;\n\n /** Whether the radio button should remain interactive when it is disabled. */\n @Input({transform: booleanAttribute})\n get disabledInteractive(): boolean {\n return (\n this._disabledInteractive || (this.radioGroup !== null && this.radioGroup.disabledInteractive)\n );\n }\n set disabledInteractive(value: boolean) {\n this._disabledInteractive = value;\n }\n private _disabledInteractive: boolean;\n\n /**\n * Event emitted when the checked state of this radio button changes.\n * Change events are only emitted when the value changes due to user interaction with\n * the radio button (the same behavior as `<input type-\"radio\">`).\n */\n @Output() readonly change: EventEmitter<MatRadioChange> = new EventEmitter<MatRadioChange>();\n\n /** The parent radio group. May or may not be present. */\n radioGroup: MatRadioGroup;\n\n /** ID of the native input element inside `<mat-radio-button>` */\n get inputId(): string {\n return `${this.id || this._uniqueId}-input`;\n }\n\n /** Whether this radio is checked. */\n private _checked = false;\n\n /** Whether this radio is disabled. */\n private _disabled = false;\n\n /** Whether this radio is required. */\n private _required = false;\n\n /** Value assigned to this radio. */\n private _value: any = null;\n\n /** Unregister function for _radioDispatcher */\n private _removeUniqueSelectionListener: () => void = () => {};\n\n /** Previous value of the input's tabindex. */\n private _previousTabIndex: number | undefined;\n\n /** The native `<input type=radio>` element */\n @ViewChild('input') _inputElement!: ElementRef<HTMLInputElement>;\n\n /** Trigger elements for the ripple events. */\n @ViewChild('formField', {read: ElementRef, static: true})\n _rippleTrigger!: ElementRef<HTMLElement>;\n\n /** Whether animations are disabled. */\n _noopAnimations = _animationsDisabled();\n\n private _injector = inject(Injector);\n\n constructor() {\n inject(_CdkPrivateStyleLoader).load(_StructuralStylesLoader);\n const radioGroup = inject<MatRadioGroup>(MAT_RADIO_GROUP, {optional: true})!;\n const tabIndex = inject(new HostAttributeToken('tabindex'), {optional: true});\n\n // Assertions. Ideally these should be stripped out by the compiler.\n // TODO(jelbourn): Assert that there's no name binding AND a parent radio group.\n this.radioGroup = radioGroup;\n this._disabledInteractive = this._defaultOptions?.disabledInteractive ?? false;\n\n if (tabIndex) {\n this.tabIndex = numberAttribute(tabIndex, 0);\n }\n }\n\n /** Focuses the radio button. */\n focus(options?: FocusOptions, origin?: FocusOrigin): void {\n if (origin) {\n this._focusMonitor.focusVia(this._inputElement, origin, options);\n } else {\n this._inputElement.nativeElement.focus(options);\n }\n }\n\n /**\n * Marks the radio button as needing checking for change detection.\n * This method is exposed because the parent radio group will directly\n * update bound properties of the radio button.\n */\n _markForCheck() {\n // When group value changes, the button will not be notified. Use `markForCheck` to explicit\n // update radio button's status\n this._changeDetector.markForCheck();\n }\n\n ngOnInit() {\n if (this.radioGroup) {\n // If the radio is inside a radio group, determine if it should be checked\n this.checked = this.radioGroup.value === this._value;\n\n if (this.checked) {\n this.radioGroup.selected = this;\n }\n\n // Copy name from parent radio group\n this.name = this.radioGroup.name;\n }\n\n this._removeUniqueSelectionListener = this._radioDispatcher.listen((id, name) => {\n if (id !== this.id && name === this.name) {\n this.checked = false;\n }\n });\n }\n\n ngDoCheck(): void {\n this._updateTabIndex();\n }\n\n ngAfterViewInit() {\n this._updateTabIndex();\n this._focusMonitor.monitor(this._elementRef, true).subscribe(focusOrigin => {\n if (!focusOrigin && this.radioGroup) {\n this.radioGroup._touch();\n }\n });\n\n // We bind this outside of the zone, because:\n // 1. Its logic is completely DOM-related so we can avoid some change detections.\n // 2. There appear to be some internal tests that break when this triggers a change detection.\n this._ngZone.runOutsideAngular(() => {\n this._cleanupClick = this._renderer.listen(\n this._inputElement.nativeElement,\n 'click',\n this._onInputClick,\n );\n });\n }\n\n ngOnDestroy() {\n this._cleanupClick?.();\n this._focusMonitor.stopMonitoring(this._elementRef);\n this._removeUniqueSelectionListener();\n }\n\n /** Dispatch change event with current value. */\n private _emitChangeEvent(): void {\n this.change.emit(new MatRadioChange(this, this._value));\n }\n\n _isRippleDisabled() {\n return this.disableRipple || this.disabled;\n }\n\n /** Triggered when the radio button receives an interaction from the user. */\n _onInputInteraction(event: Event) {\n // We always have to stop propagation on the change event.\n // Otherwise the change event, from the input element, will bubble up and\n // emit its event object to the `change` output.\n event.stopPropagation();\n\n if (!this.checked && !this.disabled) {\n const groupValueChanged = this.radioGroup && this.value !== this.radioGroup.value;\n this.checked = true;\n this._emitChangeEvent();\n\n if (this.radioGroup) {\n this.radioGroup._controlValueAccessorChangeFn(this.value);\n if (groupValueChanged) {\n this.radioGroup._emitChangeEvent();\n }\n }\n }\n }\n\n /** Sets the disabled state and marks for check if a change occurred. */\n protected _setDisabled(value: boolean) {\n if (this._disabled !== value) {\n this._disabled = value;\n this._changeDetector.markForCheck();\n }\n }\n\n /** Called when the input is clicked. */\n private _onInputClick = (event: Event) => {\n // If the input is disabled while interactive, we need to prevent the\n // selection from happening in this event handler. Note that even though\n // this happens on `click` events, the logic applies when the user is\n // navigating with the keyboard as well. An alternative way of doing\n // this is by resetting the `checked` state in the `change` callback but\n // it isn't optimal, because it can allow a pre-checked disabled button\n // to be un-checked. This approach seems to cover everything.\n if (this.disabled && this.disabledInteractive) {\n event.preventDefault();\n }\n };\n\n /** Gets the tabindex for the underlying input element. */\n private _updateTabIndex() {\n const group = this.radioGroup;\n let value: number;\n\n // Implement a roving tabindex if the button is inside a group. For most cases this isn't\n // necessary, because the browser handles the tab order for inputs inside a group automatically,\n // but we need an explicitly higher tabindex for the selected button in order for things like\n // the focus trap to pick it up correctly.\n if (!group || !group.selected || this.disabled) {\n value = this.tabIndex;\n } else {\n value = group.selected === this ? this.tabIndex : -1;\n }\n\n if (value !== this._previousTabIndex) {\n // We have to set the tabindex directly on the DOM node, because it depends on\n // the selected state which is prone to \"changed after checked errors\".\n const input: HTMLInputElement | undefined = this._inputElement?.nativeElement;\n\n if (input) {\n input.setAttribute('tabindex', value + '');\n this._previousTabIndex = value;\n // Wait for any pending tabindex changes to be applied\n afterNextRender(\n () => {\n queueMicrotask(() => {\n // The radio group uses a \"selection follows focus\" pattern for tab management, so if this\n // radio button is currently focused and another radio button in the group becomes\n // selected, we should move focus to the newly selected radio button to maintain\n // consistency between the focused and selected states.\n if (\n group &&\n group.selected &&\n group.selected !== this &&\n document.activeElement === input\n ) {\n group.selected?._inputElement.nativeElement.focus();\n // If this radio button still has focus, the selected one must be disabled. In this\n // case the radio group as a whole should lose focus.\n if (document.activeElement === input) {\n this._inputElement.nativeElement.blur();\n }\n }\n });\n },\n {injector: this._injector},\n );\n }\n }\n }\n}\n","<label mat-internal-form-field [labelPosition]=\"labelPosition\" [for]=\"inputId\" #formField>\n <span class=\"mdc-radio\" [class.mdc-radio--disabled]=\"disabled\">\n <!-- Render this element first so the input is on top. -->\n <span class=\"mat-mdc-radio-touch-target\"></span>\n <!--\n Note that we set `aria-invalid=\"false\"` on the input, because otherwise some screen readers\n will read out \"required, invalid data\" for each radio button that hasn't been checked.\n An alternate approach is to use `aria-required` instead of `required`, however we have an\n internal check which enforces that elements marked as `aria-required` also have the `required`\n attribute which ends up re-introducing the issue for us.\n -->\n <input #input class=\"mdc-radio__native-control\" type=\"radio\"\n [id]=\"inputId\"\n [checked]=\"checked\"\n [disabled]=\"disabled && !disabledInteractive\"\n [attr.name]=\"name\"\n [attr.value]=\"value\"\n [required]=\"required\"\n aria-invalid=\"false\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n [attr.aria-describedby]=\"ariaDescribedby\"\n [attr.aria-disabled]=\"disabled && disabledInteractive ? 'true' : null\"\n (change)=\"_onInputInteraction($event)\">\n <span class=\"mdc-radio__background\" aria-hidden=\"true\">\n <span class=\"mdc-radio__outer-circle\"></span>\n <span class=\"mdc-radio__inner-circle\"></span>\n </span>\n <span mat-ripple class=\"mat-radio-ripple mat-focus-indicator\"\n [matRippleTrigger]=\"_rippleTrigger.nativeElement\"\n [matRippleDisabled]=\"_isRippleDisabled()\"\n [matRippleCentered]=\"true\"\n aria-hidden=\"true\">\n <span class=\"mat-ripple-element mat-radio-persistent-ripple\"></span>\n </span>\n </span>\n <span class=\"mat-internal-form-field-label mdc-label\">\n <ng-content></ng-content>\n </span>\n</label>\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.dev/license\n */\n\nimport {BidiModule} from '@angular/cdk/bidi';\nimport {NgModule} from '@angular/core';\nimport {MatRippleModule} from '../core';\nimport {MatRadioButton, MatRadioGroup} from './radio';\n\n@NgModule({\n imports: [MatRippleModule, MatRadioGroup, MatRadioButton],\n exports: [BidiModule, MatRadioGroup, MatRadioButton],\n})\nexport class MatRadioModule {}\n"],"names":[],"mappings":"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"}