{"version":3,"file":"ngx-t-forms-mat-slider-editor.component-4buvmLkX.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mat-slider-editor/mat-slider-editor.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/mat-slider-editor/mat-slider-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 { NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { Subject } from 'rxjs';\r\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\n\r\n/** Display formatter for a slider value (thumb tooltip / value readout). */\r\nexport type SliderValueFormatter = (value: number) => string | number;\r\n\r\n/**\r\n * Internal Material slider editor implementing `MatFormFieldControl<number>`\r\n * for the dynamic-data-edit configuration surface.\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 slider track,\r\n * the live value readout, and the min/max bound labels.\r\n *\r\n * NOTE: `MatFormFieldControl<T>` mandates plain mutable `value` / `disabled` /\r\n * `required` / `placeholder` / `id` members, `@Input()` decorators, the\r\n * `focused` / `touched` / `stateChanges` members, and the `useExisting`\r\n * provider. These are framework wiring, not defects — the CLAUDE.md bans on\r\n * `@Input()` / `useExisting` do not apply to MatFormFieldControl integration.\r\n */\r\n@Component({\r\n  selector: 'lib-mat-slider-editor',\r\n  providers: [{ provide: MatFormFieldControl, useExisting: MatSliderEditorComponent }],\r\n  imports: [MatSliderModule],\r\n  templateUrl: './mat-slider-editor.component.html',\r\n  styleUrl: './mat-slider-editor.component.css',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  host: {\r\n    'class': 'lib-mat-slider-editor',\r\n    '[id]': 'id',\r\n    '[attr.aria-describedby]': 'describedBy',\r\n    '[class.lib-mat-slider-editor--focused]': 'focused',\r\n    '[class.lib-mat-slider-editor--disabled]': 'disabled',\r\n  },\r\n})\r\nexport class MatSliderEditorComponent implements MatFormFieldControl<number> {\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-editor';\r\n\r\n  id = `lib-mat-slider-editor-${MatSliderEditorComponent.nextId++}`;\r\n  placeholder = '';\r\n  focused = false;\r\n  touched = false;\r\n  describedBy = '';\r\n  autofilled = false;\r\n  userAriaDescribedBy: string | undefined = undefined;\r\n  disableAutomaticLabeling: boolean | undefined = undefined;\r\n\r\n  readonly ngControl = inject(NgControl, { self: true, optional: true });\r\n\r\n  /** Validation errors surfaced by the parent for error-state derivation. */\r\n  @Input() errors: IConfigElementError[] | undefined = [];\r\n  /** Accessible label for the slider thumb. */\r\n  @Input() label = '';\r\n  /** Thumb-tooltip formatter (Material `displayWith`). Optional — the parent's editor config may supply `undefined`. */\r\n  @Input() format: SliderValueFormatter | undefined = (value: number) => value;\r\n  /** Fallback formatter used by the value readout when `format` is absent. */\r\n  @Input() formatLabel: SliderValueFormatter = (value: number) => value;\r\n\r\n  #min = 0;\r\n  /** Lower bound of the slider. */\r\n  @Input()\r\n  get min(): number {\r\n    return this.#min;\r\n  }\r\n  set min(value: number) {\r\n    this.#min = this.#toNumber(value, 0);\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  #max = 100;\r\n  /** Upper bound of the slider. */\r\n  @Input()\r\n  get max(): number {\r\n    return this.#max;\r\n  }\r\n  set max(value: number) {\r\n    this.#max = this.#toNumber(value, 100);\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  #step = 1;\r\n  /** Increment between selectable values; also drives tick-mark spacing. */\r\n  @Input()\r\n  get step(): number {\r\n    return this.#step;\r\n  }\r\n  set step(value: number) {\r\n    this.#step = this.#toNumber(value, 1);\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  #disabled = false;\r\n  /** Whether the slider is inert. */\r\n  @Input()\r\n  get disabled(): boolean {\r\n    return this.#disabled;\r\n  }\r\n  set disabled(value: boolean) {\r\n    this.#disabled = coerceBooleanProperty(value);\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  #value = 0;\r\n  /** Current numeric value of the slider. */\r\n  @Input()\r\n  get value(): number {\r\n    return this.#value;\r\n  }\r\n  set value(value: number) {\r\n    this.#value = this.#toNumber(value, 0);\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  #required = false;\r\n  /** Whether a value is required. */\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  /** Emits the new slider value when the user drags the thumb. */\r\n  readonly valueChange = output<number>();\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\r\n  /**\r\n   * Whether the control holds no user selection.\r\n   *\r\n   * BEHAVIOUR FLAG: a value of `0` is a real selection, so it is NOT empty.\r\n   * The control is only \"empty\" when no numeric value is set at all.\r\n   */\r\n  get empty(): boolean {\r\n    return Number.isNaN(this.#value);\r\n  }\r\n\r\n  get shouldLabelFloat(): boolean {\r\n    return this.focused || !this.empty;\r\n  }\r\n\r\n  get errorState(): boolean {\r\n    const requiredUnset = this.empty && this.#required && this.touched;\r\n    const ngControlError = this.ngControl?.errors != null;\r\n    const externalError = (this.errors?.length ?? 0) > 0 && this.touched;\r\n    return requiredUnset || ngControlError || externalError;\r\n  }\r\n\r\n  /** Resolved display value shown in the live readout. */\r\n  get displayValue(): string {\r\n    return String(this.formatLabel(this.#value));\r\n  }\r\n\r\n  /**\r\n   * Adapter for Material's `displayWith`, which requires a `string` return.\r\n   * Wraps the `format` thumb-tooltip formatter.\r\n   */\r\n  readonly displayWith = (value: number): string =>\r\n    String(this.format ? this.format(value) : value);\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    this.markAsTouched();\r\n    if (!this.focused) {\r\n      this.focused = true;\r\n    }\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  onTouched: () => void = () => {};\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  valueChangedSlider(event: Event): void {\r\n    const target = event.target;\r\n    if (!(target instanceof HTMLInputElement)) {\r\n      return;\r\n    }\r\n    const next = Number(target.value);\r\n    if (Number.isNaN(next)) {\r\n      return;\r\n    }\r\n    this.value = next;\r\n    this.markAsTouched();\r\n    this.valueChange.emit(next);\r\n  }\r\n\r\n  /** Coerce an incoming binding to a finite number, falling back when invalid. */\r\n  #toNumber(value: number, fallback: number): number {\r\n    const parsed = Number(value);\r\n    return Number.isFinite(parsed) ? parsed : fallback;\r\n  }\r\n}\r\n","<div class=\"lib-mat-slider-editor__row\">\r\n  <span class=\"lib-mat-slider-editor__bound\">{{ min }}</span>\r\n\r\n  <mat-slider\r\n    class=\"lib-mat-slider-editor__slider\"\r\n    discrete\r\n    showTickMarks\r\n    [disabled]=\"disabled\"\r\n    [min]=\"min\"\r\n    [max]=\"max\"\r\n    [step]=\"step\"\r\n    [displayWith]=\"displayWith\"\r\n  >\r\n    <input\r\n      matSliderThumb\r\n      [value]=\"value\"\r\n      [attr.aria-label]=\"label || null\"\r\n      (input)=\"valueChangedSlider($event)\"\r\n      (blur)=\"markAsTouched()\"\r\n    />\r\n  </mat-slider>\r\n\r\n  <span class=\"lib-mat-slider-editor__bound\">{{ max }}</span>\r\n</div>\r\n\r\n<output class=\"lib-mat-slider-editor__value\">{{ displayValue }}</output>\r\n"],"names":[],"mappings":"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"}