import * as _sdcorejs_angular_forms_models from '@sdcorejs/angular/forms/models'; import { SdViewed, SdViewedInput, SdCustomValidator, SdFormControl } from '@sdcorejs/angular/forms/models'; import * as _sdcorejs_angular_forms_input from '@sdcorejs/angular/forms/input'; import * as _angular_core from '@angular/core'; import { OnDestroy, OnInit, AfterViewInit, ElementRef, TemplateRef, EventEmitter } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { MatFormFieldAppearance, FloatLabelType } from '@angular/material/form-field'; import { SdInlineText } from '@sdcorejs/angular/forms/inline-text'; import { SdSuffixDefDirective, SdViewDefDirective } from '@sdcorejs/angular/forms/directives'; import { Size } from '@sdcorejs/utils/models'; type SdInputMaskStatus = 'empty' | 'incomplete' | 'valid' | 'invalid'; type SdInputMaskInputMode = 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'; interface SdInputMaskResult { readonly raw: string; readonly display: string; readonly status: SdInputMaskStatus; readonly selectionStart: number; readonly selectionEnd: number; } interface SdInputMaskAdapter { readonly inputMode?: SdInputMaskInputMode; readonly maxDisplayLength?: number; format(raw: string | null | undefined): SdInputMaskResult; parse(display: string, selectionStart?: number | null, selectionEnd?: number | null): SdInputMaskResult; } interface SdInputMaskToken { readonly pattern: RegExp; readonly optional?: boolean; readonly transform?: (value: string) => string; } interface SdCreateInputMaskOptions { readonly tokens?: Readonly>; readonly inputMode?: SdInputMaskInputMode; } /** * Creates a dependency-free slot mask. * * Default tokens: `#` required digit, `9` optional digit, `A`/`a` required/optional * letter, and `*`/`?` required/optional alphanumeric. Every other character is a * display literal and never leaks into the raw model. */ declare function sdCreateInputMask(pattern: string, options?: SdCreateInputMaskOptions): SdInputMaskAdapter; /** Common business masks. Models remain raw strings; separators are display-only. */ declare const SD_INPUT_MASKS: { readonly VN_PHONE: SdInputMaskAdapter; readonly VN_ID: SdInputMaskAdapter; readonly VN_TAX_CODE: SdInputMaskAdapter; readonly BANK_ACCOUNT: SdInputMaskAdapter; readonly BUSINESS_CODE: SdInputMaskAdapter; }; type SdInputMaskPreset = keyof typeof SD_INPUT_MASKS; type SdInputMask = SdInputMaskAdapter | SdInputMaskPreset; declare function sdResolveInputMask(mask: SdInputMask | null | undefined): SdInputMaskAdapter | undefined; declare class SdInput implements OnDestroy, OnInit, AfterViewInit { #private; id: string; control: _angular_core.Signal | undefined>; /** The inline primitive — only present when `viewed='inline'`; drives focus/blur in that mode. */ inlineRef: _angular_core.Signal; sdLabelTemplate: _angular_core.Signal | undefined>; sdValueTemplate: _angular_core.Signal | undefined>; sdSuffixDef: _angular_core.Signal; sdViewDef: _angular_core.Signal | undefined>; autoIdInput: _angular_core.InputSignal; autoId: _angular_core.Signal; readonly dataDisabled: _angular_core.Signal<"true" | "false">; readonly dataInvalid: _angular_core.Signal<"true" | "false">; readonly dataEmpty: _angular_core.Signal<"true" | "false">; readonly dataValue: _angular_core.Signal; readonly dataRequired: _angular_core.Signal<"true" | "false">; readonly dataMaxLength: _angular_core.Signal; readonly dataMinLength: _angular_core.Signal; readonly dataPattern: _angular_core.Signal; readonly dataErrorMessage: _angular_core.Signal; name: _angular_core.InputSignal; appearanceInput: _angular_core.InputSignal; appearance: _angular_core.Signal; floatLabel: _angular_core.InputSignal; size: _angular_core.InputSignal; form: _angular_core.InputSignalWithTransform | undefined, any>; label: _angular_core.InputSignal; helperText: _angular_core.InputSignal; placeholder: _angular_core.InputSignal; type: _angular_core.InputSignal<"number" | "text" | "email" | "password">; mask: _angular_core.InputSignal; readonly maskAdapter: _angular_core.Signal<_sdcorejs_angular_forms_input.SdInputMaskAdapter | undefined>; readonly effectiveType: _angular_core.Signal<"number" | "text" | "email" | "password">; readonly inputMode: _angular_core.Signal<_sdcorejs_angular_forms_input.SdInputMaskInputMode | undefined>; readonly maxDisplayLength: _angular_core.Signal; hideInlineError: _angular_core.InputSignalWithTransform; blurOnEnter: _angular_core.InputSignalWithTransform; /** Whether to show the value-gated clear button in edit and inline modes. */ clearable: _angular_core.InputSignalWithTransform; required: _angular_core.InputSignalWithTransform; readonly: _angular_core.InputSignalWithTransform; disabled: _angular_core.InputSignalWithTransform; /** Display mode: `false` edit · `true` static view · `'inline'` borderless inline-edit (no panel — the input IS the face). */ viewed: _angular_core.InputSignalWithTransform; /** View display template: `sdViewDef` overrides the projected `#sdValue` for the static view (unified). */ readonly viewTemplate: _angular_core.Signal | undefined>; minlength: _angular_core.InputSignalWithTransform; maxlength: _angular_core.InputSignalWithTransform; pattern: _angular_core.InputSignal; patternErrorMessage: _angular_core.InputSignal; resolvedPattern: _angular_core.Signal; resolvedPatternErrorMsg: _angular_core.Signal; /** * First active error message for tooltip display when `hideInlineError = true`. * Re-runs only when `#state` ticks (value / status / touched change) — no longer * invoked on every change-detection cycle as a getter would be. */ readonly errorMessage: _angular_core.Signal; validator: _angular_core.InputSignal; inlineError: _angular_core.InputSignal; hyperlink: _angular_core.InputSignal; valueModel: _angular_core.ModelSignal; sdChange: _angular_core.OutputEmitterRef; sdFocus: _angular_core.OutputEmitterRef; sdBlur: _angular_core.OutputEmitterRef; keyupEnter: _angular_core.OutputEmitterRef; cleared: _angular_core.OutputEmitterRef; readonly sdFocusForceBlur: EventEmitter; formControl: SdFormControl; /** Display-only control used by the input element while a mask is active. */ readonly displayControl: SdFormControl; readonly activeControl: _angular_core.Signal; readonly maskStatus: _angular_core.WritableSignal; readonly displayValue: _angular_core.Signal; isFocused: boolean; /** Shared reactive form policy consumed by template-facing state below. */ readonly connectorState: _angular_core.Signal<_sdcorejs_angular_forms_models.ɵSdFormControlConnectorState>; readonly isReadonly: _angular_core.Signal; readonly visibleErrorMessage: _angular_core.Signal; /** `true` when `viewed === 'inline'`. */ readonly isInline: _angular_core.Signal; /** `true` when `viewed === true` (static view, no input). */ readonly isViewed: _angular_core.Signal; /** Focus the inline input. No-op unless `viewed='inline'`. */ enterInlineEdit: () => void; constructor(); ngOnInit(): void; ngAfterViewInit(): void; ngOnDestroy(): void; reValidate: () => void; getCurrentLength: () => number; isMaxlengthExceeded: () => boolean; onCompositionStart(): void; onCompositionEnd(event: CompositionEvent): void; showClear: () => boolean; clear: ($event?: Event) => void; onKeyupEnter: () => void; onFocus: () => void; onBlur: () => void; onClick: () => void; blur: () => void; focus: () => void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } export { SD_INPUT_MASKS, SdInput, sdCreateInputMask, sdResolveInputMask }; export type { SdCreateInputMaskOptions, SdInputMask, SdInputMaskAdapter, SdInputMaskInputMode, SdInputMaskPreset, SdInputMaskResult, SdInputMaskStatus, SdInputMaskToken };