{"version":3,"file":"edsis-component-radio.mjs","sources":["../../../library/component/radio/radio.component.ts","../../../library/component/radio/edsis-component-radio.ts"],"sourcesContent":["import {\n  booleanAttribute,\n  Component,\n  computed,\n  contentChildren,\n  forwardRef,\n  inject,\n  input,\n  output,\n  signal,\n  viewChild,\n  type ElementRef,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { cn } from '@edsis/component/class';\nimport { uniqueId } from '@edsis/component/id';\n\ntype AriaInvalidValue = boolean | 'true' | 'false' | null;\n\n/**\n * Radio group built on native `<input type=\"radio\">` elements (shadcn\n * pattern) — no Material dependency. Native radios with a shared `name`\n * give arrow-key navigation and form semantics for free.\n */\n@Component({\n  selector: 'RadioGroup',\n  providers: [\n    { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroupComponent), multi: true },\n  ],\n  host: {\n    role: 'radiogroup',\n    '[class]': 'classes()',\n    '[attr.aria-label]': 'ariaLabel()',\n    '[attr.aria-labelledby]': 'ariaLabelledby()',\n    '[attr.aria-describedby]': 'ariaDescribedby()',\n    '[attr.aria-invalid]': 'ariaInvalidAttr()',\n  },\n  template: `<ng-content />`,\n})\nexport class RadioGroupComponent implements ControlValueAccessor {\n  readonly name = input<string>('');\n  readonly orientation = input<'horizontal' | 'vertical'>('vertical');\n  readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\n  readonly ariaLabelledby = input<string | null>(null, { alias: 'aria-labelledby' });\n  readonly ariaDescribedby = input<string | null>(null, { alias: 'aria-describedby' });\n  readonly ariaInvalid = input<AriaInvalidValue>(null, { alias: 'aria-invalid' });\n  readonly class = input<string>('');\n\n  readonly valueChange = output<string>();\n\n  private readonly generatedName = uniqueId('RadioGroup');\n  private readonly radios = contentChildren(\n    forwardRef(() => RadioComponent),\n    { descendants: true },\n  );\n\n  readonly value = signal<string | null>(null);\n  readonly disabled = signal<boolean>(false);\n\n  /** Shared native `name` so the browser groups the radios. */\n  readonly resolvedName = computed(() => this.name() || this.generatedName);\n\n  protected readonly ariaInvalidAttr = computed(() => {\n    const ariaInvalid = this.ariaInvalid();\n\n    if (ariaInvalid === null) {\n      return null;\n    }\n\n    return ariaInvalid === false || ariaInvalid === 'false' ? 'false' : 'true';\n  });\n  protected readonly classes = computed(() =>\n    cn(\n      'RadioGroup grid gap-2',\n      this.orientation() === 'horizontal' ? 'grid-flow-col auto-cols-max' : '',\n      this.class(),\n    ),\n  );\n\n  private onChange: (v: string | null) => void = () => {};\n  private onTouched: () => void = () => {};\n\n  select(value: string): void {\n    this.value.set(value);\n    this.onChange(value);\n    this.valueChange.emit(value);\n  }\n\n  markTouched(): void {\n    this.onTouched();\n  }\n\n  focus(): void {\n    const radios = this.radios();\n    const target = radios.find((radio) => radio.value() === this.value()) ?? radios[0];\n    target?.focus();\n  }\n\n  writeValue(v: string | null): void {\n    this.value.set(v ?? null);\n  }\n  registerOnChange(fn: (v: string | null) => void): void {\n    this.onChange = fn;\n  }\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n  setDisabledState(d: boolean): void {\n    this.disabled.set(d);\n  }\n}\n\n@Component({\n  selector: 'Radio',\n  host: { '[class]': 'hostClasses()' },\n  template: `\n    <label [class]=\"labelClasses()\">\n      <input\n        #ref\n        type=\"radio\"\n        class=\"peer sr-only\"\n        [attr.name]=\"group.resolvedName()\"\n        [value]=\"value()\"\n        [checked]=\"selected()\"\n        [disabled]=\"isDisabled()\"\n        (change)=\"handleChange()\"\n        (blur)=\"handleBlur()\"\n      />\n      <span aria-hidden=\"true\" [class]=\"circleClasses()\">\n        @if (selected()) {\n          <span class=\"size-2 rounded-full bg-primary\"></span>\n        }\n      </span>\n      <ng-content />\n    </label>\n  `,\n})\nexport class RadioComponent {\n  protected readonly group = inject(RadioGroupComponent);\n\n  readonly value = input.required<string>();\n  readonly disabled = input(false, { transform: booleanAttribute });\n  readonly class = input<string>('');\n\n  protected readonly selected = computed(() => this.group.value() === this.value());\n  protected readonly isDisabled = computed(() => this.disabled() || this.group.disabled());\n  protected readonly hostClasses = computed(() => cn('Radio inline-flex', this.class()));\n  protected readonly labelClasses = computed(() =>\n    cn(\n      'inline-flex select-none items-center gap-2 text-sm font-medium leading-none',\n      this.isDisabled() ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n    ),\n  );\n  protected readonly circleClasses = computed(() =>\n    cn(\n      'inline-flex size-4 shrink-0 items-center justify-center rounded-full border border-input shadow-sm transition-colors',\n      'peer-focus-visible:ring-2 peer-focus-visible:ring-ring peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-background',\n      this.selected() ? 'border-primary' : '',\n    ),\n  );\n\n  private readonly ref = viewChild.required<ElementRef<HTMLInputElement>>('ref');\n\n  protected handleChange(): void {\n    this.group.select(this.value());\n  }\n\n  protected handleBlur(): void {\n    this.group.markTouched();\n  }\n\n  focus(): void {\n    this.ref().nativeElement.focus();\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}