{"version":3,"file":"edsis-component-switch.mjs","sources":["../../../library/component/switch/switch.component.ts","../../../library/component/switch/edsis-component-switch.ts"],"sourcesContent":["import {\n  booleanAttribute,\n  Component,\n  computed,\n  forwardRef,\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\nexport type SwitchSize = 'default' | 'sm';\n\n/**\n * Switch built on a native `<input type=\"checkbox\" role=\"switch\">` (shadcn\n * pattern) — no Material dependency.\n */\n@Component({\n  selector: 'Switch',\n  providers: [\n    { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SwitchComponent), multi: true },\n  ],\n  host: { '[class]': 'hostClasses()' },\n  template: `\n    <label [class]=\"labelClasses()\" [attr.for]=\"id()\">\n      <input\n        #ref\n        type=\"checkbox\"\n        role=\"switch\"\n        class=\"peer sr-only\"\n        [id]=\"id()\"\n        [attr.name]=\"name()\"\n        [checked]=\"checked()\"\n        [disabled]=\"isDisabled()\"\n        [required]=\"required()\"\n        [attr.aria-label]=\"ariaLabel()\"\n        [attr.aria-describedby]=\"ariaDescribedby()\"\n        [attr.aria-labelledby]=\"ariaLabelledby()\"\n        [attr.aria-invalid]=\"ariaInvalidAttr()\"\n        (change)=\"handleChange($event)\"\n        (blur)=\"handleBlur()\"\n      />\n      <span aria-hidden=\"true\" [class]=\"trackClasses()\">\n        <span [class]=\"thumbClasses()\"></span>\n      </span>\n      <ng-content />\n    </label>\n  `,\n})\nexport class SwitchComponent implements ControlValueAccessor {\n  readonly id = input<string>(uniqueId('Switch'));\n  readonly name = input<string | null>(null);\n  readonly disabled = input(false, { transform: booleanAttribute });\n  readonly required = input(false, { transform: booleanAttribute });\n  readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\n  readonly ariaDescribedby = input<string | null>(null, { alias: 'aria-describedby' });\n  readonly ariaLabelledby = input<string | null>(null, { alias: 'aria-labelledby' });\n  readonly ariaInvalid = input<boolean | string | null>(null, { alias: 'aria-invalid' });\n  readonly size = input<SwitchSize>('default');\n  readonly class = input<string>('');\n\n  readonly checkedChange = output<boolean>();\n\n  private readonly ref = viewChild.required<ElementRef<HTMLInputElement>>('ref');\n\n  protected readonly checked = signal<boolean>(false);\n  protected readonly disabledState = signal(false);\n  protected readonly ariaInvalidAttr = computed(() => {\n    const value = this.ariaInvalid();\n\n    if (value === false || value === 'false' || value == null) {\n      return null;\n    }\n\n    return value === true || value === '' ? 'true' : `${value}`;\n  });\n  protected readonly isDisabled = computed(() => this.disabled() || this.disabledState());\n  protected readonly hostClasses = computed(() =>\n    cn('Switch inline-flex', this.size() === 'sm' ? 'switch-sm' : 'switch-default', this.class()),\n  );\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 trackClasses = computed(() =>\n    cn(\n      'inline-flex shrink-0 items-center rounded-full border-2 border-transparent 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.size() === 'sm' ? 'h-4 w-7' : 'h-5 w-9',\n      this.ariaInvalidAttr() === 'true'\n        ? 'bg-destructive'\n        : this.checked()\n          ? 'bg-primary'\n          : 'bg-input',\n    ),\n  );\n  protected readonly thumbClasses = computed(() =>\n    cn(\n      'pointer-events-none block rounded-full bg-background shadow-lg ring-0 transition-transform',\n      this.size() === 'sm' ? 'size-3' : 'size-4',\n      this.checked() ? (this.size() === 'sm' ? 'translate-x-3' : 'translate-x-4') : 'translate-x-0',\n    ),\n  );\n\n  private onChange: (v: boolean) => void = () => {};\n  private onTouched: () => void = () => {};\n\n  protected handleChange(event: Event): void {\n    const next = (event.target as HTMLInputElement).checked;\n    this.checked.set(next);\n    this.onChange(next);\n    this.checkedChange.emit(next);\n  }\n\n  protected handleBlur(): void {\n    this.onTouched();\n  }\n\n  focus(): void {\n    this.ref().nativeElement.focus();\n  }\n\n  writeValue(v: boolean): void {\n    this.checked.set(!!v);\n  }\n  registerOnChange(fn: (v: boolean) => void): void {\n    this.onChange = fn;\n  }\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n  setDisabledState(d: boolean): void {\n    this.disabledState.set(d);\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}