{"version":3,"file":"talenra-ngx-base-radio.mjs","sources":["../../../projects/ngx-base/radio/src/radio-group/radio-group.directive.ts","../../../projects/ngx-base/radio/src/radio-button/radio-button.component.ts","../../../projects/ngx-base/radio/src/radio-button/radio-button.component.html","../../../projects/ngx-base/radio/talenra-ngx-base-radio.ts"],"sourcesContent":["import { booleanAttribute, ContentChildren, Directive, forwardRef, Input, output, QueryList } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ControlBaseDirective } from '@talenra/ngx-base/shared';\nimport { RadioGroupChange } from './radio-group.types';\nimport { RadioButtonComponent } from '../radio-button/radio-button.component';\n\n/**\n * Used to create a \"unique\" name for each radio group.\n *\n * @internal\n */\nlet nextId = 0;\n\n/**\n * Wraps and controls a group of `<talenra-radio-button>`'s.\n *\n * #### Reactive form\n *\n * ```typescript\n * // Component class\n * sampleForm: FormGroup = new FormGroup({\n *   userChoice: new FormControl('1'),\n * });\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <form [formGroup]=\"sampleForm\">\n *   <talenra-radio-group formControlName=\"userChoice\">\n *     <talenra-radio-button value=\"1\" label=\"One\"></talenra-radio-button>\n *     <talenra-radio-button value=\"2\" label=\"Two\"></talenra-radio-button>\n *     <talenra-radio-button value=\"3\" label=\"Three\"></talenra-radio-button>\n *   </talenra-radio-group>\n * </form>\n * ```\n *\n * #### Template driven form\n *\n * ```typescript\n * // Import `FormsModule` in the declaring module\n * import { FormsModule } from '@angular/forms';\n * @NgModule({\n *  // ...\n *  imports: [FormsModule],\n *})\n * ```\n *\n * ```typescript\n * // Component class\n * userChoice = '2';\n * ```\n *\n * ```html\n * <!-- Component template -->\n * <form #templateDrivenForm=\"ngForm\">\n *   <talenra-radio-group name=\"userChoice\" [(ngModel)]=\"userChoice\">\n *     <talenra-radio-button value=\"1\" label=\"One\"></talenra-radio-button>\n *     <talenra-radio-button value=\"2\" label=\"Two\"></talenra-radio-button>\n *     <talenra-radio-button value=\"3\" label=\"Three\"></talenra-radio-button>\n *   </talenra-radio-group>\n * </form>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { RadioModule } from '@talenra/ngx-base/radio';\n * ```\n *\n * <example-url>../../#/on-off-controls</example-url>\n */\n@Directive({\n  selector: 'talenra-radio-group',\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => RadioGroupDirective),\n      multi: true,\n    },\n    {\n      provide: 'RadioGroup',\n      useExisting: true,\n    },\n  ],\n})\nexport class RadioGroupDirective extends ControlBaseDirective implements ControlValueAccessor {\n  /**\n   * Associated radio buttons\n   *\n   * @internal\n   */\n  @ContentChildren(forwardRef(() => RadioButtonComponent))\n  private options?: QueryList<RadioButtonComponent>;\n\n  /**\n   * The value of the associated radio button's `name` attribute. This is how radio buttons are grouped in HTML.\n   *\n   * @internal\n   */\n  public name = `talenra-radio-group--${nextId++}`;\n\n  /** @internal */\n  public id = this.name;\n\n  /**\n   * Event emitted when the user changes RadioGroup's value.\n   *\n   * ```typescript\n   * // Component class\n   * import { RadioGroupChange } from '@talenra/ngx-base/radio';\n   * public radioChange(change: RadioGroupChange): void {\n   *   console.log(`RadioGroup (id: ${change.source.id}) has updated to ${change.value}.`);\n   * }\n   * ```\n   *\n   * ```html\n   * <!-- Component template -->\n   * <talenra-radio-group (valueChange)=\"radioChange($event)\">...</talenra-radio-group>\n   * ```\n   */\n  public valueChange = output<RadioGroupChange>();\n\n  /** Determinates whether the control is en-/disabled. */\n  @Input({ transform: booleanAttribute })\n  /** Get whether the control is en-/disabled. */\n  get disabled() {\n    return this._disabled;\n  }\n\n  /** Set whether the control is en-/disabled. */\n  set disabled(value: boolean) {\n    super.disabled = value;\n    this.options?.forEach((option) => {\n      option.setDisabledState(value);\n    });\n  }\n\n  /** The control's value. */\n  @Input()\n  /** Get the control's value. */\n  get value() {\n    return this._value;\n  }\n\n  /** Set the control's value. */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  set value(value: any) {\n    super.value = value;\n    this.updateOptions();\n  }\n\n  /** @internal */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  writeValue(value: any): void {\n    super.writeValue(value);\n    this.updateOptions();\n  }\n\n  /**\n   * Updates the associated radio buttons' `checked` state.\n   */\n  private updateOptions(): void {\n    this.options?.forEach((option) => {\n      option.checked = option.value === this.value;\n    });\n  }\n\n  /**\n   * Handle click event. Used to emit change event only if value is changed by user interaction.\n   *\n   * @internal\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  public handleClick(value: any): void {\n    if (this.value === value) return;\n    this.value = value;\n    this.valueChange.emit({ source: this, value: this.value } as RadioGroupChange);\n  }\n}\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  Input,\n  OnInit,\n  booleanAttribute,\n  inject,\n} from '@angular/core';\nimport { ControlBaseDirective } from '@talenra/ngx-base/shared';\nimport { RadioGroupDirective } from '../radio-group/radio-group.directive';\n\n/**\n * Used to create a \"unique\" ID for each radio button.\n *\n * @internal\n */\nlet nextId = 0;\n\n/**\n * Represents a single option in a `<talenra-radio-group>`.\n *\n * @see {@link RadioGroupDirective} for usage examples.\n *\n * ### Import\n *\n * ```typescript\n * import { RadioModule } from '@talenra/ngx-base/radio';\n * ```\n *\n * <example-url>../../#/on-off-controls</example-url>\n */\n@Component({\n  selector: 'talenra-radio-button',\n  templateUrl: './radio-button.component.html',\n  styleUrls: ['./radio-button.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '[class]': 'hostClass',\n  },\n})\nexport class RadioButtonComponent extends ControlBaseDirective implements OnInit, AfterViewInit {\n  private useTransition = false;\n\n  private hostClass = '';\n\n  /** Label displayed to the user. */\n  @Input() label = '';\n\n  /** The control's checked state. */\n  @Input({ transform: booleanAttribute })\n  /** Get the control's checked state. */\n  get checked(): boolean {\n    return this._checked;\n  }\n\n  /** Set the control's checked state. */\n  set checked(value: boolean) {\n    this._checked = value;\n    this.changeDetector.markForCheck();\n  }\n\n  private _checked = false;\n\n  /**\n   * The control's name is used to group multiple radio buttons together.\n   *\n   * @internal\n   */\n  public name = '';\n\n  private group = inject(RadioGroupDirective);\n  protected changeDetector: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n  /** @internal */\n  ngOnInit(): void {\n    this.id = `talenra-radio-button--${nextId++}`;\n    this.name = this.group.name || '';\n    this.checked = this.group.value === this.value;\n    this.updateHostClass();\n  }\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    setTimeout(() => {\n      this.useTransition = true;\n      this.updateHostClass();\n    }, 50);\n  }\n\n  /**\n   * Handle user click\n   *\n   * @internal\n   */\n  public handleClick(): void {\n    this.checked = true;\n    // Do not emit change if value has not changed\n    if (this.group.value === this.value) return;\n    this.onChange(this.value);\n    this.group.handleClick(this.value);\n  }\n\n  /** @internal */\n  public handleBlur(): void {\n    this.group.onTouched();\n  }\n\n  /** @internal */\n  setDisabledState(isDisabled: boolean): void {\n    super.setDisabledState(isDisabled);\n    this.updateHostClass();\n    this.changeDetector.markForCheck();\n  }\n\n  private updateHostClass(): void {\n    this.hostClass = [this.disabled ? 'disabled' : '', this.useTransition ? 'use-transition' : '']\n      .filter((item) => item)\n      .join(' ');\n  }\n}\n","<input\n  class=\"radio-button\"\n  type=\"radio\"\n  [checked]=\"checked\"\n  [disabled]=\"disabled\"\n  [attr.id]=\"id\"\n  [attr.name]=\"name\"\n  [attr.value]=\"value\"\n  (blur)=\"handleBlur()\"\n  (click)=\"handleClick()\" />\n<label class=\"label\" [attr.for]=\"id\">{{ label }}</label>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["nextId"],"mappings":"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"}