{"version":3,"file":"ng-forge-dynamic-forms-primeng-lazy-input.mjs","mappings":";;;;;;;;;;;;;;AAoMc;;;;AAMH;;AAET,IAKS;;IAGQ;AAEE;;AACA;;IAGA;;AAEA;;;;AAIf;;AAEF;AACA;AACE;;AACK;AACL;;AAEF;AACE;;AAEF;;;AAGiB;;;AA1CA;AAxHjB;AACE;AACA;AACD;AACD;gFAME;;AAEE;AACA;AACA;oBAEA;;AAEE;AACE;AACA;;;;;;AAOC;;;;AAIR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAlCF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGC;AACE;AACA;AACD;AACD;4IAME;;AAEE;AACA;AACA;;;AAIE;AACE;AACA;;;;;;AAOC;;;;AAIR;AACF","names":[],"ignoreList":[],"sources":["../../../../packages/dynamic-forms-primeng/src/lib/fields/input/prime-input.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, forwardRef, inject, input, signal } from '@angular/core';\nimport { FormField } from '@angular/forms/signals';\nimport { AddonActionContext, AddonActionPreset, DynamicFormLogger } from '@ng-forge/dynamic-forms';\nimport { DfAddonSlot } from '@ng-forge/dynamic-forms/integration';\nimport { WrapperFieldInputs } from '@ng-forge/dynamic-forms/integration';\nimport { DynamicTextPipe, FIELD_SIGNAL_CONTEXT } from '@ng-forge/dynamic-forms/integration';\nimport {\n  ADDON_PRESET_HANDLER,\n  AddonPresetHandler,\n  injectNgForgeAddons,\n  injectNgForgeField,\n  NgForgeAddons,\n  NgForgeControl,\n  NgForgeFieldHost,\n} from '@ng-forge/dynamic-forms/integration';\nimport { AsyncPipe } from '@angular/common';\nimport { InputGroupModule } from 'primeng/inputgroup';\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\nimport { InputText } from 'primeng/inputtext';\nimport { PRIMENG_CONFIG, PRIME_INPUT_TYPE_OVERRIDE, runPrimePresetAction } from '@ng-forge/dynamic-forms-primeng/shared';\nimport { PrimeInputAddon, PrimeInputProps } from './prime-input.type';\n\n@Component({\n  selector: 'df-prime-input',\n  imports: [InputText, InputGroupModule, InputGroupAddonModule, DfAddonSlot, DynamicTextPipe, AsyncPipe, FormField, NgForgeControl],\n  styleUrl: '../../styles/_form-field.scss',\n  hostDirectives: [NgForgeFieldHost, NgForgeAddons],\n  template: `\n    <div class=\"df-prime-field\">\n      @if (ngf.label()) {\n        <label [for]=\"inputId()\" class=\"df-prime-label\">{{ ngf.label() | dynamicText | async }}</label>\n      }\n      @if (ngfa.hasAddons()) {\n        <p-inputgroup>\n          @for (a of ngfa.prefixAddons(); track $index) {\n            <p-inputgroup-addon>\n              <df-addon-slot [addon]=\"a\" [fieldInputs]=\"fieldInputs()\" [hidden]=\"ngfa.hiddenSignalCache().get(a)\" />\n            </p-inputgroup-addon>\n          }\n          <input\n            pInputText\n            ngForgeControl\n            [id]=\"inputId()\"\n            [formField]=\"ngf.field()\"\n            [type]=\"type()\"\n            [placeholder]=\"(ngf.placeholder() | dynamicText | async) ?? ''\"\n            [attr.tabindex]=\"ngf.tabIndex()\"\n            [class]=\"inputClasses()\"\n          />\n          @for (a of ngfa.suffixAddons(); track $index) {\n            <p-inputgroup-addon>\n              <df-addon-slot [addon]=\"a\" [fieldInputs]=\"fieldInputs()\" [hidden]=\"ngfa.hiddenSignalCache().get(a)\" />\n            </p-inputgroup-addon>\n          }\n        </p-inputgroup>\n      } @else {\n        <input\n          pInputText\n          ngForgeControl\n          [id]=\"inputId()\"\n          [formField]=\"ngf.field()\"\n          [type]=\"type()\"\n          [placeholder]=\"(ngf.placeholder() | dynamicText | async) ?? ''\"\n          [attr.tabindex]=\"ngf.tabIndex()\"\n          [class]=\"inputClasses()\"\n        />\n      }\n      @if (ngf.errorsToDisplay()[0]; as error) {\n        <small class=\"p-error\" [id]=\"ngf.errorId()\" role=\"alert\">{{ error.message }}</small>\n      } @else if (props()?.hint; as hint) {\n        <small class=\"df-prime-hint\" [id]=\"ngf.hintId()\">{{ hint | dynamicText | async }}</small>\n      }\n    </div>\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: PRIME_INPUT_TYPE_OVERRIDE,\n      useFactory: () => signal<string | undefined>(undefined),\n    },\n    {\n      // Adapter-specific preset semantics for `prime-button` addons (clear /\n      // reset / paste / copy / toggle-password-visibility). The directive\n      // (`NgForgeAddonAction`) delegates here when an addon configures a\n      // `preset`. Per-prime-input-instance so the `typeOverride` signal is\n      // scoped to one field.\n      provide: ADDON_PRESET_HANDLER,\n      useFactory: (): AddonPresetHandler => {\n        const typeOverride = inject(PRIME_INPUT_TYPE_OVERRIDE);\n        const fsc = inject(FIELD_SIGNAL_CONTEXT, { optional: true });\n        const logger = inject(DynamicFormLogger);\n        // forwardRef for baselineType only — host.props()?.type gates toggle-password-visibility.\n        const host = inject(forwardRef(() => PrimeInputFieldComponent));\n        return {\n          run: (preset: string, ctx: AddonActionContext) => {\n            const fieldKey = ctx.field.key;\n            return runPrimePresetAction(preset as AddonActionPreset, ctx, {\n              typeOverride,\n              fieldValueSetter: ctx.setValue,\n              fieldDefaultValueGetter:\n                fsc && fieldKey ? () => (fsc.defaultValues() as Record<string, unknown> | undefined)?.[fieldKey] : undefined,\n              baselineType: () => host.props()?.type,\n              logger,\n            });\n          },\n        };\n      },\n    },\n  ],\n  styles: [\n    `\n      :host([hidden]) {\n        display: none !important;\n      }\n      /* Make p-inputgroup-addon inherit the input's theme tokens so it\n         matches the input surface in any PrimeNG theme (light/dark/custom).\n         PrimeNG's default tokens for inputgroup-addon don't always track the\n         input's surface — explicit binding via input-text vars keeps them\n         visually unified. */\n      /* PrimeNG ships its inputgroup CSS via runtime style injection (requires\n         providePrimeNG()). When the host app doesn't wire that — like an\n         embedded live-example renderer — fall back to layout primitives so\n         the input group still flexes horizontally and the addon containers\n         have their own chrome. Uses PrimeNG's dedicated inputgroup-addon\n         tokens; idempotent if PrimeNG's runtime CSS later loads on top. */\n      :host ::ng-deep p-inputgroup {\n        display: flex;\n        align-items: stretch;\n        width: 100%;\n      }\n      :host ::ng-deep p-inputgroup > input,\n      :host ::ng-deep p-inputgroup > .p-inputtext {\n        flex: 1 1 auto;\n        width: 1%;\n      }\n      /* Per-side padding on the addon containers (independent knobs). The\n         vertical axis still inherits PrimeNG's --p-inputgroup-addon-padding\n         when defined. */\n      :host {\n        --df-prime-addon-prefix-outer-padding: 0.75rem;\n        --df-prime-addon-prefix-inner-padding: 0.75rem;\n        --df-prime-addon-suffix-inner-padding: 0.75rem;\n        --df-prime-addon-suffix-outer-padding: 0.75rem;\n      }\n      /* Border + background fallbacks chain: prefer PrimeNG's addon tokens\n         (loaded when providePrimeNG() runs); fall back to the input-text\n         tokens; fall back to a tinted currentColor that always resolves so\n         the chrome stays visible even when PrimeNG's runtime CSS isn't\n         present in this sub-app's shadow root (multi-demo pages can race\n         the style injection — one shadow root wins, the other ends up\n         without the inputgroup-addon stylesheet). */\n      :host {\n        --df-prime-addon-fallback-border-color: color-mix(in srgb, currentColor 20%, transparent);\n        --df-prime-addon-fallback-background: color-mix(in srgb, currentColor 4%, transparent);\n      }\n      :host ::ng-deep p-inputgroup-addon {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        background: var(--p-inputgroup-addon-background, var(--p-content-background, var(--df-prime-addon-fallback-background)));\n        color: var(--p-inputgroup-addon-color, var(--p-inputtext-color, currentColor));\n        border: 1px solid\n          var(--p-inputgroup-addon-border-color, var(--p-inputtext-border-color, var(--df-prime-addon-fallback-border-color)));\n      }\n      :host ::ng-deep p-inputgroup > p-inputgroup-addon:first-child {\n        padding-left: var(--df-prime-addon-prefix-outer-padding);\n        padding-right: var(--df-prime-addon-prefix-inner-padding);\n      }\n      :host ::ng-deep p-inputgroup > p-inputgroup-addon:last-child {\n        padding-left: var(--df-prime-addon-suffix-inner-padding);\n        padding-right: var(--df-prime-addon-suffix-outer-padding);\n      }\n      /* Flatten the inner p-button so it doesn't paint chrome over the addon\n         container; hover/active tints use currentColor (PrimeNG's\n         --p-content-hover-background goes near-white on dark themes). */\n      :host ::ng-deep p-inputgroup-addon df-prime-button-addon {\n        --p-button-secondary-background: transparent;\n        --p-button-secondary-border-color: transparent;\n        --p-button-secondary-color: var(--p-inputtext-color);\n        --p-button-secondary-hover-background: color-mix(in srgb, currentColor 8%, transparent);\n        --p-button-secondary-hover-border-color: transparent;\n        --p-button-secondary-hover-color: var(--p-inputtext-color);\n        --p-button-secondary-active-background: color-mix(in srgb, currentColor 16%, transparent);\n        --p-button-secondary-active-border-color: transparent;\n      }\n      :host ::ng-deep p-inputgroup-addon df-prime-button-addon .p-button {\n        box-shadow: none;\n      }\n      :host ::ng-deep p-inputgroup-addon df-prime-button-addon .p-button:focus-visible {\n        /* 2px outward outline for WCAG 2.4.7 / 2.4.11 — matches Bootstrap (+2). */\n        outline: 2px solid var(--p-focus-ring-color, currentColor);\n        outline-offset: 2px;\n      }\n    `,\n  ],\n})\nexport default class PrimeInputFieldComponent {\n  private readonly primeNGConfig = inject(PRIMENG_CONFIG, { optional: true });\n\n  protected readonly ngf = injectNgForgeField<string>();\n  protected readonly ngfa = injectNgForgeAddons<PrimeInputAddon>();\n\n  readonly props = input<PrimeInputProps>();\n\n  /**\n   * Wrapper-style host bag pushed by `DfFieldOutlet`. Declared at the\n   * component level so `setInputIfDeclared` (which uses\n   * `reflectComponentType`) can write it.\n   */\n  readonly fieldInputs = input<WrapperFieldInputs | undefined>();\n\n  /** Per-instance type override populated by `toggle-password-visibility` preset. */\n  private readonly typeOverride = inject(PRIME_INPUT_TYPE_OVERRIDE);\n\n  protected readonly size = computed(() => this.props()?.size ?? this.primeNGConfig?.size);\n  protected readonly variant = computed(() => this.props()?.variant ?? this.primeNGConfig?.variant);\n\n  /** Override (set by `toggle-password-visibility` preset) wins over `props().type`. */\n  protected readonly type = computed(() => this.typeOverride() ?? this.props()?.type ?? 'text');\n\n  protected readonly inputClasses = computed(() => {\n    const classes: string[] = [];\n    const styleClass = this.props()?.styleClass;\n    if (styleClass) {\n      classes.push(styleClass);\n    }\n    const size = this.size();\n    if (size === 'small') {\n      classes.push('p-inputtext-sm');\n    } else if (size === 'large') {\n      classes.push('p-inputtext-lg');\n    }\n    if (this.variant() === 'filled') {\n      classes.push('p-filled');\n    }\n    return classes.join(' ');\n  });\n\n  protected readonly inputId = computed(() => `${this.ngf.key()}-input`);\n}\n"]}