{"version":3,"file":"ng-forge-dynamic-forms-bootstrap-lazy-radio.mjs","mappings":";;;;;;;;;;;;;;;;;IAuGW;;;;AAEA;;IAGC;AACR;AACE;;;;AAnBO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAVV;;;;;AApDC;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACYU;;;;AAIH;;;AAJU;;;;;;;;;;;;;;;;AAdlB;;;;AApBS","names":[],"ignoreList":[],"sources":["../../../../packages/dynamic-forms-bootstrap/src/lib/fields/radio/bs-radio-group.component.ts","../../../../packages/dynamic-forms-bootstrap/src/lib/fields/radio/bs-radio.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject, input, model } from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { DynamicText, FieldOption, ValueType } from '@ng-forge/dynamic-forms';\nimport { DynamicTextPipe } from '@ng-forge/dynamic-forms/integration';\nimport { NgForgeControl, NgForgeField } from '@ng-forge/dynamic-forms/integration';\nimport { AsyncPipe } from '@angular/common';\n\nexport interface BsRadioGroupProps {\n  /** Display radio buttons inline (horizontal) */\n  inline?: boolean;\n  /** Reverse the position of the radio button and label */\n  reverse?: boolean;\n  /** Display as button group instead of radio buttons */\n  buttonGroup?: boolean;\n  /** Button size when using button group */\n  buttonSize?: 'sm' | 'lg';\n  /** Hint text to display below the radio group */\n  hint?: DynamicText;\n}\n\n/**\n * Bootstrap radio group implementing FormValueControl. Rendered inside\n * `df-bs-radio` — each `<input type=\"radio\">` carries `ngForgeControl`, so\n * the marker absorbs meta + aria from the ambient parent NgForgeField.\n */\n@Component({\n  selector: 'df-bs-radio-group',\n  imports: [DynamicTextPipe, AsyncPipe, NgForgeControl],\n  host: {\n    role: 'radiogroup',\n    '[attr.aria-invalid]': 'parentField?.ariaInvalid() || null',\n    '[attr.aria-required]': 'parentField?.ariaRequired()',\n    '[attr.aria-describedby]': 'parentField?.ariaDescribedBy()',\n  },\n  template: `\n    @let props = properties();\n    @if (props?.buttonGroup) {\n      <div class=\"btn-group\" role=\"group\" [attr.aria-label]=\"label() | dynamicText | async\">\n        @for (option of options(); track option.value; let i = $index) {\n          <input\n            ngForgeControl\n            type=\"radio\"\n            [name]=\"name()\"\n            [value]=\"option.value\"\n            [checked]=\"value() === option.value\"\n            (change)=\"onRadioChange(option.value)\"\n            [disabled]=\"disabled() || option.disabled || false\"\n            class=\"btn-check\"\n            [id]=\"name() + '_' + i\"\n            autocomplete=\"off\"\n          />\n          <label\n            class=\"btn btn-outline-primary\"\n            [class.btn-sm]=\"props?.buttonSize === 'sm'\"\n            [class.btn-lg]=\"props?.buttonSize === 'lg'\"\n            [for]=\"name() + '_' + i\"\n          >\n            {{ option.label | dynamicText | async }}\n          </label>\n        }\n      </div>\n    } @else {\n      @for (option of options(); track option.value; let i = $index) {\n        <div class=\"form-check\" [class.form-check-inline]=\"props?.inline\" [class.form-check-reverse]=\"props?.reverse\">\n          <input\n            ngForgeControl\n            type=\"radio\"\n            [name]=\"name()\"\n            [value]=\"option.value\"\n            [checked]=\"value() === option.value\"\n            (change)=\"onRadioChange(option.value)\"\n            [disabled]=\"disabled() || option.disabled || false\"\n            class=\"form-check-input\"\n            [id]=\"name() + '_' + i\"\n          />\n          <label class=\"form-check-label\" [for]=\"name() + '_' + i\">\n            {{ option.label | dynamicText | async }}\n          </label>\n        </div>\n      }\n    }\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n      }\n    `,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BsRadioGroupComponent implements FormValueControl<ValueType | undefined> {\n  protected readonly parentField = inject(NgForgeField, { optional: true });\n\n  // Value model - FormField directive binds form value to this\n  readonly value = model<ValueType | undefined>(undefined);\n\n  // Optional FormValueControl properties - Field directive will bind these\n  readonly disabled = input<boolean>(false);\n  readonly readonly = input<boolean>(false);\n  readonly name = input<string>('');\n\n  // Component-specific inputs\n  readonly label = input<DynamicText>();\n  readonly options = input.required<FieldOption<ValueType>[]>();\n  readonly properties = input<BsRadioGroupProps>();\n\n  /** Handle radio button change event */\n  protected onRadioChange(newValue: ValueType): void {\n    if (!this.disabled() && !this.readonly()) {\n      this.value.set(newValue);\n    }\n  }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { FormField } from '@angular/forms/signals';\nimport { FieldOption, ValueType } from '@ng-forge/dynamic-forms';\nimport { DynamicTextPipe } from '@ng-forge/dynamic-forms/integration';\nimport { injectNgForgeField, NgForgeFieldHost } from '@ng-forge/dynamic-forms/integration';\nimport { BsRadioProps } from './bs-radio.type';\nimport { AsyncPipe } from '@angular/common';\nimport { BsRadioGroupComponent } from './bs-radio-group.component';\n\n@Component({\n  selector: 'df-bs-radio',\n  imports: [BsRadioGroupComponent, FormField, DynamicTextPipe, AsyncPipe],\n  styleUrl: '../../styles/_form-field.scss',\n  hostDirectives: [NgForgeFieldHost],\n  template: `\n    @let f = ngf.field();\n\n    <div class=\"mb-3\">\n      @if (ngf.label(); as label) {\n        <div class=\"form-label\">{{ label | dynamicText | async }}</div>\n      }\n\n      <df-bs-radio-group [formField]=\"f\" [label]=\"ngf.label()\" [options]=\"options()\" [properties]=\"props()\" />\n\n      @if (ngf.errorsToDisplay()[0]; as error) {\n        <div class=\"invalid-feedback d-block\" [id]=\"ngf.errorId()\" role=\"alert\">{{ error.message }}</div>\n      } @else if (props()?.hint; as hint) {\n        <div class=\"form-text\" [id]=\"ngf.hintId()\">{{ hint | dynamicText | async }}</div>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n      }\n\n      :host([hidden]) {\n        display: none !important;\n      }\n    `,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class BsRadioFieldComponent {\n  protected readonly ngf = injectNgForgeField<ValueType>();\n\n  readonly options = input<FieldOption<ValueType>[]>([]);\n  readonly props = input<BsRadioProps>();\n}\n"]}