{"version":3,"file":"sdcorejs-angular-forms-inline-text.mjs","sources":["../../../projects/sdcorejs-angular/forms/inline-text/src/inline-text.component.ts","../../../projects/sdcorejs-angular/forms/inline-text/src/inline-text.component.html","../../../projects/sdcorejs-angular/forms/inline-text/sdcorejs-angular-forms-inline-text.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n  afterNextRender,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  input,\n  model,\n  output,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { SdFormControl } from '@sdcorejs/angular/forms/models';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/** Visual / `data-state` of the inline input. `'auto'` derives from focus + value. */\nexport type SdInlineTextState = 'auto' | 'pending' | 'active' | 'focus' | 'error';\n/** `'standalone'` draws its own affordance (hover bg + focus ring); `'seamless'` defers all chrome to the host. */\nexport type SdInlineTextChrome = 'standalone' | 'seamless';\n\n/**\n * Borderless, content-hugging text input — the seamless primitive shared by\n * `sd-input` / `sd-input-number` (`viewed='inline'`) and the query-bar / query-builder chips.\n *\n * why: a native `<input>` inside `mat-form-field` cannot hug its content, so inline-edit\n * looked like a full-width input rather than text. This primitive renders a raw `<input>`\n * sized via the native `size` attribute (clamped) so the click/hover target tracks the value.\n *\n * It is intentionally unopinionated about commit/parse/format: it forwards the raw DOM events\n * (focus / blur / keydown / paste / composition / Enter / Escape) so each consumer keeps its own\n * logic (e.g. sd-input-number's vi-VN formatting). Two binding modes:\n *  - **uncontrolled** via `[(value)]` — used by the chips' signal drafts;\n *  - **controlled** via `[control]` (an external `SdFormControl`) — used by the form controls.\n */\n@Component({\n  selector: 'sd-inline-text',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [SdIcon, CommonModule, ReactiveFormsModule],\n  templateUrl: './inline-text.component.html',\n  styleUrl: './inline-text.component.scss',\n  host: {\n    class: 'sd-inline-text',\n    '[class.sd-inline-text--standalone]': \"chrome() === 'standalone'\",\n    '[class.sd-inline-text--seamless]': \"chrome() === 'seamless'\",\n    '[attr.data-state]': 'effectiveState()',\n  },\n})\nexport class SdInlineText {\n  /** Uncontrolled value (two-way). Ignored when `[control]` is provided. */\n  readonly value = model<string>('');\n  /** Optional external FormControl (controlled mode) — used by sd-input / sd-input-number. */\n  readonly control = input<SdFormControl | undefined>(undefined);\n  readonly placeholder = input<string>('');\n  readonly disabled = input(false, { transform: booleanAttribute });\n  /** Show a hover/value-gated clear-× (default `true`). */\n  readonly clearable = input(true, { transform: booleanAttribute });\n  /** `'auto'` derives state from focus + value; pass an explicit value (e.g. `'error'`) to override. */\n  readonly state = input<SdInlineTextState>('auto');\n  readonly chrome = input<SdInlineTextChrome>('standalone');\n  readonly autoId = input<string | undefined>(undefined);\n  readonly autofocus = input(false, { transform: booleanAttribute });\n  /** Lower bound (chars) so short/empty values keep a clickable target. */\n  readonly minSize = input(2);\n\n  readonly cleared = output<void>();\n  readonly keyupEnter = output<void>();\n  readonly keydownEscape = output<void>();\n  readonly sdFocus = output<FocusEvent>();\n  readonly sdBlur = output<FocusEvent>();\n  readonly sdKeydown = output<KeyboardEvent>();\n  readonly sdPaste = output<ClipboardEvent>();\n  readonly sdCompositionStart = output<CompositionEvent>();\n  readonly sdCompositionEnd = output<CompositionEvent>();\n\n  private readonly inputRef = viewChild<ElementRef<HTMLInputElement>>('inputEl');\n\n  /** Bumped on input/blur/composition + bound-control changes so size/state methods re-eval under OnPush. */\n  protected readonly tick = signal(0);\n  protected readonly focused = signal(false);\n\n  constructor() {\n    // why: a bound control's value can change programmatically (sd-input-number reformats\n    // on blur) without a DOM input event — subscribe so the size/state still refresh.\n    effect(onCleanup => {\n      const c = this.control();\n      if (!c) return;\n      const sub = c.valueChanges.subscribe(() => this.tick.update(n => n + 1));\n      onCleanup(() => sub.unsubscribe());\n    });\n\n    afterNextRender(() => {\n      if (this.autofocus()) this.focus();\n    });\n  }\n\n  /**\n   * Current text — from the bound control in controlled mode, else the value model.\n   * why: `tick` is a tracked dependency so the computed re-runs when a bound control's\n   * value changes programmatically (control.value itself is not a signal).\n   */\n  protected readonly currentText = computed<string>(() => {\n    this.tick();\n    const c = this.control();\n    const raw = c ? c.value : this.value();\n    return raw == null ? '' : String(raw);\n  });\n\n  protected readonly hasValue = computed(() => this.currentText().length > 0);\n\n  protected readonly sizeOf = computed(() => {\n    const text = this.currentText();\n    const base = text.length > 0 ? text.length : this.placeholder().length;\n    return Math.max(this.minSize(), base);\n  });\n\n  protected readonly showClear = computed(() => this.clearable() && this.hasValue() && !this.disabled());\n\n  protected readonly effectiveState = computed<SdInlineTextState>(() => {\n    const s = this.state();\n    if (s !== 'auto') return s;\n    if (this.focused()) return 'focus';\n    return this.hasValue() ? 'active' : 'pending';\n  });\n\n  // ── event handlers ─────────────────────────────────────────────────────────\n  protected onInput(ev: Event): void {\n    const el = ev.target as HTMLInputElement;\n    // why: only the uncontrolled mode owns the value model; in controlled mode the bound\n    // FormControl carries the value natively (ReactiveForms), so we must not double-write.\n    if (!this.control()) this.value.set(el.value);\n    this.tick.update(n => n + 1);\n  }\n\n  protected onFocus(ev: FocusEvent): void {\n    this.focused.set(true);\n    this.sdFocus.emit(ev);\n  }\n\n  protected onBlur(ev: FocusEvent): void {\n    this.focused.set(false);\n    this.tick.update(n => n + 1);\n    this.sdBlur.emit(ev);\n  }\n\n  protected onKeyup(ev: KeyboardEvent): void {\n    if (ev.key === 'Enter') this.keyupEnter.emit();\n  }\n\n  protected onKeydown(ev: KeyboardEvent): void {\n    if (ev.key === 'Escape') this.keydownEscape.emit();\n    this.sdKeydown.emit(ev);\n  }\n\n  protected onPaste(ev: ClipboardEvent): void {\n    this.sdPaste.emit(ev);\n  }\n\n  protected onCompositionStart(ev: CompositionEvent): void {\n    this.sdCompositionStart.emit(ev);\n  }\n\n  protected onCompositionEnd(ev: CompositionEvent): void {\n    this.tick.update(n => n + 1);\n    this.sdCompositionEnd.emit(ev);\n  }\n\n  protected clear(ev: Event): void {\n    ev.stopPropagation();\n    const c = this.control();\n    if (c) c.setValue('');\n    else this.value.set('');\n    this.tick.update(n => n + 1);\n    this.cleared.emit();\n  }\n\n  // ── public API ───────────────────────────────────────────────────────────\n  /** Focus the native input. */\n  focus(): void {\n    this.inputRef()?.nativeElement.focus();\n  }\n\n  /** Blur the native input. */\n  blur(): void {\n    this.inputRef()?.nativeElement.blur();\n  }\n}\n","@let _autoId = autoId();\n@let _placeholder = placeholder();\n@let _sizeOf = sizeOf();\n@let _control = control();\n\n@if (_control) {\n  <input\n    #inputEl\n    class=\"sd-inline-text__input\"\n    type=\"text\"\n    [formControl]=\"_control\"\n    [placeholder]=\"_placeholder\"\n    [size]=\"_sizeOf\"\n    [attr.data-autoId]=\"_autoId\"\n    (input)=\"onInput($event)\"\n    (focus)=\"onFocus($event)\"\n    (blur)=\"onBlur($event)\"\n    (keyup)=\"onKeyup($event)\"\n    (keydown)=\"onKeydown($event)\"\n    (paste)=\"onPaste($event)\"\n    (compositionstart)=\"onCompositionStart($event)\"\n    (compositionend)=\"onCompositionEnd($event)\" />\n} @else {\n  <input\n    #inputEl\n    class=\"sd-inline-text__input\"\n    type=\"text\"\n    [value]=\"currentText()\"\n    [disabled]=\"disabled()\"\n    [placeholder]=\"_placeholder\"\n    [size]=\"_sizeOf\"\n    [attr.data-autoId]=\"_autoId\"\n    (input)=\"onInput($event)\"\n    (focus)=\"onFocus($event)\"\n    (blur)=\"onBlur($event)\"\n    (keyup)=\"onKeyup($event)\"\n    (keydown)=\"onKeydown($event)\"\n    (paste)=\"onPaste($event)\"\n    (compositionstart)=\"onCompositionStart($event)\"\n    (compositionend)=\"onCompositionEnd($event)\" />\n}\n\n@if (showClear()) {\n  <button type=\"button\" class=\"sd-inline-text__clear\" (click)=\"clear($event)\" aria-label=\"Clear\" tabindex=\"-1\">\n    <sd-icon name=\"close\"></sd-icon>\n  </button>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}