{"version":3,"file":"ngx-t-forms-mat-slider-toggle-editor.component-DX8L0O1k.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mat-slider-toggle-editor/mat-slider-toggle-editor.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mat-slider-toggle-editor/mat-slider-toggle-editor.component.html"],"sourcesContent":["import { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  Input,\r\n  ViewEncapsulation,\r\n  inject,\r\n  output,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { Subject } from 'rxjs';\r\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\n\r\n// CVA write callback. Angular's ControlValueAccessor types the registered\r\n// change handler as `(value: any) => void`; the alias keeps the `any` contained\r\n// to one place instead of repeating an eslint-disable on every reference.\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Angular CVA mandates an untyped change callback.\r\ntype CvaChange = (value: any) => void;\r\n\r\n/**\r\n * Internal Material slide-toggle editor implementing\r\n * `MatFormFieldControl<boolean>` and `ControlValueAccessor`.\r\n *\r\n * Rendered by `t-dynamic-data-edit`, which supplies the surrounding field label,\r\n * hint, and validation errors — so this component owns only the toggle itself\r\n * (and the inline caption the toggle carries).\r\n *\r\n * NOTE: `MatFormFieldControl<T>` and `ControlValueAccessor` mandate plain\r\n * mutable `value` / `placeholder` / `required` / `disabled` / `id` members,\r\n * `@Input()` decorators, the `focused` / `touched` / `stateChanges` /\r\n * `onChange` / `onTouched` members, and the `useExisting` provider. These are\r\n * framework wiring, not defects — the CLAUDE.md bans on `@Input()` / `useExisting`\r\n * do not apply to MatFormFieldControl integration.\r\n */\r\n@Component({\r\n  selector: 'lib-mat-slider-toggle-editor',\r\n  imports: [MatSlideToggleModule],\r\n  templateUrl: './mat-slider-toggle-editor.component.html',\r\n  styleUrl: './mat-slider-toggle-editor.component.css',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  providers: [\r\n    {\r\n      provide: MatFormFieldControl,\r\n      useExisting: MatSliderToggleEditorComponent,\r\n    },\r\n  ],\r\n  host: {\r\n    'class': 'lib-mat-slider-toggle-editor',\r\n    '[id]': 'id',\r\n    '[attr.aria-describedby]': 'describedBy',\r\n    '[class.floating]': 'shouldLabelFloat',\r\n  },\r\n})\r\nexport class MatSliderToggleEditorComponent\r\n  implements MatFormFieldControl<boolean>, ControlValueAccessor\r\n{\r\n  static nextId = 0;\r\n\r\n  /** Emits whenever a piece of `MatFormFieldControl` state changes. */\r\n  readonly stateChanges = new Subject<void>();\r\n  readonly controlType = 'lib-mat-slider-toggle-editor';\r\n\r\n  focused = false;\r\n  touched = false;\r\n  autofilled = false;\r\n\r\n  id = `lib-mat-slider-toggle-editor-${MatSliderToggleEditorComponent.nextId++}`;\r\n  describedBy = '';\r\n\r\n  readonly ngControl = inject(NgControl, { self: true, optional: true });\r\n\r\n  @Input() name: string | undefined = undefined;\r\n  @Input() label = '';\r\n  @Input() errors: IConfigElementError[] | undefined = [];\r\n  @Input() disabled = false;\r\n\r\n  /** Emits the new toggle state when the user flips it. */\r\n  readonly valueChange = output<boolean>();\r\n\r\n  #required = false;\r\n  @Input()\r\n  get required(): boolean {\r\n    return this.#required;\r\n  }\r\n  set required(value: boolean) {\r\n    this.#required = coerceBooleanProperty(value);\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  #value = false;\r\n  @Input()\r\n  get value(): boolean {\r\n    return this.#value;\r\n  }\r\n  set value(val: boolean) {\r\n    this.#value = val;\r\n    this.onChange(val);\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  #placeholder = '';\r\n  @Input()\r\n  get placeholder(): string {\r\n    return this.#placeholder;\r\n  }\r\n  set placeholder(value: string) {\r\n    this.#placeholder = value;\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  constructor() {\r\n    if (this.ngControl != null) {\r\n      this.ngControl.valueAccessor = this;\r\n    }\r\n  }\r\n\r\n  // MatFormFieldControl reads these as plain getters during its own change\r\n  // detection, so they stay getters rather than `computed()` signals.\r\n  get shouldLabelFloat(): boolean {\r\n    return this.focused || !this.empty;\r\n  }\r\n\r\n  get empty(): boolean {\r\n    return this.#value === false;\r\n  }\r\n\r\n  get errorState(): boolean {\r\n    return (\r\n      (!this.#value && this.#required && this.touched) ||\r\n      this.ngControl?.errors != null ||\r\n      (this.errors?.length ?? 0) > 0\r\n    );\r\n  }\r\n\r\n  // ControlValueAccessor — Angular registers an untyped change callback.\r\n  onChange: CvaChange = () => {};\r\n  onTouched: () => void = () => {};\r\n\r\n  writeValue(value: boolean): void {\r\n    this.#value = value;\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  registerOnChange(fn: CvaChange): void {\r\n    this.onChange = fn;\r\n  }\r\n\r\n  registerOnTouched(fn: () => void): void {\r\n    this.onTouched = fn;\r\n  }\r\n\r\n  setDisabledState(isDisabled: boolean): void {\r\n    this.disabled = isDisabled;\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  setDescribedByIds(ids: string[]): void {\r\n    this.describedBy = ids.join(' ');\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  onContainerClick(): void {\r\n    if (!this.focused) {\r\n      this.focused = true;\r\n      this.stateChanges.next();\r\n    }\r\n  }\r\n\r\n  markAsTouched(): void {\r\n    if (!this.touched) {\r\n      this.touched = true;\r\n      this.onTouched();\r\n      this.stateChanges.next();\r\n    }\r\n  }\r\n\r\n  valueToggleChanged(value: boolean): void {\r\n    this.value = value;\r\n    this.valueChange.emit(value);\r\n    this.markAsTouched();\r\n  }\r\n}\r\n","<mat-slide-toggle\r\n  class=\"lib-mat-slider-toggle-editor__toggle\"\r\n  [disabled]=\"disabled\"\r\n  [checked]=\"!!value\"\r\n  [required]=\"required\"\r\n  [aria-label]=\"label || name || 'Toggle'\"\r\n  (change)=\"valueToggleChanged($event.checked)\"\r\n  (blur)=\"markAsTouched()\"\r\n>\r\n  {{ label }}\r\n</mat-slide-toggle>\r\n"],"names":[],"mappings":"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"}